From a17cdfdde29faa7e6c5feb1c31d41e4f42328daa Mon Sep 17 00:00:00 2001 From: tenderlove Date: Wed, 19 Jan 2011 23:05:53 +0000 Subject: [PATCH] * ext/psych/lib/psych/coder.rb (represent_object): arbitrary objects may be passed to the Psych::Coder object. * ext/psych/lib/psych/visitors/yaml_tree.rb: support for visiting arbitrary objects set on the coder. * test/psych/test_coder.rb: supporting test case. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@30609 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 10 ++++++++++ ext/psych/lib/psych/coder.rb | 24 +++++++++++++++-------- ext/psych/lib/psych/visitors/yaml_tree.rb | 2 ++ test/psych/test_coder.rb | 11 +++++++++++ 4 files changed, 39 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index a3bb1ec080..bdea51f839 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +Thu Jan 20 08:02:46 2011 Aaron Patterson + + * ext/psych/lib/psych/coder.rb (represent_object): arbitrary objects + may be passed to the Psych::Coder object. + + * ext/psych/lib/psych/visitors/yaml_tree.rb: support for visiting + arbitrary objects set on the coder. + + * test/psych/test_coder.rb: supporting test case. + Thu Jan 20 06:03:17 2011 Tanaka Akira * method.h: parenthesize macro arguments. diff --git a/ext/psych/lib/psych/coder.rb b/ext/psych/lib/psych/coder.rb index c06c9c1e61..2b830d2b21 100644 --- a/ext/psych/lib/psych/coder.rb +++ b/ext/psych/lib/psych/coder.rb @@ -6,17 +6,18 @@ module Psych # objects like Sequence and Scalar may be emitted if +seq=+ or +scalar=+ are # called, respectively. class Coder - attr_accessor :tag, :style, :implicit + attr_accessor :tag, :style, :implicit, :object attr_reader :type, :seq def initialize tag - @map = {} - @seq = [] - @implicit = false - @type = :map - @tag = tag - @style = Psych::Nodes::Mapping::BLOCK - @scalar = nil + @map = {} + @seq = [] + @implicit = false + @type = :map + @tag = tag + @style = Psych::Nodes::Mapping::BLOCK + @scalar = nil + @object = nil end def scalar *args @@ -54,6 +55,13 @@ module Psych self.map = map end + # Emit an arbitrary object +obj+ and +tag+ + def represent_object tag, obj + @tag = tag + @type = :object + @object = obj + end + # Emit a scalar with +value+ def scalar= value @type = :scalar diff --git a/ext/psych/lib/psych/visitors/yaml_tree.rb b/ext/psych/lib/psych/visitors/yaml_tree.rb index b862528502..e7d182f707 100644 --- a/ext/psych/lib/psych/visitors/yaml_tree.rb +++ b/ext/psych/lib/psych/visitors/yaml_tree.rb @@ -342,6 +342,8 @@ module Psych accept v end @emitter.end_mapping + when :object + accept c.object end end diff --git a/test/psych/test_coder.rb b/test/psych/test_coder.rb index c171c5ad0d..4809b13d5d 100644 --- a/test/psych/test_coder.rb +++ b/test/psych/test_coder.rb @@ -89,6 +89,17 @@ module Psych end end + class RepresentWithObject + def encode_with coder + coder.represent_object self.class.name, 20 + end + end + + def test_represent_with_object + thing = Psych.load(Psych.dump(RepresentWithObject.new)) + assert_equal 20, thing + end + def test_json_dump_exclude_tag refute_match('TestCoder::InitApi', Psych.to_json(InitApi.new)) end