packages feed

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 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 ()