lib: doctests: file pattern arguments, more informative output
Limiting to just the file(s) you're interested can make doctest start much quicker. With a big caveat: you can limit the starting files, but it will also test all other local files those import.
This commit is contained in:
		
							parent
							
								
									df430e5eb0
								
							
						
					
					
						commit
						46d6971da7
					
				| @ -1,5 +1,20 @@ | ||||
| {-  | ||||
| Runs hledger doctests. | ||||
| Usage examples: in hledger source dir,  | ||||
| make ghci-doctest, :main [--verbose] [--slow] [CIFILEPATHSUBSTRINGS] | ||||
| or: | ||||
| stack test hledger-lib:test:doctests [--test-arguments '[--verbose] [--slow] [CIFILEPATHSUBSTRINGS]'] | ||||
| 
 | ||||
| Arguments are case-insensitive file path substrings. | ||||
| --verbose shows files being searched for doctests and progress while running. | ||||
| --slow reloads ghci between each test (https://github.com/sol/doctest#a-note-on-performance). | ||||
| 
 | ||||
| -} | ||||
| 
 | ||||
| {-# LANGUAGE PackageImports #-} | ||||
| 
 | ||||
| import Control.Monad | ||||
| import Data.Char | ||||
| import Data.List | ||||
| import System.Environment | ||||
| import "Glob" System.FilePath.Glob | ||||
| @ -7,14 +22,35 @@ import Test.DocTest | ||||
| 
 | ||||
| main = do | ||||
|   args <- getArgs | ||||
|   fs1 <- glob "Hledger/**/*.hs" | ||||
|   fs2 <- glob "Text/**/*.hs" | ||||
|   --fs3 <- glob "other/ledger-parse/**/*.hs" | ||||
|   let fs = filter (not . isInfixOf "/.") $ ["Hledger.hs"] ++ fs1 ++ fs2 | ||||
|   let | ||||
|     verbose = "--verbose" `elem` args | ||||
|     slow    = "--slow" `elem` args | ||||
|     pats    = filter (not . ("-" `isPrefixOf`)) args | ||||
| 
 | ||||
|   -- find source files | ||||
|   sourcefiles1 <- glob "Hledger/**/*.hs" | ||||
|   sourcefiles2 <- glob "Text/**/*.hs" | ||||
|   let sourcefiles = filter (not . isInfixOf "/.") $ ["Hledger.hs"] ++ sourcefiles1 ++ sourcefiles2 | ||||
|    | ||||
|   -- filter by patterns (case insensitive infix substring match) | ||||
|   let  | ||||
|     fs | null pats = sourcefiles | ||||
|        | otherwise = [f | f <- sourcefiles, let f' = map toLower f, any (`isInfixOf` f') pats'] | ||||
|           where pats' = map (map toLower) pats | ||||
|     fslen = length fs | ||||
|    | ||||
|   if (null fs) | ||||
|   then do | ||||
|     putStrLn $ "No file paths found matching: " ++ unwords pats | ||||
| 
 | ||||
|   else do | ||||
|     putStrLn $  | ||||
|       "Loading and searching for doctests in "  | ||||
|       ++ show fslen  | ||||
|       ++ if fslen > 1 then " files, plus any files they import:" else " file, plus any files it imports:" | ||||
|     when verbose $ putStrLn $ unwords fs | ||||
| 
 | ||||
|     doctest $  | ||||
|     -- show verbose progress output | ||||
|     (if "--verbose" `elem` args then ("--verbose" :) else id) $  | ||||
|     -- don't reload environment per test (opposite of doctest's --fast, | ||||
|     -- https://github.com/sol/doctest#a-note-on-performance) | ||||
|     (if "--slow" `elem` args then id else ("--fast" :)) $ | ||||
|       (if verbose then ("--verbose" :) else id) $  | ||||
|       (if slow then id else ("--fast" :)) $ | ||||
|       fs | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user