Skip to content

Commit c995284

Browse files
authored
Add uploaded_at field in package api (#1080)
At present time, the information returned by the Package JSON API amounts to: ```json { "author": "Hécate Moonlight", "copyright": "", "description": "The 'Display' typeclass provides a solution for user-facing output that does not have to abide by the rules of the Show typeclass.", "homepage": "https://github.com/haskell-text/text-display#readme", "license": "MIT", "metadata_revision": 0, "synopsis": "A typeclass for user-facing output" } ``` This PR aims to implement support for the package upload timestamp in this payload. The final result is this: ```json { "author": "Hécate Moonlight", "copyright": "", "description": "The 'Display' typeclass provides a solution for user-facing output that does not have to abide by the rules of the Show typeclass.", "homepage": "https://github.com/haskell-text/text-display#readme", "license": "MIT", "metadata_revision": 0, "synopsis": "A typeclass for user-facing output", "uploaded_at": "2022-05-22T22:24:48.997120639Z" } ```
1 parent c2a34d7 commit c995284

File tree

2 files changed

+19
-9
lines changed

2 files changed

+19
-9
lines changed

src/Distribution/Server/Features/PackageInfoJSON.hs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ import Distribution.Utils.ShortText (fromShortText)
5353
import Data.Foldable (toList)
5454
import Data.Traversable (for)
5555
import qualified Data.List as List
56+
import Data.Time (UTCTime)
5657

5758

5859
data PackageInfoJSONFeature = PackageInfoJSONFeature {
@@ -130,12 +131,14 @@ initPackageInfoJSONFeature env = do
130131

131132
-- | Pure function for extracting basic package info from a Cabal file
132133
getBasicDescription
133-
:: CabalFileText
134+
:: UTCTime
135+
-- ^ Time of upload
136+
-> CabalFileText
134137
-> Int
135138
-- ^ Metadata revision. This will be added to the resulting
136139
-- @PackageBasicDescription@
137140
-> Either String PackageBasicDescription
138-
getBasicDescription (CabalFileText cf) metadataRev =
141+
getBasicDescription uploadedAt (CabalFileText cf) metadataRev =
139142
let parseResult = PkgDescr.parseGenericPackageDescription (BS.toStrict cf)
140143
in case PkgDescr.runParseResult parseResult of
141144
(_, Right pkg) -> let
@@ -148,6 +151,7 @@ getBasicDescription (CabalFileText cf) metadataRev =
148151
PkgDescr.licenseRaw pkgd
149152
pbd_homepage = T.pack . fromShortText $ PkgDescr.homepage pkgd
150153
pbd_metadata_revision = metadataRev
154+
pbd_uploaded_at = uploadedAt
151155
in
152156
return $ PackageBasicDescription {..}
153157
(_, Left (_, perrs)) ->
@@ -201,6 +205,7 @@ servePackageBasicDescription resource preferred packageInfoState dpath = do
201205
pkg <- lookupPackageId resource pkgid
202206

203207
let metadataRevs = fst <$> pkgMetadataRevisions pkg
208+
uploadInfos = snd <$> pkgMetadataRevisions pkg
204209
nMetadata = Vector.length metadataRevs
205210
metadataInd = fromMaybe (nMetadata - 1) metadataRev
206211

@@ -212,7 +217,8 @@ servePackageBasicDescription resource preferred packageInfoState dpath = do
212217
)
213218

214219
let cabalFile = metadataRevs Vector.! metadataInd
215-
pkgDescr = getBasicDescription cabalFile metadataInd
220+
uploadedAt = fst $ uploadInfos Vector.! metadataInd
221+
pkgDescr = getBasicDescription uploadedAt cabalFile metadataInd
216222
case pkgDescr of
217223
Left e -> Framework.errInternalError [Framework.MText e]
218224
Right d -> return d

src/Distribution/Server/Features/PackageInfoJSON/State.hs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,15 @@ import Data.Monoid (Sum(..))
2323
import qualified Data.Text as T
2424
import qualified Data.Text.Encoding as T
2525
import Data.SafeCopy (SafeCopy(..), base, contain,
26-
deriveSafeCopy)
26+
deriveSafeCopy, safeGet, safePut)
2727
import Data.Serialize (Get, get, getListOf, getTwoOf, put,
2828
putListOf, putTwoOf)
2929
import Data.Typeable (Typeable)
3030
import Data.Word (Word8)
3131
import Distribution.License (licenseToSPDX)
3232
import Distribution.Text (display, simpleParse)
3333
import GHC.Generics (Generic)
34+
import Data.Time (UTCTime)
3435

3536
import Distribution.SPDX.License (License)
3637
import Distribution.Package (PackageIdentifier, PackageName)
@@ -40,8 +41,7 @@ import qualified Distribution.Parsec as Parsec
4041

4142
import qualified Distribution.Server.Features.PreferredVersions as Preferred
4243
import Distribution.Server.Framework.MemSize (MemSize,
43-
memSize,
44-
memSize7)
44+
memSize, memSize8)
4545

4646

4747
-- | Basic information about a package. These values are
@@ -54,10 +54,10 @@ data PackageBasicDescription = PackageBasicDescription
5454
, pbd_author :: !T.Text
5555
, pbd_homepage :: !T.Text
5656
, pbd_metadata_revision :: !Int
57+
, pbd_uploaded_at :: !UTCTime
5758
} deriving (Eq, Show, Generic)
5859

5960
instance SafeCopy PackageBasicDescription where
60-
6161
putCopy PackageBasicDescription{..} = contain $ do
6262
put (Pretty.prettyShow pbd_license)
6363
put $ T.encodeUtf8 pbd_copyright
@@ -66,6 +66,7 @@ instance SafeCopy PackageBasicDescription where
6666
put $ T.encodeUtf8 pbd_author
6767
put $ T.encodeUtf8 pbd_homepage
6868
put pbd_metadata_revision
69+
safePut pbd_uploaded_at
6970

7071
getCopy = contain $ do
7172
licenseStr <- get
@@ -78,6 +79,7 @@ instance SafeCopy PackageBasicDescription where
7879
pbd_author <- T.decodeUtf8 <$> get
7980
pbd_homepage <- T.decodeUtf8 <$> get
8081
pbd_metadata_revision <- get
82+
pbd_uploaded_at <- safeGet
8183
return PackageBasicDescription{..}
8284

8385

@@ -93,6 +95,7 @@ instance Aeson.ToJSON PackageBasicDescription where
9395
, Key.fromString "author" .= pbd_author
9496
, Key.fromString "homepage" .= pbd_homepage
9597
, Key.fromString "metadata_revision" .= pbd_metadata_revision
98+
, Key.fromString "uploaded_at" .= pbd_uploaded_at
9699
]
97100

98101

@@ -110,6 +113,7 @@ instance Aeson.FromJSON PackageBasicDescription where
110113
pbd_author <- obj .: Key.fromString "author"
111114
pbd_homepage <- obj .: Key.fromString "homepage"
112115
pbd_metadata_revision <- obj .: Key.fromString "metadata_revision"
116+
pbd_uploaded_at <- obj .: Key.fromString "uploaded_at"
113117
return $
114118
PackageBasicDescription {..}
115119

@@ -225,8 +229,8 @@ deriveSafeCopy 0 'base ''PackageInfoState
225229

226230
instance MemSize PackageBasicDescription where
227231
memSize PackageBasicDescription{..} =
228-
memSize7 (Pretty.prettyShow pbd_license) pbd_copyright pbd_synopsis
229-
pbd_description pbd_author pbd_homepage pbd_metadata_revision
232+
memSize8 (Pretty.prettyShow pbd_license) pbd_copyright pbd_synopsis
233+
pbd_description pbd_author pbd_homepage pbd_metadata_revision pbd_uploaded_at
230234

231235
instance MemSize PackageVersions where
232236
memSize (PackageVersions ps) = getSum $

0 commit comments

Comments
 (0)