on master help sign in
Use aeson's tricky logic to get nicer integer representation (pinging @jgm)
5092bc5Michael Snoyman
Data/Yaml.hs+10−1
@@ -66,7 +66,6 @@ import Data.Aeson
66import Data.Aeson.Types (Pair, parseMaybe, parseEither, Parser)
66import Data.Aeson.Types (Pair, parseMaybe, parseEither, Parser)
67import Text.Libyaml hiding (encode, decode, encodeFile, decodeFile)
67import Text.Libyaml hiding (encode, decode, encodeFile, decodeFile)
68import Data.ByteString (ByteString)
68import Data.ByteString (ByteString)
69−import qualified Data.ByteString.Char8 as S8
70import qualified Data.Map as Map
69import qualified Data.Map as Map
71import System.IO.Unsafe (unsafePerformIO)
70import System.IO.Unsafe (unsafePerformIO)
72import Control.Exception (try, throwIO, fromException, Exception, SomeException, AsyncException)
71import Control.Exception (try, throwIO, fromException, Exception, SomeException, AsyncException)
@@ -88,8 +87,13 @@ import qualified Data.HashSet as HashSet
88import Data.Text.Read
87import Data.Text.Read
89#if MIN_VERSION_aeson(0, 7, 0)
88#if MIN_VERSION_aeson(0, 7, 0)
90import Data.Scientific (fromFloatDigits)
89import Data.Scientific (fromFloatDigits)
90+import qualified Data.Text.Encoding as TE
91+import qualified Data.Text.Lazy as TL
92+import Data.Text.Lazy.Builder (toLazyText)
93+import Data.Aeson.Encode (encodeToTextBuilder)
91#else
94#else
92import Data.Attoparsec.Number
95import Data.Attoparsec.Number
96+import qualified Data.ByteString.Char8 as S8
93#endif
97#endif
94import Control.Monad.Trans.Resource (ResourceT, runResourceT)
98import Control.Monad.Trans.Resource (ResourceT, runResourceT)
95
99
@@ -140,7 +144,12 @@ objToEvents' (String s) rest =
140objToEvents' Null rest = EventScalar "null" NullTag PlainNoTag Nothing : rest
144objToEvents' Null rest = EventScalar "null" NullTag PlainNoTag Nothing : rest
141objToEvents' (Bool True) rest = EventScalar "true" BoolTag PlainNoTag Nothing : rest
145objToEvents' (Bool True) rest = EventScalar "true" BoolTag PlainNoTag Nothing : rest
142objToEvents' (Bool False) rest = EventScalar "false" BoolTag PlainNoTag Nothing : rest
146objToEvents' (Bool False) rest = EventScalar "false" BoolTag PlainNoTag Nothing : rest
147+#if MIN_VERSION_aeson(0,7,0)
148+-- Use aeson's implementation which gets rid of annoying decimal points
149+objToEvents' n@Number{} rest = EventScalar (TE.encodeUtf8 $ TL.toStrict $ toLazyText $ encodeToTextBuilder n) IntTag PlainNoTag Nothing : rest
150+#else
143objToEvents' (Number n) rest = EventScalar (S8.pack $ show n) IntTag PlainNoTag Nothing : rest
151objToEvents' (Number n) rest = EventScalar (S8.pack $ show n) IntTag PlainNoTag Nothing : rest
152+#endif
144
153
145pairToEvents :: Pair -> [Y.Event] -> [Y.Event]
154pairToEvents :: Pair -> [Y.Event] -> [Y.Event]
146pairToEvents (k, v) rest =
155pairToEvents (k, v) rest =
test/main.hs+3−1
@@ -74,6 +74,7 @@ main = hspec $ do
74 it "parses as string when quoted" caseQuotedNumber
74 it "parses as string when quoted" caseQuotedNumber
75 it "parses as number when unquoted" caseUnquotedNumber
75 it "parses as number when unquoted" caseUnquotedNumber
76 it "parses as number !!str is present" caseAttribNumber
76 it "parses as number !!str is present" caseAttribNumber
77+ it "integers have no decimals" caseIntegerDecimals
77 describe "booleans" $ do
78 describe "booleans" $ do
78 it "parses when all lowercase" caseLowercaseBool
79 it "parses when all lowercase" caseLowercaseBool
79 it "parses when all uppercase" caseUppercaseBool
80 it "parses when all uppercase" caseUppercaseBool
@@ -391,10 +392,11 @@ caseDataTypes =
391 , ("null", D.Null)
392 , ("null", D.Null)
392 ]
393 ]
393
394
394−caseQuotedNumber, caseUnquotedNumber, caseAttribNumber :: Assertion
395+caseQuotedNumber, caseUnquotedNumber, caseAttribNumber, caseIntegerDecimals :: Assertion
395caseQuotedNumber = D.decode "foo: \"1234\"" @?= Just (object [("foo", D.String "1234")])
396caseQuotedNumber = D.decode "foo: \"1234\"" @?= Just (object [("foo", D.String "1234")])
396caseUnquotedNumber = D.decode "foo: 1234" @?= Just (object [("foo", D.Number 1234)])
397caseUnquotedNumber = D.decode "foo: 1234" @?= Just (object [("foo", D.Number 1234)])
397caseAttribNumber = D.decode "foo: !!str 1234" @?= Just (object [("foo", D.String "1234")])
398caseAttribNumber = D.decode "foo: !!str 1234" @?= Just (object [("foo", D.String "1234")])
399+caseIntegerDecimals = D.encode (1 :: Int) @?= "1\n...\n"
398
400
399obj :: Maybe D.Value
401obj :: Maybe D.Value
400obj = Just (object [("foo", D.Bool False), ("bar", D.Bool True), ("baz", D.Bool True)])
402obj = Just (object [("foo", D.Bool False), ("bar", D.Bool True), ("baz", D.Bool True)])