doctest-parallel 0.3.0.1 → 0.3.1
raw patch · 7 files changed
+99/−17 lines, 7 filesdep ~ghcPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: ghc
API changes (from Hackage documentation)
- Test.DocTest.Internal.Nix: fullCompilerVersion :: Version
+ Test.DocTest.Internal.Options: [cfgGhcArgs] :: Config -> [String]
+ Test.DocTest.Internal.Options: parseGhcArg :: String -> Maybe String
- Test.DocTest.Helpers: compatPrettyShow :: FilePath -> FilePath
+ Test.DocTest.Helpers: compatPrettyShow :: SymbolicPath PackageDir SourceDir -> FilePath
- Test.DocTest.Internal.Options: Config :: LogLevel -> [ModuleName] -> Maybe Int -> ModuleConfig -> Bool -> Config
+ Test.DocTest.Internal.Options: Config :: LogLevel -> [ModuleName] -> Maybe Int -> ModuleConfig -> Bool -> [String] -> Config
Files
- CHANGES.markdown +5/−0
- README.markdown +36/−0
- doctest-parallel.cabal +15/−13
- src/Test/DocTest.hs +3/−3
- src/Test/DocTest/Internal/Options.hs +24/−1
- test/MainSpec.hs +4/−0
- test/integration/GhcArg/Fib.hs +12/−0
CHANGES.markdown view
@@ -1,3 +1,8 @@+# 0.3.1+ * Add support for GHC 9.8+ * Drop support for GHC 8.2+ * Add `--ghc-arg` as a command line argument, allowing users to pass additional arguments to GHC used to parse Haddock.+ # 0.3.0.1 * Add support for GHC 9.6
README.markdown view
@@ -34,6 +34,42 @@ `doctest-parallel` will fail on comments that `haddock` also doesn't like. Sometimes (e.g., [#251](https://github.com/sol/doctest/issues/251)), this means that `doctest-parallel` will fail on input that GHC accepts. +## Command line+```+Usage:+ doctest [ options ]... [<module>]...+ doctest --help+ doctest --version+ doctest --info++Options:+ -jN number of threads to use+ --log-level=LEVEL one of: debug, verbose, info, warning, error. Default: info.+ --ghc-arg=ARG pass argument to GHC when parsing, pass multiple times for multiple flags+† --implicit-module-import import module before testing it (default)+† --randomize-order randomize order in which tests are run+† --seed=N use a specific seed to randomize test order+† --preserve-it preserve the `it` variable between examples+ --nix account for Nix build environments (default)+ --quiet set log level to `Error`, shorthand for `--log-level=error`+ --verbose set log level to `Verbose`, shorthand for `--log-level=verbose`+ --debug set log level to `Debug`, shorthand for `--log-level=debug`+ --help display this help and exit+ --version output version information and exit+ --info output machine-readable version information and exit++Supported inverted options:+ --no-nix+† --no-implicit-module-import+† --no-randomize-order (default)+† --no-preserve-it (default)++Options marked with a dagger (†) can also be used to set module level options, using+an ANN pragma like this:++ {-# ANN module "doctest-parallel: --no-randomize-order" #-}+```+ ## Example groups Examples from a single Haddock comment are grouped together and share the same
doctest-parallel.cabal view
@@ -1,7 +1,7 @@ cabal-version: 2.0 name: doctest-parallel-version: 0.3.0.1+version: 0.3.1 synopsis: Test interactive Haskell examples description: The doctest program checks examples in source code comments. It is modeled after doctest for Python (<https://docs.python.org/3/library/doctest.html>).@@ -17,15 +17,16 @@ maintainer: Martijn Bastiaan <martijn@hmbastiaan.nl> build-type: Simple tested-with:- GHC == 8.2.2- , GHC == 8.4.4+ GHC == 8.4.4 , GHC == 8.6.5 , GHC == 8.8.4 , GHC == 8.10.7 , GHC == 9.0.2- , GHC == 9.2.5- , GHC == 9.4.3- , GHC == 9.6.1+ , GHC == 9.2.8+ , GHC == 9.4.7+ , GHC == 9.6.3+ , GHC == 9.8.1+ extra-source-files: example/example.cabal example/src/Example.hs@@ -91,7 +92,7 @@ Data.List.Extra Paths_doctest_parallel build-depends:- Cabal >= 2.4 && < 3.10+ Cabal >= 2.4 && < 3.11 , Glob , base >=4.10 && <5 , base-compat >=0.7.0@@ -101,7 +102,7 @@ , directory , exceptions , filepath- , ghc >=8.2 && <9.7+ , ghc >=8.2 && <9.9 , ghc-paths >=0.1.0.9 , process , random >= 1.2@@ -140,6 +141,7 @@ DosLineEndings.Fib Failing.Foo FailingMultiple.Foo+ GhcArg.Fib It.Foo It.Setup LocalStderrBinding.A@@ -196,9 +198,9 @@ build-depends: HUnit , QuickCheck >=2.13.1- , base >=4.5 && <5- , base-compat >=0.7.0- , code-page >=0.1+ , base+ , base-compat+ , code-page , containers , doctest-parallel , deepseq@@ -206,7 +208,7 @@ , exceptions , filepath , ghc- , ghc-paths >=0.1.0.9+ , ghc-paths , hspec >=2.3.0 , hspec-core >=2.3.0 , mockery@@ -215,6 +217,6 @@ , silently >=1.2.4 , stringbuilder >=0.4 , spectests-modules- , syb >=0.3+ , syb , transformers default-language: Haskell2010
src/Test/DocTest.hs view
@@ -139,7 +139,7 @@ implicitPrelude = DisableExtension ImplicitPrelude `notElem` libDefaultExtensions lib (includeArgs, moduleArgs, otherGhciArgs) = libraryToGhciArgs lib evalGhciArgs = otherGhciArgs ++ ["-XNoImplicitPrelude"] ++ nixGhciArgs- parseGhciArgs = includeArgs ++ moduleArgs ++ otherGhciArgs ++ nixGhciArgs+ parseGhcArgs = includeArgs ++ moduleArgs ++ otherGhciArgs ++ nixGhciArgs ++ cfgGhcArgs let ?verbosity = cfgLogLevel@@ -148,8 +148,8 @@ -- Get examples from Haddock comments Logging.log Verbose "Parsing comments.."- Logging.log Debug ("Calling GHC API with: " <> unwords parseGhciArgs)- allModules <- getDocTests parseGhciArgs+ Logging.log Debug ("Calling GHC API with: " <> unwords parseGhcArgs)+ allModules <- getDocTests parseGhcArgs -- Run tests Logging.log Verbose "Running examples.."
src/Test/DocTest/Internal/Options.hs view
@@ -2,6 +2,7 @@ {-# LANGUAGE DeriveAnyClass #-} {-# LANGUAGE DeriveFunctor #-} {-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE RecordWildCards #-} module Test.DocTest.Internal.Options where @@ -38,6 +39,7 @@ , "Options:" , " -jN number of threads to use" , " --log-level=LEVEL one of: debug, verbose, info, warning, error. Default: info."+ , " --ghc-arg=ARG pass argument to GHC when parsing, pass multiple times for multiple flags" , "† --implicit-module-import import module before testing it (default)" , "† --randomize-order randomize order in which tests are run" , "† --seed=N use a specific seed to randomize test order"@@ -105,6 +107,8 @@ , cfgNix :: Bool -- ^ Detect Nix build environment and try to make GHC aware of the local package -- being tested.+ , cfgGhcArgs :: [String]+ -- ^ Extra arguments passed to GHC when parsing } deriving (Show, Eq, Generic, NFData) data ModuleConfig = ModuleConfig@@ -136,6 +140,7 @@ , cfgLogLevel = Info , cfgModuleConfig = defaultModuleConfig , cfgNix = True+ , cfgGhcArgs = [] } parseLocatedModuleOptions ::@@ -164,7 +169,7 @@ _ -> Nothing parseOptions :: [String] -> Result Config-parseOptions = go defaultConfig+parseOptions = fmap revGhcArgs . go defaultConfig where go config [] = Result config go config (arg:args) =@@ -179,12 +184,30 @@ "--no-nix" -> go config{cfgNix=False} args ('-':_) | Just n <- parseThreads arg -> go config{cfgThreads=Just n} args ('-':_) | Just l <- parseLogLevel arg -> go config{cfgLogLevel=l} args+ ('-':_) | Just a <- parseGhcArg arg -> go (addGhcArg a config) args ('-':_) -- Module specific configuration options | Just modCfg <- parseModuleOption (cfgModuleConfig config) arg -> go config{cfgModuleConfig=modCfg} args ('-':_) -> ResultStderr ("Unknown command line argument: " <> arg) mod_ -> go config{cfgModules=mod_ : cfgModules config} args++ addGhcArg :: String -> Config -> Config+ addGhcArg arg Config{..} = Config{cfgGhcArgs=arg:cfgGhcArgs, ..}++ revGhcArgs :: Config -> Config+ revGhcArgs Config{..} = Config{cfgGhcArgs=reverse cfgGhcArgs, ..}++-- | Parse ghc-arg argument+--+-- >>> parseGhcArg "--ghc-arg=foobar"+-- Just "foobar"++-- >>> parseGhcArg "--ghc-arg=-DFOO=3"+-- Just "-DFOO=3"+--+parseGhcArg :: String -> Maybe String+parseGhcArg arg = parseSpecificFlag arg "ghc-arg" -- | Parse seed argument --
test/MainSpec.hs view
@@ -74,6 +74,10 @@ doctest ["FailingMultiple.Foo"] (cases 4) {sTried = 2, sFailures = 1} + it "use -DFIB=fib to set CPP flag" $+ doctestWithOpts defaultConfig{cfgGhcArgs=["-DFIB=fib"]} ["GhcArg.Fib"]+ (cases 1)+ it "testImport" $ do doctest ["TestImport.ModuleA"] (cases 2)
+ test/integration/GhcArg/Fib.hs view
@@ -0,0 +1,12 @@+{-# LANGUAGE CPP #-}++module GhcArg.Fib where++-- | Calculate Fibonacci numbers.+--+-- >>> FIB 10+-- 55+fib :: Integer -> Integer+fib 0 = 0+fib 1 = 1+fib n = fib (n - 1) + fib (n - 2)