summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Patterson <tenderlove@ruby-lang.org>2021-08-04 09:27:04 -0700
committerHiroshi SHIBATA <hsbt@ruby-lang.org>2021-08-31 19:34:46 +0900
commit9ed2cb26dee8ed801a75cf4b276f1ec354ade032 (patch)
tree4518f41d38299101fc31f096f171aeec933a8b70
parent0925fddc80646b9411b00e7f601aa3d9c48d66ec (diff)
[ruby/psych] 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 https://github.com/ruby/psych/commit/6a1c30634e
-rw-r--r--ext/psych/lib/psych/visitors/yaml_tree.rb2
-rw-r--r--test/psych/test_string.rb13
2 files changed, 15 insertions, 0 deletions
diff --git a/ext/psych/lib/psych/visitors/yaml_tree.rb b/ext/psych/lib/psych/visitors/yaml_tree.rb
index 05748dd81c..2eee4d3457 100644
--- a/ext/psych/lib/psych/visitors/yaml_tree.rb
+++ b/ext/psych/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 20ab79c05a..0dc34b3083 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