http-api-data 0.3.8.1 → 0.3.9
raw patch · 6 files changed
+128/−86 lines, 6 filesdep +cookiedep −uri-bytestringdep ~HUnitdep ~QuickCheckdep ~attoparsec
Dependencies added: cookie
Dependencies removed: uri-bytestring
Dependency ranges changed: HUnit, QuickCheck, attoparsec, base, containers, doctest, hashable, hspec, http-types, quickcheck-instances, semigroups, text, text-show, time-locale-compat, unordered-containers, uuid-types
Files
- CHANGELOG.md +9/−0
- http-api-data.cabal +45/−30
- src/Web/FormUrlEncoded.hs +1/−1
- src/Web/HttpApiData.hs +1/−1
- src/Web/Internal/FormUrlEncoded.hs +15/−15
- src/Web/Internal/HttpApiData.hs +57/−39
CHANGELOG.md view
@@ -1,3 +1,12 @@+0.3.9+---++* GHC-8.6 support+* Remove dependency on `uri-bytestring` and use functions from `http-types` instead+ (see [#75](https://github.com/fizruk/http-api-data/pull/78))+* Add support for `Cookie`+ (see [#74](https://github.com/fizruk/http-api-data/pull/74))+ 0.3.8.1 ---
http-api-data.cabal view
@@ -1,19 +1,22 @@+cabal-version: >= 1.10 name: http-api-data-version: 0.3.8.1-license: BSD3-license-file: LICENSE-author: Nickolay Kudasov <nickolay.kudasov@gmail.com>-maintainer: Nickolay Kudasov <nickolay.kudasov@gmail.com>+version: 0.3.9+ synopsis: Converting to/from HTTP API data like URL pieces, headers and query parameters.+category: Web description: This package defines typeclasses used for converting Haskell data types to and from HTTP API data. . Please see README.md++license: BSD3+license-file: LICENSE+author: Nickolay Kudasov <nickolay.kudasov@gmail.com>+maintainer: Nickolay Kudasov <nickolay.kudasov@gmail.com> homepage: http://github.com/fizruk/http-api-data-category: Web stability: unstable-cabal-version: >= 1.10 build-type: Custom+ extra-source-files: include/overlapping-compat.h test/*.hs@@ -24,12 +27,13 @@ GHC==7.10.3, GHC==8.0.2, GHC==8.2.2,- GHC==8.4.1+ GHC==8.4.3,+ GHC==8.6.1 custom-setup setup-depends:- base >= 4.7 && <4.12,- Cabal >= 1.18 && <2.3,+ base,+ Cabal, cabal-doctest >=1.0.6 && <1.1 flag use-text-show@@ -40,24 +44,32 @@ library hs-source-dirs: src/ include-dirs: include/- build-depends: base >= 4.7 && < 4.12- , attoparsec >= 0.13.0.1 && < 0.14- , attoparsec-iso8601 >= 1.0.0.0 && < 1.1++ -- GHC bundled+ build-depends: base >= 4.7 && < 4.13 , bytestring >= 0.10.4.0 && < 0.11- , containers >= 0.5.5.1 && < 0.6- , hashable >= 1.1.2.4 && < 1.3- , http-types >= 0.8.6 && < 0.13- , text >= 1.1.1.3 && < 1.3+ , containers >= 0.5.5.1 && < 0.7+ , text >= 1.2.3.0 && < 1.3 , time >= 1.4.2 && < 1.9- , time-locale-compat >= 0.1.1.0 && < 0.2- , unordered-containers >= 0.2.6.0 && < 0.3- , uri-bytestring >= 0.1.7 && < 0.4- , uuid-types >= 1.0.2 && <1.1++ -- other-dependencies+ build-depends:+ attoparsec >= 0.13.2.2 && < 0.14+ , attoparsec-iso8601 >= 1.0.0.0 && < 1.1+ , cookie >= 0.4.3 && < 0.4.5+ , hashable >= 1.2.7.0 && < 1.3+ , http-types >= 0.12.1 && < 0.13+ , time-locale-compat >= 0.1.1.5 && < 0.2+ , unordered-containers >= 0.2.9.0 && < 0.3+ , uuid-types >= 1.0.3 && <1.1+ if !impl(ghc >= 8.0)- build-depends: semigroups >= 0.16 && < 0.19+ build-depends: semigroups >= 0.18.5 && < 0.19+ if flag(use-text-show) cpp-options: -DUSE_TEXT_SHOW- build-depends: text-show >= 2+ build-depends: text-show >= 3.7.4 && <3.8+ exposed-modules: Web.HttpApiData Web.FormUrlEncoded@@ -76,13 +88,11 @@ hs-source-dirs: test ghc-options: -Wall default-language: Haskell2010- build-tool-depends: hspec-discover:hspec-discover >= 2.4.7 && <2.5- build-depends: HUnit- , hspec >= 2.4.7- , base+ build-tool-depends: hspec-discover:hspec-discover >= 2.5.5 && <2.6+ -- inherited depndencies+ build-depends:+ base , bytestring- , QuickCheck >=2.9- , quickcheck-instances >= 0.3.12 , unordered-containers , http-api-data , text@@ -90,12 +100,17 @@ , bytestring , uuid-types + build-depends: HUnit >= 1.6.0.0 && <1.7+ , hspec >= 2.5.5 && <2.6+ , QuickCheck >= 2.11.3 && <2.13+ , quickcheck-instances >= 0.3.19 && <0.4+ test-suite doctests ghc-options: -Wall build-depends: base, directory >= 1.0,- doctest >= 0.11 && <0.16,+ doctest >= 0.16.0 && <0.17, filepath default-language: Haskell2010 hs-source-dirs: test
src/Web/FormUrlEncoded.hs view
@@ -47,5 +47,5 @@ urlDecodeParams, ) where -import Web.Internal.FormUrlEncoded+import Web.Internal.FormUrlEncoded
src/Web/HttpApiData.hs view
@@ -43,7 +43,7 @@ readTextData, ) where -import Web.Internal.HttpApiData+import Web.Internal.HttpApiData -- $setup --
src/Web/Internal/FormUrlEncoded.hs view
@@ -1,5 +1,5 @@-{-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE CPP #-}+{-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE DefaultSignatures #-} {-# LANGUAGE DeriveGeneric #-}@@ -18,14 +18,14 @@ module Web.Internal.FormUrlEncoded where #if __GLASGOW_HASKELL__ < 710-import Control.Applicative-import Data.Traversable+import Control.Applicative+import Data.Traversable #endif import Control.Arrow ((***)) import Control.Monad ((<=<))-import Data.ByteString.Builder (toLazyByteString, shortByteString)+import Data.ByteString.Builder (shortByteString, toLazyByteString) import qualified Data.ByteString.Lazy as BSL import qualified Data.ByteString.Lazy.Char8 as BSL8 import qualified Data.Foldable as F@@ -39,30 +39,30 @@ import Data.Map (Map) import qualified Data.Map as Map import Data.Monoid-import qualified Data.Semigroup as Semi import Data.Ord (comparing)+import qualified Data.Semigroup as Semi import Data.Text (Text) import qualified Data.Text as Text-import qualified Data.Text.Lazy as Lazy import Data.Text.Encoding as Text import Data.Text.Encoding.Error (lenientDecode)+import qualified Data.Text.Lazy as Lazy -import Data.Time import Data.Proxy+import Data.Time import Data.Word #if MIN_VERSION_base(4,8,0)-import Data.Void-import Numeric.Natural+import Data.Void+import Numeric.Natural #endif -import GHC.Exts (IsList (..), Constraint)+import GHC.Exts (Constraint, IsList (..)) import GHC.Generics import GHC.TypeLits-import URI.ByteString (urlEncodeQuery, urlDecodeQuery)+import Network.HTTP.Types.URI (urlDecode, urlEncodeBuilder) -import Web.Internal.HttpApiData+import Web.Internal.HttpApiData -- $setup -- >>> :set -XDeriveGeneric@@ -543,10 +543,10 @@ urlEncodeParams :: [(Text, Text)] -> BSL.ByteString urlEncodeParams = toLazyByteString . mconcat . intersperse (shortByteString "&") . map encodePair where- escape = urlEncodeQuery . Text.encodeUtf8+ escape = urlEncodeBuilder True . Text.encodeUtf8 encodePair (k, "") = escape k- encodePair (k, v) = escape k <> shortByteString "=" <> escape v+ encodePair (k, v) = escape k <> shortByteString "=" <> escape v -- | Decode an @application/x-www-form-urlencoded@ 'BSL.ByteString' to a 'Form'. --@@ -590,7 +590,7 @@ where pairs = map (BSL8.split '=') (BSL8.split '&' bs) - unescape = Text.decodeUtf8With lenientDecode . urlDecodeQuery . BSL.toStrict+ unescape = Text.decodeUtf8With lenientDecode . urlDecode True . BSL.toStrict parsePair p = case map unescape p of
src/Web/Internal/HttpApiData.hs view
@@ -1,12 +1,12 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE DefaultSignatures #-}-{-# LANGUAGE DeriveDataTypeable #-}-{-# LANGUAGE DeriveFunctor #-}-{-# LANGUAGE DeriveFoldable #-}-{-# LANGUAGE DeriveTraversable #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE DefaultSignatures #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE DeriveFoldable #-}+{-# LANGUAGE DeriveFunctor #-}+{-# LANGUAGE DeriveTraversable #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeSynonymInstances #-} -- | -- Convert Haskell values to and from HTTP API data@@ -14,54 +14,58 @@ module Web.Internal.HttpApiData where #if __GLASGOW_HASKELL__ < 710-import Control.Applicative-import Data.Foldable (Foldable)-import Data.Traversable (Traversable(traverse))+import Control.Applicative+import Data.Foldable (Foldable)+import Data.Traversable (Traversable (traverse)) #endif -import Control.Arrow ((&&&), left)-import Control.Monad ((<=<))+import Control.Arrow (left, (&&&))+import Control.Monad ((<=<)) -import Data.Monoid-import Data.ByteString (ByteString)-import qualified Data.ByteString as BS+import Data.ByteString (ByteString)+import qualified Data.ByteString as BS+import Data.Monoid -import Data.Int-import Data.Word+import Data.Int+import Data.Word -import Data.Text (Text)-import Data.Text.Encoding (encodeUtf8, decodeUtf8')-import Data.Text.Read (signed, decimal, rational, Reader)-import qualified Data.Text as T-import qualified Data.Text.Lazy as L+import Data.Text (Text)+import qualified Data.Text as T+import Data.Text.Encoding (decodeUtf8', encodeUtf8)+import qualified Data.Text.Lazy as L+import Data.Text.Read (Reader, decimal, rational,+ signed) -import Data.Time.Locale.Compat-import Data.Time-import Data.Version+import Data.Time+import Data.Time.Locale.Compat+import Data.Version #if MIN_VERSION_base(4,8,0)-import Data.Void-import Numeric.Natural+import Data.Void+import Numeric.Natural #endif -import Text.Read (readMaybe)-import Text.ParserCombinators.ReadP (readP_to_S)+import Text.ParserCombinators.ReadP (readP_to_S)+import Text.Read (readMaybe) #if USE_TEXT_SHOW-import TextShow (TextShow, showt)+import TextShow (TextShow, showt) #endif -import qualified Data.UUID.Types as UUID+import qualified Data.UUID.Types as UUID -import Data.Typeable (Typeable)-import Data.Data (Data)-import qualified Data.ByteString.Builder as BS-import qualified Network.HTTP.Types as H+import qualified Data.ByteString.Builder as BS+import Data.Data (Data)+import Data.Typeable (Typeable)+import qualified Network.HTTP.Types as H -import qualified Data.Attoparsec.Text as Atto-import qualified Data.Attoparsec.Time as Atto+import qualified Data.Attoparsec.Text as Atto+import qualified Data.Attoparsec.Time as Atto +import Web.Cookie (SetCookie, parseSetCookie,+ renderSetCookie) + -- $setup -- >>> data BasicAuthToken = BasicAuthToken Text deriving (Show) -- >>> instance FromHttpApiData BasicAuthToken where parseHeader h = BasicAuthToken <$> parseHeaderWithPrefix "Basic " h; parseQueryParam p = BasicAuthToken <$> parseQueryParam p@@ -531,6 +535,14 @@ toUrlPiece (Right x) = "right " <> toUrlPiece x -- |+-- >>> let Right c = parseUrlPiece "SESSID=r2t5uvjq435r4q7ib3vtdjq120" :: Either Text SetCookie+-- >>> toUrlPiece c+-- "\"SESSID=r2t5uvjq435r4q7ib3vtdjq120\""+instance ToHttpApiData SetCookie where+ toUrlPiece = showt . BS.toLazyByteString . renderSetCookie+ toEncodedUrlPiece = renderSetCookie++-- | -- >>> parseUrlPiece "_" :: Either Text () -- Right () instance FromHttpApiData () where@@ -664,6 +676,12 @@ parseHeader = Right . LenientData . parseHeader parseQueryParam = Right . LenientData . parseQueryParam +-- |+-- >>> parseUrlPiece "SESSID=r2t5uvjq435r4q7ib3vtdjq120" :: Either Text SetCookie+-- Right (SetCookie {setCookieName = "SESSID", setCookieValue = "r2t5uvjq435r4q7ib3vtdjq120", setCookiePath = Nothing, setCookieExpires = Nothing, setCookieMaxAge = Nothing, setCookieDomain = Nothing, setCookieHttpOnly = False, setCookieSecure = False, setCookieSameSite = Nothing})+instance FromHttpApiData SetCookie where+ parseUrlPiece = parseHeader . encodeUtf8+ parseHeader = Right . parseSetCookie ------------------------------------------------------------------------------- -- Attoparsec helpers -------------------------------------------------------------------------------