From b23a889f412a91f6e99d5b8ae341e6edaf10d47a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20L=C3=A4ndle?= <969523+alaendle@users.noreply.github.com> Date: Fri, 16 Dec 2022 16:36:07 +0000 Subject: [PATCH] Support for aeson 2.0.3 --- json-alt/json-alt.cabal | 5 +-- json-alt/package.yaml | 4 +- json-autotype/json-autotype.cabal | 44 +++++++++--------- json-autotype/package.yaml | 20 ++++----- .../Aeson/AutoType/CodeGen/HaskellFormat.hs | 5 ++- .../src/Data/Aeson/AutoType/Extract.hs | 13 +++--- .../src/Data/Aeson/AutoType/Pretty.hs | 8 +++- json-autotype/src/Data/Aeson/AutoType/Test.hs | 45 +++++++------------ json-autotype/src/Data/Aeson/AutoType/Util.hs | 7 --- json-autotype/test/TestExamples.hs | 14 +++--- json-autotype/test/gen/GenerateTestJSON.hs | 19 -------- stack.yaml | 5 +-- stack.yaml.lock | 17 +++---- 13 files changed, 82 insertions(+), 124 deletions(-) diff --git a/json-alt/json-alt.cabal b/json-alt/json-alt.cabal index 86a62a0..407f7b7 100644 --- a/json-alt/json-alt.cabal +++ b/json-alt/json-alt.cabal @@ -1,9 +1,8 @@ cabal-version: 1.12 --- This file has been generated from package.yaml by hpack version 0.34.4. +-- This file has been generated from package.yaml by hpack version 0.35.0. -- -- see: https://github.com/sol/hpack --- name: json-alt version: 1.0.1 @@ -64,6 +63,6 @@ library DeriveGeneric RecordWildCards build-depends: - aeson >=1.2.1 && <1.6 + aeson >=1.2.1 && <2.1 , base >=4.3 && <5 default-language: Haskell2010 diff --git a/json-alt/package.yaml b/json-alt/package.yaml index 8f6d36c..9ea8c7f 100644 --- a/json-alt/package.yaml +++ b/json-alt/package.yaml @@ -1,5 +1,5 @@ name: json-alt -version: '1.0.0' +version: '1.0.1' synopsis: Union 'alternative' or Either that has untagged JSON encoding. description: ! 'Parsing JSON with Aeson often requires decoding fields @@ -61,7 +61,7 @@ other-extensions: - RecordWildCards dependencies: - base >=4.3 && <5 -- aeson >=1.2.1 && <1.6 +- aeson >=1.2.1 && <2.1 library: exposed-modules: - Data.Aeson.AutoType.Alternative diff --git a/json-autotype/json-autotype.cabal b/json-autotype/json-autotype.cabal index 8ed6199..2ec58eb 100644 --- a/json-autotype/json-autotype.cabal +++ b/json-autotype/json-autotype.cabal @@ -1,6 +1,6 @@ cabal-version: 1.12 --- This file has been generated from package.yaml by hpack version 0.34.4. +-- This file has been generated from package.yaml by hpack version 0.35.0. -- -- see: https://github.com/sol/hpack @@ -111,20 +111,20 @@ library build-depends: GenericPretty ==1.2.* , QuickCheck >=2.4 && <3.0 - , aeson >=1.2.1 && <1.6 + , aeson >=1.2.1 && <2.1 , base >=4.9 && <5 , containers >=0.3 && <0.7 , data-default ==0.7.* , filepath >=1.3 && <1.5 - , hashable >=1.2 && <1.4 + , hashable >=1.2 && <1.5 , json-alt - , lens >=4.1 && <4.20 + , lens >=4.1 && <5.2 , mtl >=2.1 && <2.3 , pretty >=1.1 && <1.3 , process >=1.1 && <1.7 , run-haskell-module , scientific >=0.3 && <0.5 - , smallcheck >=1.0 && <1.2 + , smallcheck >=1.0 && <1.3 , template-haskell , text >=1.1 && <1.4 , uniplate ==1.6.* @@ -151,15 +151,15 @@ executable json-autotype RecordWildCards build-depends: GenericPretty ==1.2.* - , aeson >=1.2.1 && <1.6 + , aeson >=1.2.1 && <2.1 , base >=4.9 && <5 - , bytestring >=0.9 && <0.11 + , bytestring >=0.9 && <0.12 , containers >=0.3 && <0.7 , filepath >=1.3 && <1.5 - , hashable >=1.2 && <1.4 + , hashable >=1.2 && <1.5 , json-alt , json-autotype - , lens >=4.1 && <4.20 + , lens >=4.1 && <5.2 , mtl >=2.1 && <2.3 , optparse-applicative >=0.12 && <1.0 , pretty >=1.1 && <1.3 @@ -194,21 +194,21 @@ test-suite json-autotype-examples build-depends: GenericPretty ==1.2.* , QuickCheck >=2.4 && <3.0 - , aeson >=1.2.1 && <1.6 + , aeson >=1.2.1 && <2.1 , base >=4.9 && <5 , containers >=0.3 && <0.7 , directory >=1.1 && <1.4 , filepath >=1.3 && <1.5 - , hashable >=1.2 && <1.4 + , hashable >=1.2 && <1.5 , json-alt , json-autotype - , lens >=4.1 && <4.20 + , lens >=4.1 && <5.2 , mtl >=2.1 && <2.3 , optparse-applicative >=0.11 && <1.0 , pretty >=1.1 && <1.3 , process >=1.1 && <1.7 , scientific >=0.3 && <0.5 - , smallcheck >=1.0 && <1.2 + , smallcheck >=1.0 && <1.3 , template-haskell , text >=1.1 && <1.4 , uniplate ==1.6.* @@ -237,22 +237,22 @@ test-suite json-autotype-gen-test build-depends: GenericPretty ==1.2.* , QuickCheck >=2.4 && <3.0 - , aeson >=1.2.1 && <1.6 + , aeson >=1.2.1 && <2.1 , base >=4.9 && <5 - , bytestring >=0.9 && <0.11 + , bytestring >=0.9 && <0.12 , containers >=0.3 && <0.7 , directory >=1.1 && <1.4 , filepath >=1.3 && <1.5 - , hashable >=1.2 && <1.4 + , hashable >=1.2 && <1.5 , json-alt , json-autotype - , lens >=4.1 && <4.20 + , lens >=4.1 && <5.2 , mtl >=2.1 && <2.3 , optparse-applicative >=0.12 && <1.0 , pretty >=1.1 && <1.3 , process >=1.1 && <1.7 , scientific >=0.3 && <0.5 - , smallcheck >=1.0 && <1.2 + , smallcheck >=1.0 && <1.3 , template-haskell , text >=1.1 && <1.4 , uniplate ==1.6.* @@ -281,20 +281,20 @@ test-suite json-autotype-qc-test build-depends: GenericPretty ==1.2.* , QuickCheck >=2.4 && <3.0 - , aeson >=1.2.1 && <1.6 + , aeson >=1.2.1 && <2.1 , base >=4.9 && <5 , containers >=0.3 && <0.7 , filepath >=1.3 && <1.5 - , hashable >=1.2 && <1.4 + , hashable >=1.2 && <1.5 , json-alt , json-autotype - , lens >=4.1 && <4.20 + , lens >=4.1 && <5.2 , mtl >=2.1 && <2.3 , optparse-applicative >=0.12 && <1.0 , pretty >=1.1 && <1.3 , process >=1.1 && <1.7 , scientific >=0.3 && <0.5 - , smallcheck >=1.0 && <1.2 + , smallcheck >=1.0 && <1.3 , template-haskell , text >=1.1 && <1.4 , uniplate ==1.6.* diff --git a/json-autotype/package.yaml b/json-autotype/package.yaml index 5c59f70..547b930 100644 --- a/json-autotype/package.yaml +++ b/json-autotype/package.yaml @@ -1,5 +1,5 @@ name: json-autotype -version: "3.1.2" +version: "3.1.3" synopsis: Automatic type declaration for JSON input data description: | Generates datatype declarations with Aeson''s ''Data.Aeson.FromJSON'' @@ -75,11 +75,11 @@ other-extensions: dependencies: - base >=4.9 && <5 - GenericPretty >=1.2 && <1.3 -- aeson >=1.2.1 && <1.6 +- aeson >=1.2.1 && <2.1 - containers >=0.3 && <0.7 - filepath >=1.3 && <1.5 -- hashable >=1.2 && <1.4 -- lens >=4.1 && <4.20 +- hashable >=1.2 && <1.5 +- lens >=4.1 && <5.2 - mtl >=2.1 && <2.3 - pretty >=1.1 && <1.3 - process >=1.1 && <1.7 @@ -109,7 +109,7 @@ library: - Data.Aeson.AutoType.Nested dependencies: - data-default >=0.7 && <0.8 - - smallcheck >=1.0 && <1.2 + - smallcheck >=1.0 && <1.3 - QuickCheck >=2.4 && <3.0 - run-haskell-module executables: @@ -119,7 +119,7 @@ executables: - app - common dependencies: - - bytestring >=0.9 && <0.11 + - bytestring >=0.9 && <0.12 - optparse-applicative >=0.12 && <1.0 - yaml >=0.8 && <0.12 - json-autotype @@ -132,7 +132,7 @@ tests: dependencies: - directory >=1.1 && <1.4 - optparse-applicative >=0.11 && <1.0 - - smallcheck >=1.0 && <1.2 + - smallcheck >=1.0 && <1.3 - QuickCheck >=2.4 && <3.0 - json-autotype json-autotype-qc-test: @@ -141,7 +141,7 @@ tests: - test/qc - common dependencies: - - smallcheck >=1.0 && <1.2 + - smallcheck >=1.0 && <1.3 - optparse-applicative >=0.12 && <1.0 - QuickCheck >=2.4 && <3.0 - json-autotype @@ -151,10 +151,10 @@ tests: - test/gen - common dependencies: - - bytestring >=0.9 && <0.11 + - bytestring >=0.9 && <0.12 - directory >=1.1 && <1.4 - optparse-applicative >=0.12 && <1.0 - - smallcheck >=1.0 && <1.2 + - smallcheck >=1.0 && <1.3 - QuickCheck >=2.4 && <3.0 - json-autotype stability: stable diff --git a/json-autotype/src/Data/Aeson/AutoType/CodeGen/HaskellFormat.hs b/json-autotype/src/Data/Aeson/AutoType/CodeGen/HaskellFormat.hs index a236cba..a605fbf 100644 --- a/json-autotype/src/Data/Aeson/AutoType/CodeGen/HaskellFormat.hs +++ b/json-autotype/src/Data/Aeson/AutoType/CodeGen/HaskellFormat.hs @@ -89,8 +89,9 @@ makeFromJSON identifier contents = makeParser identifier _ = Text.unwords [identifier, "<$>", inner] inner = " <*> " `Text.intercalate` map takeValue contents - takeValue (jsonId, _, ty, True ) = Text.concat ["v .:? \"", jsonId, "\""] -- nullable types - takeValue (jsonId, _, _ , False) = Text.concat ["v .: \"", jsonId, "\""] + takeValue (jsonId, _, ty, True ) = Text.concat ["v .:? ", escapeText jsonId] -- nullable types + takeValue (jsonId, _, _ , False) = Text.concat ["v .: ", escapeText jsonId] + escapeText = Text.pack . show . Text.unpack -- Contents example for wrapFromJSON: -- " <$> --" v .: "hexValue" <*> diff --git a/json-autotype/src/Data/Aeson/AutoType/Extract.hs b/json-autotype/src/Data/Aeson/AutoType/Extract.hs index 2e636e7..221a6fb 100644 --- a/json-autotype/src/Data/Aeson/AutoType/Extract.hs +++ b/json-autotype/src/Data/Aeson/AutoType/Extract.hs @@ -8,6 +8,7 @@ module Data.Aeson.AutoType.Extract(valueSize, valueTypeSize, import Control.Arrow ((&&&)) import Control.Exception (assert) import Data.Aeson.AutoType.Type +import Data.Aeson.KeyMap (toHashMapText) import qualified Data.Graph as Graph import qualified Data.HashMap.Strict as Map import Data.HashMap.Strict (HashMap) @@ -31,7 +32,7 @@ valueSize (Bool _) = 1 valueSize (Number _) = 1 valueSize (String _) = 1 valueSize (Array a) = V.foldl' (+) 1 $ V.map valueSize a -valueSize (Object o) = (1+) . sum . map valueSize . Map.elems $ o +valueSize (Object o) = (1+) . sum . map valueSize . Map.elems $ toHashMapText o -- | Compute total size of the type of the @Value@. -- For: @@ -45,7 +46,7 @@ valueTypeSize (Bool _) = 1 valueTypeSize (Number _) = 1 valueTypeSize (String _) = 1 valueTypeSize (Array a) = (1+) . V.foldl' max 0 $ V.map valueTypeSize a -valueTypeSize (Object o) = (1+) . sum . map valueTypeSize . Map.elems $ o +valueTypeSize (Object o) = (1+) . sum . map valueTypeSize . Map.elems $ toHashMapText o -- | Compute total depth of the value. -- For: @@ -57,13 +58,13 @@ valueDepth (Bool _) = 1 valueDepth (Number _) = 1 valueDepth (String _) = 1 valueDepth (Array a) = (1+) . V.foldl' max 0 $ V.map valueDepth a -valueDepth (Object o) = (1+) . maximum . (0:) . map valueDepth . Map.elems $ o +valueDepth (Object o) = (1+) . maximum . (0:) . map valueDepth . Map.elems $ toHashMapText o -- | Check if a number is integral, or floating point -- | Extract @Type@ from the JSON @Value@. -- Unifying types of array elements, if necessary. extractType :: Value -> Type -extractType (Object o) = TObj $ Dict $ Map.map extractType o +extractType (Object o) = TObj $ Dict $ Map.map extractType $ toHashMapText o extractType Null = TNull extractType (Bool _) = TBool extractType (Number n) | isInteger n = TInt @@ -86,11 +87,11 @@ typeCheck (Number _) TDouble = True typeCheck (Array elts) (TArray eltType) = (`typeCheck` eltType) `all` V.toList elts typeCheck (Object d) (TObj e ) = typeCheckKey `all` keysOfBoth where - typeCheckKey k = getValue k d `typeCheck` get k e + typeCheckKey k = getValue k (toHashMapText d) `typeCheck` get k e getValue :: Text -> HashMap Text Value -> Value getValue = Map.lookupDefault Null keysOfBoth :: [Text] - keysOfBoth = Set.toList $ Set.fromList (Map.keys d) `Set.union` keys e + keysOfBoth = Set.toList $ Set.fromList (Map.keys $ toHashMapText d) `Set.union` keys e typeCheck _ (TLabel _ ) = error "Cannot typecheck labels without environment!" typeCheck {-a-} _ _ {-b-} = {-trace msg $-} False where diff --git a/json-autotype/src/Data/Aeson/AutoType/Pretty.hs b/json-autotype/src/Data/Aeson/AutoType/Pretty.hs index 035e99e..9223710 100644 --- a/json-autotype/src/Data/Aeson/AutoType/Pretty.hs +++ b/json-autotype/src/Data/Aeson/AutoType/Pretty.hs @@ -1,7 +1,5 @@ {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE OverloadedStrings #-} -{-# LANGUAGE DeriveGeneric #-} -{-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE ViewPatterns #-} {-# LANGUAGE CPP #-} {-# OPTIONS_GHC -fno-warn-orphans #-} @@ -13,6 +11,8 @@ module Data.Aeson.AutoType.Pretty() where import qualified Data.HashMap.Strict as Hash import Data.HashMap.Strict(HashMap) import Data.Aeson +import Data.Aeson.KeyMap(KeyMap, toHashMapText) +import Data.Aeson.Key import qualified Data.Text as Text import Data.Text (Text) import Data.Set as Set(Set, toList) @@ -35,6 +35,10 @@ instance (Out a) => Out (Vector a) where instance Out Value +instance (Out a) => Out (KeyMap a) where + doc (toHashMapText -> s) = doc s + docPrec _ = doc + instance (Out a) => Out (Set a) where doc (Set.toList -> s) = "{" <+> doc s <+> "}" docPrec _ = doc diff --git a/json-autotype/src/Data/Aeson/AutoType/Test.hs b/json-autotype/src/Data/Aeson/AutoType/Test.hs index bd79926..89584dc 100644 --- a/json-autotype/src/Data/Aeson/AutoType/Test.hs +++ b/json-autotype/src/Data/Aeson/AutoType/Test.hs @@ -9,20 +9,21 @@ import Data.Aeson.AutoType.Pretty () -- Generic instance for import Control.Applicative ((<$>), (<*>)) import Data.Aeson +import Data.Aeson.Key +import qualified Data.Aeson.KeyMap as KV (KeyMap(..), fromHashMapText, fromMapText, toMapText, fromHashMap, toHashMapText, fromList, toList) import Data.Function (on) import Data.Hashable (Hashable) -import Data.Generics.Uniplate.Data import Data.List import Data.Scientific import qualified Data.Text as Text import Data.Text (Text) import qualified Data.Vector as V import qualified Data.HashMap.Strict as Map -import GHC.Generics import Test.QuickCheck.Arbitrary import Test.QuickCheck import Test.SmallCheck.Series +import Data.Functor ((<&>)) instance Arbitrary Text where arbitrary = Text.pack <$> sized (`vectorOf` alphabetic) @@ -42,34 +43,20 @@ makeMap = Map.fromList . nubBy ((==) `on` fst) . sortBy (compare `on` fst) -instance Arbitrary Scientific where - arbitrary = scientific <$> arbitrary <*> arbitrary - --- TODO: top value has to be complex: Object or Array --- TODO: how to accumulate cost when generating the series? -instance Arbitrary Value where - arbitrary = sized arb - where - arb n | n < 0 = error "Negative size!" - arb 0 = return Null - arb 1 = oneof simpleGens - arb i = oneof $ complexGens (i - 1) ++ simpleGens - simpleGens = [Number <$> arbitrary - ,Bool <$> arbitrary - ,String <$> arbitrary] - shrink = concatMap simpleShrink - . universe - --- | Transformation to shrink top level of @Value@, doesn't consider nested sub-@Value@s. -simpleShrink :: Value -> [Value] -simpleShrink (Array a) = map (Array . V.fromList) $ shrink $ V.toList a -simpleShrink (Object o) = map (Object . Map.fromList) $ shrink $ Map.toList o -simpleShrink _ = [] -- Nothing for simple objects +-- | Replace all keys because the Aeson Arbitrary instance generates characters that couldn't be used as haskell identifiers. +translateKeys :: Value -> Gen Value +translateKeys (Array a) = Array <$> mapM translateKeys a +translateKeys (Object o) = do + hm <- KV.toList <$> mapM translateKeys o + let x = fmap (\(k,v) -> (arbitrary,v)) hm + y <- mapM (\(g,v) -> g >>= \k -> pure (fromText k,v)) x + pure $ Object $ KV.fromList y +translateKeys x = pure x -- | Generator for compound @Value@s complexGens :: Int -> [Gen Value] -complexGens i = [Object . Map.fromList <$> resize i arbitrary, - Array <$> resize i arbitrary] +complexGens i = [resize i arbitrary >>= translateKeys . Object, + resize i arbitrary >>= translateKeys . Array] -- | Arbitrary JSON (must start with Object or Array.) arbitraryTopValue :: Gen Value @@ -85,8 +72,8 @@ instance Monad m => Serial m Scientific where instance Serial m a => Serial m (V.Vector a) where series = newtypeCons V.fromList -instance Serial m v => Serial m (Map.HashMap Text v) where - series = newtypeCons makeMap +instance Serial m v => Serial m (KV.KeyMap v) where + series = newtypeCons (KV.fromHashMapText . makeMap) -- This one is generated with Generics and instances above instance Monad m => Serial m Value diff --git a/json-autotype/src/Data/Aeson/AutoType/Util.hs b/json-autotype/src/Data/Aeson/AutoType/Util.hs index db99e3e..dc2296d 100644 --- a/json-autotype/src/Data/Aeson/AutoType/Util.hs +++ b/json-autotype/src/Data/Aeson/AutoType/Util.hs @@ -5,8 +5,6 @@ module Data.Aeson.AutoType.Util( withFileOrHandle , withFileOrDefaultHandle ) where -import Data.Hashable -import qualified Data.Set as Set import System.IO (withFile, IOMode(..), Handle, stdin, stdout) -- | Generic function for opening file if the filename is not empty nor "-", @@ -27,8 +25,3 @@ withFileOrDefaultHandle "-" otherMode _ = error $ "Incompatible ++ show otherMode ++ ") for `-` in withFileOrDefaultHandle." withFileOrDefaultHandle filename ioMode action = withFile filename ioMode action - --- Missing instances -instance Hashable a => Hashable (Set.Set a) where - hashWithSalt = Set.foldr (flip hashWithSalt) - diff --git a/json-autotype/test/TestExamples.hs b/json-autotype/test/TestExamples.hs index 5da565e..f87cbc6 100644 --- a/json-autotype/test/TestExamples.hs +++ b/json-autotype/test/TestExamples.hs @@ -13,6 +13,8 @@ import System.Environment as Env import System.Process (rawSystem) import Data.Aeson.AutoType.CodeGen(runModule, Lang(Haskell)) import Data.Aeson ( Result, Object, FromJSON, Value(Null,Number), (.:?) ) +import Data.Aeson.Key (fromText) +import Data.Aeson.KeyMap (fromHashMapText) import Data.Aeson.Types ( Parser, parse ) import Data.Text ( Text, pack ) import Data.HashMap.Lazy ( singleton, empty ) @@ -82,16 +84,16 @@ runAutotype source arguments = do verifyAesonOperators :: IO () verifyAesonOperators = do - parseTest (singleton (pack "foo") (Number 1)) - parseTest (singleton (pack "foo") Null ) - parseTest (singleton (pack "bar") Null ) - parseTest empty + parseTest (fromHashMapText $ singleton (pack "foo") (Number 1)) + parseTest (fromHashMapText $ singleton (pack "foo") Null ) + parseTest (fromHashMapText $ singleton (pack "bar") Null ) + parseTest $ fromHashMapText empty (.:??) :: FromJSON a => Object -> Text -> Parser (Maybe a) -o .:?? val = fmap join (o .:? val) +o .:?? val = fmap join (o .:? fromText val) parseTest :: Object -> IO () parseTest o = unless (r1 == r2) (fail (show r1 ++ " /= " ++ show r2)) where r1, r2 :: Result (Maybe Int) - r1 = parse (.:? (pack "foo")) o + r1 = parse (.:? fromText(pack "foo")) o r2 = parse (.:?? (pack "foo")) o diff --git a/json-autotype/test/gen/GenerateTestJSON.hs b/json-autotype/test/gen/GenerateTestJSON.hs index 31068f8..4be8130 100644 --- a/json-autotype/test/gen/GenerateTestJSON.hs +++ b/json-autotype/test/gen/GenerateTestJSON.hs @@ -109,25 +109,6 @@ removeDuplicates list = filterM checkDup list `evalState` Set.empty State.put $ x `Set.insert` seen return True --- TODO: check for generic Ord? -instance Ord Value where - Null `compare` Null = EQ - Null `compare` _ = LT - _ `compare` Null = GT - (Bool a) `compare` (Bool b) = a `compare` b - (Bool a) `compare` _ = LT - _ `compare` (Bool b) = GT - (Number a) `compare` (Number b) = a `compare` b - (Number _) `compare` _ = LT - _ `compare` (Number _) = GT - (String a) `compare` (String b) = a `compare` b - (String a) `compare` _ = LT - _ `compare` (String b) = GT - (Array a) `compare` (Array b) = a `compare` b - (Array a) `compare` _ = LT - _ `compare` (Array b) = GT - (Object a) `compare` (Object b) = Map.toList a `compare` Map.toList b - -- | Take a set of JSON input filenames, Haskell output filename, and generate module parsing these JSON files. generateTestJSONs :: Options -> IO () generateTestJSONs Options {tyOpts=TyOptions {..}, diff --git a/stack.yaml b/stack.yaml index 95ddc72..e345c0d 100644 --- a/stack.yaml +++ b/stack.yaml @@ -1,13 +1,10 @@ -resolver: lts-12.26 +resolver: lts-20.4 packages: - json-autotype - json-alt - run-haskell-module -extra-deps: - - GenericPretty-1.2.2 - flags: {} extra-package-dbs: [] diff --git a/stack.yaml.lock b/stack.yaml.lock index 4733614..7d9790a 100644 --- a/stack.yaml.lock +++ b/stack.yaml.lock @@ -3,17 +3,10 @@ # For more information, please see the documentation at: # https://docs.haskellstack.org/en/stable/lock_files -packages: -- completed: - hackage: GenericPretty-1.2.2@sha256:65fd4aeedc326c356a866169e3511ef14fd6b3284ff9c29273f8a3b90dc9e5eb,3698 - pantry-tree: - size: 719 - sha256: 1e9f020c022023084c2a0e1650d21ea7cd87fe9a97a9f21c691b664d65142250 - original: - hackage: GenericPretty-1.2.2 +packages: [] snapshots: - completed: - size: 509471 - url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/12/26.yaml - sha256: 95f014df58d0679b1c4a2b7bf2b652b61da8d30de5f571abb0d59015ef678646 - original: lts-12.26 + sha256: 3770dfd79f5aed67acdcc65c4e7730adddffe6dba79ea723cfb0918356fc0f94 + size: 648660 + url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/20/4.yaml + original: lts-20.4