doctest-parallel 0.2.5 → 0.2.6
raw patch · 7 files changed
+77/−20 lines, 7 filesdep ~randomPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: random
API changes (from Hackage documentation)
+ Test.DocTest.Internal.Options: [cfgNix] :: Config -> Bool
- Test.DocTest.Internal.Options: Config :: Bool -> [ModuleName] -> Maybe Int -> Bool -> ModuleConfig -> Config
+ Test.DocTest.Internal.Options: Config :: Bool -> [ModuleName] -> Maybe Int -> Bool -> ModuleConfig -> Bool -> Config
Files
- CHANGES.markdown +5/−0
- README.markdown +2/−2
- doctest-parallel.cabal +4/−4
- src/Test/DocTest.hs +40/−3
- src/Test/DocTest/Internal/Options.hs +8/−0
- src/Test/DocTest/Internal/Runner.hs +4/−3
- test/MainSpec.hs +14/−8
CHANGES.markdown view
@@ -1,3 +1,8 @@+# 0.2.6+ * `getNumProcessors` is now used to detect the (default) number of GHCi subprocesses to spawn. This should more reliably use all of a system's resources. Fixes [#53](https://github.com/martijnbastiaan/doctest-parallel/issues/53).+ * Add Nix support. If the environment variable `NIX_BUILD_TOP` is present an extra package database is added to `GHC_PACKAGE_PATH`. This isn't expected to break existing builds, but if it does consider passing `--no-nix`. ([#34](https://github.com/martijnbastiaan/doctest-parallel/issues/34))+ * The QuickCheck example mentioned in the README now uses `abs` instead of `sort`. This prevents confusing errors when `sort` is not imported. Fixes [#50](https://github.com/martijnbastiaan/doctest-parallel/issues/50).+ # 0.2.5 * Loosen Cabal bounds to >= 2.4 && < 3.9
README.markdown view
@@ -195,14 +195,14 @@ ```haskell -- |--- prop> \xs -> sort xs == (sort . sort) (xs :: [Int])+-- prop> \n -> abs n == abs (abs (n :: Int)) ``` The lambda abstraction is optional and can be omitted: ```haskell -- |--- prop> sort xs == (sort . sort) (xs :: [Int])+-- prop> abs n == abs (abs (n :: Int)) ``` A complete example that uses setup code is below:
doctest-parallel.cabal view
@@ -1,7 +1,7 @@ cabal-version: 2.0 name: doctest-parallel-version: 0.2.5+version: 0.2.6 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>).@@ -22,9 +22,9 @@ , GHC == 8.6.5 , GHC == 8.8.4 , GHC == 8.10.7- , GHC == 9.0.1- , GHC == 9.2.1- , GHC == 9.4.1+ , GHC == 9.0.2+ , GHC == 9.2.5+ , GHC == 9.4.3 extra-source-files: example/example.cabal example/src/Example.hs
src/Test/DocTest.hs view
@@ -1,6 +1,7 @@ {-# LANGUAGE CPP #-}-{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE LambdaCase #-} {-# LANGUAGE NamedFieldPuns #-}+{-# LANGUAGE RecordWildCards #-} {-# LANGUAGE ViewPatterns #-} module Test.DocTest@@ -22,7 +23,14 @@ import qualified Data.Set as Set import Control.Monad (unless)+import Control.Monad.Compat (when)+import Control.Monad.Extra (whenM)+import Data.List (isInfixOf)+import Data.Maybe (fromMaybe)+import System.Directory (doesDirectoryExist, makeAbsolute)+import System.Environment (lookupEnv, setEnv) import System.Exit (exitFailure)+import System.FilePath ((</>)) import System.IO import System.Random (randomIO) @@ -117,25 +125,54 @@ setSeed :: Bool -> ModuleConfig -> IO ModuleConfig setSeed quiet cfg@ModuleConfig{cfgRandomizeOrder=True, cfgSeed=Nothing} = do- -- Using an abslute number to prevent copy+paste errors+ -- Using an absolute number to prevent copy+paste errors seed <- abs <$> randomIO unless quiet $ putStrLn ("Using freshly generated seed to randomize test order: " <> show seed) pure cfg{cfgSeed=Just seed} setSeed _quiet cfg = pure cfg +-- | @GHC_PACKAGE_PATH@. Here as a variable to prevent typos.+gHC_PACKAGE_PATH :: String+gHC_PACKAGE_PATH = "GHC_PACKAGE_PATH"++-- | Add locally built package to @GHC_PACKAGE_PATH@ if a Nix environment is+-- detected.+addLocalNixPackageToGhcPath :: IO ()+addLocalNixPackageToGhcPath = do+ lookupEnv "NIX_BUILD_TOP" >>= \case+ Nothing -> pure ()+ Just _ -> do+ pkgDb <- makeAbsolute ("dist" </> "package.conf.inplace")+ ghcPackagePath <- fromMaybe "" <$> lookupEnv gHC_PACKAGE_PATH++ -- Don't add package db if it is already mentioned on path+ unless ((pkgDb ++ ":") `isInfixOf` ghcPackagePath) $+ -- Only add package db if it exists on disk+ whenM (doesDirectoryExist pkgDb) $+ setEnv gHC_PACKAGE_PATH (pkgDb ++ ":" ++ ghcPackagePath)+ -- | Run doctest for given library and config. Produce a summary of all tests. run :: Library -> Config -> IO Summary run lib Config{..} = do+ when cfgNix addLocalNixPackageToGhcPath+ let implicitPrelude = DisableExtension ImplicitPrelude `notElem` libDefaultExtensions lib (includeArgs, moduleArgs, otherGhciArgs) = libraryToGhciArgs lib evalGhciArgs = otherGhciArgs ++ ["-XNoImplicitPrelude"] + -- Nix doesn't always expose the GHC library (_specifically_ the GHC lib) even+ -- if a package lists it as a dependency. This simply always exposes it as a+ -- workaround.+ nixGhciArgs+ | cfgNix = ["-package", "ghc"]+ | otherwise = []+ modConfig <- setSeed cfgQuiet cfgModuleConfig -- get examples from Haddock comments- allModules <- getDocTests (includeArgs ++ moduleArgs ++ otherGhciArgs)+ allModules <- getDocTests (includeArgs ++ moduleArgs ++ otherGhciArgs ++ nixGhciArgs) runModules modConfig cfgThreads cfgVerbose implicitPrelude evalGhciArgs cfgQuiet (filterModules cfgModules allModules)
src/Test/DocTest/Internal/Options.hs view
@@ -39,6 +39,7 @@ , "† --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)" , " --verbose print each test as it is run" , " --quiet only print errors" , " --help display this help and exit"@@ -46,6 +47,7 @@ , " --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)"@@ -98,6 +100,9 @@ -- ^ Only print error messages, no status or progress messages (default: @False@) , cfgModuleConfig :: ModuleConfig -- ^ Options specific to modules+ , cfgNix :: Bool+ -- ^ Detect Nix build environment and try to make GHC aware of the local package+ -- being tested. } deriving (Show, Eq, Generic, NFData) data ModuleConfig = ModuleConfig@@ -129,6 +134,7 @@ , cfgThreads = Nothing , cfgQuiet = False , cfgModuleConfig = defaultModuleConfig+ , cfgNix = True } parseLocatedModuleOptions ::@@ -167,6 +173,8 @@ "--version" -> ResultStdout versionInfo "--verbose" -> go config{cfgVerbose=True} args "--quiet" -> go config{cfgQuiet=True} args+ "--nix" -> go config{cfgNix=True} args+ "--no-nix" -> go config{cfgNix=False} args ('-':_) | Just n <- parseThreads arg -> go config{cfgThreads=Just n} args ('-':_) -- Module specific configuration options
src/Test/DocTest/Internal/Runner.hs view
@@ -13,7 +13,7 @@ import Data.Function (on) import Data.List (sortBy) import Data.Maybe (fromMaybe, maybeToList)-import GHC.Conc (numCapabilities)+import GHC.Conc (getNumProcessors) import System.IO (hPutStrLn, hPutStr, stderr, hIsTerminalDevice) import System.Random (randoms, mkStdGen) import Text.Printf (printf)@@ -74,7 +74,7 @@ :: ModuleConfig -- ^ Configuration options specific to module -> Maybe Int- -- ^ Number of threads to use. Defaults to 'numCapabilities'.+ -- ^ Number of threads to use. Defaults to 'getNumProcessors'. -> Bool -- ^ Verbose -> Bool@@ -90,9 +90,10 @@ isInteractive <- hIsTerminalDevice stderr -- Start a thread pool. It sends status updates to this thread through 'output'.+ nCores <- getNumProcessors (input, output) <- makeThreadPool- (fromMaybe numCapabilities nThreads)+ (fromMaybe nCores nThreads) (runModule modConfig implicitPrelude args) -- Send instructions to threads
test/MainSpec.hs view
@@ -1,6 +1,7 @@-{-# LANGUAGE CPP #-} {-# LANGUAGE ConstraintKinds #-}+{-# LANGUAGE CPP #-} {-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE MultiWayIf #-} module MainSpec (main, spec) where @@ -37,15 +38,20 @@ spec :: Spec spec = do- env <- runIO getEnvironment+ env <- Map.fromList <$> runIO getEnvironment+ let cDescribe =- -- Don't run doctests as part of the Stack testsuite yet, pending- -- https://github.com/commercialhaskell/stack/issues/5662- if "STACK_EXE" `Map.member` Map.fromList env then- xdescribe- else- describe+ if+ -- Don't run doctests as part of the Stack testsuite yet, pending+ -- https://github.com/commercialhaskell/stack/issues/5662+ | "STACK_EXE" `Map.member` env -> xdescribe++ -- Don't run doctests as part of a Nix build. Similar to Stack, Nix+ -- doesn't seem to deal with private libraries yet.+ | "NIX_BUILD_TOP" `Map.member` env -> xdescribe++ | otherwise -> describe cDescribe "doctest" $ do it "testSimple" $