git.iko.soy/servant-quickcheck
on master help sign in
Support for servant-0.13
d46b718Oleg Grenrus
.travis.yml+27−16
@@ -1,6 +1,6 @@
1# This Travis job script has been generated by a script via
1# This Travis job script has been generated by a script via
2#
2#
3−# make_travis_yml_2.hs '--branch' 'master' '-o' '.travis.yml' 'servant-quickcheck.cabal'
3+# runghc make_travis_yml_2.hs '--branch' 'master' '-o' '.travis.yml' 'servant-quickcheck.cabal'
4#
4#
5# For more information, see https://github.com/hvr/multi-ghc-travis
5# For more information, see https://github.com/hvr/multi-ghc-travis
6#
6#
@@ -28,6 +28,8 @@ before_cache:
28 - rm -fv $HOME/.cabal/packages/hackage.haskell.org/01-index.tar
28 - rm -fv $HOME/.cabal/packages/hackage.haskell.org/01-index.tar
29 - rm -fv $HOME/.cabal/packages/hackage.haskell.org/01-index.tar.idx
29 - rm -fv $HOME/.cabal/packages/hackage.haskell.org/01-index.tar.idx
30
30
31+ - rm -rfv $HOME/.cabal/packages/head.hackage
32+
31matrix:
33matrix:
32 include:
34 include:
33 - compiler: "ghc-7.10.3"
35 - compiler: "ghc-7.10.3"
@@ -36,15 +38,19 @@ matrix:
36 - compiler: "ghc-8.0.2"
38 - compiler: "ghc-8.0.2"
37 # env: TEST=--disable-tests BENCH=--disable-benchmarks
39 # env: TEST=--disable-tests BENCH=--disable-benchmarks
38 addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-8.0.2], sources: [hvr-ghc]}}
40 addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-8.0.2], sources: [hvr-ghc]}}
39− - compiler: "ghc-8.2.1"
41+ - compiler: "ghc-8.2.2"
40 # env: TEST=--disable-tests BENCH=--disable-benchmarks
42 # env: TEST=--disable-tests BENCH=--disable-benchmarks
41− addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-8.2.1], sources: [hvr-ghc]}}
43+ addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-8.2.2], sources: [hvr-ghc]}}
42
44
43before_install:
45before_install:
44 - HC=${CC}
46 - HC=${CC}
45 - HCPKG=${HC/ghc/ghc-pkg}
47 - HCPKG=${HC/ghc/ghc-pkg}
46 - unset CC
48 - unset CC
49+ - ROOTDIR=$(pwd)
50+ - mkdir -p $HOME/.local/bin
47− - PATH=/opt/ghc/bin:/opt/ghc-ppa-tools/bin:$PATH
51+ - "PATH=/opt/ghc/bin:/opt/ghc-ppa-tools/bin:$HOME/local/bin:$PATH"
52+ - HCNUMVER=$(( $(${HC} --numeric-version|sed -E 's/([0-9]+)\.([0-9]+)\.([0-9]+).*/\1 * 10000 + \2 * 100 + \3/') ))
53+ - echo $HCNUMVER
48
54
49install:
55install:
50 - cabal --version
56 - cabal --version
@@ -53,12 +59,15 @@ install:
53 - TEST=${TEST---enable-tests}
59 - TEST=${TEST---enable-tests}
54 - HADDOCK=${HADDOCK-true}
60 - HADDOCK=${HADDOCK-true}
55 - INSTALLED=${INSTALLED-true}
61 - INSTALLED=${INSTALLED-true}
62+ - GHCHEAD=${GHCHEAD-false}
56 - travis_retry cabal update -v
63 - travis_retry cabal update -v
57− - sed -i.bak 's/^jobs:/-- jobs:/' ${HOME}/.cabal/config
64+ - "sed -i.bak 's/^jobs:/-- jobs:/' ${HOME}/.cabal/config"
58− - rm -fv cabal.project.local
65+ - rm -fv cabal.project cabal.project.local
66+ - grep -Ev -- '^\s*--' ${HOME}/.cabal/config | grep -Ev '^\s*$'
59− - "echo 'packages: .' > cabal.project"
67+ - "printf 'packages: \".\"\\n' > cabal.project"
68+ - cat cabal.project
60 - if [ -f "./configure.ac" ]; then
69 - if [ -f "./configure.ac" ]; then
61− (cd "."; autoreconf -i);
70+ (cd "." && autoreconf -i);
62 fi
71 fi
63 - rm -f cabal.project.freeze
72 - rm -f cabal.project.freeze
64 - cabal new-build -w ${HC} ${TEST} ${BENCH} --project-file="cabal.project" --dep -j2 all
73 - cabal new-build -w ${HC} ${TEST} ${BENCH} --project-file="cabal.project" --dep -j2 all
@@ -70,26 +79,28 @@ install:
70# any command which exits with a non-zero exit code causes the build to fail.
79# any command which exits with a non-zero exit code causes the build to fail.
71script:
80script:
72 # test that source-distributions can be generated
81 # test that source-distributions can be generated
73− - (cd "."; cabal sdist)
82+ - (cd "." && cabal sdist)
74 - mv "."/dist/servant-quickcheck-*.tar.gz ${DISTDIR}/
83 - mv "."/dist/servant-quickcheck-*.tar.gz ${DISTDIR}/
75− - cd ${DISTDIR}
84+ - cd ${DISTDIR} || false
76 - find . -maxdepth 1 -name '*.tar.gz' -exec tar -xvf '{}' \;
85 - find . -maxdepth 1 -name '*.tar.gz' -exec tar -xvf '{}' \;
77− - "printf 'packages: servant-quickcheck-*/*.cabal\n' > cabal.project"
86+ - "printf 'packages: servant-quickcheck-*/*.cabal\\n' > cabal.project"
87+ - cat cabal.project
78 # this builds all libraries and executables (without tests/benchmarks)
88 # this builds all libraries and executables (without tests/benchmarks)
79 - cabal new-build -w ${HC} --disable-tests --disable-benchmarks all
89 - cabal new-build -w ${HC} --disable-tests --disable-benchmarks all
80
90
81 # Build with installed constraints for packages in global-db
91 # Build with installed constraints for packages in global-db
82− - if $INSTALLED; then
83− echo cabal new-build -w ${HC} --disable-tests --disable-benchmarks $(${HCPKG} list --global --simple-output --names-only | sed 's/\([a-zA-Z0-9-]\{1,\}\) */--constraint="\1 installed" /g') all | sh;
92+ - if $INSTALLED; then echo cabal new-build -w ${HC} --disable-tests --disable-benchmarks $(${HCPKG} list --global --simple-output --names-only | sed 's/\([a-zA-Z0-9-]\{1,\}\) */--constraint="\1 installed" /g') all | sh; else echo "Not building with installed constraints"; fi
84− else echo "Not building with installed constraints"; fi
85
93
86 # build & run tests, build benchmarks
94 # build & run tests, build benchmarks
87 - cabal new-build -w ${HC} ${TEST} ${BENCH} all
95 - cabal new-build -w ${HC} ${TEST} ${BENCH} all
88− - if [ "x$TEST" = "x--enable-tests" ]; then cabal new-test -w ${HC} ${TEST} all; fi
96+ - if [ "x$TEST" = "x--enable-tests" ]; then cabal new-test -w ${HC} ${TEST} ${BENCH} all; fi
97+
98+ # cabal check
99+ - (cd servant-quickcheck-* && cabal check)
89
100
90 # haddock
101 # haddock
91 - rm -rf ./dist-newstyle
102 - rm -rf ./dist-newstyle
92− - if $HADDOCK; then cabal new-haddock -w ${HC} --disable-tests --disable-benchmarks all; else echo "Skipping haddock generation";fi
103+ - if $HADDOCK; then cabal new-haddock -w ${HC} ${TEST} ${BENCH} all; else echo "Skipping haddock generation";fi
93
104
94# REGENDATA ["--branch","master","-o",".travis.yml","servant-quickcheck.cabal"]
105# REGENDATA ["--branch","master","-o",".travis.yml","servant-quickcheck.cabal"]
95# EOF
106# EOF
CHANGELOG.yaml+8
@@ -2,6 +2,14 @@ upcoming:
2
2
3releases:
3releases:
4
4
5+ - version: "0.0.6.0"
6+ changes:
7+
8+ - description: Support for servant-0.12
9+ issue: none
10+ authors: phadej
11+ date: 2018-02-09
12+
5 - version: "0.0.5.0"
13 - version: "0.0.5.0"
6 changes:
14 changes:
7
15
example/Main.hsnew file+31
@@ -0,0 +1,31 @@
1+{-# LANGUAGE OverloadedStrings, DataKinds #-}
2+module Main (main) where
3+
4+import Servant
5+import Servant.QuickCheck
6+import Test.Hspec
7+import Data.Text (Text)
8+import System.Environment (getArgs)
9+
10+main :: IO ()
11+main = do
12+ args <- getArgs
13+ case args of
14+ [] -> putStrLn "Not running without arguments. Try --help or --fail-fast."
15+ _ -> hspec spec
16+
17+-- Change to String to reproduce
18+-- https://github.com/haskell-servant/servant-quickcheck/issues/41
19+type API = Get '[PlainText] Text
20+
21+api :: Proxy API
22+api = Proxy
23+
24+server :: Server API
25+server = return "Sigurð Fáfnirslayer"
26+
27+spec :: Spec
28+spec = describe "example server" $
29+ it "mangles UTF-8 in error messages" $
30+ withServantServer api (return server) $ \burl ->
31+ serverSatisfies api burl defaultArgs (getsHaveCacheControlHeader <%> mempty)
servant-quickcheck.cabal+21−7
@@ -1,5 +1,5 @@
1name: servant-quickcheck
1name: servant-quickcheck
2−version: 0.0.5.0
2+version: 0.0.6.0
3synopsis: QuickCheck entire APIs
3synopsis: QuickCheck entire APIs
4description:
4description:
5 This packages provides QuickCheck properties that are tested across an entire
5 This packages provides QuickCheck properties that are tested across an entire
@@ -17,7 +17,7 @@ extra-source-files:
17tested-with:
17tested-with:
18 GHC==7.10.3,
18 GHC==7.10.3,
19 GHC==8.0.2,
19 GHC==8.0.2,
20− GHC==8.2.1
20+ GHC==8.2.2
21
21
22source-repository head
22source-repository head
23 type: git
23 type: git
@@ -45,14 +45,14 @@ library
45 , hspec >= 2.2 && < 2.5
45 , hspec >= 2.2 && < 2.5
46 , http-client >= 0.4.30 && < 0.6
46 , http-client >= 0.4.30 && < 0.6
47 , http-media >= 0.6 && <0.8
47 , http-media >= 0.6 && <0.8
48− , http-types > 0.8 && < 0.11
48+ , http-types > 0.8 && < 0.13
49 , mtl > 2.1 && < 2.3
49 , mtl > 2.1 && < 2.3
50 , pretty == 1.1.*
50 , pretty == 1.1.*
51 , process >= 1.2 && < 1.7
51 , process >= 1.2 && < 1.7
52− , QuickCheck > 2.7 && < 2.11
52+ , QuickCheck > 2.7 && < 2.12
53− , servant > 0.6 && < 0.13
53+ , servant >= 0.13 && < 0.14
54− , servant-client > 0.6 && < 0.13
54+ , servant-client >= 0.13 && < 0.14
55− , servant-server > 0.6 && < 0.13
55+ , servant-server >= 0.13 && < 0.14
56 , split == 0.2.*
56 , split == 0.2.*
57 , string-conversions > 0.3 && < 0.5
57 , string-conversions > 0.3 && < 0.5
58 , temporary == 1.2.*
58 , temporary == 1.2.*
@@ -114,3 +114,17 @@ test-suite spec
114 , ScopedTypeVariables
114 , ScopedTypeVariables
115 if flag(long-tests)
115 if flag(long-tests)
116 cpp-options: -DLONG_TESTS
116 cpp-options: -DLONG_TESTS
117+
118+test-suite example
119+ type: exitcode-stdio-1.0
120+ main-is: Main.hs
121+ hs-source-dirs:
122+ example
123+ ghc-options: -Wall
124+ build-depends:
125+ base
126+ , hspec
127+ , servant-server
128+ , servant-quickcheck
129+ , text
130+ default-language: Haskell2010
src/Servant/QuickCheck/Internal/HasGenRequest.hs+7−7
@@ -78,7 +78,7 @@ instance HasGenRequest api => HasGenRequest (Description d :> api) where
78#endif
78#endif
79
79
80instance (Arbitrary c, HasGenRequest b, ToHttpApiData c )
80instance (Arbitrary c, HasGenRequest b, ToHttpApiData c )
81− => HasGenRequest (Capture x c :> b) where
81+ => HasGenRequest (Capture' mods x c :> b) where
82 genRequest _ = (oldf, do
82 genRequest _ = (oldf, do
83 old' <- old
83 old' <- old
84 new' <- toUrlPiece <$> new
84 new' <- toUrlPiece <$> new
@@ -101,10 +101,10 @@ instance (Arbitrary c, HasGenRequest b, ToHttpApiData c )
101#endif
101#endif
102
102
103instance (Arbitrary c, KnownSymbol h, HasGenRequest b, ToHttpApiData c)
103instance (Arbitrary c, KnownSymbol h, HasGenRequest b, ToHttpApiData c)
104− => HasGenRequest (Header h c :> b) where
104+ => HasGenRequest (Header' mods h c :> b) where
105 genRequest _ = (oldf, do
105 genRequest _ = (oldf, do
106 old' <- old
106 old' <- old
107− new' <- toUrlPiece <$> new
107+ new' <- toUrlPiece <$> new -- TODO: generate lenient or/and optional
108 return $ \burl -> let r = old' burl in r {
108 return $ \burl -> let r = old' burl in r {
109 requestHeaders = (hdr, cs new') : requestHeaders r })
109 requestHeaders = (hdr, cs new') : requestHeaders r })
110 where
110 where
@@ -113,9 +113,9 @@ instance (Arbitrary c, KnownSymbol h, HasGenRequest b, ToHttpApiData c)
113 new = arbitrary :: Gen c
113 new = arbitrary :: Gen c
114
114
115instance (AllMimeRender x c, Arbitrary c, HasGenRequest b)
115instance (AllMimeRender x c, Arbitrary c, HasGenRequest b)
116− => HasGenRequest (ReqBody x c :> b) where
116+ => HasGenRequest (ReqBody' mods x c :> b) where
117 genRequest _ = (oldf, do
117 genRequest _ = (oldf, do
118− old' <- old
118+ old' <- old -- TODO: generate lenient
119 new' <- new
119 new' <- new
120 (ct, bd) <- elements $ allMimeRender (Proxy :: Proxy x) new'
120 (ct, bd) <- elements $ allMimeRender (Proxy :: Proxy x) new'
121 return $ \burl -> let r = old' burl in r {
121 return $ \burl -> let r = old' burl in r {
@@ -127,9 +127,9 @@ instance (AllMimeRender x c, Arbitrary c, HasGenRequest b)
127 new = arbitrary :: Gen c
127 new = arbitrary :: Gen c
128
128
129instance (KnownSymbol x, Arbitrary c, ToHttpApiData c, HasGenRequest b)
129instance (KnownSymbol x, Arbitrary c, ToHttpApiData c, HasGenRequest b)
130− => HasGenRequest (QueryParam x c :> b) where
130+ => HasGenRequest (QueryParam' mods x c :> b) where
131 genRequest _ = (oldf, do
131 genRequest _ = (oldf, do
132− new' <- new
132+ new' <- new -- TODO: generate lenient or/and optional
133 old' <- old
133 old' <- old
134 return $ \burl -> let r = old' burl
134 return $ \burl -> let r = old' burl
135 newExpr = param <> "=" <> cs (toQueryParam new')
135 newExpr = param <> "=" <> cs (toQueryParam new')