cassava 0.4.4.0 → 0.4.5.0
raw patch · 10 files changed
+153/−67 lines, 10 filesdep −ghc-primdep ~basedep ~deepseqnew-uploaderPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies removed: ghc-prim
Dependency ranges changed: base, deepseq
API changes (from Hackage documentation)
- Data.Csv: decDelimiter :: DecodeOptions -> {-# UNPACK #-} !Word8
- Data.Csv: encDelimiter :: EncodeOptions -> {-# UNPACK #-} !Word8
- Data.Csv: encIncludeHeader :: EncodeOptions -> !Bool
- Data.Csv: encQuoting :: EncodeOptions -> !Quoting
- Data.Csv: encUseCrLf :: EncodeOptions -> !Bool
- Data.Csv: fromOnly :: Only a -> a
- Data.Csv.Incremental: instance Eq More
- Data.Csv.Incremental: instance Functor HeaderParser
- Data.Csv.Incremental: instance Functor Parser
- Data.Csv.Incremental: instance Monoid (Builder a)
- Data.Csv.Incremental: instance Monoid (NamedBuilder a)
- Data.Csv.Incremental: instance Show More
- Data.Csv.Incremental: instance Show a => Show (HeaderParser a)
- Data.Csv.Incremental: instance Show a => Show (Parser a)
- Data.Csv.Parser: decDelimiter :: DecodeOptions -> {-# UNPACK #-} !Word8
- Data.Csv.Parser: instance Eq DecodeOptions
- Data.Csv.Parser: instance Show DecodeOptions
- Data.Csv.Streaming: instance Eq a => Eq (Records a)
- Data.Csv.Streaming: instance Foldable Records
- Data.Csv.Streaming: instance Functor Records
- Data.Csv.Streaming: instance NFData a => NFData (Records a)
- Data.Csv.Streaming: instance Show a => Show (Records a)
- Data.Csv.Streaming: instance Traversable Records
+ Data.Csv: [decDelimiter] :: DecodeOptions -> {-# UNPACK #-} !Word8
+ Data.Csv: [encDelimiter] :: EncodeOptions -> {-# UNPACK #-} !Word8
+ Data.Csv: [encIncludeHeader] :: EncodeOptions -> !Bool
+ Data.Csv: [encQuoting] :: EncodeOptions -> !Quoting
+ Data.Csv: [encUseCrLf] :: EncodeOptions -> !Bool
+ Data.Csv: [fromOnly] :: Only a -> a
+ Data.Csv.Incremental: instance GHC.Base.Functor Data.Csv.Incremental.HeaderParser
+ Data.Csv.Incremental: instance GHC.Base.Functor Data.Csv.Incremental.Parser
+ Data.Csv.Incremental: instance GHC.Base.Monoid (Data.Csv.Incremental.Builder a)
+ Data.Csv.Incremental: instance GHC.Base.Monoid (Data.Csv.Incremental.NamedBuilder a)
+ Data.Csv.Incremental: instance GHC.Classes.Eq Data.Csv.Incremental.More
+ Data.Csv.Incremental: instance GHC.Show.Show Data.Csv.Incremental.More
+ Data.Csv.Incremental: instance GHC.Show.Show a => GHC.Show.Show (Data.Csv.Incremental.HeaderParser a)
+ Data.Csv.Incremental: instance GHC.Show.Show a => GHC.Show.Show (Data.Csv.Incremental.Parser a)
+ Data.Csv.Parser: [decDelimiter] :: DecodeOptions -> {-# UNPACK #-} !Word8
+ Data.Csv.Parser: instance GHC.Classes.Eq Data.Csv.Parser.DecodeOptions
+ Data.Csv.Parser: instance GHC.Show.Show Data.Csv.Parser.DecodeOptions
+ Data.Csv.Streaming: instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Data.Csv.Streaming.Records a)
+ Data.Csv.Streaming: instance Data.Foldable.Foldable Data.Csv.Streaming.Records
+ Data.Csv.Streaming: instance Data.Traversable.Traversable Data.Csv.Streaming.Records
+ Data.Csv.Streaming: instance GHC.Base.Functor Data.Csv.Streaming.Records
+ Data.Csv.Streaming: instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Csv.Streaming.Records a)
+ Data.Csv.Streaming: instance GHC.Show.Show a => GHC.Show.Show (Data.Csv.Streaming.Records a)
Files
- CHANGES.md +68/−0
- Data/Csv.hs +7/−7
- Data/Csv/Compat/Monoid.hs +0/−14
- Data/Csv/Conversion.hs +14/−5
- Data/Csv/Conversion/Internal.hs +1/−2
- Data/Csv/Encoding.hs +8/−12
- Data/Csv/Streaming.hs +1/−0
- benchmarks/Benchmarks.hs +2/−2
- cassava.cabal +35/−25
- tests/UnitTests.hs +17/−0
+ CHANGES.md view
@@ -0,0 +1,68 @@+## Version 0.4.5.0++ * Support for GHC 8.0 added; support for GHC 7.4 dropped++ * Fix defect in `Foldable(foldr)` implementation failing to skip+ unconvertable records (#102)++ * Documentation fixes++ * Maintainer changed++## Version 0.4.4.0++ * Added record instances for larger tuples.++ * Support attoparsec 0.13.++ * Add field instances for short bytestrings.++## Version 0.4.3.0++ * Documentation overhaul with more examples.++ * Add Data.Csv.Builder, a low-level bytestring builder API.++ * Add a high-level builder API to Data.Csv.Incremental.++ * Generalize the default FromNamedRecord/ToNamedRecord instances.++ * Improved support for deriving instances using GHC.Generics.++ * Added some control over quoting.++## Version 0.4.2.4++ * Support attoparsec 0.13.++## Version 0.4.2.3++ * Support GHC 7.10.++## Version 0.4.2.2++ * Support blaze-builder 0.4.++ * Make sure inlining doesn't prevent rules from firing.++ * Fix incorrect INLINE pragmas.++## Version 0.4.2.1++ * Support deepseq-1.4.++## Version 0.4.2.0++ * Minor performance improvements.++ * Add 8 and 9 tuple instances for From/ToRecord.++ * Support text-1.2.++## Version 0.4.1.0++ * Ignore whitespace when converting numeric fields.++ * Accept \r as a line terminator.++ * Support attoparsec-0.12.
Data/Csv.hs view
@@ -26,7 +26,7 @@ -- * Treating CSV data as opaque byte strings -- $generic-processing - -- * Custom type conversions+ -- * Custom type conversions for fields -- $customtypeconversions -- ** Dealing with bad data@@ -37,7 +37,6 @@ HasHeader(..) , decode , decodeByName- , Quoting(..) , encode , encodeByName , encodeDefaultOrderedByName@@ -50,6 +49,7 @@ , decodeWith , decodeByNameWith , EncodeOptions(..)+ , Quoting(..) , defaultEncodeOptions , encodeWith , encodeByNameWith@@ -130,7 +130,7 @@ -- To encode and decode your own data types you need to defined -- instances of either 'ToRecord' and 'FromRecord' or 'ToNamedRecord' -- and 'FromNamedRecord'. The former is used for encoding/decoding--- using the column index and the latter using column name.+-- using the column index and the latter using the column name. -- -- There are two ways to to define these instances, either by manually -- defining them or by using GHC generics to derive them automatically.@@ -170,7 +170,7 @@ -- Decoding: -- -- > >>> decode NoHeader "John,27\r\n" :: Either String (Vector Person)--- > Right (["name","salary"],[Person {name = "John", salary = 27}])+-- > Right [Person {name = "John", salary = 27}] -- -- $example-named-instance@@ -192,11 +192,11 @@ -- > -- > instance FromNamedRecord Person where -- > parseNamedRecord m = Person <$> m .: "name" <*> m .: "salary"--- > instance ToNamedRecord Person+-- > instance ToNamedRecord Person where -- > toNamedRecord (Person name salary) = namedRecord [ -- > "name" .= name, "salary" .= salary]--- > instance DefaultOrdered Person--- > where headerOrder = header ["name", "salary"]+-- > instance DefaultOrdered Person where+-- > headerOrder _ = header ["name", "salary"] -- -- We can now use e.g. 'encodeDefaultOrderedByName' (or 'encodeByName' -- with an explicit header order) and 'decodeByName' to encode and
− Data/Csv/Compat/Monoid.hs
@@ -1,14 +0,0 @@-{-# LANGUAGE CPP #-}-module Data.Csv.Compat.Monoid- ( (<>)- ) where--import Data.Monoid--#if !MIN_VERSION_base(4,5,0)-infixr 6 <>--- | An infix synonym for 'mappend'.-(<>) :: Monoid m => m -> m -> m-(<>) = mappend-{-# INLINE (<>) #-}-#endif
Data/Csv/Conversion.hs view
@@ -2,17 +2,19 @@ BangPatterns, CPP, DefaultSignatures,+ DataKinds,+ PolyKinds, FlexibleContexts, FlexibleInstances, KindSignatures, MultiParamTypeClasses,- OverlappingInstances, OverloadedStrings, Rank2Types, ScopedTypeVariables, TypeOperators, UndecidableInstances #-}+ module Data.Csv.Conversion ( -- * Type conversion@@ -1018,7 +1020,7 @@ -- lets you compose several field conversions together in such a way -- that if any of them fail, the whole record conversion fails. newtype Parser a = Parser {- unParser :: forall f r.+ unParser :: forall (f :: * -> *) (r :: *). Failure f r -> Success a f r -> f r@@ -1028,7 +1030,9 @@ m >>= g = Parser $ \kf ks -> let ks' a = unParser (g a) kf ks in unParser m kf ks' {-# INLINE (>>=) #-}- return a = Parser $ \_kf ks -> ks a+ (>>) = (*>)+ {-# INLINE (>>) #-}+ return = pure {-# INLINE return #-} fail msg = Parser $ \kf _ks -> kf msg {-# INLINE fail #-}@@ -1039,7 +1043,7 @@ {-# INLINE fmap #-} instance Applicative Parser where- pure = return+ pure a = Parser $ \_kf ks -> ks a {-# INLINE pure #-} (<*>) = apP {-# INLINE (<*>) #-}@@ -1067,7 +1071,7 @@ apP d e = do b <- d a <- e- return (b a)+ pure (b a) {-# INLINE apP #-} -- | Run a 'Parser', returning either @'Left' errMsg@ or @'Right'@@ -1200,7 +1204,12 @@ -- | Instance to ensure that you cannot derive DefaultOrdered for -- constructors without selectors.+#if MIN_VERSION_base(4,9,0)+instance DefaultOrdered (M1 S ('MetaSel 'Nothing srcpk srcstr decstr) a ())+ => GToNamedRecordHeader (M1 S ('MetaSel 'Nothing srcpk srcstr decstr) a)+#else instance DefaultOrdered (M1 S NoSelector a ()) => GToNamedRecordHeader (M1 S NoSelector a)+#endif where gtoNamedRecordHeader _ = error "You cannot derive DefaultOrdered for constructors without selectors."
Data/Csv/Conversion/Internal.hs view
@@ -10,9 +10,8 @@ import qualified Data.ByteString as B import Data.Char (ord) import Data.Int+import Data.Monoid import Data.Word--import Data.Csv.Compat.Monoid ((<>)) ------------------------------------------------------------------------ -- Integers
Data/Csv/Encoding.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE BangPatterns, CPP, OverloadedStrings, ScopedTypeVariables #-}+{-# LANGUAGE BangPatterns, OverloadedStrings, ScopedTypeVariables #-} -- Module: Data.Csv.Encoding -- Copyright: (c) 2011 MailRank, Inc.@@ -40,7 +40,7 @@ import Blaze.ByteString.Builder (Builder, fromByteString, fromWord8, toLazyByteString, toByteString) import Blaze.ByteString.Builder.Char8 (fromString)-import Control.Applicative ((<|>), optional)+import Control.Applicative as AP (Applicative(..), (<|>), optional) import Data.Attoparsec.ByteString.Char8 (endOfInput) import qualified Data.Attoparsec.ByteString.Lazy as AL import qualified Data.ByteString as B@@ -51,9 +51,9 @@ import Data.Vector (Vector) import qualified Data.Vector as V import Data.Word (Word8)+import Data.Monoid import Prelude hiding (unlines) -import Data.Csv.Compat.Monoid ((<>)) import qualified Data.Csv.Conversion as Conversion import Data.Csv.Conversion (FromNamedRecord, FromRecord, ToNamedRecord, ToRecord, parseNamedRecord, parseRecord, runParser,@@ -64,10 +64,6 @@ import qualified Data.Csv.Types as Types import Data.Csv.Util (blankLine, endOfLine) -#if !MIN_VERSION_base(4,8,0)-import Control.Applicative ((*>), pure)-import Data.Monoid (mconcat, mempty)-#endif -- TODO: 'encode' isn't as efficient as it could be. @@ -155,11 +151,11 @@ -> Either String (Header, Vector a) decodeByNameWith !opts = decodeWithP (csvWithHeader opts) --- | Should quoting be applied to fields, and at which level+-- | Should quoting be applied to fields, and at which level? data Quoting- = QuoteNone -- ^ No quotes- | QuoteMinimal -- ^ Quotes according to RFC 4180- | QuoteAll -- ^ Always quote+ = QuoteNone -- ^ No quotes.+ | QuoteMinimal -- ^ Quotes according to RFC 4180.+ | QuoteAll -- ^ Always quote. deriving (Eq, Show) -- | Options that controls how data is encoded. These options can be@@ -372,7 +368,7 @@ else case runParser (parseRecord r) of Left msg -> fail $ "conversion error: " ++ msg Right val -> do- !vals <- (endOfLine *> records) <|> pure []+ !vals <- (endOfLine *> records) <|> AP.pure [] return (val : vals) {-# INLINE csv #-}
Data/Csv/Streaming.hs view
@@ -106,6 +106,7 @@ foldrRecords f = go where go z (Cons (Right x) rs) = f x (go z rs)+ go z (Cons (Left _) rs) = go z rs go z _ = z {-# INLINE foldrRecords #-}
benchmarks/Benchmarks.hs view
@@ -4,7 +4,7 @@ module Main ( main ) where -import Control.Applicative+import Control.Applicative as AP import Control.Exception (evaluate) import Control.DeepSeq import Criterion.Main@@ -42,7 +42,7 @@ instance FromRecord President where parseRecord v | V.length v == 7 = President <$>- v .!! 0 <*>+ v .!! 0 AP.<*> v .!! 1 <*> v .!! 2 <*> v .!! 3 <*>
cassava.cabal view
@@ -1,25 +1,44 @@ Name: cassava-Version: 0.4.4.0+Version: 0.4.5.0 Synopsis: A CSV parsing and encoding library Description: A CSV parsing and encoding library optimized for ease of use and high performance.-Homepage: https://github.com/tibbe/cassava+Homepage: https://github.com/hvr/cassava License: BSD3 License-file: LICENSE-Bug-reports: https://github.com/tibbe/cassava/issues+Bug-reports: https://github.com/hvr/cassava/issues Copyright: (c) 2012 Johan Tibell (c) 2012 Bryan O'Sullivan (c) 2011 MailRank, Inc. Author: Johan Tibell-Maintainer: johan.tibell@gmail.com+Maintainer: hvr@gnu.org Category: Text, Web, CSV Build-type: Simple-Cabal-version: >=1.8-Extra-source-files: examples/*.hs-Tested-with: GHC == 7.10.2, GHC == 7.8.4, GHC == 7.6.3+Cabal-version: >=1.10+Extra-source-files: examples/*.hs,+ CHANGES.md+Tested-with: GHC ==8.0.1, GHC ==7.10.3, GHC ==7.8.4, GHC ==7.6.3 Library+ default-language: Haskell2010+ other-extensions:+ BangPatterns+ CPP+ DataKinds+ DefaultSignatures+ DeriveFunctor+ FlexibleContexts+ FlexibleInstances+ KindSignatures+ MultiParamTypeClasses+ OverloadedStrings+ PolyKinds+ Rank2Types+ ScopedTypeVariables+ TypeOperators+ UndecidableInstances+ Exposed-modules: Data.Csv Data.Csv.Builder@@ -28,7 +47,6 @@ Data.Csv.Streaming Other-modules:- Data.Csv.Compat.Monoid Data.Csv.Conversion Data.Csv.Conversion.Internal Data.Csv.Encoding@@ -38,11 +56,11 @@ Build-depends: array < 0.6, attoparsec >= 0.10.2 && < 0.14,- base >= 4.5 && < 5,+ base >= 4.6 && < 5, blaze-builder < 0.5, bytestring < 0.11, containers < 0.6,- deepseq < 1.5,+ deepseq >= 1.1 && < 1.5, hashable < 1.3, text < 1.3, unordered-containers < 0.3,@@ -50,16 +68,14 @@ ghc-options: -Wall -O2 - -- GHC.Generics lived in `ghc-prim` for GHC 7.2 & GHC 7.4 only- if impl(ghc < 7.6)- build-depends: ghc-prim == 0.2.*- Test-suite unit-tests+ default-language: Haskell2010+ Type: exitcode-stdio-1.0 Main-is: UnitTests.hs Build-depends: attoparsec,- base >= 4.5,+ base >= 4.6, bytestring, cassava, hashable < 1.3,@@ -76,12 +92,13 @@ ghc-options: -Wall Benchmark benchmarks+ default-language: Haskell2010+ Type: exitcode-stdio-1.0 Main-is: Benchmarks.hs Other-modules: Data.Csv- Data.Csv.Compat.Monoid Data.Csv.Conversion Data.Csv.Conversion.Internal Data.Csv.Encoding@@ -94,7 +111,7 @@ Build-depends: array < 0.6, attoparsec >= 0.10.2 && < 0.14,- base >= 4.5 && < 5,+ base >= 4.6 && < 5, blaze-builder < 0.5, bytestring < 0.11, containers < 0.6,@@ -109,17 +126,10 @@ ghc-options: -Wall -O2 - if impl(ghc >= 7.2.1)- cpp-options: -DGENERICS-- -- GHC.Generics lived in `ghc-prim` for GHC 7.2 & GHC 7.4 only- if impl(ghc < 7.6)- build-depends: ghc-prim == 0.2.*- -- We cannot depend on the library directly as that creates a -- dependency cycle. hs-source-dirs: . benchmarks source-repository head type: git- location: https://github.com/tibbe/cassava.git+ location: https://github.com/hvr/cassava.git
tests/UnitTests.hs view
@@ -13,6 +13,7 @@ import qualified Data.Text as T import qualified Data.Text.Lazy as LT import qualified Data.Vector as V+import qualified Data.Foldable as F import Data.Word import Test.HUnit import Test.Framework as TF@@ -362,6 +363,21 @@ ] ------------------------------------------------------------------------+-- Instance tests++instanceTests :: [TF.Test]+instanceTests =+ [+ testGroup "Records instances"+ [ testCase "foldr Foldable" (expected @=? F.foldr (:) [] input)+ ]+ ]+ where+ input = S.Cons (Left "empty") (+ S.Cons (Right ("a" :: String)) (S.Nil Nothing BL8.empty))+ expected = ["a" :: String]++------------------------------------------------------------------------ -- Test harness allTests :: [TF.Test]@@ -369,6 +385,7 @@ , testGroup "named" nameBasedTests , testGroup "conversion" conversionTests , testGroup "custom-options" customOptionsTests+ , testGroup "instances" instanceTests ] main :: IO ()