commit hpack for openSUSE:Factory
1 Aug
2022
1 Aug
'22
19:31
Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package hpack for openSUSE:Factory checked in at 2022-08-01 21:31:03 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/hpack (Old) and /work/SRC/openSUSE:Factory/.hpack.new.1533 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Package is "hpack" Mon Aug 1 21:31:03 2022 rev:25 rq:987125 version:0.35.0 Changes: -------- --- /work/SRC/openSUSE:Factory/hpack/hpack.changes 2022-02-11 23:10:07.459070016 +0100 +++ /work/SRC/openSUSE:Factory/.hpack.new.1533/hpack.changes 2022-08-01 21:31:41.873880059 +0200 @@ -1,0 +2,19 @@ +Sun Apr 24 00:26:04 UTC 2022 - Peter Simons <psimons@suse.com> + +- Update hpack to version 0.35.0. + ## Changes in 0.35.0 + - Add support for `language` (thanks @mpilgrem) + - Accept Cabal names for fields where Hpack and Cabal use different + terminology, but still warn (e.g. accept `hs-source-dirs` as an alias for + `source-dirs`) + +------------------------------------------------------------------- +Mon Mar 28 15:12:50 UTC 2022 - Peter Simons <psimons@suse.com> + +- Update hpack to version 0.34.7. + ## Changes in 0.34.7 + - Support `Cabal-3.6.*` + - Make sure that verbatim `import` fields are rendered at the beginning of + a section (see #486) + +------------------------------------------------------------------- Old: ---- hpack-0.34.6.tar.gz New: ---- hpack-0.35.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ hpack.spec ++++++ --- /var/tmp/diff_new_pack.jT3hWA/_old 2022-08-01 21:31:43.893885855 +0200 +++ /var/tmp/diff_new_pack.jT3hWA/_new 2022-08-01 21:31:43.897885866 +0200 @@ -1,7 +1,7 @@ # # spec file for package hpack # -# Copyright (c) 2021 SUSE LLC +# Copyright (c) 2022 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -19,7 +19,7 @@ %global pkg_name hpack %bcond_with tests Name: %{pkg_name} -Version: 0.34.6 +Version: 0.35.0 Release: 0 Summary: A modern format for Haskell packages License: MIT ++++++ hpack-0.34.6.tar.gz -> hpack-0.35.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hpack-0.34.6/CHANGELOG.md new/hpack-0.35.0/CHANGELOG.md --- old/hpack-0.34.6/CHANGELOG.md 2001-09-09 03:46:40.000000000 +0200 +++ new/hpack-0.35.0/CHANGELOG.md 2001-09-09 03:46:40.000000000 +0200 @@ -1,3 +1,14 @@ +## Changes in 0.35.0 + - Add support for `language` (thanks @mpilgrem) + - Accept Cabal names for fields where Hpack and Cabal use different + terminology, but still warn (e.g. accept `hs-source-dirs` as an alias for + `source-dirs`) + +## Changes in 0.34.7 + - Support `Cabal-3.6.*` + - Make sure that verbatim `import` fields are rendered at the beginning of + a section (see #486) + ## Changes in 0.34.6 - Add `Paths_` module to `autogen-modules` when `cabal-version >= 2` diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hpack-0.34.6/hpack.cabal new/hpack-0.35.0/hpack.cabal --- old/hpack-0.34.6/hpack.cabal 2001-09-09 03:46:40.000000000 +0200 +++ new/hpack-0.35.0/hpack.cabal 2001-09-09 03:46:40.000000000 +0200 @@ -1,11 +1,11 @@ cabal-version: 1.12 --- This file has been generated from package.yaml by hpack version 0.34.5. +-- This file has been generated from package.yaml by hpack version 0.34.7. -- -- see: https://github.com/sol/hpack name: hpack -version: 0.34.6 +version: 0.35.0 synopsis: A modern format for Haskell packages description: See README at <https://github.com/sol/hpack#readme> category: Development @@ -25,9 +25,9 @@ library hs-source-dirs: src - ghc-options: -Wall + ghc-options: -Wall -fno-warn-incomplete-uni-patterns build-depends: - Cabal >=3.0.0.0 && <3.6 + Cabal >=3.0.0.0 && <3.7 , Glob >=0.9.0 , aeson >=1.4.3.0 , base >=4.9 && <5 @@ -86,9 +86,9 @@ main-is: Main.hs hs-source-dirs: driver - ghc-options: -Wall + ghc-options: -Wall -fno-warn-incomplete-uni-patterns build-depends: - Cabal >=3.0.0.0 && <3.6 + Cabal >=3.0.0.0 && <3.7 , Glob >=0.9.0 , aeson >=1.4.3.0 , base >=4.9 && <5 @@ -121,10 +121,10 @@ hs-source-dirs: test src - ghc-options: -Wall + ghc-options: -Wall -fno-warn-incomplete-uni-patterns cpp-options: -DTEST build-depends: - Cabal >=3.0.0.0 && <3.6 + Cabal >=3.0.0.0 && <3.7 , Glob >=0.9.0 , HUnit >=1.6.0.0 , QuickCheck diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hpack-0.34.6/src/Data/Aeson/Config/FromValue.hs new/hpack-0.35.0/src/Data/Aeson/Config/FromValue.hs --- old/hpack-0.34.6/src/Data/Aeson/Config/FromValue.hs 2001-09-09 03:46:40.000000000 +0200 +++ new/hpack-0.35.0/src/Data/Aeson/Config/FromValue.hs 2001-09-09 03:46:40.000000000 +0200 @@ -6,8 +6,11 @@ {-# LANGUAGE TypeOperators #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE RecordWildCards #-} - {-# LANGUAGE ConstraintKinds #-} +{-# LANGUAGE DataKinds #-} +{-# LANGUAGE GeneralizedNewtypeDeriving #-} +{-# LANGUAGE TypeApplications #-} +{-# LANGUAGE DeriveFunctor #-} module Data.Aeson.Config.FromValue ( FromValue(..) , Parser @@ -38,17 +41,24 @@ , Value(..) , Object , Array + +, Alias(..) +, unAlias ) where import Imports +import Data.Monoid (Last(..)) import GHC.Generics +import GHC.TypeLits +import Data.Proxy import Data.Map.Lazy (Map) import qualified Data.Map.Lazy as Map import qualified Data.Vector as V import Data.Aeson.Config.Key (Key) import qualified Data.Aeson.Config.Key as Key +import Data.Aeson.Config.KeyMap (member) import qualified Data.Aeson.Config.KeyMap as KeyMap import Data.Aeson.Types (FromJSON(..)) @@ -56,7 +66,7 @@ import Data.Aeson.Config.Util import Data.Aeson.Config.Parser -type Result a = Either String (a, [String]) +type Result a = Either String (a, [String], [(String, String)]) decodeValue :: FromValue a => Value -> Result a decodeValue = runParser fromValue @@ -137,13 +147,49 @@ instance (GenericDecode a, GenericDecode b) => GenericDecode (a :*: b) where genericDecode opts o = (:*:) <$> genericDecode opts o <*> genericDecode opts o -instance (Selector sel, FromValue a) => GenericDecode (S1 sel (Rec0 a)) where +type RecordField sel a = S1 sel (Rec0 a) + +instance (Selector sel, FromValue a) => GenericDecode (RecordField sel a) where genericDecode = accessFieldWith (.:) -instance {-# OVERLAPPING #-} (Selector sel, FromValue a) => GenericDecode (S1 sel (Rec0 (Maybe a))) where +instance {-# OVERLAPPING #-} (Selector sel, FromValue a) => GenericDecode (RecordField sel (Maybe a)) where genericDecode = accessFieldWith (.:?) -accessFieldWith :: forall sel a p. Selector sel => (Object -> Key -> Parser a) -> Options -> Value -> Parser (S1 sel (Rec0 a) p) +instance {-# OVERLAPPING #-} (Selector sel, FromValue a) => GenericDecode (RecordField sel (Last a)) where + genericDecode = accessFieldWith (\ value key -> Last <$> (value .:? key)) + +instance {-# OVERLAPPING #-} (Selector sel, FromValue a, KnownBool deprecated, KnownSymbol alias) => GenericDecode (RecordField sel (Alias deprecated alias (Maybe a))) where + genericDecode = accessFieldWith (\ value key -> aliasAccess (.:?) value (Alias key)) + +instance {-# OVERLAPPING #-} (Selector sel, FromValue a, KnownBool deprecated, KnownSymbol alias) => GenericDecode (RecordField sel (Alias deprecated alias (Last a))) where + genericDecode = accessFieldWith (\ value key -> fmap Last <$> aliasAccess (.:?) value (Alias key)) + +aliasAccess :: forall deprecated alias a. (KnownBool deprecated, KnownSymbol alias) => (Object -> Key -> Parser a) -> Object -> (Alias deprecated alias Key) -> Parser (Alias deprecated alias a) +aliasAccess op value (Alias key) + | alias `member` value && not (key `member` value) = Alias <$> value `op` alias <* deprecated + | otherwise = Alias <$> value `op` key + where + deprecated = case boolVal (Proxy @deprecated) of + False -> return () + True -> markDeprecated alias key + alias = Key.fromString (symbolVal $ Proxy @alias) + +accessFieldWith :: forall sel a p. Selector sel => (Object -> Key -> Parser a) -> Options -> Value -> Parser (RecordField sel a p) accessFieldWith op Options{..} v = M1 . K1 <$> withObject (`op` Key.fromString label) v where - label = optionsRecordSelectorModifier $ selName (undefined :: S1 sel (Rec0 a) p) + label = optionsRecordSelectorModifier $ selName (undefined :: RecordField sel a p) + +newtype Alias (deprecated :: Bool) (alias :: Symbol) a = Alias a + deriving (Show, Eq, Semigroup, Monoid, Functor) + +unAlias :: Alias deprecated alias a -> a +unAlias (Alias a) = a + +class KnownBool (a :: Bool) where + boolVal :: Proxy a -> Bool + +instance KnownBool 'True where + boolVal _ = True + +instance KnownBool 'False where + boolVal _ = False diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hpack-0.34.6/src/Data/Aeson/Config/Parser.hs new/hpack-0.35.0/src/Data/Aeson/Config/Parser.hs --- old/hpack-0.34.6/src/Data/Aeson/Config/Parser.hs 2001-09-09 03:46:40.000000000 +0200 +++ new/hpack-0.35.0/src/Data/Aeson/Config/Parser.hs 2001-09-09 03:46:40.000000000 +0200 @@ -28,6 +28,8 @@ , fromAesonPath , formatPath + +, markDeprecated ) where import Imports @@ -56,6 +58,9 @@ type JSONPath = [JSONPathElement] +data Path = Consumed JSONPath | Deprecated JSONPath JSONPath + deriving (Eq, Ord, Show) + fromAesonPath :: Aeson.JSONPath -> JSONPath fromAesonPath = reverse . map fromAesonPathElement @@ -64,16 +69,16 @@ Aeson.Key k -> Key (Key.toText k) Aeson.Index n -> Index n -newtype Parser a = Parser {unParser :: WriterT (Set JSONPath) Aeson.Parser a} +newtype Parser a = Parser {unParser :: WriterT (Set Path) Aeson.Parser a} deriving (Functor, Applicative, Alternative, Monad, Fail.MonadFail) liftParser :: Aeson.Parser a -> Parser a liftParser = Parser . lift -runParser :: (Value -> Parser a) -> Value -> Either String (a, [String]) +runParser :: (Value -> Parser a) -> Value -> Either String (a, [String], [(String, String)]) runParser p v = case iparse (runWriterT . unParser <$> p) v of IError path err -> Left ("Error while parsing " ++ formatPath (fromAesonPath path) ++ " - " ++ err) - ISuccess (a, consumed) -> Right (a, map formatPath (determineUnconsumed consumed v)) + ISuccess (a, paths) -> Right (a, map formatPath (determineUnconsumed paths v), [(formatPath name, formatPath substitute) | Deprecated name substitute <- Set.toList paths]) formatPath :: JSONPath -> String formatPath = go "$" . reverse @@ -84,12 +89,12 @@ Index n : xs -> go (acc ++ "[" ++ show n ++ "]") xs Key key : xs -> go (acc ++ "." ++ T.unpack key) xs -determineUnconsumed :: Set JSONPath -> Value -> [JSONPath] -determineUnconsumed ((<> Set.singleton []) -> consumed) = Set.toList . execWriter . go [] +determineUnconsumed :: Set Path -> Value -> [JSONPath] +determineUnconsumed ((<> Set.singleton (Consumed [])) -> consumed) = Set.toList . execWriter . go [] where go :: JSONPath -> Value -> Writer (Set JSONPath) () go path value - | path `notMember` consumed = tell (Set.singleton path) + | Consumed path `notMember` consumed = tell (Set.singleton path) | otherwise = case value of Number _ -> return () String _ -> return () @@ -110,7 +115,12 @@ markConsumed :: JSONPathElement -> Parser () markConsumed e = do path <- getPath - Parser $ tell (Set.singleton $ e : path) + Parser $ tell (Set.singleton . Consumed $ e : path) + +markDeprecated :: Key -> Key -> Parser () +markDeprecated (Key.toText -> name) (Key.toText -> substitute) = do + path <- getPath + Parser $ tell (Set.singleton $ Deprecated (Key name : path) (Key substitute : path)) getPath :: Parser JSONPath getPath = liftParser $ Aeson.parserCatchError empty $ \ path _ -> return (fromAesonPath path) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hpack-0.34.6/src/Hpack/Config.hs new/hpack-0.35.0/src/Hpack/Config.hs --- old/hpack-0.34.6/src/Hpack/Config.hs 2001-09-09 03:46:40.000000000 +0200 +++ new/hpack-0.35.0/src/Hpack/Config.hs 2001-09-09 03:46:40.000000000 +0200 @@ -13,6 +13,7 @@ {-# LANGUAGE ViewPatterns #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE DataKinds #-} module Hpack.Config ( -- | /__NOTE:__/ This module is exposed to allow integration of Hpack into -- other tools. It is not meant for general use by end users. The following @@ -59,6 +60,7 @@ , Cond(..) , Flag(..) , SourceRepository(..) +, Language(..) , BuildType(..) , GhcProfOption , GhcjsOption @@ -88,6 +90,7 @@ import qualified Data.Map.Lazy as Map import qualified Data.Aeson.Config.KeyMap as KeyMap import Data.Maybe +import Data.Monoid (Last(..)) import Data.Ord import qualified Data.Text as T import Data.Text.Encoding (decodeUtf8) @@ -185,7 +188,7 @@ deps xs = [(name, info) | (name, info) <- (Map.toList . unDependencies . sectionDependencies) xs] section :: a -> Section a -section a = Section a [] mempty [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] Nothing [] mempty mempty [] +section a = Section a [] mempty [] [] [] Nothing [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] Nothing [] mempty mempty [] packageConfig :: FilePath packageConfig = "package.yaml" @@ -222,18 +225,18 @@ } data ExecutableSection = ExecutableSection { - executableSectionMain :: Maybe FilePath + executableSectionMain :: Alias 'True "main-is" (Last FilePath) , executableSectionOtherModules :: Maybe (List Module) , executableSectionGeneratedOtherModules :: Maybe (List Module) } deriving (Eq, Show, Generic, FromValue) instance Monoid ExecutableSection where - mempty = ExecutableSection Nothing Nothing Nothing + mempty = ExecutableSection mempty Nothing Nothing mappend = (<>) instance Semigroup ExecutableSection where a <> b = ExecutableSection { - executableSectionMain = executableSectionMain b <|> executableSectionMain a + executableSectionMain = executableSectionMain a <> executableSectionMain b , executableSectionOtherModules = executableSectionOtherModules a <> executableSectionOtherModules b , executableSectionGeneratedOtherModules = executableSectionGeneratedOtherModules a <> executableSectionGeneratedOtherModules b } @@ -266,11 +269,12 @@ _ -> typeMismatch (formatOrList ["String", "Object"]) v data CommonOptions cSources cxxSources jsSources a = CommonOptions { - commonOptionsSourceDirs :: Maybe (List FilePath) -, commonOptionsDependencies :: Maybe Dependencies -, commonOptionsPkgConfigDependencies :: Maybe (List String) + commonOptionsSourceDirs :: Alias 'True "hs-source-dirs" (Maybe (List FilePath)) +, commonOptionsDependencies :: Alias 'True "build-depends" (Maybe Dependencies) +, commonOptionsPkgConfigDependencies :: Alias 'False "pkgconfig-depends" (Maybe (List String)) , commonOptionsDefaultExtensions :: Maybe (List String) , commonOptionsOtherExtensions :: Maybe (List String) +, commonOptionsLanguage :: Alias 'True "default-language" (Last (Maybe Language)) , commonOptionsGhcOptions :: Maybe (List GhcOption) , commonOptionsGhcProfOptions :: Maybe (List GhcProfOption) , commonOptionsGhcjsOptions :: Maybe (List GhcjsOption) @@ -287,9 +291,9 @@ , commonOptionsIncludeDirs :: Maybe (List FilePath) , commonOptionsInstallIncludes :: Maybe (List FilePath) , commonOptionsLdOptions :: Maybe (List LdOption) -, commonOptionsBuildable :: Maybe Bool +, commonOptionsBuildable :: Last Bool , commonOptionsWhen :: Maybe (List (ConditionalSection cSources cxxSources jsSources a)) -, commonOptionsBuildTools :: Maybe BuildTools +, commonOptionsBuildTools :: Alias 'True "build-tool-depends" (Maybe BuildTools) , commonOptionsSystemBuildTools :: Maybe SystemBuildTools , commonOptionsVerbatim :: Maybe (List Verbatim) } deriving (Functor, Generic) @@ -299,11 +303,12 @@ instance (Semigroup cSources, Semigroup cxxSources, Semigroup jsSources, Monoid cSources, Monoid cxxSources, Monoid jsSources) => Monoid (CommonOptions cSources cxxSources jsSources a) where mempty = CommonOptions { - commonOptionsSourceDirs = Nothing - , commonOptionsDependencies = Nothing - , commonOptionsPkgConfigDependencies = Nothing + commonOptionsSourceDirs = Alias Nothing + , commonOptionsDependencies = Alias Nothing + , commonOptionsPkgConfigDependencies = Alias Nothing , commonOptionsDefaultExtensions = Nothing , commonOptionsOtherExtensions = Nothing + , commonOptionsLanguage = mempty , commonOptionsGhcOptions = Nothing , commonOptionsGhcProfOptions = Nothing , commonOptionsGhcjsOptions = Nothing @@ -320,9 +325,9 @@ , commonOptionsIncludeDirs = Nothing , commonOptionsInstallIncludes = Nothing , commonOptionsLdOptions = Nothing - , commonOptionsBuildable = Nothing + , commonOptionsBuildable = mempty , commonOptionsWhen = Nothing - , commonOptionsBuildTools = Nothing + , commonOptionsBuildTools = Alias Nothing , commonOptionsSystemBuildTools = Nothing , commonOptionsVerbatim = Nothing } @@ -335,6 +340,7 @@ , commonOptionsPkgConfigDependencies = commonOptionsPkgConfigDependencies a <> commonOptionsPkgConfigDependencies b , commonOptionsDefaultExtensions = commonOptionsDefaultExtensions a <> commonOptionsDefaultExtensions b , commonOptionsOtherExtensions = commonOptionsOtherExtensions a <> commonOptionsOtherExtensions b + , commonOptionsLanguage = commonOptionsLanguage a <> commonOptionsLanguage b , commonOptionsGhcOptions = commonOptionsGhcOptions a <> commonOptionsGhcOptions b , commonOptionsGhcProfOptions = commonOptionsGhcProfOptions a <> commonOptionsGhcProfOptions b , commonOptionsGhcjsOptions = commonOptionsGhcjsOptions a <> commonOptionsGhcjsOptions b @@ -351,7 +357,7 @@ , commonOptionsIncludeDirs = commonOptionsIncludeDirs a <> commonOptionsIncludeDirs b , commonOptionsInstallIncludes = commonOptionsInstallIncludes a <> commonOptionsInstallIncludes b , commonOptionsLdOptions = commonOptionsLdOptions a <> commonOptionsLdOptions b - , commonOptionsBuildable = commonOptionsBuildable b <|> commonOptionsBuildable a + , commonOptionsBuildable = commonOptionsBuildable a <> commonOptionsBuildable b , commonOptionsWhen = commonOptionsWhen a <> commonOptionsWhen b , commonOptionsBuildTools = commonOptionsBuildTools a <> commonOptionsBuildTools b , commonOptionsSystemBuildTools = commonOptionsSystemBuildTools b <> commonOptionsSystemBuildTools a @@ -501,12 +507,21 @@ instance FromValue Empty where fromValue _ = return Empty +newtype Language = Language String + deriving (Eq, Show) + +instance IsString Language where + fromString = Language + +instance FromValue Language where + fromValue = fmap Language . fromValue + data BuildType = Simple | Configure | Make | Custom - deriving (Eq, Show, Generic, Enum, Bounded) + deriving (Eq, Show, Enum, Bounded) instance FromValue BuildType where fromValue = withText $ \ (T.unpack -> t) -> do @@ -524,11 +539,11 @@ y : x : [] -> x ++ " or " ++ y x : ys@(_:_:_) -> intercalate ", " . reverse $ ("or " ++ x) : ys -type SectionConfigWithDefaluts cSources cxxSources jsSources a = Product DefaultsConfig (WithCommonOptions cSources cxxSources jsSources a) +type SectionConfigWithDefaults cSources cxxSources jsSources a = Product DefaultsConfig (WithCommonOptions cSources cxxSources jsSources a) type PackageConfigWithDefaults cSources cxxSources jsSources = PackageConfig_ - (SectionConfigWithDefaluts cSources cxxSources jsSources LibrarySection) - (SectionConfigWithDefaluts cSources cxxSources jsSources ExecutableSection) + (SectionConfigWithDefaults cSources cxxSources jsSources LibrarySection) + (SectionConfigWithDefaults cSources cxxSources jsSources ExecutableSection) type PackageConfig cSources cxxSources jsSources = PackageConfig_ (WithCommonOptions cSources cxxSources jsSources LibrarySection) @@ -877,16 +892,18 @@ decodeValue :: FromValue a => ProgramName -> FilePath -> Value -> Warnings (Errors IO) a decodeValue (ProgramName programName) file value = do - (r, unknown) <- lift . ExceptT . return $ first (prefix ++) (Config.decodeValue value) + (r, unknown, deprecated) <- lift . ExceptT . return $ first (prefix ++) (Config.decodeValue value) case r of UnsupportedSpecVersion v -> do lift $ throwE ("The file " ++ file ++ " requires version " ++ showVersion v ++ " of the Hpack package specification, however this version of " ++ programName ++ " only supports versions up to " ++ showVersion Hpack.version ++ ". Upgrading to the latest version of " ++ programName ++ " may resolve this issue.") SupportedSpecVersion a -> do tell (map formatUnknownField unknown) + tell (map formatDeprecatedField deprecated) return a where prefix = file ++ ": " formatUnknownField name = prefix ++ "Ignoring unrecognized field " ++ name + formatDeprecatedField (name, substitute) = prefix <> name <> " is deprecated, use " <> substitute <> " instead" data CheckSpecVersion a = SupportedSpecVersion a | UnsupportedSpecVersion Version @@ -968,6 +985,7 @@ , sectionPkgConfigDependencies :: [String] , sectionDefaultExtensions :: [String] , sectionOtherExtensions :: [String] +, sectionLanguage :: Maybe Language , sectionGhcOptions :: [GhcOption] , sectionGhcProfOptions :: [GhcProfOption] , sectionGhcjsOptions :: [GhcjsOption] @@ -1034,8 +1052,13 @@ toPackage :: ProgramName -> FilePath -> FilePath -> ConfigWithDefaults -> Warnings (Errors IO) (Package, String) toPackage programName userDataDir dir = expandDefaultsInConfig programName userDataDir dir - >=> traverseConfig (expandForeignSources dir) + >=> setDefaultLanguage "Haskell2010" + >>> traverseConfig (expandForeignSources dir) >=> toPackage_ dir + where + setDefaultLanguage language config = first setLanguage config + where + setLanguage = (mempty { commonOptionsLanguage = Alias . Last $ Just (Just language) } <>) expandDefaultsInConfig :: ProgramName @@ -1396,7 +1419,7 @@ } getMentionedExecutableModules :: ExecutableSection -> [Module] -getMentionedExecutableModules (ExecutableSection main otherModules generatedModules)= +getMentionedExecutableModules (ExecutableSection (Alias (Last main)) otherModules generatedModules)= maybe id (:) (toModule . Path.fromFilePath <$> main) $ fromMaybeList (otherModules <> generatedModules) toExecutable :: FilePath -> String -> Section ExecutableSection -> IO (Section Executable) @@ -1406,7 +1429,7 @@ where fromExecutableSection :: [Module] -> [Module] -> ExecutableSection -> Executable fromExecutableSection pathsModule inferableModules ExecutableSection{..} = - (Executable executableSectionMain (otherModules ++ generatedModules) generatedModules) + (Executable (getLast $ unAlias executableSectionMain) (otherModules ++ generatedModules) generatedModules) where otherModules = maybe (inferableModules ++ pathsModule) fromList executableSectionOtherModules generatedModules = maybe [] fromList executableSectionGeneratedOtherModules @@ -1419,9 +1442,9 @@ where go exec@ExecutableSection{..} = let - (mainSrcFile, ghcOptions) = maybe (Nothing, []) (first Just . parseMain) executableSectionMain + (mainSrcFile, ghcOptions) = maybe (Nothing, []) (first Just . parseMain) (getLast $ unAlias executableSectionMain) in - (ghcOptions, exec{executableSectionMain = mainSrcFile}) + (ghcOptions, exec{executableSectionMain = Alias $ Last mainSrcFile}) flatten :: Section ([GhcOption], ExecutableSection) -> Section ExecutableSection flatten sect@Section{sectionData = (ghcOptions, exec), ..} = sect{ @@ -1434,14 +1457,15 @@ toSection packageName_ executableNames = go where go (Product CommonOptions{..} a) = do - (systemBuildTools, buildTools) <- maybe (return mempty) toBuildTools commonOptionsBuildTools + (systemBuildTools, buildTools) <- maybe (return mempty) toBuildTools (unAlias commonOptionsBuildTools) conditionals <- mapM toConditional (fromMaybeList commonOptionsWhen) return Section { sectionData = a - , sectionSourceDirs = nub $ fromMaybeList commonOptionsSourceDirs + , sectionSourceDirs = nub $ fromMaybeList (unAlias commonOptionsSourceDirs) , sectionDefaultExtensions = fromMaybeList commonOptionsDefaultExtensions , sectionOtherExtensions = fromMaybeList commonOptionsOtherExtensions + , sectionLanguage = join . getLast $ unAlias commonOptionsLanguage , sectionGhcOptions = fromMaybeList commonOptionsGhcOptions , sectionGhcProfOptions = fromMaybeList commonOptionsGhcProfOptions , sectionGhcjsOptions = fromMaybeList commonOptionsGhcjsOptions @@ -1458,9 +1482,9 @@ , sectionIncludeDirs = fromMaybeList commonOptionsIncludeDirs , sectionInstallIncludes = fromMaybeList commonOptionsInstallIncludes , sectionLdOptions = fromMaybeList commonOptionsLdOptions - , sectionBuildable = commonOptionsBuildable - , sectionDependencies = fromMaybe mempty commonOptionsDependencies - , sectionPkgConfigDependencies = fromMaybeList commonOptionsPkgConfigDependencies + , sectionBuildable = getLast commonOptionsBuildable + , sectionDependencies = fromMaybe mempty (unAlias commonOptionsDependencies) + , sectionPkgConfigDependencies = fromMaybeList (unAlias commonOptionsPkgConfigDependencies) , sectionConditionals = conditionals , sectionBuildTools = buildTools , sectionSystemBuildTools = systemBuildTools <> fromMaybe mempty commonOptionsSystemBuildTools diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hpack-0.34.6/src/Hpack/Render.hs new/hpack-0.35.0/src/Hpack/Render.hs --- old/hpack-0.34.6/src/Hpack/Render.hs 2001-09-09 03:46:40.000000000 +0200 +++ new/hpack-0.35.0/src/Hpack/Render.hs 2001-09-09 03:46:40.000000000 +0200 @@ -44,7 +44,8 @@ import Hpack.Util import Hpack.Config import Hpack.Render.Hints -import Hpack.Render.Dsl +import Hpack.Render.Dsl hiding (sortFieldsBy) +import qualified Hpack.Render.Dsl as Dsl renderPackage :: [String] -> Package -> String renderPackage oldCabalFile = renderPackageWith settings alignment formattingHintsFieldOrder formattingHintsSectionsFieldOrder @@ -185,7 +186,7 @@ (renderExecutableSection [Field "type" "exitcode-stdio-1.0"] sect) renderExecutableSection :: [Element] -> Section Executable -> [Element] -renderExecutableSection extraFields = renderSection renderExecutableFields extraFields [defaultLanguage] +renderExecutableSection extraFields = renderSection renderExecutableFields extraFields renderExecutableFields :: Executable -> [Element] renderExecutableFields Executable{..} = mainIs ++ [otherModules, generatedModules] @@ -202,7 +203,7 @@ renderLibrary sect = Stanza "library" $ renderLibrarySection sect renderLibrarySection :: Section Library -> [Element] -renderLibrarySection = renderSection renderLibraryFields [] [defaultLanguage] +renderLibrarySection = renderSection renderLibraryFields [] renderLibraryFields :: Library -> [Element] renderLibraryFields Library{..} = @@ -221,8 +222,8 @@ renderVisibility :: String -> Element renderVisibility = Field "visibility" . Literal -renderSection :: (a -> [Element]) -> [Element] -> [Element] -> Section a -> [Element] -renderSection renderSectionData extraFieldsStart extraFieldsEnd Section{..} = addVerbatim sectionVerbatim $ +renderSection :: (a -> [Element]) -> [Element] -> Section a -> [Element] +renderSection renderSectionData extraFieldsStart Section{..} = addVerbatim sectionVerbatim $ extraFieldsStart ++ renderSectionData sectionData ++ [ renderDirectories "hs-source-dirs" sectionSourceDirs @@ -249,8 +250,8 @@ ++ renderBuildTools sectionBuildTools sectionSystemBuildTools ++ renderDependencies "build-depends" sectionDependencies ++ maybe [] (return . renderBuildable) sectionBuildable + ++ maybe [] (return . renderLanguage) sectionLanguage ++ map (renderConditional renderSectionData) sectionConditionals - ++ extraFieldsEnd addVerbatim :: [Verbatim] -> [Element] -> [Element] addVerbatim verbatim fields = filterVerbatim verbatim fields ++ renderVerbatim verbatim @@ -284,9 +285,9 @@ renderConditional :: (a -> [Element]) -> Conditional (Section a) -> Element renderConditional renderSectionData (Conditional condition sect mElse) = case mElse of Nothing -> if_ - Just else_ -> Group if_ (Stanza "else" $ renderSection renderSectionData [] [] else_) + Just else_ -> Group if_ (Stanza "else" $ renderSection renderSectionData [] else_) where - if_ = Stanza ("if " ++ renderCond condition) (renderSection renderSectionData [] [] sect) + if_ = Stanza ("if " ++ renderCond condition) (renderSection renderSectionData [] sect) renderCond :: Cond -> String renderCond = \ case @@ -294,9 +295,6 @@ CondBool True -> "true" CondBool False -> "false" -defaultLanguage :: Element -defaultLanguage = Field "default-language" "Haskell2010" - renderDirectories :: String -> [String] -> Element renderDirectories name = Field name . LineSeparatedList . replaceDots where @@ -375,6 +373,9 @@ renderSystemBuildTool :: (String, VersionConstraint) -> String renderSystemBuildTool (name, constraint) = name ++ renderVersionConstraint constraint +renderLanguage :: Language -> Element +renderLanguage (Language lang) = Field "default-language" (Literal lang) + renderGhcOptions :: [GhcOption] -> Element renderGhcOptions = Field "ghc-options" . WordList @@ -415,3 +416,6 @@ needsQuoting :: FilePath -> Bool needsQuoting = any (\x -> isSpace x || x == ',') + +sortFieldsBy :: [String] -> [Element] -> [Element] +sortFieldsBy existingFieldOrder = Dsl.sortFieldsBy ("import" : existingFieldOrder) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hpack-0.34.6/test/Data/Aeson/Config/FromValueSpec.hs new/hpack-0.35.0/test/Data/Aeson/Config/FromValueSpec.hs --- old/hpack-0.34.6/test/Data/Aeson/Config/FromValueSpec.hs 2001-09-09 03:46:40.000000000 +0200 +++ new/hpack-0.35.0/test/Data/Aeson/Config/FromValueSpec.hs 2001-09-09 03:46:40.000000000 +0200 @@ -3,12 +3,14 @@ {-# LANGUAGE DeriveAnyClass #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE ConstraintKinds #-} +{-# LANGUAGE DataKinds #-} module Data.Aeson.Config.FromValueSpec where import Helper import GHC.Generics import qualified Data.Map.Lazy as Map +import Data.Monoid (Last(..)) import Data.Aeson.Config.FromValue @@ -16,7 +18,7 @@ shouldDecodeTo value expected = decodeValue value `shouldBe` expected shouldDecodeTo_ :: (HasCallStack, Eq a, Show a, FromValue a) => Value -> a -> Expectation -shouldDecodeTo_ value expected = decodeValue value `shouldBe` Right (expected, []) +shouldDecodeTo_ value expected = decodeValue value `shouldBe` Right (expected, [], []) data Person = Person { personName :: String @@ -34,6 +36,30 @@ , jobSalary :: Int } deriving (Eq, Show, Generic, FromValue) +data FlatMaybe = FlatMaybe { + flatMaybeValue :: Maybe String +} deriving (Eq, Show, Generic, FromValue) + +data AliasMaybe = AliasMaybe { + aliasMaybeValue :: Alias 'False "some-alias" (Maybe String) +} deriving (Eq, Show, Generic, FromValue) + +data NestedMaybe = NestedMaybe { + nestedMaybeValue :: Maybe (Maybe String) +} deriving (Eq, Show, Generic, FromValue) + +data AliasNestedMaybe = AliasNestedMaybe { + aliasNestedMaybeValue :: Alias 'False "some-alias" (Maybe (Maybe String)) +} deriving (Eq, Show, Generic, FromValue) + +data FlatLast = FlatLast { + flatLastValue :: Last String +} deriving (Eq, Show, Generic, FromValue) + +data AliasLast = AliasLast { + aliasLastValue :: Alias 'False "some-alias" (Last String) +} deriving (Eq, Show, Generic, FromValue) + spec :: Spec spec = do describe "fromValue" $ do @@ -52,7 +78,7 @@ name: "Joe" age: 23 foo: bar - |] `shouldDecodeTo` Right (Person "Joe" 23 Nothing, ["$.foo"]) + |] `shouldDecodeTo` Right (Person "Joe" 23 Nothing, ["$.foo"], []) it "captures nested unrecognized fields" $ do [yaml| @@ -63,7 +89,7 @@ zip: "123456" foo: bar: 23 - |] `shouldDecodeTo` Right (Person "Joe" 23 (Just (Address "somewhere" "123456")), ["$.address.foo"]) + |] `shouldDecodeTo` Right (Person "Joe" 23 (Just (Address "somewhere" "123456")), ["$.address.foo"], []) it "ignores fields that start with an underscore" $ do [yaml| @@ -87,6 +113,135 @@ age: "23" |] `shouldDecodeTo` left "Error while parsing $.age - parsing Int failed, expected Number, but encountered String" + context "when parsing a field of type (Maybe a)" $ do + it "accepts a value" $ do + [yaml| + value: some value + |] `shouldDecodeTo_` FlatMaybe (Just "some value") + + it "allows the field to be omitted" $ do + [yaml| + {} + |] `shouldDecodeTo_` FlatMaybe Nothing + + it "rejects null" $ do + [yaml| + value: null + |] `shouldDecodeTo` (Left "Error while parsing $.value - expected String, but encountered Null" :: Result FlatMaybe) + + context "when parsing a field of type (Maybe (Maybe a))" $ do + it "accepts a value" $ do + [yaml| + value: some value + |] `shouldDecodeTo_` NestedMaybe (Just $ Just "some value") + + it "allows the field to be omitted" $ do + [yaml| + {} + |] `shouldDecodeTo_` NestedMaybe Nothing + + it "accepts null" $ do + [yaml| + value: null + |] `shouldDecodeTo_` NestedMaybe (Just Nothing) + + context "when parsing a field of type (Alias (Maybe a))" $ do + it "accepts a value" $ do + [yaml| + value: some value + |] `shouldDecodeTo_` AliasMaybe (Alias $ Just "some value") + + it "allows the field to be accessed by its alias" $ do + [yaml| + some-alias: some alias value + |] `shouldDecodeTo_` AliasMaybe (Alias $ Just "some alias value") + + it "gives the primary name precedence" $ do + [yaml| + value: some value + some-alias: some alias value + |] `shouldDecodeTo` Right (AliasMaybe (Alias $ Just "some value"), ["$.some-alias"], []) + + it "allows the field to be omitted" $ do + [yaml| + {} + |] `shouldDecodeTo_` AliasMaybe (Alias Nothing) + + it "rejects null" $ do + [yaml| + value: null + |] `shouldDecodeTo` (Left "Error while parsing $.value - expected String, but encountered Null" :: Result AliasMaybe) + + context "when parsing a field of type (Alias (Maybe (Maybe a)))" $ do + it "accepts a value" $ do + [yaml| + value: some value + |] `shouldDecodeTo_` AliasNestedMaybe (Alias . Just $ Just "some value") + + it "allows the field to be accessed by its alias" $ do + [yaml| + some-alias: some value + |] `shouldDecodeTo_` AliasNestedMaybe (Alias . Just $ Just "some value") + + it "gives the primary name precedence" $ do + [yaml| + value: some value + some-alias: some alias value + |] `shouldDecodeTo` Right (AliasNestedMaybe (Alias . Just $ Just "some value"), ["$.some-alias"], []) + + it "allows the field to be omitted" $ do + [yaml| + {} + |] `shouldDecodeTo_` AliasNestedMaybe (Alias Nothing) + + it "accepts null" $ do + [yaml| + value: null + |] `shouldDecodeTo_` AliasNestedMaybe (Alias $ Just Nothing) + + context "when parsing a field of type (Last a)" $ do + it "accepts a value" $ do + [yaml| + value: some value + |] `shouldDecodeTo_` FlatLast (Last $ Just "some value") + + it "allows the field to be omitted" $ do + [yaml| + {} + |] `shouldDecodeTo_` FlatLast (Last Nothing) + + it "rejects null" $ do + [yaml| + value: null + |] `shouldDecodeTo` (Left "Error while parsing $.value - expected String, but encountered Null" :: Result FlatLast) + + context "when parsing a field of type (Alias (Last a))" $ do + it "accepts a value" $ do + [yaml| + value: some value + |] `shouldDecodeTo_` AliasLast (Alias . Last $ Just "some value") + + it "allows the field to be accessed by its alias" $ do + [yaml| + some-alias: some value + |] `shouldDecodeTo_` AliasLast (Alias . Last $ Just "some value") + + it "gives the primary name precedence" $ do + [yaml| + value: some value + some-alias: some alias value + |] `shouldDecodeTo` Right (AliasLast (Alias . Last $ Just "some value"), ["$.some-alias"], []) + + it "allows the field to be omitted" $ do + [yaml| + {} + |] `shouldDecodeTo_` AliasLast (Alias $ Last Nothing) + + it "rejects null" $ do + [yaml| + value: null + |] `shouldDecodeTo` (Left "Error while parsing $.value - expected String, but encountered Null" :: Result AliasLast) + context "with (,)" $ do it "captures unrecognized fields" $ do [yaml| @@ -95,7 +250,7 @@ role: engineer salary: 100000 foo: bar - |] `shouldDecodeTo` Right ((Person "Joe" 23 Nothing, Job "engineer" 100000), ["$.foo"]) + |] `shouldDecodeTo` Right ((Person "Joe" 23 Nothing, Job "engineer" 100000), ["$.foo"], []) context "with []" $ do it "captures unrecognized fields" $ do @@ -111,7 +266,7 @@ - name: "Marry" age: 25 bar: 42 - |] `shouldDecodeTo` Right (expected, ["$[1].bar", "$[0].address.foo"]) + |] `shouldDecodeTo` Right (expected, ["$[1].bar", "$[0].address.foo"], []) context "with Map" $ do it "captures unrecognized fields" $ do @@ -120,4 +275,4 @@ region: somewhere zip: '123456' foo: bar - |] `shouldDecodeTo` Right (Map.fromList [("Joe", Address "somewhere" "123456")], ["$.Joe.foo"]) + |] `shouldDecodeTo` Right (Map.fromList [("Joe", Address "somewhere" "123456")], ["$.Joe.foo"], []) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hpack-0.34.6/test/EndToEndSpec.hs new/hpack-0.35.0/test/EndToEndSpec.hs --- old/hpack-0.34.6/test/EndToEndSpec.hs 2001-09-09 03:46:40.000000000 +0200 +++ new/hpack-0.35.0/test/EndToEndSpec.hs 2001-09-09 03:46:40.000000000 +0200 @@ -11,7 +11,7 @@ import Helper import Test.HUnit -import System.Directory (canonicalizePath, createDirectory) +import System.Directory (canonicalizePath) import Data.Maybe import Data.List import Data.String.Interpolate @@ -35,10 +35,15 @@ _foo: bar: 23 library: {} - |] `shouldRenderTo` library [i| - other-modules: - Paths_foo + |] `shouldRenderTo` library_ [i| |] + it "warns on duplicate fields" $ do + [i| + name: foo + name: foo + |] `shouldWarn` [ + "package.yaml: Duplicate field $.name" + ] describe "tested-with" $ do it "accepts a string" $ do @@ -62,14 +67,6 @@ , GHC == 7.4.2 |] - it "warns on duplicate fields" $ do - [i| - name: foo - name: foo - |] `shouldWarn` [ - "package.yaml: Duplicate field $.name" - ] - describe "handling of Paths_ module" $ do it "adds Paths_ to other-modules" $ do [i| @@ -77,6 +74,7 @@ |] `shouldRenderTo` library [i| other-modules: Paths_foo + default-language: Haskell2010 |] context "when cabal-version is >= 2" $ do @@ -90,6 +88,7 @@ Paths_foo autogen-modules: Paths_foo + default-language: Haskell2010 |]) { packageCabalVersion = "2.0" } context "when Paths_ module is listed explicitly under generated-other-modules" $ do @@ -104,6 +103,7 @@ Paths_foo autogen-modules: Paths_foo + default-language: Haskell2010 |]) { packageCabalVersion = "2.0" } context "when Paths_ module is listed explicitly under generated-exposed-modules" $ do @@ -118,6 +118,7 @@ Paths_foo autogen-modules: Paths_foo + default-language: Haskell2010 |]) { packageCabalVersion = "2.0" } context "when Paths_ is mentioned in a conditional that is always false" $ do @@ -128,9 +129,10 @@ - condition: false other-modules: Paths_foo |] `shouldRenderTo` library [i| + default-language: Haskell2010 |] - context "with RebindableSyntax and OverloadedStrings or OverloadedStrings" $ do + context "when Paths_ is used with RebindableSyntax and (OverloadedStrings or OverloadedLists)" $ do it "infers cabal-version 2.2" $ do [i| default-extensions: [RebindableSyntax, OverloadedStrings] @@ -143,6 +145,7 @@ Paths_foo autogen-modules: Paths_foo + default-language: Haskell2010 |]) {packageCabalVersion = "2.2"} context "when Paths_ is mentioned in a conditional that is always false" $ do @@ -157,6 +160,7 @@ default-extensions: RebindableSyntax OverloadedStrings + default-language: Haskell2010 |]) describe "spec-version" $ do @@ -342,11 +346,34 @@ github: sol/hpack-template path: defaults.yaml ref: "2017" - |] `shouldRenderTo` library [i| + |] `shouldRenderTo` library_ [i| exposed-modules: Foo - other-modules: - Paths_foo + |] + + it "accepts executable defaults" $ do + writeFile "defaults/sol/hpack-template/2017/.hpack/defaults.yaml" [i| + main: Foo.hs + |] + + [i| + executable: + defaults: sol/hpack-template@2017 + |] `shouldRenderTo` executable_ "foo" [i| + main-is: Foo.hs + |] + + it "gives `main` from executable section precedence" $ do + writeFile "defaults/sol/hpack-template/2017/.hpack/defaults.yaml" [i| + main: Foo.hs + |] + + [i| + executable: + main: Bar.hs + defaults: sol/hpack-template@2017 + |] `shouldRenderTo` executable_ "foo" [i| + main-is: Bar.hs |] it "accepts a list of defaults" $ do @@ -439,9 +466,7 @@ defaults: local: defaults/foo.yaml library: {} - |] `shouldRenderTo` library [i| - other-modules: - Paths_foo + |] `shouldRenderTo` library_ [i| default-extensions: RecordWildCards DeriveFunctor @@ -629,6 +654,19 @@ packageCabalVersion = "1.12" } + it "accepts build-tool-depends as an alias" $ do + [i| + executable: + build-tool-depends: + hspec-discover: 0.1.0 + |] `shouldRenderTo` (executable_ "foo" [i| + build-tool-depends: + hspec-discover:hspec-discover ==0.1.0 + |]) { + packageCabalVersion = "1.12" + , packageWarnings = ["package.yaml: $.executable.build-tool-depends is deprecated, use $.executable.build-tools instead"] + } + context "when the name of a build tool matches an executable from the same package" $ do it "adds it to build-tools" $ do [i| @@ -734,6 +772,17 @@ base |] + it "accepts build-depends as an alias" $ do + [i| + executable: + build-depends: base + |] `shouldRenderTo` (executable_ "foo" [i| + build-depends: + base + |]) { + packageWarnings = ["package.yaml: $.executable.build-depends is deprecated, use $.executable.dependencies instead"] + } + it "accepts dependencies with subcomponents" $ do [i| executable: @@ -794,6 +843,18 @@ , weston |] + it "accepts pkgconfig-depends as an alias" $ do + [i| + pkgconfig-depends: + - QtWebKit + - weston + executable: {} + |] `shouldRenderTo` executable_ "foo" [i| + pkgconfig-depends: + QtWebKit + , weston + |] + describe "include-dirs" $ do it "accepts include-dirs" $ do [i| @@ -867,9 +928,12 @@ when: condition: True cxx-options: -Wall - |] `shouldRenderTo` (executable_ "foo" [i| + |] `shouldRenderTo` (executable "foo" [i| + other-modules: + Paths_foo autogen-modules: Paths_foo + default-language: Haskell2010 if true if true if true @@ -891,6 +955,63 @@ cxxbits/bar.cc |]) {packageCabalVersion = "2.2"} + describe "language" $ do + it "accepts language" $ do + [i| + language: GHC2021 + executable: {} + |] `shouldRenderTo` executable "foo" [i| + other-modules: + Paths_foo + default-language: GHC2021 + |] + + it "omits language if it is null" $ do + [i| + language: null + executable: {} + |] `shouldRenderTo` executable "foo" [i| + other-modules: + Paths_foo + |] + + it "accepts default-language as an alias" $ do + [i| + default-language: GHC2021 + executable: {} + |] `shouldRenderTo` (executable "foo" [i| + other-modules: + Paths_foo + default-language: GHC2021 + |]) { + packageWarnings = ["package.yaml: $.default-language is deprecated, use $.language instead"] + } + + it "gives section-level language precedence" $ do + [i| + language: Haskell2010 + executable: + language: GHC2021 + |] `shouldRenderTo` executable "foo" [i| + other-modules: + Paths_foo + default-language: GHC2021 + |] + + it "accepts language from defaults" $ do + writeFile "defaults/sol/hpack-template/2017/.hpack/defaults.yaml" [i| + language: GHC2021 + |] + + [i| + defaults: sol/hpack-template@2017 + library: {} + |] `shouldRenderTo` library [i| + other-modules: + Paths_foo + default-language: GHC2021 + |] + describe "extra-lib-dirs" $ do it "accepts extra-lib-dirs" $ do [i| @@ -1054,6 +1175,7 @@ Foo other-modules: Foo + default-language: Haskell2010 |] context "with mixins" $ do @@ -1073,6 +1195,7 @@ foo mixins: foo (Blah as Etc) + default-language: Haskell2010 |]) {packageCabalVersion = "2.0"} describe "internal-libraries" $ do @@ -1137,6 +1260,7 @@ Foo other-modules: Paths_foo + default-language: Haskell2010 |] it "ignores duplicate modules" $ do @@ -1152,6 +1276,7 @@ Foo other-modules: Paths_foo + default-language: Haskell2010 |] context "with exposed-modules" $ do @@ -1170,6 +1295,7 @@ other-modules: Bar Paths_foo + default-language: Haskell2010 |] context "with other-modules" $ do @@ -1187,6 +1313,7 @@ Foo other-modules: Bar + default-language: Haskell2010 |] context "with both exposed-modules and other-modules" $ do @@ -1205,6 +1332,7 @@ Foo other-modules: Bar + default-language: Haskell2010 |] context "with neither exposed-modules nor other-modules" $ do @@ -1222,6 +1350,7 @@ Foo other-modules: Paths_foo + default-language: Haskell2010 |] context "with a conditional" $ do @@ -1236,15 +1365,17 @@ exposed-modules: - Foo - Paths_foo - |] `shouldRenderTo` library [i| - hs-source-dirs: - src - if os(windows) + |] `shouldRenderTo` package [i| + library + hs-source-dirs: + src exposed-modules: - Foo - Paths_foo - exposed-modules: - Bar + Bar + default-language: Haskell2010 + if os(windows) + exposed-modules: + Foo + Paths_foo |] context "with a source-dir inside the conditional" $ do @@ -1255,14 +1386,16 @@ when: condition: os(windows) source-dirs: windows - |] `shouldRenderTo` library [i| - other-modules: - Paths_foo - if os(windows) + |] `shouldRenderTo` package [i| + library other-modules: - Foo - hs-source-dirs: - windows + Paths_foo + default-language: Haskell2010 + if os(windows) + other-modules: + Foo + hs-source-dirs: + windows |] it "does not infer outer modules" $ do @@ -1278,17 +1411,19 @@ else: source-dirs: unix/ - |] `shouldRenderTo` library [i| - exposed-modules: - Foo - other-modules: - Paths_foo - if os(windows) - hs-source-dirs: - windows/ - else - hs-source-dirs: - unix/ + |] `shouldRenderTo` package [i| + library + exposed-modules: + Foo + other-modules: + Paths_foo + default-language: Haskell2010 + if os(windows) + hs-source-dirs: + windows/ + else + hs-source-dirs: + unix/ |] context "with generated modules" $ do @@ -1307,6 +1442,7 @@ Paths_foo Foo Bar + default-language: Haskell2010 |]) {packageCabalVersion = "2.0"} it "does not infer any mentioned generated modules" $ do @@ -1329,6 +1465,7 @@ Paths_foo Exposed Other + default-language: Haskell2010 |]) {packageCabalVersion = "2.0"} it "does not infer any generated modules mentioned inside conditionals" $ do @@ -1341,21 +1478,23 @@ condition: os(windows) generated-exposed-modules: Exposed generated-other-modules: Other - |] `shouldRenderTo` (library [i| - other-modules: - Paths_foo - autogen-modules: - Paths_foo - hs-source-dirs: - src - if os(windows) - exposed-modules: - Exposed + |] `shouldRenderTo` (package [i| + library other-modules: - Other + Paths_foo autogen-modules: - Other - Exposed + Paths_foo + hs-source-dirs: + src + default-language: Haskell2010 + if os(windows) + exposed-modules: + Exposed + other-modules: + Other + autogen-modules: + Other + Exposed |]) {packageCabalVersion = "2.0"} context "with an executable" $ do @@ -1374,6 +1513,7 @@ other-modules: Foo Paths_foo + default-language: Haskell2010 |] it "allows to specify other-modules" $ do @@ -1391,6 +1531,7 @@ src other-modules: Baz + default-language: Haskell2010 |] it "does not infer any mentioned generated modules" $ do @@ -1411,6 +1552,7 @@ autogen-modules: Paths_foo Foo + default-language: Haskell2010 |]) {packageCabalVersion = "2.0"} context "with a conditional" $ do @@ -1430,6 +1572,7 @@ Paths_foo hs-source-dirs: src + default-language: Haskell2010 if os(windows) other-modules: Foo @@ -1451,6 +1594,7 @@ Paths_foo hs-source-dirs: src + default-language: Haskell2010 if os(windows) other-modules: Bar @@ -1459,6 +1603,16 @@ |] describe "executables" $ do + it "accepts main-is as an alias for main" $ do + [i| + executable: + main-is: Foo.hs + |] `shouldRenderTo` (executable_ "foo" [i| + main-is: Foo.hs + |]) { + packageWarnings = ["package.yaml: $.executable.main-is is deprecated, use $.executable.main instead"] + } + it "accepts arbitrary entry points as main" $ do touch "src/Foo.hs" touch "src/Bar.hs" @@ -1475,6 +1629,7 @@ other-modules: Bar Paths_foo + default-language: Haskell2010 |] context "with a conditional" $ do @@ -1487,8 +1642,11 @@ when: condition: os(windows) main: Foo.hs - |] `shouldRenderTo` executable_ "foo" [i| + |] `shouldRenderTo` executable "foo" [i| ghc-options: -Wall + other-modules: + Paths_foo + default-language: Haskell2010 if os(windows) main-is: Foo.hs |] @@ -1500,7 +1658,10 @@ when: condition: os(windows) main: Foo - |] `shouldRenderTo` executable_ "foo" [i| + |] `shouldRenderTo` executable "foo" [i| + other-modules: + Paths_foo + default-language: Haskell2010 if os(windows) main-is: Foo.hs ghc-options: -main-is Foo @@ -1513,7 +1674,10 @@ condition: os(windows) dependencies: Win32 executable: {} - |] `shouldRenderTo` executable_ "foo" [i| + |] `shouldRenderTo` executable "foo" [i| + other-modules: + Paths_foo + default-language: Haskell2010 if os(windows) build-depends: Win32 @@ -1547,7 +1711,10 @@ else: dependencies: unix executable: {} - |] `shouldRenderTo` executable_ "foo" [i| + |] `shouldRenderTo` executable "foo" [i| + other-modules: + Paths_foo + default-language: Haskell2010 if os(windows) build-depends: Win32 @@ -1768,11 +1935,8 @@ shouldRenderTo :: HasCallStack => String -> Package -> Expectation shouldRenderTo input p = do writeFile packageConfig ("name: foo\n" ++ unindent input) - let currentDirectory = ".working-directory" - createDirectory currentDirectory - withCurrentDirectory currentDirectory $ do - (warnings, output) <- run ".." (".." </> packageConfig) expected - RenderResult warnings (dropEmptyLines output) `shouldBe` RenderResult (packageWarnings p) expected + (warnings, output) <- run "" packageConfig expected + RenderResult warnings (dropEmptyLines output) `shouldBe` RenderResult (packageWarnings p) expected where expected = dropEmptyLines (renderPackage p) dropEmptyLines = unlines . filter (not . null) . lines @@ -1813,7 +1977,6 @@ content = [i| library #{indentBy 2 $ unindent l} - default-language: Haskell2010 |] internalLibrary :: String -> String -> Package @@ -1842,7 +2005,6 @@ content = [i| executable #{name} #{indentBy 2 $ unindent e} - default-language: Haskell2010 |] package :: String -> Package diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hpack-0.34.6/test/Hpack/ConfigSpec.hs new/hpack-0.35.0/test/Hpack/ConfigSpec.hs --- old/hpack-0.34.6/test/Hpack/ConfigSpec.hs 2001-09-09 03:46:40.000000000 +0200 +++ new/hpack-0.35.0/test/Hpack/ConfigSpec.hs 2001-09-09 03:46:40.000000000 +0200 @@ -28,12 +28,14 @@ import Hpack.Syntax.Dependencies import Hpack.Syntax.DependencyVersion import Hpack.Syntax.BuildTools -import Hpack.Config hiding (package) +import Hpack.Config hiding (section, package) import qualified Hpack.Config as Config import Data.Aeson.Config.Types import Data.Aeson.Config.FromValue +section :: a -> Section a +section a = (Config.section a) {sectionLanguage = Just $ Language "Haskell2010"} instance Exts.IsList (Maybe (List a)) where type Item (Maybe (List a)) = a @@ -421,6 +423,15 @@ - foo - bar |] + (packageLibrary >>> (`shouldBe` Just (section library) {sectionSourceDirs = ["foo", "bar"]})) + + it "accepts hs-source-dirs as an alias for source-dirs" $ do + withPackageConfig_ [i| + library: + hs-source-dirs: + - foo + - bar + |] (packageLibrary >>> (`shouldBe` Just (section library) {sectionSourceDirs = ["foo", "bar"]})) it "accepts default-extensions" $ do diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hpack-0.34.6/test/Hpack/RenderSpec.hs new/hpack-0.35.0/test/Hpack/RenderSpec.hs --- old/hpack-0.34.6/test/Hpack/RenderSpec.hs 2001-09-09 03:46:40.000000000 +0200 +++ new/hpack-0.35.0/test/Hpack/RenderSpec.hs 2001-09-09 03:46:40.000000000 +0200 @@ -14,7 +14,9 @@ library = Library Nothing Nothing [] [] [] [] [] executable :: Section Executable -executable = section (Executable (Just "Main.hs") [] []) +executable = (section $ Executable (Just "Main.hs") [] []) { + sectionLanguage = Just $ Language "Haskell2010" +} renderEmptySection :: Empty -> [Element] renderEmptySection Empty = [] @@ -117,20 +119,8 @@ , "" , "library" , " buildable: False" - , " default-language: Haskell2010" ] - context "when rendering library section" $ do - it "renders library section" $ do - renderPackage_ package {packageLibrary = Just $ section library} `shouldBe` unlines [ - "name: foo" - , "version: 0.0.0" - , "build-type: Simple" - , "" - , "library" - , " default-language: Haskell2010" - ] - context "when given list of existing fields" $ do it "retains field order" $ do renderPackageWith defaultRenderSettings 16 ["version", "build-type", "name"] [] package `shouldBe` unlines [ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hpack-0.34.6/test/Hpack/Syntax/DependenciesSpec.hs new/hpack-0.35.0/test/Hpack/Syntax/DependenciesSpec.hs --- old/hpack-0.34.6/test/Hpack/Syntax/DependenciesSpec.hs 2001-09-09 03:46:40.000000000 +0200 +++ new/hpack-0.35.0/test/Hpack/Syntax/DependenciesSpec.hs 2001-09-09 03:46:40.000000000 +0200 @@ -212,7 +212,7 @@ outer-name: name: inner-name path: somewhere - |] `shouldDecodeTo` Right (Dependencies [("outer-name", defaultInfo { dependencyInfoVersion = DependencyVersion source AnyVersion })], ["$.outer-name.name"]) + |] `shouldDecodeTo` Right (Dependencies [("outer-name", defaultInfo { dependencyInfoVersion = DependencyVersion source AnyVersion })], ["$.outer-name.name"], []) it "defaults to any version" $ do [yaml|
890
Age (days ago)
890
Last active (days ago)
0 comments
1 participants
participants (1)
-
Source-Sync