packages feed

cabal-bounds 0.1.16 → 0.2

raw patch · 20 files changed

+797/−125 lines, 20 files

Files

README.md view
@@ -38,27 +38,47 @@ The `=>` shows what the result is of the operation for every dependency. Left is the dependency before calling the command, right the one after calling. -    $> cabal-bounds drop myproject.cabal+    $> cabal-bounds drop ...     lens >=4.0.1 && <4.1   =>   lens -    $> cabal-bounds drop --upper myproject.cabal+    $> cabal-bounds drop --upper ...     lens >=4.0.1 && <4.1   =>   lens >=4.0.1  If the cabal build (the setup-config) uses `lens 4.1.2`, then the results of the `update` command would be: -    $> cabal-bounds update myproject.cabal setup-config+    $> cabal-bounds update ...     lens >=4.0.1 && <4.1   =>   lens >=4.1.2 && <4.2     lens                   =>   lens >=4.1.2 && <4.2 -    $> cabal-bounds update --lower myproject.cabal setup-config+    $> cabal-bounds update --lower ...     lens >=4.0.1 && <4.1   =>   lens >=4.1.2     lens <4.1              =>   lens >=4.1.2     lens                   =>   lens >=4.1.2 -    $> cabal-bounds update --upper myproject.cabal setup-config+    $> cabal-bounds update --upper ...     lens >=4.0.1 && <4.1   =>   lens >=4.0.1 && <4.2     lens >=4.0.1           =>   lens >=4.0.1 && <4.2     lens                   =>   lens >=4.1.2 && <4.2++You can also specify which component of the version number should be updated:++    $> cabal-bounds update --lowercomp=minor ...+    lens >=4.0.1 && <4.1   =>   lens >=4.1.2++    $> cabal-bounds update --lowercomp=major2 ...+    lens >=4.0.1 && <4.1   =>   lens >=4.1++    $> cabal-bounds update --lowercomp=major1 ...+    lens >=4.0.1 && <4.1   =>   lens >=4++    $> cabal-bounds update --uppercomp=minor ...+    lens >=4.0.1 && <4.1   =>   lens >=4.0.1 && <4.1.3++    $> cabal-bounds update --uppercomp=major2 ...+    lens >=4.0.1 && <4.1   =>   lens >=4.0.1 && <4.2++    $> cabal-bounds update --uppercomp=major1 ...+    lens >=4.0.1 && <4.1   =>   lens >=4.0.1 && <5  Options =======
cabal-bounds.cabal view
@@ -1,5 +1,5 @@ name: cabal-bounds-version: 0.1.16+version: 0.2 cabal-version: >=1.9.2 build-type: Simple license: BSD3@@ -49,30 +49,50 @@              The '=>' shows what the result is of the operation for every dependency. Left is the dependency before              calling the command, right the one after calling.              .-             > $> cabal-bounds drop myproject.cabal+             > $> cabal-bounds drop ...              > lens >=4.0.1 && <4.1   =>   lens              > -             > $> cabal-bounds drop --upper myproject.cabal+             > $> cabal-bounds drop --upper ...              > lens >=4.0.1 && <4.1   =>   lens >=4.0.1              .              If the cabal build (the setup-config) uses 'lens 4.1.2', then the results of the 'update' command would be:              .-             > $> cabal-bounds update myproject.cabal setup-config+             > $> cabal-bounds update ...              > lens >=4.0.1 && <4.1   =>   lens >=4.1.2 && <4.2              > lens                   =>   lens >=4.1.2 && <4.2              >-             > $> cabal-bounds update --lower myproject.cabal setup-config+             > $> cabal-bounds update --lower ...              > lens >=4.0.1 && <4.1   =>   lens >=4.1.2              > lens <4.1              =>   lens >=4.1.2              > lens                   =>   lens >=4.1.2              >-             > $> cabal-bounds update --upper myproject.cabal setup-config+             > $> cabal-bounds update --upper ...              > lens >=4.0.1 && <4.1   =>   lens >=4.0.1 && <4.2              > lens >=4.0.1           =>   lens >=4.0.1 && <4.2              > lens                   =>   lens >=4.1.2 && <4.2              .+             You can also specify which component of the version number should be updated:              .+             > $> cabal-bounds update --lowercomp=minor ...+             > lens >=4.0.1 && <4.1   =>   lens >=4.1.2+             >+             > $> cabal-bounds update --lowercomp=major2 ...+             > lens >=4.0.1 && <4.1   =>   lens >=4.1+             >+             > $> cabal-bounds update --lowercomp=major1 ...+             > lens >=4.0.1 && <4.1   =>   lens >=4+             >+             > $> cabal-bounds update --uppercomp=minor ...+             > lens >=4.0.1 && <4.1   =>   lens >=4.0.1 && <4.1.3+             >+             > $> cabal-bounds update --uppercomp=major2 ...+             > lens >=4.0.1 && <4.1   =>   lens >=4.0.1 && <4.2+             >+             > $> cabal-bounds update --uppercomp=major1 ...+             > lens >=4.0.1 && <4.1   =>   lens >=4.0.1 && <5              .+             .+             .              /Installation/              .              .@@ -145,7 +165,7 @@ library     build-depends: base >=3 && <5, cmdargs >=0.10.5 && <0.11,                    lens >=4.0.1 && <4.1, strict >=0.3.2 && <0.4, Cabal >=1.18.0 && <1.19-    exposed-modules: CabalBounds.Args CabalBounds.Main+    exposed-modules: CabalBounds.Args CabalBounds.Main CabalBounds.VersionComp     exposed: True     buildable: True     cpp-options: -DCABAL@@ -165,7 +185,7 @@     other-modules: Paths_cabal_bounds CabalBounds.Args                    CabalBounds.Bound CabalBounds.Targets CabalBounds.Dependencies                    CabalBounds.Drop CabalBounds.Update CabalBounds.Lenses-                   CabalBounds.Main+                   CabalBounds.VersionComp CabalBounds.Main     ghc-options: -W   test-suite cabal-bounds-tests
src/CabalBounds/Args.hs view
@@ -10,6 +10,7 @@    ) where  import System.Console.CmdArgs hiding (ignore)+import CabalBounds.VersionComp (VersionComp(..))  #ifdef CABAL import Data.Version (showVersion)@@ -28,6 +29,8 @@                  }           | Update { lower           :: Bool                    , upper           :: Bool+                   , lowerComp       :: Maybe VersionComp+                   , upperComp       :: Maybe VersionComp                    , library         :: Bool                    , executable      :: [String]                    , testSuite       :: [String]@@ -76,6 +79,8 @@ defaultUpdate = Update    { lower           = False    , upper           = False+   , lowerComp       = Nothing+   , upperComp       = Nothing    , library         = False    , executable      = []    , testSuite       = []@@ -104,8 +109,10 @@  updateArgs :: Args updateArgs = Update-   { lower           = def &= explicit &= name "lower" &= name "L" &= help "Only the lower bound is updated."-   , upper           = def &= explicit &= name "upper" &= name "U" &= help "Only the upper bound is updated."+   { lower           = def &= explicit &= name "lower" &= name "L" &= help "Only the lower bound is updated. The same as using '--lowercomp=minor'."+   , upper           = def &= explicit &= name "upper" &= name "U" &= help "Only the upper bound is updated. The same as using '--uppercomp=major2'."+   , lowerComp       = def &= explicit &= name "lowercomp" &= help "Only the lower bound is updated with the specified version component. (major1, major2 or minor)" +   , upperComp       = def &= explicit &= name "uppercomp" &= help "Only the upper bound is updated with the specified version component. (major1, major2 or minor)"    , setupConfigFile = def &= argPos 1 &= typ "SETUP-CONFIG-FILE"    } 
src/CabalBounds/Bound.hs view
@@ -1,21 +1,61 @@+{-# Language PatternGuards #-}  module CabalBounds.Bound-   ( Bound(..)-   , bound+   ( DropBound(..)+   , UpdateBound(..)+   , boundOfDrop+   , boundOfUpdate    ) where    -import CabalBounds.Args+import CabalBounds.Args (Args(Drop, Update))+import qualified CabalBounds.Args as A+import CabalBounds.VersionComp (VersionComp(..), defaultLowerComp, defaultUpperComp)+import Data.Maybe (isJust) -data Bound = LowerBound-           | UpperBound-           | BothBounds-           deriving (Show, Eq)+data DropBound = DropUpper+               | DropBoth+               deriving (Show, Eq) -bound :: Args -> Bound-bound Drop {upper = upper} = if upper then UpperBound else BothBounds+data UpdateBound = UpdateLower VersionComp+                 | UpdateUpper VersionComp+                 | UpdateBoth { lowerComp :: VersionComp, upperComp :: VersionComp }+                 deriving (Show, Eq) -bound Update {lower = lower, upper = upper}-   | lower && upper = BothBounds-   | lower          = LowerBound-   | upper          = UpperBound-   | otherwise      = BothBounds++boundOfDrop :: Args -> DropBound+boundOfDrop Drop {A.upper = upper} = if upper then DropUpper else DropBoth+boundOfDrop _  = error "Expected Drop Args!"+++boundOfUpdate :: Args -> UpdateBound+boundOfUpdate upd@Update {}+   | hasLower && hasUpper+   = UpdateBoth lowerComp upperComp++   | hasLower+   = UpdateLower lowerComp++   | hasUpper+   = UpdateUpper upperComp++   | otherwise+   = UpdateBoth lowerComp upperComp+   where+      lowerComp+         | Just comp <- A.lowerComp upd+         = comp++         | otherwise+         = defaultLowerComp++      upperComp+         | Just comp <- A.upperComp upd+         = comp++         | otherwise+         = defaultUpperComp++      hasLower = A.lower upd || (isJust . A.lowerComp $ upd)+      hasUpper = A.upper upd || (isJust . A.upperComp $ upd)++boundOfUpdate _ = error "Expected Update Args!"
src/CabalBounds/Dependencies.hs view
@@ -8,7 +8,7 @@  import Control.Lens  import qualified CabalBounds.Args as A-import qualified Distribution.Package as C+import Distribution.Package (Dependency(..), PackageName(..))  data Dependencies = AllDependencies                   | OnlyDependencies [String]@@ -28,12 +28,12 @@    = AllDependencies  -filterDependencies :: Dependencies -> Traversal' [C.Dependency] C.Dependency+filterDependencies :: Dependencies -> Traversal' [Dependency] Dependency filterDependencies AllDependencies =    traversed  filterDependencies (OnlyDependencies deps) =-   traversed . filtered (\(C.Dependency (C.PackageName pkgName) _) -> any (== pkgName) deps) +   traversed . filtered (\(Dependency (PackageName pkgName) _) -> any (== pkgName) deps)  filterDependencies (IgnoreDependencies deps) =-   traversed . filtered (\(C.Dependency (C.PackageName pkgName) _) -> all (/= pkgName) deps)+   traversed . filtered (\(Dependency (PackageName pkgName) _) -> all (/= pkgName) deps)
src/CabalBounds/Drop.hs view
@@ -5,23 +5,23 @@    ) where  import Prelude hiding (drop)-import qualified Distribution.PackageDescription as C-import qualified Distribution.Package as C-import qualified Distribution.Version as C import Control.Lens-import CabalBounds.Bound (Bound(..))+import CabalBounds.Bound (DropBound(..)) import CabalBounds.Targets (Targets(..), dependenciesOf) import CabalBounds.Dependencies (Dependencies, filterDependencies)-import CabalBounds.Lenses+import qualified CabalBounds.Lenses as L import Data.List (foldl')+import Distribution.PackageDescription (GenericPackageDescription)+import Distribution.Package (Dependency(..))+import Distribution.Version (mkVersionIntervals, fromVersionIntervals, asVersionIntervals, UpperBound(..), anyVersion)  -drop :: Bound -> Targets -> Dependencies -> C.GenericPackageDescription -> C.GenericPackageDescription+drop :: DropBound -> Targets -> Dependencies -> GenericPackageDescription -> GenericPackageDescription drop bound AllTargets deps pkgDescrp =-   pkgDescrp & dependenciesOfLib        . filterDeps %~ dropFromDep-             & dependenciesOfAllExes    . filterDeps %~ dropFromDep-             & dependenciesOfAllTests   . filterDeps %~ dropFromDep-             & dependenciesOfAllBenchms . filterDeps %~ dropFromDep+   pkgDescrp & L.dependenciesOfLib        . filterDeps %~ dropFromDep+             & L.dependenciesOfAllExes    . filterDeps %~ dropFromDep+             & L.dependenciesOfAllTests   . filterDeps %~ dropFromDep+             & L.dependenciesOfAllBenchms . filterDeps %~ dropFromDep    where       filterDeps  = filterDependencies deps       dropFromDep = dropFromDependency bound@@ -37,16 +37,16 @@       dropFromDep = dropFromDependency bound  -dropFromDependency :: Bound -> C.Dependency -> C.Dependency-dropFromDependency UpperBound (C.Dependency pkgName versionRange) = C.Dependency pkgName versionRange'+dropFromDependency :: DropBound -> Dependency -> Dependency+dropFromDependency DropUpper (Dependency pkgName versionRange) = Dependency pkgName versionRange'    where       versionRange'-         | Just vi <- C.mkVersionIntervals intervals' -         = C.fromVersionIntervals vi+         | Just vi <- mkVersionIntervals intervals'+         = fromVersionIntervals vi           | otherwise          = versionRange -      intervals' = map (& _2 .~ C.NoUpperBound) (C.asVersionIntervals versionRange)+      intervals' = map (& _2 .~ NoUpperBound) (asVersionIntervals versionRange) -dropFromDependency _ (C.Dependency pkgName _) = C.Dependency pkgName C.anyVersion+dropFromDependency DropBoth (Dependency pkgName _) = Dependency pkgName anyVersion
src/CabalBounds/Lenses.hs view
@@ -1,9 +1,20 @@ {-# LANGUAGE TemplateHaskell, Rank2Types #-} -module CabalBounds.Lenses where+module CabalBounds.Lenses+   ( vbranch+   , vtags+   , dependenciesOfLib+   , dependenciesOfAllExes+   , dependenciesOfExe+   , dependenciesOfAllTests+   , dependenciesOfTest+   , dependenciesOfAllBenchms+   , dependenciesOfBenchm+   ) where  import Distribution.PackageDescription import Distribution.Package+import Distribution.Version import Control.Lens import Data.Data.Lens @@ -13,17 +24,9 @@               , ("condBenchmarks" , "condBenchmarksL")               ] ''GenericPackageDescription -makeLensesFor [ ("condTreeConstraints", "condTreeConstraintsL")-              ] ''CondTree--makeLensesFor [ ("exeName", "exeNameL")-              ] ''Executable--makeLensesFor [ ("testName", "testNameL")-              ] ''TestSuite--makeLensesFor [ ("benchmarkName", "benchmarkNameL")-              ] ''Benchmark+makeLensesFor [ ("versionBranch", "vbranch")+              , ("versionTags"  , "vtags")+              ] ''Version  dependenciesOfLib :: Traversal' GenericPackageDescription [Dependency] dependenciesOfLib = condLibraryL . _Just . biplate
src/CabalBounds/Main.hs view
@@ -26,7 +26,7 @@    case pkgDescrp of         Left  error      -> return . Just $ error         Right pkgDescrp_ -> do-           let pkgDescrp' = D.drop (B.bound args) (T.targets args) (DP.dependencies args) pkgDescrp_+           let pkgDescrp' = D.drop (B.boundOfDrop args) (T.targets args) (DP.dependencies args) pkgDescrp_            writeFile (A.outputFile args) (showGenericPackageDescription pkgDescrp')            return Nothing @@ -37,7 +37,7 @@         (Left error, _) -> return . Just $ error         (_, Left error) -> return . Just $ error         (Right pkgDescrp_, Right buildInfo_) -> do-           let pkgDescrp' = U.update (B.bound args) (T.targets args) (DP.dependencies args) pkgDescrp_ buildInfo_+           let pkgDescrp' = U.update (B.boundOfUpdate args) (T.targets args) (DP.dependencies args) pkgDescrp_ buildInfo_            writeFile (A.outputFile args) (showGenericPackageDescription pkgDescrp')            return Nothing 
src/CabalBounds/Targets.hs view
@@ -8,10 +8,11 @@    ) where  import Control.Lens-import qualified Distribution.PackageDescription as C-import qualified Distribution.Package as C-import CabalBounds.Args-import CabalBounds.Lenses+import Distribution.PackageDescription (GenericPackageDescription(..))+import Distribution.Package (Dependency(..))+import CabalBounds.Args (Args)+import qualified CabalBounds.Args as A+import qualified CabalBounds.Lenses as L  data Targets = Targets [Target]              | AllTargets@@ -25,10 +26,10 @@  targets :: Args -> Targets targets args -   | ts@(_:_) <- concat [ if (library args) then [Library] else []-                        , map Executable (executable args)-                        , map TestSuite (testSuite args)-                        , map Benchmark (benchmark args)+   | ts@(_:_) <- concat [ if (A.library args) then [Library] else []+                        , map Executable (A.executable args)+                        , map TestSuite (A.testSuite args)+                        , map Benchmark (A.benchmark args)                         ]    = Targets ts @@ -36,8 +37,8 @@    = AllTargets  -dependenciesOf :: Target -> Traversal' C.GenericPackageDescription [C.Dependency]-dependenciesOf Library            = dependenciesOfLib-dependenciesOf (Executable exe)   = dependenciesOfExe exe-dependenciesOf (TestSuite test)   = dependenciesOfTest test-dependenciesOf (Benchmark benchm) = dependenciesOfBenchm benchm+dependenciesOf :: Target -> Traversal' GenericPackageDescription [Dependency]+dependenciesOf Library            = L.dependenciesOfLib+dependenciesOf (Executable exe)   = L.dependenciesOfExe exe+dependenciesOf (TestSuite test)   = L.dependenciesOfTest test+dependenciesOf (Benchmark benchm) = L.dependenciesOfBenchm benchm
src/CabalBounds/Update.hs view
@@ -4,22 +4,23 @@    ( update    ) where -import qualified Distribution.PackageDescription as C-import qualified Distribution.Package as C-import qualified Distribution.Version as C-import qualified Distribution.Simple.LocalBuildInfo as C-import qualified Distribution.Simple.PackageIndex as C-import qualified Distribution.InstalledPackageInfo as C+import qualified Distribution.PackageDescription as D+import qualified Distribution.Package as P+import qualified Distribution.Version as V+import qualified Distribution.Simple.LocalBuildInfo as L+import qualified Distribution.Simple.PackageIndex as PX+import qualified Distribution.InstalledPackageInfo as PI import Control.Lens-import CabalBounds.Bound (Bound(..))+import CabalBounds.Bound (UpdateBound(..)) import CabalBounds.Targets (Targets(..), dependenciesOf) import CabalBounds.Dependencies (Dependencies, filterDependencies)+import CabalBounds.VersionComp (VersionComp(..), defaultLowerComp) import CabalBounds.Lenses import Data.List (sort, foldl', find) -type InstalledPackages = [(C.PackageName, C.Version)]+type InstalledPackages = [(P.PackageName, V.Version)] -update :: Bound -> Targets -> Dependencies -> C.GenericPackageDescription -> C.LocalBuildInfo -> C.GenericPackageDescription+update :: UpdateBound -> Targets -> Dependencies -> D.GenericPackageDescription -> L.LocalBuildInfo -> D.GenericPackageDescription update bound AllTargets deps pkgDescrp buildInfo =    pkgDescrp & dependenciesOfLib        . filterDeps %~ updateDep              & dependenciesOfAllExes    . filterDeps %~ updateDep@@ -40,58 +41,66 @@       updateDep  = updateDependency bound (installedPackages buildInfo)  -updateDependency :: Bound -> InstalledPackages -> C.Dependency -> C.Dependency-updateDependency LowerBound instPkgs dep@(C.Dependency pkgName _)+updateDependency :: UpdateBound -> InstalledPackages -> P.Dependency -> P.Dependency+updateDependency (UpdateLower comp) instPkgs dep@(P.Dependency pkgName _)    | Just (_, version) <- find ((== pkgName) . fst) instPkgs-   , Just intervals    <- versionIntervals version Nothing-   = C.Dependency pkgName (C.fromVersionIntervals intervals)+   , Just intervals    <- versionIntervals (versionComp comp version) Nothing+   = P.Dependency pkgName (V.fromVersionIntervals intervals)     | otherwise    = dep -updateDependency UpperBound instPkgs dep@(C.Dependency pkgName versionRange)-   | not . C.isAnyVersion $ versionRange+updateDependency (UpdateUpper comp) instPkgs dep@(P.Dependency pkgName versionRange)+   | not . V.isAnyVersion $ versionRange    , Just (_, upperVersion)             <- find ((== pkgName) . fst) instPkgs-   , (C.LowerBound lowerVersion _, _):_ <- C.asVersionIntervals versionRange-   , Just intervals                     <- versionIntervals lowerVersion (Just $ nextMajorVersion upperVersion)-   = C.Dependency pkgName (C.fromVersionIntervals intervals)+   , (V.LowerBound lowerVersion _, _):_ <- V.asVersionIntervals versionRange+   , Just intervals                     <- versionIntervals lowerVersion (Just $ nextVersion $ versionComp comp upperVersion)+   = P.Dependency pkgName (V.fromVersionIntervals intervals)     | otherwise-   = updateDependency BothBounds instPkgs dep+   = updateDependency (UpdateBoth defaultLowerComp comp) instPkgs dep -updateDependency BothBounds instPkgs dep@(C.Dependency pkgName _)+updateDependency (UpdateBoth lowerComp upperComp) instPkgs dep@(P.Dependency pkgName _)    | Just (_, version) <- find ((== pkgName) . fst) instPkgs-   , Just intervals    <- versionIntervals version (Just $ nextMajorVersion version)-   = C.Dependency pkgName (C.fromVersionIntervals intervals)+   , Just intervals    <- versionIntervals (versionComp lowerComp version) (Just $ nextVersion $ versionComp upperComp version)+   = P.Dependency pkgName (V.fromVersionIntervals intervals)     | otherwise    = dep  -versionIntervals :: C.Version -> Maybe C.Version -> Maybe C.VersionIntervals+versionIntervals :: V.Version -> Maybe V.Version -> Maybe V.VersionIntervals versionIntervals lowerVersion Nothing =-   C.mkVersionIntervals [(C.LowerBound lowerVersion C.InclusiveBound, C.NoUpperBound)]+   V.mkVersionIntervals [(V.LowerBound lowerVersion V.InclusiveBound, V.NoUpperBound)]  versionIntervals lowerVersion (Just upperVersion) =-   C.mkVersionIntervals [(C.LowerBound lowerVersion C.InclusiveBound, C.UpperBound upperVersion C.ExclusiveBound)]+   V.mkVersionIntervals [(V.LowerBound lowerVersion V.InclusiveBound, V.UpperBound upperVersion V.ExclusiveBound)]  -nextMajorVersion :: C.Version -> C.Version-nextMajorVersion version-   | (v1:v2:_) <- C.versionBranch version-   = C.Version {C.versionBranch = [v1, (v2 + 1)], C.versionTags = []}+versionComp :: VersionComp -> V.Version -> V.Version+versionComp Major1 version =+   version & vbranch %~ take 1+           & vtags   .~ [] -   | (v1:_)    <- C.versionBranch version-   = C.Version {C.versionBranch = [v1, 1], C.versionTags = []}+versionComp Major2 version =+   version & vbranch %~ take 2+           & vtags   .~ [] -   | otherwise-   = version+versionComp Minor version =+   version & vtags .~ []  -installedPackages :: C.LocalBuildInfo -> InstalledPackages+nextVersion :: V.Version -> V.Version+nextVersion version =+   version & vbranch %~ increaseLast+   where+      increaseLast = reverse . (& ix 0 %~ (+ 1)) . reverse+++installedPackages :: L.LocalBuildInfo -> InstalledPackages installedPackages = map (& _2 %~ newestVersion)                     . filter ((not . null) . snd)-                    . C.allPackagesByName . C.installedPkgs+                    . PX.allPackagesByName . L.installedPkgs    where-      newestVersion :: [C.InstalledPackageInfo] -> C.Version-      newestVersion = last . sort . map (C.pkgVersion . C.sourcePackageId)+      newestVersion :: [PI.InstalledPackageInfo] -> V.Version+      newestVersion = last . sort . map (P.pkgVersion . PI.sourcePackageId)
+ src/CabalBounds/VersionComp.hs view
@@ -0,0 +1,23 @@+{-# LANGUAGE DeriveDataTypeable #-}++module CabalBounds.VersionComp+   ( VersionComp(..)+   , defaultLowerComp+   , defaultUpperComp+   ) where++import Data.Data (Data(..), Typeable(..))++-- | The component of a version number A.B.C -> Major1.Major2.Minor+data VersionComp = Major1+                 | Major2+                 | Minor+                 deriving (Data, Typeable, Eq, Show)+++defaultLowerComp :: VersionComp+defaultLowerComp = Minor+++defaultUpperComp :: VersionComp+defaultUpperComp = Major2
tests/Main.hs view
@@ -1,20 +1,21 @@  module Main where -import Test.Tasty-import Test.Tasty.Golden-import System.FilePath+import qualified Test.Tasty as T+import qualified Test.Tasty.Golden as G import System.IO (hPutStrLn, stderr)+import System.FilePath ((</>), (<.>)) import CabalBounds.Args import CabalBounds.Main (cabalBounds)+import CabalBounds.VersionComp (VersionComp(..)) -main = defaultMain tests+main = T.defaultMain tests -tests :: TestTree-tests = testGroup "Tests" [dropTests, updateTests]+tests :: T.TestTree+tests = T.testGroup "Tests" [dropTests, updateTests] -dropTests :: TestTree-dropTests = testGroup "Drop Tests"+dropTests :: T.TestTree+dropTests = T.testGroup "Drop Tests"    [ test "DropBothOfAll" defaultDrop    , test "DropUpperOfAll" $ defaultDrop { upper = True }    , test "DropBothOfLib" $ defaultDrop { library = True }@@ -34,8 +35,8 @@    ]  -updateTests :: TestTree-updateTests = testGroup "Update Tests"+updateTests :: T.TestTree+updateTests = T.testGroup "Update Tests"    [ test "UpdateBothOfAll" $ defaultUpdate    , test "UpdateBothOfAll" $ defaultUpdate { lower = True, upper = True }    , test "UpdateBothOfAllExes" $ defaultUpdate { executable = ["cabal-bounds", "other-exe"] }@@ -59,12 +60,20 @@    , test "UpdateUpperOnlyBase" $ defaultUpdate { upper = True, only = ["base"] }    , test "UpdateBothIgnoreBase" $ defaultUpdate { ignore = ["base"] }    , test "UpdateLowerIgnoreBase" $ defaultUpdate { lower = True, ignore = ["base"] }+   , test "UpdateMinorLower" $ defaultUpdate { lowerComp = Just Minor }+   , test "UpdateMajor2Lower" $ defaultUpdate {lowerComp = Just Major2 }+   , test "UpdateMajor1Lower" $ defaultUpdate {lowerComp = Just Major1 }+   , test "UpdateMinorUpper" $ defaultUpdate { upperComp = Just Minor }+   , test "UpdateMajor2Upper" $ defaultUpdate {upperComp = Just Major2 }+   , test "UpdateMajor1Upper" $ defaultUpdate {upperComp = Just Major1 }+   , test "UpdateMinorLowerAndUpper" $ defaultUpdate { lowerComp = Just Minor, upperComp = Just Minor }+   , test "UpdateMajor1LowerAndUpper" $ defaultUpdate { lowerComp = Just Major1, upperComp = Just Major1 }    ]   -test :: String -> Args -> TestTree+test :: String -> Args -> T.TestTree test testName args =-   goldenVsFileDiff testName diff goldenFile outputFile command+   G.goldenVsFileDiff testName diff goldenFile outputFile command    where       command = do          error <- cabalBounds argsWithFiles
+ tests/goldenFiles/UpdateMajor1Lower.cabal view
@@ -0,0 +1,65 @@+name: cabal-bounds+version: 0.1+cabal-version: >=1.9.2+build-type: Simple+license: BSD3+license-file: LICENSE+maintainer: daniel.trstenjak@gmail.com+synopsis: A command line program for managing the bounds/versions of the dependencies in a cabal file.+description: A command line program for managing the bounds/versions of the dependencies in a cabal file.+category: Utils+author: Daniel Trstenjak+data-dir: ""+ +source-repository head+    type: git+    location: https://github.com/dan-t/cabal-bounds+ +library+    build-depends: base >=4, cmdargs -any, lens >=4, pretty-show -any,+                   strict -any, Cabal >=1+    exposed-modules: CabalBounds.Args CabalBounds.Command+                     CabalBounds.Execute CabalBounds.Lenses+    exposed: True+    buildable: True+    hs-source-dirs: src+    other-modules: Paths_cabal_bounds CabalBounds.Args+                   CabalBounds.Command CabalBounds.Execute CabalBounds.Lenses+ +executable cabal-bounds+    build-depends: base >=4, cmdargs -any, lens >=4, pretty-show -any,+                   strict -any, Cabal >=1+    main-is: Main.hs+    buildable: True+    cpp-options: -DCABAL+    hs-source-dirs: src+    other-modules: Paths_cabal_bounds CabalBounds.Args+                   CabalBounds.Command CabalBounds.Execute CabalBounds.Lenses+    ghc-options: -W+ +executable other-exe+    build-depends: base >=4, cmdargs -any, lens >=4, pretty-show -any,+                   strict -any, Cabal >=1+    main-is: Main.hs+    buildable: True+    cpp-options: -DCABAL+    hs-source-dirs: src+    other-modules: Paths_cabal_bounds CabalBounds.Args+                   CabalBounds.Command CabalBounds.Execute CabalBounds.Lenses+    ghc-options: -W+ +test-suite some-test+    build-depends: base >=4, cmdargs -any, lens >=4, pretty-show -any,+                   strict -any, Cabal >=1+    type: exitcode-stdio-1.0+    main-is: Main.hs+    buildable: True+    ghc-options: -W+test-suite other-test+    build-depends: base >=4, cmdargs -any, lens >=4, pretty-show -any,+                   strict -any, Cabal >=1+    type: exitcode-stdio-1.0+    main-is: Main.hs+    buildable: True+    ghc-options: -W+ 
+ tests/goldenFiles/UpdateMajor1LowerAndUpper.cabal view
@@ -0,0 +1,65 @@+name: cabal-bounds+version: 0.1+cabal-version: >=1.9.2+build-type: Simple+license: BSD3+license-file: LICENSE+maintainer: daniel.trstenjak@gmail.com+synopsis: A command line program for managing the bounds/versions of the dependencies in a cabal file.+description: A command line program for managing the bounds/versions of the dependencies in a cabal file.+category: Utils+author: Daniel Trstenjak+data-dir: ""+ +source-repository head+    type: git+    location: https://github.com/dan-t/cabal-bounds+ +library+    build-depends: base ==4.*, cmdargs ==0.*, lens ==4.*,+                   pretty-show -any, strict ==0.*, Cabal ==1.*+    exposed-modules: CabalBounds.Args CabalBounds.Command+                     CabalBounds.Execute CabalBounds.Lenses+    exposed: True+    buildable: True+    hs-source-dirs: src+    other-modules: Paths_cabal_bounds CabalBounds.Args+                   CabalBounds.Command CabalBounds.Execute CabalBounds.Lenses+ +executable cabal-bounds+    build-depends: base ==4.*, cmdargs ==0.*, lens ==4.*,+                   pretty-show -any, strict ==0.*, Cabal ==1.*+    main-is: Main.hs+    buildable: True+    cpp-options: -DCABAL+    hs-source-dirs: src+    other-modules: Paths_cabal_bounds CabalBounds.Args+                   CabalBounds.Command CabalBounds.Execute CabalBounds.Lenses+    ghc-options: -W+ +executable other-exe+    build-depends: base ==4.*, cmdargs ==0.*, lens ==4.*,+                   pretty-show -any, strict ==0.*, Cabal ==1.*+    main-is: Main.hs+    buildable: True+    cpp-options: -DCABAL+    hs-source-dirs: src+    other-modules: Paths_cabal_bounds CabalBounds.Args+                   CabalBounds.Command CabalBounds.Execute CabalBounds.Lenses+    ghc-options: -W+ +test-suite some-test+    build-depends: base ==4.*, cmdargs ==0.*, lens ==4.*,+                   pretty-show -any, strict ==0.*, Cabal ==1.*+    type: exitcode-stdio-1.0+    main-is: Main.hs+    buildable: True+    ghc-options: -W+test-suite other-test+    build-depends: base ==4.*, cmdargs ==0.*, lens ==4.*,+                   pretty-show -any, strict ==0.*, Cabal ==1.*+    type: exitcode-stdio-1.0+    main-is: Main.hs+    buildable: True+    ghc-options: -W+ 
+ tests/goldenFiles/UpdateMajor1Upper.cabal view
@@ -0,0 +1,70 @@+name: cabal-bounds+version: 0.1+cabal-version: >=1.9.2+build-type: Simple+license: BSD3+license-file: LICENSE+maintainer: daniel.trstenjak@gmail.com+synopsis: A command line program for managing the bounds/versions of the dependencies in a cabal file.+description: A command line program for managing the bounds/versions of the dependencies in a cabal file.+category: Utils+author: Daniel Trstenjak+data-dir: ""+ +source-repository head+    type: git+    location: https://github.com/dan-t/cabal-bounds+ +library+    build-depends: base >=3 && <5, cmdargs >=0.10.5 && <1,+                   lens >=4.0.1 && <5, pretty-show -any, strict >=0.3.2 && <1,+                   Cabal >=1.18.1 && <2+    exposed-modules: CabalBounds.Args CabalBounds.Command+                     CabalBounds.Execute CabalBounds.Lenses+    exposed: True+    buildable: True+    hs-source-dirs: src+    other-modules: Paths_cabal_bounds CabalBounds.Args+                   CabalBounds.Command CabalBounds.Execute CabalBounds.Lenses+ +executable cabal-bounds+    build-depends: base >=3 && <5, cmdargs >=0.10.5 && <1,+                   lens >=4.0.1 && <5, pretty-show -any, strict >=0.3.2 && <1,+                   Cabal >=1.18.1 && <2+    main-is: Main.hs+    buildable: True+    cpp-options: -DCABAL+    hs-source-dirs: src+    other-modules: Paths_cabal_bounds CabalBounds.Args+                   CabalBounds.Command CabalBounds.Execute CabalBounds.Lenses+    ghc-options: -W+ +executable other-exe+    build-depends: base >=3 && <5, cmdargs >=0.10.5 && <1,+                   lens >=4.0.1 && <5, pretty-show -any, strict >=0.3.2 && <1,+                   Cabal >=1.18.1 && <2+    main-is: Main.hs+    buildable: True+    cpp-options: -DCABAL+    hs-source-dirs: src+    other-modules: Paths_cabal_bounds CabalBounds.Args+                   CabalBounds.Command CabalBounds.Execute CabalBounds.Lenses+    ghc-options: -W+ +test-suite some-test+    build-depends: base >=3 && <5, cmdargs >=0.10.5 && <1,+                   lens >=4.0.1 && <5, pretty-show -any, strict >=0.3.2 && <1,+                   Cabal >=1.18.1 && <2+    type: exitcode-stdio-1.0+    main-is: Main.hs+    buildable: True+    ghc-options: -W+test-suite other-test+    build-depends: base >=3 && <5, cmdargs >=0.10.5 && <1,+                   lens >=4.0.1 && <5, pretty-show -any, strict >=0.3.2 && <1,+                   Cabal >=1.18.1 && <2+    type: exitcode-stdio-1.0+    main-is: Main.hs+    buildable: True+    ghc-options: -W+ 
+ tests/goldenFiles/UpdateMajor2Lower.cabal view
@@ -0,0 +1,65 @@+name: cabal-bounds+version: 0.1+cabal-version: >=1.9.2+build-type: Simple+license: BSD3+license-file: LICENSE+maintainer: daniel.trstenjak@gmail.com+synopsis: A command line program for managing the bounds/versions of the dependencies in a cabal file.+description: A command line program for managing the bounds/versions of the dependencies in a cabal file.+category: Utils+author: Daniel Trstenjak+data-dir: ""+ +source-repository head+    type: git+    location: https://github.com/dan-t/cabal-bounds+ +library+    build-depends: base >=4.6, cmdargs >=0.10, lens >=4.0,+                   pretty-show -any, strict >=0.3, Cabal >=1.18+    exposed-modules: CabalBounds.Args CabalBounds.Command+                     CabalBounds.Execute CabalBounds.Lenses+    exposed: True+    buildable: True+    hs-source-dirs: src+    other-modules: Paths_cabal_bounds CabalBounds.Args+                   CabalBounds.Command CabalBounds.Execute CabalBounds.Lenses+ +executable cabal-bounds+    build-depends: base >=4.6, cmdargs >=0.10, lens >=4.0,+                   pretty-show -any, strict >=0.3, Cabal >=1.18+    main-is: Main.hs+    buildable: True+    cpp-options: -DCABAL+    hs-source-dirs: src+    other-modules: Paths_cabal_bounds CabalBounds.Args+                   CabalBounds.Command CabalBounds.Execute CabalBounds.Lenses+    ghc-options: -W+ +executable other-exe+    build-depends: base >=4.6, cmdargs >=0.10, lens >=4.0,+                   pretty-show -any, strict >=0.3, Cabal >=1.18+    main-is: Main.hs+    buildable: True+    cpp-options: -DCABAL+    hs-source-dirs: src+    other-modules: Paths_cabal_bounds CabalBounds.Args+                   CabalBounds.Command CabalBounds.Execute CabalBounds.Lenses+    ghc-options: -W+ +test-suite some-test+    build-depends: base >=4.6, cmdargs >=0.10, lens >=4.0,+                   pretty-show -any, strict >=0.3, Cabal >=1.18+    type: exitcode-stdio-1.0+    main-is: Main.hs+    buildable: True+    ghc-options: -W+test-suite other-test+    build-depends: base >=4.6, cmdargs >=0.10, lens >=4.0,+                   pretty-show -any, strict >=0.3, Cabal >=1.18+    type: exitcode-stdio-1.0+    main-is: Main.hs+    buildable: True+    ghc-options: -W+ 
+ tests/goldenFiles/UpdateMajor2Upper.cabal view
@@ -0,0 +1,70 @@+name: cabal-bounds+version: 0.1+cabal-version: >=1.9.2+build-type: Simple+license: BSD3+license-file: LICENSE+maintainer: daniel.trstenjak@gmail.com+synopsis: A command line program for managing the bounds/versions of the dependencies in a cabal file.+description: A command line program for managing the bounds/versions of the dependencies in a cabal file.+category: Utils+author: Daniel Trstenjak+data-dir: ""+ +source-repository head+    type: git+    location: https://github.com/dan-t/cabal-bounds+ +library+    build-depends: base >=3 && <4.7, cmdargs >=0.10.5 && <0.11,+                   lens >=4.0.1 && <4.1, pretty-show -any, strict >=0.3.2 && <0.4,+                   Cabal >=1.18.1 && <1.19+    exposed-modules: CabalBounds.Args CabalBounds.Command+                     CabalBounds.Execute CabalBounds.Lenses+    exposed: True+    buildable: True+    hs-source-dirs: src+    other-modules: Paths_cabal_bounds CabalBounds.Args+                   CabalBounds.Command CabalBounds.Execute CabalBounds.Lenses+ +executable cabal-bounds+    build-depends: base >=3 && <4.7, cmdargs >=0.10.5 && <0.11,+                   lens >=4.0.1 && <4.1, pretty-show -any, strict >=0.3.2 && <0.4,+                   Cabal >=1.18.1 && <1.19+    main-is: Main.hs+    buildable: True+    cpp-options: -DCABAL+    hs-source-dirs: src+    other-modules: Paths_cabal_bounds CabalBounds.Args+                   CabalBounds.Command CabalBounds.Execute CabalBounds.Lenses+    ghc-options: -W+ +executable other-exe+    build-depends: base >=3 && <4.7, cmdargs >=0.10.5 && <0.11,+                   lens >=4.0.1 && <4.1, pretty-show -any, strict >=0.3.2 && <0.4,+                   Cabal >=1.18.1 && <1.19+    main-is: Main.hs+    buildable: True+    cpp-options: -DCABAL+    hs-source-dirs: src+    other-modules: Paths_cabal_bounds CabalBounds.Args+                   CabalBounds.Command CabalBounds.Execute CabalBounds.Lenses+    ghc-options: -W+ +test-suite some-test+    build-depends: base >=3 && <4.7, cmdargs >=0.10.5 && <0.11,+                   lens >=4.0.1 && <4.1, pretty-show -any, strict >=0.3.2 && <0.4,+                   Cabal >=1.18.1 && <1.19+    type: exitcode-stdio-1.0+    main-is: Main.hs+    buildable: True+    ghc-options: -W+test-suite other-test+    build-depends: base >=3 && <4.7, cmdargs >=0.10.5 && <0.11,+                   lens >=4.0.1 && <4.1, pretty-show -any, strict >=0.3.2 && <0.4,+                   Cabal >=1.18.1 && <1.19+    type: exitcode-stdio-1.0+    main-is: Main.hs+    buildable: True+    ghc-options: -W+ 
+ tests/goldenFiles/UpdateMinorLower.cabal view
@@ -0,0 +1,65 @@+name: cabal-bounds+version: 0.1+cabal-version: >=1.9.2+build-type: Simple+license: BSD3+license-file: LICENSE+maintainer: daniel.trstenjak@gmail.com+synopsis: A command line program for managing the bounds/versions of the dependencies in a cabal file.+description: A command line program for managing the bounds/versions of the dependencies in a cabal file.+category: Utils+author: Daniel Trstenjak+data-dir: ""+ +source-repository head+    type: git+    location: https://github.com/dan-t/cabal-bounds+ +library+    build-depends: base >=4.6.0.1, cmdargs >=0.10.7, lens >=4.0.1,+                   pretty-show -any, strict >=0.3.2, Cabal >=1.18.1+    exposed-modules: CabalBounds.Args CabalBounds.Command+                     CabalBounds.Execute CabalBounds.Lenses+    exposed: True+    buildable: True+    hs-source-dirs: src+    other-modules: Paths_cabal_bounds CabalBounds.Args+                   CabalBounds.Command CabalBounds.Execute CabalBounds.Lenses+ +executable cabal-bounds+    build-depends: base >=4.6.0.1, cmdargs >=0.10.7, lens >=4.0.1,+                   pretty-show -any, strict >=0.3.2, Cabal >=1.18.1+    main-is: Main.hs+    buildable: True+    cpp-options: -DCABAL+    hs-source-dirs: src+    other-modules: Paths_cabal_bounds CabalBounds.Args+                   CabalBounds.Command CabalBounds.Execute CabalBounds.Lenses+    ghc-options: -W+ +executable other-exe+    build-depends: base >=4.6.0.1, cmdargs >=0.10.7, lens >=4.0.1,+                   pretty-show -any, strict >=0.3.2, Cabal >=1.18.1+    main-is: Main.hs+    buildable: True+    cpp-options: -DCABAL+    hs-source-dirs: src+    other-modules: Paths_cabal_bounds CabalBounds.Args+                   CabalBounds.Command CabalBounds.Execute CabalBounds.Lenses+    ghc-options: -W+ +test-suite some-test+    build-depends: base >=4.6.0.1, cmdargs >=0.10.7, lens >=4.0.1,+                   pretty-show -any, strict >=0.3.2, Cabal >=1.18.1+    type: exitcode-stdio-1.0+    main-is: Main.hs+    buildable: True+    ghc-options: -W+test-suite other-test+    build-depends: base >=4.6.0.1, cmdargs >=0.10.7, lens >=4.0.1,+                   pretty-show -any, strict >=0.3.2, Cabal >=1.18.1+    type: exitcode-stdio-1.0+    main-is: Main.hs+    buildable: True+    ghc-options: -W+ 
+ tests/goldenFiles/UpdateMinorLowerAndUpper.cabal view
@@ -0,0 +1,70 @@+name: cabal-bounds+version: 0.1+cabal-version: >=1.9.2+build-type: Simple+license: BSD3+license-file: LICENSE+maintainer: daniel.trstenjak@gmail.com+synopsis: A command line program for managing the bounds/versions of the dependencies in a cabal file.+description: A command line program for managing the bounds/versions of the dependencies in a cabal file.+category: Utils+author: Daniel Trstenjak+data-dir: ""+ +source-repository head+    type: git+    location: https://github.com/dan-t/cabal-bounds+ +library+    build-depends: base ==4.6.0.1.*, cmdargs ==0.10.7.*,+                   lens ==4.0.1.*, pretty-show -any, strict ==0.3.2.*,+                   Cabal ==1.18.1.*+    exposed-modules: CabalBounds.Args CabalBounds.Command+                     CabalBounds.Execute CabalBounds.Lenses+    exposed: True+    buildable: True+    hs-source-dirs: src+    other-modules: Paths_cabal_bounds CabalBounds.Args+                   CabalBounds.Command CabalBounds.Execute CabalBounds.Lenses+ +executable cabal-bounds+    build-depends: base ==4.6.0.1.*, cmdargs ==0.10.7.*,+                   lens ==4.0.1.*, pretty-show -any, strict ==0.3.2.*,+                   Cabal ==1.18.1.*+    main-is: Main.hs+    buildable: True+    cpp-options: -DCABAL+    hs-source-dirs: src+    other-modules: Paths_cabal_bounds CabalBounds.Args+                   CabalBounds.Command CabalBounds.Execute CabalBounds.Lenses+    ghc-options: -W+ +executable other-exe+    build-depends: base ==4.6.0.1.*, cmdargs ==0.10.7.*,+                   lens ==4.0.1.*, pretty-show -any, strict ==0.3.2.*,+                   Cabal ==1.18.1.*+    main-is: Main.hs+    buildable: True+    cpp-options: -DCABAL+    hs-source-dirs: src+    other-modules: Paths_cabal_bounds CabalBounds.Args+                   CabalBounds.Command CabalBounds.Execute CabalBounds.Lenses+    ghc-options: -W+ +test-suite some-test+    build-depends: base ==4.6.0.1.*, cmdargs ==0.10.7.*,+                   lens ==4.0.1.*, pretty-show -any, strict ==0.3.2.*,+                   Cabal ==1.18.1.*+    type: exitcode-stdio-1.0+    main-is: Main.hs+    buildable: True+    ghc-options: -W+test-suite other-test+    build-depends: base ==4.6.0.1.*, cmdargs ==0.10.7.*,+                   lens ==4.0.1.*, pretty-show -any, strict ==0.3.2.*,+                   Cabal ==1.18.1.*+    type: exitcode-stdio-1.0+    main-is: Main.hs+    buildable: True+    ghc-options: -W+ 
+ tests/goldenFiles/UpdateMinorUpper.cabal view
@@ -0,0 +1,70 @@+name: cabal-bounds+version: 0.1+cabal-version: >=1.9.2+build-type: Simple+license: BSD3+license-file: LICENSE+maintainer: daniel.trstenjak@gmail.com+synopsis: A command line program for managing the bounds/versions of the dependencies in a cabal file.+description: A command line program for managing the bounds/versions of the dependencies in a cabal file.+category: Utils+author: Daniel Trstenjak+data-dir: ""+ +source-repository head+    type: git+    location: https://github.com/dan-t/cabal-bounds+ +library+    build-depends: base >=3 && <4.6.0.2, cmdargs >=0.10.5 && <0.10.8,+                   lens ==4.0.1.*, pretty-show -any, strict ==0.3.2.*,+                   Cabal ==1.18.1.*+    exposed-modules: CabalBounds.Args CabalBounds.Command+                     CabalBounds.Execute CabalBounds.Lenses+    exposed: True+    buildable: True+    hs-source-dirs: src+    other-modules: Paths_cabal_bounds CabalBounds.Args+                   CabalBounds.Command CabalBounds.Execute CabalBounds.Lenses+ +executable cabal-bounds+    build-depends: base >=3 && <4.6.0.2, cmdargs >=0.10.5 && <0.10.8,+                   lens ==4.0.1.*, pretty-show -any, strict ==0.3.2.*,+                   Cabal ==1.18.1.*+    main-is: Main.hs+    buildable: True+    cpp-options: -DCABAL+    hs-source-dirs: src+    other-modules: Paths_cabal_bounds CabalBounds.Args+                   CabalBounds.Command CabalBounds.Execute CabalBounds.Lenses+    ghc-options: -W+ +executable other-exe+    build-depends: base >=3 && <4.6.0.2, cmdargs >=0.10.5 && <0.10.8,+                   lens ==4.0.1.*, pretty-show -any, strict ==0.3.2.*,+                   Cabal ==1.18.1.*+    main-is: Main.hs+    buildable: True+    cpp-options: -DCABAL+    hs-source-dirs: src+    other-modules: Paths_cabal_bounds CabalBounds.Args+                   CabalBounds.Command CabalBounds.Execute CabalBounds.Lenses+    ghc-options: -W+ +test-suite some-test+    build-depends: base >=3 && <4.6.0.2, cmdargs >=0.10.5 && <0.10.8,+                   lens ==4.0.1.*, pretty-show -any, strict ==0.3.2.*,+                   Cabal ==1.18.1.*+    type: exitcode-stdio-1.0+    main-is: Main.hs+    buildable: True+    ghc-options: -W+test-suite other-test+    build-depends: base >=3 && <4.6.0.2, cmdargs >=0.10.5 && <0.10.8,+                   lens ==4.0.1.*, pretty-show -any, strict ==0.3.2.*,+                   Cabal ==1.18.1.*+    type: exitcode-stdio-1.0+    main-is: Main.hs+    buildable: True+    ghc-options: -W+