[前][次][番号順一覧][スレッド一覧]

ruby-changes:24363

From: tenderlove <ko1@a...>
Date: Tue, 17 Jul 2012 04:01:30 +0900 (JST)
Subject: [ruby-changes:24363] tenderlove:r36414 (trunk): * ext/psych/lib/psych/visitors/to_ruby.rb: strings with YAML anchors

tenderlove	2012-07-17 04:00:59 +0900 (Tue, 17 Jul 2012)

  New Revision: 36414

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=36414

  Log:
    * ext/psych/lib/psych/visitors/to_ruby.rb: strings with YAML anchors
      are properly referenced. Patched by Joe Rafaniello via Github:
        https://github.com/tenderlove/psych/pull/69
    * ext/psych/lib/psych/visitors/yaml_tree.rb: ditto
    * test/psych/test_alias_and_anchor.rb: test for change

  Modified files:
    trunk/ChangeLog
    trunk/ext/psych/lib/psych/visitors/to_ruby.rb
    trunk/ext/psych/lib/psych/visitors/yaml_tree.rb
    trunk/test/psych/test_alias_and_anchor.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 36413)
+++ ChangeLog	(revision 36414)
@@ -1,3 +1,11 @@
+Tue Jul 17 03:56:34 2012  Aaron Patterson <aaron@t...>
+
+	* ext/psych/lib/psych/visitors/to_ruby.rb: strings with YAML anchors
+	  are properly referenced. Patched by Joe Rafaniello via Github:
+	    https://github.com/tenderlove/psych/pull/69
+	* ext/psych/lib/psych/visitors/yaml_tree.rb: ditto
+	* test/psych/test_alias_and_anchor.rb: test for change
+
 Mon Jul 16 23:20:24 2012  Tanaka Akira  <akr@f...>
 
 	* bignum.c (rb_integer_float_cmp): use FIXNUM_MIN and FIXNUM_MAX,
Index: ext/psych/lib/psych/visitors/yaml_tree.rb
===================================================================
--- ext/psych/lib/psych/visitors/yaml_tree.rb	(revision 36413)
+++ ext/psych/lib/psych/visitors/yaml_tree.rb	(revision 36414)
@@ -254,7 +254,7 @@
           maptag = '!ruby/string'
           maptag << ":#{o.class}" unless o.class == ::String
 
-          @emitter.start_mapping nil, maptag, false, Nodes::Mapping::BLOCK
+          register o, @emitter.start_mapping(nil, maptag, false, Nodes::Mapping::BLOCK)
           @emitter.scalar 'str', nil, nil, true, false, Nodes::Scalar::ANY
           @emitter.scalar str, nil, tag, plain, quote, style
 
Index: ext/psych/lib/psych/visitors/to_ruby.rb
===================================================================
--- ext/psych/lib/psych/visitors/to_ruby.rb	(revision 36413)
+++ ext/psych/lib/psych/visitors/to_ruby.rb	(revision 36414)
@@ -148,6 +148,7 @@
 
           if klass
             string = klass.allocate.replace string
+            register(o, string)
           end
 
           init_with(string, members.map { |k,v| [k.to_s.sub(/^@/, ''),v] }, o)
Index: test/psych/test_alias_and_anchor.rb
===================================================================
--- test/psych/test_alias_and_anchor.rb	(revision 36413)
+++ test/psych/test_alias_and_anchor.rb	(revision 36414)
@@ -1,5 +1,13 @@
 require 'psych/helper'
 
+class ObjectWithInstanceVariables
+  attr_accessor :var1, :var2
+end
+
+class SubStringWithInstanceVariables < String
+  attr_accessor :var1
+end
+
 module Psych
  class TestAliasAndAnchor < TestCase
    def test_mri_compatibility
@@ -14,6 +22,40 @@
      result.each {|el| assert_same(result[0], el) }
    end
 
+   def test_mri_compatibility_object_with_ivars
+  yaml = <<EOYAML
+--- 
+- &id001 !ruby/object:ObjectWithInstanceVariables 
+  var1: test1
+  var2: test2
+- *id001
+- *id001
+EOYAML
+
+     result = Psych.load yaml
+     result.each do |el| 
+      assert_same(result[0], el)
+      assert_equal('test1', el.var1)
+      assert_equal('test2', el.var2)
+    end
+   end
+
+   def test_mri_compatibility_substring_with_ivars
+    yaml = <<EOYAML
+--- 
+- &id001 !str:SubStringWithInstanceVariables 
+  str: test
+  "@var1": test
+- *id001
+- *id001
+EOYAML
+     result = Psych.load yaml
+     result.each do |el|
+      assert_same(result[0], el)
+      assert_equal('test', el.var1)
+    end
+   end
+
    def test_anchor_alias_round_trip
      o = Object.new
      original = [o,o,o]
@@ -22,5 +64,33 @@
      result = Psych.load yaml
      result.each {|el| assert_same(result[0], el) }
    end
+
+   def test_anchor_alias_round_trip_object_with_ivars
+     o = ObjectWithInstanceVariables.new
+     o.var1 = 'test1'
+     o.var2 = 'test2'
+     original = [o,o,o]
+
+     yaml = Psych.dump original
+     result = Psych.load yaml
+     result.each do |el|
+      assert_same(result[0], el)
+      assert_equal('test1', el.var1)
+      assert_equal('test2', el.var2)
+    end
+   end
+
+   def test_anchor_alias_round_trip_substring_with_ivars
+     o = SubStringWithInstanceVariables.new
+     o.var1 = 'test'
+     original = [o,o,o]
+
+     yaml = Psych.dump original
+     result = Psych.load yaml
+     result.each do |el|
+      assert_same(result[0], el)
+      assert_equal('test', el.var1)
+    end
+   end
  end
 end

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]