doctest-discover 0.1.0.9 → 0.2.0.0
raw patch · 4 files changed
+58/−18 lines, 4 files
Files
- config.json +3/−0
- doctest-discover.cabal +2/−1
- src/Main.hs +30/−12
- src/Runner.hs +23/−5
+ config.json view
@@ -0,0 +1,3 @@+{+ sourceFolders: ["src", "test/", "test/example"]+}
doctest-discover.cabal view
@@ -1,5 +1,5 @@ name: doctest-discover-version: 0.1.0.9+version: 0.2.0.0 synopsis: Easy way to run doctests via cabal description: doctest-discover provides an easy way to run doctests via cabal license: PublicDomain@@ -10,6 +10,7 @@ category: Testing build-type: Simple cabal-version: >=1.10+extra-source-files: config.json source-repository head type: git
src/Main.hs view
@@ -3,8 +3,8 @@ import System.Environment import Control.Applicative import Control.Monad-import Data.Maybe (fromMaybe)-import Data.List (sort)+import Data.Maybe (fromMaybe, listToMaybe)+import Data.List (sort, isPrefixOf) import Runner import Config import System.Directory@@ -12,16 +12,30 @@ main :: IO () main = do- (src : _ : dst : args) <- getArgs- let configFileContents = case args of- (configFile : _) -> readFile configFile- _ -> return ""- customConfiguration <- config <$> configFileContents- let sources = fromMaybe ["src"] $ customConfiguration >>= sourceFolders- files <- sequence $ map getAbsDirectoryContents sources- let testDriverFileContents = driver (concat files) customConfiguration+ (_ : _ : dst : args) <- getArgs+ maybeConfiguration <- readConfig (listToMaybe args)+ testDriverFileContents <- buildDriverFileContents maybeConfiguration writeFile dst testDriverFileContents +-- | Obtain configuration, given a configuration file.+--+-- >>> readConfig (Just "test/test-config.json")+-- Just (Config {ignore = ..., sourceFolders = ..., doctestOptions = ...})++readConfig :: Maybe FilePath -> IO (Maybe Config)+readConfig x = config <$> configFileContents+ where+ configFileContents :: IO String+ configFileContents = fromMaybe (return "") (readFile <$> x)++-- | Given a configuration, build a driver.++buildDriverFileContents :: Maybe Config -> IO String+buildDriverFileContents x = do+ let sources = fromMaybe ["src"] $ x >>= sourceFolders+ files <- sequence $ map getAbsDirectoryContents sources+ return $ driver (concat files) x+ -- | Recursively get absolute directory contents -- -- >>> :m +Data.List@@ -29,13 +43,17 @@ -- >>> map (stripPrefix prefix) <$> getAbsDirectoryContents "test/example" -- [Just "/test/example/Foo.hs",Just "/test/example/Foo/Bar.hs"] --+-- >>> map (stripPrefix prefix) <$> getAbsDirectoryContents "test/example-with-dotfiles"+-- [Just "/test/example-with-dotfiles/Baz.hs"]+ getAbsDirectoryContents :: FilePath -> IO [FilePath] getAbsDirectoryContents dir = do- paths <- getDirectoryContents dir- paths' <- forM (filter (`notElem` [".", ".."]) paths) $ \path -> do+ paths <- filter notDotfile <$> getDirectoryContents dir+ paths' <- forM (filter notDotfile paths) $ \path -> do canonicalized <- canonicalizePath $ dir </> path isDir <- doesDirectoryExist canonicalized if isDir then getAbsDirectoryContents canonicalized else return [canonicalized] return $ sort $ concat paths'+ where notDotfile = not . ("." `isPrefixOf`)
src/Runner.hs view
@@ -12,13 +12,31 @@ -- | Generates doctest driver ----- >>> let expected = unlines ["module Main where", "import Test.DocTest", "main :: IO ()", "main = doctest [\"-isrc\",\"foo.hs\",\"bar.hs\"]"]--- >>> let actual = driver ["foo.hs", "bar.hs", "baz.qux"] Nothing--- >>> expected == actual--- True+-- >>> putStrLn $ driver ["foo.hs", "bar.hs", "baz.qux"] Nothing+-- module Main where+-- import Test.DocTest+-- main :: IO ()+-- main = doctest+-- [ "-isrc"+-- , "foo.hs"+-- , "bar.hs"+-- ]+-- <BLANKLINE> -- driver :: [FilePath] -> Maybe Config -> String-driver files config = unlines $ ["module Main where", "import Test.DocTest", "main :: IO ()", "main = doctest " ++ (show $ generateConfig files config)]+driver files config = unlines+ [ "module Main where"+ , "import Test.DocTest"+ , "main :: IO ()"+ , "main = doctest"+ ] ++ (renderList 1 $ generateConfig files config)+ where+ renderList :: Show a => Int -> [a] -> String+ renderList indent xs =+ let (line:lines) = show <$> xs+ lines' = ("[ " ++ line) : ((", " ++) <$> lines) ++ ["]"]+ in unlines $ indentOne indent <$> lines'+ indentOne indent = (replicate (4 * indent) ' ' ++) -- | Generates doctest configuration --