on master help sign in
Prettier output (#11 #13)
commit4937f019d13da5559ca0b044d1f6ad18f33556bc authorMichael Snoyman <michael@snoyman.com> dateTue 1 Jan 2013, 17:30 (14 years ago) parent17a947d
3 files changed+40−10
Data/Yaml.hs+6−6 Text/Libyaml.hs+8−3 test/main.hs+26−1
Data/Yaml.hs+6−6
@@ -114,15 +114,15 @@ objToEvents' (Array list) rest =
114114objToEvents' (Object pairs) rest =
115115 EventMappingStart Nothing
116116 : foldr ($) (EventMappingEnd : rest) (map pairToEvents $ M.toList pairs)
117−objToEvents' (String s) rest = EventScalar (encodeUtf8 s) NoTag Any Nothing : rest
118−objToEvents' Null rest = EventScalar "null" NoTag Literal Nothing : rest
119−objToEvents' (Bool True) rest = EventScalar "true" NoTag Literal Nothing : rest
120−objToEvents' (Bool False) rest = EventScalar "false" NoTag Literal Nothing : rest
121−objToEvents' (Number n) rest = EventScalar (S8.pack $ show n) NoTag Literal Nothing : rest
117+objToEvents' (String s) rest = EventScalar (encodeUtf8 s) StrTag PlainNoTag Nothing : rest
118+objToEvents' Null rest = EventScalar "null" NullTag PlainNoTag Nothing : rest
119+objToEvents' (Bool True) rest = EventScalar "true" BoolTag PlainNoTag Nothing : rest
120+objToEvents' (Bool False) rest = EventScalar "false" BoolTag PlainNoTag Nothing : rest
121+objToEvents' (Number n) rest = EventScalar (S8.pack $ show n) IntTag PlainNoTag Nothing : rest
122122
123123pairToEvents :: Pair -> [Y.Event] -> [Y.Event]
124124pairToEvents (k, v) rest =
125− EventScalar (encodeUtf8 k) NoTag Any Nothing
125+ EventScalar (encodeUtf8 k) StrTag PlainNoTag Nothing
126126 : objToEvents' v rest
127127
128128-- Parsing
Text/Libyaml.hs+8−3
@@ -67,6 +67,7 @@ data Style = Any
6767 | DoubleQuoted
6868 | Literal
6969 | Folded
70+ | PlainNoTag
7071 deriving (Show, Read, Eq, Enum, Bounded, Ord, Data, Typeable)
7172
7273data Tag = StrTag
@@ -378,13 +379,17 @@ toEventRaw e f = allocaBytes eventSize $ \er -> do
378379 c_simple_document_start er
379380 EventDocumentEnd ->
380381 c_yaml_document_end_event_initialize er 1
381− EventScalar bs thetag style anchor -> do
382+ EventScalar bs thetag style0 anchor -> do
382383 BU.unsafeUseAsCStringLen bs $ \(value, len) -> do
383384 let value' = castPtr value :: Ptr CUChar
384385 len' = fromIntegral len :: CInt
385386 let thetag' = tagToString thetag
386387 withCString thetag' $ \tag' -> do
387− let style' = toEnum $ fromEnum style
388+ let (pi, style) =
389+ case style0 of
390+ PlainNoTag -> (1, Plain)
391+ x -> (0, x)
392+ style' = toEnum $ fromEnum style
388393 tagP = castPtr tag'
389394 qi = if null thetag' then 1 else 0
390395 case anchor of
@@ -395,7 +400,7 @@ toEventRaw e f = allocaBytes eventSize $ \er -> do
395400 tagP -- tag
396401 value' -- value
397402 len' -- length
398− 0 -- plain_implicit
403+ pi -- plain_implicit
399404 qi -- quoted_implicit
400405 style' -- style
401406 Just anchor' ->
test/main.hs+26−1
@@ -17,7 +17,7 @@ import Control.Exception (try, SomeException)
1717import Test.Hspec
1818
1919import qualified Data.Yaml as D
20−import Data.Yaml (object, array)
20+import Data.Yaml (object, array, (.=))
2121import Data.Maybe
2222import qualified Data.HashMap.Strict as M
2323import qualified Data.Text as T
@@ -68,6 +68,31 @@ main = hspec $ do
6868 checkNull "NULL"
6969 checkNull "~"
7070 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+ ]
7196
7297counter :: Monad m => (Y.Event -> Bool) -> C.Sink Y.Event m Int
7398counter pred' =