Skip to content

Commit d868ed0

Browse files
authored
Merge pull request #527 from well-typed/docspec
Use cabal-docspec
2 parents 2752672 + 9d8cf93 commit d868ed0

File tree

30 files changed

+134
-101
lines changed

30 files changed

+134
-101
lines changed

.github/workflows/haskell-ci.yml

Lines changed: 13 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@
88
#
99
# For more information, see https://github.com/haskell-CI/haskell-ci
1010
#
11-
# version: 0.19.20250710
11+
# version: 0.19.20250722
1212
#
13-
# REGENDATA ("0.19.20250710",["github","--config=cabal.haskell-ci","cabal.project"])
13+
# REGENDATA ("0.19.20250722",["github","--config=cabal.haskell-ci","cabal.project"])
1414
#
1515
name: Haskell-CI
1616
on:
@@ -172,11 +172,6 @@ jobs:
172172
- name: update cabal index
173173
run: |
174174
$CABAL v2-update -v
175-
- name: cache (tools)
176-
uses: actions/cache/restore@v4
177-
with:
178-
key: ${{ runner.os }}-${{ matrix.compiler }}-tools-55831830
179-
path: ~/.haskell-ci-tools
180175
- name: install cabal-plan
181176
run: |
182177
mkdir -p $HOME/.cabal/bin
@@ -186,16 +181,15 @@ jobs:
186181
rm -f cabal-plan.xz
187182
chmod a+x $HOME/.cabal/bin/cabal-plan
188183
cabal-plan --version
189-
- name: install doctest
184+
- name: install cabal-docspec
190185
run: |
191-
if [ $((! GHCJSARITH && HCNUMVER < 90400)) -ne 0 ] ; then $CABAL --store-dir=$HOME/.haskell-ci-tools/store v2-install $ARG_COMPILER --ignore-project -j2 doctest --constraint='doctest ^>=0.22.0' ; fi
192-
if [ $((! GHCJSARITH && HCNUMVER < 90400)) -ne 0 ] ; then doctest --version ; fi
193-
- name: save cache (tools)
194-
if: always()
195-
uses: actions/cache/save@v4
196-
with:
197-
key: ${{ runner.os }}-${{ matrix.compiler }}-tools-55831830
198-
path: ~/.haskell-ci-tools
186+
mkdir -p $HOME/.cabal/bin
187+
curl -sL https://github.com/phadej/cabal-extras/releases/download/cabal-docspec-0.0.0.20250606/cabal-docspec-0.0.0.20250606-x86_64-linux.xz > cabal-docspec.xz
188+
echo 'cc20bb5c19501b42bde77556bc419c7c0a5c8d1eb65663024d8a4e4c868bef25 cabal-docspec.xz' | sha256sum -c -
189+
xz -d < cabal-docspec.xz > $HOME/.cabal/bin/cabal-docspec
190+
rm -f cabal-docspec.xz
191+
chmod a+x $HOME/.cabal/bin/cabal-docspec
192+
cabal-docspec --version
199193
- name: checkout
200194
uses: actions/checkout@v4
201195
with:
@@ -335,24 +329,10 @@ jobs:
335329
- name: tests
336330
run: |
337331
if [ $((! GHCJSARITH)) -ne 0 ] ; then $CABAL v2-test $ARG_COMPILER $ARG_TESTS $ARG_BENCH all --test-show-details=direct ; fi
338-
- name: doctest
332+
- name: docspec
339333
run: |
340-
if [ $((! GHCJSARITH && HCNUMVER < 90400)) -ne 0 ] ; then cd ${PKGDIR_optics} || false ; fi
341-
if [ $((! GHCJSARITH && HCNUMVER < 90400)) -ne 0 ] ; then doctest -XHaskell2010 -XBangPatterns -XConstraintKinds -XDefaultSignatures -XDeriveFoldable -XDeriveFunctor -XDeriveGeneric -XDeriveTraversable -XEmptyCase -XFlexibleContexts -XFlexibleInstances -XFunctionalDependencies -XGADTs -XGeneralizedNewtypeDeriving -XInstanceSigs -XKindSignatures -XLambdaCase -XOverloadedLabels -XPatternSynonyms -XRankNTypes -XScopedTypeVariables -XTupleSections -XTypeApplications -XTypeFamilies -XTypeOperators -XViewPatterns src ; fi
342-
if [ $((! GHCJSARITH && HCNUMVER < 90400)) -ne 0 ] ; then cd ${PKGDIR_optics_core} || false ; fi
343-
if [ $((! GHCJSARITH && HCNUMVER < 90400)) -ne 0 ] ; then doctest -XHaskell2010 -XBangPatterns -XConstraintKinds -XDefaultSignatures -XDeriveFoldable -XDeriveFunctor -XDeriveGeneric -XDeriveTraversable -XEmptyCase -XFlexibleContexts -XFlexibleInstances -XFunctionalDependencies -XGADTs -XGeneralizedNewtypeDeriving -XInstanceSigs -XKindSignatures -XLambdaCase -XOverloadedLabels -XPatternSynonyms -XRankNTypes -XScopedTypeVariables -XTupleSections -XTypeApplications -XTypeFamilies -XTypeOperators -XViewPatterns src ; fi
344-
if [ $((! GHCJSARITH && HCNUMVER < 90400)) -ne 0 ] ; then cd ${PKGDIR_optics_extra} || false ; fi
345-
if [ $((! GHCJSARITH && HCNUMVER < 90400)) -ne 0 ] ; then doctest -XHaskell2010 -XBangPatterns -XConstraintKinds -XDefaultSignatures -XDeriveFoldable -XDeriveFunctor -XDeriveGeneric -XDeriveTraversable -XEmptyCase -XFlexibleContexts -XFlexibleInstances -XFunctionalDependencies -XGADTs -XGeneralizedNewtypeDeriving -XInstanceSigs -XKindSignatures -XLambdaCase -XOverloadedLabels -XPatternSynonyms -XRankNTypes -XScopedTypeVariables -XTupleSections -XTypeApplications -XTypeFamilies -XTypeOperators -XViewPatterns src ; fi
346-
if [ $((! GHCJSARITH && HCNUMVER < 90400)) -ne 0 ] ; then cd ${PKGDIR_optics_sop} || false ; fi
347-
if [ $((! GHCJSARITH && HCNUMVER < 90400)) -ne 0 ] ; then doctest -XHaskell2010 -XBangPatterns -XConstraintKinds -XDefaultSignatures -XDeriveFoldable -XDeriveFunctor -XDeriveGeneric -XDeriveTraversable -XEmptyCase -XFlexibleContexts -XFlexibleInstances -XFunctionalDependencies -XGADTs -XGeneralizedNewtypeDeriving -XInstanceSigs -XKindSignatures -XLambdaCase -XOverloadedLabels -XPatternSynonyms -XRankNTypes -XScopedTypeVariables -XTupleSections -XTypeApplications -XTypeFamilies -XTypeOperators -XViewPatterns src ; fi
348-
if [ $((! GHCJSARITH && HCNUMVER < 90400)) -ne 0 ] ; then cd ${PKGDIR_optics_th} || false ; fi
349-
if [ $((! GHCJSARITH && HCNUMVER < 90400)) -ne 0 ] ; then doctest -XHaskell2010 -XBangPatterns -XConstraintKinds -XDefaultSignatures -XDeriveFoldable -XDeriveFunctor -XDeriveGeneric -XDeriveTraversable -XEmptyCase -XFlexibleContexts -XFlexibleInstances -XFunctionalDependencies -XGADTs -XGeneralizedNewtypeDeriving -XInstanceSigs -XKindSignatures -XLambdaCase -XOverloadedLabels -XPatternSynonyms -XRankNTypes -XScopedTypeVariables -XTupleSections -XTypeApplications -XTypeFamilies -XTypeOperators -XViewPatterns src ; fi
350-
if [ $((! GHCJSARITH && HCNUMVER < 90400)) -ne 0 ] ; then cd ${PKGDIR_optics_vl} || false ; fi
351-
if [ $((! GHCJSARITH && HCNUMVER < 90400)) -ne 0 ] ; then doctest -XHaskell2010 -XBangPatterns -XConstraintKinds -XDefaultSignatures -XDeriveFoldable -XDeriveFunctor -XDeriveGeneric -XDeriveTraversable -XEmptyCase -XFlexibleContexts -XFlexibleInstances -XFunctionalDependencies -XGADTs -XGeneralizedNewtypeDeriving -XInstanceSigs -XKindSignatures -XLambdaCase -XOverloadedLabels -XPatternSynonyms -XRankNTypes -XScopedTypeVariables -XTupleSections -XTypeApplications -XTypeFamilies -XTypeOperators -XViewPatterns src ; fi
352-
if [ $((! GHCJSARITH && HCNUMVER < 90400)) -ne 0 ] ; then cd ${PKGDIR_indexed_profunctors} || false ; fi
353-
if [ $((! GHCJSARITH && HCNUMVER < 90400)) -ne 0 ] ; then doctest -XHaskell2010 -XBangPatterns -XConstraintKinds -XDefaultSignatures -XDeriveFoldable -XDeriveFunctor -XDeriveGeneric -XDeriveTraversable -XEmptyCase -XFlexibleContexts -XFlexibleInstances -XFunctionalDependencies -XGADTs -XGeneralizedNewtypeDeriving -XInstanceSigs -XKindSignatures -XLambdaCase -XOverloadedLabels -XPatternSynonyms -XRankNTypes -XScopedTypeVariables -XTupleSections -XTypeApplications -XTypeFamilies -XTypeOperators -XViewPatterns src ; fi
354-
if [ $((! GHCJSARITH && HCNUMVER < 90400)) -ne 0 ] ; then cd ${PKGDIR_template_haskell_optics} || false ; fi
355-
if [ $((! GHCJSARITH && HCNUMVER < 90400)) -ne 0 ] ; then doctest -XHaskell2010 src ; fi
334+
if [ $((! GHCJSARITH && (HCNUMVER < 90400 || HCNUMVER >= 90800))) -ne 0 ] ; then $CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH all ; fi
335+
if [ $((! GHCJSARITH && (HCNUMVER < 90400 || HCNUMVER >= 90800))) -ne 0 ] ; then cabal-docspec $ARG_COMPILER ; fi
356336
- name: cabal check
357337
run: |
358338
cd ${PKGDIR_optics} || false

cabal.haskell-ci

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
distribution: focal
22
branches: master
3-
doctest: <9.3
3+
-- GHC-9.4 and 9.6 have some issue with overlapping instances for optic labels
4+
docspec: <9.4 || >=9.8
45
tests: True
56
benchmarks: <9.5
67
jobs-selection: any
78

89
-- turn head hackage off
9-
head-hackage: <0
10+
head-hackage: False

optics-core/optics-core.cabal

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,3 +156,5 @@ library
156156
Optics.Internal.Setter
157157
Optics.Internal.Traversal
158158
Optics.Internal.Utils
159+
160+
x-docspec-options: -XTypeApplications -XTypeOperators -XFlexibleContexts -XStandaloneDeriving -XDeriveGeneric -XDataKinds -XOverloadedLabels -XTupleSections

optics-core/src/Data/IntMap/Optics.hs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,11 @@ import Optics.IxAffineTraversal
5050
import Optics.IxFold
5151
import Optics.Optic
5252

53+
-- $setup
54+
-- >>> import qualified Data.IntMap as IntMap
55+
-- >>> import Data.Monoid (Sum (..))
56+
-- >>> import Optics.Core
57+
5358
-- | Construct a map from an 'IxFold'.
5459
--
5560
-- The construction is left-biased (see 'IntMap.union'), i.e. the first occurrences of
@@ -132,7 +137,3 @@ ge k = iatraversalVL $ \point f s ->
132137
Nothing -> point s
133138
Just (k', v) -> f k' v <&> \v' -> IntMap.insert k' v' s
134139
{-# INLINE ge #-}
135-
136-
-- $setup
137-
-- >>> import Data.Monoid
138-
-- >>> import Optics.Core

optics-core/src/Data/IntSet/Optics.hs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ import Optics.Fold
1717
import Optics.Optic
1818
import Optics.Setter
1919

20+
-- $setup
21+
-- >>> import qualified Data.IntSet as IntSet
22+
-- >>> import Optics.Core
23+
2024
-- | IntSet isn't Foldable, but this 'Fold' can be used to access the members of
2125
-- an 'IntSet'.
2226
--
@@ -49,6 +53,3 @@ setmapped = sets IntSet.map
4953
setOf :: Is k A_Fold => Optic' k is s Int -> s -> IntSet
5054
setOf l = foldMapOf l IntSet.singleton
5155
{-# INLINE setOf #-}
52-
53-
-- $setup
54-
-- >>> import Optics.Core

optics-core/src/Data/Map/Optics.hs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@ import Optics.IxAffineTraversal
5757
import Optics.IxFold
5858
import Optics.Optic
5959

60+
-- $setup
61+
-- >>> import qualified Data.Map as Map
62+
-- >>> import Data.Monoid (Sum (..))
63+
-- >>> import Optics.Core
64+
6065
-- | Construct a map from an 'IxFold'.
6166
--
6267
-- The construction is left-biased (see 'Map.union'), i.e. the first
@@ -139,7 +144,3 @@ ge k = iatraversalVL $ \point f s ->
139144
Nothing -> point s
140145
Just (k', v) -> f k' v <&> \v' -> Map.insert k' v' s
141146
{-# INLINE ge #-}
142-
143-
-- $setup
144-
-- >>> import Data.Monoid
145-
-- >>> import Optics.Core

optics-core/src/Data/Sequence/Optics.hs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ import Optics.IxTraversal
2020
import Optics.Optic
2121
import Optics.Traversal
2222

23+
-- $setup
24+
-- >>> import Data.Sequence (ViewL (..), ViewR (..))
25+
-- >>> import qualified Data.Sequence as Seq
26+
-- >>> import Optics.Core
27+
2328
-- * Sequence isomorphisms
2429

2530
-- | A 'Seq' is isomorphic to a 'ViewL'
@@ -136,6 +141,3 @@ sliced i j = conjoined noix ix
136141
seqOf :: Is k A_Fold => Optic' k is s a -> s -> Seq a
137142
seqOf l = foldMapOf l Seq.singleton
138143
{-# INLINE seqOf #-}
139-
140-
-- $setup
141-
-- >>> import Optics.Core

optics-core/src/Data/Set/Optics.hs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ import Optics.Fold
1616
import Optics.Optic
1717
import Optics.Setter
1818

19+
-- $setup
20+
-- >>> import qualified Data.Set as Set
21+
-- >>> import Optics.Core
22+
1923
-- | This 'Setter' can be used to change the type of a 'Set' by mapping the
2024
-- elements to new values.
2125
--
@@ -39,6 +43,3 @@ setmapped = sets Set.map
3943
setOf :: (Is k A_Fold, Ord a) => Optic' k is s a -> s -> Set a
4044
setOf l = foldMapOf l Set.singleton
4145
{-# INLINE setOf #-}
42-
43-
-- $setup
44-
-- >>> import Optics.Core

optics-core/src/Data/Tree/Optics.hs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ import Data.Tree (Tree (..))
1313

1414
import Optics.Lens
1515

16+
-- $setup
17+
-- >>> import Data.Tree (Tree (..))
18+
-- >>> import Optics.Core
19+
1620
-- | A 'Lens' that focuses on the root of a 'Tree'.
1721
--
1822
-- >>> view root $ Node 42 []
@@ -27,6 +31,3 @@ root = lensVL $ \f (Node a as) -> (`Node` as) <$> f a
2731
branches :: Lens' (Tree a) [Tree a]
2832
branches = lensVL $ \f (Node a as) -> Node a <$> f as
2933
{-# INLINE branches #-}
30-
31-
-- $setup
32-
-- >>> import Optics.Core

optics-core/src/Optics/AffineFold.hs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@ import Data.Profunctor.Indexed
6060
import Optics.Internal.Bi
6161
import Optics.Internal.Optic
6262

63+
-- $setup
64+
-- >>> import Data.Maybe (listToMaybe)
65+
-- >>> import Optics.Core
66+
6367
-- | Type synonym for an affine fold.
6468
type AffineFold s a = Optic' An_AffineFold NoIx s a
6569

@@ -152,6 +156,3 @@ infixl 3 `afailing` -- Same as (<|>)
152156
isn't :: Is k An_AffineFold => Optic' k is s a -> s -> Bool
153157
isn't k s = isNothing (preview k s)
154158
{-# INLINE isn't #-}
155-
156-
-- $setup
157-
-- >>> import Optics.Core

0 commit comments

Comments
 (0)