hpack 0.34.4 → 0.34.5
raw patch · 30 files changed
+137/−90 lines, 30 filesdep ~aesonPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: aeson
API changes (from Hackage documentation)
+ Hpack.Yaml: data Key
- Hpack.Yaml: (.:) :: FromValue a => Object -> Text -> Parser a
+ Hpack.Yaml: (.:) :: FromValue a => Object -> Key -> Parser a
- Hpack.Yaml: (.:?) :: FromValue a => Object -> Text -> Parser (Maybe a)
+ Hpack.Yaml: (.:?) :: FromValue a => Object -> Key -> Parser (Maybe a)
- Hpack.Yaml: traverseObject :: (Value -> Parser a) -> Object -> Parser [(Text, a)]
+ Hpack.Yaml: traverseObject :: (Value -> Parser a) -> Object -> Parser [(Key, a)]
- Hpack.Yaml: type Object = HashMap Text Value
+ Hpack.Yaml: type Object = KeyMap Value
Files
- CHANGELOG.md +3/−0
- hpack.cabal +8/−2
- src/Data/Aeson/Config/FromValue.hs +14/−14
- src/Data/Aeson/Config/Key.hs +24/−0
- src/Data/Aeson/Config/KeyMap.hs +8/−0
- src/Data/Aeson/Config/Parser.hs +11/−11
- src/Data/Aeson/Config/Types.hs +2/−2
- src/Hpack.hs +2/−1
- src/Hpack/CabalFile.hs +2/−2
- src/Hpack/Config.hs +12/−18
- src/Hpack/Defaults.hs +2/−1
- src/Hpack/License.hs +1/−1
- src/Hpack/Module.hs +2/−3
- src/Hpack/Options.hs +2/−2
- src/Hpack/Render.hs +3/−3
- src/Hpack/Render/Dsl.hs +1/−2
- src/Hpack/Render/Hints.hs +2/−2
- src/Hpack/Syntax/BuildTools.hs +2/−4
- src/Hpack/Syntax/Defaults.hs +3/−2
- src/Hpack/Syntax/Dependencies.hs +2/−3
- src/Hpack/Syntax/DependencyVersion.hs +4/−4
- src/Hpack/Syntax/Git.hs +2/−1
- src/Hpack/Syntax/ParseDependencies.hs +4/−3
- src/Hpack/Util.hs +2/−3
- src/Hpack/Yaml.hs +2/−1
- src/Imports.hs +11/−0
- src/Path.hs +2/−1
- test/Helper.hs +4/−2
- test/Hpack/ConfigSpec.hs +0/−1
- test/Hpack/RenderSpec.hs +0/−1
CHANGELOG.md view
@@ -1,3 +1,6 @@+## Changes in 0.34.5+ - Compatibility with `aeson-2.*`+ ## Changes in 0.34.4 - Render `default-extensions` / `other-extensions` line-separated - Compatibility with `Cabal-3.4.0.0`
hpack.cabal view
@@ -1,11 +1,11 @@ cabal-version: 1.12 --- This file has been generated from package.yaml by hpack version 0.34.3.+-- This file has been generated from package.yaml by hpack version 0.34.4. -- -- see: https://github.com/sol/hpack name: hpack-version: 0.34.4+version: 0.34.5 synopsis: A modern format for Haskell packages description: See README at <https://github.com/sol/hpack#readme> category: Development@@ -56,6 +56,8 @@ Hpack.Yaml other-modules: Data.Aeson.Config.FromValue+ Data.Aeson.Config.Key+ Data.Aeson.Config.KeyMap Data.Aeson.Config.Parser Data.Aeson.Config.Types Data.Aeson.Config.Util@@ -75,6 +77,7 @@ Hpack.Syntax.ParseDependencies Hpack.Utf8 Hpack.Util+ Imports Path Paths_hpack default-language: Haskell2010@@ -176,6 +179,8 @@ Hpack.UtilSpec HpackSpec Data.Aeson.Config.FromValue+ Data.Aeson.Config.Key+ Data.Aeson.Config.KeyMap Data.Aeson.Config.Parser Data.Aeson.Config.Types Data.Aeson.Config.Util@@ -199,6 +204,7 @@ Hpack.Utf8 Hpack.Util Hpack.Yaml+ Imports Path Paths_hpack default-language: Haskell2010
src/Data/Aeson/Config/FromValue.hs view
@@ -34,23 +34,23 @@ , (.:) , (.:?) +, Key , Value(..) , Object , Array ) where -import GHC.Generics+import Imports -import Control.Monad-import Control.Applicative+import GHC.Generics -import Data.Bifunctor import Data.Map.Lazy (Map) import qualified Data.Map.Lazy as Map-import Data.Text (Text)-import qualified Data.Text as T import qualified Data.Vector as V-import qualified Data.HashMap.Strict as HashMap+import Data.Aeson.Config.Key (Key)+import qualified Data.Aeson.Config.Key as Key+import qualified Data.Aeson.Config.KeyMap as KeyMap+ import Data.Aeson.Types (FromJSON(..)) import Data.Aeson.Config.Util@@ -61,10 +61,10 @@ decodeValue :: FromValue a => Value -> Result a decodeValue = runParser fromValue -(.:) :: FromValue a => Object -> Text -> Parser a+(.:) :: FromValue a => Object -> Key -> Parser a (.:) = explicitParseField fromValue -(.:?) :: FromValue a => Object -> Text -> Parser (Maybe a)+(.:?) :: FromValue a => Object -> Key -> Parser (Maybe a) (.:?) = explicitParseFieldMaybe fromValue class FromValue a where@@ -105,11 +105,11 @@ instance FromValue a => FromValue (Map String a) where fromValue = withObject $ \ o -> do xs <- traverseObject fromValue o- return $ Map.fromList (map (first T.unpack) xs)+ return $ Map.fromList (map (first Key.toString) xs) -traverseObject :: (Value -> Parser a) -> Object -> Parser [(Text, a)]+traverseObject :: (Value -> Parser a) -> Object -> Parser [(Key, a)] traverseObject f o = do- forM (HashMap.toList o) $ \ (name, value) ->+ forM (KeyMap.toList o) $ \ (name, value) -> (,) name <$> f value <?> Key name instance (FromValue a, FromValue b) => FromValue (a, b) where@@ -143,7 +143,7 @@ instance {-# OVERLAPPING #-} (Selector sel, FromValue a) => GenericDecode (S1 sel (Rec0 (Maybe a))) where genericDecode = accessFieldWith (.:?) -accessFieldWith :: forall sel a p. Selector sel => (Object -> Text -> Parser a) -> Options -> Value -> Parser (S1 sel (Rec0 a) p)-accessFieldWith op Options{..} v = M1 . K1 <$> withObject (`op` T.pack label) v+accessFieldWith :: forall sel a p. Selector sel => (Object -> Key -> Parser a) -> Options -> Value -> Parser (S1 sel (Rec0 a) p)+accessFieldWith op Options{..} v = M1 . K1 <$> withObject (`op` Key.fromString label) v where label = optionsRecordSelectorModifier $ selName (undefined :: S1 sel (Rec0 a) p)
+ src/Data/Aeson/Config/Key.hs view
@@ -0,0 +1,24 @@+{-# LANGUAGE CPP #-}+module Data.Aeson.Config.Key (module Data.Aeson.Config.Key) where++#if MIN_VERSION_aeson(2,0,0)++import Data.Aeson.Key as Data.Aeson.Config.Key++#else++import Data.Text (Text)+import qualified Data.Text as T++type Key = Text++toText :: Key -> Text+toText = id++toString :: Key -> String+toString = T.unpack++fromString :: String -> Key+fromString = T.pack++#endif
+ src/Data/Aeson/Config/KeyMap.hs view
@@ -0,0 +1,8 @@+{-# LANGUAGE CPP #-}+module Data.Aeson.Config.KeyMap (module KeyMap) where++#if MIN_VERSION_aeson(2,0,0)+import Data.Aeson.KeyMap as KeyMap+#else+import Data.HashMap.Strict as KeyMap+#endif
src/Data/Aeson/Config/Parser.hs view
@@ -30,19 +30,19 @@ , formatPath ) where -import Control.Monad-import Control.Applicative+import Imports+ import qualified Control.Monad.Fail as Fail import Control.Monad.Trans.Class import Control.Monad.Trans.Writer-import Data.Monoid ((<>)) import Data.Scientific import Data.Set (Set, notMember) import qualified Data.Set as Set-import Data.Text (Text) import qualified Data.Text as T import qualified Data.Vector as V-import qualified Data.HashMap.Strict as HashMap+import Data.Aeson.Config.Key (Key)+import qualified Data.Aeson.Config.Key as Key+import qualified Data.Aeson.Config.KeyMap as KeyMap import Data.Aeson.Types (Value(..), Object, Array) import qualified Data.Aeson.Types as Aeson import Data.Aeson.Internal (IResult(..), iparse)@@ -61,7 +61,7 @@ fromAesonPathElement :: Aeson.JSONPathElement -> JSONPathElement fromAesonPathElement e = case e of- Aeson.Key k -> Key k+ Aeson.Key k -> Key (Key.toText k) Aeson.Index n -> Index n newtype Parser a = Parser {unParser :: WriterT (Set JSONPath) Aeson.Parser a}@@ -96,7 +96,7 @@ Bool _ -> return () Null -> return () Object o -> do- forM_ (HashMap.toList o) $ \ (k, v) -> do+ forM_ (KeyMap.toList o) $ \ (Key.toText -> k, v) -> do unless ("_" `T.isPrefixOf` k) $ do go (Key k : path) v Array xs -> do@@ -115,13 +115,13 @@ getPath :: Parser JSONPath getPath = liftParser $ Aeson.parserCatchError empty $ \ path _ -> return (fromAesonPath path) -explicitParseField :: (Value -> Parser a) -> Object -> Text -> Parser a-explicitParseField p o key = case HashMap.lookup key o of+explicitParseField :: (Value -> Parser a) -> Object -> Key -> Parser a+explicitParseField p o key = case KeyMap.lookup key o of Nothing -> fail $ "key " ++ show key ++ " not present" Just v -> p v <?> Aeson.Key key -explicitParseFieldMaybe :: (Value -> Parser a) -> Object -> Text -> Parser (Maybe a)-explicitParseFieldMaybe p o key = case HashMap.lookup key o of+explicitParseFieldMaybe :: (Value -> Parser a) -> Object -> Key -> Parser (Maybe a)+explicitParseFieldMaybe p o key = case KeyMap.lookup key o of Nothing -> pure Nothing Just v -> Just <$> p v <?> Aeson.Key key
src/Data/Aeson/Config/Types.hs view
@@ -4,10 +4,10 @@ {-# LANGUAGE GeneralizedNewtypeDeriving #-} module Data.Aeson.Config.Types where -import Data.Semigroup (Semigroup(..))+import Imports+ import Data.Bitraversable import Data.Bifoldable-import Data.Bifunctor import Data.Aeson.Config.FromValue
src/Hpack.hs view
@@ -42,7 +42,8 @@ #endif ) where -import Control.Monad+import Imports+ import Data.Version (Version) import qualified Data.Version as Version import System.FilePath
src/Hpack/CabalFile.hs view
@@ -3,8 +3,8 @@ {-# LANGUAGE ViewPatterns #-} module Hpack.CabalFile where -import Control.Monad-import Data.List+import Imports+ import Data.Maybe import Data.Version (Version(..)) import qualified Data.Version as Version
src/Hpack/Config.hs view
@@ -80,21 +80,15 @@ #endif ) where -import Control.Applicative-import Control.Arrow ((>>>), (&&&))-import Control.Monad+import Imports+ import Data.Either-import Data.Bifunctor import Data.Bitraversable import Data.Map.Lazy (Map) import qualified Data.Map.Lazy as Map-import qualified Data.HashMap.Lazy as HashMap-import Data.List ((\\), sortBy, intercalate)+import qualified Data.Aeson.Config.KeyMap as KeyMap import Data.Maybe-import Data.Semigroup (Semigroup(..)) import Data.Ord-import Data.String-import Data.Text (Text) import qualified Data.Text as T import Data.Text.Encoding (decodeUtf8) import Data.Scientific (Scientific)@@ -404,12 +398,12 @@ } traverseConditionalSection :: Traversal_ ConditionalSection-traverseConditionalSection t@Traverse{..} = \ case+traverseConditionalSection t = \ case ThenElseConditional c -> ThenElseConditional <$> bitraverse (traverseThenElse t) return c FlatConditional c -> FlatConditional <$> bitraverse (traverseWithCommonOptions t) return c traverseThenElse :: Traversal_ ThenElse-traverseThenElse t@Traverse{..} c@ThenElse{..} = do+traverseThenElse t c@ThenElse{..} = do then_ <- traverseWithCommonOptions t thenElseThen else_ <- traverseWithCommonOptions t thenElseElse return c{thenElseThen = then_, thenElseElse = else_}@@ -434,10 +428,10 @@ | otherwise = FlatConditional <$> fromValue v where giveHint = case v of- Object o -> case (,,) <$> HashMap.lookup "then" o <*> HashMap.lookup "else" o <*> HashMap.lookup "condition" o of+ Object o -> case (,,) <$> KeyMap.lookup "then" o <*> KeyMap.lookup "else" o <*> KeyMap.lookup "condition" o of Just (Object then_, Object else_, String condition) -> do- when (HashMap.null then_) $ "then" `emptyTryInstead` flatElse- when (HashMap.null else_) $ "else" `emptyTryInstead` flatThen+ when (KeyMap.null then_) $ "then" `emptyTryInstead` flatElse+ when (KeyMap.null else_) $ "else" `emptyTryInstead` flatThen where flatThen = flatConditional condition then_ flatElse = flatConditional (negate_ condition) else_@@ -446,7 +440,7 @@ negate_ condition = "!(" <> condition <> ")" - flatConditional condition sect = object [("when" .= HashMap.insert "condition" (String condition) sect)]+ flatConditional condition sect = object [("when" .= KeyMap.insert "condition" (String condition) sect)] emptyTryInstead :: String -> Value -> Parser () emptyTryInstead name sect = do@@ -463,8 +457,8 @@ (_, "condition") -> GT _ -> compare a b -hasKey :: Text -> Value -> Bool-hasKey key (Object o) = HashMap.member key o+hasKey :: Key -> Value -> Bool+hasKey key (Object o) = KeyMap.member key o hasKey _ _ = False newtype Condition = Condition {@@ -599,7 +593,7 @@ } deriving (Generic, FromValue) traversePackageConfig :: Traversal PackageConfig-traversePackageConfig t@Traverse{..} p@PackageConfig{..} = do+traversePackageConfig t p@PackageConfig{..} = do library <- traverse (traverseWithCommonOptions t) packageConfigLibrary internalLibraries <- traverseNamedConfigs t packageConfigInternalLibraries executable <- traverse (traverseWithCommonOptions t) packageConfigExecutable
src/Hpack/Defaults.hs view
@@ -12,10 +12,11 @@ #endif ) where +import Imports+ import Network.HTTP.Types import Network.HTTP.Client import Network.HTTP.Client.TLS-import Data.List import qualified Data.ByteString.Lazy as LB import qualified Data.ByteString.Char8 as B import System.FilePath
src/Hpack/License.hs view
@@ -4,7 +4,7 @@ {-# LANGUAGE LambdaCase #-} module Hpack.License where -import Control.Arrow ((&&&))+import Imports import Distribution.Pretty (prettyShow) import Distribution.Version (mkVersion)
src/Hpack/Module.hs view
@@ -10,11 +10,10 @@ #endif ) where -import Data.String+import Imports+ import System.FilePath import qualified System.Directory as Directory-import Control.Monad-import Data.List hiding (nub, sort) import Data.Aeson.Config.FromValue import Hpack.Util
src/Hpack/Options.hs view
@@ -1,8 +1,8 @@ {-# LANGUAGE LambdaCase #-} module Hpack.Options where -import Control.Applicative-import Control.Monad+import Imports+ import Data.Maybe import System.FilePath import System.Directory
src/Hpack/Render.hs view
@@ -34,10 +34,10 @@ #endif ) where -import Control.Monad+import Imports+ import Data.Char import Data.Maybe-import Data.List import Data.Map.Lazy (Map) import qualified Data.Map.Lazy as Map @@ -165,7 +165,7 @@ renderExecutables = map renderExecutable . Map.toList renderExecutable :: (String, Section Executable) -> Element-renderExecutable (name, sect@(sectionData -> Executable{..})) =+renderExecutable (name, sect) = Stanza ("executable " ++ name) (renderExecutableSection [] sect) renderTests :: Map String (Section Executable) -> [Element]
src/Hpack/Render/Dsl.hs view
@@ -24,8 +24,7 @@ #endif ) where -import Data.String-import Data.List+import Imports data Value = Literal String
src/Hpack/Render/Hints.hs view
@@ -16,10 +16,10 @@ #endif ) where +import Imports+ import Data.Char import Data.Maybe-import Data.List hiding (nub)-import Control.Applicative import Hpack.Render.Dsl import Hpack.Util
src/Hpack/Syntax/BuildTools.hs view
@@ -7,12 +7,10 @@ , SystemBuildTools(..) ) where +import Imports+ import qualified Control.Monad.Fail as Fail-import Data.Text (Text) import qualified Data.Text as T-import Data.Semigroup (Semigroup(..))-import Data.Bifunctor-import Control.Applicative import qualified Distribution.Package as D import Data.Map.Lazy (Map) import qualified Data.Map.Lazy as Map
src/Hpack/Syntax/Defaults.hs view
@@ -13,8 +13,9 @@ #endif ) where -import Data.HashMap.Lazy (member)-import Data.List+import Imports++import Data.Aeson.Config.KeyMap (member) import qualified Data.Text as T import System.FilePath.Posix (splitDirectories)
src/Hpack/Syntax/Dependencies.hs view
@@ -8,11 +8,10 @@ , parseDependency ) where +import Imports+ import qualified Control.Monad.Fail as Fail-import Data.Text (Text)-import Data.List import qualified Data.Text as T-import Data.Semigroup (Semigroup(..)) import qualified Distribution.Package as D import qualified Distribution.Types.LibraryName as D import Distribution.Pretty (prettyShow)
src/Hpack/Syntax/DependencyVersion.hs view
@@ -25,13 +25,13 @@ , cabalParse ) where -import Control.Applicative+import Imports+ import qualified Control.Monad.Fail as Fail import Data.Maybe import Data.Scientific-import Data.Text (Text) import qualified Data.Text as T-import qualified Data.HashMap.Strict as HashMap+import qualified Data.Aeson.Config.KeyMap as KeyMap import Text.PrettyPrint (renderStyle, Style(..), Mode(..)) import qualified Distribution.Version as D@@ -113,7 +113,7 @@ source :: Parser (Maybe SourceDependency) source- | any (`HashMap.member` o) ["path", "git", "github", "ref", "subdir"] = Just <$> (local <|> git)+ | any (`KeyMap.member` o) ["path", "git", "github", "ref", "subdir"] = Just <$> (local <|> git) | otherwise = return Nothing in DependencyVersion <$> source <*> version
src/Hpack/Syntax/Git.hs view
@@ -2,8 +2,9 @@ isValidRef ) where +import Imports+ import Data.Char (chr)-import Data.List import System.FilePath.Posix -- https://git-scm.com/docs/git-check-ref-format
src/Hpack/Syntax/ParseDependencies.hs view
@@ -2,9 +2,10 @@ {-# LANGUAGE RecordWildCards #-} module Hpack.Syntax.ParseDependencies where -import Data.Text (Text)-import Data.Bifunctor+import Imports+ import Data.Aeson.Config.FromValue+import qualified Data.Aeson.Config.Key as Key data Parse k v = Parse { parseString :: Text -> Parser (k, v)@@ -17,7 +18,7 @@ parseDependencies parse@Parse{..} v = case v of String s -> return <$> parseString s Array xs -> parseArray (buildToolFromValue parse) xs- Object o -> map (first parseName) <$> traverseObject parseDictItem o+ Object o -> map (first (parseName . Key.toText)) <$> traverseObject parseDictItem o _ -> typeMismatch "Array, Object, or String" v buildToolFromValue :: Parse k v -> Value -> Parser (k, v)
src/Hpack/Util.hs view
@@ -20,11 +20,10 @@ , nubOn ) where +import Imports+ import Control.Exception-import Control.Monad import Data.Char-import Data.Bifunctor-import Data.List hiding (nub, sort) import Data.Ord import qualified Data.Set as Set import System.IO.Error
src/Hpack/Yaml.hs view
@@ -17,7 +17,8 @@ , module Data.Aeson.Config.FromValue ) where -import Data.Bifunctor+import Imports+ import Data.Yaml hiding (decodeFile, decodeFileWithWarnings) import Data.Yaml.Include import Data.Yaml.Internal (Warning(..))
+ src/Imports.hs view
@@ -0,0 +1,11 @@+module Imports (module Imports) where++import Control.Applicative as Imports+import Control.Arrow as Imports ((>>>), (&&&))+import Control.Monad as Imports+import Data.Bifunctor as Imports+import Data.List as Imports hiding (sort, nub)+import Data.Monoid as Imports (Monoid(..))+import Data.Semigroup as Imports (Semigroup(..))+import Data.String as Imports+import Data.Text as Imports (Text)
src/Path.hs view
@@ -1,7 +1,8 @@ module Path where +import Imports+ import System.FilePath-import Data.String fromFilePath :: FilePath -> Path fromFilePath = Path . map PathComponent . splitDirectories
test/Helper.hs view
@@ -2,7 +2,8 @@ {-# LANGUAGE ConstraintKinds #-} {-# OPTIONS_GHC -fno-warn-orphans #-} module Helper (- module Test.Hspec+ module Imports+, module Test.Hspec , module Test.Mockery.Directory , module Control.Monad , module Control.Applicative@@ -12,9 +13,10 @@ , yaml ) where +import Imports+ import Test.Hspec import Test.Mockery.Directory-import Data.String import Control.Monad import Control.Applicative import System.Directory (getCurrentDirectory, setCurrentDirectory, canonicalizePath)
test/Hpack/ConfigSpec.hs view
@@ -19,7 +19,6 @@ import Data.Aeson.Config.FromValueSpec hiding (spec) import Data.String.Interpolate.IsString-import Control.Arrow import qualified GHC.Exts as Exts import System.Directory (createDirectory) import Data.Either
test/Hpack/RenderSpec.hs view
@@ -3,7 +3,6 @@ module Hpack.RenderSpec (spec) where import Helper-import Data.List import Hpack.Syntax.DependencyVersion import Hpack.ConfigSpec hiding (spec)