packages feed

aeson 2.2.2.0 → 2.2.3.0

raw patch · 8 files changed

+106/−211 lines, 8 filesdep ~Diffdep ~QuickCheckdep ~ghc-primPVP ok

version bump matches the API change (PVP)

Dependency ranges changed: Diff, QuickCheck, ghc-prim, hashable, template-haskell, time

API changes (from Hackage documentation)

Files

aeson.cabal view
@@ -1,6 +1,6 @@ cabal-version:      2.2 name:               aeson-version:            2.2.2.0+version:            2.2.3.0 license:            BSD-3-Clause license-file:       LICENSE category:           Text, Web, JSON@@ -115,7 +115,7 @@     , character-ps          ^>=0.1     , data-fix              ^>=0.3.2     , dlist                 ^>=1.0-    , hashable              ^>=1.4.2.0+    , hashable              ^>=1.4.6.0     , indexed-traversable   ^>=0.1.2     , integer-conversion    ^>=0.1     , integer-logarithms    ^>=1.0.3.1@@ -127,14 +127,14 @@     , semialign             ^>=1.3     , strict                ^>=0.5     , tagged                ^>=0.8.7-    , text-iso8601          ^>=0.1+    , text-iso8601          ^>=0.1.1     , text-short            ^>=0.1.5     , th-abstraction        ^>=0.5.0.0  || ^>=0.6.0.0 || ^>=0.7.0.0     , these                 ^>=1.2     , unordered-containers  ^>=0.2.10.0     , uuid-types            ^>=1.0.5     , vector                ^>=0.13.0.0-    , witherable            ^>=0.4.2+    , witherable            ^>=0.4.2 || ^>=0.5    ghc-options:      -Wall 
changelog.md view
@@ -1,5 +1,12 @@ For the latest version of this document, please see [https://github.com/haskell/aeson/blob/master/changelog.md](https://github.com/haskell/aeson/blob/master/changelog.md). +### 2.2.3.0++* Support `hashable-1.4.6.0`.+* Fix an issue where `Hashable Key` wasn't newtype instance over underlying `Text`,+  so with `-ordered-keymap` there were correctness issues.+* Add instances for `Data.Semigroup.Sum`, `Product`, `Any`, `All`+ ### 2.2.2.0  * Support GHC-8.6.5...9.10.1
src/Data/Aeson.hs view
@@ -557,5 +557,5 @@ -- -- For more information, see <https://en.wikipedia.org/wiki/ISO_8601 ISO 8601> -- <https://hackage.haskell.org/package/time time>,--- and <https://hackage.haskell.org/package/attoparsec-iso8601 attoparsec-iso8601>+-- and <https://hackage.haskell.org/package/text-iso8601 text-iso8601> -- (where the relevant parsers are defined).
src/Data/Aeson/Decoding.hs view
@@ -96,7 +96,7 @@ -- Decoding: strict text ------------------------------------------------------------------------------- --- | Efficiently deserialize a JSON value from a strict 'B.ByteString'.+-- | Efficiently deserialize a JSON value from a strict 'T.Text'. -- If this fails due to incomplete or invalid input, 'Nothing' is -- returned. --
src/Data/Aeson/Key.hs view
@@ -1,6 +1,9 @@ {-# LANGUAGE CPP #-} {-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE DerivingStrategies #-} {-# LANGUAGE GADTs #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE TemplateHaskellQuotes #-}  -- |@@ -39,7 +42,7 @@ import qualified Test.QuickCheck as QC  newtype Key = Key { unKey :: Text }-  deriving (Eq, Ord, Typeable, Data)+  deriving (Typeable, Data)  fromString :: String -> Key fromString = Key . T.pack@@ -58,7 +61,7 @@ -- -- Using 'coercing' we can make more efficient implementations -- when 'Key' is backed up by 'Text' without exposing internals.--- +-- coercionToText :: Maybe (Coercion Key Text) coercionToText = Just Coercion {-# INLINE coercionToText #-}@@ -79,13 +82,14 @@     readPrec = fromString <$> readPrec  instance Show Key where-    showsPrec d (Key k) = showsPrec d k +    showsPrec d (Key k) = showsPrec d k  instance Data.String.IsString Key where     fromString = fromString -instance Hashable Key where-    hashWithSalt salt (Key k) = hashWithSalt salt k+deriving newtype instance Eq Key+deriving newtype instance Ord Key+deriving newtype instance Hashable Key  instance NFData Key where     rnf (Key k) = rnf k
src/Data/Aeson/Types/FromJSON.hs view
@@ -1,18 +1,20 @@ {-# LANGUAGE CPP #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE DefaultSignatures #-}-{-# LANGUAGE InstanceSigs #-}+{-# LANGUAGE DerivingVia #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-}+{-# LANGUAGE InstanceSigs #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE PolyKinds #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE TupleSections #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeOperators #-}-{-# LANGUAGE TupleSections #-} {-# LANGUAGE UndecidableInstances #-} {-# LANGUAGE ViewPatterns #-} @@ -86,12 +88,12 @@ import Data.Aeson.Internal.Prelude  import Control.Monad (zipWithM, guard)+import Data.Aeson.Decoding.ByteString.Lazy+import Data.Aeson.Decoding.Conversion (unResult, toResultValue, lbsSpace) import Data.Aeson.Internal.Functions (mapKey, mapKeyO) import Data.Aeson.Internal.Scientific import Data.Aeson.Types.Generic import Data.Aeson.Types.Internal-import Data.Aeson.Decoding.ByteString.Lazy-import Data.Aeson.Decoding.Conversion (unResult, toResultValue, lbsSpace) import Data.Bits (unsafeShiftR) import Data.Fixed (Fixed, HasResolution (resolution), Nano) import Data.Functor.Compose (Compose(..))@@ -100,6 +102,7 @@ import Data.Functor.Sum (Sum(..)) import Data.Functor.These (These1 (..)) import Data.Hashable (Hashable(..))+import Data.Kind (Type) import Data.List.NonEmpty (NonEmpty(..)) import Data.Ord (Down (..)) import Data.Ratio ((%), Ratio)@@ -1922,17 +1925,10 @@  instance FromJSON1 Identity where     liftParseJSON _ p _ a = coerce (p a)-     liftParseJSONList _ _ p a = coerce (p a)-     liftOmittedField = coerce -instance (FromJSON a) => FromJSON (Identity a) where-    parseJSON = parseJSON1--    parseJSONList = liftParseJSONList omittedField parseJSON parseJSONList--    omittedField = coerce (omittedField @a)+deriving via (a :: Type) instance FromJSON a => FromJSON (Identity a)  instance (FromJSONKey a) => FromJSONKey (Identity a) where     fromJSONKey = coerceFromJSONKeyFunction (fromJSONKey :: FromJSONKeyFunction a)@@ -2313,114 +2309,58 @@ -------------------------------------------------------------------------------  -- | @since 2.2.0.0-instance FromJSON1 Down where-    liftParseJSON _ p _ = coerce p--    liftOmittedField = coerce+deriving via Identity instance FromJSON1 Down  -- | @since 2.2.0.0-instance FromJSON a => FromJSON (Down a) where-    parseJSON = parseJSON1+deriving via (a :: Type) instance FromJSON a => FromJSON (Down a)  ------------------------------------------------------------------------------- -- base Monoid/Semigroup ------------------------------------------------------------------------------- -instance FromJSON1 Monoid.Dual where-    liftParseJSON _ p _ = coerce p--    liftOmittedField = coerce--instance FromJSON a => FromJSON (Monoid.Dual a) where-    parseJSON = parseJSON1---instance FromJSON1 Monoid.First where-    liftParseJSON o = coerce (liftParseJSON @Maybe o)-    liftOmittedField _ = Just (Monoid.First Nothing)--instance FromJSON a => FromJSON (Monoid.First a) where-    parseJSON = parseJSON1-    omittedField = omittedField1--instance FromJSON1 Monoid.Last where-    liftParseJSON o = coerce (liftParseJSON @Maybe o)-    liftOmittedField _ = Just (Monoid.Last Nothing)--instance FromJSON a => FromJSON (Monoid.Last a) where-    parseJSON = parseJSON1-    omittedField = omittedField1--instance FromJSON1 Semigroup.Min where-    liftParseJSON _ p _ a = coerce (p a)--    liftParseJSONList _ _ p a = coerce (p a)--    liftOmittedField = coerce--instance (FromJSON a) => FromJSON (Semigroup.Min a) where-    parseJSON = parseJSON1--    parseJSONList = liftParseJSONList omittedField parseJSON parseJSONList--    omittedField = omittedField1--instance FromJSON1 Semigroup.Max where-    liftParseJSON _ p _ a = coerce (p a)--    liftParseJSONList _ _ p a = coerce (p a)-    liftOmittedField = coerce--instance (FromJSON a) => FromJSON (Semigroup.Max a) where-    parseJSON = parseJSON1--    parseJSONList = liftParseJSONList omittedField parseJSON parseJSONList-    omittedField = omittedField1--instance FromJSON1 Semigroup.First where-    liftParseJSON _ p _ a = coerce (p a)--    liftParseJSONList _ _ p a = coerce (p a)-    liftOmittedField = coerce+deriving via Identity instance FromJSON1 Monoid.Dual+deriving via (a :: Type) instance FromJSON a => FromJSON (Monoid.Dual a) -instance (FromJSON a) => FromJSON (Semigroup.First a) where-    parseJSON = parseJSON1+deriving via Maybe instance FromJSON1 Monoid.First+deriving via Maybe a instance FromJSON a => FromJSON (Monoid.First a) -    parseJSONList = liftParseJSONList omittedField parseJSON parseJSONList+deriving via Maybe instance FromJSON1 Monoid.Last+deriving via Maybe a instance FromJSON a => FromJSON (Monoid.Last a) +deriving via Identity instance FromJSON1 Semigroup.Min+deriving via (a :: Type) instance FromJSON a => FromJSON (Semigroup.Min a) -instance FromJSON1 Semigroup.Last where-    liftParseJSON _ p _ a = coerce (p a)+deriving via Identity instance FromJSON1 Semigroup.Max+deriving via (a :: Type) instance FromJSON a => FromJSON (Semigroup.Max a) -    liftParseJSONList _ _ p a = coerce (p a)-    liftOmittedField = coerce+deriving via Identity instance FromJSON1 Semigroup.First+deriving via (a :: Type) instance FromJSON a => FromJSON (Semigroup.First a) -instance (FromJSON a) => FromJSON (Semigroup.Last a) where-    parseJSON = parseJSON1+deriving via Identity instance FromJSON1 Semigroup.Last+deriving via (a :: Type) instance FromJSON a => FromJSON (Semigroup.Last a) -    parseJSONList = liftParseJSONList omittedField parseJSON parseJSONList-    omittedField = omittedField1+deriving via Identity instance FromJSON1 Semigroup.WrappedMonoid+deriving via (a :: Type) instance FromJSON a => FromJSON (Semigroup.WrappedMonoid a) -instance FromJSON1 Semigroup.WrappedMonoid where-    liftParseJSON _ p _ a = coerce (p a)+-- | @since 2.2.3.0+deriving via Identity instance FromJSON1 Semigroup.Sum+-- | @since 2.2.3.0+deriving via (a :: Type) instance FromJSON a => FromJSON (Semigroup.Sum a) -    liftParseJSONList _ _ p a = coerce (p a)-    liftOmittedField = coerce+-- | @since 2.2.3.0+deriving via Identity instance FromJSON1 Semigroup.Product+-- | @since 2.2.3.0+deriving via (a :: Type) instance FromJSON a => FromJSON (Semigroup.Product a) -instance (FromJSON a) => FromJSON (Semigroup.WrappedMonoid a) where-    parseJSON = parseJSON1+-- | @since 2.2.3.0+deriving via Bool instance FromJSON Semigroup.All -    parseJSONList = liftParseJSONList omittedField parseJSON parseJSONList-    omittedField = omittedField1+-- | @since 2.2.3.0+deriving via Bool instance FromJSON Semigroup.Any  #if !MIN_VERSION_base(4,16,0)-instance FromJSON1 Semigroup.Option where-    liftParseJSON o = coerce (liftParseJSON @Maybe o)-    liftOmittedField _ = Just (Semigroup.Option Nothing)--instance FromJSON a => FromJSON (Semigroup.Option a) where-    parseJSON = parseJSON1-    omittedField = omittedField1+deriving via Maybe instance FromJSON1 Semigroup.Option+deriving via Maybe a instance FromJSON a => FromJSON (Semigroup.Option a) #endif  -------------------------------------------------------------------------------
src/Data/Aeson/Types/ToJSON.hs view
@@ -1,18 +1,20 @@ {-# LANGUAGE CPP #-} {-# LANGUAGE DefaultSignatures #-}+{-# LANGUAGE DerivingVia #-} {-# LANGUAGE EmptyCase #-} {-# LANGUAGE EmptyDataDecls #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE FunctionalDependencies #-}-{-# LANGUAGE InstanceSigs #-} {-# LANGUAGE GADTs #-}+{-# LANGUAGE InstanceSigs #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE PolyKinds #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE TypeApplications #-}+{-# LANGUAGE TypeOperators #-} {-# LANGUAGE UndecidableInstances #-}  module Data.Aeson.Types.ToJSON@@ -76,6 +78,7 @@ import Data.Functor.Product (Product(..)) import Data.Functor.Sum (Sum(..)) import Data.Functor.These (These1 (..))+import Data.Kind (Type) import Data.List (intersperse) import Data.List.NonEmpty (NonEmpty(..)) import Data.Maybe (isNothing)@@ -364,7 +367,7 @@ instance value ~ Value => KeyValue Value (KM.KeyMap value) where     (.=) = explicitToField toJSON     {-# INLINE (.=) #-}-    +     explicitToField f name value = KM.singleton name (f value)     {-# INLINE explicitToField #-} @@ -1641,14 +1644,7 @@      liftOmitField o (Identity a) = o a -instance (ToJSON a) => ToJSON (Identity a) where-    toJSON = toJSON1-    toJSONList = liftToJSONList omitField toJSON toJSONList--    toEncoding = toEncoding1-    toEncodingList = liftToEncodingList omitField toEncoding toEncodingList--    omitField (Identity x) = omitField x+deriving via (a :: Type) instance ToJSON a => ToJSON (Identity a)  instance (ToJSONKey a) => ToJSONKey (Identity a) where     toJSONKey = contramapToJSONKeyFunction runIdentity toJSONKey@@ -2075,115 +2071,58 @@ -------------------------------------------------------------------------------  -- | @since 2.2.0.0-instance ToJSON1 Down where-    liftToJSON _ t _ = coerce t-    liftToEncoding _ t _ = coerce t-    liftOmitField = coerce+deriving via Identity instance ToJSON1 Down  -- | @since 2.2.0.0-instance ToJSON a => ToJSON (Down a) where-    toJSON = toJSON1-    toEncoding = toEncoding1-    omitField = omitField1+deriving via (a :: Type) instance ToJSON a => ToJSON (Down a)  ------------------------------------------------------------------------------- -- base Monoid/Semigroup ------------------------------------------------------------------------------- -instance ToJSON1 Monoid.Dual where-    liftToJSON _ t _ = t . Monoid.getDual-    liftToEncoding _ t _ = t . Monoid.getDual-    liftOmitField = coerce--instance ToJSON a => ToJSON (Monoid.Dual a) where-    toJSON = toJSON1-    toEncoding = toEncoding1-    omitField = omitField1--instance ToJSON1 Monoid.First where-    liftToJSON o t to' = liftToJSON o t to' . Monoid.getFirst-    liftToEncoding o t to' = liftToEncoding o t to' . Monoid.getFirst-    liftOmitField :: forall a. (a -> Bool) -> Monoid.First a -> Bool-    liftOmitField _ = coerce (isNothing @a)-    -instance ToJSON a => ToJSON (Monoid.First a) where-    toJSON = toJSON1-    toEncoding = toEncoding1-    omitField = omitField1--instance ToJSON1 Monoid.Last where-    liftToJSON o t to' = liftToJSON o t to' . Monoid.getLast-    liftToEncoding o t to' = liftToEncoding o t to' . Monoid.getLast--    liftOmitField :: forall a. (a -> Bool) -> Monoid.Last a -> Bool-    liftOmitField _ = coerce (isNothing @a)+deriving via Identity instance ToJSON1 Monoid.Dual+deriving via (a :: Type) instance ToJSON a => ToJSON (Monoid.Dual a) -instance ToJSON a => ToJSON (Monoid.Last a) where-    toJSON = toJSON1-    toEncoding = toEncoding1-    omitField = omitField1+deriving via Maybe instance ToJSON1 Monoid.First+deriving via Maybe a instance ToJSON a => ToJSON (Monoid.First a) -instance ToJSON1 Semigroup.Min where-    liftToJSON _ t _ (Semigroup.Min x) = t x-    liftToEncoding _ t _ (Semigroup.Min x) = t x-    liftOmitField = coerce+deriving via Maybe instance ToJSON1 Monoid.Last+deriving via Maybe a instance ToJSON a => ToJSON (Monoid.Last a) -instance ToJSON a => ToJSON (Semigroup.Min a) where-    toJSON = toJSON1-    toEncoding = toEncoding1-    omitField = omitField1+deriving via Identity instance ToJSON1 Semigroup.Min+deriving via (a :: Type) instance ToJSON a => ToJSON (Semigroup.Min a) +deriving via Identity instance ToJSON1 Semigroup.Max+deriving via (a :: Type) instance ToJSON a => ToJSON (Semigroup.Max a) -instance ToJSON1 Semigroup.Max where-    liftToJSON _ t _ (Semigroup.Max x) = t x-    liftToEncoding _ t _ (Semigroup.Max x) = t x-    liftOmitField = coerce+deriving via Identity instance ToJSON1 Semigroup.First+deriving via (a :: Type) instance ToJSON a => ToJSON (Semigroup.First a) -instance ToJSON a => ToJSON (Semigroup.Max a) where-    toJSON = toJSON1-    toEncoding = toEncoding1-    omitField = omitField1+deriving via Identity instance ToJSON1 Semigroup.Last+deriving via (a :: Type) instance ToJSON a => ToJSON (Semigroup.Last a) -instance ToJSON1 Semigroup.First where-    liftToJSON _ t _ (Semigroup.First x) = t x-    liftToEncoding _ t _ (Semigroup.First x) = t x-    liftOmitField = coerce+deriving via Identity instance ToJSON1 Semigroup.WrappedMonoid+deriving via (a :: Type) instance ToJSON a => ToJSON (Semigroup.WrappedMonoid a) -instance ToJSON a => ToJSON (Semigroup.First a) where-    toJSON = toJSON1-    toEncoding = toEncoding1-    omitField = omitField1+-- | @since 2.2.3.0+deriving via Identity instance ToJSON1 Semigroup.Sum+-- | @since 2.2.3.0+deriving via (a :: Type) instance ToJSON a => ToJSON (Semigroup.Sum a) -instance ToJSON1 Semigroup.Last where-    liftToJSON _ t _ (Semigroup.Last x) = t x-    liftToEncoding _ t _ (Semigroup.Last x) = t x-    liftOmitField = coerce+-- | @since 2.2.3.0+deriving via Identity instance ToJSON1 Semigroup.Product+-- | @since 2.2.3.0+deriving via (a :: Type) instance ToJSON a => ToJSON (Semigroup.Product a) -instance ToJSON a => ToJSON (Semigroup.Last a) where-    toJSON = toJSON1-    toEncoding = toEncoding1-    omitField = omitField1+-- | @since 2.2.3.0+deriving via Bool instance ToJSON Semigroup.All -instance ToJSON1 Semigroup.WrappedMonoid where-    liftToJSON _ t _ (Semigroup.WrapMonoid x) = t x-    liftToEncoding _ t _ (Semigroup.WrapMonoid x) = t x-    liftOmitField = coerce-    -instance ToJSON a => ToJSON (Semigroup.WrappedMonoid a) where-    toJSON = toJSON1-    toEncoding = toEncoding1-    omitField = omitField1+-- | @since 2.2.3.0+deriving via Bool instance ToJSON Semigroup.Any  #if !MIN_VERSION_base(4,16,0)-instance ToJSON1 Semigroup.Option where-    liftToJSON o t to' = liftToJSON o t to' . Semigroup.getOption-    liftToEncoding o t to' = liftToEncoding o t to' . Semigroup.getOption-    liftOmitField _ = isNothing . Semigroup.getOption--instance ToJSON a => ToJSON (Semigroup.Option a) where-    toJSON = toJSON1-    toEncoding = toEncoding1-    omitField = omitField1+deriving via Maybe instance ToJSON1 Semigroup.Option+deriving via Maybe a instance ToJSON a => ToJSON (Semigroup.Option a) #endif  -------------------------------------------------------------------------------
tests/PropertyRoundTrip.hs view
@@ -29,6 +29,7 @@ import Test.Tasty.QuickCheck (testProperty) import Types import qualified Data.Monoid as Monoid+import qualified Data.Semigroup as Semigroup import qualified Data.Text as T import qualified Data.Text.Lazy as LT import qualified Data.Text.Short as ST@@ -87,6 +88,10 @@     , testProperty "Nu" $ roundTripEq @(F.Nu (These Char))     , testProperty "Maybe" $ roundTripEq @(Maybe Int)     , testProperty "Monoid.First" $ roundTripEq @(Monoid.First Int)+    , testProperty "Semigroup.Sum" $ roundTripEq @(Semigroup.Sum Int)+    , testProperty "Semigroup.Product" $ roundTripEq @(Semigroup.Product Int)+    , testProperty "Semigroup.All" $ roundTripEq @Semigroup.All+    , testProperty "Semigroup.Any" $ roundTripEq @Semigroup.Any     , testProperty "Strict Pair" $ roundTripEq @(S.Pair Int Char)     , testProperty "Strict Either" $ roundTripEq @(S.Either Int Char)     , testProperty "Strict These" $ roundTripEq @(S.These Int Char)