aeson-extra 0.2.2.0 → 0.2.3.0
raw patch · 5 files changed
+73/−3 lines, 5 filesdep +template-haskell
Dependencies added: template-haskell
Files
- CHANGELOG.md +5/−0
- aeson-extra.cabal +4/−1
- src/Data/Aeson/Extra.hs +8/−0
- src/Data/Time/TH.hs +25/−0
- test/Tests.hs +31/−2
CHANGELOG.md view
@@ -1,3 +1,8 @@+# 0.2.3.0 (2015-12-08)++- `Data.Time.TH` module with `mkUTCTime`+- `encodeStrict` in `Data.Aeson.Extra`+ # 0.2.2.0 (2015-11-10) - `U` and `Z` to parse `UTCTime` and `ZonedTime` compatibly
aeson-extra.cabal view
@@ -3,7 +3,7 @@ -- see: https://github.com/sol/hpack name: aeson-extra-version: 0.2.2.0+version: 0.2.3.0 synopsis: Extra goodies for aeson description: The package motivation is twofold: .@@ -42,6 +42,7 @@ , exceptions >=0.8 && <0.9 , hashable >=1.2 && <1.3 , scientific >=0.3 && <0.4+ , template-haskell >=2.8 && <2.11 , text >=1.2 && <1.3 , time >=1.4.2 && <1.6 , unordered-containers >=0.2 && <0.3@@ -49,6 +50,7 @@ exposed-modules: Data.Aeson.Compat Data.Aeson.Extra+ Data.Time.TH other-modules: Data.Aeson.Extra.Time default-language: Haskell2010@@ -68,6 +70,7 @@ , exceptions >=0.8 && <0.9 , hashable >=1.2 && <1.3 , scientific >=0.3 && <0.4+ , template-haskell >=2.8 && <2.11 , text >=1.2 && <1.3 , time >=1.4.2 && <1.6 , unordered-containers >=0.2 && <0.3
src/Data/Aeson/Extra.hs view
@@ -18,6 +18,8 @@ -- -- More or less useful newtypes for writing 'FromJSON' & 'ToJSON' instances module Data.Aeson.Extra (+ -- * Strict encoding+ encodeStrict, -- * Generic maps M(..), FromJSONKey(..),@@ -51,6 +53,8 @@ import Control.Applicative import Data.Monoid+import qualified Data.ByteString as BS+import qualified Data.ByteString.Lazy as LBS import Data.Aeson.Compat import Data.Aeson.Types hiding ((.:?)) import qualified Data.Foldable as Foldable@@ -70,6 +74,10 @@ #if !MIN_VERSION_aeson (0,10,0) import qualified Data.Aeson.Extra.Time as ExtraTime #endif++-- | Like 'encode', but produces strict 'BS.ByteString'.+encodeStrict :: ToJSON a => a -> BS.ByteString+encodeStrict = LBS.toStrict . encode -- | A wrapper type to parse arbitrary maps --
+ src/Data/Time/TH.hs view
@@ -0,0 +1,25 @@+{-# LANGUAGE TemplateHaskell #-}+-- | Template Haskell extras for `Data.Time`.+--+-- This module is in a wrong place, but it reuses the same parser as aeson parser.+module Data.Time.TH (mkUTCTime) where++import Control.Applicative ((<*))+import Data.Time (UTCTime(..), Day(..))+import qualified Data.Text as T+import qualified Data.Attoparsec.Text as A+import Language.Haskell.TH+import Data.Aeson.Extra.Time (utcTime)++-- | Make a 'UTCTime'. Accepts the same strings as aeson `UTCTime` parser accepts.+--+-- > t :: UTCTime+-- > t = $(mkUTCTime "2014-05-12 00:02:03.456000Z")+mkUTCTime :: String -> Q Exp+mkUTCTime s =+ case A.parseOnly (utcTime <* A.endOfInput) (T.pack s) of+ Left err -> fail $ "could not parse UTCTime: " ++ err+ Right (UTCTime (ModifiedJulianDay d) dt) ->+ [| UTCTime (ModifiedJulianDay $(d')) $(dt') :: UTCTime |]+ where d' = return $ LitE $ integerL d+ dt' = return $ LitE $ rationalL $ toRational dt
test/Tests.hs view
@@ -2,18 +2,18 @@ {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE KindSignatures #-}+{-# LANGUAGE TemplateHaskell #-} module Main (main) where #if !MIN_VERSION_base(4,8,0) import Control.Applicative #endif -import Data.Aeson.Extra import qualified Data.HashMap.Lazy as H import Data.Map (Map) import Data.Maybe (isJust) import Data.String (fromString)-import Data.Time (zonedTimeToUTC)+import Data.Time (zonedTimeToUTC, UTCTime(..), Day(..)) import Data.Vector (Vector) import Test.QuickCheck.Instances () import Test.Tasty@@ -24,11 +24,15 @@ import Data.Proxy #endif +import Data.Aeson.Extra+import Data.Time.TH+ import Orphans () main :: IO () main = defaultMain $ testGroup "Tests" [ dotColonMark+ , encodeStrictTests , mTests #if MIN_VERSION_base(4,7,0) , symTests@@ -37,9 +41,22 @@ , collapsedListTests , utctimeTests , zonedtimeTests+ , timeTHTests ] ------------------------------------------------------------------------------+-- encodeStrict+------------------------------------------------------------------------------+encodeStrictTests :: TestTree+encodeStrictTests = testGroup "encodeStrict"+ [ testProperty "decodeStrict . encodeStrict" prop+ ]+ where prop :: Int -> Property+ prop i = let lhs = decodeStrict . encodeStrict $ i+ rhs = Just i+ in lhs === rhs++------------------------------------------------------------------------------ -- M ------------------------------------------------------------------------------ @@ -190,3 +207,15 @@ , "2015-09-07 11:16:40.807 +03:00" , "2015-09-07 05:16:40.807 -03:00" ]++------------------------------------------------------------------------------+-- Time Template Haskell+------------------------------------------------------------------------------++timeTHTests :: TestTree+timeTHTests =+ testCase "time TH example" $ assertBool "should be equal" $ lhs == rhs+ where lhs = UTCTime (ModifiedJulianDay 56789) 123.456+ rhs = $(mkUTCTime "2014-05-12 00:02:03.456000Z")++