git.iko.soy/typeable/http-api-data
on master help sign in
Merge pull request #84 from phadej/squashed-83

Squashed 83

commit1beba5acbbc894b9e4a7968148c08bf9a19402e8 authorOleg Grenrus <oleg.grenrus@iki.fi> dateMon 24 Sep 2018, 23:54 (8 years ago) parent409923cff11afe
10 files changed+115−192
.travis.yml+9−19 cabal.make-travis-yml−54 http-api-data.cabal+33−20 src/Web/FormUrlEncoded.hs+1−1 src/Web/HttpApiData.hs+1−1 src/Web/Internal/FormUrlEncoded.hs+13−13 src/Web/Internal/HttpApiData.hs+57−39 stack-ghc-7.10.yaml−12 stack-ghc-7.8.yaml−26 stack.yaml+1−7
.travis.yml+9−19
@@ -2,7 +2,7 @@
22#
33# runghc make_travis_yml_2.hs '--config' '--output' '.travis.yml' 'http-api-data.cabal'
44#
5−# For more information, see https://github.com/hvr/multi-ghc-travis
5+# For more information, see https://github.com/haskell-CI/haskell-ci
66#
77language: c
88sudo: false
@@ -32,21 +32,24 @@ before_cache:
3232
3333matrix:
3434 include:
35+ - compiler: "ghc-8.6.1"
36+ # env: TEST=--disable-tests BENCH=--disable-benchmarks
37+ addons: {apt: {packages: [ghc-ppa-tools,cabal-install-2.4,ghc-8.6.1], sources: [hvr-ghc]}}
3538 - compiler: "ghc-8.4.3"
3639 # env: TEST=--disable-tests BENCH=--disable-benchmarks
37− addons: {apt: {packages: [ghc-ppa-tools,cabal-install-2.2,ghc-8.4.3], sources: [hvr-ghc]}}
40+ addons: {apt: {packages: [ghc-ppa-tools,cabal-install-2.4,ghc-8.4.3], sources: [hvr-ghc]}}
3841 - compiler: "ghc-8.2.2"
3942 # env: TEST=--disable-tests BENCH=--disable-benchmarks
40− addons: {apt: {packages: [ghc-ppa-tools,cabal-install-2.2,ghc-8.2.2], sources: [hvr-ghc]}}
43+ addons: {apt: {packages: [ghc-ppa-tools,cabal-install-2.4,ghc-8.2.2], sources: [hvr-ghc]}}
4144 - compiler: "ghc-8.0.2"
4245 # env: TEST=--disable-tests BENCH=--disable-benchmarks
43− addons: {apt: {packages: [ghc-ppa-tools,cabal-install-2.2,ghc-8.0.2], sources: [hvr-ghc]}}
46+ addons: {apt: {packages: [ghc-ppa-tools,cabal-install-2.4,ghc-8.0.2], sources: [hvr-ghc]}}
4447 - compiler: "ghc-7.10.3"
4548 # env: TEST=--disable-tests BENCH=--disable-benchmarks
46− addons: {apt: {packages: [ghc-ppa-tools,cabal-install-2.2,ghc-7.10.3], sources: [hvr-ghc]}}
49+ addons: {apt: {packages: [ghc-ppa-tools,cabal-install-2.4,ghc-7.10.3], sources: [hvr-ghc]}}
4750 - compiler: "ghc-7.8.4"
4851 # env: TEST=--disable-tests BENCH=--disable-benchmarks
49− addons: {apt: {packages: [ghc-ppa-tools,cabal-install-2.2,ghc-7.8.4], sources: [hvr-ghc]}}
52+ addons: {apt: {packages: [ghc-ppa-tools,cabal-install-2.4,ghc-7.8.4], sources: [hvr-ghc]}}
5053
5154before_install:
5255 - HC=${CC}
@@ -116,18 +119,5 @@ script:
116119 # Build without installed constraints for packages in global-db
117120 - 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
118121
119− # Constraint sets
120− - rm -rf cabal.project.local
121−
122− # Constraint set lower-bounds-7.8.4
123− - if [ $HCNUMVER -eq 70804 ]; then cabal new-build -w ${HC} --disable-tests --disable-benchmarks --constraint='attoparsec ==0.13.0.1' --constraint='attoparsec-iso8601 ==1.0.0.0' --constraint='bytestring ==0.10.4.0' --constraint='containers ==0.5.5.1' --constraint='hashable ==1.1.2.4' --constraint='http-types ==0.8.6' --constraint='semigroups ==0.16' --constraint='text ==1.1.1.3' --constraint='time ==1.4.2' --constraint='time-local-compat ==0.1.1.0' --constraint='unordered-containers ==0.2.6.0' --constraint='uri-bytestring ==0.1.7' --constraint='uuid-types ==1.0.2' all; else echo skipping...; fi
124−
125− # Constraint set lower-bounds-7.10.3
126− - if [ $HCNUMVER -eq 71003 ]; then cabal new-build -w ${HC} --disable-tests --disable-benchmarks --constraint='attoparsec ==0.13.0.1' --constraint='attoparsec-iso8601 ==1.0.0.0' --constraint='bytestring ==0.10.6.0' --constraint='containers ==0.5.6.1' --constraint='hashable ==1.2.3.2' --constraint='http-types ==0.8.6' --constraint='semigroups ==0.16.0.1' --constraint='text ==1.2.0.2' --constraint='time ==1.5.0.1' --constraint='time-local-compat ==0.1.1.0' --constraint='unordered-containers ==0.2.6.0' --constraint='uri-bytestring ==0.1.7' --constraint='uuid-types ==1.0.2' all; else echo skipping...; fi
127−
128− # Constraint set lower-bounds-8.0.2
129− - if [ $HCNUMVER -eq 80002 ]; then cabal new-build -w ${HC} --disable-tests --disable-benchmarks --constraint='attoparsec ==0.13.0.1' --constraint='attoparsec-iso8601 ==1.0.0.0' --constraint='bytestring ==0.10.6.0' --constraint='containers ==0.5.7.0' --constraint='hashable ==1.2.4.0' --constraint='http-types ==0.8.6' --constraint='text ==1.2.2.0' --constraint='time ==1.5.0.1' --constraint='time-local-compat ==0.1.1.0' --constraint='unordered-containers ==0.2.6.0' --constraint='uri-bytestring ==0.2.1.0' --constraint='uuid-types ==1.0.2' all; else echo skipping...; fi
130−
131−
132122# REGENDATA ["--config","--output",".travis.yml","http-api-data.cabal"]
133123# EOF
cabal.make-travis-yml−54
@@ -1,56 +1,2 @@
11jobs: :2
22branches: master
3−
4−-- we use http-types ==0.8.6
5−-- because build plan has blaze-builder-0.4
6−--
7−-- strict lower-bound for http-types ==0.8.3,
8−constraint-set lower-bounds-7.8.4
9− ghc: == 7.8.4
10− constraints:
11− attoparsec ==0.13.0.1,
12− attoparsec-iso8601 ==1.0.0.0,
13− bytestring ==0.10.4.0,
14− containers ==0.5.5.1,
15− hashable ==1.1.2.4,
16− http-types ==0.8.6,
17− semigroups ==0.16,
18− text ==1.1.1.3,
19− time ==1.4.2,
20− time-local-compat ==0.1.1.0,
21− unordered-containers ==0.2.6.0,
22− uri-bytestring ==0.1.7,
23− uuid-types ==1.0.2
24−
25−constraint-set lower-bounds-7.10.3
26− ghc: == 7.10.3
27− constraints:
28− attoparsec ==0.13.0.1,
29− attoparsec-iso8601 ==1.0.0.0,
30− bytestring ==0.10.6.0,
31− containers ==0.5.6.1,
32− hashable ==1.2.3.2,
33− http-types ==0.8.6,
34− semigroups ==0.16.0.1,
35− text ==1.2.0.2,
36− time ==1.5.0.1,
37− time-local-compat ==0.1.1.0,
38− unordered-containers ==0.2.6.0,
39− uri-bytestring ==0.1.7,
40− uuid-types ==1.0.2
41−
42−constraint-set lower-bounds-8.0.2
43− ghc: == 8.0.2
44− constraints:
45− attoparsec ==0.13.0.1,
46− attoparsec-iso8601 ==1.0.0.0,
47− bytestring ==0.10.6.0,
48− containers ==0.5.7.0,
49− hashable ==1.2.4.0,
50− http-types ==0.8.6,
51− text ==1.2.2.0,
52− time ==1.5.0.1,
53− time-local-compat ==0.1.1.0,
54− unordered-containers ==0.2.6.0,
55− uri-bytestring ==0.2.1.0,
56− uuid-types ==1.0.2
http-api-data.cabal+33−20
@@ -24,7 +24,8 @@ tested-with:
2424 GHC==7.10.3,
2525 GHC==8.0.2,
2626 GHC==8.2.2,
27− GHC==8.4.3
27+ GHC==8.4.3,
28+ GHC==8.6.1
2829
2930custom-setup
3031 setup-depends:
@@ -40,23 +41,32 @@ flag use-text-show
4041library
4142 hs-source-dirs: src/
4243 include-dirs: include/
43− build-depends: base >= 4.7 && < 4.12
44− , attoparsec >= 0.13.0.1 && < 0.14
45− , attoparsec-iso8601 >= 1.0.0.0 && < 1.1
44+
45+ -- GHC bundled
46+ build-depends: base >= 4.7 && < 4.13
4647 , bytestring >= 0.10.4.0 && < 0.11
47− , containers >= 0.5.5.1 && < 0.6
48− , hashable >= 1.1.2.4 && < 1.3
49− , http-types >= 0.8.6 && < 0.13
50− , text >= 1.1.1.3 && < 1.3
48+ , containers >= 0.5.5.1 && < 0.7
49+ , text >= 1.2.3.0 && < 1.3
5150 , time >= 1.4.2 && < 1.9
52− , time-locale-compat >= 0.1.1.0 && < 0.2
53− , unordered-containers >= 0.2.6.0 && < 0.3
54− , uuid-types >= 1.0.2 && <1.1
51+
52+ -- other-dependencies
53+ build-depends:
54+ attoparsec >= 0.13.2.2 && < 0.14
55+ , attoparsec-iso8601 >= 1.0.0.0 && < 1.1
56+ , cookie >= 0.4.3 && < 0.4.5
57+ , hashable >= 1.2.7.0 && < 1.3
58+ , http-types >= 0.12.1 && < 0.13
59+ , time-locale-compat >= 0.1.1.5 && < 0.2
60+ , unordered-containers >= 0.2.9.0 && < 0.3
61+ , uuid-types >= 1.0.3 && <1.1
62+
5563 if !impl(ghc >= 8.0)
56− build-depends: semigroups >= 0.16 && < 0.19
64+ build-depends: semigroups >= 0.18.5 && < 0.19
65+
5766 if flag(use-text-show)
5867 cpp-options: -DUSE_TEXT_SHOW
59− build-depends: text-show >= 2
68+ build-depends: text-show >= 3.7.4 && <3.8
69+
6070 exposed-modules:
6171 Web.HttpApiData
6272 Web.FormUrlEncoded
@@ -75,13 +85,11 @@ test-suite spec
7585 hs-source-dirs: test
7686 ghc-options: -Wall
7787 default-language: Haskell2010
78− build-tool-depends: hspec-discover:hspec-discover >= 2.4.7 && <2.5
79− build-depends: HUnit
80− , hspec >= 2.4.7
81− , base
88+ build-tool-depends: hspec-discover:hspec-discover >= 2.5.5 && <2.6
89+ -- inherited depndencies
90+ build-depends:
91+ base
8292 , bytestring
83− , QuickCheck >=2.9
84− , quickcheck-instances >= 0.3.12
8593 , unordered-containers
8694 , http-api-data
8795 , text
@@ -89,12 +97,17 @@ test-suite spec
8997 , bytestring
9098 , uuid-types
9199
100+ build-depends: HUnit >= 1.6.0.0 && <1.7
101+ , hspec >= 2.5.5 && <2.6
102+ , QuickCheck >= 2.11.3 && <2.13
103+ , quickcheck-instances >= 0.3.19 && <0.4
104+
92105test-suite doctests
93106 ghc-options: -Wall
94107 build-depends:
95108 base,
96109 directory >= 1.0,
97− doctest >= 0.11 && <0.17,
110+ doctest >= 0.16.0 && <0.17,
98111 filepath
99112 default-language: Haskell2010
100113 hs-source-dirs: test
src/Web/FormUrlEncoded.hs+1−1
@@ -47,5 +47,5 @@ module Web.FormUrlEncoded (
4747 urlDecodeParams,
4848) where
4949
50−import Web.Internal.FormUrlEncoded
50+import Web.Internal.FormUrlEncoded
5151
src/Web/HttpApiData.hs+1−1
@@ -43,7 +43,7 @@ module Web.HttpApiData (
4343 readTextData,
4444) where
4545
46−import Web.Internal.HttpApiData
46+import Web.Internal.HttpApiData
4747
4848-- $setup
4949--
src/Web/Internal/FormUrlEncoded.hs+13−13
@@ -1,5 +1,5 @@
1−{-# LANGUAGE ConstraintKinds #-}
21{-# LANGUAGE CPP #-}
2+{-# LANGUAGE ConstraintKinds #-}
33{-# LANGUAGE DataKinds #-}
44{-# LANGUAGE DefaultSignatures #-}
55{-# LANGUAGE DeriveGeneric #-}
@@ -18,14 +18,14 @@
1818module Web.Internal.FormUrlEncoded where
1919
2020#if __GLASGOW_HASKELL__ < 710
21−import Control.Applicative
22−import Data.Traversable
21+import Control.Applicative
22+import Data.Traversable
2323#endif
2424
2525
2626import Control.Arrow ((***))
2727import Control.Monad ((<=<))
28−import Data.ByteString.Builder (toLazyByteString, shortByteString)
28+import Data.ByteString.Builder (shortByteString, toLazyByteString)
2929import qualified Data.ByteString.Lazy as BSL
3030import qualified Data.ByteString.Lazy.Char8 as BSL8
3131import qualified Data.Foldable as F
@@ -39,30 +39,30 @@ import Data.List (intersperse, sortBy)
3939import Data.Map (Map)
4040import qualified Data.Map as Map
4141import Data.Monoid
42−import qualified Data.Semigroup as Semi
4342import Data.Ord (comparing)
43+import qualified Data.Semigroup as Semi
4444
4545import Data.Text (Text)
4646import qualified Data.Text as Text
47−import qualified Data.Text.Lazy as Lazy
4847import Data.Text.Encoding as Text
4948import Data.Text.Encoding.Error (lenientDecode)
49+import qualified Data.Text.Lazy as Lazy
5050
51−import Data.Time
5251import Data.Proxy
52+import Data.Time
5353import Data.Word
5454
5555#if MIN_VERSION_base(4,8,0)
56−import Data.Void
57−import Numeric.Natural
56+import Data.Void
57+import Numeric.Natural
5858#endif
5959
60−import GHC.Exts (IsList (..), Constraint)
60+import GHC.Exts (Constraint, IsList (..))
6161import GHC.Generics
6262import GHC.TypeLits
63−import Network.HTTP.Types.URI (urlEncodeBuilder, urlDecode)
63+import Network.HTTP.Types.URI (urlDecode, urlEncodeBuilder)
6464
65−import Web.Internal.HttpApiData
65+import Web.Internal.HttpApiData
6666
6767-- $setup
6868-- >>> :set -XDeriveGeneric
@@ -546,7 +546,7 @@ urlEncodeParams = toLazyByteString . mconcat . intersperse (shortByteString "&")
546546 escape = urlEncodeBuilder True . Text.encodeUtf8
547547
548548 encodePair (k, "") = escape k
549− encodePair (k, v) = escape k <> shortByteString "=" <> escape v
549+ encodePair (k, v) = escape k <> shortByteString "=" <> escape v
550550
551551-- | Decode an @application/x-www-form-urlencoded@ 'BSL.ByteString' to a 'Form'.
552552--
src/Web/Internal/HttpApiData.hs+57−39
@@ -1,12 +1,12 @@
1−{-# LANGUAGE CPP #-}
2−{-# LANGUAGE DefaultSignatures #-}
3−{-# LANGUAGE DeriveDataTypeable #-}
4−{-# LANGUAGE DeriveFunctor #-}
5−{-# LANGUAGE DeriveFoldable #-}
6−{-# LANGUAGE DeriveTraversable #-}
7−{-# LANGUAGE FlexibleInstances #-}
8−{-# LANGUAGE OverloadedStrings #-}
9−{-# LANGUAGE ScopedTypeVariables #-}
1+{-# LANGUAGE CPP #-}
2+{-# LANGUAGE DefaultSignatures #-}
3+{-# LANGUAGE DeriveDataTypeable #-}
4+{-# LANGUAGE DeriveFoldable #-}
5+{-# LANGUAGE DeriveFunctor #-}
6+{-# LANGUAGE DeriveTraversable #-}
7+{-# LANGUAGE FlexibleInstances #-}
8+{-# LANGUAGE OverloadedStrings #-}
9+{-# LANGUAGE ScopedTypeVariables #-}
1010{-# LANGUAGE TypeSynonymInstances #-}
1111-- |
1212-- Convert Haskell values to and from HTTP API data
@@ -14,52 +14,56 @@
1414module Web.Internal.HttpApiData where
1515
1616#if __GLASGOW_HASKELL__ < 710
17−import Control.Applicative
18−import Data.Foldable (Foldable)
19−import Data.Traversable (Traversable(traverse))
17+import Control.Applicative
18+import Data.Foldable (Foldable)
19+import Data.Traversable (Traversable (traverse))
2020#endif
2121
22−import Control.Arrow ((&&&), left)
23−import Control.Monad ((<=<))
22+import Control.Arrow (left, (&&&))
23+import Control.Monad ((<=<))
2424
25−import Data.Monoid
26−import Data.ByteString (ByteString)
27−import qualified Data.ByteString as BS
25+import Data.ByteString (ByteString)
26+import qualified Data.ByteString as BS
27+import Data.Monoid
2828
29−import Data.Int
30−import Data.Word
29+import Data.Int
30+import Data.Word
3131
32−import Data.Text (Text)
33−import Data.Text.Encoding (encodeUtf8, decodeUtf8')
34−import Data.Text.Read (signed, decimal, rational, Reader)
35−import qualified Data.Text as T
36−import qualified Data.Text.Lazy as L
32+import Data.Text (Text)
33+import qualified Data.Text as T
34+import Data.Text.Encoding (decodeUtf8', encodeUtf8)
35+import qualified Data.Text.Lazy as L
36+import Data.Text.Read (Reader, decimal, rational,
37+ signed)
3738
38−import Data.Time.Locale.Compat
39−import Data.Time
40−import Data.Version
39+import Data.Time
40+import Data.Time.Locale.Compat
41+import Data.Version
4142
4243#if MIN_VERSION_base(4,8,0)
43−import Data.Void
44−import Numeric.Natural
44+import Data.Void
45+import Numeric.Natural
4546#endif
4647
47−import Text.Read (readMaybe)
48−import Text.ParserCombinators.ReadP (readP_to_S)
48+import Text.ParserCombinators.ReadP (readP_to_S)
49+import Text.Read (readMaybe)
4950
5051#if USE_TEXT_SHOW
51−import TextShow (TextShow, showt)
52+import TextShow (TextShow, showt)
5253#endif
5354
54−import qualified Data.UUID.Types as UUID
55+import qualified Data.UUID.Types as UUID
5556
56−import Data.Typeable (Typeable)
57−import Data.Data (Data)
58−import qualified Data.ByteString.Builder as BS
59−import qualified Network.HTTP.Types as H
57+import qualified Data.ByteString.Builder as BS
58+import Data.Data (Data)
59+import Data.Typeable (Typeable)
60+import qualified Network.HTTP.Types as H
6061
61−import qualified Data.Attoparsec.Text as Atto
62−import qualified Data.Attoparsec.Time as Atto
62+import qualified Data.Attoparsec.Text as Atto
63+import qualified Data.Attoparsec.Time as Atto
64+
65+import Web.Cookie (SetCookie, parseSetCookie,
66+ renderSetCookie)
6367
6468
6569-- $setup
@@ -530,6 +534,14 @@ instance (ToHttpApiData a, ToHttpApiData b) => ToHttpApiData (Either a b) where
530534 toUrlPiece (Left x) = "left " <> toUrlPiece x
531535 toUrlPiece (Right x) = "right " <> toUrlPiece x
532536
537+-- |
538+-- >>> let Right c = parseUrlPiece "SESSID=r2t5uvjq435r4q7ib3vtdjq120" :: Either Text SetCookie
539+-- >>> toUrlPiece c
540+-- "\"SESSID=r2t5uvjq435r4q7ib3vtdjq120\""
541+instance ToHttpApiData SetCookie where
542+ toUrlPiece = showt . BS.toLazyByteString . renderSetCookie
543+ toEncodedUrlPiece = renderSetCookie
544+
533545-- |
534546-- >>> parseUrlPiece "_" :: Either Text ()
535547-- Right ()
@@ -664,6 +676,12 @@ instance FromHttpApiData a => FromHttpApiData (LenientData a) where
664676 parseHeader = Right . LenientData . parseHeader
665677 parseQueryParam = Right . LenientData . parseQueryParam
666678
679+-- |
680+-- >>> parseUrlPiece "SESSID=r2t5uvjq435r4q7ib3vtdjq120" :: Either Text SetCookie
681+-- Right (SetCookie {setCookieName = "SESSID", setCookieValue = "r2t5uvjq435r4q7ib3vtdjq120", setCookiePath = Nothing, setCookieExpires = Nothing, setCookieMaxAge = Nothing, setCookieDomain = Nothing, setCookieHttpOnly = False, setCookieSecure = False, setCookieSameSite = Nothing})
682+instance FromHttpApiData SetCookie where
683+ parseUrlPiece = parseHeader . encodeUtf8
684+ parseHeader = Right . parseSetCookie
667685-------------------------------------------------------------------------------
668686-- Attoparsec helpers
669687-------------------------------------------------------------------------------
stack-ghc-7.10.yamldeleted−12
@@ -1,12 +0,0 @@
1−resolver: lts-6.8
2−
3−packages:
4−- '.'
5−
6−flags:
7− http-api-data:
8− use-text-show: false
9−
10−extra-deps:
11−- QuickCheck-2.9.2
12−extra-package-dbs: []
stack-ghc-7.8.yamldeleted−26
@@ -1,26 +0,0 @@
1−resolver: lts-2.22
2−
3−packages:
4−- '.'
5−
6−flags:
7− http-api-data:
8− use-text-show: false
9−
10−extra-deps:
11−- time-locale-compat-0.1.1.3
12−- uri-bytestring-0.2.2.0
13−# below are dependencies necessary for use-text-show=true
14−- text-show-2.1.2
15−- base-compat-0.9.1
16−- bifunctors-5.2
17−- semigroups-0.16.2.2
18−- th-lift-0.7.6
19−- transformers-compat-0.4.0.4
20−- base-orphans-0.5.4
21−- generic-deriving-1.9.0
22−- doctest-0.11.0
23−- QuickCheck-2.9.2
24−- quickcheck-instances-0.3.12
25−- quickcheck-io-0.1.3
26−extra-package-dbs: []
stack.yaml+1−7
@@ -1,12 +1,6 @@
1−resolver: nightly-2017-04-01
2−
1+resolver: lts-12.10
32packages:
43- '.'
5−
64flags:
75 http-api-data:
86 use-text-show: false
9−
10−extra-deps:
11−- attoparsec-iso8601-1.0.0.0
12−extra-package-dbs: []