diff --git a/dhall-json/dhall-json.cabal b/dhall-json/dhall-json.cabal index 249129ac4..e1e3a11d7 100644 --- a/dhall-json/dhall-json.cabal +++ b/dhall-json/dhall-json.cabal @@ -38,7 +38,7 @@ Library Hs-Source-Dirs: src Build-Depends: base >= 4.11.0.0 && < 5 , - aeson >= 1.4.6.0 && < 1.6 , + aeson >= 1.4.6.0 && < 2.1 , aeson-pretty < 0.9 , aeson-yaml >= 1.1.0 && < 1.2 , bytestring < 0.12, @@ -59,6 +59,7 @@ Library Dhall.JSON.Yaml Dhall.DhallToYaml.Main Other-Modules: + Dhall.JSON.Compat Dhall.JSON.Util GHC-Options: -Wall Default-Language: Haskell2010 diff --git a/dhall-json/src/Dhall/JSON.hs b/dhall-json/src/Dhall/JSON.hs index c2cdfd99e..f645b4e86 100644 --- a/dhall-json/src/Dhall/JSON.hs +++ b/dhall-json/src/Dhall/JSON.hs @@ -230,7 +230,6 @@ import Prettyprinter (Pretty) import qualified Data.Aeson as Aeson import qualified Data.Foldable as Foldable -import qualified Data.HashMap.Strict as HashMap import qualified Data.List import qualified Data.Map import qualified Data.Ord @@ -238,6 +237,7 @@ import qualified Data.Text import qualified Data.Vector as Vector import qualified Dhall.Core as Core import qualified Dhall.Import +import qualified Dhall.JSON.Compat as JSON.Compat import qualified Dhall.Map import qualified Dhall.Optics import qualified Dhall.Parser @@ -536,7 +536,7 @@ dhallToJSON e0 = loop (Core.alphaNormalize (Core.normalize e0)) ys <- traverse inner (Foldable.toList xs) - return (Aeson.Object (HashMap.fromList ys)) + return (Aeson.Object (JSON.Compat.objectFromList ys)) outer (Core.App (Core.Field (V 0) (FA "number")) (Core.DoubleLit (DhallDouble n))) = return (Aeson.toJSON n) outer (Core.App (Core.Field (V 0) (FA "string")) (Core.TextLit (Core.Chunks [] text))) = @@ -581,7 +581,7 @@ dhallToJSON e0 = loop (Core.alphaNormalize (Core.normalize e0)) ys <- traverse inner (Foldable.toList xs) - return (Aeson.Object (HashMap.fromList ys)) + return (Aeson.Object (JSON.Compat.objectFromList ys)) outer (Core.App (Core.Field (V 0) (FA "double")) (Core.DoubleLit (DhallDouble n))) = return (Aeson.toJSON n) outer (Core.App (Core.Field (V 0) (FA "integer")) (Core.IntegerLit n)) = @@ -635,7 +635,7 @@ toOrderedList = omitNull :: Value -> Value omitNull (Object object) = Object fields where - fields =HashMap.filter (/= Null) (fmap omitNull object) + fields = JSON.Compat.filterObject (/= Null) (fmap omitNull object) omitNull (Array array) = Array (fmap omitNull array) omitNull (String string) = @@ -654,7 +654,7 @@ omitEmpty :: Value -> Value omitEmpty (Object object) = if null fields then Null else Object fields where - fields = HashMap.filter (/= Null) (fmap omitEmpty object) + fields = JSON.Compat.filterObject (/= Null) (fmap omitEmpty object) omitEmpty (Array array) = if null elems then Null else Array elems where diff --git a/dhall-json/src/Dhall/JSON/Compat.hs b/dhall-json/src/Dhall/JSON/Compat.hs new file mode 100644 index 000000000..2bdfbb989 --- /dev/null +++ b/dhall-json/src/Dhall/JSON/Compat.hs @@ -0,0 +1,79 @@ +{-# LANGUAGE CPP #-} + +-- | Compatibility helpers for the @aeson-2@ migration. +module Dhall.JSON.Compat ( + objectFromList + , mapToAscList + , filterObject + , lookupObject + , traverseObjectWithKey + , objectKeys + , textToKey + ) where + +import Data.Aeson (Object, Value) +import Data.Text (Text) + +#if MIN_VERSION_aeson(2,0,0) +import Data.Aeson.Key (Key) +import qualified Data.Aeson.Key as Key +import Data.Aeson.KeyMap (KeyMap) +import qualified Data.Aeson.KeyMap as KeyMap +import Data.Bifunctor (first) +#else +import Data.HashMap.Strict (HashMap) +import qualified Data.HashMap.Strict as HashMap +import qualified Data.List as List +#endif + +objectFromList :: [(Text, Value)] -> Object +#if MIN_VERSION_aeson(2,0,0) +objectFromList = KeyMap.fromList . map (first Key.fromText) +#else +objectFromList = HashMap.fromList +#endif + +filterObject :: (Value -> Bool) -> Object -> Object +#if MIN_VERSION_aeson(2,0,0) +filterObject = KeyMap.filter +#else +filterObject = HashMap.filter +#endif + +#if MIN_VERSION_aeson(2,0,0) +mapToAscList :: KeyMap a -> [(Text, a)] +mapToAscList = map (first Key.toText) . KeyMap.toAscList +#else +mapToAscList :: HashMap Text a -> [(Text, a)] +mapToAscList = List.sortOn fst . HashMap.toList +#endif + +lookupObject :: Text -> Object -> Maybe Value +#if MIN_VERSION_aeson(2,0,0) +lookupObject k = KeyMap.lookup (Key.fromText k) +#else +lookupObject = HashMap.lookup +#endif + +objectKeys :: Object -> [Text] +#if MIN_VERSION_aeson(2,0,0) +objectKeys = map (Key.toText) . KeyMap.keys +#else +objectKeys = HashMap.keys +#endif + +#if MIN_VERSION_aeson(2,0,0) +textToKey :: Text -> Key +textToKey = Key.fromText +#else +textToKey :: Text -> Text +textToKey = id +#endif + +#if MIN_VERSION_aeson(2,0,0) +traverseObjectWithKey :: Applicative f => (Key -> v1 -> f v2) -> KeyMap v1 -> f (KeyMap v2) +traverseObjectWithKey = KeyMap.traverseWithKey +#else +traverseObjectWithKey :: Applicative f => (Text -> v1 -> f v2) -> HashMap Text v1 -> f (HashMap Text v2) +traverseObjectWithKey = HashMap.traverseWithKey +#endif diff --git a/dhall-json/src/Dhall/JSONToDhall.hs b/dhall-json/src/Dhall/JSONToDhall.hs index 58a5db6d4..960911a60 100644 --- a/dhall-json/src/Dhall/JSONToDhall.hs +++ b/dhall-json/src/Dhall/JSONToDhall.hs @@ -381,17 +381,15 @@ import qualified Data.Aeson as Aeson import qualified Data.Aeson.Types as Aeson.Types import qualified Data.ByteString.Lazy.Char8 as BSL8 import qualified Data.Foldable as Foldable -import qualified Data.HashMap.Strict as HM -import qualified Data.List as List import qualified Data.Map import qualified Data.Map.Merge.Lazy as Data.Map.Merge -import qualified Data.Ord as Ord import qualified Data.Sequence as Seq import qualified Data.String import qualified Data.Text as Text import qualified Data.Vector as Vector import qualified Dhall.Core as D import qualified Dhall.Import +import qualified Dhall.JSON.Compat as JSON.Compat import qualified Dhall.Lint as Lint import qualified Dhall.Map as Map import qualified Dhall.Optics as Optics @@ -519,8 +517,8 @@ typeCheckSchemaExpr compileException expr = keyValMay :: Value -> Maybe (Text, Value) keyValMay (Aeson.Object o) = do - Aeson.String k <- HM.lookup "key" o - v <- HM.lookup "value" o + Aeson.String k <- JSON.Compat.lookupObject "key" o + v <- JSON.Compat.lookupObject "value" o return (k, v) keyValMay _ = Nothing @@ -532,7 +530,7 @@ keyValMay _ = Nothing -} inferSchema :: Value -> Schema inferSchema (Aeson.Object m) = - let convertMap = Data.Map.fromList . HM.toList + let convertMap = Data.Map.fromDistinctAscList . JSON.Compat.mapToAscList in (Record . RecordSchema . convertMap) (fmap inferSchema m) inferSchema (Aeson.Array xs) = @@ -832,13 +830,13 @@ dhallFromJSON (Conversion {..}) expressionType = -- object ~> Record loop jsonPath (D.Record r) v@(Aeson.Object o) - | extraKeys <- HM.keys o \\ Map.keys r + | extraKeys <- JSON.Compat.objectKeys o \\ Map.keys r , strictRecs && not (null extraKeys) = Left (UnhandledKeys extraKeys (D.Record r) v jsonPath) | otherwise = let f :: Text -> ExprX -> Either CompileError ExprX - f k t | Just value <- HM.lookup k o - = loop (Aeson.Types.Key k : jsonPath) t value + f k t | Just value <- JSON.Compat.lookupObject k o + = loop (Aeson.Types.Key (JSON.Compat.textToKey k) : jsonPath) t value | App D.Optional t' <- t = Right (App D.None t') | App D.List _ <- t @@ -853,7 +851,7 @@ dhallFromJSON (Conversion {..}) expressionType = | not noKeyValArr , os :: [Value] <- toList a , Just kvs <- traverse keyValMay os - = loop jsonPath t (Aeson.Object $ HM.fromList kvs) + = loop jsonPath t (Aeson.Object $ JSON.Compat.objectFromList kvs) | noKeyValArr = Left (NoKeyValArray t v) | otherwise @@ -866,7 +864,7 @@ dhallFromJSON (Conversion {..}) expressionType = , Just mapKey <- D.recordFieldValue <$> Map.lookup "mapKey" r , Just mapValue <- D.recordFieldValue <$> Map.lookup "mapValue" r = do - keyExprMap <- HM.traverseWithKey (\k child -> loop (Aeson.Types.Key k : jsonPath) mapValue child) o + keyExprMap <- JSON.Compat.traverseObjectWithKey (\k child -> loop (Aeson.Types.Key k : jsonPath) mapValue child) o toKey <- case mapKey of @@ -881,9 +879,9 @@ dhallFromJSON (Conversion {..}) expressionType = ] let records = - (fmap f . Seq.fromList . List.sort . HM.toList) keyExprMap + (fmap f . Seq.fromList . JSON.Compat.mapToAscList) keyExprMap - let typeAnn = if HM.null o then Just t else Nothing + let typeAnn = if null o then Just t else Nothing return (D.ListLit typeAnn records) | noKeyValMap @@ -972,10 +970,7 @@ dhallFromJSON (Conversion {..}) expressionType = elements = Seq.fromList (fmap inner - (List.sortBy - (Ord.comparing fst) - (HM.toList o) - ) + (JSON.Compat.mapToAscList o) ) elementType @@ -1061,10 +1056,7 @@ dhallFromJSON (Conversion {..}) expressionType = elements = Seq.fromList (fmap inner - (List.sortBy - (Ord.comparing fst) - (HM.toList o) - ) + (JSON.Compat.mapToAscList o) ) elementType diff --git a/dhall-nixpkgs/dhall-nixpkgs.cabal b/dhall-nixpkgs/dhall-nixpkgs.cabal index 715d3b48a..b1b7ffad4 100644 --- a/dhall-nixpkgs/dhall-nixpkgs.cabal +++ b/dhall-nixpkgs/dhall-nixpkgs.cabal @@ -17,7 +17,7 @@ Build-Type: Simple Executable dhall-to-nixpkgs Main-Is: Main.hs Build-Depends: base >= 4.11 && < 5 - , aeson >= 1.0.0.0 && < 1.6 + , aeson >= 1.0.0.0 && < 2.1 , bytestring < 0.12 , data-fix , dhall >= 1.32.0 && < 1.41 diff --git a/dhall-openapi/dhall-openapi.cabal b/dhall-openapi/dhall-openapi.cabal index 11a7f33f0..d115ad7a2 100644 --- a/dhall-openapi/dhall-openapi.cabal +++ b/dhall-openapi/dhall-openapi.cabal @@ -77,7 +77,7 @@ Library Ghc-Options: -Wall Build-Depends: base >= 4.11.0.0 && < 5 , - aeson >= 1.0.0.0 && < 1.6 , + aeson >= 1.0.0.0 && < 2.1 , containers >= 0.5.8.0 && < 0.7 , dhall >= 1.38.0 && < 1.41 , prettyprinter >= 1.7.0 && < 1.8 , diff --git a/dhall-yaml/dhall-yaml.cabal b/dhall-yaml/dhall-yaml.cabal index b35603dbe..9265a600c 100644 --- a/dhall-yaml/dhall-yaml.cabal +++ b/dhall-yaml/dhall-yaml.cabal @@ -34,7 +34,7 @@ Library HsYAML >= 0.2 && < 0.3 , HsYAML-aeson >= 0.2 && < 0.3 , base >= 4.11.0.0 && < 5 , - aeson >= 1.0.0.0 && < 1.6 , + aeson >= 1.0.0.0 && < 2.1 , bytestring < 0.12, dhall >= 1.31.0 && < 1.41, dhall-json >= 1.6.0 && < 1.8 , diff --git a/dhall/dhall.cabal b/dhall/dhall.cabal index 952d31726..566b081f1 100644 --- a/dhall/dhall.cabal +++ b/dhall/dhall.cabal @@ -473,7 +473,7 @@ Library Hs-Source-Dirs: src Build-Depends: base >= 4.11.0.0 && < 5 , - aeson >= 1.0.0.0 && < 1.6 , + aeson >= 1.0.0.0 && < 2.1 , aeson-pretty < 0.9 , ansi-terminal >= 0.6.3.1 && < 0.12, atomic-write >= 0.2.0.7 && < 0.3 ,