Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package ghc-servant-client-core for 
openSUSE:Factory checked in at 2022-02-11 23:09:36
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ghc-servant-client-core (Old)
 and      /work/SRC/openSUSE:Factory/.ghc-servant-client-core.new.1956 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "ghc-servant-client-core"

Fri Feb 11 23:09:36 2022 rev:5 rq:953526 version:0.19

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/ghc-servant-client-core/ghc-servant-client-core.changes
  2021-09-10 23:41:28.490569828 +0200
+++ 
/work/SRC/openSUSE:Factory/.ghc-servant-client-core.new.1956/ghc-servant-client-core.changes
        2022-02-11 23:11:33.479318811 +0100
@@ -1,0 +2,35 @@
+Wed Feb  2 13:27:38 UTC 2022 - Peter Simons <[email protected]>
+
+- Update servant-client-core to version 0.19.
+  Package versions follow the [Package Versioning 
Policy](https://pvp.haskell.org/): in A.B.C, bumps to either A or B represent 
major versions.
+
+  0.19
+  ----
+
+  ### Significant changes
+
+  - Drop support for GHC < 8.6.
+  - Support GHC 9.0 (GHC 9.2 should work as well, but isn't fully tested yet).
+  - Support Aeson 2 
([#1475](https://github.com/haskell-servant/servant/pull/1475)),
+    which fixes a [DOS 
vulnerability](https://github.com/haskell/aeson/issues/864)
+    related to hash collisions.
+  - Add `NamedRoutes` combinator, making support for records first-class in 
Servant
+    ([#1388](https://github.com/haskell-servant/servant/pull/1388)).
+  - Add custom type errors for partially applied combinators
+    ([#1289](https://github.com/haskell-servant/servant/pull/1289),
+    [#1486](https://github.com/haskell-servant/servant/pull/1486)).
+  - *servant-client* / *servant-client-core* / *servant-http-streams*: Fix
+    erroneous behavior, where only 2XX status codes would be considered
+    successful, irrelevant of the status parameter specified by the verb
+    combinator. ([#1469](https://github.com/haskell-servant/servant/pull/1469))
+  - *servant-client* / *servant-client-core*: Fix `Show` instance for
+    `Servant.Client.Core.Request`.
+  - *servant-client* /  *servant-client-core*: Allow passing arbitrary binary 
data
+    in Query parameters.
+    ([#1432](https://github.com/haskell-servant/servant/pull/1432)).
+
+  ### Other changes
+
+  - Various version bumps.
+
+-------------------------------------------------------------------

Old:
----
  servant-client-core-0.18.3.tar.gz

New:
----
  servant-client-core-0.19.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ ghc-servant-client-core.spec ++++++
--- /var/tmp/diff_new_pack.whc2GA/_old  2022-02-11 23:11:33.899320026 +0100
+++ /var/tmp/diff_new_pack.whc2GA/_new  2022-02-11 23:11:33.903320037 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package ghc-servant-client-core
 #
-# Copyright (c) 2021 SUSE LLC
+# Copyright (c) 2022 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -19,7 +19,7 @@
 %global pkg_name servant-client-core
 %bcond_with tests
 Name:           ghc-%{pkg_name}
-Version:        0.18.3
+Version:        0.19
 Release:        0
 Summary:        Core functionality and class for client function generation 
for servant APIs
 License:        BSD-3-Clause
@@ -30,6 +30,7 @@
 BuildRequires:  ghc-base-compat-devel
 BuildRequires:  ghc-base64-bytestring-devel
 BuildRequires:  ghc-bytestring-devel
+BuildRequires:  ghc-constraints-devel
 BuildRequires:  ghc-containers-devel
 BuildRequires:  ghc-deepseq-devel
 BuildRequires:  ghc-exceptions-devel
@@ -67,7 +68,7 @@
 
 %prep
 %autosetup -n %{pkg_name}-%{version}
-cabal-tweak-dep-ver 'base-compat' '< 0.12' '< 0.13'
+cabal-tweak-dep-ver base-compat '< 0.12' '< 1'
 
 %build
 %ghc_lib_build

++++++ servant-client-core-0.18.3.tar.gz -> servant-client-core-0.19.tar.gz 
++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/servant-client-core-0.18.3/CHANGELOG.md 
new/servant-client-core-0.19/CHANGELOG.md
--- old/servant-client-core-0.18.3/CHANGELOG.md 2001-09-09 03:46:40.000000000 
+0200
+++ new/servant-client-core-0.19/CHANGELOG.md   2001-09-09 03:46:40.000000000 
+0200
@@ -1,6 +1,37 @@
 [The latest version of this document is on 
GitHub.](https://github.com/haskell-servant/servant/blob/master/servant-client-core/CHANGELOG.md)
 [Changelog for `servant` package contains significant entries for all core 
packages.](https://github.com/haskell-servant/servant/blob/master/servant/CHANGELOG.md)
 
+Package versions follow the [Package Versioning 
Policy](https://pvp.haskell.org/): in A.B.C, bumps to either A or B represent 
major versions.
+
+0.19
+----
+
+### Significant changes
+
+- Drop support for GHC < 8.6.
+- Support GHC 9.0 (GHC 9.2 should work as well, but isn't fully tested yet).
+- Support Aeson 2 
([#1475](https://github.com/haskell-servant/servant/pull/1475)),
+  which fixes a [DOS 
vulnerability](https://github.com/haskell/aeson/issues/864)
+  related to hash collisions.
+- Add `NamedRoutes` combinator, making support for records first-class in 
Servant
+  ([#1388](https://github.com/haskell-servant/servant/pull/1388)).
+- Add custom type errors for partially applied combinators
+  ([#1289](https://github.com/haskell-servant/servant/pull/1289),
+  [#1486](https://github.com/haskell-servant/servant/pull/1486)).
+- *servant-client* / *servant-client-core* / *servant-http-streams*: Fix
+  erroneous behavior, where only 2XX status codes would be considered
+  successful, irrelevant of the status parameter specified by the verb
+  combinator. ([#1469](https://github.com/haskell-servant/servant/pull/1469))
+- *servant-client* / *servant-client-core*: Fix `Show` instance for
+  `Servant.Client.Core.Request`.
+- *servant-client* /  *servant-client-core*: Allow passing arbitrary binary 
data
+  in Query parameters.
+  ([#1432](https://github.com/haskell-servant/servant/pull/1432)).
+
+### Other changes
+
+- Various version bumps.
+
 0.18.3
 ------
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/servant-client-core-0.18.3/servant-client-core.cabal 
new/servant-client-core-0.19/servant-client-core.cabal
--- old/servant-client-core-0.18.3/servant-client-core.cabal    2001-09-09 
03:46:40.000000000 +0200
+++ new/servant-client-core-0.19/servant-client-core.cabal      2001-09-09 
03:46:40.000000000 +0200
@@ -1,6 +1,6 @@
-cabal-version:       >=1.10
+cabal-version:       2.2
 name:                servant-client-core
-version:             0.18.3
+version:             0.19
 
 synopsis:            Core functionality and class for client function 
generation for servant APIs
 category:            Servant, Web
@@ -10,14 +10,14 @@
 
 homepage:            http://docs.servant.dev/
 bug-reports:         http://github.com/haskell-servant/servant/issues
-license:             BSD3
+license:             BSD-3-Clause
 license-file:        LICENSE
 author:              Servant Contributors
 maintainer:          [email protected]
 copyright:           2014-2016 Zalora South East Asia Pte Ltd, 2016-2019 
Servant Contributors
 build-type:          Simple
-tested-with: GHC ==8.0.2 || ==8.2.2 || ==8.4.4 || ==8.6.5 || ==8.8.4 || 
==8.10.2 || ==9.0.1
-           , GHCJS == 8.4
+tested-with: GHC ==8.6.5 || ==8.8.4 || ==8.10.2 || ==9.0.1
+           , GHCJS ==8.6.0.1
 
 extra-source-files:
   CHANGELOG.md
@@ -52,6 +52,7 @@
   build-depends:
       base                  >= 4.9      && < 4.16
     , bytestring            >= 0.10.8.1 && < 0.12
+    , constraints           >= 0.2      && < 0.14
     , containers            >= 0.5.7.1  && < 0.7
     , deepseq               >= 1.4.2.0  && < 1.5
     , text                  >= 1.2.3.0  && < 1.3
@@ -64,12 +65,12 @@
 
   -- Servant dependencies
   build-depends:
-      servant            >= 0.18.3 && <0.19
+      servant            >= 0.19
 
   -- Other dependencies: Lower bound around what is in the latest Stackage LTS.
   -- Here can be exceptions if we really need features from the newer versions.
   build-depends:
-      aeson                 >= 1.4.1.0  && < 1.6
+      aeson                 >= 1.4.1.0  && < 3
     , base-compat           >= 0.10.5   && < 0.12
     , base64-bytestring     >= 1.0.0.1  && < 1.3
     , exceptions            >= 0.10.0   && < 0.11
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/servant-client-core-0.18.3/src/Servant/Client/Core/BasicAuth.hs 
new/servant-client-core-0.19/src/Servant/Client/Core/BasicAuth.hs
--- old/servant-client-core-0.18.3/src/Servant/Client/Core/BasicAuth.hs 
2001-09-09 03:46:40.000000000 +0200
+++ new/servant-client-core-0.19/src/Servant/Client/Core/BasicAuth.hs   
2001-09-09 03:46:40.000000000 +0200
@@ -9,8 +9,6 @@
 
 import           Data.ByteString.Base64
                  (encode)
-import           Data.Monoid
-                 ((<>))
 import           Data.Text.Encoding
                  (decodeUtf8)
 import           Servant.API.BasicAuth
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/servant-client-core-0.18.3/src/Servant/Client/Core/HasClient.hs 
new/servant-client-core-0.19/src/Servant/Client/Core/HasClient.hs
--- old/servant-client-core-0.18.3/src/Servant/Client/Core/HasClient.hs 
2001-09-09 03:46:40.000000000 +0200
+++ new/servant-client-core-0.19/src/Servant/Client/Core/HasClient.hs   
2001-09-09 03:46:40.000000000 +0200
@@ -1,5 +1,4 @@
 {-# LANGUAGE ConstraintKinds       #-}
-{-# LANGUAGE CPP                   #-}
 {-# LANGUAGE DataKinds             #-}
 {-# LANGUAGE FlexibleContexts      #-}
 {-# LANGUAGE FlexibleInstances     #-}
@@ -7,6 +6,7 @@
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE OverloadedStrings     #-}
 {-# LANGUAGE PolyKinds             #-}
+{-# LANGUAGE QuantifiedConstraints #-}
 {-# LANGUAGE RankNTypes            #-}
 {-# LANGUAGE ScopedTypeVariables   #-}
 {-# LANGUAGE TypeApplications      #-}
@@ -14,14 +14,13 @@
 {-# LANGUAGE TypeOperators         #-}
 {-# LANGUAGE UndecidableInstances  #-}
 
-#if MIN_VERSION_base(4,9,0) && __GLASGOW_HASKELL__ >= 802
-#define HAS_TYPE_ERROR
-#endif
-
 module Servant.Client.Core.HasClient (
     clientIn,
     HasClient (..),
     EmptyClient (..),
+    AsClientT,
+    (//),
+    (/:),
     foldMapUnion,
     matchUnion,
     ) where
@@ -33,9 +32,13 @@
                  (left, (+++))
 import           Control.Monad
                  (unless)
+import qualified Data.ByteString as BS
+import           Data.ByteString.Builder
+                 (toLazyByteString)
 import qualified Data.ByteString.Lazy                     as BL
 import           Data.Either
                  (partitionEithers)
+import           Data.Constraint (Dict(..))
 import           Data.Foldable
                  (toList)
 import           Data.List
@@ -44,7 +47,8 @@
                  (fromList)
 import qualified Data.Text                       as T
 import           Network.HTTP.Media
-                 (MediaType, matches, parseAccept, (//))
+                 (MediaType, matches, parseAccept)
+import qualified Network.HTTP.Media as Media
 import qualified Data.Sequence as Seq
 import           Data.SOP.BasicFunctors
                  (I (I), (:.:) (Comp))
@@ -61,7 +65,7 @@
 import           Data.Proxy
                  (Proxy (Proxy))
 import           GHC.TypeLits
-                 (KnownSymbol, symbolVal)
+                 (KnownNat, KnownSymbol, TypeError, symbolVal)
 import           Network.HTTP.Types
                  (Status)
 import qualified Network.HTTP.Types                       as H
@@ -76,12 +80,18 @@
                  ReflectMethod (..), RemoteHost, ReqBody', SBoolI, Stream,
                  StreamBody', Summary, ToHttpApiData, ToSourceIO (..), Vault,
                  Verb, WithNamedContext, WithStatus (..), contentType, 
getHeadersHList,
-                 getResponse, toQueryParam, toUrlPiece)
+                 getResponse, toEncodedUrlPiece, toUrlPiece, NamedRoutes)
+import           Servant.API.Generic
+                 (GenericMode(..), ToServant, ToServantApi
+                 , GenericServant, toServant, fromServant)
 import           Servant.API.ContentTypes
                  (contentTypes, AllMime (allMime), AllMimeUnrender 
(allMimeUnrender))
+import           Servant.API.Status
+                 (statusFromNat)
 import           Servant.API.TypeLevel (FragmentUnique, AtLeastOneFragment)
 import           Servant.API.Modifiers
                  (FoldRequired, RequiredArgument, foldRequiredArgument)
+import           Servant.API.TypeErrors
 import           Servant.API.UVerb
                  (HasStatus, HasStatuses (Statuses, statuses), UVerb, Union, 
Unique, inject, statusOf, foldMapUnion, matchUnion)
 
@@ -243,10 +253,11 @@
 instance {-# OVERLAPPABLE #-}
   -- Note [Non-Empty Content Types]
   ( RunClient m, MimeUnrender ct a, ReflectMethod method, cts' ~ (ct ': cts)
+  , KnownNat status
   ) => HasClient m (Verb method status cts' a) where
   type Client m (Verb method status cts' a) = m a
   clientWithRoute _pm Proxy req = do
-    response <- runRequest req
+    response <- runRequestAcceptStatus (Just [status]) req
       { requestAccept = fromList $ toList accept
       , requestMethod = method
       }
@@ -254,18 +265,20 @@
     where
       accept = contentTypes (Proxy :: Proxy ct)
       method = reflectMethod (Proxy :: Proxy method)
+      status = statusFromNat (Proxy :: Proxy status)
 
   hoistClientMonad _ _ f ma = f ma
 
 instance {-# OVERLAPPING #-}
-  ( RunClient m, ReflectMethod method
+  ( RunClient m, ReflectMethod method, KnownNat status
   ) => HasClient m (Verb method status cts NoContent) where
   type Client m (Verb method status cts NoContent)
     = m NoContent
   clientWithRoute _pm Proxy req = do
-    _response <- runRequest req { requestMethod = method }
+    _response <- runRequestAcceptStatus (Just [status]) req { requestMethod = 
method }
     return NoContent
       where method = reflectMethod (Proxy :: Proxy method)
+            status = statusFromNat (Proxy :: Proxy status)
 
   hoistClientMonad _ _ f ma = f ma
 
@@ -282,13 +295,13 @@
 
 instance {-# OVERLAPPING #-}
   -- Note [Non-Empty Content Types]
-  ( RunClient m, MimeUnrender ct a, BuildHeadersTo ls
+  ( RunClient m, MimeUnrender ct a, BuildHeadersTo ls, KnownNat status
   , ReflectMethod method, cts' ~ (ct ': cts)
   ) => HasClient m (Verb method status cts' (Headers ls a)) where
   type Client m (Verb method status cts' (Headers ls a))
     = m (Headers ls a)
   clientWithRoute _pm Proxy req = do
-    response <- runRequest req
+    response <- runRequestAcceptStatus (Just [status]) req
        { requestMethod = method
        , requestAccept = fromList $ toList accept
        }
@@ -296,22 +309,26 @@
     return $ Headers { getResponse = val
                      , getHeadersHList = buildHeadersTo . toList $ 
responseHeaders response
                      }
-      where method = reflectMethod (Proxy :: Proxy method)
-            accept = contentTypes (Proxy :: Proxy ct)
+    where
+      method = reflectMethod (Proxy :: Proxy method)
+      accept = contentTypes (Proxy :: Proxy ct)
+      status = statusFromNat (Proxy :: Proxy status)
 
   hoistClientMonad _ _ f ma = f ma
 
 instance {-# OVERLAPPING #-}
-  ( RunClient m, BuildHeadersTo ls, ReflectMethod method
+  ( RunClient m, BuildHeadersTo ls, ReflectMethod method, KnownNat status
   ) => HasClient m (Verb method status cts (Headers ls NoContent)) where
   type Client m (Verb method status cts (Headers ls NoContent))
     = m (Headers ls NoContent)
   clientWithRoute _pm Proxy req = do
-    let method = reflectMethod (Proxy :: Proxy method)
-    response <- runRequest req { requestMethod = method }
+    response <- runRequestAcceptStatus (Just [status]) req { requestMethod = 
method }
     return $ Headers { getResponse = NoContent
                      , getHeadersHList = buildHeadersTo . toList $ 
responseHeaders response
                      }
+    where
+      method = reflectMethod (Proxy :: Proxy method)
+      status = statusFromNat (Proxy :: Proxy status)
 
   hoistClientMonad _ _ f ma = f ma
 
@@ -554,7 +571,7 @@
       (Proxy :: Proxy mods) add (maybe req add) mparam
     where
       add :: a -> Request
-      add param = appendToQueryString pname (Just $ toQueryParam param) req
+      add param = appendToQueryString pname (Just $ encodeQueryParam param) req
 
       pname :: Text
       pname  = pack $ symbolVal (Proxy :: Proxy sym)
@@ -562,6 +579,9 @@
   hoistClientMonad pm _ f cl = \arg ->
     hoistClientMonad pm (Proxy :: Proxy api) f (cl arg)
 
+encodeQueryParam :: ToHttpApiData a => a  -> BS.ByteString
+encodeQueryParam = BL.toStrict . toLazyByteString . toEncodedUrlPiece
+
 -- | If you use a 'QueryParams' in one of your endpoints in your API,
 -- the corresponding querying function will automatically take
 -- an additional argument, a list of values of the type specified
@@ -603,7 +623,7 @@
                     )
 
     where pname = pack $ symbolVal (Proxy :: Proxy sym)
-          paramlist' = map (Just . toQueryParam) paramlist
+          paramlist' = map (Just . encodeQueryParam) paramlist
 
   hoistClientMonad pm _ f cl = \as ->
     hoistClientMonad pm (Proxy :: Proxy api) f (cl as)
@@ -774,7 +794,7 @@
 
 -- | Ignore @'Fragment'@ in client functions.
 -- See <https://ietf.org/rfc/rfc2616.html#section-15.1.3> for more details.
--- 
+--
 -- Example:
 --
 -- > type MyApi = "books" :> Fragment Text :> Get '[JSON] [Book]
@@ -786,16 +806,12 @@
 -- > getBooks = client myApi
 -- > -- then you can just use "getBooksBy" to query that endpoint.
 -- > -- 'getBooks' for all books.
-#ifdef HAS_TYPE_ERROR
 instance (AtLeastOneFragment api, FragmentUnique (Fragment a :> api), 
HasClient m api
-#else
-instance ( HasClient m api
-#endif
          ) => HasClient m (Fragment a :> api) where
 
   type Client m (Fragment a :> api) = Client m api
 
-  clientWithRoute pm _ = clientWithRoute pm (Proxy :: Proxy api) 
+  clientWithRoute pm _ = clientWithRoute pm (Proxy :: Proxy api)
 
   hoistClientMonad pm _ = hoistClientMonad pm (Proxy :: Proxy api)
 
@@ -810,6 +826,119 @@
   hoistClientMonad pm _ f cl = \bauth ->
     hoistClientMonad pm (Proxy :: Proxy api) f (cl bauth)
 
+-- | A type that specifies that an API record contains a client implementation.
+data AsClientT (m :: * -> *)
+instance GenericMode (AsClientT m) where
+    type AsClientT m :- api = Client m api
+
+
+type GClientConstraints api m =
+  ( GenericServant api (AsClientT m)
+  , Client m (ToServantApi api) ~ ToServant api (AsClientT m)
+  )
+
+class GClient (api :: * -> *) m where
+  gClientProof :: Dict (GClientConstraints api m)
+
+instance GClientConstraints api m => GClient api m where
+  gClientProof = Dict
+
+instance
+  ( forall n. GClient api n
+  , HasClient m (ToServantApi api)
+  , RunClient m
+  )
+  => HasClient m (NamedRoutes api) where
+  type Client m (NamedRoutes api) = api (AsClientT m)
+
+  clientWithRoute :: Proxy m -> Proxy (NamedRoutes api) -> Request -> Client m 
(NamedRoutes api)
+  clientWithRoute pm _ request =
+    case gClientProof @api @m of
+      Dict -> fromServant $ clientWithRoute  pm (Proxy @(ToServantApi api)) 
request
+
+  hoistClientMonad
+    :: forall ma mb.
+       Proxy m
+    -> Proxy (NamedRoutes api)
+    -> (forall x. ma x -> mb x)
+    -> Client ma (NamedRoutes api)
+    -> Client mb (NamedRoutes api)
+  hoistClientMonad _ _ nat clientA =
+    case (gClientProof @api @ma, gClientProof @api @mb) of
+      (Dict, Dict) ->
+        fromServant @api @(AsClientT mb) $
+        hoistClientMonad @m @(ToServantApi api) @ma @mb Proxy Proxy nat $
+        toServant @api @(AsClientT ma) clientA
+
+infixl 1 //
+infixl 2 /:
+
+-- | Helper to make code using records of clients more readable.
+--
+-- Can be mixed with (/:) for supplying arguments.
+--
+-- Example:
+--
+-- @@
+-- type Api = NamedRoutes RootApi
+--
+-- data RootApi mode = RootApi
+--   { subApi :: mode :- NamedRoutes SubApi
+--   , ???
+--   } deriving Generic
+--
+-- data SubApi mode = SubApi
+--   { endpoint :: mode :- Get '[JSON] Person
+--   , ???
+--   } deriving Generic
+--
+-- api :: Proxy API
+-- api = Proxy
+--
+-- rootClient :: RootApi (AsClientT ClientM)
+-- rootClient = client api
+--
+-- endpointClient :: ClientM Person
+-- endpointClient = client // subApi // endpoint
+-- @@
+(//) :: a -> (a -> b) -> b
+x // f = f x
+
+-- | Convenience function for supplying arguments to client functions when
+-- working with records of clients.
+--
+-- Intended to be used in conjunction with '(//)'.
+--
+-- Example:
+--
+-- @@
+-- type Api = NamedRoutes RootApi
+--
+-- data RootApi mode = RootApi
+--   { subApi :: mode :- Capture "token" String :> NamedRoutes SubApi
+--   , hello :: mode :- Capture "name" String :> Get '[JSON] String
+--   , ???
+--   } deriving Generic
+--
+-- data SubApi mode = SubApi
+--   { endpoint :: mode :- Get '[JSON] Person
+--   , ???
+--   } deriving Generic
+--
+-- api :: Proxy API
+-- api = Proxy
+--
+-- rootClient :: RootApi (AsClientT ClientM)
+-- rootClient = client api
+--
+-- hello :: String -> ClientM String
+-- hello name = rootClient // hello /: name
+--
+-- endpointClient :: ClientM Person
+-- endpointClient = client // subApi /: "foobar123" // endpoint
+-- @@
+(/:) :: (a -> b -> c) -> b -> a -> c
+(/:) = flip
 
 
 {- Note [Non-Empty Content Types]
@@ -835,7 +964,7 @@
 checkContentTypeHeader :: RunClient m => Response -> m MediaType
 checkContentTypeHeader response =
   case lookup "Content-Type" $ toList $ responseHeaders response of
-    Nothing -> return $ "application"//"octet-stream"
+    Nothing -> return $ "application" Media.// "octet-stream"
     Just t -> case parseAccept t of
       Nothing -> throwClientError $ InvalidContentTypeHeader response
       Just t' -> return t'
@@ -851,3 +980,19 @@
     Right val -> return val
   where
     accept = toList $ contentTypes ct
+
+-------------------------------------------------------------------------------
+-- Custom type errors
+-------------------------------------------------------------------------------
+
+-- Erroring instance for HasClient' when a combinator is not fully applied
+instance (RunClient m, TypeError (PartialApplication HasClient arr)) => 
HasClient m ((arr :: a -> b) :> sub)
+  where
+    type Client m (arr :> sub) = TypeError (PartialApplication HasClient arr)
+    clientWithRoute _ _ _ = error "unreachable"
+    hoistClientMonad _ _ _ _ = error "unreachable"
+
+-- Erroring instances for 'HasClient' for unknown API combinators
+instance {-# OVERLAPPABLE #-} (RunClient m, TypeError (NoInstanceForSub 
(HasClient m) ty)) => HasClient m (ty :> sub)
+
+instance {-# OVERLAPPABLE #-} (RunClient m, TypeError (NoInstanceFor 
(HasClient m api))) => HasClient m api
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/servant-client-core-0.18.3/src/Servant/Client/Core/Reexport.hs 
new/servant-client-core-0.19/src/Servant/Client/Core/Reexport.hs
--- old/servant-client-core-0.18.3/src/Servant/Client/Core/Reexport.hs  
2001-09-09 03:46:40.000000000 +0200
+++ new/servant-client-core-0.19/src/Servant/Client/Core/Reexport.hs    
2001-09-09 03:46:40.000000000 +0200
@@ -7,6 +7,9 @@
     HasClient(..)
   , foldMapUnion
   , matchUnion
+  , AsClientT
+  , (//)
+  , (/:)
 
     -- * Response (for @Raw@)
   , Response
@@ -23,6 +26,7 @@
   , showBaseUrl
   , parseBaseUrl
   , InvalidBaseUrlException
+
   ) where
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/servant-client-core-0.18.3/src/Servant/Client/Core/Request.hs 
new/servant-client-core-0.19/src/Servant/Client/Core/Request.hs
--- old/servant-client-core-0.18.3/src/Servant/Client/Core/Request.hs   
2001-09-09 03:46:40.000000000 +0200
+++ new/servant-client-core-0.19/src/Servant/Client/Core/Request.hs     
2001-09-09 03:46:40.000000000 +0200
@@ -35,8 +35,6 @@
 import qualified Data.ByteString                      as BS
 import qualified Data.ByteString.Builder              as Builder
 import qualified Data.ByteString.Lazy                 as LBS
-import           Data.Semigroup
-                 ((<>))
 import qualified Data.Sequence                        as Seq
 import           Data.Text
                  (Text)
@@ -80,12 +78,13 @@
         . showString ", requestAccept = "
         . showsPrec 0 (requestAccept req)
         . showString ", requestHeaders = "
-        . showsPrec 0 (redactSensitiveHeader <$> requestHeaders req))
+        . showsPrec 0 (redactSensitiveHeader <$> requestHeaders req)
         . showString ", requestHttpVersion = "
         . showsPrec 0 (requestHttpVersion req)
         . showString ", requestMethod = "
         . showsPrec 0 (requestMethod req)
         . showString "}"
+        )
        where
         redactSensitiveHeader :: Header -> Header
         redactSensitiveHeader ("Authorization", _) = ("Authorization", 
"<REDACTED>")
@@ -147,13 +146,13 @@
 appendToPath p req
   = req { requestPath = requestPath req <> "/" <> toEncodedUrlPiece p }
 
-appendToQueryString :: Text       -- ^ param name
-                    -> Maybe Text -- ^ param value
+appendToQueryString :: Text             -- ^ param name
+                    -> Maybe BS.ByteString -- ^ param value
                     -> Request
                     -> Request
 appendToQueryString pname pvalue req
   = req { requestQueryString = requestQueryString req
-                        Seq.|> (encodeUtf8 pname, encodeUtf8 <$> pvalue)}
+                        Seq.|> (encodeUtf8 pname, pvalue)}
 
 addHeader :: ToHttpApiData a => HeaderName -> a -> Request -> Request
 addHeader name val req
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/servant-client-core-0.18.3/src/Servant/Client/Generic.hs 
new/servant-client-core-0.19/src/Servant/Client/Generic.hs
--- old/servant-client-core-0.18.3/src/Servant/Client/Generic.hs        
2001-09-09 03:46:40.000000000 +0200
+++ new/servant-client-core-0.19/src/Servant/Client/Generic.hs  2001-09-09 
03:46:40.000000000 +0200
@@ -1,9 +1,10 @@
-{-# LANGUAGE ConstraintKinds     #-}
-{-# LANGUAGE FlexibleContexts    #-}
-{-# LANGUAGE KindSignatures      #-}
-{-# LANGUAGE RankNTypes          #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE TypeFamilies        #-}
+{-# OPTIONS_GHC -fno-warn-orphans  #-}
+{-# LANGUAGE FlexibleContexts      #-}
+{-# LANGUAGE KindSignatures        #-}
+{-# LANGUAGE RankNTypes            #-}
+{-# LANGUAGE ScopedTypeVariables   #-}
+{-# LANGUAGE TypeFamilies          #-}
+
 module  Servant.Client.Generic (
     AsClientT,
     genericClient,
@@ -15,11 +16,7 @@
 
 import           Servant.API.Generic
 import           Servant.Client.Core
-
--- | A type that specifies that an API record contains a client implementation.
-data AsClientT (m :: * -> *)
-instance GenericMode (AsClientT m) where
-    type AsClientT m :- api = Client m api
+import           Servant.Client.Core.HasClient (AsClientT)
 
 -- | Generate a record of client functions.
 genericClient
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/servant-client-core-0.18.3/test/Servant/Client/Core/RequestSpec.hs 
new/servant-client-core-0.19/test/Servant/Client/Core/RequestSpec.hs
--- old/servant-client-core-0.18.3/test/Servant/Client/Core/RequestSpec.hs      
2001-09-09 03:46:40.000000000 +0200
+++ new/servant-client-core-0.19/test/Servant/Client/Core/RequestSpec.hs        
2001-09-09 03:46:40.000000000 +0200
@@ -10,10 +10,22 @@
 import           Servant.Client.Core.Request
 import           Test.Hspec
 
+newtype DataWithRequest = DataWithRequest (RequestF RequestBody ())
+  deriving Show
+
 spec :: Spec
 spec = do
   describe "Request" $ do
     describe "show" $ do
+      it "has parenthesis correctly positioned" $ do
+        let d = DataWithRequest (void defaultRequest)
+        show d `shouldBe` "DataWithRequest (Request {requestPath = ()\
+                                                  \, requestQueryString = 
fromList []\
+                                                  \, requestBody = Nothing\
+                                                  \, requestAccept = fromList 
[]\
+                                                  \, requestHeaders = fromList 
[]\
+                                                  \, requestHttpVersion = 
HTTP/1.1\
+                                                  \, requestMethod = \"GET\"})"
       it "redacts the authorization header" $ do
         let request = void $ defaultRequest { requestHeaders = pure 
("authorization", "secret") }
         isInfixOf "secret" (show request) `shouldBe` False

Reply via email to