cabal-gild 1.5.0.2 → 1.5.0.3
raw patch · 15 files changed
+353/−272 lines, 15 files
Files
- cabal-gild.cabal +1/−8
- source/library/CabalGild/Unstable/Action/FormatFields.hs +7/−7
- source/library/CabalGild/Unstable/Extra/CharParsing.hs +4/−0
- source/library/CabalGild/Unstable/Type/Dependency.hs +47/−15
- source/library/CabalGild/Unstable/Type/ExeDependency.hs +0/−26
- source/library/CabalGild/Unstable/Type/ForeignLibOption.hs +0/−23
- source/library/CabalGild/Unstable/Type/Language.hs +0/−22
- source/library/CabalGild/Unstable/Type/LegacyExeDependency.hs +0/−27
- source/library/CabalGild/Unstable/Type/ModuleReexport.hs +0/−25
- source/library/CabalGild/Unstable/Type/PkgconfigDependency.hs +0/−27
- source/library/CabalGild/Unstable/Type/PkgconfigVersionRange.hs +0/−27
- source/library/CabalGild/Unstable/Type/TestedWith.hs +17/−21
- source/library/CabalGild/Unstable/Type/Variable.hs +5/−5
- source/library/CabalGild/Unstable/Type/VersionRange.hs +175/−38
- source/test-suite/Main.hs +97/−1
cabal-gild.cabal view
@@ -11,7 +11,7 @@ maintainer: Taylor Fausak name: cabal-gild synopsis: Formats package descriptions.-version: 1.5.0.2+version: 1.5.0.3 source-repository head type: git@@ -109,23 +109,16 @@ CabalGild.Unstable.Type.Context CabalGild.Unstable.Type.Dependency CabalGild.Unstable.Type.DiscoverTarget- CabalGild.Unstable.Type.ExeDependency CabalGild.Unstable.Type.Extension CabalGild.Unstable.Type.Flag- CabalGild.Unstable.Type.ForeignLibOption CabalGild.Unstable.Type.Input- CabalGild.Unstable.Type.Language- CabalGild.Unstable.Type.LegacyExeDependency CabalGild.Unstable.Type.Leniency CabalGild.Unstable.Type.Line CabalGild.Unstable.Type.List CabalGild.Unstable.Type.Mixin CabalGild.Unstable.Type.Mode- CabalGild.Unstable.Type.ModuleReexport CabalGild.Unstable.Type.Optional CabalGild.Unstable.Type.Output- CabalGild.Unstable.Type.PkgconfigDependency- CabalGild.Unstable.Type.PkgconfigVersionRange CabalGild.Unstable.Type.Pragma CabalGild.Unstable.Type.Set CabalGild.Unstable.Type.SomeParsecParser
source/library/CabalGild/Unstable/Action/FormatFields.hs view
@@ -8,14 +8,8 @@ import qualified CabalGild.Unstable.Extra.String as String import qualified CabalGild.Unstable.Type.Condition as Condition import qualified CabalGild.Unstable.Type.Dependency as Dependency-import qualified CabalGild.Unstable.Type.ExeDependency as ExeDependency import qualified CabalGild.Unstable.Type.Extension as Extension-import qualified CabalGild.Unstable.Type.ForeignLibOption as ForeignLibOption-import qualified CabalGild.Unstable.Type.Language as Language-import qualified CabalGild.Unstable.Type.LegacyExeDependency as LegacyExeDependency import qualified CabalGild.Unstable.Type.Mixin as Mixin-import qualified CabalGild.Unstable.Type.ModuleReexport as ModuleReexport-import qualified CabalGild.Unstable.Type.PkgconfigDependency as PkgconfigDependency import qualified CabalGild.Unstable.Type.SomeParsecParser as SPP import qualified CabalGild.Unstable.Type.TestedWith as TestedWith import qualified CabalGild.Unstable.Type.Variable as Variable@@ -29,6 +23,12 @@ import qualified Distribution.ModuleName as ModuleName import qualified Distribution.Parsec as Parsec import qualified Distribution.Parsec.FieldLineStream as FieldLineStream+import qualified Distribution.Types.ExeDependency as ExeDependency+import qualified Distribution.Types.ForeignLibOption as ForeignLibOption+import qualified Distribution.Types.LegacyExeDependency as LegacyExeDependency+import qualified Distribution.Types.ModuleReexport as ModuleReexport+import qualified Distribution.Types.PkgconfigDependency as PkgconfigDependency+import qualified Language.Haskell.Extension as Haskell import qualified Text.PrettyPrint as PrettyPrint -- | A wrapper around 'field' to allow this to be composed with other actions.@@ -193,7 +193,7 @@ "mixins" =: SPP.set @Newtypes.CommaVCat @(Identity.Identity Mixin.Mixin), "options" =: SPP.set @Newtypes.FSep @(Identity.Identity ForeignLibOption.ForeignLibOption), "other-extensions" =: SPP.set @Newtypes.FSep @(Newtypes.MQuoted Extension.Extension),- "other-languages" =: SPP.set @Newtypes.FSep @(Newtypes.MQuoted Language.Language),+ "other-languages" =: SPP.set @Newtypes.FSep @(Newtypes.MQuoted Haskell.Language), "other-modules" =: SPP.set @Newtypes.VCat @(Newtypes.MQuoted ModuleName.ModuleName), "pkgconfig-depends" =: SPP.set @Newtypes.CommaFSep @(Identity.Identity PkgconfigDependency.PkgconfigDependency), "reexported-modules" =: SPP.set @Newtypes.CommaVCat @(Identity.Identity ModuleReexport.ModuleReexport),
source/library/CabalGild/Unstable/Extra/CharParsing.hs view
@@ -3,6 +3,10 @@ import qualified Distribution.Compat.CharParsing as Parse import qualified Distribution.Parsec as Parsec +-- | Wraps the given parser in curly braces.+braces :: (Parsec.CabalParsing m) => m a -> m a+braces = Parse.between (token "{") (token "}")+ -- | Wraps the given parser in parentheses. parens :: (Parsec.CabalParsing m) => m a -> m a parens = Parse.between (token "(") (token ")")
source/library/CabalGild/Unstable/Type/Dependency.hs view
@@ -1,26 +1,58 @@+{-# LANGUAGE NamedFieldPuns #-}+ module CabalGild.Unstable.Type.Dependency where import qualified CabalGild.Unstable.Type.VersionRange as VersionRange-import qualified Data.Ord as Ord+import qualified Control.Monad as Monad+import qualified Data.List.NonEmpty as NonEmpty+import qualified Distribution.CabalSpecVersion as CabalSpecVersion+import qualified Distribution.Compat.CharParsing as Parse import qualified Distribution.Parsec as Parsec import qualified Distribution.Pretty as Pretty-import qualified Distribution.Types.Dependency as Dependency+import qualified Distribution.Types.PackageName as PackageName+import qualified Distribution.Types.UnqualComponentName as UnqualComponentName+import qualified Text.PrettyPrint as PrettyPrint --- | This type exists to provide an 'Ord' instance for--- 'Dependency.Dependency', which was added in @Cabal-syntax-3.10.1.0@.-newtype Dependency = Dependency- { unwrap :: Dependency.Dependency+data Dependency = MkDependency+ { packageName :: PackageName.PackageName,+ libraryNames :: Maybe (Either UnqualComponentName.UnqualComponentName (NonEmpty.NonEmpty UnqualComponentName.UnqualComponentName)),+ versionRange :: Maybe VersionRange.VersionRange }- deriving (Eq, Show)--instance Ord Dependency where- compare =- Ord.comparing $- (\(Dependency.Dependency pn vr lns) -> (pn, VersionRange.fromVersionRange vr, lns))- . unwrap+ deriving (Eq, Ord, Show) instance Parsec.Parsec Dependency where- parsec = Dependency <$> Parsec.parsec+ parsec = do+ packageName <- Parsec.parsec+ libraryNames <- Parse.optional $ do+ Monad.void $ Parse.char ':'+ csv <- Parsec.askCabalSpecVersion+ Monad.guard $ csv >= CabalSpecVersion.CabalSpecV3_0+ Monad.msum+ [ Left <$> Parsec.parsec,+ Right+ <$> Parse.between+ (Parse.char '{' *> Parse.spaces)+ (Parse.spaces <* Parse.char '}')+ (Parsec.parsecCommaNonEmpty Parsec.parsec)+ ]+ Parse.spaces+ versionRange <- Parse.optional Parsec.parsec+ pure MkDependency {packageName, libraryNames, versionRange} instance Pretty.Pretty Dependency where- pretty = Pretty.pretty . unwrap+ pretty dependency =+ let pkg = Pretty.pretty $ packageName dependency+ libs = case libraryNames dependency of+ Nothing -> mempty+ Just e ->+ PrettyPrint.char ':' <> case e of+ Left ucn -> Pretty.pretty ucn+ Right ucns ->+ PrettyPrint.braces+ . PrettyPrint.hsep+ . PrettyPrint.punctuate PrettyPrint.comma+ . fmap Pretty.pretty+ . NonEmpty.toList+ $ NonEmpty.sort ucns+ ver = foldMap Pretty.pretty $ versionRange dependency+ in PrettyPrint.hsep [pkg <> libs, ver]
− source/library/CabalGild/Unstable/Type/ExeDependency.hs
@@ -1,26 +0,0 @@-module CabalGild.Unstable.Type.ExeDependency where--import qualified CabalGild.Unstable.Type.VersionRange as VersionRange-import qualified Data.Ord as Ord-import qualified Distribution.Parsec as Parsec-import qualified Distribution.Pretty as Pretty-import qualified Distribution.Types.ExeDependency as ExeDependency---- | This type exists to provide an 'Ord' instance for--- 'ExeDependency.ExeDependency', which was added in @Cabal-syntax-3.10.1.0@.-newtype ExeDependency = ExeDependency- { unwrap :: ExeDependency.ExeDependency- }- deriving (Eq, Show)--instance Ord ExeDependency where- compare =- Ord.comparing $- (\(ExeDependency.ExeDependency pn ucn vr) -> (pn, ucn, VersionRange.fromVersionRange vr))- . unwrap--instance Parsec.Parsec ExeDependency where- parsec = ExeDependency <$> Parsec.parsec--instance Pretty.Pretty ExeDependency where- pretty = Pretty.pretty . unwrap
− source/library/CabalGild/Unstable/Type/ForeignLibOption.hs
@@ -1,23 +0,0 @@-module CabalGild.Unstable.Type.ForeignLibOption where--import qualified Data.Ord as Ord-import qualified Distribution.Parsec as Parsec-import qualified Distribution.Pretty as Pretty-import qualified Distribution.Types.ForeignLibOption as ForeignLibOption---- | This type exists to provide an 'Ord' instance for--- 'ForeignLibOption.ForeignLibOption', which was added in--- @Cabal-syntax-3.10.1.0@.-newtype ForeignLibOption = ForeignLibOption- { unwrap :: ForeignLibOption.ForeignLibOption- }- deriving (Eq, Show)--instance Ord ForeignLibOption where- compare = Ord.comparing Pretty.prettyShow--instance Parsec.Parsec ForeignLibOption where- parsec = ForeignLibOption <$> Parsec.parsec--instance Pretty.Pretty ForeignLibOption where- pretty = Pretty.pretty . unwrap
− source/library/CabalGild/Unstable/Type/Language.hs
@@ -1,22 +0,0 @@-module CabalGild.Unstable.Type.Language where--import qualified Data.Ord as Ord-import qualified Distribution.Parsec as Parsec-import qualified Distribution.Pretty as Pretty-import qualified Language.Haskell.Extension as Extension---- | This type exists to provide an 'Ord' instance for--- 'Language.Language', which was added in @Cabal-syntax-3.10.1.0@.-newtype Language = Language- { unwrap :: Extension.Language- }- deriving (Eq, Show)--instance Ord Language where- compare = Ord.comparing Pretty.prettyShow--instance Parsec.Parsec Language where- parsec = Language <$> Parsec.parsec--instance Pretty.Pretty Language where- pretty = Pretty.pretty . unwrap
− source/library/CabalGild/Unstable/Type/LegacyExeDependency.hs
@@ -1,27 +0,0 @@-module CabalGild.Unstable.Type.LegacyExeDependency where--import qualified CabalGild.Unstable.Type.VersionRange as VersionRange-import qualified Data.Ord as Ord-import qualified Distribution.Parsec as Parsec-import qualified Distribution.Pretty as Pretty-import qualified Distribution.Types.LegacyExeDependency as LegacyExeDependency---- | This type exists to provide an 'Ord' instance for--- 'LegacyExeDependency.LegacyExeDependency', which was added in--- @Cabal-syntax-3.10.1.0@.-newtype LegacyExeDependency = LegacyExeDependency- { unwrap :: LegacyExeDependency.LegacyExeDependency- }- deriving (Eq, Show)--instance Ord LegacyExeDependency where- compare =- Ord.comparing $- (\(LegacyExeDependency.LegacyExeDependency s vr) -> (s, VersionRange.fromVersionRange vr))- . unwrap--instance Parsec.Parsec LegacyExeDependency where- parsec = LegacyExeDependency <$> Parsec.parsec--instance Pretty.Pretty LegacyExeDependency where- pretty = Pretty.pretty . unwrap
− source/library/CabalGild/Unstable/Type/ModuleReexport.hs
@@ -1,25 +0,0 @@-module CabalGild.Unstable.Type.ModuleReexport where--import qualified Data.Ord as Ord-import qualified Distribution.Parsec as Parsec-import qualified Distribution.Pretty as Pretty-import qualified Distribution.Types.ModuleReexport as ModuleReexport---- | This type exists to provide an 'Ord' instance for--- 'ModuleReexport.ModuleReexport', which was added in @Cabal-syntax-3.10.1.0@.-newtype ModuleReexport = ModuleReexport- { unwrap :: ModuleReexport.ModuleReexport- }- deriving (Eq, Show)--instance Ord ModuleReexport where- compare =- Ord.comparing $- (\(ModuleReexport.ModuleReexport mpn mn1 mn2) -> (mpn, mn1, mn2))- . unwrap--instance Parsec.Parsec ModuleReexport where- parsec = ModuleReexport <$> Parsec.parsec--instance Pretty.Pretty ModuleReexport where- pretty = Pretty.pretty . unwrap
− source/library/CabalGild/Unstable/Type/PkgconfigDependency.hs
@@ -1,27 +0,0 @@-module CabalGild.Unstable.Type.PkgconfigDependency where--import qualified CabalGild.Unstable.Type.PkgconfigVersionRange as PkgconfigVersionRange-import qualified Data.Ord as Ord-import qualified Distribution.Parsec as Parsec-import qualified Distribution.Pretty as Pretty-import qualified Distribution.Types.PkgconfigDependency as PkgconfigDependency---- | This type exists to provide an 'Ord' instance for--- 'PkgconfigDependency.PkgconfigDependency', which was added in--- @Cabal-syntax-3.10.1.0@.-newtype PkgconfigDependency = PkgconfigDependency- { unwrap :: PkgconfigDependency.PkgconfigDependency- }- deriving (Eq, Show)--instance Ord PkgconfigDependency where- compare =- Ord.comparing $- (\(PkgconfigDependency.PkgconfigDependency pn pvr) -> (pn, PkgconfigVersionRange.PkgconfigVersionRange pvr))- . unwrap--instance Parsec.Parsec PkgconfigDependency where- parsec = PkgconfigDependency <$> Parsec.parsec--instance Pretty.Pretty PkgconfigDependency where- pretty = Pretty.pretty . unwrap
− source/library/CabalGild/Unstable/Type/PkgconfigVersionRange.hs
@@ -1,27 +0,0 @@-module CabalGild.Unstable.Type.PkgconfigVersionRange where--import qualified CabalGild.Unstable.Type.VersionRange as VersionRange-import qualified Data.Ord as Ord-import qualified Distribution.Parsec as Parsec-import qualified Distribution.Pretty as Pretty-import qualified Distribution.Types.PkgconfigVersionRange as PkgconfigVersionRange---- | This type exists to provide an 'Ord' instance for--- 'PkgconfigVersionRange.PkgconfigVersionRange', which was added in--- @Cabal-syntax-3.10.1.0@.-newtype PkgconfigVersionRange = PkgconfigVersionRange- { unwrap :: PkgconfigVersionRange.PkgconfigVersionRange- }- deriving (Eq, Show)--instance Ord PkgconfigVersionRange where- compare =- Ord.comparing $- VersionRange.fromPkgconfigVersionRange- . unwrap--instance Parsec.Parsec PkgconfigVersionRange where- parsec = PkgconfigVersionRange <$> Parsec.parsec--instance Pretty.Pretty PkgconfigVersionRange where- pretty = Pretty.pretty . unwrap
source/library/CabalGild/Unstable/Type/TestedWith.hs view
@@ -1,32 +1,28 @@ module CabalGild.Unstable.Type.TestedWith where import qualified CabalGild.Unstable.Type.VersionRange as VersionRange-import qualified Data.Ord as Ord-import qualified Distribution.FieldGrammar.Newtypes as Newtypes+import qualified Distribution.Compat.CharParsing as Parse+import qualified Distribution.Compiler as Compiler import qualified Distribution.Parsec as Parsec import qualified Distribution.Pretty as Pretty+import qualified Text.PrettyPrint as PrettyPrint --- | This type exists to provide an 'Ord' instance for 'Newtypes.TestedWith',--- which was added in @Cabal-syntax-3.10.1.0@.-newtype TestedWith = TestedWith- { unwrap :: Newtypes.TestedWith+data TestedWith = MkTestedWith+ { compilerFlavor :: Compiler.CompilerFlavor,+ versionRange :: Maybe VersionRange.VersionRange }--instance Eq TestedWith where- x == y = compare x y == EQ--instance Ord TestedWith where- compare =- Ord.comparing $- fmap VersionRange.fromVersionRange- . Newtypes.getTestedWith- . unwrap+ deriving (Eq, Ord, Show) instance Parsec.Parsec TestedWith where- parsec = TestedWith <$> Parsec.parsec+ parsec =+ MkTestedWith+ <$> Parsec.parsec+ <* Parse.spaces+ <*> Parse.optional Parsec.parsec instance Pretty.Pretty TestedWith where- pretty = Pretty.pretty . unwrap--instance Show TestedWith where- show = show . Newtypes.getTestedWith . unwrap+ pretty x =+ PrettyPrint.hsep+ [ Pretty.pretty $ compilerFlavor x,+ foldMap Pretty.pretty $ versionRange x+ ]
source/library/CabalGild/Unstable/Type/Variable.hs view
@@ -1,6 +1,7 @@ module CabalGild.Unstable.Type.Variable where import qualified CabalGild.Unstable.Extra.CharParsing as Parse+import qualified CabalGild.Unstable.Type.VersionRange as VersionRange import qualified Data.Char as Char import qualified Distribution.Compat.CharParsing as Parse import qualified Distribution.Compiler as Compiler@@ -8,7 +9,6 @@ import qualified Distribution.Pretty as Pretty import qualified Distribution.System as System import qualified Distribution.Types.Flag as Flag-import qualified Distribution.Types.VersionRange as VersionRange import qualified Text.PrettyPrint as PrettyPrint -- | Similar to 'Distribution.Types.ConfVar.ConfVar', but with different@@ -16,7 +16,7 @@ data Variable = Arch System.Arch | Flag Flag.FlagName- | Impl Compiler.CompilerFlavor VersionRange.VersionRange+ | Impl Compiler.CompilerFlavor (Maybe VersionRange.VersionRange) | Os System.OS deriving (Eq, Show) @@ -41,14 +41,14 @@ parseFlag = Parse.token "flag" *> Parse.parens (Parsec.parsec <* Parse.spaces) -- | Parses an 'Impl'.-parseImpl :: (Parsec.CabalParsing m) => m (Compiler.CompilerFlavor, VersionRange.VersionRange)+parseImpl :: (Parsec.CabalParsing m) => m (Compiler.CompilerFlavor, Maybe VersionRange.VersionRange) parseImpl = do Parse.token "impl" Parse.parens $ (,) <$> Parsec.parsec <* Parse.spaces- <*> Parse.option VersionRange.anyVersion Parsec.parsec+ <*> Parse.optional Parsec.parsec <* Parse.spaces -- | Parses an 'Os'.@@ -77,7 +77,7 @@ <> PrettyPrint.parens (Pretty.pretty y) Impl y z -> PrettyPrint.text "impl"- <> PrettyPrint.parens (Pretty.pretty y PrettyPrint.<+> Pretty.pretty z)+ <> PrettyPrint.parens (Pretty.pretty y PrettyPrint.<+> foldMap Pretty.pretty z) Os y -> PrettyPrint.text "os" <> PrettyPrint.parens (Pretty.pretty y)
source/library/CabalGild/Unstable/Type/VersionRange.hs view
@@ -1,45 +1,182 @@+{-# LANGUAGE FlexibleInstances #-}+ module CabalGild.Unstable.Type.VersionRange where -import qualified Distribution.Types.PkgconfigVersion as PkgconfigVersion-import qualified Distribution.Types.PkgconfigVersionRange as PkgconfigVersionRange-import qualified Distribution.Types.Version as Version-import qualified Distribution.Types.VersionRange as VersionRange+import qualified CabalGild.Unstable.Extra.CharParsing as Parse+import qualified Data.List.NonEmpty as NonEmpty+import qualified Data.Set as Set+import qualified Distribution.Compat.CharParsing as Parse+import qualified Distribution.Parsec as Parsec+import qualified Distribution.Pretty as Pretty+import qualified Numeric.Natural as Natural+import qualified Text.PrettyPrint as PrettyPrint+import qualified Text.Read as Read --- | This type exists to provide an 'Ord' instance for--- 'VersionRange.VersionRange', which was added in @Cabal-syntax-3.10.1.0@.-data VersionRange a+data Part+ = Numeric Natural.Natural+ | Wildcard+ deriving (Eq, Ord, Show)++parseNumeric :: (Parsec.CabalParsing m) => m Natural.Natural+parseNumeric =+ Parse.choice+ [ parseZero,+ parseNonZero+ ]++parseZero :: (Parsec.CabalParsing m) => m Natural.Natural+parseZero = 0 <$ Parse.token "0"++parseNonZero :: (Parsec.CabalParsing m) => m Natural.Natural+parseNonZero = do+ c <- Parse.satisfy $ \c -> '1' <= c && c <= '9'+ cs <- Parse.many Parse.digit+ let s = c : cs+ case Read.readMaybe s of+ Nothing -> fail $ "invalid Natural: " <> show s+ Just n -> n <$ Parse.spaces++renderNumeric :: Natural.Natural -> PrettyPrint.Doc+renderNumeric = PrettyPrint.text . show++parseWildcard :: (Parsec.CabalParsing m) => m ()+parseWildcard = Parse.token "*"++renderWildcard :: PrettyPrint.Doc+renderWildcard = PrettyPrint.char '*'++parsePart :: (Parsec.CabalParsing m) => m Part+parsePart =+ Parse.choice+ [ Numeric <$> parseNumeric,+ Wildcard <$ parseWildcard+ ]++renderPart :: Part -> PrettyPrint.Doc+renderPart x =+ case x of+ Numeric n -> renderNumeric n+ Wildcard -> renderWildcard++newtype Version+ = MkVersion (NonEmpty.NonEmpty Part)+ deriving (Eq, Ord, Show)++parseVersion :: (Parsec.CabalParsing m) => m Version+parseVersion =+ MkVersion+ <$> Parse.sepByNonEmpty parsePart (Parse.char '.')+ <* Parse.spaces++renderVersion :: Version -> PrettyPrint.Doc+renderVersion (MkVersion parts) =+ mconcat+ . PrettyPrint.punctuate (PrettyPrint.char '.')+ . fmap renderPart+ $ NonEmpty.toList parts++data Versions+ = One Version+ | Set (Set.Set Version)+ deriving (Eq, Ord, Show)++parseVersions :: (Parsec.CabalParsing m) => m Versions+parseVersions =+ Parse.choice+ [ One <$> parseVersion,+ Set . Set.fromList <$> Parse.braces (Parse.sepBy parseVersion $ Parse.token ",")+ ]++renderVersions :: Versions -> PrettyPrint.Doc+renderVersions x =+ case x of+ One v -> renderVersion v+ Set vs ->+ PrettyPrint.braces+ . PrettyPrint.hsep+ . PrettyPrint.punctuate PrettyPrint.comma+ . fmap renderVersion+ $ Set.toAscList vs++data Operator+ = Caret+ | Ge+ | Gt+ | Le+ | Lt+ | Eq+ deriving (Eq, Ord, Show)++parseOperator :: (Parsec.CabalParsing m) => m Operator+parseOperator =+ Parse.choice+ [ Caret <$ Parse.token "^>=",+ Parse.try $ Ge <$ Parse.token ">=",+ Gt <$ Parse.token ">",+ Parse.try $ Le <$ Parse.token "<=",+ Lt <$ Parse.token "<",+ Eq <$ Parse.token "=="+ ]++renderOperator :: Operator -> PrettyPrint.Doc+renderOperator x =+ case x of+ Caret -> PrettyPrint.text "^>="+ Ge -> PrettyPrint.text ">="+ Gt -> PrettyPrint.char '>'+ Le -> PrettyPrint.text "<="+ Lt -> PrettyPrint.char '<'+ Eq -> PrettyPrint.text "=="++data Simple = Any- | This a- | Later a- | Earlier a- | Union (VersionRange a) (VersionRange a)- | Intersect (VersionRange a) (VersionRange a)+ | None+ | Op Operator Versions deriving (Eq, Ord, Show) --- | Converts a 'PkgconfigVersionRange.PkgconfigVersionRange' into a--- 'VersionRange'. Note that the former is more expressive, so things like--- 'PkgconfigVersionRange.PcOrLaterVersion' will be converted into a 'Union'.-fromPkgconfigVersionRange ::- PkgconfigVersionRange.PkgconfigVersionRange ->- VersionRange PkgconfigVersion.PkgconfigVersion-fromPkgconfigVersionRange x = case x of- PkgconfigVersionRange.PcAnyVersion -> Any- PkgconfigVersionRange.PcThisVersion v -> This v- PkgconfigVersionRange.PcLaterVersion v -> Later v- PkgconfigVersionRange.PcEarlierVersion v -> Earlier v- PkgconfigVersionRange.PcOrLaterVersion v -> Union (Later v) (This v)- PkgconfigVersionRange.PcOrEarlierVersion v -> Union (Earlier v) (This v)- PkgconfigVersionRange.PcUnionVersionRanges v w -> Union (fromPkgconfigVersionRange v) (fromPkgconfigVersionRange w)- PkgconfigVersionRange.PcIntersectVersionRanges v w -> Intersect (fromPkgconfigVersionRange v) (fromPkgconfigVersionRange w)+parseSimple :: (Parsec.CabalParsing m) => m Simple+parseSimple =+ Parse.choice+ [ Parse.try $ Any <$ Parse.token "-any",+ None <$ Parse.token "-none",+ Op <$> parseOperator <*> parseVersions+ ] --- | Converts a 'VersionRange.VersionRange' into a 'VersionRange'. These are--- isomorphic, so no information is lost.-fromVersionRange :: VersionRange.VersionRange -> VersionRange Version.Version-fromVersionRange =- VersionRange.foldVersionRange- Any- This- Later- Earlier- Union- Intersect+renderSimple :: Simple -> PrettyPrint.Doc+renderSimple x =+ case x of+ Any -> PrettyPrint.text "-any"+ None -> PrettyPrint.text "-none"+ Op o vs -> renderOperator o <> renderVersions vs++data Complex a+ = Par (Complex a)+ | And a (Complex a)+ | Or a (Complex a)+ | Simple a+ deriving (Eq, Ord, Show)++parseComplex :: (Parsec.CabalParsing m) => m a -> m (Complex a)+parseComplex p =+ Parse.choice+ [ Par <$> Parse.parens (parseComplex p),+ Parse.try $ And <$> p <* Parse.token "&&" <*> parseComplex p,+ Parse.try $ Or <$> p <* Parse.token "||" <*> parseComplex p,+ Simple <$> p+ ]++renderComplex :: (a -> PrettyPrint.Doc) -> Complex a -> PrettyPrint.Doc+renderComplex f x =+ case x of+ Par y -> PrettyPrint.parens $ renderComplex f y+ And l r -> PrettyPrint.hsep [f l, PrettyPrint.text "&&", renderComplex f r]+ Or l r -> PrettyPrint.hsep [f l, PrettyPrint.text "||", renderComplex f r]+ Simple y -> f y++type VersionRange = Complex Simple++instance Parsec.Parsec VersionRange where+ parsec = parseComplex parseSimple++instance Pretty.Pretty VersionRange where+ pretty = renderComplex renderSimple
source/test-suite/Main.hs view
@@ -635,8 +635,13 @@ Hspec.it "formats impl without version range" $ do expectGilded "if impl ( ghc )"- "if impl(ghc >=0)\n"+ "if impl(ghc)\n" + Hspec.it "formats complex impl version range" $ do+ expectGilded+ "if impl ( ghc > 8 && < 9 )"+ "if impl(ghc >8 && <9)\n"+ Hspec.it "formats os" $ do expectGilded "if os ( osx )"@@ -737,6 +742,11 @@ "tested-with: GHC == 9.8.1 , GHC == 9.6.4" "tested-with:\n ghc ==9.6.4\n ghc ==9.8.1\n" + Hspec.it "formats complex tested-with version range" $ do+ expectGilded+ "tested-with: GHC > 8 && < 9"+ "tested-with: ghc >8 && <9\n"+ Hspec.it "sorts data-files" $ do expectGilded "data-files: g f"@@ -1564,6 +1574,92 @@ (".", [["Setup.hs"], ["source", "Example.hs"]]) "-- cabal-gild: discover source\nexposed-modules:" "-- cabal-gild: discover source\nexposed-modules: Example\n"++ Hspec.it "keeps an explicit sub-library name" $ do+ expectGilded+ "cabal-version: 3.0\nbuild-depends: x:x"+ "cabal-version: 3.0\nbuild-depends: x:x\n"++ Hspec.it "keeps a singleton set of sub-library names" $ do+ expectGilded+ "cabal-version: 3.0\nbuild-depends: x:{ x }"+ "cabal-version: 3.0\nbuild-depends: x:{x}\n"++ Hspec.describe "version ranges" $ do+ Hspec.it "implicit" $ do+ expectGilded+ "build-depends: x"+ "build-depends: x\n"++ Hspec.it "any" $ do+ expectGilded+ "build-depends: x -any"+ "build-depends: x -any\n"++ Hspec.it "none" $ do+ expectGilded+ "build-depends: x -none"+ "build-depends: x -none\n"++ Hspec.it "this" $ do+ expectGilded+ "build-depends: x == 1"+ "build-depends: x ==1\n"++ Hspec.it "later" $ do+ expectGilded+ "build-depends: x > 1"+ "build-depends: x >1\n"++ Hspec.it "or later" $ do+ expectGilded+ "build-depends: x >= 1"+ "build-depends: x >=1\n"++ Hspec.it "earlier" $ do+ expectGilded+ "build-depends: x < 1"+ "build-depends: x <1\n"++ Hspec.it "or earlier" $ do+ expectGilded+ "build-depends: x <= 1"+ "build-depends: x <=1\n"++ Hspec.it "union" $ do+ expectGilded+ "build-depends: x > 1 || < 1"+ "build-depends: x >1 || <1\n"++ Hspec.it "intersect" $ do+ expectGilded+ "build-depends: x > 1 && < 2"+ "build-depends: x >1 && <2\n"++ Hspec.it "within" $ do+ expectGilded+ "build-depends: x == 1.*"+ "build-depends: x ==1.*\n"++ Hspec.it "major bound" $ do+ expectGilded+ "build-depends: x ^>= 1"+ "build-depends: x ^>=1\n"++ Hspec.it "set" $ do+ expectGilded+ "build-depends: x == { 1 , 2 }"+ "build-depends: x =={1, 2}\n"++ Hspec.it "sorts set" $ do+ expectGilded+ "build-depends: x == { 2, 1 }"+ "build-depends: x =={1, 2}\n"++ Hspec.it "paren" $ do+ expectGilded+ "build-depends: x ( == 1 )"+ "build-depends: x (==1)\n" Hspec.around_ withTemporaryDirectory . Hspec.it "discovers modules on the file system"