summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Patterson <aaron.patterson@gmail.com>2011-09-01 12:09:52 -0700
committerAaron Patterson <aaron.patterson@gmail.com>2011-09-01 12:09:52 -0700
commitc9cd187d5aa8fa6607dd463b5f98a65483ae39ce (patch)
treeb371bb72a689ef617eda4afafa8d3ca7cab4f015
parenta7534c26b332d8975f6d82ebe7d2e7baf8ba3b6d (diff)
downloadpsych-c9cd187d5aa8fa6607dd463b5f98a65483ae39ce.tar.gz
Strings tagged binary will be emitted as binary. Fixes #27
-rw-r--r--CHANGELOG.rdoc6
-rw-r--r--lib/psych/visitors/yaml_tree.rb9
-rw-r--r--test/psych/test_string.rb8
3 files changed, 22 insertions, 1 deletions
diff --git a/CHANGELOG.rdoc b/CHANGELOG.rdoc
index 03ec7bb..bbacafa 100644
--- a/CHANGELOG.rdoc
+++ b/CHANGELOG.rdoc
@@ -1,3 +1,9 @@
+Fri Sep 2 04:05:25 2011 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * ext/psych/lib/psych/visitors/yaml_tree.rb: emit strings tagged as
+ ascii-8bit as binary in YAML.
+ * test/psych/test_string.rb: corresponding test.
+
Thu Aug 25 06:11:35 2011 Aaron Patterson <aaron@tenderlovemaking.com>
* ext/psych/lib/psych/nodes/node.rb: default `to_yaml` encoding to be
diff --git a/lib/psych/visitors/yaml_tree.rb b/lib/psych/visitors/yaml_tree.rb
index eef6125..70db181 100644
--- a/lib/psych/visitors/yaml_tree.rb
+++ b/lib/psych/visitors/yaml_tree.rb
@@ -214,12 +214,19 @@ module Psych
end
end
+ def binary? string
+ string.encoding == Encoding::ASCII_8BIT ||
+ string.index("\x00") ||
+ string.count("\x00-\x7F", "^ -~\t\r\n").fdiv(string.length) > 0.3
+ end
+ private :binary?
+
def visit_String o
plain = false
quote = false
style = Nodes::Scalar::ANY
- if o.index("\x00") || o.count("\x00-\x7F", "^ -~\t\r\n").fdiv(o.length) > 0.3
+ if binary?(o)
str = [o].pack('m').chomp
tag = '!binary' # FIXME: change to below when syck is removed
#tag = 'tag:yaml.org,2002:binary'
diff --git a/test/psych/test_string.rb b/test/psych/test_string.rb
index 96d77e0..51f1280 100644
--- a/test/psych/test_string.rb
+++ b/test/psych/test_string.rb
@@ -2,6 +2,14 @@ require 'psych/helper'
module Psych
class TestString < TestCase
+ def test_tagged_binary_should_be_dumped_as_binary
+ string = "hello world!"
+ string.force_encoding 'ascii-8bit'
+ yml = Psych.dump string
+ assert_match(/binary/, yml)
+ assert_equal string, Psych.load(yml)
+ end
+
def test_binary_string_null
string = "\x00"
yml = Psych.dump string