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 +4/−4
- changelog.md +7/−0
- src/Data/Aeson.hs +1/−1
- src/Data/Aeson/Decoding.hs +1/−1
- src/Data/Aeson/Key.hs +9/−5
- src/Data/Aeson/Types/FromJSON.hs +40/−100
- src/Data/Aeson/Types/ToJSON.hs +39/−100
- tests/PropertyRoundTrip.hs +5/−0
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)