packages feed

gitlab-haskell 0.1.0.0 → 0.1.0.1

raw patch · 11 files changed

+50/−116 lines, 11 filesdep −arraydep −asyncdep −containersPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependencies removed: array, async, containers, random, time

API changes (from Hackage documentation)

- GitLab.API.Issues: projectOpenedIssues :: MonadIO m => Project -> GitLab m [Issue]
+ GitLab.API.Issues: projectOpenedIssues :: (MonadIO m, MonadUnliftIO m) => Project -> GitLab m [Issue]
- GitLab.API.Issues: projectOpenedIssues' :: MonadIO m => Int -> GitLab m [Issue]
+ GitLab.API.Issues: projectOpenedIssues' :: (MonadIO m, MonadUnliftIO m) => Int -> GitLab m [Issue]

Files

README.md view
@@ -1,7 +1,7 @@ # A Haskell library for the GitLab web API -A library that interacts with a GitLab server's API. It supports-queries about and updates to:+This library interacts with a GitLab server's API. It supports queries+about and updates to:  * Branches * Commits
gitlab-haskell.cabal view
@@ -1,21 +1,11 @@-cabal-version: 1.12+cabal-version: 2.4 name:           gitlab-haskell category:       Git-version:        0.1.0.0+version:        0.1.0.1 synopsis:       A Haskell library for the GitLab web API description:   This Haskell library queries and updates the database of a GitLab instance using the GitLab web API: <https://docs.gitlab.com/ee/api/>   .-  An example that returns projects for which issue creation is enabled is:-  .-  > projectsWithIssuesEnabled :: IO [Project]-  > projectsWithIssuesEnabled = runGitLab myConfig $ filter (issueEnabled . issues_enabled) <$> allProjects-  >   where myConfig = defaultGitLabServer-  >             { url = "https://gitlab.example.com"-  >             , token = "my_access_token" }-  >         issueEnabled Nothing = False-  >         issueEnabled (Just t) = t-  .   Unsurprisingly, GitLab hosts this Haskell library: <https://gitlab.com/robstewart57/gitlab-haskell>                   @@ -24,7 +14,7 @@ author:         Rob Stewart maintainer:     robstewart57@gmail.com copyright:      2019 Rob Stewart, Heriot-Watt University-license:        BSD3+license:        BSD-3-Clause license-file:   LICENSE build-type:     Simple extra-source-files:@@ -61,13 +51,9 @@               , aeson               , bytestring               , text-              , async               , http-types-              , containers-              , random-              , array-              , time               , transformers               , unliftio               , unliftio-core   default-language: Haskell2010+  ghc-options: -Wall
src/GitLab/API/Commits.hs view
@@ -31,8 +31,8 @@   gitlab (commitsAddr projectId)   where     commitsAddr :: Int -> Text-    commitsAddr projectId =-      "/projects/" <> T.pack (show projectId) <> "/repository" <> "/commits"+    commitsAddr projId =+      "/projects/" <> T.pack (show projId) <> "/repository" <> "/commits"  -- | returns a commit for the given project and commit hash, if such -- a commit exists.@@ -52,9 +52,9 @@   gitlabOne (commitsAddr projectId)   where     commitsAddr :: Int -> Text-    commitsAddr projectId =+    commitsAddr projId =       "/projects/"-      <> T.pack (show projectId)+      <> T.pack (show projId)       <> "/repository"       <> "/commits"       <> "/" <> hash
src/GitLab/API/Groups.hs view
@@ -11,20 +11,11 @@ -} module GitLab.API.Groups where -import Control.Concurrent.Async-import Control.Monad import Control.Monad.IO.Class-import Control.Monad.Trans.Reader-import Data.Aeson-import qualified Data.ByteString.Lazy as BSL import Data.Maybe import Data.Text (Text) import qualified Data.Text as T-import qualified Data.Text.Encoding as T-import GHC.Generics-import Network.HTTP.Conduit import Network.HTTP.Types.Status-import Network.HTTP.Types.URI  import GitLab.API.Members import GitLab.API.Users@@ -49,7 +40,8 @@   -> AccessLevel -- ^ level of access granted   -> User -- ^ the user   -> GitLab m (Either Status Member)-addUserToGroup groupName access user = addUserToGroup' groupName access (user_id user)+addUserToGroup groupName access usr =+  addUserToGroup' groupName access (user_id usr)  -- | adds a list of users to a group. addUsersToGroup ::
src/GitLab/API/Issues.hs view
@@ -11,34 +11,23 @@ -} module GitLab.API.Issues where -import Control.Concurrent.Async-import Control.Monad import Control.Monad.IO.Class import Control.Monad.IO.Unlift-import Control.Monad.Trans.Reader-import Data.Array.IO-import Data.List-import Data.Text (Text) import qualified Data.Text as T-import Data.Time.Calendar-import Network.HTTP.Types.Status-import System.IO-import System.Random-import UnliftIO.Async  import GitLab.WebRequests.GitLabWebCalls import GitLab.Types  -- | returns all issues against a project. projectOpenedIssues ::-     (MonadIO m)+     (MonadIO m, MonadUnliftIO m)   => Project -- ^ the project   -> GitLab m [Issue] projectOpenedIssues = projectOpenedIssues' . project_id  -- | returns all issues against a project given its project ID. projectOpenedIssues' ::-     (MonadIO m)+     (MonadIO m, MonadUnliftIO m)   => Int -- ^ the project ID   -> GitLab m [Issue] projectOpenedIssues' projectId = do@@ -51,11 +40,11 @@      (MonadIO m)   => User -- ^ the user   -> GitLab m [Issue]-userIssues user =+userIssues usr =   gitlabWithAttrs addr attrs   where     addr = "/issues"     attrs = T.pack $       "&author_id="-      <> show (user_id user)+      <> show (user_id usr)       <> "&scope=all"
src/GitLab/API/Members.hs view
@@ -11,16 +11,10 @@ -} module GitLab.API.Members where -import Control.Concurrent.Async-import Control.Monad import Control.Monad.IO.Class-import Control.Monad.Trans.Reader-import Data.List import Data.Text (Text) import qualified Data.Text as T-import Data.Time.Calendar import Network.HTTP.Types.Status-import System.IO  import GitLab.Types import GitLab.WebRequests.GitLabWebCalls@@ -61,8 +55,8 @@      -> AccessLevel -- ^ level of access      -> User -- ^ the user      -> GitLab m (Either Status Member)-addMemberToProject project access user =-  addMemberToProject' (project_id project) access (user_id user)+addMemberToProject project access usr =+  addMemberToProject' (project_id project) access (user_id usr)  -- | adds a user to a project with the given access level, given the -- project's ID and the user's ID. Returns @Right Member@ for each
src/GitLab/API/Projects.hs view
@@ -11,25 +11,14 @@ -} module GitLab.API.Projects where -import Control.Monad import Control.Monad.IO.Class import Control.Monad.IO.Unlift-import Control.Monad.Trans.Reader-import Data.Aeson-import qualified Data.ByteString.Lazy as BSL import Data.List-import Data.Map (Map)-import qualified Data.Map as Map import Data.Maybe import Data.Text (Text) import qualified Data.Text as T import qualified Data.Text.Encoding as T-import Data.Time.Clock-import GHC.Generics-import Network.HTTP.Conduit-import Network.HTTP.Types.Status import Network.HTTP.Types.URI-import System.IO import UnliftIO.Async  import GitLab.API.Commits@@ -52,11 +41,11 @@   => Text -- ^ name or namespace of the project   -> GitLab m [Project] projectForks projectName = do-  let path =+  let urlPath =         "/projects/" <>         T.decodeUtf8 (urlEncode False (T.encodeUtf8 projectName)) <>         "/forks"-  gitlab path+  gitlab urlPath  -- | searches for a 'Project' with the given project ID, returns -- 'Nothing' if a project with the given ID is not found.@@ -64,8 +53,8 @@   => Int -- ^ project ID   -> GitLab m (Maybe Project) searchProjectId projectId = do-  let path = T.pack ("/projects/" <> show projectId)-  gitlabOne path+  let urlPath = T.pack ("/projects/" <> show projectId)+  gitlabOne urlPath  -- | gets all projects with the given project name. --@@ -119,9 +108,9 @@   userMaybe <- searchUser username   case userMaybe of     Nothing -> return Nothing-    Just user -> Just <$> gitlab (path (user_id user))+    Just usr -> Just <$> gitlab (urlPath (user_id usr))   where-    path userId = "/users/" <> T.pack (show userId) <> "/projects"+    urlPath userId = "/users/" <> T.pack (show userId) <> "/projects"  -- | gets the 'GitLab.Types.Project' against which the given 'Issue' -- was created.@@ -138,12 +127,12 @@ -- user has created issues for. issuesCreatedByUser :: (MonadUnliftIO m, MonadIO m) => Text -> GitLab m (Maybe (User,[Project])) issuesCreatedByUser username = do-  user <- searchUser username-  case user of+  user_maybe <- searchUser username+  case user_maybe of     Nothing -> return Nothing     Just usr -> do-      issues <- userIssues usr-      projects <- mapConcurrently projectOfIssue issues+      usersIssues <- userIssues usr+      projects <- mapConcurrently projectOfIssue usersIssues       return (Just (usr, projects))  -- | searches for all projects with the given name, and returns a list@@ -157,10 +146,14 @@   projects <- projectsWithName projectName   mapM processProject projects   where+    processProject ::+         (MonadUnliftIO m, MonadIO m)+      => Project+      -> GitLab m (Project, [Issue], [User])     processProject proj = do-      issues <- projectOpenedIssues proj-      let authors = map issue_author issues-      return (proj, issues, authors)+      (openIssues :: [Issue]) <- projectOpenedIssues proj+      let authors = map issue_author openIssues+      return (proj, openIssues, authors)  -- | returns a (namespace,members) tuple for the given 'Project', -- where namespace is the namespace of the project@@ -187,7 +180,7 @@   pipes <- pipelines project   case pipes of     [] -> return False-    (x:xs) -> return (pipeline_status x == "success")+    (x:_) -> return (pipeline_status x == "success")  -- | searches for a username, and returns a user ID for that user, or -- 'Nothing' if a user cannot be found. @@ -195,7 +188,7 @@   => Text -- ^ name or namespace of project    -> GitLab m (Maybe Int) namespacePathToUserId namespacePath = do-  user <- searchUser namespacePath-  case user of+  user_maybe <- searchUser namespacePath+  case user_maybe of     Nothing -> return Nothing-    Just user -> return (Just (user_id user))+    Just usr -> return (Just (user_id usr))
src/GitLab/API/RepositoryFiles.hs view
@@ -32,8 +32,8 @@   -> Text -- ^ the file path   -> Text -- ^ name of the branch, tag or commit   -> GitLab m (Maybe RepositoryFile)-repositoryFiles' projectId filePath ref =-  gitlabWithAttrsOne addr ("&ref=" <> ref)+repositoryFiles' projectId filePath reference =+  gitlabWithAttrsOne addr ("&ref=" <> reference)   where     addr =       "/projects/"
src/GitLab/API/Users.hs view
@@ -11,25 +11,10 @@ -} module GitLab.API.Users where -import Control.Concurrent.Async-import Control.Monad import Control.Monad.IO.Class-import Control.Monad.Trans.Reader-import Data.Aeson-import qualified Data.ByteString.Lazy as BSL import Data.List-import Data.Map (Map)-import qualified Data.Map as Map import Data.Maybe import Data.Text (Text)-import qualified Data.Text as T-import qualified Data.Text.Encoding as T-import Data.Time.Clock-import GHC.Generics-import Network.HTTP.Conduit-import Network.HTTP.Types.Status-import Network.HTTP.Types.URI-import System.IO  import GitLab.Types import GitLab.WebRequests.GitLabWebCalls
src/GitLab/Types.hs view
@@ -36,16 +36,11 @@   , MergeRequest(..)   ) where -import qualified Data.ByteString.Lazy as BSL import Data.Aeson import Data.Text (Text) import GHC.Generics-import qualified Data.Text as T-import qualified Data.Text.Encoding as T import Network.HTTP.Conduit--- import APICalls import Control.Monad.Trans.Reader-import Network.Connection (TLSSettings (..))  -- | type synonym for all GitLab actions. type GitLab m a = ReaderT GitLabState m a
src/GitLab/WebRequests/GitLabWebCalls.hs view
@@ -11,7 +11,6 @@   , gitlabPost   ) where -import Network.Connection (TLSSettings (..)) import Network.HTTP.Conduit import qualified Data.ByteString.Lazy as BSL import Data.Text (Text)@@ -19,7 +18,6 @@ import qualified Data.Text.Encoding as T import Data.Aeson import qualified Control.Exception as E-import System.IO import Network.HTTP.Types.Status import GitLab.Types import Control.Monad.Trans.Reader@@ -42,10 +40,12 @@                 , requestBody = RequestBodyBS (T.encodeUtf8 dataBody) }   res <- liftIO $ tryGitLab 0 request (retries cfg) manager Nothing   case responseStatus res of-    status@(Status 404 msg) -> return (Left status)-    status@(Status 409 msg) -> return (Left status)+    resp@(Status 404 _msg) -> return (Left resp)+    resp@(Status 409 _msg) -> return (Left resp)     _ -> return (case parseBSOne (responseBody res) of-                   Just x -> Right x)+                   Just x -> Right x+                   Nothing -> Left $+                     mkStatus 409 "unable to parse POST response")  tryGitLab ::      Int -- ^ the current retry count@@ -54,12 +54,12 @@   -> Manager -- ^ HTTP manager   -> Maybe HttpException -- ^ the exception to report if maximum retries met   -> IO (Response BSL.ByteString)-tryGitLab i request retries manager ex-  | i == retries = error (show ex)+tryGitLab i request maxRetries manager lastException+  | i == maxRetries = error (show lastException)   | otherwise =       httpLbs request manager       `E.catch`-        \ex -> tryGitLab (i+1) request retries manager (Just ex)+        \ex -> tryGitLab (i+1) request maxRetries manager (Just ex)  parseBSOne :: FromJSON a => BSL.ByteString -> Maybe a parseBSOne bs =@@ -142,5 +142,5 @@   in findPages hdrs   where     findPages [] = 1 -- error "cannot find X-Total-Pages in header"-    findPages (("X-Total-Pages",bs):xs) = read (T.unpack (T.decodeUtf8 bs))+    findPages (("X-Total-Pages",bs):_) = read (T.unpack (T.decodeUtf8 bs))     findPages (_:xs) = findPages xs