http-api-data 0.2.1 → 0.2.2
raw patch · 4 files changed
+73/−1 lines, 4 filesdep +time-locale-compat
Dependencies added: time-locale-compat
Files
- CHANGELOG.md +5/−0
- Web/HttpApiData/Internal.hs +43/−0
- http-api-data.cabal +2/−1
- test/Spec.hs +23/−0
CHANGELOG.md view
@@ -1,3 +1,8 @@+0.2.2+---++* Add instances for more `time` types: `LocalTime`, `ZonedTime`, `UTCTime` and `NominalDiffTime`+ 0.2.1 ---
Web/HttpApiData/Internal.hs view
@@ -28,6 +28,7 @@ import qualified Data.Text as T import qualified Data.Text.Lazy as L +import Data.Time.Locale.Compat import Data.Time import Data.Version @@ -364,6 +365,26 @@ -- "2015-10-03" instance ToHttpApiData Day where toUrlPiece = T.pack . show +timeToUrlPiece :: FormatTime t => String -> t -> Text+timeToUrlPiece fmt = T.pack . formatTime defaultTimeLocale (iso8601DateFormat (Just fmt))++-- |+-- >>> toUrlPiece $ LocalTime (fromGregorian 2015 10 03) (TimeOfDay 14 55 01)+-- "2015-10-03T14:55:01"+instance ToHttpApiData LocalTime where toUrlPiece = timeToUrlPiece "%H:%M:%S"++-- |+-- >>> toUrlPiece $ ZonedTime (LocalTime (fromGregorian 2015 10 03) (TimeOfDay 14 55 01)) utc+-- "2015-10-03T14:55:01+0000"+instance ToHttpApiData ZonedTime where toUrlPiece = timeToUrlPiece "%H:%M:%S%z"++-- |+-- >>> toUrlPiece $ UTCTime (fromGregorian 2015 10 03) 864+-- "2015-10-03T00:14:24Z"+instance ToHttpApiData UTCTime where toUrlPiece = timeToUrlPiece "%H:%M:%SZ"++instance ToHttpApiData NominalDiffTime where toUrlPiece = toUrlPiece . (floor :: NominalDiffTime -> Integer)+ instance ToHttpApiData String where toUrlPiece = T.pack instance ToHttpApiData Text where toUrlPiece = id instance ToHttpApiData L.Text where toUrlPiece = L.toStrict@@ -444,6 +465,28 @@ -- >>> toGregorian <$> parseUrlPiece "2016-12-01" -- Right (2016,12,1) instance FromHttpApiData Day where parseUrlPiece = readTextData++timeParseUrlPiece :: ParseTime t => String -> Text -> Either Text t+timeParseUrlPiece fmt = parseMaybeTextData (timeParseUrlPieceMaybe . T.unpack)+ where+ timeParseUrlPieceMaybe = parseTime defaultTimeLocale (iso8601DateFormat (Just fmt))++-- |+-- >>> parseUrlPiece "2015-10-03T14:55:01" :: Either Text LocalTime+-- Right 2015-10-03 14:55:01+instance FromHttpApiData LocalTime where parseUrlPiece = timeParseUrlPiece "%H:%M:%S"++-- |+-- >>> parseUrlPiece "2015-10-03T14:55:01+0000" :: Either Text ZonedTime+-- Right 2015-10-03 14:55:01 +0000+instance FromHttpApiData ZonedTime where parseUrlPiece = timeParseUrlPiece "%H:%M:%S%z"++-- |+-- >>> parseUrlPiece "2015-10-03T00:14:24Z" :: Either Text UTCTime+-- Right 2015-10-03 00:14:24 UTC+instance FromHttpApiData UTCTime where parseUrlPiece = timeParseUrlPiece "%H:%M:%SZ"++instance FromHttpApiData NominalDiffTime where parseUrlPiece = fmap fromInteger . parseUrlPiece instance FromHttpApiData All where parseUrlPiece = fmap All . parseUrlPiece instance FromHttpApiData Any where parseUrlPiece = fmap Any . parseUrlPiece
http-api-data.cabal view
@@ -1,5 +1,5 @@ name: http-api-data-version: 0.2.1+version: 0.2.2 license: BSD3 license-file: LICENSE author: Nickolay Kudasov <nickolay.kudasov@gmail.com>@@ -25,6 +25,7 @@ , text >= 0.5 , bytestring , time+ , time-locale-compat if flag(use-text-show) cpp-options: -DUSE_TEXT_SHOW build-depends: text-show >= 2
test/Spec.hs view
@@ -27,6 +27,25 @@ instance Arbitrary Day where arbitrary = liftA3 fromGregorian (fmap abs arbitrary) arbitrary arbitrary +instance Arbitrary LocalTime where+ arbitrary = LocalTime+ <$> arbitrary+ <*> liftA3 TimeOfDay (choose (0, 23)) (choose (0, 59)) (fromInteger <$> choose (0, 60))++instance Eq ZonedTime where+ ZonedTime t (TimeZone x _ _) == ZonedTime t' (TimeZone y _ _) = t == t' && x == y++instance Arbitrary ZonedTime where+ arbitrary = ZonedTime+ <$> arbitrary+ <*> liftA3 TimeZone arbitrary arbitrary (vectorOf 3 (elements ['A'..'Z']))++instance Arbitrary UTCTime where+ arbitrary = UTCTime <$> arbitrary <*> fmap fromInteger (choose (0, 86400))++instance Arbitrary NominalDiffTime where+ arbitrary = fromInteger <$> arbitrary+ instance Arbitrary Version where arbitrary = (version . map abs) <$> nonempty where@@ -89,6 +108,10 @@ checkUrlPiece (Proxy :: Proxy T.Text) "Text.Strict" checkUrlPiece (Proxy :: Proxy L.Text) "Text.Lazy" checkUrlPiece (Proxy :: Proxy Day) "Day"+ checkUrlPiece (Proxy :: Proxy LocalTime) "LocalTime"+ checkUrlPiece (Proxy :: Proxy ZonedTime) "ZonedTime"+ checkUrlPiece (Proxy :: Proxy UTCTime) "UTCTime"+ checkUrlPiece (Proxy :: Proxy NominalDiffTime) "NominalDiffTime" checkUrlPiece (Proxy :: Proxy Version) "Version" checkUrlPiece (Proxy :: Proxy (Maybe String)) "Maybe String"