on master help sign in
Flatten nested objects in handle scribe
06fa787Michael Xavier
katip/src/Katip/Scribes/Handle.hs+11−11
@@ -8,6 +8,7 @@ import Control.Monad
8import Data.Aeson
8import Data.Aeson
9import qualified Data.HashMap.Strict as HM
9import qualified Data.HashMap.Strict as HM
10import Data.Monoid
10import Data.Monoid
11+import Data.Text (Text)
11import Data.Text.Lazy.Builder
12import Data.Text.Lazy.Builder
12import Data.Text.Lazy.IO as T
13import Data.Text.Lazy.IO as T
13import Data.Time
14import Data.Time
@@ -26,18 +27,17 @@ brackets m = fromText "[" <> m <> fromText "]"
26
27
27-------------------------------------------------------------------------------
28-------------------------------------------------------------------------------
28getKeys :: LogItem s => Verbosity -> s -> [Builder]
29getKeys :: LogItem s => Verbosity -> s -> [Builder]
29−getKeys verb a = rendPair A.<$> HM.toList (payloadObject verb a)
30+getKeys verb a = concat (renderPair A.<$> HM.toList (payloadObject verb a))
30 where
31 where
31− rendPair (k,v) = fromText k <> fromText ":" <> (renderPrim v)
32−
33−
34−-------------------------------------------------------------------------------
35−renderPrim :: Value -> Builder
32+ renderPair :: (Text, Value) -> [Builder]
33+ renderPair (k,v) =
34+ case v of
35+ Object o -> concat [renderPair (k <> "." <> k', v') | (k', v') <- HM.toList o]
36−renderPrim (String t) = fromText t
36+ String t -> [fromText (k <> ":" <> t)]
37−renderPrim (Number s) = fromString (show s)
37+ Number n -> [fromText (k <> ":") <> fromString (show n)]
38−renderPrim (Bool b) = fromString (show b)
38+ Bool b -> [fromText (k <> ":") <> fromString (show b)]
39−renderPrim Null = fromText "null"
39+ Null -> [fromText (k <> ":null")]
40−renderPrim _ = mempty
40+ _ -> mempty -- Can't think of a sensible way to handle arrays
41
41
42
42
43-------------------------------------------------------------------------------
43-------------------------------------------------------------------------------
katip/test/Katip/Tests/Scribes/Handle.hs+8−4
@@ -1,4 +1,4 @@
1−{-# LANGUAGE OverloadedStrings #-}
1+{-# LANGUAGE OverloadedStrings #-}
2module Katip.Tests.Scribes.Handle
2module Katip.Tests.Scribes.Handle
3 ( tests
3 ( tests
4 ) where
4 ) where
@@ -6,6 +6,7 @@ module Katip.Tests.Scribes.Handle
6-------------------------------------------------------------------------------
6-------------------------------------------------------------------------------
7import Control.Monad
7import Control.Monad
8import Data.Aeson
8import Data.Aeson
9+import Data.Monoid
9import Data.Text (Text)
10import Data.Text (Text)
10import qualified Data.Text.IO as T
11import qualified Data.Text.IO as T
11import System.Directory
12import System.Directory
@@ -27,9 +28,9 @@ tests = testGroup "Katip.Scribes.Handle"
27 runKatipT le $ logItem dummyLogItem "test" Nothing InfoS "test message"
28 runKatipT le $ logItem dummyLogItem "test" Nothing InfoS "test message"
28 hClose h
29 hClose h
29 res <- readFile path
30 res <- readFile path
30− let pat = "\\[[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2} [[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2}\\]\\[katip-test.test\\]\\[Info\\]\\[.+\\]\\[[[:digit:]]+\\]\\[ThreadId [[:digit:]]+\\]\\[note:some note\\] test message" :: String
31+ let pat = "\\[[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2} [[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2}\\]\\[katip-test.test\\]\\[Info\\]\\[.+\\]\\[[[:digit:]]+\\]\\[ThreadId [[:digit:]]+\\]\\[note.deep:some note\\] test message" :: String
31 let matches = res =~ pat
32 let matches = res =~ pat
32− matches @?= True
33+ assertBool (res <> " did not match") matches
33 ]
34 ]
34
35
35
36
@@ -40,7 +41,10 @@ data DummyLogItem = DummyLogItem {
40
41
41
42
42instance ToJSON DummyLogItem where
43instance ToJSON DummyLogItem where
43− toJSON (DummyLogItem n) = object ["note" .= n]
44+ toJSON (DummyLogItem n) = object
45+ [ "note" .= object [ "deep" .= n
46+ ]
47+ ]
44
48
45
49
46instance ToObject DummyLogItem
50instance ToObject DummyLogItem