dhall-json 1.7.8 → 1.7.9
raw patch · 7 files changed
+132/−56 lines, 7 filesdep ~aesondep ~optparse-applicativedep ~prettyprinterPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: aeson, optparse-applicative, prettyprinter, text
API changes (from Hackage documentation)
Files
- CHANGELOG.md +4/−0
- dhall-json.cabal +4/−3
- json-to-dhall/Main.hs +5/−5
- src/Dhall/JSON.hs +25/−25
- src/Dhall/JSON/Compat.hs +79/−0
- src/Dhall/JSONToDhall.hs +13/−21
- tasty/Main.hs +2/−2
CHANGELOG.md view
@@ -1,3 +1,7 @@+1.7.9++* [Build against `aeson-2.0`](https://github.com/dhall-lang/dhall-haskell/pull/2315)+ 1.7.8 * [Add support for `Date` / `Time` / `TimeZone`](https://github.com/dhall-lang/dhall-haskell/pull/2247)
dhall-json.cabal view
@@ -1,5 +1,5 @@ Name: dhall-json-Version: 1.7.8+Version: 1.7.9 Cabal-Version: >=1.10 Build-Type: Simple License: BSD3@@ -38,7 +38,7 @@ 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,@@ -48,7 +48,7 @@ filepath < 1.5 , lens-family-core >= 1.0.0 && < 2.2 , optparse-applicative >= 0.14.0.0 && < 0.17,- prettyprinter >= 1.5.1 && < 1.8 ,+ prettyprinter >= 1.7.0 && < 1.8 , scientific >= 0.3.0.0 && < 0.4 , text >= 0.11.1.0 && < 1.3 , unordered-containers < 0.3 ,@@ -59,6 +59,7 @@ Dhall.JSON.Yaml Dhall.DhallToYaml.Main Other-Modules:+ Dhall.JSON.Compat Dhall.JSON.Util GHC-Options: -Wall Default-Language: Haskell2010
json-to-dhall/Main.hs view
@@ -15,15 +15,15 @@ import Options.Applicative (Parser, ParserInfo) import qualified Control.Exception-import qualified Data.Aeson as Aeson-import qualified Data.ByteString.Lazy.Char8 as ByteString+import qualified Data.Aeson as Aeson+import qualified Data.ByteString.Lazy.Char8 as ByteString import qualified Dhall.Core import qualified Dhall.Util import qualified GHC.IO.Encoding-import qualified Options.Applicative as Options-import qualified Paths_dhall_json as Meta+import qualified Options.Applicative as Options+import qualified Paths_dhall_json as Meta import qualified System.Exit-import qualified System.IO as IO+import qualified System.IO as IO -- --------------- -- Command options
src/Dhall/JSON.hs view
@@ -213,40 +213,40 @@ , CompileError(..) ) where -import Control.Applicative (empty, (<|>))-import Control.Exception (Exception, throwIO)-import Control.Monad (guard)-import Data.Aeson (ToJSON (..), Value (..))-import Data.Maybe (fromMaybe)-import Data.Text (Text)-import Data.Text.Prettyprint.Doc (Pretty)-import Data.Void (Void)-import Dhall.Core (Binding (..), DhallDouble (..), Expr)-import Dhall.Import (SemanticCacheMode (..))-import Dhall.JSON.Util (pattern FA, pattern V)-import Dhall.Map (Map)-import Options.Applicative (Parser)-import Prelude hiding (getContents)+import Control.Applicative (empty, (<|>))+import Control.Exception (Exception, throwIO)+import Control.Monad (guard)+import Data.Aeson (ToJSON (..), Value (..))+import Data.Maybe (fromMaybe)+import Data.Text (Text)+import Data.Void (Void)+import Dhall.Core (Binding (..), DhallDouble (..), Expr)+import Dhall.Import (SemanticCacheMode (..))+import Dhall.JSON.Util (pattern FA, pattern V)+import Dhall.Map (Map)+import Options.Applicative (Parser)+import Prelude hiding (getContents)+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.Aeson as Aeson+import qualified Data.Foldable as Foldable import qualified Data.List import qualified Data.Map import qualified Data.Ord import qualified Data.Text-import qualified Data.Text.Prettyprint.Doc.Render.Text as Pretty-import qualified Data.Vector as Vector-import qualified Dhall.Core as Core+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 import qualified Dhall.Pretty import qualified Dhall.TypeCheck import qualified Dhall.Util-import qualified Lens.Family as Lens+import qualified Lens.Family as Lens import qualified Options.Applicative+import qualified Prettyprinter.Render.Text as Pretty import qualified System.FilePath {-| This is the exception type for errors that might arise when translating@@ -536,7 +536,7 @@ 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 @@ 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 @@ 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 (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
+ src/Dhall/JSON/Compat.hs view
@@ -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
src/Dhall/JSONToDhall.hs view
@@ -381,17 +381,15 @@ 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 @@ 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 @@ -} 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 @@ -- 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 @@ | 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 @@ , 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 @@ ] 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 @@ elements = Seq.fromList (fmap inner- (List.sortBy- (Ord.comparing fst)- (HM.toList o)- )+ (JSON.Compat.mapToAscList o) ) elementType@@ -1061,10 +1056,7 @@ elements = Seq.fromList (fmap inner- (List.sortBy- (Ord.comparing fst)- (HM.toList o)- )+ (JSON.Compat.mapToAscList o) ) elementType
tasty/Main.hs view
@@ -3,8 +3,8 @@ module Main where -import Data.Void (Void)-import Test.Tasty (TestTree)+import Data.Void (Void)+import Test.Tasty (TestTree) import qualified Data.Aeson as Aeson import qualified Data.ByteString.Lazy