optparse-applicative 0.3.0 → 0.3.1
raw patch · 5 files changed
+95/−21 lines, 5 filesdep ~basePVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: base
API changes (from Hackage documentation)
+ Options.Applicative.Builder: data ArgumentFields a
+ Options.Applicative.Builder: instance Monoid (DefaultProp a)
+ Options.Applicative.Builder: showDefault :: Show a => Mod f a
+ Options.Applicative.Builder: showDefaultWith :: (a -> String) -> Mod f a
+ Options.Applicative.Types: optShowDefault :: Option a -> Maybe String
+ Options.Applicative.Types: propShowDefault :: OptProperties -> Maybe String
- Options.Applicative.Types: OptProperties :: OptVisibility -> String -> String -> OptProperties
+ Options.Applicative.Types: OptProperties :: OptVisibility -> String -> String -> Maybe String -> OptProperties
Files
- Options/Applicative/Builder.hs +63/−18
- Options/Applicative/Help.hs +3/−1
- Options/Applicative/Types.hs +6/−1
- optparse-applicative.cabal +3/−1
- tests/Tests.hs +20/−0
Options/Applicative/Builder.hs view
@@ -32,6 +32,8 @@ long, help, value,+ showDefaultWith,+ showDefault, metavar, reader, hidden,@@ -53,6 +55,7 @@ OptionFields, FlagFields, CommandFields,+ ArgumentFields, -- * Builder for 'ParserInfo' InfoMod,@@ -105,20 +108,29 @@ -- mod -- +data DefaultProp a = DefaultProp+ (Maybe a)+ (Maybe (a -> String))++instance Monoid (DefaultProp a) where+ mempty = DefaultProp Nothing Nothing+ mappend (DefaultProp d1 s1) (DefaultProp d2 s2) =+ DefaultProp (d1 `mplus` d2) (s1 `mplus` s2)+ data Mod f a = Mod (f a -> f a)- (Maybe a)+ (DefaultProp a) (OptProperties -> OptProperties) optionMod :: (OptProperties -> OptProperties) -> Mod f a-optionMod = Mod id Nothing+optionMod = Mod id mempty fieldMod :: (f a -> f a) -> Mod f a-fieldMod f = Mod f Nothing id+fieldMod f = Mod f mempty id instance Monoid (Mod f a) where- mempty = Mod id Nothing id+ mempty = Mod id mempty id Mod f1 d1 g1 `mappend` Mod f2 d2 g2- = Mod (f2 . f1) (d2 `mplus` d1) (g2 . g1)+ = Mod (f2 . f1) (d2 <> d1) (g2 . g1) -- readers -- @@ -146,10 +158,18 @@ long :: HasName f => String -> Mod f a long = fieldMod . name . OptLong ----- | Specify a default value for an option.+-- | Specify a default value for an option. value :: a -> Mod f a-value x = Mod id (Just x) id+value x = Mod id (DefaultProp (Just x) Nothing) id +-- | Specify a function to show the default value for an option.+showDefaultWith :: (a -> String) -> Mod f a+showDefaultWith s = Mod id (DefaultProp Nothing (Just s)) id++-- | Show the default value for this option using its 'Show' instance.+showDefault :: Show a => Mod f a+showDefault = showDefaultWith show+ -- | Specify the help text for an option. help :: String -> Mod f a help s = optionMod $ \p -> p { propHelp = s }@@ -183,23 +203,44 @@ baseProps = OptProperties { propMetaVar = "" , propVisibility = Visible- , propHelp = "" }+ , propHelp = ""+ , propShowDefault = Nothing } -mkOption :: Maybe a -> Option a -> Parser a-mkOption def opt = liftOpt opt <|> maybe empty pure def+mkParser :: DefaultProp a+ -> (OptProperties -> OptProperties)+ -> OptReader a+ -> Parser a+mkParser d@(DefaultProp def _) g rdr = liftOpt opt <|> maybe empty pure def+ where+ opt = mkOption d g rdr +mkOption :: DefaultProp a+ -> (OptProperties -> OptProperties)+ -> OptReader a+ -> Option a+mkOption d g rdr = Option rdr (mkProps d g)++mkProps :: DefaultProp a+ -> (OptProperties -> OptProperties)+ -> OptProperties+mkProps (DefaultProp def sdef) g = props+ where+ props = (g baseProps)+ { propShowDefault = sdef <*> def }++ -- | Builder for a command parser. The 'command' modifier can be used to -- specify individual commands. subparser :: Mod CommandFields a -> Parser a-subparser m = mkOption def $ Option rdr (g baseProps)+subparser m = mkParser d g rdr where- Mod f def g = m & metavar "COMMAND"+ Mod f d g = m & metavar "COMMAND" CommandFields cmds = f (CommandFields []) rdr = CmdReader (map fst cmds) (`lookup` cmds) -- | Builder for an argument parser. argument :: (String -> Maybe a) -> Mod ArgumentFields a -> Parser a-argument p (Mod _ def g) = mkOption def $ Option (ArgReader p) (g baseProps)+argument p (Mod _ d g) = mkParser d g (ArgReader p) -- | Builder for an argument list parser. All arguments are collected and -- returned as a list.@@ -212,18 +253,22 @@ arguments :: (String -> Maybe a) -> Mod ArgumentFields [a] -> Parser [a] arguments p m = args1 <|> pure (fromMaybe [] def) where- Mod _ def g = m+ Mod _ (DefaultProp def sdef) g = m+ show_def = sdef <*> def p' ('-':_) = Nothing p' s = p s + props = mkProps mempty g+ props' = (mkProps mempty g) { propShowDefault = show_def }+ args1 = ((Just <$> arg') <|> (ddash *> pure Nothing)) `BindP` \x -> case x of Nothing -> many arg Just a -> fmap (a:) args args = args1 <|> pure [] - arg' = argument p' (optionMod g)- arg = argument p (optionMod g)+ arg = liftOpt (Option (ArgReader p) props)+ arg' = liftOpt (Option (ArgReader p') props') ddash = argument (guard . (== "--")) internal @@ -250,7 +295,7 @@ flag' :: a -- ^ active value -> Mod FlagFields a -- ^ option modifier -> Parser a-flag' actv (Mod f def g) = mkOption def $ Option rdr (g baseProps)+flag' actv (Mod f d g) = mkParser d g rdr where rdr = let fields = f (FlagFields [] actv) in FlagReader (flagNames fields)@@ -265,7 +310,7 @@ -- | Builder for an option with a null reader. A non-trivial reader can be -- added using the 'reader' modifier. nullOption :: Mod OptionFields a -> Parser a-nullOption (Mod f def g) = mkOption def $ Option rdr (g baseProps)+nullOption (Mod f d g) = mkParser d g rdr where rdr = let fields = f (OptionFields [] disabled) in OptReader (optNames fields) (optReader fields)
Options/Applicative/Help.hs view
@@ -80,9 +80,11 @@ doc info opt | null n = Nothing | null h = Nothing- | otherwise = Just (n, h)+ | otherwise = Just (n, h ++ hdef) where n = optDesc pprefs style info opt h = optHelp opt+ hdef = maybe "" show_def (optShowDefault opt)+ show_def s = " (default: " ++ s ++ ")" style = OptDescStyle { descSep = "," , descHidden = True
Options/Applicative/Types.hs view
@@ -16,7 +16,8 @@ optVisibility, optMetaVar,- optHelp+ optHelp,+ optShowDefault ) where import Control.Applicative@@ -70,6 +71,7 @@ { propVisibility :: OptVisibility -- ^ whether this flag is shown is the brief description , propHelp :: String -- ^ help text for this option , propMetaVar :: String -- ^ metavariable for this option+ , propShowDefault :: Maybe String -- ^ what to show in the help text as the default } -- | A single option of a parser.@@ -135,3 +137,6 @@ optMetaVar :: Option a -> String optMetaVar = propMetaVar . optProps++optShowDefault :: Option a -> Maybe String+optShowDefault = propShowDefault . optProps
optparse-applicative.cabal view
@@ -1,5 +1,5 @@ name: optparse-applicative-version: 0.3.0+version: 0.3.1 synopsis: Utilities and combinators for parsing command line options description: Here is a simple example of an applicative option parser:@@ -70,6 +70,8 @@ build-type: Simple cabal-version: >= 1.8 extra-source-files: README.md+homepage: https://github.com/pcapriotti/optparse-applicative+bug-reports: https://github.com/pcapriotti/optparse-applicative/issues library exposed-modules: Options.Applicative,
tests/Tests.hs view
@@ -20,6 +20,11 @@ where err b = assertFailure $ "expected Left, got " ++ show b +assertHasLine :: String -> String -> Assertion+assertHasLine l s+ | l `elem` lines s = return ()+ | otherwise = assertFailure $ "expected line:\n\t" ++ l ++ "\nnot found"+ checkHelpText :: Show a => String -> ParserInfo a -> [String] -> Assertion checkHelpText name p args = do let result = run p args@@ -77,6 +82,21 @@ Right xs -> [b, a, b, a, a, b] @=? xs where a = Alternatives.A b = Alternatives.B++case_show_default :: Assertion+case_show_default = do+ let p = option ( short 'n'+ & help "set count"+ & value (0 :: Int)+ & showDefault)+ i = info (p <**> helper) idm+ result = run i ["--help"]+ case result of+ Left (ParserFailure err _) ->+ assertHasLine+ " -n set count (default: 0)"+ (err "test")+ Right r -> assertFailure $ "unexpected result: " ++ show r main :: IO () main = $(defaultMainGenerator)