mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	* ext/psych/lib/psych/visitors/to_ruby.rb: process merge keys before
reviving objects. Fixes GH psych #168 * test/psych/test_merge_keys.rb: test for change https://github.com/tenderlove/psych/issues/168 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43541 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
		
							parent
							
								
									7835e321ea
								
							
						
					
					
						commit
						9ae2651d19
					
				
					 3 changed files with 30 additions and 9 deletions
				
			
		|  | @ -1,3 +1,10 @@ | |||
| Wed Nov  6 04:14:25 2013  Aaron Patterson <aaron@tenderlovemaking.com> | ||||
| 
 | ||||
| 	* ext/psych/lib/psych/visitors/to_ruby.rb: process merge keys before | ||||
| 	  reviving objects. Fixes GH psych #168 | ||||
| 	* test/psych/test_merge_keys.rb: test for change | ||||
| 	  https://github.com/tenderlove/psych/issues/168 | ||||
| 
 | ||||
| Tue Nov  5 21:21:47 2013  Tanaka Akira  <akr@fsij.org> | ||||
| 
 | ||||
| 	* test/ruby/test_thread.rb (test_thread_join_in_trap): | ||||
|  |  | |||
|  | @ -156,7 +156,7 @@ module Psych | |||
|         if Psych.load_tags[o.tag] | ||||
|           return revive(resolve_class(Psych.load_tags[o.tag]), o) | ||||
|         end | ||||
|         return revive_hash({}, o) unless o.tag | ||||
|         return revive_hash(register(o, {}), o) unless o.tag | ||||
| 
 | ||||
|         case o.tag | ||||
|         when /^!ruby\/struct:?(.*)?$/ | ||||
|  | @ -256,7 +256,7 @@ module Psych | |||
|           set | ||||
| 
 | ||||
|         when /^!map:(.*)$/, /^!ruby\/hash:(.*)$/ | ||||
|           revive_hash resolve_class($1).new, o | ||||
|           revive_hash register(o, resolve_class($1).new), o | ||||
| 
 | ||||
|         when '!omap', 'tag:yaml.org,2002:omap' | ||||
|           map = register(o, class_loader.psych_omap.new) | ||||
|  | @ -266,7 +266,7 @@ module Psych | |||
|           map | ||||
| 
 | ||||
|         else | ||||
|           revive_hash({}, o) | ||||
|           revive_hash(register(o, {}), o) | ||||
|         end | ||||
|       end | ||||
| 
 | ||||
|  | @ -295,8 +295,6 @@ module Psych | |||
|       end | ||||
| 
 | ||||
|       def revive_hash hash, o | ||||
|         @st[o.anchor] = hash if o.anchor | ||||
| 
 | ||||
|         o.children.each_slice(2) { |k,v| | ||||
|           key = accept(k) | ||||
|           val = accept(v) | ||||
|  | @ -334,10 +332,8 @@ module Psych | |||
|       end | ||||
| 
 | ||||
|       def revive klass, node | ||||
|         s = klass.allocate | ||||
|         @st[node.anchor] = s if node.anchor | ||||
|         h = Hash[*node.children.map { |c| accept c }] | ||||
|         init_with(s, h, node) | ||||
|         s = register(node, klass.allocate) | ||||
|         init_with(s, revive_hash({}, node), node) | ||||
|       end | ||||
| 
 | ||||
|       def init_with o, h, node | ||||
|  |  | |||
|  | @ -2,6 +2,24 @@ require_relative 'helper' | |||
| 
 | ||||
| module Psych | ||||
|   class TestMergeKeys < TestCase | ||||
|     class Product | ||||
|       attr_reader :bar | ||||
|     end | ||||
| 
 | ||||
|     def test_mergekey_with_object | ||||
|       s = <<-eoyml | ||||
| foo: &foo | ||||
|   bar: 10 | ||||
| product: | ||||
|   !ruby/object:#{Product.name} | ||||
|   <<: *foo | ||||
|       eoyml | ||||
|       hash = Psych.load s | ||||
|       assert_equal({"bar" => 10}, hash["foo"]) | ||||
|       product = hash["product"] | ||||
|       assert_equal 10, product.bar | ||||
|     end | ||||
| 
 | ||||
|     def test_merge_nil | ||||
|       yaml = <<-eoyml | ||||
| defaults: &defaults | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 tenderlove
						tenderlove