mirror of
https://github.com/simonmichael/hledger.git
synced 2024-11-10 05:39:31 +03:00
69 lines
2.0 KiB
Haskell
69 lines
2.0 KiB
Haskell
{-
|
|
Run doctests in Hledger source files under the current directory
|
|
(./Hledger.hs, ./Hledger/**, ./Text/**) using the doctest runner.
|
|
|
|
https://github.com/sol/doctest#readme
|
|
|
|
Arguments are case-insensitive file path substrings, to limit the files searched.
|
|
--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).
|
|
|
|
Eg, in hledger source dir:
|
|
|
|
$ make ghci-doctest, :main [--verbose] [--slow] [CIFILEPATHSUBSTRINGS]
|
|
|
|
or:
|
|
|
|
$ stack test hledger-lib:test:doctest --test-arguments="--verbose --slow [CIFILEPATHSUBSTRINGS]"
|
|
|
|
-}
|
|
-- This file can't be called doctest.hs ("File name does not match module name")
|
|
|
|
|
|
{-# LANGUAGE PackageImports #-}
|
|
|
|
import Control.Monad
|
|
import Data.Char
|
|
import Data.List
|
|
import System.Environment
|
|
import "Glob" System.FilePath.Glob
|
|
import Test.DocTest
|
|
|
|
main :: IO ()
|
|
main = do
|
|
args <- getArgs
|
|
let
|
|
verbose = "--verbose" `elem` args
|
|
slow = "--slow" `elem` args
|
|
pats = filter (not . ("-" `isPrefixOf`)) args
|
|
|
|
-- find source files
|
|
sourcefiles <- (filter (not . isInfixOf "/.") . concat) <$> sequence [
|
|
glob "Hledger.hs"
|
|
,glob "Hledger/**/*.hs"
|
|
,glob "Text/**/*.hs"
|
|
]
|
|
|
|
-- 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 $
|
|
(if verbose then ("--verbose" :) else id) $ -- doctest >= 0.15.0
|
|
(if slow then id else ("--fast" :)) $ -- doctest >= 0.11.4
|
|
fs
|