packages feed

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 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)