Browse Source
doctests need some build magic in order for ghci to use the right modules. The support code is taken and adapted from the lens package.master
4 changed files with 114 additions and 3 deletions
@ -1,2 +1,42 @@ |
|||||||
import Distribution.Simple |
-- pilfered from lens package |
||||||
main = defaultMain |
{-# OPTIONS_GHC -Wall #-} |
||||||
|
module Main (main) where |
||||||
|
|
||||||
|
import Data.List ( nub ) |
||||||
|
import Data.Version ( showVersion ) |
||||||
|
import Distribution.Package ( PackageName(PackageName), Package, PackageId, InstalledPackageId, packageVersion, packageName ) |
||||||
|
import Distribution.PackageDescription ( PackageDescription(), TestSuite(..) ) |
||||||
|
import Distribution.Simple ( defaultMainWithHooks, UserHooks(..), simpleUserHooks ) |
||||||
|
import Distribution.Simple.Utils ( rewriteFile, createDirectoryIfMissingVerbose, copyFiles ) |
||||||
|
import Distribution.Simple.BuildPaths ( autogenModulesDir ) |
||||||
|
import Distribution.Simple.Setup ( BuildFlags(buildVerbosity), Flag(..), fromFlag, HaddockFlags(haddockDistPref)) |
||||||
|
import Distribution.Simple.LocalBuildInfo ( withLibLBI, withTestLBI, LocalBuildInfo(), ComponentLocalBuildInfo(componentPackageDeps) ) |
||||||
|
import Distribution.Text ( display ) |
||||||
|
import Distribution.Verbosity ( Verbosity, normal ) |
||||||
|
import System.FilePath ( (</>) ) |
||||||
|
|
||||||
|
main :: IO () |
||||||
|
main = defaultMainWithHooks simpleUserHooks |
||||||
|
{ buildHook = \pkg lbi hooks flags -> do |
||||||
|
generateBuildModule (fromFlag (buildVerbosity flags)) pkg lbi |
||||||
|
buildHook simpleUserHooks pkg lbi hooks flags |
||||||
|
} |
||||||
|
|
||||||
|
generateBuildModule :: Verbosity -> PackageDescription -> LocalBuildInfo -> IO () |
||||||
|
generateBuildModule verbosity pkg lbi = do |
||||||
|
let dir = autogenModulesDir lbi |
||||||
|
createDirectoryIfMissingVerbose verbosity True dir |
||||||
|
withLibLBI pkg lbi $ \_ libcfg -> do |
||||||
|
withTestLBI pkg lbi $ \suite suitecfg -> do |
||||||
|
rewriteFile (dir </> "Build_" ++ testName suite ++ ".hs") $ unlines |
||||||
|
[ "module Build_" ++ testName suite ++ " where" |
||||||
|
, "deps :: [String]" |
||||||
|
, "deps = " ++ (show $ formatdeps (testDeps libcfg suitecfg)) |
||||||
|
] |
||||||
|
where |
||||||
|
formatdeps = map (formatone . snd) |
||||||
|
formatone p = case packageName p of |
||||||
|
PackageName n -> n ++ "-" ++ showVersion (packageVersion p) |
||||||
|
|
||||||
|
testDeps :: ComponentLocalBuildInfo -> ComponentLocalBuildInfo -> [(InstalledPackageId, PackageId)] |
||||||
|
testDeps xs ys = nub $ componentPackageDeps xs ++ componentPackageDeps ys |
||||||
|
|||||||
@ -0,0 +1,36 @@ |
|||||||
|
-- pilfered from lens package |
||||||
|
|
||||||
|
module Main(main) where |
||||||
|
|
||||||
|
import Build_doctest (deps) |
||||||
|
|
||||||
|
import Control.Applicative |
||||||
|
import Control.Monad |
||||||
|
import Data.List |
||||||
|
import System.Directory |
||||||
|
import System.FilePath |
||||||
|
import Test.DocTest |
||||||
|
|
||||||
|
main :: IO () |
||||||
|
main = doctest $ |
||||||
|
"-isource" |
||||||
|
: "-idist/build/autogen" |
||||||
|
: "-hide-all-packages" |
||||||
|
: "-XQuasiQuotes" |
||||||
|
: "-DWITH_TEMPLATE_HASKELL" |
||||||
|
: map ("-package="++) deps ++ sources |
||||||
|
|
||||||
|
sources :: [String] |
||||||
|
sources = ["source/Network/Xmpp/Types.hs"] |
||||||
|
|
||||||
|
-- getSources :: IO [FilePath] |
||||||
|
-- getSources = filter (isSuffixOf ".hs") <$> go "source" |
||||||
|
-- where |
||||||
|
-- go dir = do |
||||||
|
-- (dirs, files) <- getFilesAndDirectories dir |
||||||
|
-- (files ++) . concat <$> mapM go dirs |
||||||
|
|
||||||
|
-- getFilesAndDirectories :: FilePath -> IO ([FilePath], [FilePath]) |
||||||
|
-- getFilesAndDirectories dir = do |
||||||
|
-- c <- map (dir </>) . filter (`notElem` ["..", "."]) <$> getDirectoryContents dir |
||||||
|
-- (,) <$> filterM doesDirectoryExist c <*> filterM doesFileExist c |
||||||
Loading…
Reference in new issue