packages feed

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 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