cereal-time (empty) → 0.1.0.0
raw patch · 10 files changed
+413/−0 lines, 10 filesdep +QuickCheckdep +basedep +cerealsetup-changed
Dependencies added: QuickCheck, base, cereal, cereal-time, hspec, time
Files
- CHANGELOG.md +9/−0
- LICENSE +30/−0
- Setup.hs +2/−0
- cereal-time.cabal +67/−0
- src/Data/Time/Calendar/Serialize.hs +26/−0
- src/Data/Time/Clock/Serialize.hs +44/−0
- src/Data/Time/Clock/TAI/Serialize.hs +28/−0
- src/Data/Time/Format/Serialize.hs +36/−0
- src/Data/Time/LocalTime/Serialize.hs +43/−0
- tests/Main.hs +128/−0
+ CHANGELOG.md view
@@ -0,0 +1,9 @@+# Change Log++## [HEAD]++## 0.1.0 - 2016-06-05+### Added+- Initial version of the package.++[HEAD]: ../../compare/v0.1.0...HEAD
+ LICENSE view
@@ -0,0 +1,30 @@+Copyright (c) 2017, Al Zohali++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++ * Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.++ * Redistributions in binary form must reproduce the above+ copyright notice, this list of conditions and the following+ disclaimer in the documentation and/or other materials provided+ with the distribution.++ * Neither the name of Al Zohali nor the names of other+ contributors may be used to endorse or promote products derived+ from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ cereal-time.cabal view
@@ -0,0 +1,67 @@+name: cereal-time+version: 0.1.0.0+synopsis: Serialize instances for types from `time` package.+-- description:+license: BSD3+license-file: LICENSE+author: Al Zohali+maintainer: Al Zohali <zohl@fmap.me>+-- copyright:+category: Data+build-type: Simple+cabal-version: >=1.10++extra-source-files:+ CHANGELOG.md++source-repository head+ type: git+ location: https://github.com/zohl/cereal-time.git++flag dev+ description: Turn on development settings.+ manual: True+ default: False+++library+ exposed-modules:+ Data.Time.Calendar.Serialize+ Data.Time.Clock.Serialize+ Data.Time.Clock.TAI.Serialize+ Data.Time.Format.Serialize+ Data.Time.LocalTime.Serialize++ if flag(dev)+ ghc-options: -Wall -Werror+ else+ ghc-options: -O2 -Wall++ hs-source-dirs: src+ default-language: Haskell2010++ build-depends: base >= 4.7 && < 5.0+ , cereal >= 0.5 && < 0.6+ , time >= 1.5 && < 1.8.1++++test-suite tests+ type: exitcode-stdio-1.0+ main-is: Main.hs++ if flag(dev)+ ghc-options: -Wall -Werror+ else+ ghc-options: -O2 -Wall++ hs-source-dirs: tests+ default-language: Haskell2010++ build-depends: base >= 4.7 && < 5.0+ , QuickCheck >= 2.4 && < 3.0+ , cereal >= 0.5 && < 0.6+ , cereal-time+ , hspec >= 2.0 && < 3.0+ , time >= 1.6 && < 1.9+
+ src/Data/Time/Calendar/Serialize.hs view
@@ -0,0 +1,26 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-# LANGUAGE CPP #-}++{-|+ Module: Data.Time.Calendar.Serialize+ Copyright: (c) 2017 Al Zohali+ License: BSD3+ Maintainer: Al Zohali <zohl@fmap.me>+ Stability: stable++ = Description+ 'Serialize' instances for datatypes from 'Data.Time.Calendar'.+-}+module Data.Time.Calendar.Serialize where++import Data.Serialize (Serialize(..))+import Data.Time.Calendar (Day(..))++#if !MIN_VERSION_base(4,8,0)+import Control.Applicative ((<$>))+#endif++-- | 'Serialize' instance for 'Day'.+instance Serialize Day where+ put = put . toModifiedJulianDay+ get = ModifiedJulianDay <$> get
+ src/Data/Time/Clock/Serialize.hs view
@@ -0,0 +1,44 @@+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+ Module: Data.Time.Clock.Serialize+ Copyright: (c) 2017 Al Zohali+ License: BSD3+ Maintainer: Al Zohali <zohl@fmap.me>+ Stability: stable++ = Description+ 'Serialize' instances for datatypes from 'Data.Time.Clock'.+-}+module Data.Time.Clock.Serialize where++import Data.Serialize (Serialize(..))+import Data.Time.Clock (UniversalTime(..), DiffTime, UTCTime(..), NominalDiffTime)+import Data.Time.Clock (diffTimeToPicoseconds, picosecondsToDiffTime)+import Data.Time.Calendar.Serialize ()++#if !MIN_VERSION_base(4,8,0)+import Control.Applicative ((<$>), (<*>))+#endif++-- | 'Serialize' instance for 'UniversalTime'.+instance Serialize UniversalTime where+ put = put . getModJulianDate+ get = ModJulianDate <$> get++-- | 'Serialize' instance for 'DiffTime'.+instance Serialize DiffTime where+ put = put . diffTimeToPicoseconds+ get = picosecondsToDiffTime <$> get++-- | 'Serialize' instance for 'UTCTime'.+instance Serialize UTCTime where+ put UTCTime {..} = put utctDay >> put utctDayTime+ get = UTCTime <$> get <*> get++-- | 'Serialize' instance for 'NominalDiffTime'.+instance Serialize NominalDiffTime where+ put = put . toRational+ get = fromRational <$> get
+ src/Data/Time/Clock/TAI/Serialize.hs view
@@ -0,0 +1,28 @@+{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+ Module: Data.Time.Clock.TAI.Serialize+ Copyright: (c) 2017 Al Zohali+ License: BSD3+ Maintainer: Al Zohali <zohl@fmap.me>+ Stability: stable++ = Description+ 'Serialize' instances for datatypes from 'Data.Time.Clock.TAI'.+-}+module Data.Time.Clock.TAI.Serialize where++import Data.Serialize (Serialize(..))+import Data.Time.Clock.Serialize()+import Data.Time.Clock.TAI (AbsoluteTime)+import Data.Time.Clock.TAI (addAbsoluteTime, diffAbsoluteTime, taiEpoch)++#if !MIN_VERSION_base(4,8,0)+import Control.Applicative ((<$>))+#endif++-- | 'Serialize' instance for 'AbsoluteTime'.+instance Serialize AbsoluteTime where+ put = put . flip diffAbsoluteTime taiEpoch+ get = (flip addAbsoluteTime taiEpoch) <$> get
+ src/Data/Time/Format/Serialize.hs view
@@ -0,0 +1,36 @@+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+ Module: Data.Time.Format.Serialize+ Copyright: (c) 2017 Al Zohali+ License: BSD3+ Maintainer: Al Zohali <zohl@fmap.me>+ Stability: stable++ = Description+ 'Serialize' instances for datatypes from 'Data.Time.Format'.+-}+module Data.Time.Format.Serialize where++import Data.Time.Format (TimeLocale(..))+import Data.Time.LocalTime.Serialize ()+import Data.Serialize (Serialize(..))++#if !MIN_VERSION_base(4,8,0)+import Control.Applicative ((<$>), (<*>))+#endif++-- | 'Serialize' instance for 'TimeLocale'.+instance Serialize TimeLocale where+ put TimeLocale {..} = do+ put wDays+ put months+ put amPm+ put dateTimeFmt+ put dateFmt+ put timeFmt+ put time12Fmt+ put knownTimeZones+ get = TimeLocale <$> get <*> get <*> get <*> get <*> get <*> get <*> get <*> get
+ src/Data/Time/LocalTime/Serialize.hs view
@@ -0,0 +1,43 @@+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}++{-|+ Module: Data.Time.LocalTime.Serialize+ Copyright: (c) 2017 Al Zohali+ License: BSD3+ Maintainer: Al Zohali <zohl@fmap.me>+ Stability: stable++ = Description+ 'Serialize' instances for datatypes from 'Data.Time.LocalTime'.+-}+module Data.Time.LocalTime.Serialize where++import Data.Time.Calendar.Serialize ()+import Data.Time.LocalTime (TimeZone(..), TimeOfDay(..), LocalTime(..), ZonedTime(..))+import Data.Serialize (Serialize(..))++#if !MIN_VERSION_base(4,8,0)+import Control.Applicative ((<$>), (<*>))+#endif++-- | 'Serialize' instance for 'TimeZone'.+instance Serialize TimeZone where+ put TimeZone {..} = put timeZoneMinutes >> put timeZoneSummerOnly >> put timeZoneName+ get = TimeZone <$> get <*> get <*> get++-- | 'Serialize' instance for 'TimeOfDay'.+instance Serialize TimeOfDay where+ put TimeOfDay {..} = put todHour >> put todMin >> put (toRational todSec)+ get = TimeOfDay <$> get <*> get <*> (fromRational <$> get)++-- | 'Serialize' instance for 'LocalTime'.+instance Serialize LocalTime where+ put LocalTime {..} = put localDay >> put localTimeOfDay+ get = LocalTime <$> get <*> get++-- | 'Serialize' instance for 'ZonedTime'.+instance Serialize ZonedTime where+ put ZonedTime {..} = put zonedTimeToLocalTime >> put zonedTimeZone+ get = ZonedTime <$> get <*> get
+ tests/Main.hs view
@@ -0,0 +1,128 @@+{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}++module Main where++import Data.Char (isAlpha)+import Data.Function (on)+import Data.Proxy (Proxy(..))+import Data.Serialize (Serialize(..), encode, decode)+import Data.Time.Calendar (Day(..))+import Data.Time.Calendar.Serialize ()+import Data.Time.Clock (UniversalTime(..), DiffTime, UTCTime(..), NominalDiffTime)+import Data.Time.Clock (picosecondsToDiffTime)+import Data.Time.Clock.Serialize()+import Data.Time.Clock.TAI (AbsoluteTime)+import Data.Time.Clock.TAI (addAbsoluteTime, taiEpoch)+import Data.Time.Clock.TAI.Serialize ()+import Data.Time.Format (TimeLocale(..))+import Data.Time.Format.Serialize ()+import Data.Time.LocalTime (TimeZone(..), TimeOfDay(..), LocalTime(..), ZonedTime(..))+import Data.Time.LocalTime.Serialize ()+import Test.Hspec (Spec, shouldBe, describe, hspec)+import Test.Hspec.QuickCheck (prop)+import Test.QuickCheck (Arbitrary(..), suchThat, resize, listOf, choose)++#if MIN_VERSION_base(4,8,0)+import Data.Typeable (Typeable, typeRep)+#endif++#if !MIN_VERSION_base(4,8,0)+import Control.Applicative ((<$>), (<*>))+#endif+++main :: IO ()+main = hspec spec++spec :: Spec+spec = do+ describe "Serialization roundtrip" serializationRoundTripSpec++serializationRoundTripSpec :: Spec+serializationRoundTripSpec = do+ propRoundTrip (Proxy :: Proxy Day)+ propRoundTrip (Proxy :: Proxy UniversalTime)+ propRoundTrip (Proxy :: Proxy DiffTime)+ propRoundTrip (Proxy :: Proxy UTCTime)+ propRoundTrip (Proxy :: Proxy AbsoluteTime)+ propRoundTrip (Proxy :: Proxy TimeZone)+ propRoundTrip (Proxy :: Proxy TimeOfDay)+ propRoundTrip (Proxy :: Proxy LocalTime)+ propRoundTrip (Proxy :: Proxy ZonedTime)+ propRoundTrip (Proxy :: Proxy TimeLocale)++#if MIN_VERSION_base(4,8,0)+mkTestName+ :: (Serialize a, Arbitrary a, Show a, Eq a, Typeable a)+ => Proxy a+ -> String+mkTestName a = "(" ++ (show . typeRep $ a) ++ ")"++propRoundTrip+ :: (Serialize a, Arbitrary a, Show a, Eq a, Typeable a)+ => Proxy a+ -> Spec+propRoundTrip a = prop (mkTestName a) $+ \x -> x `shouldBe` (roundTrip a x)+#else+propRoundTrip+ :: (Serialize a, Arbitrary a, Show a, Eq a)+ => Proxy a+ -> Spec+propRoundTrip a = prop "_" $ \x -> x `shouldBe` (roundTrip a x)+#endif++roundTrip :: (Serialize a) => Proxy a -> a -> a+roundTrip _ = either error id . decode . encode+++instance Arbitrary Day where+ arbitrary = ModifiedJulianDay <$> arbitrary++instance Arbitrary UniversalTime where+ arbitrary = ModJulianDate <$> arbitrary++instance Arbitrary DiffTime where+ arbitrary = picosecondsToDiffTime <$> arbitrary++instance Arbitrary UTCTime where+ arbitrary = UTCTime <$> arbitrary <*> arbitrary++instance Arbitrary NominalDiffTime where+ arbitrary = fromRational <$> arbitrary++instance Arbitrary AbsoluteTime where+ arbitrary = (flip addAbsoluteTime taiEpoch) <$> arbitrary++instance Arbitrary TimeZone where+ arbitrary = TimeZone+ <$> arbitrary+ <*> arbitrary+ <*> (resize 4 $ listOf (arbitrary `suchThat` isAlpha))++instance Arbitrary TimeOfDay where+ arbitrary = TimeOfDay+ <$> (choose (0, 23))+ <*> (choose (0, 59))+ <*> ((fromRational <$> arbitrary) `suchThat` (\s -> (s >= (fromInteger 0)) && (s < (fromInteger 61))))++instance Arbitrary LocalTime where+ arbitrary = LocalTime <$> arbitrary <*> arbitrary++-- Per-component equality test (we do not expect serialization to change time zone).+instance Eq ZonedTime where+ (==) = curry $ flip all components . flip ($) where+ test f = uncurry ((==) `on` f)+ components = [+ test zonedTimeToLocalTime+ , test zonedTimeZone+ ]++instance Arbitrary ZonedTime where+ arbitrary = ZonedTime <$> arbitrary <*> arbitrary++instance Arbitrary TimeLocale where+ arbitrary = TimeLocale+ <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary+ <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary