cabal-bounds 0.1.16 → 0.2
raw patch · 20 files changed
+797/−125 lines, 20 files
Files
- README.md +25/−5
- cabal-bounds.cabal +28/−8
- src/CabalBounds/Args.hs +9/−2
- src/CabalBounds/Bound.hs +54/−14
- src/CabalBounds/Dependencies.hs +4/−4
- src/CabalBounds/Drop.hs +16/−16
- src/CabalBounds/Lenses.hs +15/−12
- src/CabalBounds/Main.hs +2/−2
- src/CabalBounds/Targets.hs +14/−13
- src/CabalBounds/Update.hs +46/−37
- src/CabalBounds/VersionComp.hs +23/−0
- tests/Main.hs +21/−12
- tests/goldenFiles/UpdateMajor1Lower.cabal +65/−0
- tests/goldenFiles/UpdateMajor1LowerAndUpper.cabal +65/−0
- tests/goldenFiles/UpdateMajor1Upper.cabal +70/−0
- tests/goldenFiles/UpdateMajor2Lower.cabal +65/−0
- tests/goldenFiles/UpdateMajor2Upper.cabal +70/−0
- tests/goldenFiles/UpdateMinorLower.cabal +65/−0
- tests/goldenFiles/UpdateMinorLowerAndUpper.cabal +70/−0
- tests/goldenFiles/UpdateMinorUpper.cabal +70/−0
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+