* ext/psych/lib/psych/visitors/to_ruby.rb: merge key values that
contain something besides a hash should be left in tact. * test/psych/test_merge_keys.rb: test for change git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38788 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
92a7da1900
commit
0a60805af5
@ -1,3 +1,10 @@
|
|||||||
|
Sat Jan 12 08:58:47 2013 Aaron Patterson <aaron@tenderlovemaking.com>
|
||||||
|
|
||||||
|
* ext/psych/lib/psych/visitors/to_ruby.rb: merge key values that
|
||||||
|
contain something besides a hash should be left in tact.
|
||||||
|
|
||||||
|
* test/psych/test_merge_keys.rb: test for change
|
||||||
|
|
||||||
Sat Jan 12 07:52:47 2013 Masaki Suketa <masaki.suketa@nifty.ne.jp>
|
Sat Jan 12 07:52:47 2013 Masaki Suketa <masaki.suketa@nifty.ne.jp>
|
||||||
|
|
||||||
* ext/win32ole/win32ole.c (ole_set_byref): support VT_UI8|VT_BYREF,
|
* ext/win32ole/win32ole.c (ole_set_byref): support VT_UI8|VT_BYREF,
|
||||||
|
@ -263,28 +263,42 @@ module Psych
|
|||||||
def revive_hash hash, o
|
def revive_hash hash, o
|
||||||
@st[o.anchor] = hash if o.anchor
|
@st[o.anchor] = hash if o.anchor
|
||||||
|
|
||||||
o.children.each_slice(2) { |k,v|
|
o.children.each_slice(2) { |k,v|
|
||||||
key = accept(k)
|
key = accept(k)
|
||||||
|
val = accept(v)
|
||||||
|
|
||||||
if key == '<<'
|
if key == '<<'
|
||||||
case v
|
case v
|
||||||
when Nodes::Alias
|
when Nodes::Alias
|
||||||
hash.merge! accept(v)
|
begin
|
||||||
|
hash.merge! val
|
||||||
|
rescue TypeError
|
||||||
|
hash[key] = val
|
||||||
|
end
|
||||||
when Nodes::Sequence
|
when Nodes::Sequence
|
||||||
accept(v).reverse_each do |value|
|
begin
|
||||||
hash.merge! value
|
h = {}
|
||||||
|
val.reverse_each do |value|
|
||||||
|
h.merge! value
|
||||||
|
end
|
||||||
|
hash.merge! h
|
||||||
|
rescue TypeError
|
||||||
|
hash[key] = val
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
hash[key] = accept(v)
|
hash[key] = val
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
hash[key] = accept(v)
|
hash[key] = val
|
||||||
end
|
end
|
||||||
|
|
||||||
}
|
}
|
||||||
hash
|
hash
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def merge_key hash, key, val
|
||||||
|
end
|
||||||
|
|
||||||
def revive klass, node
|
def revive klass, node
|
||||||
s = klass.allocate
|
s = klass.allocate
|
||||||
@st[node.anchor] = s if node.anchor
|
@st[node.anchor] = s if node.anchor
|
||||||
|
@ -2,6 +2,57 @@ require 'psych/helper'
|
|||||||
|
|
||||||
module Psych
|
module Psych
|
||||||
class TestMergeKeys < TestCase
|
class TestMergeKeys < TestCase
|
||||||
|
def test_merge_nil
|
||||||
|
yaml = <<-eoyml
|
||||||
|
defaults: &defaults
|
||||||
|
development:
|
||||||
|
<<: *defaults
|
||||||
|
eoyml
|
||||||
|
assert_equal({'<<' => nil }, Psych.load(yaml)['development'])
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_merge_array
|
||||||
|
yaml = <<-eoyml
|
||||||
|
foo: &hello
|
||||||
|
- 1
|
||||||
|
baz:
|
||||||
|
<<: *hello
|
||||||
|
eoyml
|
||||||
|
assert_equal({'<<' => [1]}, Psych.load(yaml)['baz'])
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_merge_is_not_partial
|
||||||
|
yaml = <<-eoyml
|
||||||
|
default: &default
|
||||||
|
hello: world
|
||||||
|
foo: &hello
|
||||||
|
- 1
|
||||||
|
baz:
|
||||||
|
<<: [*hello, *default]
|
||||||
|
eoyml
|
||||||
|
doc = Psych.load yaml
|
||||||
|
refute doc['baz'].key? 'hello'
|
||||||
|
assert_equal({'<<' => [[1], {"hello"=>"world"}]}, Psych.load(yaml)['baz'])
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_merge_seq_nil
|
||||||
|
yaml = <<-eoyml
|
||||||
|
foo: &hello
|
||||||
|
baz:
|
||||||
|
<<: [*hello]
|
||||||
|
eoyml
|
||||||
|
assert_equal({'<<' => [nil]}, Psych.load(yaml)['baz'])
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_bad_seq_merge
|
||||||
|
yaml = <<-eoyml
|
||||||
|
defaults: &defaults [1, 2, 3]
|
||||||
|
development:
|
||||||
|
<<: *defaults
|
||||||
|
eoyml
|
||||||
|
assert_equal({'<<' => [1,2,3]}, Psych.load(yaml)['development'])
|
||||||
|
end
|
||||||
|
|
||||||
def test_missing_merge_key
|
def test_missing_merge_key
|
||||||
yaml = <<-eoyml
|
yaml = <<-eoyml
|
||||||
bar:
|
bar:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user