on master help sign in
Quote keys as necessary (fixes #137)
commit5648c2219c8a2a311c13ea44bdd3637962c0eafe authorMichael Snoyman <michael@snoyman.com> dateMon 9 Jul 2018, 12:21 (8 years ago) parent40cc695
4 files changed+19−5
ChangeLog.md+2−1 package.yaml+1−1 src/Data/Yaml.hs+1−3 test/Data/YamlSpec.hs+15
ChangeLog.md+2−1
@@ -1,7 +1,8 @@
11# ChangeLog for yaml
22
3−## Unreleased changes
3+## 0.8.32
44
5+* Escape keys as necessary [#137](https://github.com/snoyberg/yaml/issues/137)
56* hpackify
67* src subdir
78
package.yaml+1−1
@@ -1,5 +1,5 @@
11name: yaml
2−version: 0.8.31.1
2+version: 0.8.32
33synopsis: Support for parsing and rendering YAML documents.
44description: README and API documentation are available at <https://www.stackage.org/package/yaml>
55category: Data
src/Data/Yaml.hs+1−3
@@ -157,9 +157,7 @@ objToEvents' (Bool False) rest = EventScalar "false" BoolTag PlainNoTag Nothing
157157objToEvents' n@Number{} rest = EventScalar (TE.encodeUtf8 $ TL.toStrict $ toLazyText $ encodeToTextBuilder n) IntTag PlainNoTag Nothing : rest
158158
159159pairToEvents :: Pair -> [Y.Event] -> [Y.Event]
160−pairToEvents (k, v) rest =
161− EventScalar (encodeUtf8 k) StrTag PlainNoTag Nothing
162− : objToEvents' v rest
160+pairToEvents (k, v) = objToEvents' (String k) . objToEvents' v
163161
164162decode :: FromJSON a
165163 => ByteString
test/Data/YamlSpec.hs+15
@@ -3,6 +3,7 @@
33{-# LANGUAGE ScopedTypeVariables #-}
44{-# LANGUAGE OverloadedStrings #-}
55{-# LANGUAGE TemplateHaskell #-}
6+{-# LANGUAGE TupleSections #-}
67
78module Data.YamlSpec (main, spec) where
89
@@ -29,6 +30,7 @@ import qualified Data.HashMap.Strict as M
2930import qualified Data.Text as T
3031import Data.Aeson.TH
3132import Data.Text (Text)
33+import Data.Text.Encoding (decodeUtf8)
3234import Data.Vector (Vector)
3335import qualified Data.Vector as V
3436import Data.HashMap.Strict (HashMap)
@@ -166,6 +168,19 @@ spec = do
166168
167169 it "truncates files" caseTruncatesFiles
168170
171+ it "quoting keys #137" $ do
172+ let keys = T.words "true false NO YES 1.2 1e5 null"
173+ bs = D.encode $ M.fromList $ map (, ()) keys
174+ text = decodeUtf8 bs
175+ forM_ keys $ \key -> do
176+ let quoted = T.concat ["'", key, "'"]
177+ unless (quoted `T.isInfixOf` text) $ error $ concat
178+ [ "Could not find quoted key: "
179+ , T.unpack quoted
180+ , "\n\n"
181+ , T.unpack text
182+ ] :: IO ()
183+
169184
170185specialStrings :: [T.Text]
171186specialStrings =