packages feed

aeson-extra 0.4.1.3 → 0.5

raw patch · 13 files changed

+97/−493 lines, 13 filesdep −aeson-compatdep −timedep ~aesondep ~attoparsecdep ~basePVP ok

version bump matches the API change (PVP)

Dependencies removed: aeson-compat, time

Dependency ranges changed: aeson, attoparsec, base, base-compat-batteries, bytestring, semialign, tasty, template-haskell

API changes (from Hackage documentation)

- Data.Aeson.Extra: M :: a -> M a
- Data.Aeson.Extra: U :: UTCTime -> U
- Data.Aeson.Extra: Z :: ZonedTime -> Z
- Data.Aeson.Extra: [getMap] :: M a -> a
- Data.Aeson.Extra: [getU] :: U -> UTCTime
- Data.Aeson.Extra: [getZ] :: Z -> ZonedTime
- Data.Aeson.Extra: class FromJSONKey a
- Data.Aeson.Extra: class FromJSONMap m k v | m -> k v
- Data.Aeson.Extra: class ToJSONKey a
- Data.Aeson.Extra: class ToJSONMap m k v | m -> k v
- Data.Aeson.Extra: newtype M a
- Data.Aeson.Extra: newtype U
- Data.Aeson.Extra: newtype Z
- Data.Aeson.Extra: parseIntegralJSONKey :: Integral a => Text -> Parser a
- Data.Aeson.Extra: parseJSONKey :: FromJSONKey a => Text -> Parser a
- Data.Aeson.Extra: parseJSONMap :: FromJSONMap m k v => HashMap Text Value -> Parser m
- Data.Aeson.Extra: toJSONKey :: ToJSONKey a => a -> Text
- Data.Aeson.Extra: toJSONMap :: ToJSONMap m k v => m -> HashMap Text Value
- Data.Aeson.Extra.Map: M :: a -> M a
- Data.Aeson.Extra.Map: [getMap] :: M a -> a
- Data.Aeson.Extra.Map: class FromJSONKey a
- Data.Aeson.Extra.Map: class FromJSONMap m k v | m -> k v
- Data.Aeson.Extra.Map: class ToJSONKey a
- Data.Aeson.Extra.Map: class ToJSONMap m k v | m -> k v
- Data.Aeson.Extra.Map: instance (Data.Aeson.Extra.Map.ToJSONKey k, Data.Aeson.Types.ToJSON.ToJSON v) => Data.Aeson.Extra.Map.ToJSONMap (Data.HashMap.Base.HashMap k v) k v
- Data.Aeson.Extra.Map: instance (Data.Aeson.Extra.Map.ToJSONKey k, Data.Aeson.Types.ToJSON.ToJSON v) => Data.Aeson.Extra.Map.ToJSONMap (Data.Map.Internal.Map k v) k v
- Data.Aeson.Extra.Map: instance (GHC.Classes.Eq k, Data.Hashable.Class.Hashable k, Data.Aeson.Extra.Map.FromJSONKey k, Data.Aeson.Types.FromJSON.FromJSON v) => Data.Aeson.Extra.Map.FromJSONMap (Data.HashMap.Base.HashMap k v) k v
- Data.Aeson.Extra.Map: instance (GHC.Classes.Ord k, Data.Aeson.Extra.Map.FromJSONKey k, Data.Aeson.Types.FromJSON.FromJSON v) => Data.Aeson.Extra.Map.FromJSONMap (Data.Map.Internal.Map k v) k v
- Data.Aeson.Extra.Map: instance Data.Aeson.Extra.Map.FromJSONKey Data.Text.Internal.Lazy.Text
- Data.Aeson.Extra.Map: instance Data.Aeson.Extra.Map.FromJSONKey Data.Text.Internal.Text
- Data.Aeson.Extra.Map: instance Data.Aeson.Extra.Map.FromJSONKey GHC.Base.String
- Data.Aeson.Extra.Map: instance Data.Aeson.Extra.Map.FromJSONKey GHC.Integer.Type.Integer
- Data.Aeson.Extra.Map: instance Data.Aeson.Extra.Map.FromJSONKey GHC.Types.Int
- Data.Aeson.Extra.Map: instance Data.Aeson.Extra.Map.FromJSONMap m k v => Data.Aeson.Types.FromJSON.FromJSON (Data.Aeson.Extra.Map.M m)
- Data.Aeson.Extra.Map: instance Data.Aeson.Extra.Map.ToJSONKey Data.Text.Internal.Lazy.Text
- Data.Aeson.Extra.Map: instance Data.Aeson.Extra.Map.ToJSONKey Data.Text.Internal.Text
- Data.Aeson.Extra.Map: instance Data.Aeson.Extra.Map.ToJSONKey GHC.Base.String
- Data.Aeson.Extra.Map: instance Data.Aeson.Extra.Map.ToJSONKey GHC.Integer.Type.Integer
- Data.Aeson.Extra.Map: instance Data.Aeson.Extra.Map.ToJSONKey GHC.Types.Int
- Data.Aeson.Extra.Map: instance Data.Aeson.Extra.Map.ToJSONMap m k v => Data.Aeson.Types.ToJSON.ToJSON (Data.Aeson.Extra.Map.M m)
- Data.Aeson.Extra.Map: instance Data.Foldable.Foldable Data.Aeson.Extra.Map.M
- Data.Aeson.Extra.Map: instance Data.Traversable.Traversable Data.Aeson.Extra.Map.M
- Data.Aeson.Extra.Map: instance GHC.Base.Functor Data.Aeson.Extra.Map.M
- Data.Aeson.Extra.Map: instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Aeson.Extra.Map.M a)
- Data.Aeson.Extra.Map: instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Aeson.Extra.Map.M a)
- Data.Aeson.Extra.Map: instance GHC.Read.Read a => GHC.Read.Read (Data.Aeson.Extra.Map.M a)
- Data.Aeson.Extra.Map: instance GHC.Show.Show a => GHC.Show.Show (Data.Aeson.Extra.Map.M a)
- Data.Aeson.Extra.Map: newtype M a
- Data.Aeson.Extra.Map: parseIntegralJSONKey :: Integral a => Text -> Parser a
- Data.Aeson.Extra.Map: parseJSONKey :: FromJSONKey a => Text -> Parser a
- Data.Aeson.Extra.Map: parseJSONMap :: FromJSONMap m k v => HashMap Text Value -> Parser m
- Data.Aeson.Extra.Map: toJSONKey :: ToJSONKey a => a -> Text
- Data.Aeson.Extra.Map: toJSONMap :: ToJSONMap m k v => m -> HashMap Text Value
- Data.Aeson.Extra.Time: U :: UTCTime -> U
- Data.Aeson.Extra.Time: Z :: ZonedTime -> Z
- Data.Aeson.Extra.Time: [getU] :: U -> UTCTime
- Data.Aeson.Extra.Time: [getZ] :: Z -> ZonedTime
- Data.Aeson.Extra.Time: instance Data.Aeson.Types.FromJSON.FromJSON Data.Aeson.Extra.Time.U
- Data.Aeson.Extra.Time: instance Data.Aeson.Types.FromJSON.FromJSON Data.Aeson.Extra.Time.Z
- Data.Aeson.Extra.Time: instance Data.Aeson.Types.ToJSON.ToJSON Data.Aeson.Extra.Time.U
- Data.Aeson.Extra.Time: instance Data.Aeson.Types.ToJSON.ToJSON Data.Aeson.Extra.Time.Z
- Data.Aeson.Extra.Time: instance GHC.Classes.Eq Data.Aeson.Extra.Time.U
- Data.Aeson.Extra.Time: instance GHC.Classes.Ord Data.Aeson.Extra.Time.U
- Data.Aeson.Extra.Time: instance GHC.Read.Read Data.Aeson.Extra.Time.U
- Data.Aeson.Extra.Time: instance GHC.Read.Read Data.Aeson.Extra.Time.Z
- Data.Aeson.Extra.Time: instance GHC.Show.Show Data.Aeson.Extra.Time.U
- Data.Aeson.Extra.Time: instance GHC.Show.Show Data.Aeson.Extra.Time.Z
- Data.Aeson.Extra.Time: newtype U
- Data.Aeson.Extra.Time: newtype Z
- Data.Aeson.Extra: SingObject :: a -> SingObject a
+ Data.Aeson.Extra: SingObject :: a -> SingObject (s :: Symbol) a
- Data.Aeson.Extra: SymTag :: SymTag
+ Data.Aeson.Extra: SymTag :: SymTag (s :: Symbol)
- Data.Aeson.Extra.SingObject: SingObject :: a -> SingObject a
+ Data.Aeson.Extra.SingObject: SingObject :: a -> SingObject (s :: Symbol) a
- Data.Aeson.Extra.SymTag: SymTag :: SymTag
+ Data.Aeson.Extra.SymTag: SymTag :: SymTag (s :: Symbol)

Files

CHANGELOG.md view
@@ -1,3 +1,9 @@+# 0.5 (2021-03-22)++- Trim lower bounds+- Remove `Data.Aeson.Extra.Map` (use recent `aeson`).+- Remove `Data.Aeson.Time` (use recent `aeson`)+ # 0.4.1.3 (2019-10-21)  - support semialign-1.1
aeson-extra.cabal view
@@ -1,6 +1,6 @@ cabal-version:      >=1.10 name:               aeson-extra-version:            0.4.1.3+version:            0.5 synopsis:           Extra goodies for aeson description:   Package provides extra functionality on top of @aeson@ and @aeson-compat@@@ -13,14 +13,15 @@ license:            BSD3 license-file:       LICENSE tested-with:-  GHC ==7.6.3-   || ==7.8.4+  GHC ==7.8.4    || ==7.10.3    || ==8.0.2    || ==8.2.2    || ==8.4.4    || ==8.6.5-   || ==8.8.1+   || ==8.8.4+   || ==8.10.4+   || ==9.0.1  build-type:         Simple extra-source-files:@@ -35,46 +36,39 @@   hs-source-dirs:   src   ghc-options:      -Wall   build-depends:-      aeson                  >=0.7.0.6  && <1.5-    , aeson-compat           >=0.3.0.0  && <0.4+      aeson                  >=1.5.4.1  && <1.6     , attoparsec             >=0.11.3.4 && <0.14     , attoparsec-iso8601     >=1.0      && <1.1-    , base                   >=4.6      && <4.14-    , base-compat-batteries  >=0.10.1   && <0.12-    , bytestring             >=0.10     && <0.11+    , base                   >=4.7      && <4.16+    , base-compat-batteries  >=0.11.2   && <0.12+    , bytestring             >=0.10     && <0.12     , containers             >=0.5      && <0.7     , deepseq                >=1.3      && <1.5     , exceptions             >=0.8      && <0.11     , hashable               >=1.2      && <1.4     , parsec                 >=3.1.9    && <3.2-    , recursion-schemes      >=4.1.2    && <5.2+    , recursion-schemes      >=4.1.2    && <5.3     , scientific             >=0.3      && <0.4-    , semialign              >=1        && <1.2-    , template-haskell       >=2.8      && <2.16+    , semialign              >=1        && <1.3+    , template-haskell       >=2.8      && <2.18     , text                   >=1.2      && <1.3-    , these                  >=1        && <1.1-    , time                   >=1.4.0.1  && <1.10+    , these                  >=1        && <1.2     , unordered-containers   >=0.2      && <0.3     , vector                 >=0.10     && <0.13    if !impl(ghc >=8.2)     build-depends: bifunctors >=5.5.2 && <5.6 -  if impl(ghc >=7.8)-    exposed-modules:-      Data.Aeson.Extra.SingObject-      Data.Aeson.Extra.SymTag-   exposed-modules:     Data.Aeson.Extra     Data.Aeson.Extra.CollapsedList     Data.Aeson.Extra.Foldable-    Data.Aeson.Extra.Map     Data.Aeson.Extra.Merge     Data.Aeson.Extra.Recursive+    Data.Aeson.Extra.SingObject     Data.Aeson.Extra.Stream+    Data.Aeson.Extra.SymTag     Data.Aeson.Extra.TH-    Data.Aeson.Extra.Time    default-language: Haskell2010 @@ -84,15 +78,16 @@   hs-source-dirs:   test   ghc-options:      -Wall   build-depends:-      aeson-extra+      aeson+    , aeson-extra     , base+    , base-compat-batteries     , containers-    , quickcheck-instances  >=0.3     && <0.4-    , tasty                 >=0.10    && <1.3-    , tasty-hunit           >=0.9     && <0.11-    , tasty-quickcheck      >=0.8     && <0.11-    , time-    , time-parsers          >=0.1.0.0 && <0.2+    , quickcheck-instances   >=0.3     && <0.4+    , tasty                  >=0.10    && <1.5+    , tasty-hunit            >=0.9     && <0.11+    , tasty-quickcheck       >=0.8     && <0.11+    , time-parsers           >=0.1.0.0 && <0.2     , unordered-containers     , vector 
src/Data/Aeson/Extra.hs view
@@ -9,66 +9,47 @@ -- -- More or less useful newtypes for writing 'FromJSON' & 'ToJSON' instances module Data.Aeson.Extra (-  -- * Strict encoding-  encodeStrict,-  -- * Generic maps-  M(..),-  FromJSONKey(..),-  parseIntegralJSONKey,-  FromJSONMap(..),-  ToJSONKey(..),-  ToJSONMap(..),-#if MIN_VERSION_base(4,7,0)-  -- * Symbol tag-  SymTag(..),-  -- * Singleton object-  SingObject(..),-  mkSingObject,-  getSingObject,-#endif-  -- * CollapsedList-  CollapsedList(..),-  getCollapsedList,-  parseCollapsedList,-  -- * UTCTime-  U(..),-  Z(..),-  -- * Algebra-  ValueF(..),-  ObjectF,-  ArrayF,-  -- * Merge-  merge,-  lodashMerge,-  -- * Stream-  streamDecode,-  -- * Template Haskell-  mkValue,-  mkValue',-  -- * Re-exports-  module Data.Aeson.Compat,-  ) where+    -- * Strict encoding+    encodeStrict,+    -- * Symbol tag+    SymTag(..),+    -- * Singleton object+    SingObject(..),+    mkSingObject,+    getSingObject,+    -- * CollapsedList+    CollapsedList(..),+    getCollapsedList,+    parseCollapsedList,+    -- * Algebra+    ValueF(..),+    ObjectF,+    ArrayF,+    -- * Merge+    merge,+    lodashMerge,+    -- * Stream+    streamDecode,+    -- * Template Haskell+    mkValue,+    mkValue',+) where  import Prelude () import Prelude.Compat -import Data.Aeson.Compat+import Data.Aeson  import qualified Data.ByteString      as BS import qualified Data.ByteString.Lazy as LBS  import Data.Aeson.Extra.CollapsedList-import Data.Aeson.Extra.Map import Data.Aeson.Extra.Merge-import Data.Aeson.Extra.Recursive-import Data.Aeson.Extra.Stream-import Data.Aeson.Extra.TH-import Data.Aeson.Extra.Time--#if MIN_VERSION_base(4,7,0)+import Data.Aeson.Extra.Recursive () import Data.Aeson.Extra.SingObject+import Data.Aeson.Extra.Stream import Data.Aeson.Extra.SymTag-#endif+import Data.Aeson.Extra.TH  -- | Like 'encode', but produces strict 'BS.ByteString'. --
src/Data/Aeson/Extra/CollapsedList.hs view
@@ -22,7 +22,6 @@ import Prelude.Compat  import Control.Applicative (Alternative (..))-import Data.Aeson.Compat import Data.Aeson.Types    hiding ((.:?)) import Data.Text           (Text) @@ -32,10 +31,8 @@  import qualified Data.Foldable       as Foldable import qualified Data.HashMap.Strict as HM+import qualified Data.Text           as T -#if MIN_VERSION_aeson(0,10,0)-import qualified Data.Text as T-#endif  -- | Collapsed list, singleton is represented as the value itself in JSON encoding. --@@ -64,9 +61,8 @@ getCollapsedList :: CollapsedList f a -> f a getCollapsedList (CollapsedList l) = l -#if MIN_VERSION_aeson(1,0,0) instance (FromJSON1 f, Alternative f) => FromJSON1 (CollapsedList f) where-    liftParseJSON p _ v = CollapsedList <$> case v of +    liftParseJSON p _ v = CollapsedList <$> case v of         Null    -> pure Control.Applicative.empty         Array _ -> liftParseJSON p (listParser p) v         x       -> pure <$> p x@@ -112,48 +108,3 @@         Just v    -> modifyFailure addKeyName $ (getCollapsedList <$> parseJSON v) -- <?> Key key   where     addKeyName = (mappend ("failed to parse field " `mappend` T.unpack key `mappend`": "))--#else-instance (FromJSON a, FromJSON (f a), Alternative f) => FromJSON (CollapsedList f a) where-    parseJSON Null         = pure (CollapsedList Control.Applicative.empty)-    parseJSON v@(Array _)  = CollapsedList <$> parseJSON v-    parseJSON v            = CollapsedList . pure <$> parseJSON v--instance (ToJSON a, ToJSON (f a), Foldable f) => ToJSON (CollapsedList f a) where-#if MIN_VERSION_aeson (0,10,0)-    toEncoding (CollapsedList l) =-        case Foldable.toList l of-            []   -> toEncoding Null-            [x]  -> toEncoding x-            _    -> toEncoding l-#endif-    toJSON (CollapsedList l) =-        case Foldable.toList l of-            []   -> toJSON Null-            [x]  -> toJSON x-            _    -> toJSON l---- | Parses possibly collapsed array value from the object's field.------ > λ > newtype V = V [Int] deriving (Show)--- > λ > instance FromJSON V where parseJSON = withObject "V" $ \obj -> V <$> parseCollapsedList obj "value"--- > λ > decode "{}" :: Maybe V--- > Just (V [])--- > λ > decode "{\"value\": null}" :: Maybe V--- > Just (V [])--- > λ > decode "{\"value\": 42}" :: Maybe V--- > Just (V [42])--- > λ > decode "{\"value\": [1, 2, 3, 4]}" :: Maybe V--- > Just (V [1,2,3,4])-parseCollapsedList :: (FromJSON a, FromJSON (f a), Alternative f) => Object -> Text -> Parser (f a)-parseCollapsedList obj key =-    case HM.lookup key obj of-        Nothing   -> pure Control.Applicative.empty-#if MIN_VERSION_aeson(0,10,0)-        Just v    -> modifyFailure addKeyName $ (getCollapsedList <$> parseJSON v) -- <?> Key key-  where-    addKeyName = (mappend ("failed to parse field " `mappend` T.unpack key `mappend`": "))-#else-        Just v    -> getCollapsedList <$> parseJSON v-#endif-#endif
− src/Data/Aeson/Extra/Map.hs
@@ -1,101 +0,0 @@-{-# LANGUAGE DeriveDataTypeable     #-}-{-# LANGUAGE DeriveFoldable         #-}-{-# LANGUAGE DeriveFunctor          #-}-{-# LANGUAGE DeriveTraversable      #-}-{-# LANGUAGE FlexibleInstances      #-}-{-# LANGUAGE FunctionalDependencies #-}-{-# LANGUAGE UndecidableInstances   #-}--------------------------------------------------------------------------------- |--- Module      :  Data.Aeson.Extra.Map--- Copyright   :  (C) 2015-2016 Oleg Grenrus--- License     :  BSD3--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>------ More or less useful newtypes for writing 'FromJSON' & 'ToJSON' instances-module Data.Aeson.Extra.Map {-# DEPRECATED "Use aeson-1 TOJSONKey etc functionality" #-} (-  M(..),-  FromJSONKey(..),-  parseIntegralJSONKey,-  FromJSONMap(..),-  ToJSONKey(..),-  ToJSONMap(..),-  ) where--import Prelude ()-import Prelude.Compat--import Data.Aeson.Compat-       (FromJSON (..), ToJSON (..), Value (..), withObject)-import Data.Aeson.Types      (Parser)-import Data.Hashable         (Hashable)-import Data.Semigroup.Compat ((<>))-import Data.Text             (Text)-import Data.Typeable         (Typeable)--import qualified Data.HashMap.Strict as HM-import qualified Data.Map            as Map-import qualified Data.Text           as T-import qualified Data.Text.Lazy      as LT-import qualified Data.Text.Read      as T---- | A wrapper type to parse arbitrary maps------ > λ > decode "{\"1\": 1, \"2\": 2}" :: Maybe (M (H.HashMap Int Int))--- > Just (M {getMap = fromList [(1,1),(2,2)]})-newtype M a = M { getMap :: a }-  deriving (Eq, Ord, Show, Read, Functor, Foldable, Traversable, Typeable)-{-# DEPRECATED M "Use aeson-1 TOJSONKey etc functionality" #-}--class FromJSONKey a where-  parseJSONKey :: Text -> Parser a--instance FromJSONKey Text where parseJSONKey = pure-instance FromJSONKey LT.Text where parseJSONKey = pure . LT.fromStrict-instance FromJSONKey String where parseJSONKey = pure . T.unpack-instance FromJSONKey Int where parseJSONKey = parseIntegralJSONKey-instance FromJSONKey Integer where parseJSONKey = parseIntegralJSONKey--parseIntegralJSONKey :: Integral a => Text -> Parser a-parseIntegralJSONKey t = case T.signed T.decimal t of-  Right (v, left) | T.null left  -> pure v-                  | otherwise    -> fail $ "Garbage left: " <> T.unpack left-  Left err                       -> fail err--class FromJSONMap m k v | m -> k v where-  parseJSONMap :: HM.HashMap Text Value -> Parser m--instance (Eq k, Hashable k, FromJSONKey k, FromJSON v) => FromJSONMap (HM.HashMap k v) k v where-  parseJSONMap = fmap HM.fromList . traverse f . HM.toList-    where f (k, v) = (,) <$> parseJSONKey k <*> parseJSON v--instance (Ord k, FromJSONKey k, FromJSON v) => FromJSONMap (Map.Map k v) k v where-  parseJSONMap = fmap Map.fromList . traverse f . HM.toList-    where f (k, v) = (,) <$> parseJSONKey k <*> parseJSON v--instance (FromJSONMap m k v) => FromJSON (M m) where-  parseJSON v = M <$> withObject "Map" parseJSONMap v---class ToJSONKey a where-  toJSONKey :: a -> Text--instance ToJSONKey Text where toJSONKey = id-instance ToJSONKey LT.Text where toJSONKey = LT.toStrict-instance ToJSONKey String where toJSONKey = T.pack-instance ToJSONKey Int where toJSONKey = T.pack . show-instance ToJSONKey Integer where toJSONKey = T.pack . show--class ToJSONMap m k v | m -> k v where-  toJSONMap :: m -> HM.HashMap Text Value--instance (ToJSONKey k, ToJSON v) => ToJSONMap (HM.HashMap k v) k v where-  toJSONMap = HM.fromList . fmap f . HM.toList-    where f (k, v) = (toJSONKey k, toJSON v)--instance (ToJSONKey k, ToJSON v) => ToJSONMap (Map.Map k v) k v where-  toJSONMap = HM.fromList . fmap f . Map.toList-    where f (k, v) = (toJSONKey k, toJSON v)--instance (ToJSONMap m k v) => ToJSON (M m) where-  toJSON (M m) = Object (toJSONMap m)
src/Data/Aeson/Extra/Merge.hs view
@@ -15,14 +15,14 @@     ArrayF,     ) where -import Prelude        ()+import Prelude () import Prelude.Compat -import Data.Aeson.Compat+import Data.Aeson import Data.Aeson.Extra.Recursive-import Data.These (These (..))-import Data.Align (alignWith)-import Data.Functor.Foldable (project, embed)+import Data.Align                 (alignWith)+import Data.Functor.Foldable      (embed, project)+import Data.These                 (These (..))  -- | Generic merge. --
src/Data/Aeson/Extra/Recursive.hs view
@@ -27,10 +27,10 @@     ArrayF,     ) where -import Prelude        ()+import Prelude () import Prelude.Compat -import Data.Aeson.Compat+import Data.Aeson import Data.Data             (Data) import Data.Functor.Foldable import Data.HashMap.Strict   (HashMap)
src/Data/Aeson/Extra/SingObject.hs view
@@ -23,21 +23,15 @@ import Prelude.Compat  import Control.DeepSeq       (NFData (..))-import Data.Aeson.Compat+import Data.Aeson+import Data.Aeson.Encoding   (pair)+import Data.Aeson.Internal   (JSONPathElement (Key)) import Data.Proxy            (Proxy (..))-import Data.Semigroup.Compat ((<>)) import Data.Typeable         (Typeable) import GHC.TypeLits          (KnownSymbol, Symbol, symbolVal) -import qualified Data.Text as T--#if MIN_VERSION_aeson(1,0,0)-import Data.Aeson.Encoding (pair)-import Data.Aeson.Internal (JSONPathElement (Key), (<?>))-import Data.Aeson.Types    hiding ((.:?))- import qualified Data.HashMap.Strict as HM-#endif+import qualified Data.Text           as T  -- | Singleton value object --@@ -57,8 +51,6 @@ getSingObject :: Proxy s -> SingObject s a -> a getSingObject _ (SingObject x) = x -#if MIN_VERSION_aeson(1,0,0)- instance KnownSymbol s => FromJSON1 (SingObject s) where     liftParseJSON p _ = withObject ("SingObject "<> show key) $ \obj ->         case HM.lookup key obj of@@ -83,21 +75,6 @@ instance (KnownSymbol s, ToJSON a) => ToJSON (SingObject s a) where     toJSON     = toJSON1     toEncoding = toEncoding1--#else-instance (KnownSymbol s, FromJSON a) => FromJSON (SingObject s a) where-  parseJSON = withObject ("SingObject "<> show key) $ \obj ->-    SingObject <$> obj .: T.pack key-    where key = symbolVal (Proxy :: Proxy s)--instance (KnownSymbol s, ToJSON a) => ToJSON (SingObject s a) where-#if MIN_VERSION_aeson(0,10,0)-  toEncoding (SingObject x) = pairs (T.pack key .= x)-    where key = symbolVal (Proxy :: Proxy s)-#endif-  toJSON (SingObject x) = object [T.pack key .= x]-    where key = symbolVal (Proxy :: Proxy s)-#endif  -- | @since 0.4.1.0 instance NFData a => NFData (SingObject s a) where
src/Data/Aeson/Extra/Stream.hs view
@@ -10,16 +10,16 @@     streamDecode,     ) where -import Prelude        ()+import Prelude () import Prelude.Compat -import Control.Applicative ((<|>), many)-import Data.Aeson.Compat   (FromJSON, Result (..), Value, fromJSON)+import Control.Applicative (many, (<|>))+import Data.Aeson          (FromJSON, Result (..), Value, fromJSON) import Data.Aeson.Parser   (value) -import qualified Data.ByteString.Lazy as LBS import qualified Data.Attoparsec.ByteString.Char8 as A8 import qualified Data.Attoparsec.ByteString.Lazy  as A+import qualified Data.ByteString.Lazy             as LBS  streamParse :: LBS.ByteString -> ([Value], Maybe String) streamParse = start
src/Data/Aeson/Extra/SymTag.hs view
@@ -16,11 +16,11 @@ import Prelude () import Prelude.Compat -import Control.DeepSeq   (NFData (..))-import Data.Aeson.Compat-import Data.Aeson.Types  hiding ((.:?))-import Data.Proxy        (Proxy (..))-import GHC.TypeLits      (KnownSymbol, Symbol, symbolVal)+import Control.DeepSeq  (NFData (..))+import Data.Aeson+import Data.Aeson.Types hiding ((.:?))+import Data.Proxy       (Proxy (..))+import GHC.TypeLits     (KnownSymbol, Symbol, symbolVal)  import qualified Data.Text as T 
src/Data/Aeson/Extra/TH.hs view
@@ -15,24 +15,12 @@     mkValue',     ) where -import Data.Aeson.Compat import Language.Haskell.TH  import qualified Data.Text          as T import qualified Data.Text.Encoding as TE -#if !MIN_VERSION_aeson_compat(0,3,5)-import Data.Aeson.Types (Parser)-#endif--#if !MIN_VERSION_aeson(0,11,0)-import Data.Bifunctor             (first)-import Data.Scientific            (base10Exponent, coefficient, scientific)-import Language.Haskell.TH.Syntax (Lift (..))--import qualified Data.HashMap.Strict as HM-import qualified Data.Vector         as V-#endif+import Data.Aeson  -- | Create a 'Value' from string representation. --@@ -55,22 +43,3 @@ mkValue' = mkValue . map f   where f '\'' = '"'         f x    = x--#if !MIN_VERSION_aeson(0,11,0)--- | From 'aeson-extra'------ /Since: aeson-extra-0.3.1.0/-instance Lift Value where-    lift Null = [| Null |]-    lift (Bool b) = [| Bool b |]-    lift (Number n) = [| Number (scientific c e) |]-      where-        c = coefficient n-        e = base10Exponent n-    lift (String t) = [| String (T.pack s) |]-      where s = T.unpack t-    lift (Array a) = [| Array (V.fromList a') |]-      where a' = V.toList a-    lift (Object o) = [| Object (HM.fromList . map (first T.pack) $ o') |]-      where o' = map (first T.unpack) . HM.toList $ o-#endif
− src/Data/Aeson/Extra/Time.hs
@@ -1,89 +0,0 @@-{-# LANGUAGE CPP                #-}-{-# LANGUAGE DeriveDataTypeable #-}--------------------------------------------------------------------------------- |--- Module      :  Data.Aeson.Extra.Time--- Copyright   :  (C) 2015-2016 Oleg Grenrus--- License     :  BSD3--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>------ Time tools-module Data.Aeson.Extra.Time (-    U(..),-    Z(..),-    )where--import Prelude        ()-import Prelude.Compat--import Data.Aeson.Compat-import Data.Time         (UTCTime, ZonedTime)-import Data.Typeable     (Typeable)--#if !MIN_VERSION_aeson (0,10,0)-import Data.Text         (Text)--#if !MIN_VERSION_aeson_compat(0,3,5)-import           Data.Aeson.Types (Parser)-#endif--import qualified Data.Time.Parsers as TimeParsers-import qualified Text.Parsec       as Parsec-#endif---- | A type to parse 'UTCTime'------ 'FromJSON' instance accepts for example:------ @--- 2015-09-07T08:16:40.807Z--- 2015-09-07 11:16:40.807 +03:00--- @------ Latter format is accepted by @aeson@ staring from version @0.10.0.0@.------ See <https://github.com/bos/aeson/blob/4667ef1029a373cf4510f7deca147c357c6d8947/Data/Aeson/Parser/Time.hs#L150>------ /Since: aeson-extra-0.2.2.0/-newtype U = U { getU :: UTCTime }-  deriving (Eq, Ord, Show, Read, Typeable)--instance ToJSON U where-  toJSON = toJSON . getU-#if MIN_VERSION_aeson (0,10,0)-  toEncoding = toEncoding . getU-#endif--instance FromJSON U where-#if MIN_VERSION_aeson (0,10,0)-  parseJSON = fmap U . parseJSON-#else-  parseJSON = withText "UTCTime" (fmap U . run TimeParsers.utcTime)-#endif---- | A type to parse 'ZonedTime'------ /Since: aeson-extra-0.2.2.0/-newtype Z = Z { getZ :: ZonedTime }-  deriving (Show, Read, Typeable)--instance ToJSON Z where-  toJSON = toJSON . getZ-#if MIN_VERSION_aeson (0,10,0)-  toEncoding = toEncoding . getZ-#endif--instance FromJSON Z where-#if MIN_VERSION_aeson (0,10,0)-  parseJSON = fmap Z . parseJSON-#else-  parseJSON = withText "ZonedTime" (fmap Z . run TimeParsers.zonedTime)-#endif--#if !MIN_VERSION_aeson (0,10,0)--- | Run a 'parsers' parser as an aeson parser.-run :: Parsec.Parsec Text () a -> Text -> Parser a-run p t = case Parsec.parse (p <* Parsec.eof) "" t of-            Left err -> fail $ "could not parse date: " ++ show err-            Right r  -> return r-#endif
test/Tests.hs view
@@ -1,51 +1,34 @@-{-# LANGUAGE CPP #-}+{-# LANGUAGE CPP               #-}+{-# LANGUAGE DataKinds         #-}+{-# LANGUAGE KindSignatures    #-} {-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE KindSignatures #-}-{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TemplateHaskell   #-} {-# OPTIONS_GHC -fno-warn-deprecations #-} module Main (main) where -#if !MIN_VERSION_base(4,8,0)-import           Control.Applicative-#endif----import           Data.Map (Map)-import           Data.Maybe (isJust)-import           Data.String (fromString)-import           Data.Time (zonedTimeToUTC, UTCTime(..), Day(..))-import           Data.Vector (Vector)-import           Test.QuickCheck.Instances ()-import           Test.Tasty-import           Test.Tasty.HUnit-import           Test.Tasty.QuickCheck--import qualified Data.HashMap.Lazy as H+import Prelude ()+import Prelude.Compat -#if MIN_VERSION_base(4,7,0)-import           Data.Proxy-#endif+import Data.Aeson+import Data.Aeson.Extra -import           Data.Aeson.Extra-import           Data.Time.TH+import Data.Maybe                (isJust)+import Data.Proxy+import Data.Vector               (Vector)+import Test.QuickCheck.Instances ()+import Test.Tasty+import Test.Tasty.HUnit+import Test.Tasty.QuickCheck -import           Orphans ()+import Orphans ()  main :: IO () main = defaultMain $ testGroup "Tests"   [ dotColonMark   , encodeStrictTests-  , mTests-#if MIN_VERSION_base(4,7,0)   , symTests   , singObjectTests-#endif   , collapsedListTests-  , utctimeTests-  , zonedtimeTests-  , timeTHTests   , mergeTests   , streamTests   ]@@ -63,26 +46,6 @@                  in lhs === rhs  --------------------------------------------------------------------------------- M---------------------------------------------------------------------------------mTests :: TestTree-mTests = testGroup "M"-  [ testCase "decode" $ let lhs = decode "{\"1\": 1, \"2\": 2}" :: Maybe (M (H.HashMap Int Int))-                            rhs = Just result-                        in lhs @?= rhs-  , testProperty "decode . encode" $-      let prop :: Map Int Int -> Property-          prop m = let lhs = fmap getMap . decode . encode . M $ m-                       rhs = Just m-                   in lhs === rhs-      in prop-  ]-  where result = M $ H.fromList [(1,1),(2,2)]--#if MIN_VERSION_base(4,7,0)-------------------------------------------------------------------------------- -- SymTag ------------------------------------------------------------------------------ @@ -114,8 +77,6 @@       in prop   ] -#endif- ------------------------------------------------------------------------------ -- parseCollapsedList ------------------------------------------------------------------------------@@ -206,52 +167,6 @@         ex2 = "{\"value\": 42 }"         ex3 = "{\"value\": null }"         t   = testCase "-"----------------------------------------------------------------------------------- U & Z---------------------------------------------------------------------------------utctimeTests :: TestTree-utctimeTests = testGroup "U" $-  [ testCase "base case" $ assertBool "base case" $ isJust simple-  ] ++ map t timeStrings-  where simple = decode "\"2015-09-07T08:16:40.807Z\"" :: Maybe U-        t str = testCase str-              . assertEqual str simple-              . decode-              . fromString-              $ "\"" ++ str ++ "\""--zonedtimeTests :: TestTree-zonedtimeTests = testGroup "Z" $-  [ testCase "base case" $ assertBool "base case" $ isJust simple-  ] ++ map t timeStrings-  where simple = decode "\"2015-09-07T08:16:40.807Z\"" :: Maybe Z-        t str = testCase str-              . assertEqual str (fmap z simple)-              . fmap z-              . decode-              . fromString-              $ "\"" ++ str ++ "\""-        z (Z z') = zonedTimeToUTC z'--timeStrings :: [String]-timeStrings =-  [ "2015-09-07T08:16:40.807Z"-  , "2015-09-07T11:16:40.807+0300"-  , "2015-09-07 08:16:40.807Z"-  , "2015-09-07 08:16:40.807 Z"-  , "2015-09-07 08:16:40.807 +0000"-  , "2015-09-07 08:16:40.807 +00:00"-  , "2015-09-07 11:16:40.807 +03:00"-  , "2015-09-07 05:16:40.807 -03:00"-  ]--timeTHTests :: TestTree-timeTHTests =-    testCase "time TH example" $ assertBool "should be equal" $ lhs == rhs-      where lhs = UTCTime (ModifiedJulianDay 56789) 123.456-            rhs = $(mkUTCTime "2014-05-12 00:02:03.456000Z")  ------------------------------------------------------------------------------ -- Merge tests