Hello community,
here is the log from the commit of package ghc-aeson-extra for openSUSE:Factory checked in at 2016-01-07 00:24:53
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ghc-aeson-extra (Old)
and /work/SRC/openSUSE:Factory/.ghc-aeson-extra.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ghc-aeson-extra"
Changes:
--------
--- /work/SRC/openSUSE:Factory/ghc-aeson-extra/ghc-aeson-extra.changes 2015-12-23 08:49:07.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.ghc-aeson-extra.new/ghc-aeson-extra.changes 2016-01-07 00:25:04.000000000 +0100
@@ -1,0 +2,8 @@
+Mon Dec 28 08:05:27 UTC 2015 - mimi.vx@gmail.com
+
+- update to 0.3.0.0
+* Data.Time.TH moved to time-parsers
+* Data.Aeson.Compat moved to aeson-compat
+* The modules aren't re-exported, as that would require Cabal >= 1.21 restriction
+
+-------------------------------------------------------------------
Old:
----
aeson-extra-0.2.3.0.tar.gz
New:
----
aeson-extra-0.3.0.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ ghc-aeson-extra.spec ++++++
--- /var/tmp/diff_new_pack.am4uKF/_old 2016-01-07 00:25:06.000000000 +0100
+++ /var/tmp/diff_new_pack.am4uKF/_new 2016-01-07 00:25:06.000000000 +0100
@@ -21,7 +21,7 @@
%bcond_with tests
Name: ghc-aeson-extra
-Version: 0.2.3.0
+Version: 0.3.0.0
Release: 0
Summary: Extra goodies for aeson
License: BSD-3-Clause
@@ -35,14 +35,18 @@
BuildRequires: ghc-rpm-macros
# Begin cabal-rpm deps:
BuildRequires: ghc-aeson-devel
-BuildRequires: ghc-attoparsec-devel
+BuildRequires: ghc-aeson-compat-devel
+BuildRequires: ghc-base-compat-devel
BuildRequires: ghc-bytestring-devel
BuildRequires: ghc-containers-devel
BuildRequires: ghc-exceptions-devel
BuildRequires: ghc-hashable-devel
+BuildRequires: ghc-parsec-devel
BuildRequires: ghc-scientific-devel
+BuildRequires: ghc-template-haskell-devel
BuildRequires: ghc-text-devel
BuildRequires: ghc-time-devel
+BuildRequires: ghc-time-parsers-devel
BuildRequires: ghc-unordered-containers-devel
BuildRequires: ghc-vector-devel
%if %{with tests}
++++++ aeson-extra-0.2.3.0.tar.gz -> aeson-extra-0.3.0.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aeson-extra-0.2.3.0/CHANGELOG.md new/aeson-extra-0.3.0.0/CHANGELOG.md
--- old/aeson-extra-0.2.3.0/CHANGELOG.md 2015-12-08 12:19:10.000000000 +0100
+++ new/aeson-extra-0.3.0.0/CHANGELOG.md 2015-12-25 18:51:00.000000000 +0100
@@ -1,3 +1,9 @@
+# 0.3.0.0 (2015-12-25)
+
+- `Data.Time.TH` moved to [`time-parsers`](http://hackage.haskell.org/package/time-parsers)
+- `Data.Aeson.Compat` moved to [`aeson-compat`](http://hackage.haskell.org/package/aeson-compat)
+- The modules aren't re-exported, as that would require `Cabal >= 1.21` restriction
+
# 0.2.3.0 (2015-12-08)
- `Data.Time.TH` module with `mkUTCTime`
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aeson-extra-0.2.3.0/README.md new/aeson-extra-0.3.0.0/README.md
--- old/aeson-extra-0.2.3.0/README.md 2015-09-29 12:45:17.000000000 +0200
+++ new/aeson-extra-0.3.0.0/README.md 2015-12-25 18:53:07.000000000 +0100
@@ -2,8 +2,9 @@
[![Build Status](https://travis-ci.org/phadej/aeson-extra.svg?branch=master)](https://travis-ci.org/phadej/aeson-extra)
[![Hackage](https://img.shields.io/hackage/v/aeson-extra.svg)](http://hackage.haskell.org/package/aeson-extra)
+[![Stackage LTS 3](http://stackage.org/package/monad-http/badge/lts-3)](http://stackage.org/lts-3/package/aeson-extra)
+[![Stackage Nightly](http://stackage.org/package/monad-http/badge/nightly)](http://stackage.org/nightly/package/aeson-extra)
-The package motivation is twofold:
-
-- provide compatibility layer for [`aeson`](http://hackage.haskell.org/package/aeson)
-- provide extra combinators
+Package provides extra funcitonality on top of
+[`aeson`](https://hackage.haskell.org/package/aeson) and
+[`aeson-compat`](https://hackage.haskell.org/package/aeson-compat)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aeson-extra-0.2.3.0/aeson-extra.cabal new/aeson-extra-0.3.0.0/aeson-extra.cabal
--- old/aeson-extra-0.2.3.0/aeson-extra.cabal 2015-12-08 12:19:23.000000000 +0100
+++ new/aeson-extra-0.3.0.0/aeson-extra.cabal 2015-12-25 18:57:25.000000000 +0100
@@ -3,13 +3,9 @@
-- see: https://github.com/sol/hpack
name: aeson-extra
-version: 0.2.3.0
+version: 0.3.0.0
synopsis: Extra goodies for aeson
-description: The package motivation is twofold:
- .
- * provide compatibility layer for @aeson@
- .
- * provide extra combinators
+description: Package provides extra funcitonality on top of @aeson@ and @aeson-compat@
category: Web
homepage: https://github.com/phadej/aeson-extra#readme
bug-reports: https://github.com/phadej/aeson-extra/issues
@@ -17,7 +13,7 @@
maintainer: Oleg Grenrus
license: BSD3
license-file: LICENSE
-tested-with: GHC==7.6.3, GHC==7.8.4, GHC==7.10.2
+tested-with: GHC==7.6.3, GHC==7.8.4, GHC==7.10.3
build-type: Simple
cabal-version: >= 1.10
@@ -35,24 +31,23 @@
ghc-options: -Wall
build-depends:
base >=4.6 && <4.9
+ , base-compat >=0.6.0 && <0.9
, aeson >=0.7.0.6 && <0.11
- , attoparsec >=0.12 && <0.14
+ , aeson-compat >=0.3.0.0 && <0.4
, bytestring >=0.10 && <0.11
, containers >=0.5 && <0.6
, exceptions >=0.8 && <0.9
, hashable >=1.2 && <1.3
+ , parsec >=3.1.9 && <3.2
, scientific >=0.3 && <0.4
, template-haskell >=2.8 && <2.11
, text >=1.2 && <1.3
- , time >=1.4.2 && <1.6
+ , time >=1.4.2 && <1.7
+ , time-parsers >=0.1.0.0 && <0.2
, unordered-containers >=0.2 && <0.3
, vector >=0.10 && <0.12
exposed-modules:
- Data.Aeson.Compat
Data.Aeson.Extra
- Data.Time.TH
- other-modules:
- Data.Aeson.Extra.Time
default-language: Haskell2010
test-suite aeson-extra-test
@@ -63,16 +58,19 @@
ghc-options: -Wall
build-depends:
base >=4.6 && <4.9
+ , base-compat >=0.6.0 && <0.9
, aeson >=0.7.0.6 && <0.11
- , attoparsec >=0.12 && <0.14
+ , aeson-compat >=0.3.0.0 && <0.4
, bytestring >=0.10 && <0.11
, containers >=0.5 && <0.6
, exceptions >=0.8 && <0.9
, hashable >=1.2 && <1.3
+ , parsec >=3.1.9 && <3.2
, scientific >=0.3 && <0.4
, template-haskell >=2.8 && <2.11
, text >=1.2 && <1.3
- , time >=1.4.2 && <1.6
+ , time >=1.4.2 && <1.7
+ , time-parsers >=0.1.0.0 && <0.2
, unordered-containers >=0.2 && <0.3
, vector >=0.10 && <0.12
, aeson-extra
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aeson-extra-0.2.3.0/src/Data/Aeson/Compat.hs new/aeson-extra-0.3.0.0/src/Data/Aeson/Compat.hs
--- old/aeson-extra-0.2.3.0/src/Data/Aeson/Compat.hs 2015-11-10 14:20:38.000000000 +0100
+++ new/aeson-extra-0.3.0.0/src/Data/Aeson/Compat.hs 1970-01-01 01:00:00.000000000 +0100
@@ -1,194 +0,0 @@
-{-# LANGUAGE CPP #-}
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# OPTIONS_GHC -fno-warn-orphans #-}
------------------------------------------------------------------------------
--- |
--- Module : Data.Aeson.Compat
--- Copyright : (C) 2015 Oleg Grenrus
--- License : BSD3
--- Maintainer : Oleg Grenrus
---
--- Compatibility notices
---
--- * 'decode' etc. work as in @aeson >=0.9@
--- * but it is generalised to work in any 'MonadThrow' (that is extra)
--- * '.:?' works as in @aeson <0.10@
--- * '.:!' works as '.:?' in @aeson ==0.10@
-module Data.Aeson.Compat (
- -- * Generic decoding functions
- decode,
- decode',
- decodeStrict,
- decodeStrict',
- AesonException(..),
- -- * Either decoding functions
- eitherDecode, eitherDecode', eitherDecodeStrict, eitherDecodeStrict',
- -- * Operators
- (.:?), (.:!),
- -- * Re-exports
- -- | Original 'Data.Aeson..:?' operator is not re-exported
- module Data.Aeson,
- ) where
-
-#if !MIN_VERSION_base(4,8,0)
-import Control.Applicative
-#endif
-
-#if MIN_VERSION_aeson(0,10,0)
-import Data.Monoid
-#endif
-
-import Data.Aeson hiding
- ((.:?), decode, decode', decodeStrict, decodeStrict'
-#if !MIN_VERSION_aeson (0,9,0)
- , eitherDecode, eitherDecode', eitherDecodeStrict, eitherDecodeStrict'
-#endif
- )
-
-#if !MIN_VERSION_aeson (0,9,0)
-import Data.Aeson.Parser (value, value')
-import qualified Data.Attoparsec.ByteString as A
-import qualified Data.Attoparsec.ByteString.Char8 as A (skipSpace)
-import qualified Data.Attoparsec.Lazy as L
-#endif
-
-import Control.Monad.Catch
-import Data.Aeson.Types hiding ((.:?))
-import Data.ByteString as B
-import Data.ByteString.Lazy as L
-import qualified Data.HashMap.Strict as H
-import Data.Text as T
-import Data.Typeable (Typeable)
-
-#if !MIN_VERSION_aeson(0,10,0)
-import Data.Time (Day, LocalTime)
-import qualified Data.Aeson.Extra.Time as ExtraTime
-#endif
-
--- | Exception thrown by 'decode' - family of functions in this module.
-newtype AesonException = AesonException String
- deriving (Show, Typeable)
-
-instance Exception AesonException
-
-eitherAesonExc :: (MonadThrow m) => Either String a -> m a
-eitherAesonExc (Left err) = throwM (AesonException err)
-eitherAesonExc (Right x) = return x
-
--- | Like original 'Data.Aeson.decode' but in arbitrary 'MonadThrow'.
---
--- Parse a top-level JSON value, i.e. also strings, numbers etc.
-decode :: (FromJSON a, MonadThrow m) => L.ByteString -> m a
-decode = eitherAesonExc . eitherDecode
-
--- | Like original 'Data.Aeson.decode'' but in arbitrary 'MonadThrow'.
-decode' :: (FromJSON a, MonadThrow m) => L.ByteString -> m a
-decode' = eitherAesonExc . eitherDecode'
-
--- | Like original 'Data.Aeson.decodeStrict' but in arbitrary 'MonadThrow'.
-decodeStrict :: (FromJSON a, MonadThrow m) => B.ByteString -> m a
-decodeStrict = eitherAesonExc . eitherDecodeStrict
-
--- | Like original 'Data.Aeson.decodeStrict'' but in arbitrary 'MonadThrow'.
-decodeStrict' :: (FromJSON a, MonadThrow m) => B.ByteString -> m a
-decodeStrict' = eitherAesonExc . eitherDecodeStrict'
-
--- | Retrieve the value associated with the given key of an 'Object'.
--- The result is 'Nothing' if the key is not present, or 'empty' if
--- the value cannot be converted to the desired type.
---
--- This accessor is most useful if the key and value can be absent
--- from an object without affecting its validity. If the key and
--- value are mandatory, use '.:' instead.
---
--- This operator is consistent in 'aeson >=0.8 && <0.11'
-(.:?) :: (FromJSON a) => Object -> Text -> Parser (Maybe a)
-obj .:? key = case H.lookup key obj of
- Nothing -> pure Nothing
- Just v ->
-#if MIN_VERSION_aeson(0,10,0)
- modifyFailure addKeyName $ parseJSON v -- <?> Key key
- where
- addKeyName = (("failed to parse field " <> T.unpack key <> ": ") <>)
-#else
- parseJSON v
-#endif
-{-# INLINE (.:?) #-}
-
--- | Like '.:?', but the resulting parser will fail,
--- if the key is present but is 'Null'.
-(.:!) :: (FromJSON a) => Object -> Text -> Parser (Maybe a)
-obj .:! key = case H.lookup key obj of
- Nothing -> pure Nothing
- Just v ->
-#if MIN_VERSION_aeson(0,10,0)
- modifyFailure addKeyName $ Just <$> parseJSON v -- <?> Key key
- where
- addKeyName = (("failed to parse field " <> T.unpack key <> ": ") <>)
-#else
- Just <$> parseJSON v
-#endif
-{-# INLINE (.:!) #-}
-
-#if !MIN_VERSION_aeson(0,9,0)
--- From Parser.Internal
-
--- | Parse a top-level JSON value followed by optional whitespace and
--- end-of-input. See also: 'json'.
-jsonEOF :: A.Parser Value
-jsonEOF = value <* A.skipSpace <* A.endOfInput
-
--- | Parse a top-level JSON value followed by optional whitespace and
--- end-of-input. See also: 'json''.
-jsonEOF' :: A.Parser Value
-jsonEOF' = value' <* A.skipSpace <* A.endOfInput
-
--- | Like 'decode' but returns an error message when decoding fails.
-eitherDecode :: (FromJSON a) => L.ByteString -> Either String a
-eitherDecode = eitherDecodeWith jsonEOF fromJSON
-{-# INLINE eitherDecode #-}
-
--- | Like 'decodeStrict' but returns an error message when decoding fails.
-eitherDecodeStrict :: (FromJSON a) => B.ByteString -> Either String a
-eitherDecodeStrict = eitherDecodeStrictWith jsonEOF fromJSON
-{-# INLINE eitherDecodeStrict #-}
-
--- | Like 'decode'' but returns an error message when decoding fails.
-eitherDecode' :: (FromJSON a) => L.ByteString -> Either String a
-eitherDecode' = eitherDecodeWith jsonEOF' fromJSON
-{-# INLINE eitherDecode' #-}
-
--- | Like 'decodeStrict'' but returns an error message when decoding fails.
-eitherDecodeStrict' :: (FromJSON a) => B.ByteString -> Either String a
-eitherDecodeStrict' = eitherDecodeStrictWith jsonEOF' fromJSON
-{-# INLINE eitherDecodeStrict' #-}
-
-eitherDecodeWith :: L.Parser Value -> (Value -> Result a) -> L.ByteString
- -> Either String a
-eitherDecodeWith p to s =
- case L.parse p s of
- L.Done _ v -> case to v of
- Success a -> Right a
- Error msg -> Left msg
- L.Fail _ _ msg -> Left msg
-{-# INLINE eitherDecodeWith #-}
-
-eitherDecodeStrictWith :: A.Parser Value -> (Value -> Result a) -> B.ByteString
- -> Either String a
-eitherDecodeStrictWith p to s =
- case either Error to (A.parseOnly p s) of
- Success a -> Right a
- Error msg -> Left msg
-{-# INLINE eitherDecodeStrictWith #-}
-
-#endif
-
-#if !MIN_VERSION_aeson(0,10,0)
--- | /Since: aeson-extra-0.2.2.0/
-instance FromJSON Day where
- parseJSON = withText "Day" (ExtraTime.run ExtraTime.day)
-
--- | /Since: aeson-extra-0.2.2.0/
-instance FromJSON LocalTime where
- parseJSON = withText "LocalTime" (ExtraTime.run ExtraTime.localTime)
-#endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aeson-extra-0.2.3.0/src/Data/Aeson/Extra/Time.hs new/aeson-extra-0.3.0.0/src/Data/Aeson/Extra/Time.hs
--- old/aeson-extra-0.2.3.0/src/Data/Aeson/Extra/Time.hs 2015-11-10 14:20:38.000000000 +0100
+++ new/aeson-extra-0.3.0.0/src/Data/Aeson/Extra/Time.hs 1970-01-01 01:00:00.000000000 +0100
@@ -1,159 +0,0 @@
-{-# LANGUAGE BangPatterns, CPP, ScopedTypeVariables #-}
-
--- |
--- Module: Data.Aeson.Extra.Time (Data.Aeson.Parser.Time)
--- Copyright: (c) 2015 Bryan O'Sullivan
--- License: Apache
--- Maintainer: Bryan O'Sullivan
--- Stability: experimental
--- Portability: portable
---
--- Parsers for parsing dates and times.
-
-module Data.Aeson.Extra.Time
- (
- run
- , day
- , localTime
- , timeOfDay
- , timeZone
- , utcTime
- , zonedTime
- ) where
-
-import Control.Monad (when, void)
-import Data.Attoparsec.Text as A
-import Data.Bits ((.&.))
-import Data.Char (isDigit, ord)
-import Data.Fixed (Pico)
-import Data.Int (Int64)
-import Data.Maybe (fromMaybe)
-import Data.Text (Text)
-import Data.Time.Calendar (Day, fromGregorianValid)
-import Data.Time.Clock (UTCTime(..))
-import qualified Data.Aeson.Types as Aeson
-import qualified Data.Text as T
-import qualified Data.Time.LocalTime as Local
-
-#if !MIN_VERSION_base(4,8,0)
-import Control.Applicative ((<$>), (<*>), (<*), (*>))
-#endif
-
--- from Data.Aeson.Internal.Time
-import Unsafe.Coerce (unsafeCoerce)
-
-toPico :: Integer -> Pico
-toPico = unsafeCoerce
-
--- | Run an attoparsec parser as an aeson parser.
-run :: Parser a -> Text -> Aeson.Parser a
-run p t = case A.parseOnly (p <* endOfInput) t of
- Left err -> fail $ "could not parse date: " ++ err
- Right r -> return r
-
--- | Parse a date of the form @YYYY-MM-DD@.
-day :: Parser Day
-day = do
- y <- decimal <* char '-'
- m <- twoDigits <* char '-'
- d <- twoDigits
- maybe (fail "invalid date") return (fromGregorianValid y m d)
-
--- | Parse a two-digit integer (e.g. day of month, hour).
-twoDigits :: Parser Int
-twoDigits = do
- a <- digit
- b <- digit
- let c2d c = ord c .&. 15
- return $! c2d a * 10 + c2d b
-
--- | Parse a time of the form @HH:MM:SS[.SSS]@.
-timeOfDay :: Parser Local.TimeOfDay
-timeOfDay = do
- h <- twoDigits <* char ':'
- m <- twoDigits <* char ':'
- s <- seconds
- if h < 24 && m < 60 && s < 61
- then return (Local.TimeOfDay h m s)
- else fail "invalid time"
-
-data T = T {-# UNPACK #-} !Int {-# UNPACK #-} !Int64
-
--- | Parse a count of seconds, with the integer part being two digits
--- long.
-seconds :: Parser Pico
-seconds = do
- real <- twoDigits
- mc <- peekChar
- case mc of
- Just '.' -> do
- t <- anyChar *> takeWhile1 isDigit
- return $! parsePicos real t
- _ -> return $! fromIntegral real
- where
- parsePicos a0 t = toPico (fromIntegral (t' * 10^n))
- where T n t' = T.foldl' step (T 12 (fromIntegral a0)) t
- step ma@(T m a) c
- | m <= 0 = ma
- | otherwise = T (m-1) (10 * a + fromIntegral (ord c) .&. 15)
-
--- | Parse a time zone, and return 'Nothing' if the offset from UTC is
--- zero. (This makes some speedups possible.)
-timeZone :: Parser (Maybe Local.TimeZone)
-timeZone = do
- let maybeSkip c = do ch <- peekChar'; when (ch == c) (void anyChar)
- maybeSkip ' '
- ch <- satisfy $ \c -> c == 'Z' || c == '+' || c == '-'
- if ch == 'Z'
- then return Nothing
- else do
- h <- twoDigits
- mm <- peekChar
- m <- case mm of
- Just ':' -> anyChar *> twoDigits
- Just d | isDigit d -> twoDigits
- _ -> return 0
- let off | ch == '-' = negate off0
- | otherwise = off0
- off0 = h * 60 + m
- case undefined of
- _ | off == 0 ->
- return Nothing
- | off < -720 || off > 840 || m > 59 ->
- fail "invalid time zone offset"
- | otherwise ->
- let !tz = Local.minutesToTimeZone off
- in return (Just tz)
-
--- | Parse a date and time, of the form @YYYY-MM-DD HH:MM:SS@.
--- The space may be replaced with a @T@. The number of seconds may be
--- followed by a fractional component.
-localTime :: Parser Local.LocalTime
-localTime = Local.LocalTime <$> day <* daySep <*> timeOfDay
- where daySep = satisfy (\c -> c == 'T' || c == ' ')
-
--- | Behaves as 'zonedTime', but converts any time zone offset into a
--- UTC time.
-utcTime :: Parser UTCTime
-utcTime = do
- lt@(Local.LocalTime d t) <- localTime
- mtz <- timeZone
- case mtz of
- Nothing -> let !tt = Local.timeOfDayToTime t
- in return (UTCTime d tt)
- Just tz -> return $! Local.localTimeToUTC tz lt
-
--- | Parse a date with time zone info. Acceptable formats:
---
--- @YYYY-MM-DD HH:MM:SS Z@
---
--- The first space may instead be a @T@, and the second space is
--- optional. The @Z@ represents UTC. The @Z@ may be replaced with a
--- time zone offset of the form @+0000@ or @-08:00@, where the first
--- two digits are hours, the @:@ is optional and the second two digits
--- (also optional) are minutes.
-zonedTime :: Parser Local.ZonedTime
-zonedTime = Local.ZonedTime <$> localTime <*> (fromMaybe utc <$> timeZone)
-
-utc :: Local.TimeZone
-utc = Local.TimeZone 0 False ""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aeson-extra-0.2.3.0/src/Data/Aeson/Extra.hs new/aeson-extra-0.3.0.0/src/Data/Aeson/Extra.hs
--- old/aeson-extra-0.2.3.0/src/Data/Aeson/Extra.hs 2015-12-08 12:18:32.000000000 +0100
+++ new/aeson-extra-0.3.0.0/src/Data/Aeson/Extra.hs 2015-12-25 18:51:00.000000000 +0100
@@ -1,14 +1,14 @@
-{-# LANGUAGE CPP #-}
-{-# LANGUAGE DataKinds #-}
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveFunctor #-}
-{-# LANGUAGE DeriveFoldable #-}
-{-# LANGUAGE DeriveTraversable #-}
-{-# LANGUAGE KindSignatures #-}
-{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveFoldable #-}
+{-# LANGUAGE DeriveFunctor #-}
+{-# LANGUAGE DeriveTraversable #-}
+{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
-{-# LANGUAGE FlexibleInstances #-}
-{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE KindSignatures #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE UndecidableInstances #-}
-----------------------------------------------------------------------------
-- |
-- Module : Data.Aeson.Extra
@@ -46,36 +46,39 @@
module Data.Aeson.Compat,
) where
-#if !MIN_VERSION_base(4,8,0)
-import Data.Foldable (Foldable)
-import Data.Traversable (Traversable, traverse)
-#endif
+import Prelude ()
+import Prelude.Compat
+
+import Control.Applicative (Alternative(..))
+import Data.Aeson.Compat
+import Data.Aeson.Types hiding ((.:?))
+import Data.Hashable (Hashable)
+import Data.Monoid
+import Data.Text (Text)
+import Data.Time (UTCTime, ZonedTime)
-import Control.Applicative
-import Data.Monoid
-import qualified Data.ByteString as BS
+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
-import qualified Data.HashMap.Strict as H
-import Data.Hashable (Hashable)
-import qualified Data.Map as Map
-import Data.Text as T
-import qualified Data.Text.Lazy as TL
-import Data.Time (UTCTime, ZonedTime)
-import qualified Data.Text.Read as T
+import qualified Data.Foldable as Foldable
+import qualified Data.HashMap.Strict as H
+import qualified Data.Map as Map
+import qualified Data.Text as T
+import qualified Data.Text.Lazy as TL
+import qualified Data.Text.Read as T
#if MIN_VERSION_base(4,7,0)
-import Data.Proxy
-import GHC.TypeLits
+import Data.Proxy
+import GHC.TypeLits
#endif
#if !MIN_VERSION_aeson (0,10,0)
-import qualified Data.Aeson.Extra.Time as ExtraTime
+import qualified Text.Parsec as Parsec
+import qualified Data.Time.Parsers as TimeParsers
#endif
-- | Like 'encode', but produces strict 'BS.ByteString'.
+--
+-- /Since: 0.2.3.0/
encodeStrict :: ToJSON a => a -> BS.ByteString
encodeStrict = LBS.toStrict . encode
@@ -293,7 +296,7 @@
#if MIN_VERSION_aeson (0,10,0)
parseJSON = fmap U . parseJSON
#else
- parseJSON = withText "UTCTime" (fmap U . ExtraTime.run ExtraTime.utcTime)
+ parseJSON = withText "UTCTime" (fmap U . run TimeParsers.utcTime)
#endif
-- | A type to parse 'ZonedTime'
@@ -312,5 +315,13 @@
#if MIN_VERSION_aeson (0,10,0)
parseJSON = fmap Z . parseJSON
#else
- parseJSON = withText "ZonedTime" (fmap Z . ExtraTime.run ExtraTime.zonedTime)
+ parseJSON = withText "ZonedTime" (fmap Z . run TimeParsers.zonedTime)
+#endif
+
+#if !MIN_VERSION_aeson (0,10,0)
+-- | Run a 'parsers' parser as an aeson parser.
+run :: Parsec.Parsec Text () a -> Text -> Parser a
+run p t = case Parsec.parse (p <* Parsec.eof) "" t of
+ Left err -> fail $ "could not parse date: " ++ show err
+ Right r -> return r
#endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aeson-extra-0.2.3.0/src/Data/Time/TH.hs new/aeson-extra-0.3.0.0/src/Data/Time/TH.hs
--- old/aeson-extra-0.2.3.0/src/Data/Time/TH.hs 2015-12-08 12:18:32.000000000 +0100
+++ new/aeson-extra-0.3.0.0/src/Data/Time/TH.hs 1970-01-01 01:00:00.000000000 +0100
@@ -1,25 +0,0 @@
-{-# 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