packages feed

co-log 0.6.1.2 → 0.7.0.0

raw patch · 3 files changed

+34/−92 lines, 3 filesdep +timedep −chronosdep ~doctestPVP ok

version bump matches the API change (PVP)

Dependencies added: time

Dependencies removed: chronos

Dependency ranges changed: doctest

API changes (from Hackage documentation)

- Colog.Message: RichMsg :: !msg -> {-# UNPACK #-} !FieldMap m -> RichMsg (m :: Type -> Type) (msg :: Type)
+ Colog.Message: RichMsg :: !msg -> !FieldMap m -> RichMsg (m :: Type -> Type) (msg :: Type)
- Colog.Message: [richMsgMap] :: RichMsg (m :: Type -> Type) (msg :: Type) -> {-# UNPACK #-} !FieldMap m
+ Colog.Message: [richMsgMap] :: RichMsg (m :: Type -> Type) (msg :: Type) -> !FieldMap m
- Colog.Message: fmtRichMessageCustomDefault :: MonadIO m => RichMsg m msg -> (Maybe ThreadId -> Maybe Time -> msg -> Text) -> m Text
+ Colog.Message: fmtRichMessageCustomDefault :: MonadIO m => RichMsg m msg -> (Maybe ThreadId -> Maybe UTCTime -> msg -> Text) -> m Text
- Colog.Message: showTime :: Time -> Text
+ Colog.Message: showTime :: UTCTime -> Text
- Colog.Message: showTimeOffset :: OffsetDatetime -> Text
+ Colog.Message: showTimeOffset :: ZonedTime -> Text

Files

CHANGELOG.md view
@@ -3,6 +3,16 @@ `co-log` uses [PVP Versioning][1]. The changelog is available [on GitHub][2]. +## 0.7.0.0 - April 6, 2025++## What's Changed++* Move away from `chronos`. (#277)++  **Breaking change**: Some signatures have changed from `Chronos.Time` to `Data.Time.UTCTime`.++**Full Changelog**: https://github.com/co-log/co-log/compare/v0.6.1.2...v0.7.0.0+ ## 0.6.1.2 - March 2, 2025  ## What's Changed
co-log.cabal view
@@ -1,6 +1,6 @@ cabal-version:       2.4 name:                co-log-version:             0.6.1.2+version:             0.7.0.0 synopsis:            Composable Contravariant Comonadic Logging Library description:     The default implementation of logging based on [co-log-core](http://hackage.haskell.org/package/co-log-core).@@ -113,7 +113,7 @@                      , filepath >= 1.4.1 && < 1.6                      , mtl >= 2.2.2 && < 2.4                      , text >= 1.2.3 && < 2.2-                     , chronos ^>= 1.1 && < 1.2+                     , time >= 1.8 && < 1.15                      , transformers >= 0.5 && < 0.7                      , dependent-sum >= 0.7 && < 0.8                      , dependent-map >= 0.4 && < 0.5@@ -169,7 +169,7 @@   hs-source-dirs:      test   main-is:             Doctest.hs -  build-depends:       doctest >= 0.16.0 && < 0.24+  build-depends:       doctest >= 0.16.0 && < 0.25                      , Glob ^>= 0.10.0   ghc-options:         -threaded 
src/Colog/Message.hs view
@@ -72,7 +72,6 @@ import Data.Dependent.Sum (DSum ((:=>))) import Data.Kind (Type) import Data.Text (Text)-import Data.Text.Lazy (toStrict) import GHC.Stack (CallStack, SrcLoc (..), callStack, getCallStack, withFrozenCallStack) import GHC.TypeLits (Symbol) import System.Console.ANSI (Color (..), ColorIntensity (Vivid), ConsoleLayer (Foreground), SGR (..),@@ -82,12 +81,8 @@ import Colog.Core (LogAction, Severity (..), cmap) import Colog.Monad (WithLog, logMsg) -import qualified Chronos as C-import qualified Chronos.Locale.English as C+import qualified Data.Time as C import qualified Data.Text as T-import qualified Data.Text.Lazy.Builder as TB-import qualified Data.Text.Lazy.Builder.Int as TB-import qualified Data.Vector as Vector  ---------------------------------------------------------------------------- -- Plain message@@ -260,8 +255,8 @@ types. The type family is open so you can add new instances. -} type family FieldType (fieldName :: Symbol) :: Type-type instance FieldType "threadId"  = ThreadId-type instance FieldType "posixTime" = C.Time+type instance FieldType "threadId" = ThreadId+type instance FieldType "utcTime"  = C.UTCTime  {- | @newtype@ wrapper. Stores monadic ability to extract value of 'FieldType'. @@ -313,17 +308,17 @@ type FieldMap m = DMap TypeRep (MessageField m)  {- | Default message map that contains actions to extract 'ThreadId' and-'C.Time'. Basically, the following mapping:+'C.UTCTime'. Basically, the following mapping:  @-"threadId"  -> 'myThreadId'-"posixTime" -> 'C.now'+"threadId" -> 'myThreadId'+"utcTime"  -> 'C.getCurrentTime' @ -} defaultFieldMap :: MonadIO m => FieldMap m defaultFieldMap = fromList-    [ typeRep @"threadId"  :=> MessageField (liftIO myThreadId)-    , typeRep @"posixTime" :=> MessageField (liftIO C.now)+    [ typeRep @"threadId" :=> MessageField (liftIO myThreadId)+    , typeRep @"utcTime"  :=> MessageField (liftIO C.getCurrentTime)     ]  {- | Contains additional data to 'Message' to display more verbose information.@@ -332,7 +327,7 @@ -} data RichMsg (m :: Type -> Type) (msg :: Type) = RichMsg     { richMsgMsg :: !msg-    , richMsgMap :: {-# UNPACK #-} !(FieldMap m)+    , richMsgMap :: !(FieldMap m)     } deriving stock (Functor)  -- | Specialised version of 'RichMsg' that stores severity, callstack and text message.@@ -356,7 +351,7 @@ fmtRichMessageDefault :: MonadIO m => RichMessage m -> m Text fmtRichMessageDefault msg = fmtRichMessageCustomDefault msg formatRichMessage   where-    formatRichMessage :: Maybe ThreadId -> Maybe C.Time -> Message -> Text+    formatRichMessage :: Maybe ThreadId -> Maybe C.UTCTime -> Message -> Text     formatRichMessage (maybe "" showThreadId -> thread) (maybe "" showTime -> time) Msg{..} =         showSeverity msgSeverity      <> time@@ -384,7 +379,7 @@ fmtSimpleRichMessageDefault :: MonadIO m => RichMsg m SimpleMsg -> m Text fmtSimpleRichMessageDefault msg = fmtRichMessageCustomDefault msg formatRichMessage   where-    formatRichMessage :: Maybe ThreadId -> Maybe C.Time -> SimpleMsg -> Text+    formatRichMessage :: Maybe ThreadId -> Maybe C.UTCTime -> SimpleMsg -> Text     formatRichMessage (maybe "" showThreadId -> thread) (maybe "" showTime -> time) SimpleMsg{..} =         time      <> showSourceLoc simpleMsgStack@@ -398,91 +393,28 @@ fmtRichMessageCustomDefault     :: MonadIO m     => RichMsg m msg-    -> (Maybe ThreadId -> Maybe C.Time -> msg -> Text)+    -> (Maybe ThreadId -> Maybe C.UTCTime -> msg -> Text)     -> m Text fmtRichMessageCustomDefault RichMsg{..} formatter = do-    maybeThreadId  <- extractField $ lookup (typeRep @"threadId")  richMsgMap-    maybePosixTime <- extractField $ lookup (typeRep @"posixTime") richMsgMap-    pure $ formatter maybeThreadId maybePosixTime richMsgMsg+    maybeThreadId <- extractField $ lookup (typeRep @"threadId")  richMsgMap+    maybeUtcTime  <- extractField $ lookup (typeRep @"utcTime") richMsgMap+    pure $ formatter maybeThreadId maybeUtcTime richMsgMsg  {- | Shows time in the following format: ->>> showTime $ C.Time 1577656800000000000+>>> showTime $ C.UTCTime (C.fromGregorian 2019 12 29) (C.secondsToDiffTime 3600 * 22) "[29 Dec 2019 22:00:00.000 +00:00] " -}-showTime :: C.Time -> Text-showTime t =-    square-    $ toStrict-    $ TB.toLazyText-    $ builderDmyHMSz (C.timeToOffsetDatetime (C.Offset 0) t)+showTime :: C.UTCTime -> Text+showTime = showTimeOffset . C.utcToZonedTime C.utc  {- | Shows time in the following format: ->>> showTimeOffset $ C.timeToOffsetDatetime (C.Offset $ -120) $ C.Time 1577656800000000000+>>> showTimeOffset $ C.utcToZonedTime (C.hoursToTimeZone (-2)) (C.UTCTime (C.fromGregorian 2019 12 29) (C.secondsToDiffTime 3600 * 22)) "[29 Dec 2019 20:00:00.000 -02:00] " -}-showTimeOffset :: C.OffsetDatetime -> Text-showTimeOffset = square . toStrict . TB.toLazyText . builderDmyHMSz--------------------------------------------------------------------------------- Chronos extra-------------------------------------------------------------------------------{- | Given a 'OffsetDatetime', constructs a 'Text' 'TB.Builder' corresponding to a-Day\/Month\/Year,Hour\/Minute\/Second\/Offset encoding of the given 'OffsetDatetime'.--Example: @29 Dec 2019 22:00:00.000 +00:00@--}-builderDmyHMSz :: C.OffsetDatetime -> TB.Builder-builderDmyHMSz (C.OffsetDatetime (C.Datetime date time) offset) =-       builderDmy date-    <> spaceSep-    <> C.builder_HMS (C.SubsecondPrecisionFixed 3) (Just ':') time-    <> spaceSep-    <> C.builderOffset C.OffsetFormatColonOn offset-  where-    spaceSep :: TB.Builder-    spaceSep = TB.singleton ' '--    {- Given a 'Date' construct a 'Text' 'TB.Builder'-    corresponding to a Day\/Month\/Year encoding.--    Example: @01 Jan 2020@-    -}-    builderDmy :: C.Date -> TB.Builder-    builderDmy (C.Date (C.Year y) m d) =-           zeroPadDayOfMonth d-        <> spaceSep-        <> TB.fromText (C.caseMonth C.abbreviated m)-        <> spaceSep-        <> TB.decimal y---    zeroPadDayOfMonth :: C.DayOfMonth -> TB.Builder-    zeroPadDayOfMonth (C.DayOfMonth d) =-        if d < 100-        then Vector.unsafeIndex twoDigitTextBuilder d-        else TB.decimal d--    twoDigitTextBuilder :: Vector.Vector TB.Builder-    twoDigitTextBuilder = Vector.fromList $-        map (TB.fromText . T.pack) twoDigitStrings-    {-# NOINLINE twoDigitTextBuilder #-}--    twoDigitStrings :: [String]-    twoDigitStrings =-        [ "00","01","02","03","04","05","06","07","08","09"-        , "10","11","12","13","14","15","16","17","18","19"-        , "20","21","22","23","24","25","26","27","28","29"-        , "30","31","32","33","34","35","36","37","38","39"-        , "40","41","42","43","44","45","46","47","48","49"-        , "50","51","52","53","54","55","56","57","58","59"-        , "60","61","62","63","64","65","66","67","68","69"-        , "70","71","72","73","74","75","76","77","78","79"-        , "80","81","82","83","84","85","86","87","88","89"-        , "90","91","92","93","94","95","96","97","98","99"-        ]+showTimeOffset :: C.ZonedTime -> Text+showTimeOffset = T.pack . C.formatTime C.defaultTimeLocale "[%d %b %Y %H:%M:%S%3Q %Ez] "  ---------------------------------------------------------------------------- -- Utility functions