Hello community, here is the log from the commit of package ghc-servant-cassava for openSUSE:Factory checked in at 2017-08-31 20:59:11 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/ghc-servant-cassava (Old) and /work/SRC/openSUSE:Factory/.ghc-servant-cassava.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Package is "ghc-servant-cassava" Thu Aug 31 20:59:11 2017 rev:2 rq:513484 version:0.9 Changes: -------- --- /work/SRC/openSUSE:Factory/ghc-servant-cassava/ghc-servant-cassava.changes 2017-05-16 14:41:23.306884692 +0200 +++ /work/SRC/openSUSE:Factory/.ghc-servant-cassava.new/ghc-servant-cassava.changes 2017-08-31 20:59:12.960212391 +0200 @@ -1,0 +2,5 @@ +Thu Jul 27 14:07:36 UTC 2017 - psimons@suse.com + +- Update to version 0.9 revision 1. + +------------------------------------------------------------------- Old: ---- servant-cassava-0.8.tar.gz New: ---- servant-cassava-0.9.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ ghc-servant-cassava.spec ++++++ --- /var/tmp/diff_new_pack.50XUrI/_old 2017-08-31 20:59:14.328020211 +0200 +++ /var/tmp/diff_new_pack.50XUrI/_new 2017-08-31 20:59:14.332019649 +0200 @@ -18,15 +18,17 @@ %global pkg_name servant-cassava Name: ghc-%{pkg_name} -Version: 0.8 +Version: 0.9 Release: 0 Summary: Servant CSV content-type for cassava License: BSD-3-Clause Group: Development/Languages/Other Url: https://hackage.haskell.org/package/%{pkg_name} Source0: https://hackage.haskell.org/package/%{pkg_name}-%{version}/%{pkg_name}-%{version}.tar.gz -Source1: https://hackage.haskell.org/package/%{pkg_name}-%{version}/revision/2.cabal#/%{pkg_name}.cabal +Source1: https://hackage.haskell.org/package/%{pkg_name}-%{version}/revision/1.cabal#/%{pkg_name}.cabal BuildRequires: ghc-Cabal-devel +BuildRequires: ghc-base-compat-devel +BuildRequires: ghc-bytestring-devel BuildRequires: ghc-cassava-devel BuildRequires: ghc-http-media-devel BuildRequires: ghc-rpm-macros ++++++ servant-cassava-0.8.tar.gz -> servant-cassava-0.9.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/servant-cassava-0.8/include/overlapping-compat.h new/servant-cassava-0.9/include/overlapping-compat.h --- old/servant-cassava-0.8/include/overlapping-compat.h 2016-09-07 23:45:10.000000000 +0200 +++ new/servant-cassava-0.9/include/overlapping-compat.h 1970-01-01 01:00:00.000000000 +0100 @@ -1,8 +0,0 @@ -#if __GLASGOW_HASKELL__ >= 710 -#define OVERLAPPABLE_ {-# OVERLAPPABLE #-} -#define OVERLAPPING_ {-# OVERLAPPING #-} -#else -{-# LANGUAGE OverlappingInstances #-} -#define OVERLAPPABLE_ -#define OVERLAPPING_ -#endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/servant-cassava-0.8/servant-cassava.cabal new/servant-cassava-0.9/servant-cassava.cabal --- old/servant-cassava-0.8/servant-cassava.cabal 2016-09-08 00:29:32.000000000 +0200 +++ new/servant-cassava-0.9/servant-cassava.cabal 2017-05-24 10:32:07.000000000 +0200 @@ -1,10 +1,7 @@ --- Initial servant-cassava.cabal generated by cabal init. For further --- documentation, see http://haskell.org/cabal/users-guide/ - name: servant-cassava -version: 0.8 +version: 0.9 synopsis: Servant CSV content-type for cassava --- description: +description: Servant CSV content-type for cassava. homepage: http://haskell-servant.readthedocs.org/ license: BSD3 license-file: LICENSE @@ -13,7 +10,6 @@ copyright: 2015-2016 Servant Contributors category: Web build-type: Simple -extra-source-files: include/*.h cabal-version: >=1.10 bug-reports: http://github.com/haskell-servant/servant-cassava/issues @@ -23,14 +19,13 @@ library exposed-modules: Servant.CSV.Cassava - -- other-modules: - -- other-extensions: build-depends: base >=4.6 && <5 + , base-compat >=0.9.1 && <0.10 + , bytestring , cassava >0.4 && <0.5 - , servant >=0.7 && <0.9 + , servant >=0.7 && <0.12 , http-media , vector hs-source-dirs: src default-language: Haskell2010 - include-dirs: include ghc-options: -Wall diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/servant-cassava-0.8/src/Servant/CSV/Cassava.hs new/servant-cassava-0.9/src/Servant/CSV/Cassava.hs --- old/servant-cassava-0.8/src/Servant/CSV/Cassava.hs 2016-09-08 00:29:32.000000000 +0200 +++ new/servant-cassava-0.9/src/Servant/CSV/Cassava.hs 2017-05-24 10:32:07.000000000 +0200 @@ -1,7 +1,9 @@ -{-# LANGUAGE CPP #-} +{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE KindSignatures #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE ScopedTypeVariables #-} @@ -9,34 +11,56 @@ -- | A @CSV@ empty datatype with `MimeRender` and `MimeUnrender` instances for -- @cassava@'s encoding and decoding classes. -- --- >>> type Eg = Get '[(CSV', MyEncodeOptions)] [(Int, String)] +-- >>> type Eg = Get '[CSV' 'HasHeader MyEncodeOptions] [(Int, String)] -- -- Default encoding and decoding options are also provided, along with the -- @CSV@ type synonym that uses them. -- -- >>> type EgDefault = Get '[CSV] [(Int, String)] -module Servant.CSV.Cassava where - -#if !MIN_VERSION_base(4,8,0) -import Control.Applicative ((<$>)) -#endif -import Data.Csv -import Data.Proxy (Proxy (..)) -import Data.Typeable (Typeable) -import Data.Vector (Vector, toList) -import GHC.Generics (Generic) -import qualified Network.HTTP.Media as M -import Servant.API (Accept (..), MimeRender (..), - MimeUnrender (..)) +-- +module Servant.CSV.Cassava ( module Servant.CSV.Cassava + , HasHeader(..) + ) where -data CSV' deriving (Typeable, Generic) +import Prelude () +import Prelude.Compat -type CSV = (CSV', DefaultOpts) +import Data.Csv +import Data.ByteString.Lazy (ByteString) +import Data.Proxy (Proxy (..)) +import Data.Typeable (Typeable) +import Data.Vector (Vector, toList) +import GHC.Generics (Generic) +import qualified Network.HTTP.Media as M +import Servant.API (Accept (..), MimeRender (..), + MimeUnrender (..)) + +data CSV' (hasHeader :: HasHeader) opt deriving (Typeable) +type CSV = CSV' 'HasHeader DefaultOpts + +-- | 'HasHeader singleton. +data SHasHeader (hasHeader :: HasHeader) where + SHasHeader :: SHasHeader 'HasHeader + SNoHeader :: SHasHeader 'NoHeader + +-- | Class to provide 'SHasHeader' implicitly. +class SHasHeaderI (hasHeader :: HasHeader) where shasheader :: SHasHeader hasHeader +instance SHasHeaderI 'HasHeader where shasheader = SHasHeader +instance SHasHeaderI 'NoHeader where shasheader = SNoHeader + +shasheaderToBool :: SHasHeader hasHeader -> Bool +shasheaderToBool SHasHeader = True +shasheaderToBool SNoHeader = False + +lowerSHasHeader :: SHasHeader hasHeader -> HasHeader +lowerSHasHeader SHasHeader = HasHeader +lowerSHasHeader SNoHeader = NoHeader +-- | Default options, instances providing 'defaultDecodeOptions' and 'defaultEncodeOptions'. data DefaultOpts deriving (Typeable, Generic) -- | @text/csv;charset=utf-8@ -instance Accept (CSV', a) where +instance Accept (CSV' hasHeader opt) where contentType _ = "text" M.// "csv" M./: ("charset", "utf-8") -- * Encoding @@ -45,35 +69,62 @@ -- | Encode with 'encodeByNameWith'. The 'Header' param is used for determining -- the order of headers and fields. -instance ( ToNamedRecord a, EncodeOpts opt - ) => MimeRender (CSV', opt) (Header, [a]) where - mimeRender _ (hdr, vals) = encodeByNameWith (encodeOpts p) hdr vals - where p = Proxy :: Proxy opt +instance ( ToNamedRecord a, EncodeOpts opt, SHasHeaderI hasHeader + ) => MimeRender (CSV' hasHeader opt) (Header, [a]) where + mimeRender _ (hdr, vals) = encodeByNameWith opts hdr vals + where + opts = encodeOpts' (Proxy :: Proxy opt) (Proxy :: Proxy hasHeader) --- | Encode with 'encodeDefaultOrderedByNameWith' -instance ( DefaultOrdered a, ToNamedRecord a, EncodeOpts opt - ) => MimeRender (CSV', opt) [a] where - mimeRender _ = encodeDefaultOrderedByNameWith (encodeOpts p) - where p = Proxy :: Proxy opt +-- | A class to determine how to encode a list of elements +-- +-- * 'HasHeader' encode with 'encodeDefaultOrderedByNameWith' +-- +-- * 'NoHeader' encode with 'encodeWith' +-- +-- Currently, it's not possible to encode without headers using 'encodeDefaultOrderedByNameWith'. +-- +class EncodeList (hasHeader :: HasHeader) a where + encodeList :: Proxy hasHeader -> EncodeOptions -> [a] -> ByteString + +-- | 'encodeDefaultOrderedByNameWith' +instance (DefaultOrdered a, ToNamedRecord a) => EncodeList 'HasHeader a where + encodeList _ opts vals = encodeDefaultOrderedByNameWith opts { encIncludeHeader = True } vals + +-- | 'encodeWith' +instance (ToRecord a) => EncodeList 'NoHeader a where + encodeList _ opts vals = encodeWith opts { encIncludeHeader = False } vals + +instance ( EncodeOpts opt, EncodeList hasHeader a + ) => MimeRender (CSV' hasHeader opt) [a] where + mimeRender _ = encodeList (Proxy :: Proxy hasHeader) opts + where + opts = encodeOpts (Proxy :: Proxy opt) -- | Encode with 'encodeByNameWith'. The 'Header' param is used for determining -- the order of headers and fields. -instance ( ToNamedRecord a, EncodeOpts opt - ) => MimeRender (CSV', opt) (Header, Vector a) where - mimeRender _ (hdr, vals) = encodeByNameWith (encodeOpts p) hdr (toList vals) - where p = Proxy :: Proxy opt - --- | Encode with 'encodeDefaultOrderedByNameWith' -instance ( DefaultOrdered a, ToNamedRecord a, EncodeOpts opt - ) => MimeRender (CSV', opt) (Vector a) where - mimeRender _ = encodeDefaultOrderedByNameWith (encodeOpts p) . toList - where p = Proxy :: Proxy opt +instance ( ToNamedRecord a, EncodeOpts opt, SHasHeaderI hasHeader + ) => MimeRender (CSV' hasHeader opt) (Header, Vector a) where + mimeRender _ (hdr, vals) = encodeByNameWith opts hdr (toList vals) + where + opts = encodeOpts' (Proxy :: Proxy opt) (Proxy :: Proxy hasHeader) + +instance ( EncodeOpts opt, EncodeList hasHeader a + ) => MimeRender (CSV' hasHeader opt) (Vector a) where + mimeRender _ = encodeList (Proxy :: Proxy hasHeader) opts . toList + where + opts = encodeOpts (Proxy :: Proxy opt) -- ** Encode Options -class EncodeOpts a where - encodeOpts :: Proxy a -> EncodeOptions +class EncodeOpts opt where + encodeOpts :: Proxy opt -> EncodeOptions +encodeOpts' + :: forall opt hasHeader. (EncodeOpts opt, SHasHeaderI hasHeader) + => Proxy opt -> Proxy hasHeader -> EncodeOptions +encodeOpts' p _ = (encodeOpts p) + { encIncludeHeader = shasheaderToBool (shasheader :: SHasHeader hasHeader) + } instance EncodeOpts DefaultOpts where encodeOpts _ = defaultEncodeOptions @@ -82,28 +133,33 @@ -- ** Instances --- | Decode with 'decodeByNameWith' +-- | Decode with 'decodeByNameWith'. instance ( FromNamedRecord a, DecodeOpts opt - ) => MimeUnrender (CSV', opt) (Header, [a]) where + ) => MimeUnrender (CSV' 'HasHeader opt) (Header, [a]) where mimeUnrender _ bs = fmap toList <$> decodeByNameWith (decodeOpts p) bs where p = Proxy :: Proxy opt --- | Decode with 'decodeWith'. Assumes data has headers, which are stripped. -instance ( FromRecord a, DecodeOpts opt - ) => MimeUnrender (CSV', opt) [a] where - mimeUnrender _ bs = toList <$> decodeWith (decodeOpts p) HasHeader bs - where p = Proxy :: Proxy opt +-- | Decode with 'decodeWith'. +instance ( FromRecord a, DecodeOpts opt, SHasHeaderI hasHeader + ) => MimeUnrender (CSV' hasHeader opt) [a] where + mimeUnrender _ = fmap toList . decodeWith (decodeOpts p) (lowerSHasHeader sh) + where + p = Proxy :: Proxy opt + sh = shasheader :: SHasHeader hasHeader instance ( FromNamedRecord a, DecodeOpts opt - ) => MimeUnrender (CSV', opt) (Header, Vector a) where + ) => MimeUnrender (CSV' 'HasHeader opt) (Header, Vector a) where mimeUnrender _ = decodeByNameWith (decodeOpts p) where p = Proxy :: Proxy opt --- | Decode with 'decodeWith'. Assumes data has headers, which are stripped. -instance ( FromRecord a, DecodeOpts opt - ) => MimeUnrender (CSV', opt) (Vector a) where - mimeUnrender _ = decodeWith (decodeOpts p) HasHeader - where p = Proxy :: Proxy opt +-- | Decode with 'decodeWith'. +instance ( FromRecord a, DecodeOpts opt, SHasHeaderI hasHeader + ) => MimeUnrender (CSV' hasHeader opt) (Vector a) where + mimeUnrender _ = decodeWith (decodeOpts p) (lowerSHasHeader sh) + where + p = Proxy :: Proxy opt + sh = shasheader :: SHasHeader hasHeader + -- ** Decode Options ++++++ servant-cassava.cabal ++++++ --- /var/tmp/diff_new_pack.50XUrI/_old 2017-08-31 20:59:14.775957274 +0200 +++ /var/tmp/diff_new_pack.50XUrI/_new 2017-08-31 20:59:14.775957274 +0200 @@ -1,22 +1,23 @@ --- Initial servant-cassava.cabal generated by cabal init. For further --- documentation, see http://haskell.org/cabal/users-guide/ - name: servant-cassava -version: 0.8 -x-revision: 2 +version: 0.9 +x-revision: 1 synopsis: Servant CSV content-type for cassava --- description: +description: Servant CSV content-type for cassava. homepage: http://haskell-servant.readthedocs.org/ license: BSD3 license-file: LICENSE author: Servant Contributors maintainer: haskell-servant-maintainers@googlegroups.com copyright: 2015-2016 Servant Contributors -category: Web +category: Web, Servant, CSV build-type: Simple -extra-source-files: include/*.h cabal-version: >=1.10 bug-reports: http://github.com/haskell-servant/servant-cassava/issues +tested-with: + GHC==7.8.4, + GHC==7.10.3, + GHC==8.0.2, + GHC==8.2.1 source-repository head type: git @@ -24,14 +25,13 @@ library exposed-modules: Servant.CSV.Cassava - -- other-modules: - -- other-extensions: build-depends: base >=4.6 && <5 - , cassava >0.4 && <0.5 - , servant >=0.7 && <0.11 + , base-compat >=0.9.1 && <0.10 + , bytestring + , cassava >0.4 && <0.6 + , servant >=0.7 && <0.12 , http-media , vector hs-source-dirs: src default-language: Haskell2010 - include-dirs: include ghc-options: -Wall