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…
Reference in a new issue