logging-facade 0.0.0 → 0.1.0
raw patch · 5 files changed
+39/−94 lines, 5 filesdep ~basenew-uploaderPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: base
API changes (from Hackage documentation)
- System.Logging.Facade.TH: DEBUG :: LogLevel
- System.Logging.Facade.TH: ERROR :: LogLevel
- System.Logging.Facade.TH: INFO :: LogLevel
- System.Logging.Facade.TH: TRACE :: LogLevel
- System.Logging.Facade.TH: WARN :: LogLevel
- System.Logging.Facade.TH: class Monad m => Logging m
- System.Logging.Facade.TH: data LogLevel
- System.Logging.Facade.TH: debug :: ExpQ
- System.Logging.Facade.TH: error :: ExpQ
- System.Logging.Facade.TH: info :: ExpQ
- System.Logging.Facade.TH: instance Language.Haskell.TH.Syntax.Lift System.Logging.Facade.Types.LogLevel
- System.Logging.Facade.TH: log :: ExpQ
- System.Logging.Facade.TH: trace :: ExpQ
- System.Logging.Facade.TH: warn :: ExpQ
- System.Logging.Facade: debug :: Logging m => String -> m ()
+ System.Logging.Facade: debug :: (?loc :: CallStack) => Logging m => String -> m ()
- System.Logging.Facade: error :: Logging m => String -> m ()
+ System.Logging.Facade: error :: (?loc :: CallStack) => Logging m => String -> m ()
- System.Logging.Facade: info :: Logging m => String -> m ()
+ System.Logging.Facade: info :: (?loc :: CallStack) => Logging m => String -> m ()
- System.Logging.Facade: log :: Logging m => LogLevel -> String -> m ()
+ System.Logging.Facade: log :: (?loc :: CallStack) => Logging m => LogLevel -> String -> m ()
- System.Logging.Facade: trace :: Logging m => String -> m ()
+ System.Logging.Facade: trace :: (?loc :: CallStack) => Logging m => String -> m ()
- System.Logging.Facade: warn :: Logging m => String -> m ()
+ System.Logging.Facade: warn :: (?loc :: CallStack) => Logging m => String -> m ()
Files
- logging-facade.cabal +3/−4
- src/System/Logging/Facade.hs +29/−7
- src/System/Logging/Facade/Class.hs +6/−3
- src/System/Logging/Facade/TH.hs +0/−79
- test/System/Logging/FacadeSpec.hs +1/−1
logging-facade.cabal view
@@ -1,7 +1,7 @@ name: logging-facade-version: 0.0.0-synopsis: Simple logging abstraction that allows multiple backends-description: Simple logging abstraction that allows multiple backends+version: 0.1.0+synopsis: Simple logging abstraction that allows multiple back-ends+description: Simple logging abstraction that allows multiple back-ends license: MIT license-file: LICENSE copyright: (c) 2014 Simon Hengel@@ -21,7 +21,6 @@ exposed-modules: System.Logging.Facade System.Logging.Facade.Sink- System.Logging.Facade.TH System.Logging.Facade.Class System.Logging.Facade.Types build-depends:
src/System/Logging/Facade.hs view
@@ -1,3 +1,8 @@+{-# LANGUAGE CPP #-}+#if MIN_VERSION_base(4,8,1)+#define HAS_SOURCE_LOCATIONS+{-# LANGUAGE ImplicitParams #-}+#endif -- | -- This module is intended to be imported qualified: --@@ -21,26 +26,43 @@ import System.Logging.Facade.Types import System.Logging.Facade.Class +#ifdef HAS_SOURCE_LOCATIONS+import GHC.SrcLoc+import GHC.Stack+#define with_loc (?loc :: CallStack) =>+#else+#define with_loc+#endif+ -- | Produce a log message with specified log level.-log :: Logging m => LogLevel -> String -> m ()-log level message = consumeLogRecord (LogRecord level Nothing message)+log :: with_loc Logging m => LogLevel -> String -> m ()+log level message = consumeLogRecord (LogRecord level location message)+ where+ location :: Maybe Location+#ifdef HAS_SOURCE_LOCATIONS+ location = case reverse (getCallStack ?loc) of+ (_, loc) : _ -> Just $ Location (srcLocPackage loc) (srcLocModule loc) (srcLocFile loc) (srcLocStartLine loc) (srcLocStartCol loc)+ _ -> Nothing+#else+ location = Nothing+#endif -- | Produce a log message with log level `TRACE`.-trace :: Logging m => String -> m ()+trace :: with_loc Logging m => String -> m () trace = log TRACE -- | Produce a log message with log level `DEBUG`.-debug :: Logging m => String -> m ()+debug :: with_loc Logging m => String -> m () debug = log DEBUG -- | Produce a log message with log level `INFO`.-info :: Logging m => String -> m ()+info :: with_loc Logging m => String -> m () info = log INFO -- | Produce a log message with log level `WARN`.-warn :: Logging m => String -> m ()+warn :: with_loc Logging m => String -> m () warn = log WARN -- | Produce a log message with log level `ERROR`.-error :: Logging m => String -> m ()+error :: with_loc Logging m => String -> m () error = log ERROR
src/System/Logging/Facade/Class.hs view
@@ -2,16 +2,15 @@ {-# OPTIONS_GHC -fno-warn-deprecations #-} -- to suppress deprecation warning for ErrorT module System.Logging.Facade.Class where -import Data.Monoid import Control.Monad.Trans.Class import Control.Monad.Trans.Cont import Control.Monad.Trans.Error import Control.Monad.Trans.Identity import Control.Monad.Trans.List import Control.Monad.Trans.Maybe-import Control.Monad.Trans.Reader import Control.Monad.Trans.RWS.Lazy import qualified Control.Monad.Trans.RWS.Strict as Strict+import Control.Monad.Trans.Reader import Control.Monad.Trans.State.Lazy import qualified Control.Monad.Trans.State.Strict as Strict import Control.Monad.Trans.Writer.Lazy@@ -21,8 +20,12 @@ import Control.Monad.Trans.Except #endif -import System.Logging.Facade.Types+#if !MIN_VERSION_base(4,8,0)+import Data.Monoid+#endif+ import System.Logging.Facade.Sink+import System.Logging.Facade.Types -- | A type class for monads with logging support class Monad m => Logging m where
− src/System/Logging/Facade/TH.hs
@@ -1,79 +0,0 @@-{-# LANGUAGE TemplateHaskell #-}-{-# OPTIONS_GHC -fno-warn-orphans #-}--- |--- This module is intended to be imported qualified:------ > import qualified System.Logging.Facade.TH as Log-module System.Logging.Facade.TH (--- * Producing log messages- log-, trace-, debug-, info-, warn-, error---- * Types-, Logging-, LogLevel(..)-) where--import Prelude hiding (mod, log, error)-import Language.Haskell.TH-import Language.Haskell.TH.Syntax--import System.Logging.Facade.Types-import System.Logging.Facade.Class---- |--- A Template Haskell version of `System.Logging.Facade.log` that adds a--- source location to the produced log record.-log :: ExpQ-log = [|\level -> consumeLogRecord . LogRecord level $(mkLocation)|]---- |--- A Template Haskell version of `System.Logging.Facade.trace` that adds a--- source location to the produced log record.-trace :: ExpQ-trace = [|$(log) TRACE|]---- |--- A Template Haskell version of `System.Logging.Facade.debug` that adds a--- source location to the produced log record.-debug :: ExpQ-debug = [|$(log) DEBUG|]---- |--- A Template Haskell version of `System.Logging.Facade.info` that adds a--- source location to the produced log record.-info :: ExpQ-info = [|$(log) INFO|]---- |--- A Template Haskell version of `System.Logging.Facade.warn` that adds a--- source location to the produced log record.-warn :: ExpQ-warn = [|$(log) WARN|]---- |--- A Template Haskell version of `System.Logging.Facade.error` that adds a--- source location to the produced log record.-error :: ExpQ-error = [|$(log) ERROR|]--instance Lift LogLevel where- lift level = case level of- TRACE -> [|TRACE|]- DEBUG -> [|DEBUG|]- INFO -> [|INFO|]- WARN -> [|WARN|]- ERROR -> [|ERROR|]--mkLocation :: ExpQ-mkLocation = do- loc <- location- let file = loc_filename loc- package = loc_package loc- mod = loc_module loc- (line, column) = loc_start loc- [|Just (Location {locationPackage = package, locationModule = mod, locationFile = file, locationLine = line, locationColumn = column})|]
test/System/Logging/FacadeSpec.hs view
@@ -16,7 +16,7 @@ it "writes a log message with log level INFO" $ do ref <- newIORef [] let captureLogMessage :: LogSink- captureLogMessage record = modifyIORef ref (record :)+ captureLogMessage record = modifyIORef ref (record {logRecordLocation = Nothing} :) setLogSink captureLogMessage info "some log message" readIORef ref `shouldReturn` [LogRecord INFO Nothing "some log message"]