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 +4/−1
- src/Database/InfluxDB/Simple/Classy/Types.hs +3/−2
- src/Database/InfluxDB/Simple/Classy/Types/InfluxTimeStamp.hs +94/−0
- src/Database/InfluxDB/Simple/Classy/Types/Precision.hs +8/−2
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