packages feed

classy-influxdb-simple 0.2.0.0 → 0.2.1.0

raw patch · 4 files changed

+109/−5 lines, 4 filesdep +scientificdep +timePVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependencies added: scientific, time

API changes (from Hackage documentation)

- Database.InfluxDB.Simple.Classy.Types: Hours :: Precision
- Database.InfluxDB.Simple.Classy.Types: Microseconds :: Precision
- Database.InfluxDB.Simple.Classy.Types: Milliseconds :: Precision
- Database.InfluxDB.Simple.Classy.Types: Minutes :: Precision
- Database.InfluxDB.Simple.Classy.Types: Nanoseconds :: Precision
- Database.InfluxDB.Simple.Classy.Types: Seconds :: Precision
- Database.InfluxDB.Simple.Classy.Types: _Hours :: AsPrecision r_adLo => Prism' r_adLo ()
- Database.InfluxDB.Simple.Classy.Types: _Microseconds :: AsPrecision r_adLo => Prism' r_adLo ()
- Database.InfluxDB.Simple.Classy.Types: _Milliseconds :: AsPrecision r_adLo => Prism' r_adLo ()
- Database.InfluxDB.Simple.Classy.Types: _Minutes :: AsPrecision r_adLo => Prism' r_adLo ()
- Database.InfluxDB.Simple.Classy.Types: _Nanoseconds :: AsPrecision r_adLo => Prism' r_adLo ()
- Database.InfluxDB.Simple.Classy.Types: _Precision :: AsPrecision r_adLo => Prism' r_adLo Precision
- Database.InfluxDB.Simple.Classy.Types: _Seconds :: AsPrecision r_adLo => Prism' r_adLo ()
- Database.InfluxDB.Simple.Classy.Types: class AsPrecision r_adLo where _Nanoseconds = (.) _Precision _Nanoseconds _Microseconds = (.) _Precision _Microseconds _Milliseconds = (.) _Precision _Milliseconds _Seconds = (.) _Precision _Seconds _Minutes = (.) _Precision _Minutes _Hours = (.) _Precision _Hours
- Database.InfluxDB.Simple.Classy.Types: data Precision
+ Database.InfluxDB.Simple.Classy.Types.InfluxTimeStamp: InfluxTimeStamp :: UTCTime -> InfluxTimeStamp
+ Database.InfluxDB.Simple.Classy.Types.InfluxTimeStamp: instance Control.Lens.Wrapped.Wrapped Database.InfluxDB.Simple.Classy.Types.InfluxTimeStamp.InfluxTimeStamp
+ Database.InfluxDB.Simple.Classy.Types.InfluxTimeStamp: instance Data.Aeson.Types.FromJSON.FromJSON Database.InfluxDB.Simple.Classy.Types.InfluxTimeStamp.InfluxTimeStamp
+ Database.InfluxDB.Simple.Classy.Types.InfluxTimeStamp: instance Data.Aeson.Types.ToJSON.ToJSON Database.InfluxDB.Simple.Classy.Types.InfluxTimeStamp.InfluxTimeStamp
+ Database.InfluxDB.Simple.Classy.Types.InfluxTimeStamp: instance Database.InfluxDB.Simple.Classy.Types.InfluxTimeStamp.InfluxTimeStamp ~ t0 => Control.Lens.Wrapped.Rewrapped Database.InfluxDB.Simple.Classy.Types.InfluxTimeStamp.InfluxTimeStamp t0
+ Database.InfluxDB.Simple.Classy.Types.InfluxTimeStamp: instance GHC.Classes.Eq Database.InfluxDB.Simple.Classy.Types.InfluxTimeStamp.InfluxTimeStamp
+ Database.InfluxDB.Simple.Classy.Types.InfluxTimeStamp: instance GHC.Generics.Generic Database.InfluxDB.Simple.Classy.Types.InfluxTimeStamp.InfluxTimeStamp
+ Database.InfluxDB.Simple.Classy.Types.InfluxTimeStamp: instance GHC.Show.Show Database.InfluxDB.Simple.Classy.Types.InfluxTimeStamp.InfluxTimeStamp
+ Database.InfluxDB.Simple.Classy.Types.InfluxTimeStamp: newtype InfluxTimeStamp
+ Database.InfluxDB.Simple.Classy.Types.Precision: defaultPrecision :: Precision
- Database.InfluxDB.Simple.Classy.Types: _CommsOrInfluxError :: AsInfluxDbError r_aiXe => Prism' r_aiXe ByteString
+ Database.InfluxDB.Simple.Classy.Types: _CommsOrInfluxError :: AsInfluxDbError r_arpw => Prism' r_arpw ByteString
- Database.InfluxDB.Simple.Classy.Types: _InfluxDbError :: AsInfluxDbError r_aiXe => Prism' r_aiXe InfluxDbError
+ Database.InfluxDB.Simple.Classy.Types: _InfluxDbError :: AsInfluxDbError r_arpw => Prism' r_arpw InfluxDbError
- Database.InfluxDB.Simple.Classy.Types: _ParseError :: AsInfluxDbError r_aiXe => Prism' r_aiXe ByteString
+ Database.InfluxDB.Simple.Classy.Types: _ParseError :: AsInfluxDbError r_arpw => Prism' r_arpw ByteString
- Database.InfluxDB.Simple.Classy.Types: _UnknownError :: AsInfluxDbError r_aiXe => Prism' r_aiXe (InfluxRqType, SomeException)
+ Database.InfluxDB.Simple.Classy.Types: _UnknownError :: AsInfluxDbError r_arpw => Prism' r_arpw (InfluxRqType, SomeException)
- Database.InfluxDB.Simple.Classy.Types: class AsInfluxDbError r_aiXe where _CommsOrInfluxError = (.) _InfluxDbError _CommsOrInfluxError _ParseError = (.) _InfluxDbError _ParseError _UnknownError = (.) _InfluxDbError _UnknownError
+ Database.InfluxDB.Simple.Classy.Types: class AsInfluxDbError r_arpw where _CommsOrInfluxError = (.) _InfluxDbError _CommsOrInfluxError _ParseError = (.) _InfluxDbError _ParseError _UnknownError = (.) _InfluxDbError _UnknownError
- Database.InfluxDB.Simple.Classy.Types: class HasInfluxDBConfig c_aiNx where idbHost = (.) influxDBConfig idbHost idbPass = (.) influxDBConfig idbPass idbPort = (.) influxDBConfig idbPort idbUser = (.) influxDBConfig idbUser
+ Database.InfluxDB.Simple.Classy.Types: class HasInfluxDBConfig c_arjW where idbHost = (.) influxDBConfig idbHost idbPass = (.) influxDBConfig idbPass idbPort = (.) influxDBConfig idbPort idbUser = (.) influxDBConfig idbUser
- Database.InfluxDB.Simple.Classy.Types: idbHost :: HasInfluxDBConfig c_aiNx => Lens' c_aiNx ByteString
+ Database.InfluxDB.Simple.Classy.Types: idbHost :: HasInfluxDBConfig c_arjW => Lens' c_arjW ByteString
- Database.InfluxDB.Simple.Classy.Types: idbPass :: HasInfluxDBConfig c_aiNx => Lens' c_aiNx ByteString
+ Database.InfluxDB.Simple.Classy.Types: idbPass :: HasInfluxDBConfig c_arjW => Lens' c_arjW ByteString
- Database.InfluxDB.Simple.Classy.Types: idbPort :: HasInfluxDBConfig c_aiNx => Lens' c_aiNx Int
+ Database.InfluxDB.Simple.Classy.Types: idbPort :: HasInfluxDBConfig c_arjW => Lens' c_arjW Int
- Database.InfluxDB.Simple.Classy.Types: idbUser :: HasInfluxDBConfig c_aiNx => Lens' c_aiNx ByteString
+ Database.InfluxDB.Simple.Classy.Types: idbUser :: HasInfluxDBConfig c_arjW => Lens' c_arjW ByteString
- Database.InfluxDB.Simple.Classy.Types: influxDBConfig :: HasInfluxDBConfig c_aiNx => Lens' c_aiNx InfluxDBConfig
+ Database.InfluxDB.Simple.Classy.Types: influxDBConfig :: HasInfluxDBConfig c_arjW => Lens' c_arjW InfluxDBConfig

Files

classy-influxdb-simple.cabal view
@@ -1,5 +1,5 @@ name:                classy-influxdb-simple-version:             0.2.0.0+version:             0.2.1.0 synopsis:            Super simple InfluxDB package in Classy-MTL style -- description: homepage:            https://github.com/mankyKitty/classy-influxdb-simple#readme@@ -18,6 +18,7 @@   exposed-modules:     Database.InfluxDB.Simple.Classy                      , Database.InfluxDB.Simple.Classy.Types                      , Database.InfluxDB.Simple.Classy.Types.Precision+                     , Database.InfluxDB.Simple.Classy.Types.InfluxTimeStamp   build-depends:       base >= 4.7 && < 5                      , wreq                      , lens@@ -27,6 +28,8 @@                      , text                      , async-io-either                      , vector+                     , time+                     , scientific   default-language:    Haskell2010  source-repository head
src/Database/InfluxDB/Simple/Classy/Types.hs view
@@ -11,11 +11,11 @@   , HasInfluxDBConfig (..)   , InfluxDbError (..)   , AsInfluxDbError (..)-  , Precision (..)-  , AsPrecision (..)   , CanInflux   , basicInfluxOpts   , rqWinCode+  , module Database.InfluxDB.Simple.Classy.Types.Precision+  , module Database.InfluxDB.Simple.Classy.Types.InfluxTimeStamp   ) where  import           Control.Exception                               (SomeException)@@ -44,6 +44,7 @@  import           Database.InfluxDB.Simple.Classy.Types.Precision (AsPrecision (..),                                                                   Precision (..))+import Database.InfluxDB.Simple.Classy.Types.InfluxTimeStamp -- | -- Used to differentiate what action we were trying to perform on the InfluxDB -- when an error occurred.
+ src/Database/InfluxDB/Simple/Classy/Types/InfluxTimeStamp.hs view
@@ -0,0 +1,94 @@+{-# LANGUAGE DeriveGeneric         #-}+{-# LANGUAGE FlexibleInstances     #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-}+module Database.InfluxDB.Simple.Classy.Types.InfluxTimeStamp+  ( InfluxTimeStamp (..)+  ) where++import           Control.Applicative ((<|>))+import           Control.Lens        (makeWrapped, (^.))+import           GHC.Generics        (Generic)++import           Data.Monoid         ((<>))++import           Data.Text           (Text)+import qualified Data.Text           as T+import Data.Text.Lens (packed,unpacked)++import           Data.Time           (UTCTime)+import qualified Data.Time           as T++import           Data.Aeson          (FromJSON (..), ToJSON (..))+import qualified Data.Aeson          as A+import           Data.Aeson.Types    (typeMismatch)+import           Data.Scientific     (FPFormat (Fixed), Scientific,+                                      formatScientific)++secondFmt :: String+secondFmt = "%s"++rfcFmt :: String+rfcFmt = "%FT%TZ"++-- |+-- Wrapper class for @UTCTime@ so we can provide some easier handling of+-- Influx timestamps coming in and out of the DB.+--+-- The @FromJSON@ instance can handle the following response granuality/format:+-- * seconds+-- * nanoseconds+-- * string format matching @2016-07-12T00:00:00Z@+--+-- The @ToJSON@ instance will print the time as epoch seconds+newtype InfluxTimeStamp = InfluxTimeStamp UTCTime+  deriving (Show, Eq, Generic)+makeWrapped ''InfluxTimeStamp++parseT+  :: String+  -> String+  -> Maybe UTCTime+parseT =+  T.parseTimeM False T.defaultTimeLocale++-- Time could be a timestamp "2016-07-12T00:00:00Z"+parseInfluxTSString+  :: Text+  -> Maybe UTCTime+parseInfluxTSString =+  parseT rfcFmt+    . T.unpack++-- Time could be a scientific nanosecond accurate value+parseInfluxTS+  :: Scientific+  -> Maybe UTCTime+parseInfluxTS =+  parseT secondFmt+   . formatScientific Fixed (Just 0)++toInfluxTS+  :: ( Show a+     , Monad m+     )+  => a+  -> Maybe UTCTime+  -> m InfluxTimeStamp+toInfluxTS a = maybe+  (fail ("Parse failed for InfluxTimeStamp: " <> show a))+  (pure . InfluxTimeStamp)++instance ToJSON InfluxTimeStamp where+  toEncoding (InfluxTimeStamp t) =+    toEncoding $ T.formatTime T.defaultTimeLocale secondFmt t++instance FromJSON InfluxTimeStamp where+  parseJSON (A.String t) = toInfluxTS t $ parseInfluxTSString t+  parseJSON (A.Number n) = toInfluxTS n $ nanos <|> seconds+    where+      nanos = parseInfluxTS (n / 1000000000)+      seconds = parseInfluxTS n++  parseJSON invalidVal = typeMismatch "InfluxTimeStamp" invalidVal
src/Database/InfluxDB/Simple/Classy/Types/Precision.hs view
@@ -5,9 +5,10 @@ module Database.InfluxDB.Simple.Classy.Types.Precision   ( Precision (..)   , AsPrecision (..)+  , defaultPrecision   ) where -import           Control.Lens         (Lens', Prism', makeClassyPrisms, preview,+import           Control.Lens         (Iso', Prism', makeClassyPrisms, preview,                                        prism', re, view, (^?))  import           Data.ByteString      (ByteString)@@ -49,7 +50,7 @@     )  {-# INLINABLE pris' #-}-pris' :: Lens' a String -> Lens' String a -> Prism' a Precision+pris' :: Iso' a String -> Iso' String a -> Prism' a Precision pris' f t = prism' (view (re _Precision . t)) (preview (f . _Precision))  instance AsPrecision Text where@@ -60,3 +61,8 @@  instance Show Precision where   show = view (re _Precision)++defaultPrecision+  :: Precision+defaultPrecision =+  Seconds