cabal-doctest
A Setup.hs helper for doctests running
https://github.com/phadej/cabal-doctest
| Version on this page: | 1.0.3 |
| LTS Haskell 24.17: | 1.0.11 |
| Stackage Nightly 2025-10-26: | 1.0.11 |
| Latest on Hackage: | 1.0.11 |
cabal-doctest-1.0.3@sha256:587fcae1ee9948b270f603bbcd660a964256e9a5c30eea34758830716120c57a,1357Module documentation for 1.0.3
- Distribution
- Distribution.Extra
cabal-doctest
A Setup.hs helper for running doctests.
Example Usage
See [https://github.com/phadej/cabal-doctest/tree/master/example] for an
example package. (Note that the example requires Cabal-1.24 or later, but
you can relax this bound safely, although running doctests won’t be supported
on versions of Cabal older than 1.24.)
To use this library in your Setup.hs, you should specify a custom-setup
section in your .cabal file. For example:
custom-setup
setup-depends:
base >= 4 && <5,
Cabal,
cabal-doctest >= 1 && <1.1
/Note:/ Cabal dependency is needed because of
Cabal/GH-4288 bug.
You’ll also need to specify build-type: Custom at the top of the .cabal
file. Now put this into your Setup.hs file:
module Main where
import Distribution.Extra.Doctest (defaultMainWithDoctests)
main :: IO ()
main = defaultMainWithDoctests "doctests"
When you build your project, this Setup will generate a Build_doctests
module. To use it in a testsuite, simply do this:
module Main where
import Build_doctests (flags, pkgs, module_sources)
import Data.Foldable (traverse_)
import Test.DocTest (doctest)
main :: IO ()
main = do
traverse_ putStrLn args -- optionally print arguments
doctest args
where
args = flags ++ pkgs ++ module_sources
Additional configuration
The cabal-doctest based Setup.hs supports few extensions fields
in pkg.cabal files to customise the doctest runner behaviour, without
customising the default doctest.hs.
test-suite doctests:
if impl(ghc >= 8.0)
x-doctest-options: -fdiagnostics-color=never
x-doctest-source-dirs: test
x-doctest-modules: Servant.Utils.LinksSpec
...
x-doctest-optionsAdditional arguments passed intodoctestcommand.x-doctest-modulesAdditional modules todoctest. May be useful if you havedoctestin test or executables (i.e not default library complonent).x-doctest-src-dirsAdditional source directories to look for the modules.
Notes
-
Recent versions of
Cabal(for instance, 2.0) can choose to build a package’sdoctesttest suite before the library. However, in order forcabal-doctestto work correctly, the library must be built first, asdoctestrelies on the presence of generated files that are only created when the library is built. See #19.A hacky workaround for this problem is to depend on the library itself in a
docteststest suite. See the example’s .cabal file for a demonstration. (This assumes that the test suite has the ability to read build artifacts from the library, a separate build component. In practice, this assumption holds, which is why this library works at all.) -
custom-setupsection is supported starting fromcabal-install-1.24. For oldercabal-install'syou have to install custom setup dependencies manually. -
stackrespectscustom-setupstarting from version 1.3.3. Before that you have to useexplicit-setup-depssetting in yourstack.yaml. (stack/GH-2094) -
There is an issue in the Cabal issue tracker about adding
cabal doctestcommand. After that command is implemented, this library will be deprecated. -
You can use
x-doctest-optionsfield intest-suite docteststo pass additional flags to thedoctest. -
For
build-type: Configurepackages, you can usedefaultMainAutoconfWithDoctestsfunction to make customSetup.hsscript. -
If you use the default
.inhs-source-dirs, then runningdoctestsmight fail with weird errors (ambigious module errors). Workaround is to move sources undersrc/or some non-top-level directory. -
extensions:field isn’t supported. Upgrade your.cabalfile to use at leastcabal-version: >= 1.10and usedefault-extensionsorother-extensions. -
If you use QuickCheck properties (
prop>) in your doctests, thetest-suite doctestshould depend onQuickCheckandtemplate-haskell. This is a little HACK: These dependencies aren’t needed to build thedocteststest-suite executable. However, as we letCabalresolve dependencies, we can pass the resolved (and installed!) package identifiers to to thedoctestcommand. This way,QuickCheckandtemplate-haskellare available todoctest, otherwise you’ll get errors like:
Variable not in scope:
mkName
:: [Char]
-> template-haskell-2.11.1.0:Language.Haskell.TH.Syntax.Name
or
Variable not in scope:
polyQuickCheck
:: Language.Haskell.TH.Syntax.Name -> Language.Haskell.TH.Lib.ExpQ
Copyright
Copyright 2017 Oleg Grenrus.
Available under the BSD 3-clause license.
Changes
1.0.3 – 2017-11-02
- Add an explicit
Preludeimport toBuild_doctests
1.0.2 – 2017-05-16
-
Add
defaultMainAutoconfWithDoctestsandaddDoctestsUserHook. -
Add support for
.hscand other preprocessed files (#8) -
Add support for
x-doctest-source-dirsandx-doctest-modules.
1.0.1 – 2017-05-05
-
Add support for
x-doctest-optionscabal-file field -
Proper support for GHC-8.2.1 & Cabal-2.0.0.0
-
Add support to
default-extensionsin library.
1 – 2017-01-31
- First version. Released on an unsuspecting world.