on master help sign in
Manually work around trailing .0 in Scientific values
commit4f5a03838706121b5df6b6f887e0cfcb836838e0 authorMichael Snoyman <michael@snoyman.com> dateFri 23 Aug 2019, 07:19 (7 years ago) parent3e98119
2 files changed+15−2
yaml/src/Data/Yaml.hs+6−2 yaml/test/Data/YamlSpec.hs+9
yaml/src/Data/Yaml.hs+6−2
@@ -94,6 +94,7 @@ import Data.Aeson
9494 , Object, Array
9595 , withObject, withText, withArray, withScientific, withBool
9696 )
97+import qualified Data.Scientific as S
9798import qualified Data.ByteString.Builder.Scientific
9899import Data.Aeson.Types (Pair, parseMaybe, parseEither, Parser)
99100import Data.ByteString (ByteString)
@@ -215,9 +216,12 @@ objToEvents opts o = (:) EventStreamStart
215216 objToEvents' Null rest = EventScalar "null" NullTag PlainNoTag Nothing : rest
216217 objToEvents' (Bool True) rest = EventScalar "true" BoolTag PlainNoTag Nothing : rest
217218 objToEvents' (Bool False) rest = EventScalar "false" BoolTag PlainNoTag Nothing : rest
218− -- Use aeson's implementation which gets rid of annoying decimal points
219+
219220 objToEvents' (Number s) rest =
220− let builder = Data.ByteString.Builder.Scientific.scientificBuilder s
221+ let builder
222+ -- Special case the 0 exponent to remove the trailing .0
223+ | S.base10Exponent s == 0 = BB.integerDec $ S.coefficient s
224+ | otherwise = Data.ByteString.Builder.Scientific.scientificBuilder s
221225 lbs = BB.toLazyByteString builder
222226 bs = BL.toStrict lbs
223227 in EventScalar bs IntTag PlainNoTag Nothing : rest
yaml/test/Data/YamlSpec.hs+9
@@ -11,6 +11,7 @@ import qualified Text.Libyaml as Y
1111import qualified Data.ByteString as BS
1212import qualified Data.ByteString.Char8 as B8
1313import Data.Int (Int64)
14+import qualified Data.Scientific as S
1415
1516import Test.HUnit hiding (Test, path)
1617
@@ -20,6 +21,7 @@ import qualified Data.Conduit.List as CL
2021import Control.Monad
2122import Control.Exception (try, SomeException)
2223import Test.Hspec
24+import Test.Hspec.QuickCheck
2325import Data.Either.Compat
2426import System.Directory (createDirectory, createDirectoryIfMissing)
2527import Test.Mockery.Directory
@@ -310,6 +312,13 @@ spec = do
310312 ] `shouldReturn`
311313 "[\"foo\", 99, 99.99, bar, !foo \"foo\", !foo foo]\n"
312314
315+ prop "Scientific values round-trip" $ \coeff expon -> do
316+ let val = D.Number $ S.scientific coeff expon
317+ let rendered = D.encode val
318+ case D.decodeEither' rendered of
319+ Left e -> error $ show (coeff, expon, e)
320+ Right val' -> val' `shouldBe` val
321+
313322specialStrings :: [T.Text]
314323specialStrings =
315324 [ "fo\"o"