packages feed

vcs-web-hook-parse (empty) → 0.1.0.0

raw patch · 10 files changed

+669/−0 lines, 10 filesdep +aesondep +basedep +bytestringsetup-changed

Dependencies added: aeson, base, bytestring, text

Files

+ AUTHORS view
@@ -0,0 +1,1 @@+fr33domlover <fr33domlover@riseup.net>
+ COPYING view
@@ -0,0 +1,121 @@+Creative Commons Legal Code++CC0 1.0 Universal++    CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE+    LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN+    ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS+    INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES+    REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS+    PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM+    THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED+    HEREUNDER.++Statement of Purpose++The laws of most jurisdictions throughout the world automatically confer+exclusive Copyright and Related Rights (defined below) upon the creator+and subsequent owner(s) (each and all, an "owner") of an original work of+authorship and/or a database (each, a "Work").++Certain owners wish to permanently relinquish those rights to a Work for+the purpose of contributing to a commons of creative, cultural and+scientific works ("Commons") that the public can reliably and without fear+of later claims of infringement build upon, modify, incorporate in other+works, reuse and redistribute as freely as possible in any form whatsoever+and for any purposes, including without limitation commercial purposes.+These owners may contribute to the Commons to promote the ideal of a free+culture and the further production of creative, cultural and scientific+works, or to gain reputation or greater distribution for their Work in+part through the use and efforts of others.++For these and/or other purposes and motivations, and without any+expectation of additional consideration or compensation, the person+associating CC0 with a Work (the "Affirmer"), to the extent that he or she+is an owner of Copyright and Related Rights in the Work, voluntarily+elects to apply CC0 to the Work and publicly distribute the Work under its+terms, with knowledge of his or her Copyright and Related Rights in the+Work and the meaning and intended legal effect of CC0 on those rights.++1. Copyright and Related Rights. A Work made available under CC0 may be+protected by copyright and related or neighboring rights ("Copyright and+Related Rights"). Copyright and Related Rights include, but are not+limited to, the following:++  i. the right to reproduce, adapt, distribute, perform, display,+     communicate, and translate a Work;+ ii. moral rights retained by the original author(s) and/or performer(s);+iii. publicity and privacy rights pertaining to a person's image or+     likeness depicted in a Work;+ iv. rights protecting against unfair competition in regards to a Work,+     subject to the limitations in paragraph 4(a), below;+  v. rights protecting the extraction, dissemination, use and reuse of data+     in a Work;+ vi. database rights (such as those arising under Directive 96/9/EC of the+     European Parliament and of the Council of 11 March 1996 on the legal+     protection of databases, and under any national implementation+     thereof, including any amended or successor version of such+     directive); and+vii. other similar, equivalent or corresponding rights throughout the+     world based on applicable law or treaty, and any national+     implementations thereof.++2. Waiver. To the greatest extent permitted by, but not in contravention+of, applicable law, Affirmer hereby overtly, fully, permanently,+irrevocably and unconditionally waives, abandons, and surrenders all of+Affirmer's Copyright and Related Rights and associated claims and causes+of action, whether now known or unknown (including existing as well as+future claims and causes of action), in the Work (i) in all territories+worldwide, (ii) for the maximum duration provided by applicable law or+treaty (including future time extensions), (iii) in any current or future+medium and for any number of copies, and (iv) for any purpose whatsoever,+including without limitation commercial, advertising or promotional+purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each+member of the public at large and to the detriment of Affirmer's heirs and+successors, fully intending that such Waiver shall not be subject to+revocation, rescission, cancellation, termination, or any other legal or+equitable action to disrupt the quiet enjoyment of the Work by the public+as contemplated by Affirmer's express Statement of Purpose.++3. Public License Fallback. Should any part of the Waiver for any reason+be judged legally invalid or ineffective under applicable law, then the+Waiver shall be preserved to the maximum extent permitted taking into+account Affirmer's express Statement of Purpose. In addition, to the+extent the Waiver is so judged Affirmer hereby grants to each affected+person a royalty-free, non transferable, non sublicensable, non exclusive,+irrevocable and unconditional license to exercise Affirmer's Copyright and+Related Rights in the Work (i) in all territories worldwide, (ii) for the+maximum duration provided by applicable law or treaty (including future+time extensions), (iii) in any current or future medium and for any number+of copies, and (iv) for any purpose whatsoever, including without+limitation commercial, advertising or promotional purposes (the+"License"). The License shall be deemed effective as of the date CC0 was+applied by Affirmer to the Work. Should any part of the License for any+reason be judged legally invalid or ineffective under applicable law, such+partial invalidity or ineffectiveness shall not invalidate the remainder+of the License, and in such case Affirmer hereby affirms that he or she+will not (i) exercise any of his or her remaining Copyright and Related+Rights in the Work or (ii) assert any associated claims and causes of+action with respect to the Work, in either case contrary to Affirmer's+express Statement of Purpose.++4. Limitations and Disclaimers.++ a. No trademark or patent rights held by Affirmer are waived, abandoned,+    surrendered, licensed or otherwise affected by this document.+ b. Affirmer offers the Work as-is and makes no representations or+    warranties of any kind concerning the Work, express, implied,+    statutory or otherwise, including without limitation warranties of+    title, merchantability, fitness for a particular purpose, non+    infringement, or the absence of latent or other defects, accuracy, or+    the present or absence of errors, whether or not discoverable, all to+    the greatest extent permissible under applicable law.+ c. Affirmer disclaims responsibility for clearing rights of other persons+    that may apply to the Work or any use thereof, including without+    limitation any person's Copyright and Related Rights in the Work.+    Further, Affirmer disclaims responsibility for obtaining any necessary+    consents, permissions or other rights required for any use of the+    Work.+ d. Affirmer understands and acknowledges that Creative Commons is not a+    party to this document and has no duty or obligation with respect to+    this CC0 or use of the Work.
+ ChangeLog view
@@ -0,0 +1,17 @@+The changes are recorded by the version control system, Darcs. To see a log+quickly from the terminal, run:++  $ darcs changes --repo http://dev.rel4tion.org/fr33domlover/vcs-web-hook-parse++There is also a web interface at <http://darcs.rel4tion.org> which, among other+things, can display the history log.++To see the log in a local clone, first get a copy of the repository if you+haven't yet:++  $ darcs get http://dev.rel4tion.org/fr33domlover/vcs-web-hook-parse++Then move into the newly created directory and run darcs:++  $ cd vcs-web-hook-parse+  $ darcs changes
+ INSTALL view
@@ -0,0 +1,13 @@+Install from Hackage:++    $ cabal install vcs-web-hook-parse++Install from unpacked release tarball or source repo:++    $ cd vcs-web-hook-parse+    $ cabal install++Just play with it without installing:++    $ cabal build+    $ cabal repl
+ NEWS view
@@ -0,0 +1,23 @@+This file lists the user-visible interesting changes between releases. For a+full list of changes to the source, see the ChangeLog.++++vcs-web-hook-parse 0.1.0.0 -- 2015-08-10+========================================++General, build and documentation changes:++* (This is the first release, so everything is new)++New APIs, features and enhancements:++* (This is the first release, so everything is a new feature)++Bug fixes:++* (This is just the first release)++Dependency changes:++* (This is the first release)
+ README.md view
@@ -0,0 +1,14 @@+See the .cabal file for more info and link to project website the version+control.++The official download location is Hackage:++<http://hackage.haskell.org/package/vcs-web-hook-parse>++This library is free software, and is committed to software freedom. It is+released to the public domain using the CC0 Public Domain Dedication. For the+boring "legal" details see the file 'COPYING'.++See the file 'INSTALL' for hints on installation. The file 'ChangeLog' explains+how to see the history log of the changes done in the code. 'NEWS' provides a+friendly overview of the changes for each release.
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ src/Web/Hook/GitLab.hs view
@@ -0,0 +1,300 @@+{- This file is part of vcs-web-hook-parse.+ -+ - Written in 2015 by fr33domlover <fr33domlover@rel4tion.org>.+ -+ - ♡ Copying is an act of love. Please copy, reuse and share.+ -+ - The author(s) have dedicated all copyright and related and neighboring+ - rights to this software to the public domain worldwide. This software is+ - distributed without any warranty.+ -+ - You should have received a copy of the CC0 Public Domain Dedication along+ - with this software. If not, see+ - <http://creativecommons.org/publicdomain/zero/1.0/>.+ -}++{-# LANGUAGE OverloadedStrings #-}++module Web.Hook.GitLab+    ( CommitID+    , Url+    , Author (..)+    , User (..)+    , Commit (..)+    , MergeEndpoint (..)+    , Repository (..)+    , Issue (..)+    , MergeRequest (..)+    , Push (..)+    , IssueEvent (..)+    , MergeRequestEvent (..)+    , Event (..)+    , parse+    )+where++import Control.Applicative+import Control.Monad (mzero)+import Data.Aeson+import Data.Aeson.Types (Parser)+import qualified Data.ByteString.Lazy as B+import qualified Data.Text as T++type CommitID = T.Text++type Url = T.Text++data Author = Author+    { authorName  :: T.Text+    , authorEmail :: T.Text+    }++data User = User+    { userName     :: T.Text+    , userUsername :: T.Text+    , userAvatar   :: Url+    }++data Commit = Commit+    { commitId        :: CommitID+    , commitMessage   :: T.Text+    , commitTimestamp :: T.Text+    , commitUrl       :: Url+    , commitAuthor    :: Author+    }++data MergeEndpoint = MergeEndpoint+    { mepName       :: T.Text+    , mepSshUrl     :: Url+    , mepHttpurl    :: Url+    , mepVisibility :: Int+    , mepNamespace  :: T.Text+    }++data Repository = Repository+    { repoName       :: T.Text+    , repoUrl        :: Url+    , repoDesc       :: T.Text+    , repoHomepage   :: Url+    , repoGitHttpUrl :: Url+    , repoGitSshUrl  :: Url+    , repoVisibility :: Int+    }++data Issue = Issue+    { issueInternalId  :: Int+    , issueTitle       :: T.Text+    , issueAssigneeId  :: Int+    , issueAuthorId    :: Int+    , issueProjectId   :: Int+    , issueCreatedAt   :: T.Text+    , issueUpdatedAt   :: T.Text+    , issuePosition    :: Int+    , issueBranch      :: Maybe T.Text+    , issueDescription :: T.Text+    , issueMilestoneId :: Maybe Int+    , issueState       :: T.Text+    , issueId          :: Int+    , issueUrl         :: Url+    }++data MergeRequest = MergeRequest+    { mrInternalId      :: Int+    , mrTargetBranch    :: T.Text+    , mrSourceBranch    :: T.Text+    , mrSourceProjectId :: Int+    , mrAuthorId        :: Int+    , mrAssigneeId      :: Maybe Int+    , mrTitle           :: T.Text+    , mrCreatedAt       :: T.Text+    , mrUpdatedAt       :: T.Text+    --, mrStCommits       :: [Int] -- dummy type; what is this?+    --, mrStDiffs         :: [Int] -- dummy type; what is this?+    , mrMilestoneId     :: Maybe Int+    , mrState           :: T.Text+    , mrMergeStatus     :: T.Text+    , mrTargetProjectId :: Int+    , mrId              :: Int+    , mrDescription     :: T.Text+    , mrSource          :: MergeEndpoint+    , mrTarget          :: MergeEndpoint+    , mrLastCommit      :: Commit+    , mrUrl             :: Url+    }++data Push = Push+    { pushBefore       :: CommitID+    , pushAfter        :: CommitID+    , pushRef          :: T.Text+    , pushUserId       :: Int+    , pushUserName     :: T.Text+    , pushUserEmail    :: T.Text+    , pushProjectId    :: Int+    , pushRepository   :: Repository+    , pushCommits      :: [Commit]+    , pushCommitsTotal :: Int+    }++data IssueEvent = IssueEvent+    { ieUser   :: User+    , ieIssue  :: Issue+    , ieAction :: T.Text+    }++data MergeRequestEvent = MergeRequestEvent+    { mreUser    :: User+    , mreRequest :: MergeRequest+    , mreAction  :: T.Text+    }++data Event+    = EventPush Push+    | EventPushTag Push+    | EventIssue IssueEvent+    | EventMergeRequest MergeRequestEvent++instance FromJSON Author where+    parseJSON (Object v) =+        Author <$>+        v .: "name" <*>+        v .: "email"+    parseJSON _          = mzero++instance FromJSON User where+    parseJSON (Object v) =+        User <$>+        v .: "name" <*>+        v .: "username" <*>+        v .: "avatar_url"+    parseJSON _          = mzero++instance FromJSON Commit where+    parseJSON (Object v) =+        Commit <$>+        v .: "id" <*>+        v .: "message" <*>+        v .: "timestamp" <*>+        v .: "url" <*>+        v .: "author"+    parseJSON _          = mzero++instance FromJSON MergeEndpoint where+    parseJSON (Object v) =+        MergeEndpoint <$>+        v .: "name" <*>+        v .: "ssh_url" <*>+        v .: "http_url" <*>+        v .: "visibility_level" <*>+        v .: "namespace"+    parseJSON _          = mzero++instance FromJSON Repository where+    parseJSON (Object v) =+        Repository <$>+        v .: "name" <*>+        v .: "url" <*>+        v .: "description" <*>+        v .: "homepage" <*>+        v .: "git_http_url" <*>+        v .: "git_ssh_url" <*>+        v .: "visibility_level"+    parseJSON _          = mzero++instance FromJSON Issue where+    parseJSON (Object v) =+        Issue <$>+        v .: "id" <*>+        v .: "title" <*>+        v .: "assignee_id" <*>+        v .: "author_id" <*>+        v .: "project_id" <*>+        v .: "created_at" <*>+        v .: "updated_at" <*>+        v .: "position" <*>+        v .: "branch_name" <*>+        v .: "description" <*>+        v .: "milestone_id" <*>+        v .: "state" <*>+        v .: "iid" <*>+        v .: "url"+    parseJSON _          = mzero++instance FromJSON MergeRequest where+    parseJSON (Object v) =+        MergeRequest <$>+        v .: "id" <*>+        v .: "target_branch" <*>+        v .: "source_branch" <*>+        v .: "source_project_id" <*>+        v .: "author_id" <*>+        v .: "assignee_id" <*>+        v .: "title" <*>+        v .: "created_at" <*>+        v .: "updated_at" <*>+        --v .: "st_commits" <*>+        --v .: "st_diffs" <*>+        v .: "milestone_id" <*>+        v .: "state" <*>+        v .: "merge_status" <*>+        v .: "target_project_id" <*>+        v .: "iid" <*>+        v .: "description" <*>+        v .: "source" <*>+        v .: "target" <*>+        v .: "last_commit" <*>+        v .: "url"+    parseJSON _          = mzero++instance FromJSON Push where+    parseJSON (Object v) =+        Push <$>+        v .: "before" <*>+        v .: "after" <*>+        v .: "ref" <*>+        v .: "user_id" <*>+        v .: "user_name" <*>+        v .: "user_email" <*>+        v .: "project_id" <*>+        v .: "repository" <*>+        v .: "commits" <*>+        v .: "total_commits_count"+    parseJSON _          = mzero++text :: Parser T.Text -> T.Text -> Parser T.Text+text parser expected = do+    got <- parser+    if got == expected+        then return got+        else mzero++instance FromJSON IssueEvent where+    parseJSON (Object o) = do+        user <- o .: "user"+        attrs <- o .: "object_attributes"+        mr <- o .: "object_attributes"+        action <- attrs .: "action"+        return $ IssueEvent user mr action+    parseJSON _          = mzero++instance FromJSON MergeRequestEvent where+    parseJSON (Object o) = do+        user <- o .: "user"+        attrs <- o .: "object_attributes"+        issue <- o .: "object_attributes"+        action <- attrs .: "action"+        return $ MergeRequestEvent user issue action+    parseJSON _          = mzero++instance FromJSON Event where+    parseJSON v@(Object o) =+        let kind = text $ o .: "object_kind"+        in  kind "push"          *> (EventPush         <$> parseJSON v) <|>+            kind "tag_push"      *> (EventPushTag      <$> parseJSON v) <|>+            kind "issue"         *> (EventIssue        <$> parseJSON v) <|>+            kind "merge_request" *> (EventMergeRequest <$> parseJSON v)+    parseJSON _          = mzero++-- | Parse a JSON string (the body of the HTTP request) into event information.+-- If parsing fails, return 'Left' an error message.+parse :: B.ByteString -> Either String Event+parse = eitherDecode
+ src/Web/Hook/Gogs.hs view
@@ -0,0 +1,124 @@+{- This file is part of vcs-web-hook-parse.+ -+ - Written in 2015 by fr33domlover <fr33domlover@rel4tion.org>.+ -+ - ♡ Copying is an act of love. Please copy, reuse and share.+ -+ - The author(s) have dedicated all copyright and related and neighboring+ - rights to this software to the public domain worldwide. This software is+ - distributed without any warranty.+ -+ - You should have received a copy of the CC0 Public Domain Dedication along+ - with this software. If not, see+ - <http://creativecommons.org/publicdomain/zero/1.0/>.+ -}++{-# LANGUAGE OverloadedStrings #-}++module Web.Hook.Gogs+    ( CommitID+    , Url+    , User (..)+    , Commit (..)+    , Repository (..)+    , Push (..)+    , parse+    )+where++import Control.Applicative+import Control.Monad (mzero)+import Data.Aeson+import qualified Data.ByteString.Lazy as B+import qualified Data.Text as T++type CommitID = T.Text++type Url = T.Text++data User = User+    { userName     :: T.Text+    , userEmail    :: T.Text+    , userUsername :: T.Text+    }+    deriving Show++data Commit = Commit+    { commitId      :: CommitID+    , commitMessage :: T.Text+    , commitUrl     :: Url+    , commitAuthor  :: User+    }+    deriving Show++data Repository = Repository+    { repoId          :: Int+    , repoName        :: T.Text+    , repoUrl         :: Url+    , repoDescription :: T.Text+    , repoWebsite     :: Url+    , repoWatchers    :: Int+    , repoOwner       :: User+    , repoPrivate     :: Bool+    }+    deriving Show++data Push = Push+    { pushSecret     :: T.Text+    , pushRef        :: T.Text+    , pushCommits    :: [Commit]+    , pushRepository :: Repository+    , pushPusher     :: User+    , pushBefore     :: CommitID+    , pushAfter      :: CommitID+    , pushCompareUrl :: Url+    }+    deriving Show++instance FromJSON User where+    parseJSON (Object v) =+        User <$>+        v .: "name" <*>+        v .: "email" <*>+        v .: "username"+    parseJSON _          = mzero++instance FromJSON Commit where+    parseJSON (Object v) =+        Commit <$>+        v .: "id" <*>+        v .: "message" <*>+        v .: "url" <*>+        v .: "author"+    parseJSON _          = mzero++instance FromJSON Repository where+    parseJSON (Object v) =+        Repository <$>+        v .: "id" <*>+        v .: "name" <*>+        v .: "url" <*>+        v .: "description" <*>+        v .: "website" <*>+        v .: "watchers" <*>+        v .: "owner" <*>+        v .: "private"+    parseJSON _          = mzero++instance FromJSON Push where+    parseJSON (Object v) =+        Push <$>+        v .: "secret" <*>+        v .: "ref" <*>+        v .: "commits" <*>+        v .: "repository" <*>+        v .: "pusher" <*>+        v .: "before" <*>+        v .: "after" <*>+        v .: "compare_url"+    parseJSON _          = mzero++-- | Parse a JSON string (the body of the HTTP request) into event information.+-- If parsing fails, return 'Left' an error message.+parse :: B.ByteString -> Either String Push+parse = eitherDecode
+ vcs-web-hook-parse.cabal view
@@ -0,0 +1,54 @@+name:                vcs-web-hook-parse+version:             0.1.0.0+synopsis:            Parse development platform web hook messages.+description:+  A development platform is a server system which hosts (mostly software)+  projects, version controlled repositories and often provides feature like+  issue tracking, merge requests, project search, project wikis and more.+  .+  Some development platforms can report various events using web hooks, i.e.+  send HTTP requests containing structured data (e.g. JSON or XML) to a+  specified URL. Then you can run a server which receives these messages and+  reports them to IRC or a mailing list (or anything else you like).+  .+  This package collects development platform specific types, and functions+  which parse the HTTP message bodies into values of these types. Then an+  actual web hook handler can be written using them.+  .+  Why have a single package which handles the various platforms? First, because+  parsing some JSON or XML structures is a simple task requiring very little+  code (thanks to awesome Haskell libraries), sometimes hardly worth having its+  own dedicated package. Second, having them all here may allow sharing types+  and perhaps even developing some common web hook formats in the future.+  .+  This package handles only /free-as-in-freedom/ development platforms. In+  particular, it means g1thub won't be supported (until it becomes free too),+  while support for all free platforms (DarcsDen, Gogs, Kallithea, GitLab's+  "community edition", etc.) is very welcome.+homepage:            http://rel4tion.org/projects/vcs-web-hook-parse/+bug-reports:         http://rel4tion.org/projects/vcs-web-hook-parse/tickets/+license:             PublicDomain+license-file:        COPYING+author:              fr33domlover+maintainer:          fr33domlover@riseup.net+copyright:           ♡ Copying is an act of love. Please copy, reuse and share.+category:            Web+build-type:          Simple+extra-source-files:  AUTHORS ChangeLog COPYING INSTALL NEWS README.md+cabal-version:       >=1.10++source-repository head+  type:                darcs+  location:            http://dev.rel4tion.org/fr33domlover/vcs-web-hook-parse++library+  exposed-modules:     Web.Hook.GitLab+                     , Web.Hook.Gogs+  -- other-modules:       +  -- other-extensions:    +  build-depends:       base       >=4.7 && <5+                     , aeson      >=0.9+                     , bytestring+                     , text+  hs-source-dirs:      src+  default-language:    Haskell2010