summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Patterson <tenderlove@ruby-lang.org>2021-08-04 09:27:04 -0700
committerAaron Patterson <tenderlove@ruby-lang.org>2021-08-04 09:27:04 -0700
commit6a1c30634e61967f3d8133b3181b9f301ff7f550 (patch)
treeecf1ca8343e71e2c804c06222c3d68ce993257a5
parent0be49786edf40b9956da0693d112f770588424e4 (diff)
downloadpsych-6a1c30634e61967f3d8133b3181b9f301ff7f550.tar.gz
Add quotes to the strings "y" and "n"
'y' and 'n' are kind of ambiguous. Syck treated y and n literals in YAML documents as strings. But this is not what the YAML 1.1 spec says. YAML 1.1 says they should be treated as booleans. When we're dumping documents, we know it's a string, so adding quotes will eliminate the "ambiguity" in the emitted document Fixes #443
-rw-r--r--lib/psych/visitors/yaml_tree.rb2
-rw-r--r--test/psych/test_string.rb13
2 files changed, 15 insertions, 0 deletions
diff --git a/lib/psych/visitors/yaml_tree.rb b/lib/psych/visitors/yaml_tree.rb
index 05748dd..2eee4d3 100644
--- a/lib/psych/visitors/yaml_tree.rb
+++ b/lib/psych/visitors/yaml_tree.rb
@@ -272,6 +272,8 @@ module Psych
tag = 'tag:yaml.org,2002:str'
plain = false
quote = false
+ elsif o == 'y' || o == 'n'
+ style = Nodes::Scalar::DOUBLE_QUOTED
elsif @line_width && o.length > @line_width
style = Nodes::Scalar::FOLDED
elsif o =~ /^[^[:word:]][^"]*$/
diff --git a/test/psych/test_string.rb b/test/psych/test_string.rb
index 20ab79c..0dc34b3 100644
--- a/test/psych/test_string.rb
+++ b/test/psych/test_string.rb
@@ -17,6 +17,19 @@ module Psych
end
end
+ # 'y' and 'n' are kind of ambiguous. Syck treated y and n literals in
+ # YAML documents as strings. But this is not what the YAML 1.1 spec says.
+ # YAML 1.1 says they should be treated as booleans. When we're dumping
+ # documents, we know it's a string, so adding quotes will eliminate the
+ # "ambiguity" in the emitted document
+ def test_y_is_quoted
+ assert_match(/"y"/, Psych.dump("y"))
+ end
+
+ def test_n_is_quoted
+ assert_match(/"n"/, Psych.dump("n"))
+ end
+
def test_string_with_newline
assert_equal "1\n2", Psych.load("--- ! '1\n\n 2'\n")
end