http-api-data 0.4 → 0.4.1
raw patch · 7 files changed
+62/−49 lines, 7 filesdep +time-compatdep −timedep −time-locale-compatdep ~QuickCheckdep ~basedep ~base-compat
Dependencies added: time-compat
Dependencies removed: time, time-locale-compat
Dependency ranges changed: QuickCheck, base, base-compat, bytestring, hashable, hspec, http-types, quickcheck-instances, semigroups, text-show, unordered-containers, void
Files
- CHANGELOG.md +6/−1
- http-api-data.cabal +19/−15
- src/Web/HttpApiData.hs +1/−2
- src/Web/Internal/FormUrlEncoded.hs +1/−1
- src/Web/Internal/HttpApiData.hs +32/−28
- test/Web/Internal/HttpApiDataSpec.hs +2/−1
- test/Web/Internal/TestInstances.hs +1/−1
CHANGELOG.md view
@@ -1,3 +1,8 @@+0.4.1+-----++* Use `time-compat` to provide instances for `DayOfWeek`.+ 0.4 --- @@ -18,7 +23,7 @@ * 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))+ (see [#75](https://github.com/fizruk/http-api-data/pull/75)) * Add support for `SetCookie` (see [#74](https://github.com/fizruk/http-api-data/pull/74))
http-api-data.cabal view
@@ -1,6 +1,6 @@ cabal-version: >= 1.10 name: http-api-data-version: 0.4+version: 0.4.1 synopsis: Converting to/from HTTP API data like URL pieces, headers and query parameters. category: Web@@ -29,7 +29,8 @@ GHC==8.0.2, GHC==8.2.2, GHC==8.4.4,- GHC==8.6.2+ GHC==8.6.5,+ GHC==8.8.1 custom-setup setup-depends:@@ -51,32 +52,35 @@ , bytestring >= 0.10.4.0 && < 0.11 , containers >= 0.5.5.1 && < 0.7 , text >= 1.2.3.0 && < 1.3- , time >= 1.4.2 && < 1.9 + -- so Semigroup Builder exists+ if impl(ghc >= 8.0)+ build-depends: bytestring >= 0.10.8.1+ -- other-dependencies build-depends: attoparsec >= 0.13.2.2 && < 0.14 , attoparsec-iso8601 >= 1.0.1.0 && < 1.1 , base-compat >= 0.10.5 && < 0.11 , cookie >= 0.4.3 && < 0.4.5- , hashable >= 1.2.7.0 && < 1.3- , http-types >= 0.12.2 && < 0.13+ , hashable >= 1.2.7.0 && < 1.4+ , http-types >= 0.12.3 && < 0.13 , tagged >= 0.8.5 && < 0.9- , time-locale-compat >= 0.1.1.5 && < 0.2- , unordered-containers >= 0.2.9.0 && < 0.3+ , time-compat >= 1.9.2 && < 1.10+ , unordered-containers >= 0.2.10.0 && < 0.3 , uuid-types >= 1.0.3 && <1.1 if !impl(ghc >= 7.10) build-depends: nats >= 1.1.2 && < 1.2,- void >= 0.7.2 && < 0.8+ void >= 0.7.3 && < 0.8 if !impl(ghc >= 8.0)- build-depends: semigroups >= 0.18.5 && < 0.19+ build-depends: semigroups >= 0.18.5 && < 0.20 if flag(use-text-show) cpp-options: -DUSE_TEXT_SHOW- build-depends: text-show >= 3.7.4 && <3.8+ build-depends: text-show >= 3.8.2 && <3.9 exposed-modules: Web.HttpApiData@@ -96,7 +100,7 @@ hs-source-dirs: test ghc-options: -Wall default-language: Haskell2010- build-tool-depends: hspec-discover:hspec-discover >= 2.6.0 && <2.7+ build-tool-depends: hspec-discover:hspec-discover >= 2.7.1 && <2.8 -- inherited depndencies build-depends: base@@ -106,14 +110,14 @@ , http-api-data , nats , text- , time+ , time-compat , unordered-containers , uuid-types build-depends: HUnit >= 1.6.0.0 && <1.7- , hspec >= 2.6.0 && <2.7- , QuickCheck >= 2.11.3 && <2.13- , quickcheck-instances >= 0.3.19 && <0.4+ , hspec >= 2.7.1 && <2.8+ , QuickCheck >= 2.13.1 && <2.14+ , quickcheck-instances >= 0.3.21 && <0.4 test-suite doctests ghc-options: -Wall
src/Web/HttpApiData.hs view
@@ -49,10 +49,9 @@ -- -- >>> :set -XOverloadedStrings -- >>> import Control.Applicative--- >>> import Data.Time+-- >>> import Data.Time.Compat -- >>> import Data.Int -- >>> import Data.Text (Text)--- >>> import Data.Time (Day) -- >>> import Data.Version -- $examples
src/Web/Internal/FormUrlEncoded.hs view
@@ -48,7 +48,7 @@ import qualified Data.Text.Encoding as Text import Data.Text.Encoding.Error (lenientDecode) import qualified Data.Text.Lazy as Lazy-import Data.Time (Day, LocalTime, NominalDiffTime,+import Data.Time.Compat (Day, LocalTime, NominalDiffTime, UTCTime, ZonedTime) import Data.Void (Void) import Data.Word (Word16, Word32, Word64, Word8)
src/Web/Internal/HttpApiData.hs view
@@ -28,6 +28,7 @@ import Data.Data (Data) import qualified Data.Fixed as F import Data.Int (Int16, Int32, Int64, Int8)+import qualified Data.Map as Map import Data.Monoid (All (..), Any (..), Dual (..), First (..), Last (..), Product (..), Sum (..))@@ -42,10 +43,13 @@ import qualified Data.Text.Lazy as L import Data.Text.Read (Reader, decimal, rational, signed)-import Data.Time (Day, FormatTime, LocalTime,+import Data.Time.Compat (Day, FormatTime, LocalTime, NominalDiffTime, TimeOfDay,- UTCTime, ZonedTime, formatTime)-import Data.Time.Locale.Compat (defaultTimeLocale,+ UTCTime, ZonedTime, formatTime,+ DayOfWeek (..),+ nominalDiffTimeToSeconds,+ secondsToNominalDiffTime)+import Data.Time.Format.Compat (defaultTimeLocale, iso8601DateFormat) import Data.Typeable (Typeable) import qualified Data.UUID.Types as UUID@@ -60,10 +64,6 @@ import Web.Cookie (SetCookie, parseSetCookie, renderSetCookie) -#if MIN_VERSION_time(1,9,1)-import Data.Time (nominalDiffTimeToSeconds,- secondsToNominalDiffTime)-#endif #if USE_TEXT_SHOW import TextShow (TextShow, showt)@@ -75,7 +75,7 @@ -- $setup -- >>> data BasicAuthToken = BasicAuthToken Text deriving (Show) -- >>> instance FromHttpApiData BasicAuthToken where parseHeader h = BasicAuthToken <$> parseHeaderWithPrefix "Basic " h; parseQueryParam p = BasicAuthToken <$> parseQueryParam p--- >>> import Data.Time+-- >>> import Data.Time.Compat -- >>> import Data.Version -- | Convert value to HTTP API data.@@ -495,28 +495,23 @@ toUrlPiece = timeToUrlPiece "%H:%M:%S%QZ" toEncodedUrlPiece = unsafeToEncodedUrlPiece --- The CPP in both this function and the function after it are to avoid--- exporting @nominalDiffTimeToSeconds@ and @secondsToNominalDiffTime@,--- since these names are already used by @Data.Time@ from the @time@ library--- starting in version @1.9.1@.-nominalDiffTimeToSecs :: NominalDiffTime -> F.Pico-nominalDiffTimeToSecs =-#if !MIN_VERSION_time(1,9,1)- realToFrac-#else- nominalDiffTimeToSeconds-#endif+-- |+-- >>> toUrlPiece Monday+-- "monday"+instance ToHttpApiData DayOfWeek where+ toUrlPiece Monday = "monday"+ toUrlPiece Tuesday = "tuesday"+ toUrlPiece Wednesday = "wednesday"+ toUrlPiece Thursday = "thursday"+ toUrlPiece Friday = "friday"+ toUrlPiece Saturday = "saturday"+ toUrlPiece Sunday = "sunday" -secsToNominalDiffTime :: F.Pico -> NominalDiffTime-secsToNominalDiffTime =-#if !MIN_VERSION_time(1,9,1)- realToFrac-#else- secondsToNominalDiffTime-#endif+ toEncodedUrlPiece = unsafeToEncodedUrlPiece + instance ToHttpApiData NominalDiffTime where- toUrlPiece = toUrlPiece . nominalDiffTimeToSecs+ toUrlPiece = toUrlPiece . nominalDiffTimeToSeconds toEncodedUrlPiece = unsafeToEncodedUrlPiece instance ToHttpApiData String where toUrlPiece = T.pack@@ -686,7 +681,16 @@ -- Right 2015-10-03 00:14:24 UTC instance FromHttpApiData UTCTime where parseUrlPiece = runAtto Atto.utcTime -instance FromHttpApiData NominalDiffTime where parseUrlPiece = fmap secsToNominalDiffTime . parseUrlPiece+instance FromHttpApiData DayOfWeek where+ parseUrlPiece t = case Map.lookup (T.toLower t) m of+ Just dow -> Right dow+ Nothing -> Left $ "Incorrect DayOfWeek: " <> T.take 10 t+ where+ m :: Map.Map Text DayOfWeek+ m = Map.fromList [ (toUrlPiece dow, dow) | dow <- [Monday .. Sunday] ]+++instance FromHttpApiData NominalDiffTime where parseUrlPiece = fmap secondsToNominalDiffTime . parseUrlPiece instance FromHttpApiData All where parseUrlPiece = coerce (parseUrlPiece :: Text -> Either Text Bool) instance FromHttpApiData Any where parseUrlPiece = coerce (parseUrlPiece :: Text -> Either Text Bool)
test/Web/Internal/HttpApiDataSpec.hs view
@@ -13,7 +13,7 @@ import qualified Data.Text as T import qualified Data.Text.Encoding as TE import qualified Data.Text.Lazy as L-import Data.Time+import Data.Time.Compat import qualified Data.UUID.Types as UUID import Data.Version import Data.Word@@ -86,6 +86,7 @@ checkUrlPiece (Proxy :: Proxy ZonedTime) "ZonedTime" checkUrlPiece (Proxy :: Proxy UTCTime) "UTCTime" checkUrlPiece (Proxy :: Proxy NominalDiffTime) "NominalDiffTime"+ checkUrlPiece (Proxy :: Proxy DayOfWeek) "DayOfWeek" checkUrlPiece (Proxy :: Proxy Version) "Version" checkUrlPiece (Proxy :: Proxy UUID.UUID) "UUID" checkUrlPiece' setCookieGen "Cookie"
test/Web/Internal/TestInstances.hs view
@@ -12,7 +12,7 @@ import Data.Char import qualified Data.HashMap.Strict as HashMap import qualified Data.Text as T-import Data.Time+import Data.Time.Compat import GHC.Exts (fromList) import GHC.Generics