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 +6/−0
- aeson-extra.cabal +23/−28
- src/Data/Aeson/Extra.hs +29/−48
- src/Data/Aeson/Extra/CollapsedList.hs +2/−51
- src/Data/Aeson/Extra/Map.hs +0/−101
- src/Data/Aeson/Extra/Merge.hs +5/−5
- src/Data/Aeson/Extra/Recursive.hs +2/−2
- src/Data/Aeson/Extra/SingObject.hs +4/−27
- src/Data/Aeson/Extra/Stream.hs +4/−4
- src/Data/Aeson/Extra/SymTag.hs +5/−5
- src/Data/Aeson/Extra/TH.hs +1/−32
- src/Data/Aeson/Extra/Time.hs +0/−89
- test/Tests.hs +16/−101
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