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 +10/−0
- co-log.cabal +3/−3
- src/Colog/Message.hs +21/−89
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