git.iko.soy/typeable/http-api-data
on ef80ab3 help sign in
.github/workflows/haskell-ci.yml+34−77
since splitsnapshots
unifiedsplit
@@ -8,9 +8,9 @@
8#
8#
9# For more information, see https://github.com/haskell-CI/haskell-ci
9# For more information, see https://github.com/haskell-CI/haskell-ci
10#
10#
11−# version: 0.15.20220609
11+# version: 0.13.20210827
12#
12#
13−# REGENDATA ("0.15.20220609",["github","cabal.project"])
13+# REGENDATA ("0.13.20210827",["github","cabal.project"])
14#
14#
15name: Haskell-CI
15name: Haskell-CI
16on:
16on:
@@ -23,34 +23,22 @@ on:
23jobs:
23jobs:
24 linux:
24 linux:
25 name: Haskell-CI - Linux - ${{ matrix.compiler }}
25 name: Haskell-CI - Linux - ${{ matrix.compiler }}
26− runs-on: ubuntu-20.04
26+ runs-on: ubuntu-18.04
27− timeout-minutes:
28− 60
29 container:
27 container:
30 image: buildpack-deps:bionic
28 image: buildpack-deps:bionic
31 continue-on-error: ${{ matrix.allow-failure }}
29 continue-on-error: ${{ matrix.allow-failure }}
32 strategy:
30 strategy:
33 matrix:
31 matrix:
34 include:
32 include:
35− - compiler: ghc-9.4.0.20220523
33+ - compiler: ghc-9.0.1
36 compilerKind: ghc
34 compilerKind: ghc
37− compilerVersion: 9.4.0.20220523
35+ compilerVersion: 9.0.1
38− setup-method: ghcup
36+ setup-method: hvr-ppa
39− allow-failure: true
40− - compiler: ghc-9.2.3
41− compilerKind: ghc
42− compilerVersion: 9.2.3
43− setup-method: ghcup
44− allow-failure: false
45− - compiler: ghc-9.0.2
46− compilerKind: ghc
47− compilerVersion: 9.0.2
48− setup-method: ghcup
49 allow-failure: false
37 allow-failure: false
50− - compiler: ghc-8.10.7
38+ - compiler: ghc-8.10.4
51 compilerKind: ghc
39 compilerKind: ghc
52− compilerVersion: 8.10.7
40+ compilerVersion: 8.10.4
53− setup-method: ghcup
41+ setup-method: hvr-ppa
54 allow-failure: false
42 allow-failure: false
55 - compiler: ghc-8.8.4
43 - compiler: ghc-8.8.4
56 compilerKind: ghc
44 compilerKind: ghc
@@ -77,28 +65,25 @@ jobs:
77 compilerVersion: 8.0.2
65 compilerVersion: 8.0.2
78 setup-method: hvr-ppa
66 setup-method: hvr-ppa
79 allow-failure: false
67 allow-failure: false
68+ - compiler: ghc-7.10.3
69+ compilerKind: ghc
70+ compilerVersion: 7.10.3
71+ setup-method: hvr-ppa
72+ allow-failure: false
73+ - compiler: ghc-7.8.4
74+ compilerKind: ghc
75+ compilerVersion: 7.8.4
76+ setup-method: hvr-ppa
77+ allow-failure: false
80 fail-fast: false
78 fail-fast: false
81 steps:
79 steps:
82 - name: apt
80 - name: apt
83 run: |
81 run: |
84 apt-get update
82 apt-get update
85 apt-get install -y --no-install-recommends gnupg ca-certificates dirmngr curl git software-properties-common libtinfo5
83 apt-get install -y --no-install-recommends gnupg ca-certificates dirmngr curl git software-properties-common libtinfo5
86− if [ "${{ matrix.setup-method }}" = ghcup ]; then
87− mkdir -p "$HOME/.ghcup/bin"
88− curl -sL https://downloads.haskell.org/ghcup/0.1.17.8/x86_64-linux-ghcup-0.1.17.8 > "$HOME/.ghcup/bin/ghcup"
89− chmod a+x "$HOME/.ghcup/bin/ghcup"
90− if $HEADHACKAGE; then "$HOME/.ghcup/bin/ghcup" config add-release-channel https://raw.githubusercontent.com/haskell/ghcup-metadata/master/ghcup-prereleases-0.0.7.yaml; fi
91− "$HOME/.ghcup/bin/ghcup" install ghc "$HCVER" || (cat "$HOME"/.ghcup/logs/*.* && false)
92− "$HOME/.ghcup/bin/ghcup" install cabal 3.6.2.0 || (cat "$HOME"/.ghcup/logs/*.* && false)
93− else
94− apt-add-repository -y 'ppa:hvr/ghc'
84+ apt-add-repository -y 'ppa:hvr/ghc'
95− apt-get update
85+ apt-get update
96− apt-get install -y "$HCNAME"
86+ apt-get install -y "$HCNAME" cabal-install-3.4
97− mkdir -p "$HOME/.ghcup/bin"
98− curl -sL https://downloads.haskell.org/ghcup/0.1.17.8/x86_64-linux-ghcup-0.1.17.8 > "$HOME/.ghcup/bin/ghcup"
99− chmod a+x "$HOME/.ghcup/bin/ghcup"
100− "$HOME/.ghcup/bin/ghcup" install cabal 3.6.2.0 || (cat "$HOME"/.ghcup/logs/*.* && false)
101− fi
102 env:
87 env:
103 HCKIND: ${{ matrix.compilerKind }}
88 HCKIND: ${{ matrix.compilerKind }}
104 HCNAME: ${{ matrix.compiler }}
89 HCNAME: ${{ matrix.compiler }}
@@ -110,25 +95,16 @@ jobs:
110 echo "CABAL_DIR=$HOME/.cabal" >> "$GITHUB_ENV"
95 echo "CABAL_DIR=$HOME/.cabal" >> "$GITHUB_ENV"
111 echo "CABAL_CONFIG=$HOME/.cabal/config" >> "$GITHUB_ENV"
96 echo "CABAL_CONFIG=$HOME/.cabal/config" >> "$GITHUB_ENV"
112 HCDIR=/opt/$HCKIND/$HCVER
97 HCDIR=/opt/$HCKIND/$HCVER
113− if [ "${{ matrix.setup-method }}" = ghcup ]; then
114− HC=$HOME/.ghcup/bin/$HCKIND-$HCVER
98+ HC=$HCDIR/bin/$HCKIND
115− echo "HC=$HC" >> "$GITHUB_ENV"
99+ echo "HC=$HC" >> "$GITHUB_ENV"
116− echo "HCPKG=$HOME/.ghcup/bin/$HCKIND-pkg-$HCVER" >> "$GITHUB_ENV"
117− echo "HADDOCK=$HOME/.ghcup/bin/haddock-$HCVER" >> "$GITHUB_ENV"
118− echo "CABAL=$HOME/.ghcup/bin/cabal-3.6.2.0 -vnormal+nowrap" >> "$GITHUB_ENV"
119− else
120− HC=$HCDIR/bin/$HCKIND
121− echo "HC=$HC" >> "$GITHUB_ENV"
122− echo "HCPKG=$HCDIR/bin/$HCKIND-pkg" >> "$GITHUB_ENV"
100+ echo "HCPKG=$HCDIR/bin/$HCKIND-pkg" >> "$GITHUB_ENV"
123− echo "HADDOCK=$HCDIR/bin/haddock" >> "$GITHUB_ENV"
101+ echo "HADDOCK=$HCDIR/bin/haddock" >> "$GITHUB_ENV"
124− echo "CABAL=$HOME/.ghcup/bin/cabal-3.6.2.0 -vnormal+nowrap" >> "$GITHUB_ENV"
102+ echo "CABAL=/opt/cabal/3.4/bin/cabal -vnormal+nowrap" >> "$GITHUB_ENV"
125− fi
126−
127 HCNUMVER=$(${HC} --numeric-version|perl -ne '/^(\d+)\.(\d+)\.(\d+)(\.(\d+))?$/; print(10000 * $1 + 100 * $2 + ($3 == 0 ? $5 != 1 : $3))')
103 HCNUMVER=$(${HC} --numeric-version|perl -ne '/^(\d+)\.(\d+)\.(\d+)(\.(\d+))?$/; print(10000 * $1 + 100 * $2 + ($3 == 0 ? $5 != 1 : $3))')
128 echo "HCNUMVER=$HCNUMVER" >> "$GITHUB_ENV"
104 echo "HCNUMVER=$HCNUMVER" >> "$GITHUB_ENV"
129 echo "ARG_TESTS=--enable-tests" >> "$GITHUB_ENV"
105 echo "ARG_TESTS=--enable-tests" >> "$GITHUB_ENV"
130 echo "ARG_BENCH=--enable-benchmarks" >> "$GITHUB_ENV"
106 echo "ARG_BENCH=--enable-benchmarks" >> "$GITHUB_ENV"
131− if [ $((HCNUMVER >= 90400)) -ne 0 ] ; then echo "HEADHACKAGE=true" >> "$GITHUB_ENV" ; else echo "HEADHACKAGE=false" >> "$GITHUB_ENV" ; fi
107+ echo "HEADHACKAGE=false" >> "$GITHUB_ENV"
132 echo "ARG_COMPILER=--$HCKIND --with-compiler=$HC" >> "$GITHUB_ENV"
108 echo "ARG_COMPILER=--$HCKIND --with-compiler=$HC" >> "$GITHUB_ENV"
133 echo "GHCJSARITH=0" >> "$GITHUB_ENV"
109 echo "GHCJSARITH=0" >> "$GITHUB_ENV"
134 env:
110 env:
@@ -157,22 +133,6 @@ jobs:
157 repository hackage.haskell.org
133 repository hackage.haskell.org
158 url: http://hackage.haskell.org/
134 url: http://hackage.haskell.org/
159 EOF
135 EOF
160− if $HEADHACKAGE; then
161− cat >> $CABAL_CONFIG <<EOF
162− repository head.hackage.ghc.haskell.org
163− url: https://ghc.gitlab.haskell.org/head.hackage/
164− secure: True
165− root-keys: 7541f32a4ccca4f97aea3b22f5e593ba2c0267546016b992dfadcd2fe944e55d
166− 26021a13b401500c8eb2761ca95c61f2d625bfef951b939a8124ed12ecf07329
167− f76d08be13e9a61a377a85e2fb63f4c5435d40f8feb3e12eb05905edb8cdea89
168− key-threshold: 3
169− active-repositories: hackage.haskell.org, head.hackage.ghc.haskell.org:override
170− EOF
171− fi
172− cat >> $CABAL_CONFIG <<EOF
173− program-default-options
174− ghc-options: $GHCJOBS +RTS -M3G -RTS
175− EOF
176 cat $CABAL_CONFIG
136 cat $CABAL_CONFIG
177 - name: versions
137 - name: versions
178 run: |
138 run: |
@@ -185,7 +145,7 @@ jobs:
185 - name: cache (tools)
145 - name: cache (tools)
186 uses: actions/cache@v2
146 uses: actions/cache@v2
187 with:
147 with:
188− key: ${{ runner.os }}-${{ matrix.compiler }}-tools-445c2459
148+ key: ${{ runner.os }}-${{ matrix.compiler }}-tools-13a8fe6d
189 path: ~/.haskell-ci-tools
149 path: ~/.haskell-ci-tools
190 - name: install cabal-plan
150 - name: install cabal-plan
191 run: |
151 run: |
@@ -198,8 +158,8 @@ jobs:
198 cabal-plan --version
158 cabal-plan --version
199 - name: install doctest
159 - name: install doctest
200 run: |
160 run: |
201− if [ $((HCNUMVER < 90000)) -ne 0 ] ; then $CABAL --store-dir=$HOME/.haskell-ci-tools/store v2-install $ARG_COMPILER --ignore-project -j2 doctest --constraint='doctest ^>=0.20' ; fi
161+ if [ $((HCNUMVER >= 80000 && HCNUMVER < 90000)) -ne 0 ] ; then $CABAL --store-dir=$HOME/.haskell-ci-tools/store v2-install $ARG_COMPILER --ignore-project -j2 doctest --constraint='doctest ^>=0.17' ; fi
202− if [ $((HCNUMVER < 90000)) -ne 0 ] ; then doctest --version ; fi
162+ if [ $((HCNUMVER >= 80000 && HCNUMVER < 90000)) -ne 0 ] ; then doctest --version ; fi
203 - name: checkout
163 - name: checkout
204 uses: actions/checkout@v2
164 uses: actions/checkout@v2
205 with:
165 with:
@@ -229,9 +189,6 @@ jobs:
229 if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then echo " ghc-options: -Werror=missing-methods" >> cabal.project ; fi
189 if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then echo " ghc-options: -Werror=missing-methods" >> cabal.project ; fi
230 cat >> cabal.project <<EOF
190 cat >> cabal.project <<EOF
231 EOF
191 EOF
232− if $HEADHACKAGE; then
233− echo "allow-newer: $($HCPKG list --simple-output | sed -E 's/([a-zA-Z-]+)-[0-9.]+/*:\1,/g')" >> cabal.project
234− fi
235 $HCPKG list --simple-output --names-only | perl -ne 'for (split /\s+/) { print "constraints: $_ installed\n" unless /^(http-api-data)$/; }' >> cabal.project.local
192 $HCPKG list --simple-output --names-only | perl -ne 'for (split /\s+/) { print "constraints: $_ installed\n" unless /^(http-api-data)$/; }' >> cabal.project.local
236 cat cabal.project
193 cat cabal.project
237 cat cabal.project.local
194 cat cabal.project.local
@@ -261,15 +218,15 @@ jobs:
261 - name: doctest
218 - name: doctest
262 run: |
219 run: |
263 perl -i -e 'while (<ARGV>) { print unless /package-id\s+(base-compat)-\d+(\.\d+)*/; }' .ghc.environment.*
220 perl -i -e 'while (<ARGV>) { print unless /package-id\s+(base-compat)-\d+(\.\d+)*/; }' .ghc.environment.*
264− if [ $((HCNUMVER < 90000)) -ne 0 ] ; then cd ${PKGDIR_http_api_data} || false ; fi
221+ if [ $((HCNUMVER >= 80000 && HCNUMVER < 90000)) -ne 0 ] ; then cd ${PKGDIR_http_api_data} || false ; fi
265− if [ $((HCNUMVER < 90000)) -ne 0 ] ; then doctest -XHaskell2010 src/ ; fi
222+ if [ $((HCNUMVER >= 80000 && HCNUMVER < 90000)) -ne 0 ] ; then doctest src/ ; fi
266 - name: cabal check
223 - name: cabal check
267 run: |
224 run: |
268 cd ${PKGDIR_http_api_data} || false
225 cd ${PKGDIR_http_api_data} || false
269 ${CABAL} -vnormal check
226 ${CABAL} -vnormal check
270 - name: haddock
227 - name: haddock
271 run: |
228 run: |
272− $CABAL v2-haddock --haddock-all $ARG_COMPILER --with-haddock $HADDOCK $ARG_TESTS $ARG_BENCH all
229+ $CABAL v2-haddock $ARG_COMPILER --with-haddock $HADDOCK $ARG_TESTS $ARG_BENCH all
273 - name: unconstrained build
230 - name: unconstrained build
274 run: |
231 run: |
275 rm -f cabal.project.local
232 rm -f cabal.project.local
CHANGELOG.md−7
@@ -1,10 +1,3 @@
1−0.5
2−---
3−
4−* Use `attoparsec-iso8601-1.1.0.0`.
5− `Day` and `UTCTime` parsers require at least 4 digits now, which is a breaking change.
6−* Drop GHC-7.8 and GHC-7.10 support.
7−
80.4.3
10.4.3
9-----
2-----
10
3
http-api-data.cabal+27−14
@@ -1,6 +1,7 @@
1cabal-version: >= 1.10
1cabal-version: >= 1.10
2name: http-api-data
2name: http-api-data
3−version: 0.5
3+version: 0.4.3
4+x-revision: 3
4
5
5synopsis: Converting to/from HTTP API data like URL pieces, headers and query parameters.
6synopsis: Converting to/from HTTP API data like URL pieces, headers and query parameters.
6category: Web
7category: Web
@@ -24,15 +25,15 @@ extra-source-files:
24 README.md
25 README.md
25
26
26tested-with:
27tested-with:
28+ GHC==7.8.4,
29+ GHC==7.10.3,
27 GHC==8.0.2,
30 GHC==8.0.2,
28 GHC==8.2.2,
31 GHC==8.2.2,
29 GHC==8.4.4,
32 GHC==8.4.4,
30 GHC==8.6.5,
33 GHC==8.6.5,
31 GHC==8.8.4,
34 GHC==8.8.4,
32− GHC==8.10.7,
35+ GHC==8.10.4,
33− GHC==9.0.2,
36+ GHC==9.0.1
34− GHC==9.2.3,
35− GHC==9.4.1
36
37
37flag use-text-show
38flag use-text-show
38 description: Use text-show library for efficient ToHttpApiData implementations.
39 description: Use text-show library for efficient ToHttpApiData implementations.
@@ -44,25 +45,37 @@ library
44 include-dirs: include/
45 include-dirs: include/
45
46
46 -- GHC bundled
47 -- GHC bundled
47− build-depends: base >= 4.9 && < 4.17
48+ build-depends: base >= 4.7 && < 4.16
48− , bytestring >= 0.10.8.1 && < 0.12
49+ , bytestring >= 0.10.4.0 && < 0.12
49− , containers >= 0.5.7.1 && < 0.7
50+ , containers >= 0.5.5.1 && < 0.7
50− , text >= 1.2.3.0 && < 1.3 || >=2.0 && <2.1
51+ , text >= 1.2.3.0 && < 1.3
51− , transformers >= 0.5.2.0 && < 0.7
52+ , transformers >= 0.3 && < 0.7
53+
54+ -- so Semigroup Builder exists
55+ if impl(ghc >= 8.0)
56+ build-depends: bytestring >= 0.10.8.1
52
57
53 -- other-dependencies
58 -- other-dependencies
54 build-depends:
59 build-depends:
55 attoparsec >= 0.13.2.2 && < 0.15
60 attoparsec >= 0.13.2.2 && < 0.15
56− , attoparsec-iso8601 >= 1.1.0.0 && < 1.2
61+ , attoparsec-iso8601 >= 1.0.2.0 && < 1.1
57 , base-compat >= 0.10.5 && < 0.13
62 , base-compat >= 0.10.5 && < 0.13
58 , cookie >= 0.4.3 && < 0.5
63 , cookie >= 0.4.3 && < 0.5
59− , hashable >= 1.2.7.0 && < 1.5
64+ , hashable >= 1.2.7.0 && < 1.4
60 , http-types >= 0.12.3 && < 0.13
65 , http-types >= 0.12.3 && < 0.13
61 , tagged >= 0.8.5 && < 0.9
66 , tagged >= 0.8.5 && < 0.9
62 , time-compat >= 1.9.5 && < 1.10
67 , time-compat >= 1.9.5 && < 1.10
63 , unordered-containers >= 0.2.10.0 && < 0.3
68 , unordered-containers >= 0.2.10.0 && < 0.3
64 , uuid-types >= 1.0.3 && < 1.1
69 , uuid-types >= 1.0.3 && < 1.1
65
70
71+ if !impl(ghc >= 7.10)
72+ build-depends:
73+ nats >= 1.1.2 && < 1.2,
74+ void >= 0.7.3 && < 0.8
75+
76+ if !impl(ghc >= 8.0)
77+ build-depends: semigroups >= 0.18.5 && < 0.20
78+
66 if flag(use-text-show)
79 if flag(use-text-show)
67 cpp-options: -DUSE_TEXT_SHOW
80 cpp-options: -DUSE_TEXT_SHOW
68 build-depends: text-show >= 3.8.2 && <3.10
81 build-depends: text-show >= 3.8.2 && <3.10
@@ -85,7 +98,7 @@ test-suite spec
85 hs-source-dirs: test
98 hs-source-dirs: test
86 ghc-options: -Wall
99 ghc-options: -Wall
87 default-language: Haskell2010
100 default-language: Haskell2010
88− build-tool-depends: hspec-discover:hspec-discover >= 2.7.1 && <2.11
101+ build-tool-depends: hspec-discover:hspec-discover >= 2.7.1 && <2.9
89 -- inherited depndencies
102 -- inherited depndencies
90 build-depends:
103 build-depends:
91 base
104 base
@@ -102,7 +115,7 @@ test-suite spec
102 build-depends: nats
115 build-depends: nats
103
116
104 build-depends: HUnit >= 1.6.0.0 && <1.7
117 build-depends: HUnit >= 1.6.0.0 && <1.7
105− , hspec >= 2.7.1 && <2.11
118+ , hspec >= 2.7.1 && <2.9
106 , QuickCheck >= 2.13.1 && <2.15
119 , QuickCheck >= 2.13.1 && <2.15
107 , quickcheck-instances >= 0.3.25.2 && <0.4
120 , quickcheck-instances >= 0.3.25.2 && <0.4
108
121
src/Web/Internal/HttpApiData.hs+10−3
@@ -32,7 +32,6 @@ import Data.Data (Data)
32import qualified Data.Fixed as F
32import qualified Data.Fixed as F
33import Data.Functor.Identity (Identity(Identity))
33import Data.Functor.Identity (Identity(Identity))
34import Data.Int (Int16, Int32, Int64, Int8)
34import Data.Int (Int16, Int32, Int64, Int8)
35−import Data.Kind (Type)
36import qualified Data.Map as Map
35import qualified Data.Map as Map
37import Data.Monoid (All (..), Any (..), Dual (..),
36import Data.Monoid (All (..), Any (..), Dual (..),
38 First (..), Last (..),
37 First (..), Last (..),
@@ -72,6 +71,12 @@ import Text.Read (readMaybe)
72import Web.Cookie (SetCookie, parseSetCookie,
71import Web.Cookie (SetCookie, parseSetCookie,
73 renderSetCookie)
72 renderSetCookie)
74
73
74+#if MIN_VERSION_base(4,9,0)
75+import Data.Kind (Type)
76+#else
77+#define Type *
78+#endif
79+
75#if USE_TEXT_SHOW
80#if USE_TEXT_SHOW
76import TextShow (TextShow, showt)
81import TextShow (TextShow, showt)
77#endif
82#endif
@@ -96,7 +101,7 @@ class ToHttpApiData a where
96 -- The default definition uses 'H.encodePathSegmentsRelative',
101 -- The default definition uses 'H.encodePathSegmentsRelative',
97 -- but this may be overriden with a more efficient version.
102 -- but this may be overriden with a more efficient version.
98 toEncodedUrlPiece :: a -> BS.Builder
103 toEncodedUrlPiece :: a -> BS.Builder
99− toEncodedUrlPiece = H.urlEncodeBuilder True . encodeUtf8 . toUrlPiece
104+ toEncodedUrlPiece = H.encodePathSegmentsRelative . (:[]) . toUrlPiece
100
105
101 -- | Convert to HTTP header value.
106 -- | Convert to HTTP header value.
102 toHeader :: a -> ByteString
107 toHeader :: a -> ByteString
@@ -514,7 +519,7 @@ instance ToHttpApiData DayOfWeek where
514
519
515 toEncodedUrlPiece = unsafeToEncodedUrlPiece
520 toEncodedUrlPiece = unsafeToEncodedUrlPiece
516
521
517−-- |
522+-- |
518-- >>> toUrlPiece Q4
523-- >>> toUrlPiece Q4
519-- "q4"
524-- "q4"
520instance ToHttpApiData QuarterOfYear where
525instance ToHttpApiData QuarterOfYear where
@@ -865,3 +870,5 @@ runAtto :: Atto.Parser a -> Text -> Either Text a
865runAtto p t = case Atto.parseOnly (p <* Atto.endOfInput) t of
870runAtto p t = case Atto.parseOnly (p <* Atto.endOfInput) t of
866 Left err -> Left (T.pack err)
871 Left err -> Left (T.pack err)
867 Right x -> Right x
872 Right x -> Right x
873+
874+