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 @@
@@ -1,2 +1,42 @@
|
||||
import Distribution.Simple |
||||
main = defaultMain |
||||
-- pilfered from lens package |
||||
{-# 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 @@
@@ -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