module Test.Hspec.Core.Config.Options (
Config(..)
, ColorMode (..)
, defaultConfig
, filterOr
, parseOptions
, ConfigFile
, ignoreConfigFile
, envVarName
) where
import Prelude ()
import Test.Hspec.Core.Compat
import System.IO
import System.Exit
import System.Console.GetOpt
import Test.Hspec.Core.Formatters
import Test.Hspec.Core.Config.Util
import Test.Hspec.Core.Util
import Test.Hspec.Core.Example (Params(..), defaultParams)
import Data.Functor.Identity
import Data.Maybe
type ConfigFile = (FilePath, [String])
type EnvVar = [String]
envVarName :: String
envVarName :: String
envVarName = "HSPEC_OPTIONS"
data Config = Config {
Config -> Bool
configIgnoreConfigFile :: Bool
, Config -> Bool
configDryRun :: Bool
, Config -> Bool
configFocusedOnly :: Bool
, Config -> Bool
configFailOnFocused :: Bool
, Config -> Bool
configPrintCpuTime :: Bool
, Config -> Bool
configFastFail :: Bool
, Config -> Maybe String
configFailureReport :: Maybe FilePath
, Config -> Bool
configRerun :: Bool
, Config -> Bool
configRerunAllOnSuccess :: Bool
, Config -> Maybe (Path -> Bool)
configFilterPredicate :: Maybe (Path -> Bool)
, Config -> Maybe (Path -> Bool)
configSkipPredicate :: Maybe (Path -> Bool)
, Config -> Maybe Integer
configQuickCheckSeed :: Maybe Integer
, Config -> Maybe Int
configQuickCheckMaxSuccess :: Maybe Int
, Config -> Maybe Int
configQuickCheckMaxDiscardRatio :: Maybe Int
, Config -> Maybe Int
configQuickCheckMaxSize :: Maybe Int
, Config -> Int
configSmallCheckDepth :: Int
, Config -> ColorMode
configColorMode :: ColorMode
, Config -> Bool
configDiff :: Bool
, Config -> Maybe Formatter
configFormatter :: Maybe Formatter
, Config -> Bool
configHtmlOutput :: Bool
, Config -> Either Handle String
configOutputFile :: Either Handle FilePath
, Config -> Maybe Int
configConcurrentJobs :: Maybe Int
}
defaultConfig :: Config
defaultConfig :: Config
defaultConfig = Config :: Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Maybe String
-> Bool
-> Bool
-> Maybe (Path -> Bool)
-> Maybe (Path -> Bool)
-> Maybe Integer
-> Maybe Int
-> Maybe Int
-> Maybe Int
-> Int
-> ColorMode
-> Bool
-> Maybe Formatter
-> Bool
-> Either Handle String
-> Maybe Int
-> Config
Config {
configIgnoreConfigFile :: Bool
configIgnoreConfigFile = Bool
False
, configDryRun :: Bool
configDryRun = Bool
False
, configFocusedOnly :: Bool
configFocusedOnly = Bool
False
, configFailOnFocused :: Bool
configFailOnFocused = Bool
False
, configPrintCpuTime :: Bool
configPrintCpuTime = Bool
False
, configFastFail :: Bool
configFastFail = Bool
False
, configFailureReport :: Maybe String
configFailureReport = Maybe String
forall a. Maybe a
Nothing
, configRerun :: Bool
configRerun = Bool
False
, configRerunAllOnSuccess :: Bool
configRerunAllOnSuccess = Bool
False
, configFilterPredicate :: Maybe (Path -> Bool)
configFilterPredicate = Maybe (Path -> Bool)
forall a. Maybe a
Nothing
, configSkipPredicate :: Maybe (Path -> Bool)
configSkipPredicate = Maybe (Path -> Bool)
forall a. Maybe a
Nothing
, configQuickCheckSeed :: Maybe Integer
configQuickCheckSeed = Maybe Integer
forall a. Maybe a
Nothing
, configQuickCheckMaxSuccess :: Maybe Int
configQuickCheckMaxSuccess = Maybe Int
forall a. Maybe a
Nothing
, configQuickCheckMaxDiscardRatio :: Maybe Int
configQuickCheckMaxDiscardRatio = Maybe Int
forall a. Maybe a
Nothing
, configQuickCheckMaxSize :: Maybe Int
configQuickCheckMaxSize = Maybe Int
forall a. Maybe a
Nothing
, configSmallCheckDepth :: Int
configSmallCheckDepth = Params -> Int
paramsSmallCheckDepth Params
defaultParams
, configColorMode :: ColorMode
configColorMode = ColorMode
ColorAuto
, configDiff :: Bool
configDiff = Bool
True
, configFormatter :: Maybe Formatter
configFormatter = Maybe Formatter
forall a. Maybe a
Nothing
, configHtmlOutput :: Bool
configHtmlOutput = Bool
False
, configOutputFile :: Either Handle String
configOutputFile = Handle -> Either Handle String
forall a b. a -> Either a b
Left Handle
stdout
, configConcurrentJobs :: Maybe Int
configConcurrentJobs = Maybe Int
forall a. Maybe a
Nothing
}
filterOr :: Maybe (Path -> Bool) -> Maybe (Path -> Bool) -> Maybe (Path -> Bool)
filterOr :: Maybe (Path -> Bool)
-> Maybe (Path -> Bool) -> Maybe (Path -> Bool)
filterOr p1_ :: Maybe (Path -> Bool)
p1_ p2_ :: Maybe (Path -> Bool)
p2_ = case (Maybe (Path -> Bool)
p1_, Maybe (Path -> Bool)
p2_) of
(Just p1 :: Path -> Bool
p1, Just p2 :: Path -> Bool
p2) -> (Path -> Bool) -> Maybe (Path -> Bool)
forall a. a -> Maybe a
Just ((Path -> Bool) -> Maybe (Path -> Bool))
-> (Path -> Bool) -> Maybe (Path -> Bool)
forall a b. (a -> b) -> a -> b
$ \path :: Path
path -> Path -> Bool
p1 Path
path Bool -> Bool -> Bool
|| Path -> Bool
p2 Path
path
_ -> Maybe (Path -> Bool)
p1_ Maybe (Path -> Bool)
-> Maybe (Path -> Bool) -> Maybe (Path -> Bool)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Maybe (Path -> Bool)
p2_
addMatch :: String -> Config -> Config
addMatch :: String -> Config -> Config
addMatch s :: String
s c :: Config
c = Config
c {configFilterPredicate :: Maybe (Path -> Bool)
configFilterPredicate = (Path -> Bool) -> Maybe (Path -> Bool)
forall a. a -> Maybe a
Just (String -> Path -> Bool
filterPredicate String
s) Maybe (Path -> Bool)
-> Maybe (Path -> Bool) -> Maybe (Path -> Bool)
`filterOr` Config -> Maybe (Path -> Bool)
configFilterPredicate Config
c}
addSkip :: String -> Config -> Config
addSkip :: String -> Config -> Config
addSkip s :: String
s c :: Config
c = Config
c {configSkipPredicate :: Maybe (Path -> Bool)
configSkipPredicate = (Path -> Bool) -> Maybe (Path -> Bool)
forall a. a -> Maybe a
Just (String -> Path -> Bool
filterPredicate String
s) Maybe (Path -> Bool)
-> Maybe (Path -> Bool) -> Maybe (Path -> Bool)
`filterOr` Config -> Maybe (Path -> Bool)
configSkipPredicate Config
c}
setDepth :: Int -> Config -> Config
setDepth :: Int -> Config -> Config
setDepth n :: Int
n c :: Config
c = Config
c {configSmallCheckDepth :: Int
configSmallCheckDepth = Int
n}
setMaxSuccess :: Int -> Config -> Config
setMaxSuccess :: Int -> Config -> Config
setMaxSuccess n :: Int
n c :: Config
c = Config
c {configQuickCheckMaxSuccess :: Maybe Int
configQuickCheckMaxSuccess = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
n}
setMaxSize :: Int -> Config -> Config
setMaxSize :: Int -> Config -> Config
setMaxSize n :: Int
n c :: Config
c = Config
c {configQuickCheckMaxSize :: Maybe Int
configQuickCheckMaxSize = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
n}
setMaxDiscardRatio :: Int -> Config -> Config
setMaxDiscardRatio :: Int -> Config -> Config
setMaxDiscardRatio n :: Int
n c :: Config
c = Config
c {configQuickCheckMaxDiscardRatio :: Maybe Int
configQuickCheckMaxDiscardRatio = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
n}
setSeed :: Integer -> Config -> Config
setSeed :: Integer -> Config -> Config
setSeed n :: Integer
n c :: Config
c = Config
c {configQuickCheckSeed :: Maybe Integer
configQuickCheckSeed = Integer -> Maybe Integer
forall a. a -> Maybe a
Just Integer
n}
data ColorMode = ColorAuto | ColorNever | ColorAlways
deriving (ColorMode -> ColorMode -> Bool
(ColorMode -> ColorMode -> Bool)
-> (ColorMode -> ColorMode -> Bool) -> Eq ColorMode
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ColorMode -> ColorMode -> Bool
$c/= :: ColorMode -> ColorMode -> Bool
== :: ColorMode -> ColorMode -> Bool
$c== :: ColorMode -> ColorMode -> Bool
Eq, Int -> ColorMode -> ShowS
[ColorMode] -> ShowS
ColorMode -> String
(Int -> ColorMode -> ShowS)
-> (ColorMode -> String)
-> ([ColorMode] -> ShowS)
-> Show ColorMode
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ColorMode] -> ShowS
$cshowList :: [ColorMode] -> ShowS
show :: ColorMode -> String
$cshow :: ColorMode -> String
showsPrec :: Int -> ColorMode -> ShowS
$cshowsPrec :: Int -> ColorMode -> ShowS
Show)
type Result m = Either InvalidArgument (m Config)
data InvalidArgument = InvalidArgument String String
data Arg a = Arg {
Arg a -> String
_argumentName :: String
, Arg a -> String -> Maybe a
_argumentParser :: String -> Maybe a
, Arg a -> a -> Config -> Config
_argumentSetter :: a -> Config -> Config
}
mkOption :: Monad m => [Char] -> String -> Arg a -> String -> OptDescr (Result m -> Result m)
mkOption :: String
-> String -> Arg a -> String -> OptDescr (Result m -> Result m)
mkOption shortcut :: String
shortcut name :: String
name (Arg argName :: String
argName parser :: String -> Maybe a
parser setter :: a -> Config -> Config
setter) help :: String
help = String
-> [String]
-> ArgDescr (Result m -> Result m)
-> String
-> OptDescr (Result m -> Result m)
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
shortcut [String
name] ((String -> Result m -> Result m)
-> String -> ArgDescr (Result m -> Result m)
forall a. (String -> a) -> String -> ArgDescr a
ReqArg String -> Result m -> Result m
forall (m :: * -> *).
Monad m =>
String
-> Either InvalidArgument (m Config)
-> Either InvalidArgument (m Config)
arg String
argName) String
help
where
arg :: String
-> Either InvalidArgument (m Config)
-> Either InvalidArgument (m Config)
arg input :: String
input x :: Either InvalidArgument (m Config)
x = Either InvalidArgument (m Config)
x Either InvalidArgument (m Config)
-> (m Config -> Either InvalidArgument (m Config))
-> Either InvalidArgument (m Config)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \c :: m Config
c -> case String -> Maybe a
parser String
input of
Just n :: a
n -> m Config -> Either InvalidArgument (m Config)
forall a b. b -> Either a b
Right (a -> Config -> Config
setter a
n (Config -> Config) -> m Config -> m Config
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
`liftM` m Config
c)
Nothing -> InvalidArgument -> Either InvalidArgument (m Config)
forall a b. a -> Either a b
Left (String -> String -> InvalidArgument
InvalidArgument String
name String
input)
mkFlag :: Monad m => String -> (Bool -> Config -> Config) -> String -> [OptDescr (Result m -> Result m)]
mkFlag :: String
-> (Bool -> Config -> Config)
-> String
-> [OptDescr (Result m -> Result m)]
mkFlag name :: String
name setter :: Bool -> Config -> Config
setter help :: String
help = [
String
-> [String]
-> ArgDescr (Result m -> Result m)
-> String
-> OptDescr (Result m -> Result m)
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option [] [String
name] ((Result m -> Result m) -> ArgDescr (Result m -> Result m)
forall a. a -> ArgDescr a
NoArg ((Result m -> Result m) -> ArgDescr (Result m -> Result m))
-> (Result m -> Result m) -> ArgDescr (Result m -> Result m)
forall a b. (a -> b) -> a -> b
$ (Config -> Config) -> Result m -> Result m
forall (m :: * -> *) a.
Monad m =>
(Config -> Config) -> Either a (m Config) -> Either a (m Config)
set ((Config -> Config) -> Result m -> Result m)
-> (Config -> Config) -> Result m -> Result m
forall a b. (a -> b) -> a -> b
$ Bool -> Config -> Config
setter Bool
True) String
help
, String
-> [String]
-> ArgDescr (Result m -> Result m)
-> String
-> OptDescr (Result m -> Result m)
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option [] ["no-" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
name] ((Result m -> Result m) -> ArgDescr (Result m -> Result m)
forall a. a -> ArgDescr a
NoArg ((Result m -> Result m) -> ArgDescr (Result m -> Result m))
-> (Result m -> Result m) -> ArgDescr (Result m -> Result m)
forall a b. (a -> b) -> a -> b
$ (Config -> Config) -> Result m -> Result m
forall (m :: * -> *) a.
Monad m =>
(Config -> Config) -> Either a (m Config) -> Either a (m Config)
set ((Config -> Config) -> Result m -> Result m)
-> (Config -> Config) -> Result m -> Result m
forall a b. (a -> b) -> a -> b
$ Bool -> Config -> Config
setter Bool
False) ("do not " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
help)
]
commandLineOptions :: [OptDescr (Result Maybe -> Result Maybe)]
commandLineOptions :: [OptDescr (Result Maybe -> Result Maybe)]
commandLineOptions = [
String
-> [String]
-> ArgDescr (Result Maybe -> Result Maybe)
-> String
-> OptDescr (Result Maybe -> Result Maybe)
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option [] ["help"] ((Result Maybe -> Result Maybe)
-> ArgDescr (Result Maybe -> Result Maybe)
forall a. a -> ArgDescr a
NoArg (Result Maybe -> Result Maybe -> Result Maybe
forall a b. a -> b -> a
const (Result Maybe -> Result Maybe -> Result Maybe)
-> Result Maybe -> Result Maybe -> Result Maybe
forall a b. (a -> b) -> a -> b
$ Maybe Config -> Result Maybe
forall a b. b -> Either a b
Right Maybe Config
forall a. Maybe a
Nothing)) "display this help and exit"
, String
-> [String]
-> ArgDescr (Result Maybe -> Result Maybe)
-> String
-> OptDescr (Result Maybe -> Result Maybe)
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option [] ["ignore-dot-hspec"] ((Result Maybe -> Result Maybe)
-> ArgDescr (Result Maybe -> Result Maybe)
forall a. a -> ArgDescr a
NoArg Result Maybe -> Result Maybe
forall a. Either a (Maybe Config) -> Either a (Maybe Config)
setIgnoreConfigFile) "do not read options from ~/.hspec and .hspec"
, String
-> String
-> Arg String
-> String
-> OptDescr (Result Maybe -> Result Maybe)
forall (m :: * -> *) a.
Monad m =>
String
-> String -> Arg a -> String -> OptDescr (Result m -> Result m)
mkOption "m" "match" (String
-> (String -> Maybe String)
-> (String -> Config -> Config)
-> Arg String
forall a.
String -> (String -> Maybe a) -> (a -> Config -> Config) -> Arg a
Arg "PATTERN" String -> Maybe String
forall (m :: * -> *) a. Monad m => a -> m a
return String -> Config -> Config
addMatch) "only run examples that match given PATTERN"
, String
-> String
-> Arg String
-> String
-> OptDescr (Result Maybe -> Result Maybe)
forall (m :: * -> *) a.
Monad m =>
String
-> String -> Arg a -> String -> OptDescr (Result m -> Result m)
mkOption [] "skip" (String
-> (String -> Maybe String)
-> (String -> Config -> Config)
-> Arg String
forall a.
String -> (String -> Maybe a) -> (a -> Config -> Config) -> Arg a
Arg "PATTERN" String -> Maybe String
forall (m :: * -> *) a. Monad m => a -> m a
return String -> Config -> Config
addSkip) "skip examples that match given PATTERN"
]
where
setIgnoreConfigFile :: Either a (Maybe Config) -> Either a (Maybe Config)
setIgnoreConfigFile = (Config -> Config)
-> Either a (Maybe Config) -> Either a (Maybe Config)
forall (m :: * -> *) a.
Monad m =>
(Config -> Config) -> Either a (m Config) -> Either a (m Config)
set ((Config -> Config)
-> Either a (Maybe Config) -> Either a (Maybe Config))
-> (Config -> Config)
-> Either a (Maybe Config)
-> Either a (Maybe Config)
forall a b. (a -> b) -> a -> b
$ \config :: Config
config -> Config
config {configIgnoreConfigFile :: Bool
configIgnoreConfigFile = Bool
True}
formatterOptions :: Monad m => [OptDescr (Result m -> Result m)]
formatterOptions :: [OptDescr (Result m -> Result m)]
formatterOptions = [[OptDescr (Result m -> Result m)]]
-> [OptDescr (Result m -> Result m)]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [
[String
-> String
-> Arg Formatter
-> String
-> OptDescr (Result m -> Result m)
forall (m :: * -> *) a.
Monad m =>
String
-> String -> Arg a -> String -> OptDescr (Result m -> Result m)
mkOption "f" "format" (String
-> (String -> Maybe Formatter)
-> (Formatter -> Config -> Config)
-> Arg Formatter
forall a.
String -> (String -> Maybe a) -> (a -> Config -> Config) -> Arg a
Arg "FORMATTER" String -> Maybe Formatter
readFormatter Formatter -> Config -> Config
setFormatter) String
helpForFormat]
, String
-> (Bool -> Config -> Config)
-> String
-> [OptDescr (Result m -> Result m)]
forall (m :: * -> *).
Monad m =>
String
-> (Bool -> Config -> Config)
-> String
-> [OptDescr (Result m -> Result m)]
mkFlag "color" Bool -> Config -> Config
setColor "colorize the output"
, String
-> (Bool -> Config -> Config)
-> String
-> [OptDescr (Result m -> Result m)]
forall (m :: * -> *).
Monad m =>
String
-> (Bool -> Config -> Config)
-> String
-> [OptDescr (Result m -> Result m)]
mkFlag "diff" Bool -> Config -> Config
setDiff "show colorized diffs"
, [String
-> [String]
-> ArgDescr (Result m -> Result m)
-> String
-> OptDescr (Result m -> Result m)
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option [] ["print-cpu-time"] ((Result m -> Result m) -> ArgDescr (Result m -> Result m)
forall a. a -> ArgDescr a
NoArg Result m -> Result m
forall a. Either a (m Config) -> Either a (m Config)
setPrintCpuTime) "include used CPU time in summary"]
]
where
formatters :: [(String, Formatter)]
formatters :: [(String, Formatter)]
formatters = [
("specdoc", Formatter
specdoc)
, ("progress", Formatter
progress)
, ("failed-examples", Formatter
failed_examples)
, ("silent", Formatter
silent)
]
helpForFormat :: String
helpForFormat :: String
helpForFormat = "use a custom formatter; this can be one of " String -> ShowS
forall a. [a] -> [a] -> [a]
++ ([String] -> String
formatOrList ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ ((String, Formatter) -> String)
-> [(String, Formatter)] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (String, Formatter) -> String
forall a b. (a, b) -> a
fst [(String, Formatter)]
formatters)
readFormatter :: String -> Maybe Formatter
readFormatter :: String -> Maybe Formatter
readFormatter = (String -> [(String, Formatter)] -> Maybe Formatter
forall a b. Eq a => a -> [(a, b)] -> Maybe b
`lookup` [(String, Formatter)]
formatters)
setFormatter :: Formatter -> Config -> Config
setFormatter :: Formatter -> Config -> Config
setFormatter f :: Formatter
f c :: Config
c = Config
c {configFormatter :: Maybe Formatter
configFormatter = Formatter -> Maybe Formatter
forall a. a -> Maybe a
Just Formatter
f}
setColor :: Bool -> Config -> Config
setColor :: Bool -> Config -> Config
setColor v :: Bool
v config :: Config
config = Config
config {configColorMode :: ColorMode
configColorMode = if Bool
v then ColorMode
ColorAlways else ColorMode
ColorNever}
setDiff :: Bool -> Config -> Config
setDiff :: Bool -> Config -> Config
setDiff v :: Bool
v config :: Config
config = Config
config {configDiff :: Bool
configDiff = Bool
v}
setPrintCpuTime :: Either a (m Config) -> Either a (m Config)
setPrintCpuTime = (Config -> Config) -> Either a (m Config) -> Either a (m Config)
forall (m :: * -> *) a.
Monad m =>
(Config -> Config) -> Either a (m Config) -> Either a (m Config)
set ((Config -> Config) -> Either a (m Config) -> Either a (m Config))
-> (Config -> Config) -> Either a (m Config) -> Either a (m Config)
forall a b. (a -> b) -> a -> b
$ \config :: Config
config -> Config
config {configPrintCpuTime :: Bool
configPrintCpuTime = Bool
True}
smallCheckOptions :: Monad m => [OptDescr (Result m -> Result m)]
smallCheckOptions :: [OptDescr (Result m -> Result m)]
smallCheckOptions = [
String
-> String -> Arg Int -> String -> OptDescr (Result m -> Result m)
forall (m :: * -> *) a.
Monad m =>
String
-> String -> Arg a -> String -> OptDescr (Result m -> Result m)
mkOption [] "depth" (String
-> (String -> Maybe Int) -> (Int -> Config -> Config) -> Arg Int
forall a.
String -> (String -> Maybe a) -> (a -> Config -> Config) -> Arg a
Arg "N" String -> Maybe Int
forall a. Read a => String -> Maybe a
readMaybe Int -> Config -> Config
setDepth) "maximum depth of generated test values for SmallCheck properties"
]
quickCheckOptions :: Monad m => [OptDescr (Result m -> Result m)]
quickCheckOptions :: [OptDescr (Result m -> Result m)]
quickCheckOptions = [
String
-> String -> Arg Int -> String -> OptDescr (Result m -> Result m)
forall (m :: * -> *) a.
Monad m =>
String
-> String -> Arg a -> String -> OptDescr (Result m -> Result m)
mkOption "a" "qc-max-success" (String
-> (String -> Maybe Int) -> (Int -> Config -> Config) -> Arg Int
forall a.
String -> (String -> Maybe a) -> (a -> Config -> Config) -> Arg a
Arg "N" String -> Maybe Int
forall a. Read a => String -> Maybe a
readMaybe Int -> Config -> Config
setMaxSuccess) "maximum number of successful tests before a QuickCheck property succeeds"
, String
-> String -> Arg Int -> String -> OptDescr (Result m -> Result m)
forall (m :: * -> *) a.
Monad m =>
String
-> String -> Arg a -> String -> OptDescr (Result m -> Result m)
mkOption "" "qc-max-size" (String
-> (String -> Maybe Int) -> (Int -> Config -> Config) -> Arg Int
forall a.
String -> (String -> Maybe a) -> (a -> Config -> Config) -> Arg a
Arg "N" String -> Maybe Int
forall a. Read a => String -> Maybe a
readMaybe Int -> Config -> Config
setMaxSize) "size to use for the biggest test cases"
, String
-> String -> Arg Int -> String -> OptDescr (Result m -> Result m)
forall (m :: * -> *) a.
Monad m =>
String
-> String -> Arg a -> String -> OptDescr (Result m -> Result m)
mkOption "" "qc-max-discard" (String
-> (String -> Maybe Int) -> (Int -> Config -> Config) -> Arg Int
forall a.
String -> (String -> Maybe a) -> (a -> Config -> Config) -> Arg a
Arg "N" String -> Maybe Int
forall a. Read a => String -> Maybe a
readMaybe Int -> Config -> Config
setMaxDiscardRatio) "maximum number of discarded tests per successful test before giving up"
, String
-> String
-> Arg Integer
-> String
-> OptDescr (Result m -> Result m)
forall (m :: * -> *) a.
Monad m =>
String
-> String -> Arg a -> String -> OptDescr (Result m -> Result m)
mkOption [] "seed" (String
-> (String -> Maybe Integer)
-> (Integer -> Config -> Config)
-> Arg Integer
forall a.
String -> (String -> Maybe a) -> (a -> Config -> Config) -> Arg a
Arg "N" String -> Maybe Integer
forall a. Read a => String -> Maybe a
readMaybe Integer -> Config -> Config
setSeed) "used seed for QuickCheck properties"
]
runnerOptions :: Monad m => [OptDescr (Result m -> Result m)]
runnerOptions :: [OptDescr (Result m -> Result m)]
runnerOptions = [[OptDescr (Result m -> Result m)]]
-> [OptDescr (Result m -> Result m)]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [
String
-> (Bool -> Config -> Config)
-> String
-> [OptDescr (Result m -> Result m)]
forall (m :: * -> *).
Monad m =>
String
-> (Bool -> Config -> Config)
-> String
-> [OptDescr (Result m -> Result m)]
mkFlag "dry-run" Bool -> Config -> Config
setDryRun "pretend that everything passed; don't verify anything"
, String
-> (Bool -> Config -> Config)
-> String
-> [OptDescr (Result m -> Result m)]
forall (m :: * -> *).
Monad m =>
String
-> (Bool -> Config -> Config)
-> String
-> [OptDescr (Result m -> Result m)]
mkFlag "focused-only" Bool -> Config -> Config
setFocusedOnly "do not run anything, unless there are focused spec items"
, String
-> (Bool -> Config -> Config)
-> String
-> [OptDescr (Result m -> Result m)]
forall (m :: * -> *).
Monad m =>
String
-> (Bool -> Config -> Config)
-> String
-> [OptDescr (Result m -> Result m)]
mkFlag "fail-on-focused" Bool -> Config -> Config
setFailOnFocused "fail on focused spec items"
, String
-> (Bool -> Config -> Config)
-> String
-> [OptDescr (Result m -> Result m)]
forall (m :: * -> *).
Monad m =>
String
-> (Bool -> Config -> Config)
-> String
-> [OptDescr (Result m -> Result m)]
mkFlag "fail-fast" Bool -> Config -> Config
setFastFail "abort on first failure"
] [OptDescr (Result m -> Result m)]
-> [OptDescr (Result m -> Result m)]
-> [OptDescr (Result m -> Result m)]
forall a. [a] -> [a] -> [a]
++ [
String
-> [String]
-> ArgDescr (Result m -> Result m)
-> String
-> OptDescr (Result m -> Result m)
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option "r" ["rerun"] ((Result m -> Result m) -> ArgDescr (Result m -> Result m)
forall a. a -> ArgDescr a
NoArg Result m -> Result m
forall a. Either a (m Config) -> Either a (m Config)
setRerun) "rerun all examples that failed in the previous test run (only works in combination with --failure-report or in GHCi)"
, String
-> String
-> Arg String
-> String
-> OptDescr (Result m -> Result m)
forall (m :: * -> *) a.
Monad m =>
String
-> String -> Arg a -> String -> OptDescr (Result m -> Result m)
mkOption [] "failure-report" (String
-> (String -> Maybe String)
-> (String -> Config -> Config)
-> Arg String
forall a.
String -> (String -> Maybe a) -> (a -> Config -> Config) -> Arg a
Arg "FILE" String -> Maybe String
forall (m :: * -> *) a. Monad m => a -> m a
return String -> Config -> Config
setFailureReport) "read/write a failure report for use with --rerun"
, String
-> [String]
-> ArgDescr (Result m -> Result m)
-> String
-> OptDescr (Result m -> Result m)
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option [] ["rerun-all-on-success"] ((Result m -> Result m) -> ArgDescr (Result m -> Result m)
forall a. a -> ArgDescr a
NoArg Result m -> Result m
forall a. Either a (m Config) -> Either a (m Config)
setRerunAllOnSuccess) "run the whole test suite after a previously failing rerun succeeds for the first time (only works in combination with --rerun)"
, String
-> String -> Arg Int -> String -> OptDescr (Result m -> Result m)
forall (m :: * -> *) a.
Monad m =>
String
-> String -> Arg a -> String -> OptDescr (Result m -> Result m)
mkOption "j" "jobs" (String
-> (String -> Maybe Int) -> (Int -> Config -> Config) -> Arg Int
forall a.
String -> (String -> Maybe a) -> (a -> Config -> Config) -> Arg a
Arg "N" String -> Maybe Int
readMaxJobs Int -> Config -> Config
setMaxJobs) "run at most N parallelizable tests simultaneously (default: number of available processors)"
]
where
readMaxJobs :: String -> Maybe Int
readMaxJobs :: String -> Maybe Int
readMaxJobs s :: String
s = do
Int
n <- String -> Maybe Int
forall a. Read a => String -> Maybe a
readMaybe String
s
Bool -> Maybe ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Bool -> Maybe ()) -> Bool -> Maybe ()
forall a b. (a -> b) -> a -> b
$ Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> 0
Int -> Maybe Int
forall (m :: * -> *) a. Monad m => a -> m a
return Int
n
setFailureReport :: String -> Config -> Config
setFailureReport :: String -> Config -> Config
setFailureReport file :: String
file c :: Config
c = Config
c {configFailureReport :: Maybe String
configFailureReport = String -> Maybe String
forall a. a -> Maybe a
Just String
file}
setMaxJobs :: Int -> Config -> Config
setMaxJobs :: Int -> Config -> Config
setMaxJobs n :: Int
n c :: Config
c = Config
c {configConcurrentJobs :: Maybe Int
configConcurrentJobs = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
n}
setDryRun :: Bool -> Config -> Config
setDryRun :: Bool -> Config -> Config
setDryRun value :: Bool
value config :: Config
config = Config
config {configDryRun :: Bool
configDryRun = Bool
value}
setFocusedOnly :: Bool -> Config -> Config
setFocusedOnly :: Bool -> Config -> Config
setFocusedOnly value :: Bool
value config :: Config
config = Config
config {configFocusedOnly :: Bool
configFocusedOnly = Bool
value}
setFailOnFocused :: Bool -> Config -> Config
setFailOnFocused :: Bool -> Config -> Config
setFailOnFocused value :: Bool
value config :: Config
config = Config
config {configFailOnFocused :: Bool
configFailOnFocused = Bool
value}
setFastFail :: Bool -> Config -> Config
setFastFail :: Bool -> Config -> Config
setFastFail value :: Bool
value config :: Config
config = Config
config {configFastFail :: Bool
configFastFail = Bool
value}
setRerun :: Either a (m Config) -> Either a (m Config)
setRerun = (Config -> Config) -> Either a (m Config) -> Either a (m Config)
forall (m :: * -> *) a.
Monad m =>
(Config -> Config) -> Either a (m Config) -> Either a (m Config)
set ((Config -> Config) -> Either a (m Config) -> Either a (m Config))
-> (Config -> Config) -> Either a (m Config) -> Either a (m Config)
forall a b. (a -> b) -> a -> b
$ \config :: Config
config -> Config
config {configRerun :: Bool
configRerun = Bool
True}
setRerunAllOnSuccess :: Either a (m Config) -> Either a (m Config)
setRerunAllOnSuccess = (Config -> Config) -> Either a (m Config) -> Either a (m Config)
forall (m :: * -> *) a.
Monad m =>
(Config -> Config) -> Either a (m Config) -> Either a (m Config)
set ((Config -> Config) -> Either a (m Config) -> Either a (m Config))
-> (Config -> Config) -> Either a (m Config) -> Either a (m Config)
forall a b. (a -> b) -> a -> b
$ \config :: Config
config -> Config
config {configRerunAllOnSuccess :: Bool
configRerunAllOnSuccess = Bool
True}
documentedConfigFileOptions :: Monad m => [(String, [OptDescr (Result m -> Result m)])]
documentedConfigFileOptions :: [(String, [OptDescr (Result m -> Result m)])]
documentedConfigFileOptions = [
("RUNNER OPTIONS", [OptDescr (Result m -> Result m)]
forall (m :: * -> *). Monad m => [OptDescr (Result m -> Result m)]
runnerOptions)
, ("FORMATTER OPTIONS", [OptDescr (Result m -> Result m)]
forall (m :: * -> *). Monad m => [OptDescr (Result m -> Result m)]
formatterOptions)
, ("OPTIONS FOR QUICKCHECK", [OptDescr (Result m -> Result m)]
forall (m :: * -> *). Monad m => [OptDescr (Result m -> Result m)]
quickCheckOptions)
, ("OPTIONS FOR SMALLCHECK", [OptDescr (Result m -> Result m)]
forall (m :: * -> *). Monad m => [OptDescr (Result m -> Result m)]
smallCheckOptions)
]
documentedOptions :: [(String, [OptDescr (Result Maybe -> Result Maybe)])]
documentedOptions :: [(String, [OptDescr (Result Maybe -> Result Maybe)])]
documentedOptions = ("OPTIONS", [OptDescr (Result Maybe -> Result Maybe)]
commandLineOptions) (String, [OptDescr (Result Maybe -> Result Maybe)])
-> [(String, [OptDescr (Result Maybe -> Result Maybe)])]
-> [(String, [OptDescr (Result Maybe -> Result Maybe)])]
forall a. a -> [a] -> [a]
: [(String, [OptDescr (Result Maybe -> Result Maybe)])]
forall (m :: * -> *).
Monad m =>
[(String, [OptDescr (Result m -> Result m)])]
documentedConfigFileOptions
configFileOptions :: Monad m => [OptDescr (Result m -> Result m)]
configFileOptions :: [OptDescr (Result m -> Result m)]
configFileOptions = ([[OptDescr (Result m -> Result m)]]
-> [OptDescr (Result m -> Result m)]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([[OptDescr (Result m -> Result m)]]
-> [OptDescr (Result m -> Result m)])
-> ([(String, [OptDescr (Result m -> Result m)])]
-> [[OptDescr (Result m -> Result m)]])
-> [(String, [OptDescr (Result m -> Result m)])]
-> [OptDescr (Result m -> Result m)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((String, [OptDescr (Result m -> Result m)])
-> [OptDescr (Result m -> Result m)])
-> [(String, [OptDescr (Result m -> Result m)])]
-> [[OptDescr (Result m -> Result m)]]
forall a b. (a -> b) -> [a] -> [b]
map (String, [OptDescr (Result m -> Result m)])
-> [OptDescr (Result m -> Result m)]
forall a b. (a, b) -> b
snd) [(String, [OptDescr (Result m -> Result m)])]
forall (m :: * -> *).
Monad m =>
[(String, [OptDescr (Result m -> Result m)])]
documentedConfigFileOptions
set :: Monad m => (Config -> Config) -> Either a (m Config) -> Either a (m Config)
set :: (Config -> Config) -> Either a (m Config) -> Either a (m Config)
set = (m Config -> m Config)
-> Either a (m Config) -> Either a (m Config)
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM ((m Config -> m Config)
-> Either a (m Config) -> Either a (m Config))
-> ((Config -> Config) -> m Config -> m Config)
-> (Config -> Config)
-> Either a (m Config)
-> Either a (m Config)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Config -> Config) -> m Config -> m Config
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM
undocumentedOptions :: Monad m => [OptDescr (Result m -> Result m)]
undocumentedOptions :: [OptDescr (Result m -> Result m)]
undocumentedOptions = [
String
-> String -> Arg Int -> String -> OptDescr (Result m -> Result m)
forall (m :: * -> *) a.
Monad m =>
String
-> String -> Arg a -> String -> OptDescr (Result m -> Result m)
mkOption [] "maximum-generated-tests" (String
-> (String -> Maybe Int) -> (Int -> Config -> Config) -> Arg Int
forall a.
String -> (String -> Maybe a) -> (a -> Config -> Config) -> Arg a
Arg "NUMBER" String -> Maybe Int
forall a. Read a => String -> Maybe a
readMaybe Int -> Config -> Config
setMaxSuccess) "how many automated tests something like QuickCheck should try, by default"
, String
-> [String]
-> ArgDescr (Result m -> Result m)
-> String
-> OptDescr (Result m -> Result m)
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option [] ["html"] ((Result m -> Result m) -> ArgDescr (Result m -> Result m)
forall a. a -> ArgDescr a
NoArg Result m -> Result m
forall a. Either a (m Config) -> Either a (m Config)
setHtml) "produce HTML output"
, String
-> String
-> Arg String
-> String
-> OptDescr (Result m -> Result m)
forall (m :: * -> *) a.
Monad m =>
String
-> String -> Arg a -> String -> OptDescr (Result m -> Result m)
mkOption "o" "out" (String
-> (String -> Maybe String)
-> (String -> Config -> Config)
-> Arg String
forall a.
String -> (String -> Maybe a) -> (a -> Config -> Config) -> Arg a
Arg "FILE" String -> Maybe String
forall (m :: * -> *) a. Monad m => a -> m a
return String -> Config -> Config
setOutputFile) "write output to a file instead of STDOUT"
, String
-> [String]
-> ArgDescr (Result m -> Result m)
-> String
-> OptDescr (Result m -> Result m)
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option "v" ["verbose"] ((Result m -> Result m) -> ArgDescr (Result m -> Result m)
forall a. a -> ArgDescr a
NoArg Result m -> Result m
forall a. a -> a
id) "do not suppress output to stdout when evaluating examples"
]
where
setHtml :: Either a (m Config) -> Either a (m Config)
setHtml = (Config -> Config) -> Either a (m Config) -> Either a (m Config)
forall (m :: * -> *) a.
Monad m =>
(Config -> Config) -> Either a (m Config) -> Either a (m Config)
set ((Config -> Config) -> Either a (m Config) -> Either a (m Config))
-> (Config -> Config) -> Either a (m Config) -> Either a (m Config)
forall a b. (a -> b) -> a -> b
$ \config :: Config
config -> Config
config {configHtmlOutput :: Bool
configHtmlOutput = Bool
True}
setOutputFile :: String -> Config -> Config
setOutputFile :: String -> Config -> Config
setOutputFile file :: String
file c :: Config
c = Config
c {configOutputFile :: Either Handle String
configOutputFile = String -> Either Handle String
forall a b. b -> Either a b
Right String
file}
recognizedOptions :: [OptDescr (Result Maybe -> Result Maybe)]
recognizedOptions :: [OptDescr (Result Maybe -> Result Maybe)]
recognizedOptions = [OptDescr (Result Maybe -> Result Maybe)]
commandLineOptions [OptDescr (Result Maybe -> Result Maybe)]
-> [OptDescr (Result Maybe -> Result Maybe)]
-> [OptDescr (Result Maybe -> Result Maybe)]
forall a. [a] -> [a] -> [a]
++ [OptDescr (Result Maybe -> Result Maybe)]
forall (m :: * -> *). Monad m => [OptDescr (Result m -> Result m)]
configFileOptions [OptDescr (Result Maybe -> Result Maybe)]
-> [OptDescr (Result Maybe -> Result Maybe)]
-> [OptDescr (Result Maybe -> Result Maybe)]
forall a. [a] -> [a] -> [a]
++ [OptDescr (Result Maybe -> Result Maybe)]
forall (m :: * -> *). Monad m => [OptDescr (Result m -> Result m)]
undocumentedOptions
parseOptions :: Config -> String -> [ConfigFile] -> Maybe EnvVar -> [String] -> Either (ExitCode, String) Config
parseOptions :: Config
-> String
-> [ConfigFile]
-> Maybe [String]
-> [String]
-> Either (ExitCode, String) Config
parseOptions config :: Config
config prog :: String
prog configFiles :: [ConfigFile]
configFiles envVar :: Maybe [String]
envVar args :: [String]
args = do
(Config -> ConfigFile -> Either (ExitCode, String) Config)
-> Config -> [ConfigFile] -> Either (ExitCode, String) Config
forall (t :: * -> *) (m :: * -> *) b a.
(Foldable t, Monad m) =>
(b -> a -> m b) -> b -> t a -> m b
foldM (String -> Config -> ConfigFile -> Either (ExitCode, String) Config
parseFileOptions String
prog) Config
config [ConfigFile]
configFiles
Either (ExitCode, String) Config
-> (Config -> Either (ExitCode, String) Config)
-> Either (ExitCode, String) Config
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= String
-> Maybe [String] -> Config -> Either (ExitCode, String) Config
parseEnvVarOptions String
prog Maybe [String]
envVar
Either (ExitCode, String) Config
-> (Config -> Either (ExitCode, String) Config)
-> Either (ExitCode, String) Config
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= String -> [String] -> Config -> Either (ExitCode, String) Config
parseCommandLineOptions String
prog [String]
args
parseCommandLineOptions :: String -> [String] -> Config -> Either (ExitCode, String) Config
parseCommandLineOptions :: String -> [String] -> Config -> Either (ExitCode, String) Config
parseCommandLineOptions prog :: String
prog args :: [String]
args config :: Config
config = case [OptDescr (Result Maybe -> Result Maybe)]
-> Config -> [String] -> Either String (Maybe Config)
forall (m :: * -> *).
Monad m =>
[OptDescr (Result m -> Result m)]
-> Config -> [String] -> Either String (m Config)
parse [OptDescr (Result Maybe -> Result Maybe)]
recognizedOptions Config
config [String]
args of
Right Nothing -> (ExitCode, String) -> Either (ExitCode, String) Config
forall a b. a -> Either a b
Left (ExitCode
ExitSuccess, String
usage)
Right (Just c :: Config
c) -> Config -> Either (ExitCode, String) Config
forall a b. b -> Either a b
Right Config
c
Left err :: String
err -> String -> Either (ExitCode, String) Config
forall b. String -> Either (ExitCode, String) b
failure String
err
where
failure :: String -> Either (ExitCode, String) b
failure err :: String
err = (ExitCode, String) -> Either (ExitCode, String) b
forall a b. a -> Either a b
Left (Int -> ExitCode
ExitFailure 1, String
prog String -> ShowS
forall a. [a] -> [a] -> [a]
++ ": " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
err String -> ShowS
forall a. [a] -> [a] -> [a]
++ "\nTry `" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
prog String -> ShowS
forall a. [a] -> [a] -> [a]
++ " --help' for more information.\n")
usage :: String
usage :: String
usage = "Usage: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
prog String -> ShowS
forall a. [a] -> [a] -> [a]
++ " [OPTION]...\n\n"
String -> ShowS
forall a. [a] -> [a] -> [a]
++ (String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
intercalate "\n" ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ ((String, [OptDescr (Result Maybe -> Result Maybe)]) -> String)
-> [(String, [OptDescr (Result Maybe -> Result Maybe)])]
-> [String]
forall a b. (a -> b) -> [a] -> [b]
map ((String -> [OptDescr (Result Maybe -> Result Maybe)] -> String)
-> (String, [OptDescr (Result Maybe -> Result Maybe)]) -> String
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry String -> [OptDescr (Result Maybe -> Result Maybe)] -> String
forall a. String -> [OptDescr a] -> String
mkUsageInfo) [(String, [OptDescr (Result Maybe -> Result Maybe)])]
documentedOptions)
parseFileOptions :: String -> Config -> ConfigFile -> Either (ExitCode, String) Config
parseFileOptions :: String -> Config -> ConfigFile -> Either (ExitCode, String) Config
parseFileOptions prog :: String
prog config :: Config
config (name :: String
name, args :: [String]
args) =
String
-> String -> [String] -> Config -> Either (ExitCode, String) Config
parseOtherOptions String
prog ("in config file " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
name) [String]
args Config
config
parseEnvVarOptions :: String -> (Maybe EnvVar) -> Config -> Either (ExitCode, String) Config
parseEnvVarOptions :: String
-> Maybe [String] -> Config -> Either (ExitCode, String) Config
parseEnvVarOptions prog :: String
prog args :: Maybe [String]
args =
String
-> String -> [String] -> Config -> Either (ExitCode, String) Config
parseOtherOptions String
prog ("from environment variable " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
envVarName) ([String] -> Maybe [String] -> [String]
forall a. a -> Maybe a -> a
fromMaybe [] Maybe [String]
args)
parseOtherOptions :: String -> String -> [String] -> Config -> Either (ExitCode, String) Config
parseOtherOptions :: String
-> String -> [String] -> Config -> Either (ExitCode, String) Config
parseOtherOptions prog :: String
prog source :: String
source args :: [String]
args config :: Config
config = case [OptDescr (Result Identity -> Result Identity)]
-> Config -> [String] -> Either String (Identity Config)
forall (m :: * -> *).
Monad m =>
[OptDescr (Result m -> Result m)]
-> Config -> [String] -> Either String (m Config)
parse [OptDescr (Result Identity -> Result Identity)]
forall (m :: * -> *). Monad m => [OptDescr (Result m -> Result m)]
configFileOptions Config
config [String]
args of
Right (Identity c :: Config
c) -> Config -> Either (ExitCode, String) Config
forall a b. b -> Either a b
Right Config
c
Left err :: String
err -> String -> Either (ExitCode, String) Config
forall b. String -> Either (ExitCode, String) b
failure String
err
where
failure :: String -> Either (ExitCode, String) b
failure err :: String
err = (ExitCode, String) -> Either (ExitCode, String) b
forall a b. a -> Either a b
Left (Int -> ExitCode
ExitFailure 1, String
prog String -> ShowS
forall a. [a] -> [a] -> [a]
++ ": " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
message)
where
message :: String
message = [String] -> String
unlines ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ case String -> [String]
lines String
err of
[x :: String
x] -> [String
x String -> ShowS
forall a. [a] -> [a] -> [a]
++ " " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
source]
xs :: [String]
xs -> [String]
xs [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [String
source]
parse :: Monad m => [OptDescr (Result m -> Result m)] -> Config -> [String] -> Either String (m Config)
parse :: [OptDescr (Result m -> Result m)]
-> Config -> [String] -> Either String (m Config)
parse options :: [OptDescr (Result m -> Result m)]
options config :: Config
config args :: [String]
args = case ArgOrder (Result m -> Result m)
-> [OptDescr (Result m -> Result m)]
-> [String]
-> ([Result m -> Result m], [String], [String])
forall a.
ArgOrder a -> [OptDescr a] -> [String] -> ([a], [String], [String])
getOpt ArgOrder (Result m -> Result m)
forall a. ArgOrder a
Permute [OptDescr (Result m -> Result m)]
options [String]
args of
(opts :: [Result m -> Result m]
opts, [], []) -> case (Result m -> (Result m -> Result m) -> Result m)
-> Result m -> [Result m -> Result m] -> Result m
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (((Result m -> Result m) -> Result m -> Result m)
-> Result m -> (Result m -> Result m) -> Result m
forall a b c. (a -> b -> c) -> b -> a -> c
flip (Result m -> Result m) -> Result m -> Result m
forall a. a -> a
id) (m Config -> Result m
forall a b. b -> Either a b
Right (m Config -> Result m) -> m Config -> Result m
forall a b. (a -> b) -> a -> b
$ Config -> m Config
forall (m :: * -> *) a. Monad m => a -> m a
return Config
config) [Result m -> Result m]
opts of
Left (InvalidArgument name :: String
name value :: String
value) -> String -> Either String (m Config)
forall a b. a -> Either a b
Left ("invalid argument `" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
value String -> ShowS
forall a. [a] -> [a] -> [a]
++ "' for `--" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
name String -> ShowS
forall a. [a] -> [a] -> [a]
++ "'")
Right x :: m Config
x -> m Config -> Either String (m Config)
forall a b. b -> Either a b
Right m Config
x
(_, _, err :: String
err:_) -> String -> Either String (m Config)
forall a b. a -> Either a b
Left (ShowS
forall a. [a] -> [a]
init String
err)
(_, arg :: String
arg:_, _) -> String -> Either String (m Config)
forall a b. a -> Either a b
Left ("unexpected argument `" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
arg String -> ShowS
forall a. [a] -> [a] -> [a]
++ "'")
ignoreConfigFile :: Config -> [String] -> IO Bool
ignoreConfigFile :: Config -> [String] -> IO Bool
ignoreConfigFile config :: Config
config args :: [String]
args = do
Maybe String
ignore <- String -> IO (Maybe String)
lookupEnv "IGNORE_DOT_HSPEC"
case Maybe String
ignore of
Just _ -> Bool -> IO Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True
Nothing -> case [OptDescr (Result Maybe -> Result Maybe)]
-> Config -> [String] -> Either String (Maybe Config)
forall (m :: * -> *).
Monad m =>
[OptDescr (Result m -> Result m)]
-> Config -> [String] -> Either String (m Config)
parse [OptDescr (Result Maybe -> Result Maybe)]
recognizedOptions Config
config [String]
args of
Right (Just c :: Config
c) -> Bool -> IO Bool
forall (m :: * -> *) a. Monad m => a -> m a
return (Config -> Bool
configIgnoreConfigFile Config
c)
_ -> Bool -> IO Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False