Package page per snapshot #36 #49

This is not yet live. We'll have a link for all packages in each
snapshot, which includes the version number, doc link if available, and
synopsis.
This commit is contained in:
Michael Snoyman 2014-12-10 12:06:55 +02:00
parent 6f4e9eb4fd
commit 522d2228a9
7 changed files with 76 additions and 8 deletions

View File

@ -6,7 +6,7 @@ module Handler.Alias
import Import import Import
import Data.Slug (Slug) import Data.Slug (Slug)
import Handler.StackageHome (getStackageHomeR, getStackageMetadataR, getStackageCabalConfigR) import Handler.StackageHome (getStackageHomeR, getStackageMetadataR, getStackageCabalConfigR, getSnapshotPackagesR)
import Handler.StackageIndex (getStackageIndexR, getStackageBundleR) import Handler.StackageIndex (getStackageIndexR, getStackageBundleR)
import Handler.StackageSdist (getStackageSdistR) import Handler.StackageSdist (getStackageSdistR)
@ -75,4 +75,5 @@ goSid sid pieces = do
StackageIndexR -> getStackageIndexR slug >>= sendResponse StackageIndexR -> getStackageIndexR slug >>= sendResponse
StackageBundleR -> getStackageBundleR slug >>= sendResponse StackageBundleR -> getStackageBundleR slug >>= sendResponse
StackageSdistR pnv -> getStackageSdistR slug pnv >>= sendResponse StackageSdistR pnv -> getStackageSdistR slug pnv >>= sendResponse
SnapshotPackagesR -> getSnapshotPackagesR slug >>= sendResponse
_ -> notFound _ -> notFound

View File

@ -276,14 +276,15 @@ createHaddockUnpacker root store runDB' = do
[PackageStackage ==. sid] [PackageStackage ==. sid]
[PackageHasHaddocks =. False] [PackageHasHaddocks =. False]
sourceDirectory destdir $$ mapM_C (\fp -> do sourceDirectory destdir $$ mapM_C (\fp -> do
let mname = stripSuffix "-" let (name', version) =
$ fst T.breakOnEnd "-"
$ T.breakOnEnd "-" $ fpToText
$ fpToText $ filename fp
$ filename fp mname = stripSuffix "-" name'
forM_ mname $ \name -> updateWhere forM_ mname $ \name -> updateWhere
[ PackageStackage ==. sid [ PackageStackage ==. sid
, PackageName' ==. PackageName name , PackageName' ==. PackageName name
, PackageVersion ==. Version version
] ]
[PackageHasHaddocks =. True] [PackageHasHaddocks =. True]
) )

View File

@ -6,11 +6,17 @@ import qualified Database.Esqueleto as E
import Import import Import
import Yesod.Core.Types (WidgetT (WidgetT), unWidgetT) import Yesod.Core.Types (WidgetT (WidgetT), unWidgetT)
-- FIXME maybe just redirect to the LTS or nightly package list
getPackageListR :: Handler Html getPackageListR :: Handler Html
getPackageListR = defaultLayout $ do getPackageListR = defaultLayout $ do
setTitle "Package list" setTitle "Package list"
cachedWidget (20 * 60) "package-list" $ do cachedWidget (20 * 60) "package-list" $ do
packages <- fmap (uniqueByKey . map (E.unValue***strip . E.unValue)) $ handlerToWidget $ runDB $ let clean (x, y) =
( E.unValue x
, strip $ E.unValue y
)
addDocs (x, y) = (x, Nothing, y, Nothing)
packages <- fmap (map addDocs . uniqueByKey . map clean) $ handlerToWidget $ runDB $
E.selectDistinct $ E.from $ \(u,m) -> do E.selectDistinct $ E.from $ \(u,m) -> do
E.where_ (m E.^. MetadataName E.==. u E.^. UploadedName) E.where_ (m E.^. MetadataName E.==. u E.^. UploadedName)
E.orderBy [E.asc $ u E.^. UploadedName] E.orderBy [E.asc $ u E.^. UploadedName]
@ -19,6 +25,7 @@ getPackageListR = defaultLayout $ do
$(widgetFile "package-list") $(widgetFile "package-list")
where strip x = fromMaybe x (stripSuffix "." x) where strip x = fromMaybe x (stripSuffix "." x)
uniqueByKey = sortBy (comparing fst) . M.toList . M.fromList uniqueByKey = sortBy (comparing fst) . M.toList . M.fromList
mback = Nothing
-- FIXME move somewhere else, maybe even yesod-core -- FIXME move somewhere else, maybe even yesod-core
cachedWidget :: NominalDiffTime -> Text -> Widget -> Widget cachedWidget :: NominalDiffTime -> Text -> Widget -> Widget

View File

@ -4,6 +4,8 @@ import Data.BlobStore (storeExists)
import Import import Import
import Data.Time (FormatTime) import Data.Time (FormatTime)
import Data.Slug (SnapSlug) import Data.Slug (SnapSlug)
import qualified Database.Esqueleto as E
import Handler.PackageList (cachedWidget)
getStackageHomeR :: SnapSlug -> Handler Html getStackageHomeR :: SnapSlug -> Handler Html
getStackageHomeR slug = do getStackageHomeR slug = do
@ -89,3 +91,46 @@ getOldStackageR ident pieces = do
case parseRoute ("snapshot" : toPathPiece (stackageSlug stackage) : pieces, []) of case parseRoute ("snapshot" : toPathPiece (stackageSlug stackage) : pieces, []) of
Nothing -> notFound Nothing -> notFound
Just route -> redirect (route :: Route App) Just route -> redirect (route :: Route App)
getSnapshotPackagesR :: SnapSlug -> Handler Html
getSnapshotPackagesR slug = do
Entity sid _stackage <- runDB $ getBy404 $ UniqueSnapshot slug
defaultLayout $ do
setTitle $ toHtml $ "Package list for " ++ toPathPiece slug
cachedWidget (20 * 60) ("package-list-" ++ toPathPiece slug) $ do
packages' <- handlerToWidget $ runDB $ E.select $ E.from $ \(u,m,p) -> do
E.where_ $
(m E.^. MetadataName E.==. u E.^. UploadedName) E.&&.
(m E.^. MetadataName E.==. p E.^. PackageName') E.&&.
(p E.^. PackageStackage E.==. E.val sid)
E.orderBy [E.asc $ u E.^. UploadedName]
E.groupBy ( u E.^. UploadedName
, m E.^. MetadataSynopsis
)
return
( u E.^. UploadedName
, m E.^. MetadataSynopsis
, E.max_ $ E.case_
[ ( p E.^. PackageHasHaddocks
, p E.^. PackageVersion
)
]
(E.val (Version ""))
)
let packages = flip map packages' $ \(name, syn, forceNotNull -> mversion) ->
( E.unValue name
, mversion
, strip $ E.unValue syn
, (<$> mversion) $ \version -> HaddockR slug $ return $ concat
[ toPathPiece $ E.unValue name
, "-"
, version
]
)
forceNotNull (E.Value Nothing) = Nothing
forceNotNull (E.Value (Just (Version v)))
| null v = Nothing
| otherwise = Just v
$(widgetFile "package-list")
where strip x = fromMaybe x (stripSuffix "." x)
mback = Just (SnapshotR slug StackageHomeR, "Return to snapshot")

View File

@ -22,6 +22,7 @@
/00-index.tar.gz StackageIndexR GET /00-index.tar.gz StackageIndexR GET
/bundle StackageBundleR GET /bundle StackageBundleR GET
/package/#PackageNameVersion StackageSdistR GET /package/#PackageNameVersion StackageSdistR GET
/packages SnapshotPackagesR GET
/hackage-view/#HackageView/00-index.tar.gz HackageViewIndexR GET /hackage-view/#HackageView/00-index.tar.gz HackageViewIndexR GET
/hackage-view/#HackageView/package/#PackageNameVersion HackageViewSdistR GET /hackage-view/#HackageView/package/#PackageNameVersion HackageViewSdistR GET

View File

@ -1,15 +1,24 @@
<div .container> <div .container>
<h1>Packages <h1>Packages
$maybe (back, backText) <- mback
<p>
<a href=@{back}>#{asText backText}
<div .packages> <div .packages>
<table .table> <table .table>
<thead> <thead>
<th>Package <th>Package
<th>Docs
<th>Synopsis <th>Synopsis
<tbody> <tbody>
$forall (name,synopsis) <- packages $forall (name,mversion,synopsis,mdoc) <- packages
<tr> <tr>
<td> <td>
<a href=@{PackageR name}> <a href=@{PackageR name}>
#{name} #{name}
$maybe version <- mversion
-#{asText version}
<td>
$maybe doc <- mdoc
<a href=@{doc}>Docs
<td> <td>
#{synopsis} #{synopsis}

View File

@ -17,6 +17,10 @@ $newline never
<span> <span>
<a href=@{SnapshotR slug StackageCabalConfigR} title="If you want to stick with upstream Hackage but get a stable package set"> <a href=@{SnapshotR slug StackageCabalConfigR} title="If you want to stick with upstream Hackage but get a stable package set">
\cabal.config \cabal.config
<span .separator>
<span>
<a href=@{SnapshotR slug SnapshotPackagesR} title="List of included packages">
\Packages
$if stackageHasHaddocks stackage $if stackageHasHaddocks stackage
<span .separator> <span .separator>
<span> <span>