on master help sign in
Prettier output (#11 #13)
4937f01Michael Snoyman
Data/Yaml.hs+6−6
@@ -114,15 +114,15 @@ objToEvents' (Array list) rest =
114objToEvents' (Object pairs) rest =
114objToEvents' (Object pairs) rest =
115 EventMappingStart Nothing
115 EventMappingStart Nothing
116 : foldr ($) (EventMappingEnd : rest) (map pairToEvents $ M.toList pairs)
116 : foldr ($) (EventMappingEnd : rest) (map pairToEvents $ M.toList pairs)
117−objToEvents' (String s) rest = EventScalar (encodeUtf8 s) NoTag Any Nothing : rest
117+objToEvents' (String s) rest = EventScalar (encodeUtf8 s) StrTag PlainNoTag Nothing : rest
118−objToEvents' Null rest = EventScalar "null" NoTag Literal Nothing : rest
118+objToEvents' Null rest = EventScalar "null" NullTag PlainNoTag Nothing : rest
119−objToEvents' (Bool True) rest = EventScalar "true" NoTag Literal Nothing : rest
119+objToEvents' (Bool True) rest = EventScalar "true" BoolTag PlainNoTag Nothing : rest
120−objToEvents' (Bool False) rest = EventScalar "false" NoTag Literal Nothing : rest
120+objToEvents' (Bool False) rest = EventScalar "false" BoolTag PlainNoTag Nothing : rest
121−objToEvents' (Number n) rest = EventScalar (S8.pack $ show n) NoTag Literal Nothing : rest
121+objToEvents' (Number n) rest = EventScalar (S8.pack $ show n) IntTag PlainNoTag Nothing : rest
122
122
123pairToEvents :: Pair -> [Y.Event] -> [Y.Event]
123pairToEvents :: Pair -> [Y.Event] -> [Y.Event]
124pairToEvents (k, v) rest =
124pairToEvents (k, v) rest =
125− EventScalar (encodeUtf8 k) NoTag Any Nothing
125+ EventScalar (encodeUtf8 k) StrTag PlainNoTag Nothing
126 : objToEvents' v rest
126 : objToEvents' v rest
127
127
128-- Parsing
128-- Parsing
Text/Libyaml.hs+8−3
@@ -67,6 +67,7 @@ data Style = Any
67 | DoubleQuoted
67 | DoubleQuoted
68 | Literal
68 | Literal
69 | Folded
69 | Folded
70+ | PlainNoTag
70 deriving (Show, Read, Eq, Enum, Bounded, Ord, Data, Typeable)
71 deriving (Show, Read, Eq, Enum, Bounded, Ord, Data, Typeable)
71
72
72data Tag = StrTag
73data Tag = StrTag
@@ -378,13 +379,17 @@ toEventRaw e f = allocaBytes eventSize $ \er -> do
378 c_simple_document_start er
379 c_simple_document_start er
379 EventDocumentEnd ->
380 EventDocumentEnd ->
380 c_yaml_document_end_event_initialize er 1
381 c_yaml_document_end_event_initialize er 1
381− EventScalar bs thetag style anchor -> do
382+ EventScalar bs thetag style0 anchor -> do
382 BU.unsafeUseAsCStringLen bs $ \(value, len) -> do
383 BU.unsafeUseAsCStringLen bs $ \(value, len) -> do
383 let value' = castPtr value :: Ptr CUChar
384 let value' = castPtr value :: Ptr CUChar
384 len' = fromIntegral len :: CInt
385 len' = fromIntegral len :: CInt
385 let thetag' = tagToString thetag
386 let thetag' = tagToString thetag
386 withCString thetag' $ \tag' -> do
387 withCString thetag' $ \tag' -> do
388+ let (pi, style) =
389+ case style0 of
390+ PlainNoTag -> (1, Plain)
391+ x -> (0, x)
387− let style' = toEnum $ fromEnum style
392+ style' = toEnum $ fromEnum style
388 tagP = castPtr tag'
393 tagP = castPtr tag'
389 qi = if null thetag' then 1 else 0
394 qi = if null thetag' then 1 else 0
390 case anchor of
395 case anchor of
@@ -395,7 +400,7 @@ toEventRaw e f = allocaBytes eventSize $ \er -> do
395 tagP -- tag
400 tagP -- tag
396 value' -- value
401 value' -- value
397 len' -- length
402 len' -- length
398− 0 -- plain_implicit
403+ pi -- plain_implicit
399 qi -- quoted_implicit
404 qi -- quoted_implicit
400 style' -- style
405 style' -- style
401 Just anchor' ->
406 Just anchor' ->
test/main.hs+26−1
@@ -17,7 +17,7 @@ import Control.Exception (try, SomeException)
17import Test.Hspec
17import Test.Hspec
18
18
19import qualified Data.Yaml as D
19import qualified Data.Yaml as D
20−import Data.Yaml (object, array)
20+import Data.Yaml (object, array, (.=))
21import Data.Maybe
21import Data.Maybe
22import qualified Data.HashMap.Strict as M
22import qualified Data.HashMap.Strict as M
23import qualified Data.Text as T
23import qualified Data.Text as T
@@ -68,6 +68,31 @@ main = hspec $ do
68 checkNull "NULL"
68 checkNull "NULL"
69 checkNull "~"
69 checkNull "~"
70 checkNull ""
70 checkNull ""
71+ describe "pretty output" $ do
72+ it "simple nulls" $ D.encode (object ["foo" .= D.Null]) `shouldBe` "foo: null\n"
73+ it "simple numbers" $ D.encode (object ["foo" .= (4 :: Int)]) `shouldBe` "foo: 4\n"
74+ it "True" $ D.encode (object ["foo" .= True]) `shouldBe` "foo: true\n"
75+ it "False" $ D.encode (object ["foo" .= False]) `shouldBe` "foo: false\n"
76+ it "simple string" $ D.encode (object ["foo" .= ("bar" :: T.Text)]) `shouldBe` "foo: bar\n"
77+ describe "special keys" $ do
78+ let tester key = it (T.unpack key) $
79+ let value = object [key .= True]
80+ in D.decode (D.encode value) `shouldBe` Just value
81+ mapM_ tester specialStrings
82+ describe "special values" $ do
83+ let tester value = it (T.unpack value) $
84+ let value' = object ["foo" .= value]
85+ in D.decode (D.encode value') `shouldBe` Just value'
86+ mapM_ tester specialStrings
87+
88+specialStrings :: [T.Text]
89+specialStrings =
90+ [ "fo\"o"
91+ , "fo\'o"
92+ , "fo\\'o"
93+ , "fo: o"
94+ , "foo\nbar\nbaz\n"
95+ ]
71
96
72counter :: Monad m => (Y.Event -> Bool) -> C.Sink Y.Event m Int
97counter :: Monad m => (Y.Event -> Bool) -> C.Sink Y.Event m Int
73counter pred' =
98counter pred' =