git.iko.soy/typeable/http-api-data
on master help sign in
Use time-compat (DayOfWeek), bump bounds, regenerate travis
a5d8736Oleg Grenrus
.travis.yml+134−85
@@ -1,122 +1,171 @@
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−# runghc make_travis_yml_2.hs '--config' '--output' '.travis.yml' 'http-api-data.cabal'
3+# haskell-ci '--config=cabal.haskell-ci' 'http-api-data.cabal'
4#
4#
5# For more information, see https://github.com/haskell-CI/haskell-ci
5# For more information, see https://github.com/haskell-CI/haskell-ci
6#
6#
7+# version: 0.3.20190521
8+#
7language: c
9language: c
8−sudo: false
10+dist: xenial
9−
10git:
11git:
11− submodules: false # whether to recursively clone submodules
12+ # whether to recursively clone submodules
12−
13+ submodules: false
13branches:
14branches:
14 only:
15 only:
15 - master
16 - master
16−
17cache:
17cache:
18 directories:
18 directories:
19 - $HOME/.cabal/packages
19 - $HOME/.cabal/packages
20 - $HOME/.cabal/store
20 - $HOME/.cabal/store
21−
22before_cache:
21before_cache:
23− - rm -fv $HOME/.cabal/packages/hackage.haskell.org/build-reports.log
22+ - rm -fv $CABALHOME/packages/hackage.haskell.org/build-reports.log
24 # remove files that are regenerated by 'cabal update'
23 # remove files that are regenerated by 'cabal update'
25− - rm -fv $HOME/.cabal/packages/hackage.haskell.org/00-index.*
24+ - rm -fv $CABALHOME/packages/hackage.haskell.org/00-index.*
26− - rm -fv $HOME/.cabal/packages/hackage.haskell.org/*.json
25+ - rm -fv $CABALHOME/packages/hackage.haskell.org/*.json
27− - rm -fv $HOME/.cabal/packages/hackage.haskell.org/01-index.cache
26+ - rm -fv $CABALHOME/packages/hackage.haskell.org/01-index.cache
28− - rm -fv $HOME/.cabal/packages/hackage.haskell.org/01-index.tar
27+ - rm -fv $CABALHOME/packages/hackage.haskell.org/01-index.tar
29− - rm -fv $HOME/.cabal/packages/hackage.haskell.org/01-index.tar.idx
28+ - rm -fv $CABALHOME/packages/hackage.haskell.org/01-index.tar.idx
30−
31− - rm -rfv $HOME/.cabal/packages/head.hackage
29+ - rm -rfv $CABALHOME/packages/head.hackage
32−
33matrix:
30matrix:
34 include:
31 include:
35− - compiler: "ghc-8.6.2"
32+ - compiler: ghc-8.8.1
36− # env: TEST=--disable-tests BENCH=--disable-benchmarks
37− addons: {apt: {packages: [ghc-ppa-tools,cabal-install-2.4,ghc-8.6.2], sources: [hvr-ghc]}}
33+ addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-8.8.1","cabal-install-3.0"]}}
34+ env: GHCHEAD=true
35+ - compiler: ghc-8.6.5
36+ addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-8.6.5","cabal-install-2.4"]}}
38− - compiler: "ghc-8.4.4"
37+ - compiler: ghc-8.4.4
39− # env: TEST=--disable-tests BENCH=--disable-benchmarks
38+ addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-8.4.4","cabal-install-2.4"]}}
40− addons: {apt: {packages: [ghc-ppa-tools,cabal-install-2.4,ghc-8.4.4], sources: [hvr-ghc]}}
41− - compiler: "ghc-8.2.2"
39+ - compiler: ghc-8.2.2
42− # env: TEST=--disable-tests BENCH=--disable-benchmarks
40+ addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-8.2.2","cabal-install-2.4"]}}
43− addons: {apt: {packages: [ghc-ppa-tools,cabal-install-2.4,ghc-8.2.2], sources: [hvr-ghc]}}
44− - compiler: "ghc-8.0.2"
41+ - compiler: ghc-8.0.2
45− # env: TEST=--disable-tests BENCH=--disable-benchmarks
42+ addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-8.0.2","cabal-install-2.4"]}}
46− addons: {apt: {packages: [ghc-ppa-tools,cabal-install-2.4,ghc-8.0.2], sources: [hvr-ghc]}}
47− - compiler: "ghc-7.10.3"
43+ - compiler: ghc-7.10.3
48− # env: TEST=--disable-tests BENCH=--disable-benchmarks
49− addons: {apt: {packages: [ghc-ppa-tools,cabal-install-2.4,ghc-7.10.3], sources: [hvr-ghc]}}
44+ addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-7.10.3","cabal-install-2.4"]}}
50− - compiler: "ghc-7.8.4"
45+ - compiler: ghc-7.8.4
51− # env: TEST=--disable-tests BENCH=--disable-benchmarks
52− addons: {apt: {packages: [ghc-ppa-tools,cabal-install-2.4,ghc-7.8.4], sources: [hvr-ghc]}}
46+ addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-7.8.4","cabal-install-2.4"]}}
53−
47+ allow_failures:
48+ - compiler: ghc-8.8.1
54before_install:
49before_install:
55− - HC=${CC}
50+ - HC=$(echo "/opt/$CC/bin/ghc" | sed 's/-/\//')
56− - HCPKG=${HC/ghc/ghc-pkg}
51+ - HCPKG="$HC-pkg"
57 - unset CC
52 - unset CC
58− - ROOTDIR=$(pwd)
53+ - CABAL=/opt/ghc/bin/cabal
59− - mkdir -p $HOME/.local/bin
54+ - CABALHOME=$HOME/.cabal
60− - "PATH=/opt/ghc/bin:/opt/ghc-ppa-tools/bin:$HOME/local/bin:$PATH"
55+ - export PATH="$CABALHOME/bin:$PATH"
56+ - TOP=$(pwd)
61 - HCNUMVER=$(( $(${HC} --numeric-version|sed -E 's/([0-9]+)\.([0-9]+)\.([0-9]+).*/\1 * 10000 + \2 * 100 + \3/') ))
57 - HCNUMVER=$(( $(${HC} --numeric-version|sed -E 's/([0-9]+)\.([0-9]+)\.([0-9]+).*/\1 * 10000 + \2 * 100 + \3/') ))
62 - echo $HCNUMVER
58 - echo $HCNUMVER
63−
59+ - CABAL="$CABAL -vnormal+nowrap+markoutput"
60+ - set -o pipefail
61+ - |
62+ echo 'function blue(s) { printf "\033[0;34m" s "\033[0m " }' >> .colorful.awk
63+ echo 'BEGIN { state = "output"; }' >> .colorful.awk
64+ echo '/^-----BEGIN CABAL OUTPUT-----$/ { state = "cabal" }' >> .colorful.awk
65+ echo '/^-----END CABAL OUTPUT-----$/ { state = "output" }' >> .colorful.awk
66+ echo '!/^(-----BEGIN CABAL OUTPUT-----|-----END CABAL OUTPUT-----)/ {' >> .colorful.awk
67+ echo ' if (state == "cabal") {' >> .colorful.awk
68+ echo ' print blue($0)' >> .colorful.awk
69+ echo ' } else {' >> .colorful.awk
70+ echo ' print $0' >> .colorful.awk
71+ echo ' }' >> .colorful.awk
72+ echo '}' >> .colorful.awk
73+ - cat .colorful.awk
74+ - |
75+ color_cabal_output () {
76+ awk -f $TOP/.colorful.awk
77+ }
78+ - echo text | color_cabal_output
64install:
79install:
65− - cabal --version
80+ - ${CABAL} --version
66 - echo "$(${HC} --version) [$(${HC} --print-project-git-commit-id 2> /dev/null || echo '?')]"
81 - echo "$(${HC} --version) [$(${HC} --print-project-git-commit-id 2> /dev/null || echo '?')]"
82+ - TEST=--enable-tests
67− - BENCH=${BENCH---enable-benchmarks}
83+ - BENCH=--enable-benchmarks
68− - TEST=${TEST---enable-tests}
69− - HADDOCK=${HADDOCK-true}
70− - UNCONSTRAINED=${UNCONSTRAINED-true}
71− - NOINSTALLEDCONSTRAINTS=${NOINSTALLEDCONSTRAINTS-false}
72 - GHCHEAD=${GHCHEAD-false}
84 - GHCHEAD=${GHCHEAD-false}
85+ - rm -f $CABALHOME/config
86+ - |
87+ echo "verbose: normal +nowrap +markoutput" >> $CABALHOME/config
88+ echo "remote-build-reporting: anonymous" >> $CABALHOME/config
89+ echo "remote-repo-cache: $CABALHOME/packages" >> $CABALHOME/config
90+ echo "logs-dir: $CABALHOME/logs" >> $CABALHOME/config
91+ echo "world-file: $CABALHOME/world" >> $CABALHOME/config
92+ echo "extra-prog-path: $CABALHOME/bin" >> $CABALHOME/config
93+ echo "symlink-bindir: $CABALHOME/bin" >> $CABALHOME/config
94+ echo "installdir: $CABALHOME/bin" >> $CABALHOME/config
95+ echo "build-summary: $CABALHOME/logs/build.log" >> $CABALHOME/config
96+ echo "store-dir: $CABALHOME/store" >> $CABALHOME/config
97+ echo "install-dirs user" >> $CABALHOME/config
98+ echo " prefix: $CABALHOME" >> $CABALHOME/config
99+ echo "repository hackage.haskell.org" >> $CABALHOME/config
100+ echo " url: http://hackage.haskell.org/" >> $CABALHOME/config
101+ - |
102+ if $GHCHEAD; then
103+ echo "allow-newer: $($HCPKG list --simple-output | sed -E 's/([a-zA-Z-]+)-[0-9.]+/*:\1/g')" >> $CABALHOME/config
104+
105+ echo "repository head.hackage" >> $CABALHOME/config
106+ echo " url: http://head.hackage.haskell.org/" >> $CABALHOME/config
107+ echo " secure: True" >> $CABALHOME/config
108+ echo " root-keys: 07c59cb65787dedfaef5bd5f987ceb5f7e5ebf88b904bbd4c5cbdeb2ff71b740" >> $CABALHOME/config
109+ echo " 2e8555dde16ebd8df076f1a8ef13b8f14c66bad8eafefd7d9e37d0ed711821fb" >> $CABALHOME/config
110+ echo " 8f79fd2389ab2967354407ec852cbe73f2e8635793ac446d09461ffb99527f6e" >> $CABALHOME/config
111+ echo " key-threshold: 3" >> $CABALHOME/config
112+ fi
113+ - cat $CABALHOME/config
114+ - rm -fv cabal.project cabal.project.local cabal.project.freeze
73− - travis_retry cabal update -v
115+ - travis_retry ${CABAL} v2-update -v
74− - "sed -i.bak 's/^jobs:/-- jobs:/' ${HOME}/.cabal/config"
116+ # Generate cabal.project
75− - rm -fv cabal.project cabal.project.local
117+ - rm -rf cabal.project cabal.project.local cabal.project.freeze
76− - "if [ $HCNUMVER -ge 70800 ]; then sed -i.bak 's/-- ghc-options:.*/ghc-options: -j2/' ${HOME}/.cabal/config; fi"
77− - grep -Ev -- '^\s*--' ${HOME}/.cabal/config | grep -Ev '^\s*$'
78− - "printf 'packages: \".\"\\n' > cabal.project"
79− - touch cabal.project.local
118+ - touch cabal.project
119+ - |
120+ echo 'packages: "."' >> cabal.project
121+ - |
122+ echo "write-ghc-environment-files: always" >> cabal.project
80− - "if ! $NOINSTALLEDCONSTRAINTS; then for pkg in $($HCPKG list --simple-output); do echo $pkg | grep -vw -- http-api-data | sed 's/^/constraints: /' | sed 's/-[^-]*$/ installed/' >> cabal.project.local; done; fi"
123+ - "for pkg in $($HCPKG list --simple-output); do echo $pkg | sed 's/-[^-]*$//' | (grep -vE -- '^(http-api-data)$' || true) | sed 's/^/constraints: /' | sed 's/$/ installed/' >> cabal.project.local; done"
81 - cat cabal.project || true
124 - cat cabal.project || true
82 - cat cabal.project.local || true
125 - cat cabal.project.local || true
83− - if [ -f "./configure.ac" ]; then
126+ - if [ -f "./configure.ac" ]; then (cd "." && autoreconf -i); fi
84− (cd "." && autoreconf -i);
127+ - ${CABAL} v2-freeze -w ${HC} ${TEST} ${BENCH} | color_cabal_output
85− fi
128+ - "cat cabal.project.freeze | sed -E 's/^(constraints: *| *)//' | sed 's/any.//'"
86− - rm -f cabal.project.freeze
129+ - rm cabal.project.freeze
87− - cabal new-build -w ${HC} ${TEST} ${BENCH} --project-file="cabal.project" --dep -j2 all
130+ - ${CABAL} v2-build -w ${HC} ${TEST} ${BENCH} --dep -j2 all | color_cabal_output
88− - cabal new-build -w ${HC} --disable-tests --disable-benchmarks --project-file="cabal.project" --dep -j2 all
131+ - ${CABAL} v2-build -w ${HC} --disable-tests --disable-benchmarks --dep -j2 all | color_cabal_output
89− - rm -rf .ghc.environment.* "."/dist
90− - DISTDIR=$(mktemp -d /tmp/dist-test.XXXX)
91−
92−# Here starts the actual work to be performed for the package under test;
93−# any command which exits with a non-zero exit code causes the build to fail.
94script:
132script:
95− # test that source-distributions can be generated
133+ - DISTDIR=$(mktemp -d /tmp/dist-test.XXXX)
96− - cabal new-sdist all
134+ # Packaging...
135+ - ${CABAL} v2-sdist all | color_cabal_output
136+ # Unpacking...
97 - mv dist-newstyle/sdist/*.tar.gz ${DISTDIR}/
137 - mv dist-newstyle/sdist/*.tar.gz ${DISTDIR}/
98 - cd ${DISTDIR} || false
138 - cd ${DISTDIR} || false
99 - find . -maxdepth 1 -name '*.tar.gz' -exec tar -xvf '{}' \;
139 - find . -maxdepth 1 -name '*.tar.gz' -exec tar -xvf '{}' \;
140+ # Generate cabal.project
141+ - rm -rf cabal.project cabal.project.local cabal.project.freeze
142+ - touch cabal.project
143+ - |
100− - "printf 'packages: http-api-data-*/*.cabal\\n' > cabal.project"
144+ echo 'packages: "http-api-data-*/*.cabal"' >> cabal.project
101− - touch cabal.project.local
145+ - |
146+ echo "write-ghc-environment-files: always" >> cabal.project
102− - "if ! $NOINSTALLEDCONSTRAINTS; then for pkg in $($HCPKG list --simple-output); do echo $pkg | grep -vw -- http-api-data | sed 's/^/constraints: /' | sed 's/-[^-]*$/ installed/' >> cabal.project.local; done; fi"
147+ - "for pkg in $($HCPKG list --simple-output); do echo $pkg | sed 's/-[^-]*$//' | (grep -vE -- '^(http-api-data)$' || true) | sed 's/^/constraints: /' | sed 's/$/ installed/' >> cabal.project.local; done"
103 - cat cabal.project || true
148 - cat cabal.project || true
104 - cat cabal.project.local || true
149 - cat cabal.project.local || true
150+ # Building...
105 # this builds all libraries and executables (without tests/benchmarks)
151 # this builds all libraries and executables (without tests/benchmarks)
106− - cabal new-build -w ${HC} --disable-tests --disable-benchmarks all
152+ - ${CABAL} v2-build -w ${HC} --disable-tests --disable-benchmarks all | color_cabal_output
107−
153+ # Building with tests and benchmarks...
108 # build & run tests, build benchmarks
154 # build & run tests, build benchmarks
109− - cabal new-build -w ${HC} ${TEST} ${BENCH} all
155+ - ${CABAL} v2-build -w ${HC} ${TEST} ${BENCH} all | color_cabal_output
110− - if [ "x$TEST" = "x--enable-tests" ]; then cabal new-test -w ${HC} ${TEST} ${BENCH} all; fi
156+ # Testing...
111−
157+ - ${CABAL} v2-test -w ${HC} ${TEST} ${BENCH} all | color_cabal_output
112− # cabal check
158+ # cabal check...
113− - (cd http-api-data-* && cabal check)
159+ - (cd http-api-data-* && ${CABAL} -vnormal check)
114−
115− # haddock
160+ # haddock...
116− - if $HADDOCK; then cabal new-haddock -w ${HC} ${TEST} ${BENCH} all; else echo "Skipping haddock generation";fi
161+ - ${CABAL} v2-haddock -w ${HC} ${TEST} ${BENCH} all | color_cabal_output
117−
118− # Build without installed constraints for packages in global-db
162+ # Building without installed constraints for packages in global-db...
119− - if $UNCONSTRAINED; then rm -f cabal.project.local; echo cabal new-build -w ${HC} --disable-tests --disable-benchmarks all; else echo "Not building without installed constraints"; fi
163+ - rm -f cabal.project.local
164+ - ${CABAL} v2-build -w ${HC} --disable-tests --disable-benchmarks all | color_cabal_output
165+ # Constraint sets
166+ - rm -rf cabal.project.local
167+ # Constraint set text-show
168+ - ${CABAL} v2-build -w ${HC} --disable-tests --disable-benchmarks --constraint='http-api-data +use-text-show' all | color_cabal_output
120
169
121−# REGENDATA ["--config","--output",".travis.yml","http-api-data.cabal"]
170+# REGENDATA ["--config=cabal.haskell-ci","http-api-data.cabal"]
122# EOF
171# EOF
CHANGELOG.md+5
@@ -1,3 +1,8 @@
1+0.4.1
2+-----
3+
4+* Use `time-compat` to provide instances for `DayOfWeek`.
5+
10.4
60.4
2---
7---
3
8
cabal.haskell-cinew file+4
@@ -0,0 +1,4 @@
1+branches: master
2+
3+constraint-set text-show
4+ constraints: http-api-data +use-text-show
cabal.make-travis-ymldeleted−2
@@ -1,2 +0,0 @@
1−jobs: :2
2−branches: master
cabal.projectnew file+2
@@ -0,0 +1,2 @@
1+packages: .
2+tests: true
http-api-data.cabal+19−15
@@ -1,6 +1,6 @@
1cabal-version: >= 1.10
1cabal-version: >= 1.10
2name: http-api-data
2name: http-api-data
3−version: 0.4
3+version: 0.4.1
4
4
5synopsis: 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.
6category: Web
6category: Web
@@ -29,7 +29,8 @@ tested-with:
29 GHC==8.0.2,
29 GHC==8.0.2,
30 GHC==8.2.2,
30 GHC==8.2.2,
31 GHC==8.4.4,
31 GHC==8.4.4,
32− GHC==8.6.2
32+ GHC==8.6.5,
33+ GHC==8.8.1
33
34
34custom-setup
35custom-setup
35 setup-depends:
36 setup-depends:
@@ -51,7 +52,10 @@ library
51 , bytestring >= 0.10.4.0 && < 0.11
52 , bytestring >= 0.10.4.0 && < 0.11
52 , containers >= 0.5.5.1 && < 0.7
53 , containers >= 0.5.5.1 && < 0.7
53 , text >= 1.2.3.0 && < 1.3
54 , text >= 1.2.3.0 && < 1.3
54− , time >= 1.4.2 && < 1.9
55+
56+ -- so Semigroup Builder exists
57+ if impl(ghc >= 8.0)
58+ build-depends: bytestring >= 0.10.8.1
55
59
56 -- other-dependencies
60 -- other-dependencies
57 build-depends:
61 build-depends:
@@ -59,24 +63,24 @@ library
59 , attoparsec-iso8601 >= 1.0.1.0 && < 1.1
63 , attoparsec-iso8601 >= 1.0.1.0 && < 1.1
60 , base-compat >= 0.10.5 && < 0.11
64 , base-compat >= 0.10.5 && < 0.11
61 , cookie >= 0.4.3 && < 0.4.5
65 , cookie >= 0.4.3 && < 0.4.5
62− , hashable >= 1.2.7.0 && < 1.3
66+ , hashable >= 1.2.7.0 && < 1.4
63− , http-types >= 0.12.2 && < 0.13
67+ , http-types >= 0.12.3 && < 0.13
64 , tagged >= 0.8.5 && < 0.9
68 , tagged >= 0.8.5 && < 0.9
65− , time-locale-compat >= 0.1.1.5 && < 0.2
69+ , time-compat >= 1.9.2 && < 1.10
66− , unordered-containers >= 0.2.9.0 && < 0.3
70+ , unordered-containers >= 0.2.10.0 && < 0.3
67 , uuid-types >= 1.0.3 && <1.1
71 , uuid-types >= 1.0.3 && <1.1
68
72
69 if !impl(ghc >= 7.10)
73 if !impl(ghc >= 7.10)
70 build-depends:
74 build-depends:
71 nats >= 1.1.2 && < 1.2,
75 nats >= 1.1.2 && < 1.2,
72− void >= 0.7.2 && < 0.8
76+ void >= 0.7.3 && < 0.8
73
77
74 if !impl(ghc >= 8.0)
78 if !impl(ghc >= 8.0)
75− build-depends: semigroups >= 0.18.5 && < 0.19
79+ build-depends: semigroups >= 0.18.5 && < 0.20
76
80
77 if flag(use-text-show)
81 if flag(use-text-show)
78 cpp-options: -DUSE_TEXT_SHOW
82 cpp-options: -DUSE_TEXT_SHOW
79− build-depends: text-show >= 3.7.4 && <3.8
83+ build-depends: text-show >= 3.8.2 && <3.9
80
84
81 exposed-modules:
85 exposed-modules:
82 Web.HttpApiData
86 Web.HttpApiData
@@ -96,7 +100,7 @@ test-suite spec
96 hs-source-dirs: test
100 hs-source-dirs: test
97 ghc-options: -Wall
101 ghc-options: -Wall
98 default-language: Haskell2010
102 default-language: Haskell2010
99− build-tool-depends: hspec-discover:hspec-discover >= 2.6.0 && <2.7
103+ build-tool-depends: hspec-discover:hspec-discover >= 2.7.1 && <2.8
100 -- inherited depndencies
104 -- inherited depndencies
101 build-depends:
105 build-depends:
102 base
106 base
@@ -106,14 +110,14 @@ test-suite spec
106 , http-api-data
110 , http-api-data
107 , nats
111 , nats
108 , text
112 , text
109− , time
113+ , time-compat
110 , unordered-containers
114 , unordered-containers
111 , uuid-types
115 , uuid-types
112
116
113 build-depends: HUnit >= 1.6.0.0 && <1.7
117 build-depends: HUnit >= 1.6.0.0 && <1.7
114− , hspec >= 2.6.0 && <2.7
118+ , hspec >= 2.7.1 && <2.8
115− , QuickCheck >= 2.11.3 && <2.13
119+ , QuickCheck >= 2.13.1 && <2.14
116− , quickcheck-instances >= 0.3.19 && <0.4
120+ , quickcheck-instances >= 0.3.21 && <0.4
117
121
118test-suite doctests
122test-suite doctests
119 ghc-options: -Wall
123 ghc-options: -Wall
src/Web/HttpApiData.hs+1−2
@@ -49,10 +49,9 @@ import Web.Internal.HttpApiData
49--
49--
50-- >>> :set -XOverloadedStrings
50-- >>> :set -XOverloadedStrings
51-- >>> import Control.Applicative
51-- >>> import Control.Applicative
52−-- >>> import Data.Time
52+-- >>> import Data.Time.Compat
53-- >>> import Data.Int
53-- >>> import Data.Int
54-- >>> import Data.Text (Text)
54-- >>> import Data.Text (Text)
55−-- >>> import Data.Time (Day)
56-- >>> import Data.Version
55-- >>> import Data.Version
57
56
58-- $examples
57-- $examples
src/Web/Internal/FormUrlEncoded.hs+1−1
@@ -48,7 +48,7 @@ import qualified Data.Text as Text
48import qualified Data.Text.Encoding as Text
48import qualified Data.Text.Encoding as Text
49import Data.Text.Encoding.Error (lenientDecode)
49import Data.Text.Encoding.Error (lenientDecode)
50import qualified Data.Text.Lazy as Lazy
50import qualified Data.Text.Lazy as Lazy
51−import Data.Time (Day, LocalTime, NominalDiffTime,
51+import Data.Time.Compat (Day, LocalTime, NominalDiffTime,
52 UTCTime, ZonedTime)
52 UTCTime, ZonedTime)
53import Data.Void (Void)
53import Data.Void (Void)
54import Data.Word (Word16, Word32, Word64, Word8)
54import Data.Word (Word16, Word32, Word64, Word8)
src/Web/Internal/HttpApiData.hs+32−28
@@ -28,6 +28,7 @@ import Data.Coerce (coerce)
28import Data.Data (Data)
28import Data.Data (Data)
29import qualified Data.Fixed as F
29import qualified Data.Fixed as F
30import Data.Int (Int16, Int32, Int64, Int8)
30import Data.Int (Int16, Int32, Int64, Int8)
31+import qualified Data.Map as Map
31import Data.Monoid (All (..), Any (..), Dual (..),
32import Data.Monoid (All (..), Any (..), Dual (..),
32 First (..), Last (..),
33 First (..), Last (..),
33 Product (..), Sum (..))
34 Product (..), Sum (..))
@@ -42,10 +43,13 @@ import Data.Text.Encoding.Error (lenientDecode)
42import qualified Data.Text.Lazy as L
43import qualified Data.Text.Lazy as L
43import Data.Text.Read (Reader, decimal, rational,
44import Data.Text.Read (Reader, decimal, rational,
44 signed)
45 signed)
45−import Data.Time (Day, FormatTime, LocalTime,
46+import Data.Time.Compat (Day, FormatTime, LocalTime,
46 NominalDiffTime, TimeOfDay,
47 NominalDiffTime, TimeOfDay,
47− UTCTime, ZonedTime, formatTime)
48+ UTCTime, ZonedTime, formatTime,
49+ DayOfWeek (..),
50+ nominalDiffTimeToSeconds,
51+ secondsToNominalDiffTime)
48−import Data.Time.Locale.Compat (defaultTimeLocale,
52+import Data.Time.Format.Compat (defaultTimeLocale,
49 iso8601DateFormat)
53 iso8601DateFormat)
50import Data.Typeable (Typeable)
54import Data.Typeable (Typeable)
51import qualified Data.UUID.Types as UUID
55import qualified Data.UUID.Types as UUID
@@ -60,10 +64,6 @@ import Text.Read (readMaybe)
60import Web.Cookie (SetCookie, parseSetCookie,
64import Web.Cookie (SetCookie, parseSetCookie,
61 renderSetCookie)
65 renderSetCookie)
62
66
63−#if MIN_VERSION_time(1,9,1)
64−import Data.Time (nominalDiffTimeToSeconds,
65− secondsToNominalDiffTime)
66−#endif
67
67
68#if USE_TEXT_SHOW
68#if USE_TEXT_SHOW
69import TextShow (TextShow, showt)
69import TextShow (TextShow, showt)
@@ -75,7 +75,7 @@ import TextShow (TextShow, showt)
75-- $setup
75-- $setup
76-- >>> data BasicAuthToken = BasicAuthToken Text deriving (Show)
76-- >>> data BasicAuthToken = BasicAuthToken Text deriving (Show)
77-- >>> instance FromHttpApiData BasicAuthToken where parseHeader h = BasicAuthToken <$> parseHeaderWithPrefix "Basic " h; parseQueryParam p = BasicAuthToken <$> parseQueryParam p
77-- >>> instance FromHttpApiData BasicAuthToken where parseHeader h = BasicAuthToken <$> parseHeaderWithPrefix "Basic " h; parseQueryParam p = BasicAuthToken <$> parseQueryParam p
78−-- >>> import Data.Time
78+-- >>> import Data.Time.Compat
79-- >>> import Data.Version
79-- >>> import Data.Version
80
80
81-- | Convert value to HTTP API data.
81-- | Convert value to HTTP API data.
@@ -495,28 +495,23 @@ instance ToHttpApiData UTCTime where
495 toUrlPiece = timeToUrlPiece "%H:%M:%S%QZ"
495 toUrlPiece = timeToUrlPiece "%H:%M:%S%QZ"
496 toEncodedUrlPiece = unsafeToEncodedUrlPiece
496 toEncodedUrlPiece = unsafeToEncodedUrlPiece
497
497
498−-- The CPP in both this function and the function after it are to avoid
498+-- |
499−-- exporting @nominalDiffTimeToSeconds@ and @secondsToNominalDiffTime@,
499+-- >>> toUrlPiece Monday
500−-- since these names are already used by @Data.Time@ from the @time@ library
500+-- "monday"
501−-- starting in version @1.9.1@.
501+instance ToHttpApiData DayOfWeek where
502−nominalDiffTimeToSecs :: NominalDiffTime -> F.Pico
502+ toUrlPiece Monday = "monday"
503−nominalDiffTimeToSecs =
503+ toUrlPiece Tuesday = "tuesday"
504−#if !MIN_VERSION_time(1,9,1)
504+ toUrlPiece Wednesday = "wednesday"
505− realToFrac
505+ toUrlPiece Thursday = "thursday"
506−#else
506+ toUrlPiece Friday = "friday"
507− nominalDiffTimeToSeconds
507+ toUrlPiece Saturday = "saturday"
508−#endif
508+ toUrlPiece Sunday = "sunday"
509+
510+ toEncodedUrlPiece = unsafeToEncodedUrlPiece
509
511
510−secsToNominalDiffTime :: F.Pico -> NominalDiffTime
511−secsToNominalDiffTime =
512−#if !MIN_VERSION_time(1,9,1)
513− realToFrac
514−#else
515− secondsToNominalDiffTime
516−#endif
517
512
518instance ToHttpApiData NominalDiffTime where
513instance ToHttpApiData NominalDiffTime where
519− toUrlPiece = toUrlPiece . nominalDiffTimeToSecs
514+ toUrlPiece = toUrlPiece . nominalDiffTimeToSeconds
520 toEncodedUrlPiece = unsafeToEncodedUrlPiece
515 toEncodedUrlPiece = unsafeToEncodedUrlPiece
521
516
522instance ToHttpApiData String where toUrlPiece = T.pack
517instance ToHttpApiData String where toUrlPiece = T.pack
@@ -686,7 +681,16 @@ instance FromHttpApiData ZonedTime where parseUrlPiece = runAtto Atto.zonedTime
686-- Right 2015-10-03 00:14:24 UTC
681-- Right 2015-10-03 00:14:24 UTC
687instance FromHttpApiData UTCTime where parseUrlPiece = runAtto Atto.utcTime
682instance FromHttpApiData UTCTime where parseUrlPiece = runAtto Atto.utcTime
688
683
684+instance FromHttpApiData DayOfWeek where
685+ parseUrlPiece t = case Map.lookup (T.toLower t) m of
686+ Just dow -> Right dow
687+ Nothing -> Left $ "Incorrect DayOfWeek: " <> T.take 10 t
688+ where
689+ m :: Map.Map Text DayOfWeek
690+ m = Map.fromList [ (toUrlPiece dow, dow) | dow <- [Monday .. Sunday] ]
691+
692+
689−instance FromHttpApiData NominalDiffTime where parseUrlPiece = fmap secsToNominalDiffTime . parseUrlPiece
693+instance FromHttpApiData NominalDiffTime where parseUrlPiece = fmap secondsToNominalDiffTime . parseUrlPiece
690
694
691instance FromHttpApiData All where parseUrlPiece = coerce (parseUrlPiece :: Text -> Either Text Bool)
695instance FromHttpApiData All where parseUrlPiece = coerce (parseUrlPiece :: Text -> Either Text Bool)
692instance FromHttpApiData Any where parseUrlPiece = coerce (parseUrlPiece :: Text -> Either Text Bool)
696instance FromHttpApiData Any where parseUrlPiece = coerce (parseUrlPiece :: Text -> Either Text Bool)
test/Web/Internal/HttpApiDataSpec.hs+2−1
@@ -13,7 +13,7 @@ import Data.Int
13import qualified Data.Text as T
13import qualified Data.Text as T
14import qualified Data.Text.Encoding as TE
14import qualified Data.Text.Encoding as TE
15import qualified Data.Text.Lazy as L
15import qualified Data.Text.Lazy as L
16−import Data.Time
16+import Data.Time.Compat
17import qualified Data.UUID.Types as UUID
17import qualified Data.UUID.Types as UUID
18import Data.Version
18import Data.Version
19import Data.Word
19import Data.Word
@@ -86,6 +86,7 @@ spec = do
86 checkUrlPiece (Proxy :: Proxy ZonedTime) "ZonedTime"
86 checkUrlPiece (Proxy :: Proxy ZonedTime) "ZonedTime"
87 checkUrlPiece (Proxy :: Proxy UTCTime) "UTCTime"
87 checkUrlPiece (Proxy :: Proxy UTCTime) "UTCTime"
88 checkUrlPiece (Proxy :: Proxy NominalDiffTime) "NominalDiffTime"
88 checkUrlPiece (Proxy :: Proxy NominalDiffTime) "NominalDiffTime"
89+ checkUrlPiece (Proxy :: Proxy DayOfWeek) "DayOfWeek"
89 checkUrlPiece (Proxy :: Proxy Version) "Version"
90 checkUrlPiece (Proxy :: Proxy Version) "Version"
90 checkUrlPiece (Proxy :: Proxy UUID.UUID) "UUID"
91 checkUrlPiece (Proxy :: Proxy UUID.UUID) "UUID"
91 checkUrlPiece' setCookieGen "Cookie"
92 checkUrlPiece' setCookieGen "Cookie"
test/Web/Internal/TestInstances.hs+1−1
@@ -12,7 +12,7 @@ import Control.Applicative
12import Data.Char
12import Data.Char
13import qualified Data.HashMap.Strict as HashMap
13import qualified Data.HashMap.Strict as HashMap
14import qualified Data.Text as T
14import qualified Data.Text as T
15−import Data.Time
15+import Data.Time.Compat
16import GHC.Exts (fromList)
16import GHC.Exts (fromList)
17import GHC.Generics
17import GHC.Generics
18
18