on master help sign in
Use aeson's tricky logic to get nicer integer representation (pinging @jgm)
commit5092bc57ddc5fc137314018277dc09f755e55464 authorMichael Snoyman <michael@snoyman.com> dateSat 12 Apr 2014, 21:41 (13 years ago) parent6946dc3
2 files changed+13−2
Data/Yaml.hs+10−1 test/main.hs+3−1
Data/Yaml.hs+10−1
@@ -66,7 +66,6 @@ import Data.Aeson
6666import Data.Aeson.Types (Pair, parseMaybe, parseEither, Parser)
6767import Text.Libyaml hiding (encode, decode, encodeFile, decodeFile)
6868import Data.ByteString (ByteString)
69−import qualified Data.ByteString.Char8 as S8
7069import qualified Data.Map as Map
7170import System.IO.Unsafe (unsafePerformIO)
7271import Control.Exception (try, throwIO, fromException, Exception, SomeException, AsyncException)
@@ -88,8 +87,13 @@ import qualified Data.HashSet as HashSet
8887import Data.Text.Read
8988#if MIN_VERSION_aeson(0, 7, 0)
9089import 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)
9194#else
9295import Data.Attoparsec.Number
96+import qualified Data.ByteString.Char8 as S8
9397#endif
9498import Control.Monad.Trans.Resource (ResourceT, runResourceT)
9599
@@ -140,7 +144,12 @@ objToEvents' (String s) rest =
140144objToEvents' Null rest = EventScalar "null" NullTag PlainNoTag Nothing : rest
141145objToEvents' (Bool True) rest = EventScalar "true" BoolTag PlainNoTag Nothing : rest
142146objToEvents' (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
143151objToEvents' (Number n) rest = EventScalar (S8.pack $ show n) IntTag PlainNoTag Nothing : rest
152+#endif
144153
145154pairToEvents :: Pair -> [Y.Event] -> [Y.Event]
146155pairToEvents (k, v) rest =
test/main.hs+3−1
@@ -74,6 +74,7 @@ main = hspec $ do
7474 it "parses as string when quoted" caseQuotedNumber
7575 it "parses as number when unquoted" caseUnquotedNumber
7676 it "parses as number !!str is present" caseAttribNumber
77+ it "integers have no decimals" caseIntegerDecimals
7778 describe "booleans" $ do
7879 it "parses when all lowercase" caseLowercaseBool
7980 it "parses when all uppercase" caseUppercaseBool
@@ -391,10 +392,11 @@ caseDataTypes =
391392 , ("null", D.Null)
392393 ]
393394
394−caseQuotedNumber, caseUnquotedNumber, caseAttribNumber :: Assertion
395+caseQuotedNumber, caseUnquotedNumber, caseAttribNumber, caseIntegerDecimals :: Assertion
395396caseQuotedNumber = D.decode "foo: \"1234\"" @?= Just (object [("foo", D.String "1234")])
396397caseUnquotedNumber = D.decode "foo: 1234" @?= Just (object [("foo", D.Number 1234)])
397398caseAttribNumber = D.decode "foo: !!str 1234" @?= Just (object [("foo", D.String "1234")])
399+caseIntegerDecimals = D.encode (1 :: Int) @?= "1\n...\n"
398400
399401obj :: Maybe D.Value
400402obj = Just (object [("foo", D.Bool False), ("bar", D.Bool True), ("baz", D.Bool True)])