hpack 0.14.1 → 0.15.0
raw patch · 6 files changed
+106/−16 lines, 6 filesdep ~aesonPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: aeson
API changes (from Hackage documentation)
- Hpack.Config: instance (Hpack.Config.HasFieldNames a, Data.Aeson.Types.Class.FromJSON a) => Data.Aeson.Types.Class.FromJSON (Hpack.Config.CaptureUnknownFields (Hpack.Config.Section a))
- Hpack.Config: instance Data.Aeson.Types.Class.FromJSON (Hpack.Config.CaptureUnknownFields Hpack.Config.FlagSection)
- Hpack.Config: instance Data.Aeson.Types.Class.FromJSON (Hpack.Config.CaptureUnknownFields Hpack.Config.ThenElse)
- Hpack.Config: instance Data.Aeson.Types.Class.FromJSON Hpack.Config.CommonOptions
- Hpack.Config: instance Data.Aeson.Types.Class.FromJSON Hpack.Config.Condition
- Hpack.Config: instance Data.Aeson.Types.Class.FromJSON Hpack.Config.ConditionalSection
- Hpack.Config: instance Data.Aeson.Types.Class.FromJSON Hpack.Config.Dependency
- Hpack.Config: instance Data.Aeson.Types.Class.FromJSON Hpack.Config.Empty
- Hpack.Config: instance Data.Aeson.Types.Class.FromJSON Hpack.Config.ExecutableSection
- Hpack.Config: instance Data.Aeson.Types.Class.FromJSON Hpack.Config.FlagSection
- Hpack.Config: instance Data.Aeson.Types.Class.FromJSON Hpack.Config.LibrarySection
- Hpack.Config: instance Data.Aeson.Types.Class.FromJSON Hpack.Config.PackageConfig
- Hpack.Config: instance Data.Aeson.Types.Class.FromJSON Hpack.Config.ThenElse
+ Hpack.Config: [packageBuildType] :: Package -> BuildType
+ Hpack.Config: [sectionCcOptions] :: Section a -> [CcOption]
+ Hpack.Config: instance (Hpack.Config.HasFieldNames a, Data.Aeson.Types.FromJSON.FromJSON a) => Data.Aeson.Types.FromJSON.FromJSON (Hpack.Config.CaptureUnknownFields (Hpack.Config.Section a))
+ Hpack.Config: instance Data.Aeson.Types.FromJSON.FromJSON (Hpack.Config.CaptureUnknownFields Hpack.Config.FlagSection)
+ Hpack.Config: instance Data.Aeson.Types.FromJSON.FromJSON (Hpack.Config.CaptureUnknownFields Hpack.Config.ThenElse)
+ Hpack.Config: instance Data.Aeson.Types.FromJSON.FromJSON Hpack.Config.BuildType
+ Hpack.Config: instance Data.Aeson.Types.FromJSON.FromJSON Hpack.Config.CommonOptions
+ Hpack.Config: instance Data.Aeson.Types.FromJSON.FromJSON Hpack.Config.Condition
+ Hpack.Config: instance Data.Aeson.Types.FromJSON.FromJSON Hpack.Config.ConditionalSection
+ Hpack.Config: instance Data.Aeson.Types.FromJSON.FromJSON Hpack.Config.Dependency
+ Hpack.Config: instance Data.Aeson.Types.FromJSON.FromJSON Hpack.Config.Empty
+ Hpack.Config: instance Data.Aeson.Types.FromJSON.FromJSON Hpack.Config.ExecutableSection
+ Hpack.Config: instance Data.Aeson.Types.FromJSON.FromJSON Hpack.Config.FlagSection
+ Hpack.Config: instance Data.Aeson.Types.FromJSON.FromJSON Hpack.Config.LibrarySection
+ Hpack.Config: instance Data.Aeson.Types.FromJSON.FromJSON Hpack.Config.PackageConfig
+ Hpack.Config: instance Data.Aeson.Types.FromJSON.FromJSON Hpack.Config.ThenElse
+ Hpack.Config: instance GHC.Classes.Eq Hpack.Config.BuildType
+ Hpack.Config: instance GHC.Generics.Generic Hpack.Config.BuildType
+ Hpack.Config: instance GHC.Show.Show Hpack.Config.BuildType
- Hpack.Config: Package :: String -> String -> Maybe String -> Maybe String -> Maybe String -> Maybe String -> Maybe String -> Maybe String -> [String] -> [String] -> [String] -> Maybe String -> Maybe FilePath -> Maybe String -> [Flag] -> [FilePath] -> [FilePath] -> Maybe SourceRepository -> Maybe (Section Library) -> [Section Executable] -> [Section Executable] -> [Section Executable] -> Package
+ Hpack.Config: Package :: String -> String -> Maybe String -> Maybe String -> Maybe String -> Maybe String -> Maybe String -> Maybe String -> [String] -> [String] -> [String] -> BuildType -> Maybe String -> Maybe FilePath -> Maybe String -> [Flag] -> [FilePath] -> [FilePath] -> Maybe SourceRepository -> Maybe (Section Library) -> [Section Executable] -> [Section Executable] -> [Section Executable] -> Package
- Hpack.Config: Section :: a -> [FilePath] -> [Dependency] -> [String] -> [String] -> [GhcOption] -> [GhcProfOption] -> [CppOption] -> [FilePath] -> [FilePath] -> [FilePath] -> [FilePath] -> [FilePath] -> [LdOption] -> Maybe Bool -> [Conditional] -> [Dependency] -> Section a
+ Hpack.Config: Section :: a -> [FilePath] -> [Dependency] -> [String] -> [String] -> [GhcOption] -> [GhcProfOption] -> [CppOption] -> [CcOption] -> [FilePath] -> [FilePath] -> [FilePath] -> [FilePath] -> [FilePath] -> [LdOption] -> Maybe Bool -> [Conditional] -> [Dependency] -> Section a
Files
- hpack.cabal +5/−5
- src/Hpack/Config.hs +32/−3
- src/Hpack/Run.hs +5/−1
- src/Hpack/Util.hs +3/−1
- test/Hpack/ConfigSpec.hs +53/−4
- test/Hpack/UtilSpec.hs +8/−2
hpack.cabal view
@@ -1,9 +1,9 @@--- This file has been generated from package.yaml by hpack version 0.14.0.+-- This file has been generated from package.yaml by hpack version 0.14.1. -- -- see: https://github.com/sol/hpack name: hpack-version: 0.14.1+version: 0.15.0 synopsis: An alternative format for Haskell packages category: Development homepage: https://github.com/sol/hpack#readme@@ -33,7 +33,7 @@ , containers , unordered-containers , yaml- , aeson >= 0.8+ , aeson >= 0.11 exposed-modules: Hpack Hpack.Config@@ -64,8 +64,8 @@ , containers , unordered-containers , yaml+ , aeson >= 0.11 , hpack- , aeson >= 0.8 default-language: Haskell2010 test-suite spec@@ -87,13 +87,13 @@ , containers , unordered-containers , yaml+ , aeson >= 0.11 , hspec == 2.* , QuickCheck , temporary , mockery >= 0.3 , interpolate , aeson-qq- , aeson >= 0.10 other-modules: Helper Hpack.ConfigSpec
src/Hpack/Config.hs view
@@ -5,6 +5,7 @@ {-# LANGUAGE DeriveTraversable #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE LambdaCase #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE ScopedTypeVariables #-}@@ -36,6 +37,7 @@ , Empty(..) , getModules , determineModules+, BuildType(..) #endif ) where @@ -63,7 +65,7 @@ import Hpack.Yaml package :: String -> String -> Package-package name version = Package name version Nothing Nothing Nothing Nothing Nothing Nothing [] [] [] Nothing Nothing Nothing [] [] [] Nothing Nothing [] [] []+package name version = Package name version Nothing Nothing Nothing Nothing Nothing Nothing [] [] [] Simple Nothing Nothing Nothing [] [] [] Nothing Nothing [] [] [] renamePackage :: String -> Package -> Package renamePackage name p@Package{..} = p {@@ -91,7 +93,7 @@ ++ maybe [] sectionDependencies packageLibrary section :: a -> Section a-section a = Section a [] [] [] [] [] [] [] [] [] [] [] [] [] Nothing [] []+section a = Section a [] [] [] [] [] [] [] [] [] [] [] [] [] [] Nothing [] [] packageConfig :: FilePath packageConfig = "package.yaml"@@ -99,7 +101,11 @@ githubBaseUrl :: String githubBaseUrl = "https://github.com/" +#if MIN_VERSION_aeson(1,0,0)+genericParseJSON_ :: forall a. (Generic a, GFromJSON Zero (Rep a), HasTypeName a) => Value -> Parser a+#else genericParseJSON_ :: forall a. (Generic a, GFromJSON (Rep a), HasTypeName a) => Value -> Parser a+#endif genericParseJSON_ = genericParseJSON defaultOptions {fieldLabelModifier = hyphenize name} where name :: String@@ -181,6 +187,7 @@ , commonOptionsGhcOptions :: Maybe (List GhcOption) , commonOptionsGhcProfOptions :: Maybe (List GhcProfOption) , commonOptionsCppOptions :: Maybe (List CppOption)+, commonOptionsCcOptions :: Maybe (List CcOption) , commonOptionsCSources :: Maybe (List FilePath) , commonOptionsExtraLibDirs :: Maybe (List FilePath) , commonOptionsExtraLibraries :: Maybe (List FilePath)@@ -241,6 +248,22 @@ instance HasFieldNames Empty where fieldNames _ = [] +-- From Cabal the library, copied here to avoid a dependency on Cabal.+data BuildType+ = Simple+ | Configure+ | Make+ | Custom+ deriving (Eq, Show, Generic)++instance FromJSON BuildType where+ parseJSON = withText "String" $ \case+ "Simple" -> return Simple+ "Configure" -> return Configure+ "Make" -> return Make+ "Custom" -> return Custom+ _ -> fail "build-type must be one of: Simple, Configure, Make, Custom"+ data PackageConfig = PackageConfig { packageConfigName :: Maybe String , packageConfigVersion :: Maybe String@@ -253,6 +276,7 @@ , packageConfigAuthor :: Maybe (List String) , packageConfigMaintainer :: Maybe (List String) , packageConfigCopyright :: Maybe (List String)+, packageConfigBuildType :: Maybe BuildType , packageConfigLicense :: Maybe String , packageConfigLicenseFile :: Maybe String , packageConfigTestedWith :: Maybe String@@ -353,6 +377,7 @@ , packageAuthor :: [String] , packageMaintainer :: [String] , packageCopyright :: [String]+, packageBuildType :: BuildType , packageLicense :: Maybe String , packageLicenseFile :: Maybe FilePath , packageTestedWith :: Maybe String@@ -388,6 +413,7 @@ , sectionGhcOptions :: [GhcOption] , sectionGhcProfOptions :: [GhcProfOption] , sectionCppOptions :: [CppOption]+, sectionCcOptions :: [CcOption] , sectionCSources :: [FilePath] , sectionExtraLibDirs :: [FilePath] , sectionExtraLibraries :: [FilePath]@@ -470,6 +496,7 @@ , packageAuthor = fromMaybeList packageConfigAuthor , packageMaintainer = fromMaybeList packageConfigMaintainer , packageCopyright = fromMaybeList packageConfigCopyright+ , packageBuildType = fromMaybe Simple packageConfigBuildType , packageLicense = packageConfigLicense , packageLicenseFile = packageConfigLicenseFile <|> (guard licenseFileExists >> Just "LICENSE") , packageTestedWith = packageConfigTestedWith@@ -607,6 +634,7 @@ , sectionGhcOptions = sectionGhcOptions globalOptions ++ sectionGhcOptions options , sectionGhcProfOptions = sectionGhcProfOptions globalOptions ++ sectionGhcProfOptions options , sectionCppOptions = sectionCppOptions globalOptions ++ sectionCppOptions options+ , sectionCcOptions = sectionCcOptions globalOptions ++ sectionCcOptions options , sectionCSources = sectionCSources globalOptions ++ sectionCSources options , sectionExtraLibDirs = sectionExtraLibDirs globalOptions ++ sectionExtraLibDirs options , sectionExtraLibraries = sectionExtraLibraries globalOptions ++ sectionExtraLibraries options@@ -621,7 +649,7 @@ toSection :: a -> CommonOptions -> ([FieldName], Section a) toSection a CommonOptions{..}- = ( concat unknownFields + = ( concat unknownFields , Section { sectionData = a , sectionSourceDirs = fromMaybeList commonOptionsSourceDirs@@ -630,6 +658,7 @@ , sectionGhcOptions = fromMaybeList commonOptionsGhcOptions , sectionGhcProfOptions = fromMaybeList commonOptionsGhcProfOptions , sectionCppOptions = fromMaybeList commonOptionsCppOptions+ , sectionCcOptions = fromMaybeList commonOptionsCcOptions , sectionCSources = fromMaybeList commonOptionsCSources , sectionExtraLibDirs = fromMaybeList commonOptionsExtraLibDirs , sectionExtraLibraries = fromMaybeList commonOptionsExtraLibraries
src/Hpack/Run.hs view
@@ -100,7 +100,7 @@ , ("license", packageLicense) , ("license-file", packageLicenseFile) , ("tested-with", packageTestedWith)- , ("build-type", Just "Simple")+ , ("build-type", Just (show packageBuildType)) , ("cabal-version", cabalVersion) ] @@ -209,6 +209,7 @@ , renderGhcOptions sectionGhcOptions , renderGhcProfOptions sectionGhcProfOptions , renderCppOptions sectionCppOptions+ , renderCcOptions sectionCcOptions , Field "include-dirs" (LineSeparatedList sectionIncludeDirs) , Field "install-includes" (LineSeparatedList sectionInstallIncludes) , Field "c-sources" (LineSeparatedList sectionCSources)@@ -254,6 +255,9 @@ renderCppOptions :: [CppOption] -> Element renderCppOptions = Field "cpp-options" . WordList++renderCcOptions :: [CcOption] -> Element+renderCcOptions = Field "cc-options" . WordList renderLdOptions :: [LdOption] -> Element renderLdOptions = Field "ld-options" . WordList
src/Hpack/Util.hs view
@@ -4,6 +4,7 @@ , GhcOption , GhcProfOption , CppOption+, CcOption , LdOption , parseMain , toModule@@ -50,6 +51,7 @@ type GhcOption = String type GhcProfOption = String type CppOption = String+type CcOption = String type LdOption = String parseMain :: String -> (FilePath, [GhcOption])@@ -71,7 +73,7 @@ toModule path = case reverse path of [] -> Nothing x : xs -> do- m <- stripSuffix ".hs" x <|> stripSuffix ".lhs" x+ m <- stripSuffix ".hs" x <|> stripSuffix ".lhs" x <|> stripSuffix ".hsc" x let name = reverse (m : xs) guard (isModule name) >> return (intercalate "." name) where
test/Hpack/ConfigSpec.hs view
@@ -457,6 +457,33 @@ |] (packageLicenseFile >>> (`shouldBe` Just "FOO")) + it "accepts build-type: Simple" $ do+ withPackageConfig_ [i|+ build-type: Simple+ |]+ (`shouldBe` package {packageBuildType = Simple})++ it "accepts build-type: Configure" $ do+ withPackageConfig_ [i|+ build-type: Configure+ |]+ (`shouldBe` package {packageBuildType = Configure})++ it "accepts build-type: Make" $ do+ withPackageConfig_ [i|+ build-type: Make+ |]+ (`shouldBe` package {packageBuildType = Make})++ it "accepts build-type: Custom" $ do+ withPackageConfig_ [i|+ build-type: Custom+ |]+ (`shouldBe` package {packageBuildType = Custom})++ it "rejects unknown build-type" $ do+ parseEither parseJSON (String "foobar") `shouldBe` (Left "Error in $: build-type must be one of: Simple, Configure, Make, Custom" :: Either String BuildType)+ it "accepts flags" $ do withPackageConfig_ [i| flags:@@ -546,6 +573,30 @@ } ) + it "accepts cc-options" $ do+ withPackageConfig_ [i|+ cc-options: -Wall+ library:+ cc-options: -fLIB++ executables:+ foo:+ main: Main.hs+ cc-options: -O2+++ tests:+ spec:+ main: Spec.hs+ cc-options: -O0+ |]+ (`shouldBe` package {+ packageLibrary = Just (section library) {sectionCcOptions = ["-Wall", "-fLIB"]}+ , packageExecutables = [(section $ executable "foo" "Main.hs") {sectionCcOptions = ["-Wall", "-O2"]}]+ , packageTests = [(section $ executable "spec" "Spec.hs") {sectionCcOptions = ["-Wall", "-O0"]}]+ }+ )+ it "accepts ld-options" $ do withPackageConfig_ [i| library:@@ -789,10 +840,8 @@ (do touch "src/Main.hs" touch "src/Foo.hs"- touch "src/Bar.hs"- touch "src/Baz.lhs" )- (map (executableOtherModules . sectionData) . packageExecutables >>> (`shouldBe` [["Bar", "Baz", "Foo"]]))+ (map (executableOtherModules . sectionData) . packageExecutables >>> (`shouldBe` [["Foo"]])) it "allows to specify other-modules" $ do withPackageConfig [i|@@ -969,7 +1018,7 @@ foo: ain: driver/Main.hs |]- readPackageConfig file `shouldReturn` Left (file ++ ": Error in $.executables.foo: failed to parse field executables: The key \"main\" was not found")+ readPackageConfig file >>= (`shouldSatisfy` isLeft) context "when package.yaml does not exist" $ do it "returns an error" $ \dir -> do
test/Hpack/UtilSpec.hs view
@@ -37,8 +37,14 @@ parseMain "Foo.bar" `shouldBe` ("Foo.hs", ["-main-is Foo.bar"]) describe "toModule" $ do- it "maps paths to module names" $ do- toModule ["Foo", "Bar", "Baz.hs"] `shouldBe` Just "Foo.Bar.Baz"+ it "maps .hs paths to module names" $ do+ toModule ["Foo", "Bar", "Baz.hs"] `shouldBe` Just "Foo.Bar.Baz"++ it "maps .lhs paths to module names" $ do+ toModule ["Foo", "Bar", "Baz.lhs"] `shouldBe` Just "Foo.Bar.Baz"++ it "maps .hsc paths to module names" $ do+ toModule ["Foo", "Bar", "Baz.hsc"] `shouldBe` Just "Foo.Bar.Baz" it "rejects invalid module names" $ do toModule ["resources", "hello.hs"] `shouldBe` Nothing