hackernews 0.2.2.2 → 0.2.3.2
raw patch · 5 files changed
+60/−3 lines, 5 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Web.HackerNews: Job :: Text -> JobId -> Int -> Text -> UTCTime -> Text -> Text -> Text -> Bool -> Job
+ Web.HackerNews: JobId :: Int -> JobId
+ Web.HackerNews: data Job
+ Web.HackerNews: getJob :: JobId -> HackerNews (Maybe Job)
+ Web.HackerNews: jobBy :: Job -> Text
+ Web.HackerNews: jobDeleted :: Job -> Bool
+ Web.HackerNews: jobId :: Job -> JobId
+ Web.HackerNews: jobScore :: Job -> Int
+ Web.HackerNews: jobText :: Job -> Text
+ Web.HackerNews: jobTime :: Job -> UTCTime
+ Web.HackerNews: jobTitle :: Job -> Text
+ Web.HackerNews: jobType :: Job -> Text
+ Web.HackerNews: jobUrl :: Job -> Text
+ Web.HackerNews: newtype JobId
Files
- hackernews.cabal +2/−1
- src/Web/HackerNews.hs +8/−0
- src/Web/HackerNews/Job.hs +45/−0
- src/Web/HackerNews/Types.hs +1/−0
- tests/Test.hs +4/−2
hackernews.cabal view
@@ -1,5 +1,5 @@ name: hackernews-version: 0.2.2.2+version: 0.2.3.2 description: API for news.ycombinator.com license: MIT synopsis: API for Hacker News@@ -21,6 +21,7 @@ , Web.HackerNews.Update , Web.HackerNews.Comment , Web.HackerNews.Story+ , Web.HackerNews.Job , Web.HackerNews.Util hs-source-dirs: src build-depends: HsOpenSSL >= 0.10.5
src/Web/HackerNews.hs view
@@ -8,6 +8,7 @@ , getPoll , getPollOpt , getUser+ , getJob , getTopStories , getMaxItem , getUpdates@@ -23,6 +24,8 @@ , StoryId (..) , User (..) , UserId (..)+ , Job (..)+ , JobId (..) , Update (..) , MaxItem , TopStories@@ -58,6 +61,11 @@ -- | Retrieve a `User` by `UserId` getUser :: UserId -> HackerNews (Maybe User) getUser (UserId userid) = buildHNRequest $ "user/" <> userid++------------------------------------------------------------------------------+-- | Retrieve a Job+getJob :: JobId -> HackerNews (Maybe Job)+getJob (JobId jobid) = buildHNRequest $ "item/" <> toText jobid ------------------------------------------------------------------------------ -- | Retrieve the Top Stories on Hacker News
+ src/Web/HackerNews/Job.hs view
@@ -0,0 +1,45 @@+{-# LANGUAGE OverloadedStrings #-}+module Web.HackerNews.Job where++import Control.Applicative ((<*>), (<$>))+import Control.Monad (MonadPlus (mzero))+import Data.Aeson (FromJSON (parseJSON), Value (Object),+ (.:), (.:?), (.!=))+import Data.Text (Text)+import Data.Time (UTCTime)++import Web.HackerNews.Util (fromSeconds)++------------------------------------------------------------------------------+-- | Types+data Job = Job {+ jobBy :: Text+ , jobId :: JobId+ , jobScore :: Int+ , jobText :: Text+ , jobTime :: UTCTime+ , jobTitle :: Text+ , jobType :: Text+ , jobUrl :: Text+ , jobDeleted :: Bool+ } deriving (Show)++newtype JobId+ = JobId Int+ deriving (Show, Eq)++------------------------------------------------------------------------------+-- | JSON Instances+instance FromJSON Job where+ parseJSON (Object o) =+ Job <$> o .: "by"+ <*> (JobId <$> o .: "id")+ <*> o .: "score"+ <*> o .: "text"+ <*> (fromSeconds <$> o .: "time")+ <*> o .: "title"+ <*> o .: "type"+ <*> o .: "url"+ <*> o .:? "deleted" .!= False+ parseJSON _ = mzero+
src/Web/HackerNews/Types.hs view
@@ -13,6 +13,7 @@ import Web.HackerNews.Story as H import Web.HackerNews.User as H import Web.HackerNews.Update as H+import Web.HackerNews.Job as H
tests/Test.hs view
@@ -9,11 +9,12 @@ main :: IO () main = hspec $ do describe "Hacker News API Tests" $ do- (story, comment, user, poll, pollOpt, topStories, maxItem, updates) <- - runIO $ hackerNews $ (,,,,,,,) <$> + (story, comment, user, job, poll, pollOpt, topStories, maxItem, updates) <- + runIO $ hackerNews $ (,,,,,,,,) <$> getStory (StoryId 8863) <*> getComment (CommentId 2921983) <*> getUser (UserId "dmjio") <*>+ getJob (JobId 8437631) <*> getPoll (PollId 126809) <*> getPollOpt (PollOptId 160705) <*> getTopStories <*>@@ -22,6 +23,7 @@ it "Retrieves a Story" $ isJust story it "Retrieves a Comment" $ isJust comment it "Retrieves a User" $ isJust user+ it "Retrieves a Job" $ isJust job it "Retrieves a Poll" $ isJust poll it "Retrieves a Pollopt" $ isJust pollOpt it "Retrieves Top Stories" $ isJust topStories