packages feed

github-types 0.1.0.5 → 0.2.0

raw patch · 5 files changed

+452/−64 lines, 5 filesdep +aeson-prettydep +hspecdep +hspec-smallcheckdep ~basePVP ok

version bump matches the API change (PVP)

Dependencies added: aeson-pretty, hspec, hspec-smallcheck, http-conduit, smallcheck, time, unordered-containers, vector

Dependency ranges changed: base

API changes (from Hackage documentation)

- GitHub.Types.Events: CommitCommentEventType :: CommitCommentEvent -> Event
- GitHub.Types.Events: DeploymentEventType :: DeploymentEvent -> Event
- GitHub.Types.Events: DeploymentStatusEventType :: DeploymentStatusEvent -> Event
- GitHub.Types.Events: commitCommentEventRepository :: CommitCommentEvent -> Repository
- GitHub.Types.Events: eventParser :: Text -> Value -> Parser Event
- GitHub.Types.Repository: Deployment :: Int -> Text -> Text -> Text -> Text -> Value -> Text -> Deployment
- GitHub.Types.Repository: DeploymentStatus :: Int -> Text -> Maybe Text -> Maybe Text -> Maybe Text -> DeploymentStatus
- GitHub.Types.Repository: data Deployment
- GitHub.Types.Repository: data DeploymentStatus
- GitHub.Types.Repository: deploymentDescription :: Deployment -> Text
- GitHub.Types.Repository: deploymentEnvironment :: Deployment -> Text
- GitHub.Types.Repository: deploymentId :: Deployment -> Int
- GitHub.Types.Repository: deploymentPayload :: Deployment -> Value
- GitHub.Types.Repository: deploymentRef :: Deployment -> Text
- GitHub.Types.Repository: deploymentSha :: Deployment -> Text
- GitHub.Types.Repository: deploymentStatusDeploymentUrl :: DeploymentStatus -> Maybe Text
- GitHub.Types.Repository: deploymentStatusDescription :: DeploymentStatus -> Maybe Text
- GitHub.Types.Repository: deploymentStatusId :: DeploymentStatus -> Int
- GitHub.Types.Repository: deploymentStatusState :: DeploymentStatus -> Text
- GitHub.Types.Repository: deploymentStatusTargetUrl :: DeploymentStatus -> Maybe Text
- GitHub.Types.Repository: deploymentTask :: Deployment -> Text
- GitHub.Types.Repository: instance Eq Deployment
- GitHub.Types.Repository: instance Eq DeploymentStatus
- GitHub.Types.Repository: instance FromJSON Deployment
- GitHub.Types.Repository: instance FromJSON DeploymentStatus
- GitHub.Types.Repository: instance Show Deployment
- GitHub.Types.Repository: instance Show DeploymentStatus
+ GitHub.Types.Base: Deployment :: Int -> Text -> Text -> Text -> Text -> Value -> Text -> Deployment
+ GitHub.Types.Base: DeploymentStatus :: Int -> Text -> Maybe Text -> Maybe Text -> Maybe Text -> DeploymentStatus
+ GitHub.Types.Base: data Deployment
+ GitHub.Types.Base: data DeploymentStatus
+ GitHub.Types.Base: deploymentDescription :: Deployment -> Text
+ GitHub.Types.Base: deploymentEnvironment :: Deployment -> Text
+ GitHub.Types.Base: deploymentId :: Deployment -> Int
+ GitHub.Types.Base: deploymentPayload :: Deployment -> Value
+ GitHub.Types.Base: deploymentRef :: Deployment -> Text
+ GitHub.Types.Base: deploymentSha :: Deployment -> Text
+ GitHub.Types.Base: deploymentStatusDeploymentUrl :: DeploymentStatus -> Maybe Text
+ GitHub.Types.Base: deploymentStatusDescription :: DeploymentStatus -> Maybe Text
+ GitHub.Types.Base: deploymentStatusId :: DeploymentStatus -> Int
+ GitHub.Types.Base: deploymentStatusState :: DeploymentStatus -> Text
+ GitHub.Types.Base: deploymentStatusTargetUrl :: DeploymentStatus -> Maybe Text
+ GitHub.Types.Base: deploymentTask :: Deployment -> Text
+ GitHub.Types.Base: instance Eq Deployment
+ GitHub.Types.Base: instance Eq DeploymentStatus
+ GitHub.Types.Base: instance FromJSON Deployment
+ GitHub.Types.Base: instance FromJSON DeploymentStatus
+ GitHub.Types.Base: instance Show Deployment
+ GitHub.Types.Base: instance Show DeploymentStatus
+ GitHub.Types.Events: Actor :: !Integer -> !Text -> Actor
+ GitHub.Types.Events: CommitCommentEventPayload :: CommitCommentEvent -> Payload
+ GitHub.Types.Events: CreateEvent :: !(Maybe Text) -> CreateEvent
+ GitHub.Types.Events: CreateEventPayload :: CreateEvent -> Payload
+ GitHub.Types.Events: DeleteEvent :: !Text -> DeleteEvent
+ GitHub.Types.Events: DeleteEventPayload :: DeleteEvent -> Payload
+ GitHub.Types.Events: DeploymentEventPayload :: DeploymentEvent -> Payload
+ GitHub.Types.Events: DeploymentStatusEventPayload :: DeploymentStatusEvent -> Payload
+ GitHub.Types.Events: Event :: !Text -> !Actor -> !Repo -> !UTCTime -> !Bool -> !Payload -> Event
+ GitHub.Types.Events: ForkEvent :: !Value -> ForkEvent
+ GitHub.Types.Events: ForkEventPayload :: ForkEvent -> Payload
+ GitHub.Types.Events: GollumEvent :: !Value -> GollumEvent
+ GitHub.Types.Events: GollumEventPayload :: GollumEvent -> Payload
+ GitHub.Types.Events: IssueCommentEvent :: !Text -> IssueCommentEvent
+ GitHub.Types.Events: IssueCommentEventPayload :: IssueCommentEvent -> Payload
+ GitHub.Types.Events: IssuesEvent :: !Text -> IssuesEvent
+ GitHub.Types.Events: IssuesEventPayload :: IssuesEvent -> Payload
+ GitHub.Types.Events: MemberEvent :: !Text -> MemberEvent
+ GitHub.Types.Events: MemberEventPayload :: MemberEvent -> Payload
+ GitHub.Types.Events: PublicEventPayload :: Value -> Payload
+ GitHub.Types.Events: PullRequestEvent :: !Text -> PullRequestEvent
+ GitHub.Types.Events: PullRequestEventPayload :: PullRequestEvent -> Payload
+ GitHub.Types.Events: PullRequestReviewCommentEvent :: !Value -> PullRequestReviewCommentEvent
+ GitHub.Types.Events: PullRequestReviewCommentEventPayload :: PullRequestReviewCommentEvent -> Payload
+ GitHub.Types.Events: PushEvent :: !Int -> PushEvent
+ GitHub.Types.Events: PushEventPayload :: PushEvent -> Payload
+ GitHub.Types.Events: ReleaseEvent :: !Text -> ReleaseEvent
+ GitHub.Types.Events: ReleaseEventPayload :: ReleaseEvent -> Payload
+ GitHub.Types.Events: Repo :: !Integer -> !Text -> Repo
+ GitHub.Types.Events: WatchEvent :: !Text -> WatchEvent
+ GitHub.Types.Events: WatchEventPayload :: WatchEvent -> Payload
+ GitHub.Types.Events: actorId :: Actor -> !Integer
+ GitHub.Types.Events: actorLogin :: Actor -> !Text
+ GitHub.Types.Events: commitCommentEventComment :: CommitCommentEvent -> Value
+ GitHub.Types.Events: createEventRef :: CreateEvent -> !(Maybe Text)
+ GitHub.Types.Events: data Actor
+ GitHub.Types.Events: data CreateEvent
+ GitHub.Types.Events: data DeleteEvent
+ GitHub.Types.Events: data ForkEvent
+ GitHub.Types.Events: data GollumEvent
+ GitHub.Types.Events: data IssueCommentEvent
+ GitHub.Types.Events: data IssuesEvent
+ GitHub.Types.Events: data MemberEvent
+ GitHub.Types.Events: data Payload
+ GitHub.Types.Events: data PullRequestEvent
+ GitHub.Types.Events: data PullRequestReviewCommentEvent
+ GitHub.Types.Events: data PushEvent
+ GitHub.Types.Events: data ReleaseEvent
+ GitHub.Types.Events: data Repo
+ GitHub.Types.Events: data WatchEvent
+ GitHub.Types.Events: deleteEventRef :: DeleteEvent -> !Text
+ GitHub.Types.Events: eventActor :: Event -> !Actor
+ GitHub.Types.Events: eventCreatedAt :: Event -> !UTCTime
+ GitHub.Types.Events: eventId :: Event -> !Text
+ GitHub.Types.Events: eventPayload :: Event -> !Payload
+ GitHub.Types.Events: eventPayloadParser :: Text -> Value -> Parser Payload
+ GitHub.Types.Events: eventPayloadParsers :: [(Text, Text, Value -> Parser Payload)]
+ GitHub.Types.Events: eventPublic :: Event -> !Bool
+ GitHub.Types.Events: eventRepo :: Event -> !Repo
+ GitHub.Types.Events: forkEventForkee :: ForkEvent -> !Value
+ GitHub.Types.Events: gollumEventPages :: GollumEvent -> !Value
+ GitHub.Types.Events: instance Eq Actor
+ GitHub.Types.Events: instance Eq CreateEvent
+ GitHub.Types.Events: instance Eq DeleteEvent
+ GitHub.Types.Events: instance Eq ForkEvent
+ GitHub.Types.Events: instance Eq GollumEvent
+ GitHub.Types.Events: instance Eq IssueCommentEvent
+ GitHub.Types.Events: instance Eq IssuesEvent
+ GitHub.Types.Events: instance Eq MemberEvent
+ GitHub.Types.Events: instance Eq Payload
+ GitHub.Types.Events: instance Eq PullRequestEvent
+ GitHub.Types.Events: instance Eq PullRequestReviewCommentEvent
+ GitHub.Types.Events: instance Eq PushEvent
+ GitHub.Types.Events: instance Eq ReleaseEvent
+ GitHub.Types.Events: instance Eq Repo
+ GitHub.Types.Events: instance Eq WatchEvent
+ GitHub.Types.Events: instance FromJSON Actor
+ GitHub.Types.Events: instance FromJSON CreateEvent
+ GitHub.Types.Events: instance FromJSON DeleteEvent
+ GitHub.Types.Events: instance FromJSON Event
+ GitHub.Types.Events: instance FromJSON ForkEvent
+ GitHub.Types.Events: instance FromJSON GollumEvent
+ GitHub.Types.Events: instance FromJSON IssueCommentEvent
+ GitHub.Types.Events: instance FromJSON IssuesEvent
+ GitHub.Types.Events: instance FromJSON MemberEvent
+ GitHub.Types.Events: instance FromJSON PullRequestEvent
+ GitHub.Types.Events: instance FromJSON PullRequestReviewCommentEvent
+ GitHub.Types.Events: instance FromJSON PushEvent
+ GitHub.Types.Events: instance FromJSON ReleaseEvent
+ GitHub.Types.Events: instance FromJSON Repo
+ GitHub.Types.Events: instance FromJSON WatchEvent
+ GitHub.Types.Events: instance Show Actor
+ GitHub.Types.Events: instance Show CreateEvent
+ GitHub.Types.Events: instance Show DeleteEvent
+ GitHub.Types.Events: instance Show ForkEvent
+ GitHub.Types.Events: instance Show GollumEvent
+ GitHub.Types.Events: instance Show IssueCommentEvent
+ GitHub.Types.Events: instance Show IssuesEvent
+ GitHub.Types.Events: instance Show MemberEvent
+ GitHub.Types.Events: instance Show Payload
+ GitHub.Types.Events: instance Show PullRequestEvent
+ GitHub.Types.Events: instance Show PullRequestReviewCommentEvent
+ GitHub.Types.Events: instance Show PushEvent
+ GitHub.Types.Events: instance Show ReleaseEvent
+ GitHub.Types.Events: instance Show Repo
+ GitHub.Types.Events: instance Show WatchEvent
+ GitHub.Types.Events: issueCommentEventAction :: IssueCommentEvent -> !Text
+ GitHub.Types.Events: issuesEventAction :: IssuesEvent -> !Text
+ GitHub.Types.Events: memberEventAction :: MemberEvent -> !Text
+ GitHub.Types.Events: pullRequestEventAction :: PullRequestEvent -> !Text
+ GitHub.Types.Events: pullRequestReviewCommentEventPullRequest :: PullRequestReviewCommentEvent -> !Value
+ GitHub.Types.Events: pushEventSize :: PushEvent -> !Int
+ GitHub.Types.Events: releaseEventAction :: ReleaseEvent -> !Text
+ GitHub.Types.Events: repoId :: Repo -> !Integer
+ GitHub.Types.Events: repoName :: Repo -> !Text
+ GitHub.Types.Events: watchEventAction :: WatchEvent -> !Text
+ GitHub.Types.Events: webhookPayloadParser :: Text -> Value -> Parser Payload
- GitHub.Types.Events: CommitCommentEvent :: Repository -> CommitCommentEvent
+ GitHub.Types.Events: CommitCommentEvent :: Value -> CommitCommentEvent

Files

github-types.cabal view
@@ -1,5 +1,5 @@ name:                github-types-version:             0.1.0.5+version:             0.2.0 license:             OtherLicense license-file:        LICENSE author:              Tomas Carnecky@@ -13,15 +13,44 @@                      which are consumed or produced by the GitHub v3 API.  +source-repository head+    type:     git+    location: git://github.com/wereHamster/github-types.git++ library     default-language:    Haskell2010     hs-source-dirs:      src -    build-depends:       aeson-    build-depends:       base >= 4 && < 5-    build-depends:       text+    build-depends:+       base >= 4 && < 5+     , aeson+     , text+     , time -    exposed-modules:     GitHub.Types-    exposed-modules:     GitHub.Types.Base-    exposed-modules:     GitHub.Types.Repository-    exposed-modules:     GitHub.Types.Events+    exposed-modules:+       GitHub.Types+     , GitHub.Types.Base+     , GitHub.Types.Repository+     , GitHub.Types.Events+++test-suite spec+    default-language:    Haskell2010+    hs-source-dirs:      test src++    main-is:             Test.hs+    type:                exitcode-stdio-1.0++    build-depends:+       base < 4.9+     , hspec+     , aeson+     , aeson-pretty+     , smallcheck+     , hspec-smallcheck+     , vector+     , text+     , unordered-containers+     , time+     , http-conduit
src/GitHub/Types/Base.hs view
@@ -72,3 +72,53 @@     toJSON Success = String "success"     toJSON Failure = String "failure"     toJSON Error   = String "error"++++------------------------------------------------------------------------------+-- Deployment++data Deployment = Deployment+    { deploymentId          :: Int+    , deploymentSha         :: Text+    , deploymentRef         :: Text+    , deploymentTask        :: Text+    , deploymentEnvironment :: Text+    , deploymentPayload     :: Value+    , deploymentDescription :: Text+    } deriving (Eq, Show)++instance FromJSON Deployment where+    parseJSON (Object x) = Deployment+        <$> x .: "id"+        <*> x .: "sha"+        <*> x .: "ref"+        <*> x .: "task"+        <*> x .: "environment"+        <*> x .: "payload"+        <*> x .: "description"++    parseJSON _ = mzero++++------------------------------------------------------------------------------+-- DeploymentStatus++data DeploymentStatus = DeploymentStatus+    { deploymentStatusId             :: Int+    , deploymentStatusState          :: Text+    , deploymentStatusTargetUrl      :: Maybe Text+    , deploymentStatusDescription    :: Maybe Text+    , deploymentStatusDeploymentUrl  :: Maybe Text+    } deriving (Eq, Show)++instance FromJSON DeploymentStatus where+    parseJSON (Object x) = DeploymentStatus+        <$> x .: "id"+        <*> x .: "state"+        <*> x .: "target_url"+        <*> x .: "description"+        <*> x .: "deployment_url"++    parseJSON _ = mzero
src/GitHub/Types/Events.hs view
@@ -9,7 +9,9 @@ import Data.Aeson import Data.Aeson.Types import Data.Monoid-import Data.Text+import Data.Text hiding (find)+import Data.Time+import Data.List  import GitHub.Types.Base import GitHub.Types.Repository@@ -18,36 +20,155 @@  -- | All events which can be produced by GitHub. ----- See https://developer.github.com/v3/activity/events/types/-data Event-    = CommitCommentEventType    CommitCommentEvent-    | DeploymentEventType       DeploymentEvent-    | DeploymentStatusEventType DeploymentStatusEvent+-- See https://developer.github.com/v3/activity/events/+data Event = Event+    { eventId :: !Text+    , eventActor :: !Actor+    , eventRepo :: !Repo+    , eventCreatedAt :: !UTCTime+    , eventPublic :: !Bool+    , eventPayload :: !Payload+    } deriving (Eq, Show)++instance FromJSON Event where+    parseJSON (Object o) = do+        eventType <- o .: "type"++        Event+            <$> o .: "id"+            <*> o .: "actor"+            <*> o .: "repo"+            <*> o .: "created_at"+            <*> o .: "public"+            <*> (eventPayloadParser eventType =<< o .: "payload")++    parseJSON _ = fail "Event"+++data Actor = Actor+    { actorId :: !Integer+    , actorLogin :: !Text+    } deriving (Eq, Show)++instance FromJSON Actor where+    parseJSON (Object o) = Actor+        <$> o .: "id"+        <*> o .: "login"++    parseJSON _ = fail "Actor"+++data Repo = Repo+    { repoId :: !Integer+    , repoName :: !Text+    } deriving (Eq, Show)++instance FromJSON Repo where+    parseJSON (Object o) = Repo+        <$> o .: "id"+        <*> o .: "name"++    parseJSON _ = fail "Repo"+++data Payload+    = CommitCommentEventPayload            CommitCommentEvent+    | DeploymentEventPayload               DeploymentEvent+    | DeploymentStatusEventPayload         DeploymentStatusEvent+    | PushEventPayload                     PushEvent+    | IssuesEventPayload                   IssuesEvent+    | IssueCommentEventPayload             IssueCommentEvent+    | CreateEventPayload                   CreateEvent+    | PullRequestEventPayload              PullRequestEvent+    | PullRequestReviewCommentEventPayload PullRequestReviewCommentEvent+    | WatchEventPayload                    WatchEvent+    | DeleteEventPayload                   DeleteEvent+    | ForkEventPayload                     ForkEvent+    | ReleaseEventPayload                  ReleaseEvent+    | GollumEventPayload                   GollumEvent+    | MemberEventPayload                   MemberEvent+    | PublicEventPayload                   Value     deriving (Eq, Show)  +eventPayloadParsers :: [(Text, Text, Value -> Parser Payload)]+eventPayloadParsers =+    [ ( "CommitCommentEvent", "commit_comment"+      , fmap CommitCommentEventPayload . parseJSON)++    , ( "DeploymentEvent", "deployment"+      , fmap DeploymentEventPayload . parseJSON)++    , ( "DeploymentStatusEvent", "deployment_status"+      , fmap DeploymentStatusEventPayload . parseJSON)++    , ( "PushEvent", "push"+      , fmap PushEventPayload . parseJSON)++    , ( "IssuesEvent", "issues"+      , fmap IssuesEventPayload . parseJSON)++    , ( "IssueCommentEvent", "issue_comment"+      , fmap IssueCommentEventPayload . parseJSON)++    , ( "CreateEvent", "create"+      , fmap CreateEventPayload . parseJSON)++    , ( "PullRequestEvent", "pull_request"+      , fmap PullRequestEventPayload . parseJSON)++    , ( "PullRequestReviewCommentEvent", "pull_request_review_comment"+      , fmap PullRequestReviewCommentEventPayload . parseJSON)++    , ( "WatchEvent", "watch"+      , fmap WatchEventPayload . parseJSON)++    , ( "DeleteEvent", "delete"+      , fmap DeleteEventPayload . parseJSON)++    , ( "ForkEvent", "fork"+      , fmap ForkEventPayload . parseJSON)++    , ( "ReleaseEvent", "release"+      , fmap ReleaseEventPayload . parseJSON)++    , ( "GollumEvent", "gollum"+      , fmap GollumEventPayload . parseJSON)++    , ( "MemberEvent", "member"+      , fmap MemberEventPayload . parseJSON)++    , ( "PublicEvent", "public"+      , fmap PublicEventPayload . parseJSON)+    ]++++eventPayloadParser :: Text -> Value -> Parser Payload+eventPayloadParser eventType x = case find (\(t, _, _) -> t == eventType) eventPayloadParsers of+    Nothing -> fail $ "eventPayloadParser: Unknown event type: " <> unpack eventType+    Just (_, _, p) -> p x+ -- | Since the event type is included through different means (X-GitHub-Event -- header, or inline in the JSON object), it's not possible to make 'Event' -- an instance of 'FromJSON'. But if you know the type, you can use this -- parser.-eventParser :: Text -> Value -> Parser Event-eventParser "commit_comment"    x = CommitCommentEventType    <$> parseJSON x-eventParser "deployment"        x = DeploymentEventType       <$> parseJSON x-eventParser "deployment_status" x = DeploymentStatusEventType <$> parseJSON x-eventParser eventType           _ = fail $ "Unknown event type: " <> unpack eventType-+webhookPayloadParser :: Text -> Value -> Parser Payload+webhookPayloadParser eventType x =  case find (\(_, t, _) -> t == eventType) eventPayloadParsers of+    Nothing -> fail $ "webhookPayloadParser: Unknown event type: " <> unpack eventType+    Just (_, _, p) -> p x   ------------------------------------------------------------------------------ -- CommitCommentEvent  data CommitCommentEvent = CommitCommentEvent-    { commitCommentEventRepository :: Repository+    { commitCommentEventComment :: Value     } deriving (Eq, Show)  instance FromJSON CommitCommentEvent where     parseJSON (Object x) = CommitCommentEvent-        <$> x .: "repository"+        <$> x .: "comment"      parseJSON _ = fail "CommitCommentEvent" @@ -89,3 +210,172 @@         <*> x .: "repository"      parseJSON _ = fail "DeploymentStatusEvent"+++------------------------------------------------------------------------------+-- PushEvent++data PushEvent = PushEvent+    { pushEventSize :: !Int+    } deriving (Eq, Show)++instance FromJSON PushEvent where+    parseJSON (Object x) = PushEvent+        <$> x .: "size"++    parseJSON _ = fail "PushEvent"+++------------------------------------------------------------------------------+-- IssuesEvent++data IssuesEvent = IssuesEvent+    { issuesEventAction :: !Text+    } deriving (Eq, Show)++instance FromJSON IssuesEvent where+    parseJSON (Object x) = IssuesEvent+        <$> x .: "action"++    parseJSON _ = fail "IssuesEvent"+++------------------------------------------------------------------------------+-- IssuesEvent++data IssueCommentEvent = IssueCommentEvent+    { issueCommentEventAction :: !Text+    } deriving (Eq, Show)++instance FromJSON IssueCommentEvent where+    parseJSON (Object x) = IssueCommentEvent+        <$> x .: "action"++    parseJSON _ = fail "IssueCommentEvent"+++------------------------------------------------------------------------------+-- IssuesEvent++data CreateEvent = CreateEvent+    { createEventRef :: !(Maybe Text)+    } deriving (Eq, Show)++instance FromJSON CreateEvent where+    parseJSON (Object x) = CreateEvent+        <$> x .: "ref"++    parseJSON _ = fail "CreateEvent"+++------------------------------------------------------------------------------+-- PullRequestEvent++data PullRequestEvent = PullRequestEvent+    { pullRequestEventAction :: !Text+    } deriving (Eq, Show)++instance FromJSON PullRequestEvent where+    parseJSON (Object x) = PullRequestEvent+        <$> x .: "action"++    parseJSON _ = fail "PullRequestEvent"+++------------------------------------------------------------------------------+-- PullRequestEvent++data PullRequestReviewCommentEvent = PullRequestReviewCommentEvent+    { pullRequestReviewCommentEventPullRequest :: !Value+    } deriving (Eq, Show)++instance FromJSON PullRequestReviewCommentEvent where+    parseJSON (Object x) = PullRequestReviewCommentEvent+        <$> x .: "pull_request"++    parseJSON _ = fail "PullRequestReviewCommentEvent"++++------------------------------------------------------------------------------+-- WatchEvent++data WatchEvent = WatchEvent+    { watchEventAction :: !Text+    } deriving (Eq, Show)++instance FromJSON WatchEvent where+    parseJSON (Object x) = WatchEvent+        <$> x .: "action"++    parseJSON _ = fail "WatchEvent"+++------------------------------------------------------------------------------+-- DeleteEvent++data DeleteEvent = DeleteEvent+    { deleteEventRef :: !Text+    } deriving (Eq, Show)++instance FromJSON DeleteEvent where+    parseJSON (Object x) = DeleteEvent+        <$> x .: "ref"++    parseJSON _ = fail "DeleteEvent"+++------------------------------------------------------------------------------+-- ForkEvent++data ForkEvent = ForkEvent+    { forkEventForkee :: !Value+    } deriving (Eq, Show)++instance FromJSON ForkEvent where+    parseJSON (Object x) = ForkEvent+        <$> x .: "forkee"++    parseJSON _ = fail "ForkEvent"+++------------------------------------------------------------------------------+-- ReleaseEvent++data ReleaseEvent = ReleaseEvent+    { releaseEventAction :: !Text+    } deriving (Eq, Show)++instance FromJSON ReleaseEvent where+    parseJSON (Object x) = ReleaseEvent+        <$> x .: "action"++    parseJSON _ = fail "ForkEvent"+++------------------------------------------------------------------------------+-- GollumEvent++data GollumEvent = GollumEvent+    { gollumEventPages :: !Value+    } deriving (Eq, Show)++instance FromJSON GollumEvent where+    parseJSON (Object x) = GollumEvent+        <$> x .: "pages"++    parseJSON _ = fail "GollumEvent"+++------------------------------------------------------------------------------+-- MemberEvent++data MemberEvent = MemberEvent+    { memberEventAction :: !Text+    } deriving (Eq, Show)++instance FromJSON MemberEvent where+    parseJSON (Object x) = MemberEvent+        <$> x .: "action"++    parseJSON _ = fail "MemberEvent"
src/GitHub/Types/Repository.hs view
@@ -27,45 +27,3 @@         , "target_url"  .= cdsTargetUrl         , "description" .= cdsDescription         ]---data Deployment = Deployment-    { deploymentId          :: Int-    , deploymentSha         :: Text-    , deploymentRef         :: Text-    , deploymentTask        :: Text-    , deploymentEnvironment :: Text-    , deploymentPayload     :: Value-    , deploymentDescription :: Text-    } deriving (Eq, Show)--instance FromJSON Deployment where-    parseJSON (Object x) = Deployment-        <$> x .: "id"-        <*> x .: "sha"-        <*> x .: "ref"-        <*> x .: "task"-        <*> x .: "environment"-        <*> x .: "payload"-        <*> x .: "description"--    parseJSON _ = mzero---data DeploymentStatus = DeploymentStatus-    { deploymentStatusId             :: Int-    , deploymentStatusState          :: Text-    , deploymentStatusTargetUrl      :: Maybe Text-    , deploymentStatusDescription    :: Maybe Text-    , deploymentStatusDeploymentUrl  :: Maybe Text-    } deriving (Eq, Show)--instance FromJSON DeploymentStatus where-    parseJSON (Object x) = DeploymentStatus-        <$> x .: "id"-        <*> x .: "state"-        <*> x .: "target_url"-        <*> x .: "description"-        <*> x .: "deployment_url"--    parseJSON _ = mzero
+ test/Test.hs view
@@ -0,0 +1,61 @@+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE UndecidableInstances  #-}+{-# LANGUAGE FlexibleContexts   #-}+{-# LANGUAGE ScopedTypeVariables   #-}++module Main where++import           Control.Applicative+import           Control.Monad++import           Test.Hspec+import           Test.SmallCheck+import           Test.SmallCheck.Series+import           Test.Hspec.SmallCheck++import           Data.Monoid         ((<>))+import           Data.Function+import           Data.List+import           Data.HashMap.Strict (HashMap)+import qualified Data.HashMap.Strict as HMS+import           Data.Text           (Text)+import qualified Data.Text           as T+import           Data.Vector         (Vector)+import qualified Data.Vector         as V+import           Data.Time+import           Data.Time.Clock.POSIX+import           Data.Aeson+import           Data.Aeson.Types+import           Data.Aeson.Encode.Pretty++import           Network.HTTP.Conduit++import           GitHub.Types.Events++++main :: IO ()+main = do+    httpManager <- newManager tlsManagerSettings+    hspec $ spec httpManager+++spec :: Manager -> Spec+spec httpManager = do++    describe "GitHub.Types.Event" $ do+        it "should parse all events from the public timeline" $ flip shouldReturn True $ do+          req <- parseUrl $ "https://api.github.com/events"+          body <- httpLbs (req { requestHeaders = ("User-Agent", "githb-types-haskell-test") : requestHeaders req }) httpManager++          case eitherDecode (responseBody body) :: Either String [Value] of+              Left e -> fail $ "Failed to parse response as list of JSON values: " <> e+              Right x -> do+                  forM_ x $ \v -> do+                      case fromJSON v :: Result Event of+                          Error s -> fail $ "Failed to parse event " <> s <> ", payload: " <> show (encodePretty v)+                          _ -> return ()++                  return True