Skip to content

Commit

Permalink
* ext/psych/lib/psych/visitors/to_ruby.rb: merge key values that
Browse files Browse the repository at this point in the history
  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
  • Loading branch information
tenderlove committed Jan 12, 2013
1 parent 92a7da1 commit 0a60805
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 6 deletions.
7 changes: 7 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
Sat Jan 12 08:58:47 2013 Aaron Patterson <[email protected]>

* 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 <[email protected]>

* ext/win32ole/win32ole.c (ole_set_byref): support VT_UI8|VT_BYREF,
Expand Down
26 changes: 20 additions & 6 deletions ext/psych/lib/psych/visitors/to_ruby.rb
Original file line number Diff line number Diff line change
Expand Up @@ -263,28 +263,42 @@ def register_empty object
def revive_hash hash, o
@st[o.anchor] = hash if o.anchor

o.children.each_slice(2) { |k,v|
o.children.each_slice(2) { |k,v|
key = accept(k)
val = accept(v)

if key == '<<'
case v
when Nodes::Alias
hash.merge! accept(v)
begin
hash.merge! val
rescue TypeError
hash[key] = val
end
when Nodes::Sequence
accept(v).reverse_each do |value|
hash.merge! value
begin
h = {}
val.reverse_each do |value|
h.merge! value
end
hash.merge! h
rescue TypeError
hash[key] = val
end
else
hash[key] = accept(v)
hash[key] = val
end
else
hash[key] = accept(v)
hash[key] = val
end

}
hash
end

def merge_key hash, key, val
end

def revive klass, node
s = klass.allocate
@st[node.anchor] = s if node.anchor
Expand Down
51 changes: 51 additions & 0 deletions test/psych/test_merge_keys.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,57 @@

module Psych
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
yaml = <<-eoyml
bar:
Expand Down

0 comments on commit 0a60805

Please sign in to comment.