git.iko.soy/typeable/http-api-data
on cf535bc help sign in
.github/workflows/haskell-ci.yml+30−41
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.20211111
12#
12#
13−# REGENDATA ("0.15.20220609",["github","cabal.project"])
13+# REGENDATA ("0.13.20211111",["github","cabal.project"])
14#
14#
15name: Haskell-CI
15name: Haskell-CI
16on:
16on:
@@ -23,7 +23,7 @@ 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:
27 timeout-minutes:
28 60
28 60
29 container:
29 container:
@@ -32,20 +32,15 @@ jobs:
32 strategy:
32 strategy:
33 matrix:
33 matrix:
34 include:
34 include:
35− - compiler: ghc-9.4.0.20220523
35+ - compiler: ghc-9.2.1
36 compilerKind: ghc
36 compilerKind: ghc
37− compilerVersion: 9.4.0.20220523
37+ compilerVersion: 9.2.1
38− setup-method: ghcup
39− allow-failure: true
40− - compiler: ghc-9.2.3
41− compilerKind: ghc
42− compilerVersion: 9.2.3
43 setup-method: ghcup
38 setup-method: ghcup
44 allow-failure: false
39 allow-failure: false
45− - compiler: ghc-9.0.2
40+ - compiler: ghc-9.0.1
46 compilerKind: ghc
41 compilerKind: ghc
47− compilerVersion: 9.0.2
42+ compilerVersion: 9.0.1
48− setup-method: ghcup
43+ setup-method: hvr-ppa
49 allow-failure: false
44 allow-failure: false
50 - compiler: ghc-8.10.7
45 - compiler: ghc-8.10.7
51 compilerKind: ghc
46 compilerKind: ghc
@@ -77,6 +72,16 @@ jobs:
77 compilerVersion: 8.0.2
72 compilerVersion: 8.0.2
78 setup-method: hvr-ppa
73 setup-method: hvr-ppa
79 allow-failure: false
74 allow-failure: false
75+ - compiler: ghc-7.10.3
76+ compilerKind: ghc
77+ compilerVersion: 7.10.3
78+ setup-method: hvr-ppa
79+ allow-failure: false
80+ - compiler: ghc-7.8.4
81+ compilerKind: ghc
82+ compilerVersion: 7.8.4
83+ setup-method: hvr-ppa
84+ allow-failure: false
80 fail-fast: false
85 fail-fast: false
81 steps:
86 steps:
82 - name: apt
87 - name: apt
@@ -85,19 +90,18 @@ jobs:
85 apt-get install -y --no-install-recommends gnupg ca-certificates dirmngr curl git software-properties-common libtinfo5
90 apt-get install -y --no-install-recommends gnupg ca-certificates dirmngr curl git software-properties-common libtinfo5
86 if [ "${{ matrix.setup-method }}" = ghcup ]; then
91 if [ "${{ matrix.setup-method }}" = ghcup ]; then
87 mkdir -p "$HOME/.ghcup/bin"
92 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"
93+ curl -sL https://downloads.haskell.org/ghcup/0.1.17.3/x86_64-linux-ghcup-0.1.17.3 > "$HOME/.ghcup/bin/ghcup"
89 chmod a+x "$HOME/.ghcup/bin/ghcup"
94 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)
95+ "$HOME/.ghcup/bin/ghcup" install ghc "$HCVER"
92− "$HOME/.ghcup/bin/ghcup" install cabal 3.6.2.0 || (cat "$HOME"/.ghcup/logs/*.* && false)
96+ "$HOME/.ghcup/bin/ghcup" install cabal 3.6.2.0
93 else
97 else
94 apt-add-repository -y 'ppa:hvr/ghc'
98 apt-add-repository -y 'ppa:hvr/ghc'
95 apt-get update
99 apt-get update
96 apt-get install -y "$HCNAME"
100 apt-get install -y "$HCNAME"
97 mkdir -p "$HOME/.ghcup/bin"
101 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"
102+ curl -sL https://downloads.haskell.org/ghcup/0.1.17.3/x86_64-linux-ghcup-0.1.17.3 > "$HOME/.ghcup/bin/ghcup"
99 chmod a+x "$HOME/.ghcup/bin/ghcup"
103 chmod a+x "$HOME/.ghcup/bin/ghcup"
100− "$HOME/.ghcup/bin/ghcup" install cabal 3.6.2.0 || (cat "$HOME"/.ghcup/logs/*.* && false)
104+ "$HOME/.ghcup/bin/ghcup" install cabal 3.6.2.0
101 fi
105 fi
102 env:
106 env:
103 HCKIND: ${{ matrix.compilerKind }}
107 HCKIND: ${{ matrix.compilerKind }}
@@ -128,7 +132,7 @@ jobs:
128 echo "HCNUMVER=$HCNUMVER" >> "$GITHUB_ENV"
132 echo "HCNUMVER=$HCNUMVER" >> "$GITHUB_ENV"
129 echo "ARG_TESTS=--enable-tests" >> "$GITHUB_ENV"
133 echo "ARG_TESTS=--enable-tests" >> "$GITHUB_ENV"
130 echo "ARG_BENCH=--enable-benchmarks" >> "$GITHUB_ENV"
134 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
135+ echo "HEADHACKAGE=false" >> "$GITHUB_ENV"
132 echo "ARG_COMPILER=--$HCKIND --with-compiler=$HC" >> "$GITHUB_ENV"
136 echo "ARG_COMPILER=--$HCKIND --with-compiler=$HC" >> "$GITHUB_ENV"
133 echo "GHCJSARITH=0" >> "$GITHUB_ENV"
137 echo "GHCJSARITH=0" >> "$GITHUB_ENV"
134 env:
138 env:
@@ -157,18 +161,6 @@ jobs:
157 repository hackage.haskell.org
161 repository hackage.haskell.org
158 url: http://hackage.haskell.org/
162 url: http://hackage.haskell.org/
159 EOF
163 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
164 cat >> $CABAL_CONFIG <<EOF
173 program-default-options
165 program-default-options
174 ghc-options: $GHCJOBS +RTS -M3G -RTS
166 ghc-options: $GHCJOBS +RTS -M3G -RTS
@@ -185,7 +177,7 @@ jobs:
185 - name: cache (tools)
177 - name: cache (tools)
186 uses: actions/cache@v2
178 uses: actions/cache@v2
187 with:
179 with:
188− key: ${{ runner.os }}-${{ matrix.compiler }}-tools-445c2459
180+ key: ${{ runner.os }}-${{ matrix.compiler }}-tools-13a8fe6d
189 path: ~/.haskell-ci-tools
181 path: ~/.haskell-ci-tools
190 - name: install cabal-plan
182 - name: install cabal-plan
191 run: |
183 run: |
@@ -198,8 +190,8 @@ jobs:
198 cabal-plan --version
190 cabal-plan --version
199 - name: install doctest
191 - name: install doctest
200 run: |
192 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
193+ 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
194+ if [ $((HCNUMVER >= 80000 && HCNUMVER < 90000)) -ne 0 ] ; then doctest --version ; fi
203 - name: checkout
195 - name: checkout
204 uses: actions/checkout@v2
196 uses: actions/checkout@v2
205 with:
197 with:
@@ -229,9 +221,6 @@ jobs:
229 if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then echo " ghc-options: -Werror=missing-methods" >> cabal.project ; fi
221 if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then echo " ghc-options: -Werror=missing-methods" >> cabal.project ; fi
230 cat >> cabal.project <<EOF
222 cat >> cabal.project <<EOF
231 EOF
223 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
224 $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
225 cat cabal.project
237 cat cabal.project.local
226 cat cabal.project.local
@@ -261,15 +250,15 @@ jobs:
261 - name: doctest
250 - name: doctest
262 run: |
251 run: |
263 perl -i -e 'while (<ARGV>) { print unless /package-id\s+(base-compat)-\d+(\.\d+)*/; }' .ghc.environment.*
252 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
253+ 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
254+ if [ $((HCNUMVER >= 80000 && HCNUMVER < 90000)) -ne 0 ] ; then doctest src/ ; fi
266 - name: cabal check
255 - name: cabal check
267 run: |
256 run: |
268 cd ${PKGDIR_http_api_data} || false
257 cd ${PKGDIR_http_api_data} || false
269 ${CABAL} -vnormal check
258 ${CABAL} -vnormal check
270 - name: haddock
259 - name: haddock
271 run: |
260 run: |
272− $CABAL v2-haddock --haddock-all $ARG_COMPILER --with-haddock $HADDOCK $ARG_TESTS $ARG_BENCH all
261+ $CABAL v2-haddock $ARG_COMPILER --with-haddock $HADDOCK $ARG_TESTS $ARG_BENCH all
273 - name: unconstrained build
262 - name: unconstrained build
274 run: |
263 run: |
275 rm -f cabal.project.local
264 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+25−11
@@ -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: 6
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,16 @@ 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.7,
33− GHC==9.0.2,
36+ GHC==9.0.1,
34− GHC==9.2.3,
37+ GHC==9.2.1
35− GHC==9.4.1
36
38
37flag use-text-show
39flag use-text-show
38 description: Use text-show library for efficient ToHttpApiData implementations.
40 description: Use text-show library for efficient ToHttpApiData implementations.
@@ -44,16 +46,20 @@ library
44 include-dirs: include/
46 include-dirs: include/
45
47
46 -- GHC bundled
48 -- GHC bundled
47− build-depends: base >= 4.9 && < 4.17
49+ build-depends: base >= 4.7 && < 4.17
48− , bytestring >= 0.10.8.1 && < 0.12
50+ , bytestring >= 0.10.4.0 && < 0.12
49− , containers >= 0.5.7.1 && < 0.7
51+ , containers >= 0.5.5.1 && < 0.7
50 , text >= 1.2.3.0 && < 1.3 || >=2.0 && <2.1
52 , text >= 1.2.3.0 && < 1.3 || >=2.0 && <2.1
51− , transformers >= 0.5.2.0 && < 0.7
53+ , transformers >= 0.3 && < 0.7
54+
55+ -- so Semigroup Builder exists
56+ if impl(ghc >= 8.0)
57+ build-depends: bytestring >= 0.10.8.1
52
58
53 -- other-dependencies
59 -- other-dependencies
54 build-depends:
60 build-depends:
55 attoparsec >= 0.13.2.2 && < 0.15
61 attoparsec >= 0.13.2.2 && < 0.15
56− , attoparsec-iso8601 >= 1.1.0.0 && < 1.2
62+ , attoparsec-iso8601 >= 1.0.2.0 && < 1.1
57 , base-compat >= 0.10.5 && < 0.13
63 , base-compat >= 0.10.5 && < 0.13
58 , cookie >= 0.4.3 && < 0.5
64 , cookie >= 0.4.3 && < 0.5
59 , hashable >= 1.2.7.0 && < 1.5
65 , hashable >= 1.2.7.0 && < 1.5
@@ -63,6 +69,14 @@ library
63 , unordered-containers >= 0.2.10.0 && < 0.3
69 , unordered-containers >= 0.2.10.0 && < 0.3
64 , uuid-types >= 1.0.3 && < 1.1
70 , uuid-types >= 1.0.3 && < 1.1
65
71
72+ if !impl(ghc >= 7.10)
73+ build-depends:
74+ nats >= 1.1.2 && < 1.2,
75+ void >= 0.7.3 && < 0.8
76+
77+ if !impl(ghc >= 8.0)
78+ build-depends: semigroups >= 0.18.5 && < 0.21
79+
66 if flag(use-text-show)
80 if flag(use-text-show)
67 cpp-options: -DUSE_TEXT_SHOW
81 cpp-options: -DUSE_TEXT_SHOW
68 build-depends: text-show >= 3.8.2 && <3.10
82 build-depends: text-show >= 3.8.2 && <3.10
@@ -85,7 +99,7 @@ test-suite spec
85 hs-source-dirs: test
99 hs-source-dirs: test
86 ghc-options: -Wall
100 ghc-options: -Wall
87 default-language: Haskell2010
101 default-language: Haskell2010
88− build-tool-depends: hspec-discover:hspec-discover >= 2.7.1 && <2.11
102+ build-tool-depends: hspec-discover:hspec-discover >= 2.7.1 && <2.10
89 -- inherited depndencies
103 -- inherited depndencies
90 build-depends:
104 build-depends:
91 base
105 base
@@ -102,7 +116,7 @@ test-suite spec
102 build-depends: nats
116 build-depends: nats
103
117
104 build-depends: HUnit >= 1.6.0.0 && <1.7
118 build-depends: HUnit >= 1.6.0.0 && <1.7
105− , hspec >= 2.7.1 && <2.11
119+ , hspec >= 2.7.1 && <2.10
106 , QuickCheck >= 2.13.1 && <2.15
120 , QuickCheck >= 2.13.1 && <2.15
107 , quickcheck-instances >= 0.3.25.2 && <0.4
121 , quickcheck-instances >= 0.3.25.2 && <0.4
108
122
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+