gogol 0.3.0 → 0.4.0
raw patch · 8 files changed
+180/−75 lines, 8 filesdep +unliftio-coredep −monad-controldep −transformers-basedep ~gogol-coredep ~http-conduitPVP ok
version bump matches the API change (PVP)
Dependencies added: unliftio-core
Dependencies removed: monad-control, transformers-base
Dependency ranges changed: gogol-core, http-conduit
API changes (from Hackage documentation)
- Network.Google: instance Control.Monad.Base.MonadBase GHC.Types.IO (Network.Google.Google s)
- Network.Google: instance Control.Monad.Trans.Control.MonadBaseControl GHC.Types.IO (Network.Google.Google s)
- Network.Google.Auth: Secret :: Text -> Secret
- Network.Google.Auth: newtype Secret :: *
+ Network.Google: instance Control.Monad.IO.Unlift.MonadUnliftIO (Network.Google.Google s)
+ Network.Google: type family HasScope (s :: [Symbol]) a :: Constraint
+ Network.Google.Auth: GSecret :: Text -> GSecret
+ Network.Google.Auth: newtype GSecret
+ Network.Google.Auth: serviceAccountUser :: forall s. AllowScopes s => Maybe Text -> Credentials s -> Credentials s
+ Network.Google.Auth.Scope: type family Delete x xs
- Network.Google: Body :: ~MediaType -> ~RequestBody -> Body
+ Network.Google: Body :: !MediaType -> !RequestBody -> Body
- Network.Google: class AsAuthError a where _RetrievalError = _AuthError . _RetrievalError _MissingFileError = _AuthError . _MissingFileError _InvalidFileError = _AuthError . _InvalidFileError _TokenRefreshError = _AuthError . _TokenRefreshError
+ Network.Google: class AsAuthError a
- Network.Google: class HasEnv s a | a -> s where envOverride = environment . lens _envOverride (\ s a -> s {_envOverride = a}) envLogger = environment . lens _envLogger (\ s a -> s {_envLogger = a}) envManager = environment . lens _envManager (\ s a -> s {_envManager = a}) envStore = environment . lens _envStore (\ s a -> s {_envStore = a}) envScopes = environment . lens (\ _ -> Proxy :: Proxy s) (flip allow)
+ Network.Google: class HasEnv s a | a -> s
- Network.Google: data Body :: *
+ Network.Google: data Body
- Network.Google: runResourceT :: MonadBaseControl IO m => ResourceT m a -> m a
+ Network.Google: runResourceT :: MonadUnliftIO m => ResourceT m a -> m a
- Network.Google.Auth: Auth :: !(Credentials s) -> !(OAuthToken s) -> Auth
+ Network.Google.Auth: Auth :: !Credentials s -> !OAuthToken s -> Auth
- Network.Google.Auth: FromClient :: !OAuthClient -> !(OAuthCode s) -> Credentials
+ Network.Google.Auth: FromClient :: !OAuthClient -> !OAuthCode s -> Credentials
- Network.Google.Auth: OAuthClient :: !ClientId -> !Secret -> OAuthClient
+ Network.Google.Auth: OAuthClient :: !ClientId -> !GSecret -> OAuthClient
- Network.Google.Auth: OAuthToken :: !AccessToken -> !(Maybe RefreshToken) -> !UTCTime -> OAuthToken
+ Network.Google.Auth: OAuthToken :: !AccessToken -> !Maybe RefreshToken -> !UTCTime -> OAuthToken
- Network.Google.Auth: TokenRefreshError :: Status -> Text -> (Maybe Text) -> AuthError
+ Network.Google.Auth: TokenRefreshError :: Status -> Text -> Maybe Text -> AuthError
- Network.Google.Auth: [_clientSecret] :: OAuthClient -> !Secret
+ Network.Google.Auth: [_clientSecret] :: OAuthClient -> !GSecret
- Network.Google.Auth: [_credentials] :: Auth -> !(Credentials s)
+ Network.Google.Auth: [_credentials] :: Auth -> !Credentials s
- Network.Google.Auth: [_tokenRefresh] :: OAuthToken -> !(Maybe RefreshToken)
+ Network.Google.Auth: [_tokenRefresh] :: OAuthToken -> !Maybe RefreshToken
- Network.Google.Auth: [_token] :: Auth -> !(OAuthToken s)
+ Network.Google.Auth: [_token] :: Auth -> !OAuthToken s
- Network.Google.Auth: class AsAuthError a where _RetrievalError = _AuthError . _RetrievalError _MissingFileError = _AuthError . _MissingFileError _InvalidFileError = _AuthError . _InvalidFileError _TokenRefreshError = _AuthError . _TokenRefreshError
+ Network.Google.Auth: class AsAuthError a
- Network.Google.Auth: newtype AccessToken :: *
+ Network.Google.Auth: newtype AccessToken
- Network.Google.Auth: newtype ClientId :: *
+ Network.Google.Auth: newtype ClientId
- Network.Google.Auth: newtype OAuthScope :: *
+ Network.Google.Auth: newtype OAuthScope
- Network.Google.Auth: newtype RefreshToken :: *
+ Network.Google.Auth: newtype RefreshToken
- Network.Google.Auth: newtype ServiceId :: *
+ Network.Google.Auth: newtype ServiceId
- Network.Google.Auth.InstalledApplication: exchangeCode :: (MonadIO m, MonadCatch m) => OAuthClient -> (OAuthCode s) -> Logger -> Manager -> m (OAuthToken s)
+ Network.Google.Auth.InstalledApplication: exchangeCode :: (MonadIO m, MonadCatch m) => OAuthClient -> OAuthCode s -> Logger -> Manager -> m (OAuthToken s)
- Network.Google.Auth.InstalledApplication: refreshToken :: (MonadIO m, MonadCatch m) => OAuthClient -> (OAuthToken s) -> Logger -> Manager -> m (OAuthToken s)
+ Network.Google.Auth.InstalledApplication: refreshToken :: (MonadIO m, MonadCatch m) => OAuthClient -> OAuthToken s -> Logger -> Manager -> m (OAuthToken s)
- Network.Google.Env: Env :: !(Dual (Endo ServiceConfig)) -> !Logger -> !Manager -> !(Store s) -> Env
+ Network.Google.Env: Env :: !Dual (Endo ServiceConfig) -> !Logger -> !Manager -> !Store s -> Env
- Network.Google.Env: [_envOverride] :: Env -> !(Dual (Endo ServiceConfig))
+ Network.Google.Env: [_envOverride] :: Env -> !Dual (Endo ServiceConfig)
- Network.Google.Env: [_envStore] :: Env -> !(Store s)
+ Network.Google.Env: [_envStore] :: Env -> !Store s
- Network.Google.Env: class HasEnv s a | a -> s where envOverride = environment . lens _envOverride (\ s a -> s {_envOverride = a}) envLogger = environment . lens _envLogger (\ s a -> s {_envLogger = a}) envManager = environment . lens _envManager (\ s a -> s {_envManager = a}) envStore = environment . lens _envStore (\ s a -> s {_envStore = a}) envScopes = environment . lens (\ _ -> Proxy :: Proxy s) (flip allow)
+ Network.Google.Env: class HasEnv s a | a -> s
Files
- CHANGELOG.md +87/−0
- gogol.cabal +4/−5
- src/Network/Google.hs +33/−33
- src/Network/Google/Auth.hs +18/−5
- src/Network/Google/Auth/ServiceAccount.hs +2/−2
- src/Network/Google/Internal/Auth.hs +8/−6
- src/Network/Google/Internal/HTTP.hs +27/−23
- src/Network/Google/Internal/Logger.hs +1/−1
CHANGELOG.md view
@@ -1,5 +1,92 @@ # Change Log +## [0.4.0](https://github.com/brendanhay/gogol/tree/0.4.0)++Released: **04 February, 2019**, Compare: [0.4.0](https://github.com/brendanhay/gogol/compare/0.3.0...0.4.0)++### Added++- Added 3 examples of Google Sheets [\#80](https://github.com/brendanhay/gogol/pull/80)+- Support service account user impersonation [\#78](https://github.com/brendanhay/gogol/pull/78)++### Fixed++- Fixed tinylog typo [\#76](https://github.com/brendanhay/gogol/pull/76)+- Fix import conflicts for servant 0.13 [\#96](https://github.com/brendanhay/gogol/pull/96)+- Updated dependencies++## New Libraries++- `gogol-abusiveexperiencereport`+- `gogol-acceleratedmobilepageurl`+- `gogol-accesscontextmanager`+- `gogol-adexchangebuyer2`+- `gogol-adexperiencereport`+- `gogol-alertcenter`+- `gogol-analyticsreporting`+- `gogol-androiddeviceprovisioning`+- `gogol-androidmanagement`+- `gogol-bigquerydatatransfer`+- `gogol-bigtableadmin`+- `gogol-binaryauthorization`+- `gogol-chat`+- `gogol-cloudasset`+- `gogol-clouderrorreporting`+- `gogol-cloudfunctions`+- `gogol-cloudidentity`+- `gogol-cloudiot`+- `gogol-cloudkms`+- `gogol-cloudprofiler`+- `gogol-cloudscheduler`+- `gogol-cloudsearch`+- `gogol-cloudshell`+- `gogol-cloudtasks`+- `gogol-composer`+- `gogol-consumersurveys`+- `gogol-containeranalysis`+- `gogol-dialogflow`+- `gogol-digitalassetlinks`+- `gogol-dlp`+- `gogol-driveactivity`+- `gogol-file`+- `gogol-firebasehosting`+- `gogol-firebaseremoteconfig`+- `gogol-firestore`+- `gogol-iamcredentials`+- `gogol-iap`+- `gogol-indexing`+- `gogol-jobs`+- `gogol-libraryagent`+- `gogol-oslogin`+- `gogol-photoslibrary`+- `gogol-playcustomapp`+- `gogol-poly`+- `gogol-redis`+- `gogol-remotebuildexecution`+- `gogol-searchconsole`+- `gogol-servicebroker`+- `gogol-serviceconsumermanagement`+- `gogol-servicenetworking`+- `gogol-serviceusage`+- `gogol-serviceuser`+- `gogol-sourcerepo`+- `gogol-spanner`+- `gogol-speech`+- `gogol-streetviewpublish`+- `gogol-surveys`+- `gogol-testing`+- `gogol-texttospeech`+- `gogol-toolresults`+- `gogol-tpu`+- `gogol-tracing`+- `gogol-vault`+- `gogol-videointelligence`+- `gogol-websecurityscanner`++### Updated Service Definitions++- All service definitions have been updated to their latest respective versions.+ ## [0.3.0](https://github.com/brendanhay/gogol/tree/0.3.0) Released: **12 July, 2017**, Compare: [0.3.0](https://github.com/brendanhay/gogol/compare/0.2.0...0.3.0)
gogol.cabal view
@@ -1,5 +1,5 @@ name: gogol-version: 0.3.0+version: 0.4.0 synopsis: Comprehensive Google Services SDK. homepage: https://github.com/brendanhay/gogol bug-reports: https://github.com/brendanhay/gogol/issues@@ -66,21 +66,20 @@ , directory >= 1.2 , exceptions >= 0.6 , filepath >= 1.2- , gogol-core == 0.3.0.*+ , gogol-core == 0.4.0.* , http-client >= 0.5 && < 1- , http-conduit >= 2.2 && < 3+ , http-conduit >= 2.3 && < 3 , http-media >= 0.6 , http-types >= 0.8.6 , lens >= 4.4 , memory >= 0.8 , mime-types >= 0.1- , monad-control >= 1 , mtl >= 2.1.3.1 , resourcet >= 1.1 , text >= 1.1 , time >= 1.2 , transformers >= 0.2- , transformers-base >= 0.4+ , unliftio-core >= 0.1 , unordered-containers >= 0.2.5 , x509 >= 1.5 , x509-store >= 1.5
src/Network/Google.hs view
@@ -114,33 +114,34 @@ , module Network.Google.Types ) where -import Control.Applicative-import Control.Exception.Lens-import Control.Monad-import Control.Monad.Base-import Control.Monad.Catch-import Control.Monad.Reader-import qualified Control.Monad.RWS.Lazy as LRW-import qualified Control.Monad.RWS.Strict as RW-import qualified Control.Monad.State.Lazy as LS-import qualified Control.Monad.State.Strict as S-import Control.Monad.Trans.Control-import Control.Monad.Trans.Except (ExceptT)-import Control.Monad.Trans.Identity (IdentityT)-import Control.Monad.Trans.List (ListT)-import Control.Monad.Trans.Maybe (MaybeT)-import Control.Monad.Trans.Resource-import qualified Control.Monad.Writer.Lazy as LW-import qualified Control.Monad.Writer.Strict as W-import Network.Google.Auth-import Network.Google.Env-import Network.Google.Internal.Body-import Network.Google.Internal.HTTP-import Network.Google.Internal.Logger-import Network.Google.Prelude-import Network.Google.Types-import Network.HTTP.Conduit (newManager, tlsManagerSettings)+import Control.Applicative+import Control.Exception.Lens+import Control.Monad+import Control.Monad.Catch+import Control.Monad.IO.Unlift (MonadUnliftIO (withRunInIO))+import Control.Monad.Reader+import Control.Monad.Trans.Except (ExceptT)+import Control.Monad.Trans.Identity (IdentityT)+import Control.Monad.Trans.List (ListT)+import Control.Monad.Trans.Maybe (MaybeT)+import Control.Monad.Trans.Resource +import Network.Google.Auth+import Network.Google.Env+import Network.Google.Internal.Body+import Network.Google.Internal.HTTP+import Network.Google.Internal.Logger+import Network.Google.Prelude+import Network.Google.Types+import Network.HTTP.Conduit (newManager, tlsManagerSettings)++import qualified Control.Monad.Writer.Lazy as LW+import qualified Control.Monad.Writer.Strict as W+import qualified Control.Monad.RWS.Lazy as LRW+import qualified Control.Monad.RWS.Strict as RW+import qualified Control.Monad.State.Lazy as LS+import qualified Control.Monad.State.Strict as S+ -- | The 'Google' monad containing configuration environment and tracks -- resource allocation via 'ResourceT'. -- The functions in "Network.Google" are generalised@@ -155,7 +156,6 @@ , MonadThrow , MonadCatch , MonadMask- , MonadBase IO , MonadReader (Env s) , MonadResource )@@ -183,11 +183,11 @@ instance AllowScopes s => MonadGoogle s (Google s) where liftGoogle = id -instance MonadBaseControl IO (Google s) where- type StM (Google s) a = StM (ReaderT (Env s) (ResourceT IO)) a-- liftBaseWith f = Google $ liftBaseWith $ \g -> f (g . unGoogle)- restoreM = Google . restoreM+instance MonadUnliftIO (Google s) where+ withRunInIO inner =+ Google $ withRunInIO $ \run ->+ inner (run . unGoogle)+ {-# INLINE withRunInIO #-} instance MonadGoogle s m => MonadGoogle s (IdentityT m) where liftGoogle = lift . liftGoogle@@ -440,6 +440,6 @@ The 'newLogger' function can be used to construct a simple logger which writes output to a 'Handle', but in most production code you should probably consider using a more robust logging library such as-<http://hackage.haskell.org/package/tiny-log tiny-log> or+<http://hackage.haskell.org/package/tinylog tinylog> or <http://hackage.haskell.org/package/fast-logger fast-logger>. -}
src/Network/Google/Auth.hs view
@@ -25,6 +25,9 @@ , saveAuthorizedUserToWellKnownPath , saveAuthorizedUser + -- ** Service account user impersonation+ , serviceAccountUser+ -- ** Installed Application Credentials , installedApplication , formURL@@ -60,7 +63,7 @@ -- * Re-exported Types , AccessToken (..) , RefreshToken (..)- , Secret (..)+ , GSecret (..) , ServiceId (..) , ClientId (..) @@ -163,10 +166,10 @@ exchange c l = fmap (Auth c) . action l where action = case c of- FromMetadata s -> metadataToken s- FromAccount a -> serviceAccountToken a (Proxy :: Proxy s)- FromClient x n -> exchangeCode x n- FromUser u -> authorizedUserToken u Nothing+ FromMetadata s -> metadataToken s+ FromAccount a -> serviceAccountToken a (Proxy :: Proxy s)+ FromClient x n -> exchangeCode x n+ FromUser u -> authorizedUserToken u Nothing -- | Refresh an existing 'OAuthToken'. refresh :: forall m s. (MonadIO m, MonadCatch m, AllowScopes s)@@ -198,3 +201,13 @@ , "Bearer " <> toHeader (_tokenAccess t) ) : Client.requestHeaders rq }++-- | Set the user to be impersonated for a service account with domain+-- wide delegation. See+-- https://developers.google.com/identity/protocols/OAuth2ServiceAccount+serviceAccountUser :: forall s. (AllowScopes s)+ => Maybe Text+ -> Credentials s+ -> Credentials s+serviceAccountUser u (FromAccount s) = FromAccount $ s { _serviceAccountUser = u }+serviceAccountUser _ c = c
src/Network/Google/Auth/ServiceAccount.hs view
@@ -125,10 +125,10 @@ , "kid" .= _serviceKeyId s ] - payload = base64Encode+ payload = base64Encode $ [ "aud" .= tokenURL , "scope" .= concatScopes (allowScopes p) , "iat" .= n , "exp" .= (n + seconds maxTokenLifetime) , "iss" .= _serviceEmail s- ]+ ] <> maybe [] (\sub -> ["sub" .= sub]) (_serviceAccountUser s)
src/Network/Google/Internal/Auth.hs view
@@ -91,10 +91,11 @@ /See:/ <https://developers.google.com/identity/protocols/OAuth2ServiceAccount#delegatingauthority Delegating authority to your service account>. -} data ServiceAccount = ServiceAccount- { _serviceId :: !ClientId- , _serviceEmail :: !Text- , _serviceKeyId :: !Text- , _servicePrivateKey :: !PrivateKey+ { _serviceId :: !ClientId+ , _serviceEmail :: !Text+ , _serviceKeyId :: !Text+ , _servicePrivateKey :: !PrivateKey+ , _serviceAccountUser :: !(Maybe Text) } deriving (Eq, Show) instance FromJSON ServiceAccount where@@ -109,6 +110,7 @@ <*> o .: "client_email" <*> o .: "private_key_id" <*> pure k+ <*> pure Nothing {-| Authorized User credentials which are typically generated by the Cloud SDK Tools such as @gcloud init@, of the following form:@@ -126,7 +128,7 @@ data AuthorizedUser = AuthorizedUser { _userId :: !ClientId , _userRefresh :: !RefreshToken- , _userSecret :: !Secret+ , _userSecret :: !GSecret } deriving (Eq, Show) instance ToJSON AuthorizedUser where@@ -145,7 +147,7 @@ -- | A client identifier and accompanying secret used to obtain/refresh a token. data OAuthClient = OAuthClient { _clientId :: !ClientId- , _clientSecret :: !Secret+ , _clientSecret :: !GSecret } deriving (Eq, Show) {-| An OAuth bearer type token of the following form:
src/Network/Google/Internal/HTTP.hs view
@@ -15,28 +15,32 @@ -- module Network.Google.Internal.HTTP where -import Control.Lens ((%~), (&))-import Control.Monad.Catch-import Control.Monad.IO.Class (MonadIO)-import Control.Monad.Trans.Resource (MonadResource (..))-import qualified Data.ByteString.Lazy as LBS-import Data.Conduit (($$+-))-import qualified Data.Conduit.List as Conduit-import Data.Monoid (Dual (..), Endo (..), (<>))-import qualified Data.Text.Encoding as Text-import qualified Data.Text.Lazy as LText-import qualified Data.Text.Lazy.Builder as Build-import GHC.Exts (toList)-import Network.Google.Auth (AllowScopes, authorize)-import Network.Google.Env (Env (..))-import Network.Google.Internal.Logger (logDebug)-import Network.Google.Internal.Multipart-import Network.Google.Types-import qualified Network.HTTP.Client.Conduit as Client-import Network.HTTP.Conduit-import Network.HTTP.Media (RenderHeader (..))-import Network.HTTP.Types+import Control.Lens ((%~), (&))+import Control.Monad.Catch+import Control.Monad.IO.Class (MonadIO)+import Control.Monad.Trans.Resource (MonadResource (..)) +import Data.Conduit (($$+-))+import Data.Monoid (Dual (..), Endo (..), (<>))++import GHC.Exts (toList)++import Network.Google.Auth (AllowScopes, authorize)+import Network.Google.Env (Env (..))+import Network.Google.Internal.Logger (logDebug)+import Network.Google.Internal.Multipart+import Network.Google.Types+import Network.HTTP.Conduit+import Network.HTTP.Media (RenderHeader (..))+import Network.HTTP.Types++import qualified Data.ByteString.Lazy as LBS+import qualified Data.Conduit.List as Conduit+import qualified Data.Text.Encoding as Text+import qualified Data.Text.Lazy as LText+import qualified Data.Text.Lazy.Builder as Build+import qualified Network.HTTP.Client.Conduit as Client+ -- FIXME: "mediaType" param also comes/calculated from the request body? -- -- Resumable endpoints - Not supported to begin with, need to figure@@ -53,7 +57,7 @@ where Request {..} = _cliRequest ServiceConfig {..} = _cliService- Client {..} = requestClient x+ GClient {..} = requestClient x & clientService %~ appEndo (getDual _envOverride) go = liftResourceT $ do@@ -103,7 +107,7 @@ statusCheck rs | _cliCheck (responseStatus rs) = pure () | otherwise = do- b <- LBS.fromChunks <$> (responseBody rs $$+- Conduit.consume)+ b <- sinkLBS (responseBody rs) throwM . toException . ServiceError $ ServiceError' { _serviceId = _svcId , _serviceStatus = responseStatus rs
src/Network/Google/Internal/Logger.hs view
@@ -47,7 +47,7 @@ import qualified Data.Text.Lazy as LText import qualified Data.Text.Lazy.Encoding as LText import Data.Word (Word16)-import Network.Google.Prelude hiding (Header, Request)+import Network.Google.Prelude hiding (Request) import Network.HTTP.Conduit import Network.HTTP.Types import Numeric (showFFloat)