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