aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--ext/psych/lib/psych/visitors/to_ruby.rb13
-rw-r--r--test/psych/test_merge_keys.rb51
3 files changed, 69 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 35085cdd47..c5540dc6e3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Sat Jan 22 11:49:55 2011 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * ext/psych/lib/psych/visitors/to_ruby.rb: fixing merge key support
+ when multiple merge keys are specified.
+
+ * test/psych/test_merge_keys.rb: tests for multi-merge key support
+
Sat Jan 22 11:33:04 2011 Aaron Patterson <aaron@tenderlovemaking.com>
* ext/psych/lib/psych/visitors/to_ruby.rb: merge keys are actually
diff --git a/ext/psych/lib/psych/visitors/to_ruby.rb b/ext/psych/lib/psych/visitors/to_ruby.rb
index b5bec54af5..7f0ddff96c 100644
--- a/ext/psych/lib/psych/visitors/to_ruby.rb
+++ b/ext/psych/lib/psych/visitors/to_ruby.rb
@@ -187,8 +187,17 @@ module Psych
o.children.each_slice(2) { |k,v|
key = accept(k)
- if key == '<<' && Nodes::Alias === v
- hash.merge! accept(v)
+ if key == '<<'
+ case v
+ when Nodes::Alias
+ hash.merge! accept(v)
+ when Nodes::Sequence
+ accept(v).reverse_each do |value|
+ hash.merge! value
+ end
+ else
+ hash[key] = accept(v)
+ end
else
hash[key] = accept(v)
end
diff --git a/test/psych/test_merge_keys.rb b/test/psych/test_merge_keys.rb
index 9aadcc85e5..fef8892727 100644
--- a/test/psych/test_merge_keys.rb
+++ b/test/psych/test_merge_keys.rb
@@ -17,5 +17,56 @@ bar:
"bar" => { "hello" => "world", "baz" => "boo" } }
assert_equal hash, Psych.load(yaml)
end
+
+ def test_multiple_maps
+ yaml = <<-eoyaml
+---
+- &CENTER { x: 1, y: 2 }
+- &LEFT { x: 0, y: 2 }
+- &BIG { r: 10 }
+- &SMALL { r: 1 }
+
+# All the following maps are equal:
+
+- # Merge multiple maps
+ << : [ *CENTER, *BIG ]
+ label: center/big
+ eoyaml
+
+ hash = {
+ 'x' => 1,
+ 'y' => 2,
+ 'r' => 10,
+ 'label' => 'center/big'
+ }
+
+ assert_equal hash, Psych.load(yaml)[4]
+ end
+
+ def test_override
+ yaml = <<-eoyaml
+---
+- &CENTER { x: 1, y: 2 }
+- &LEFT { x: 0, y: 2 }
+- &BIG { r: 10 }
+- &SMALL { r: 1 }
+
+# All the following maps are equal:
+
+- # Override
+ << : [ *BIG, *LEFT, *SMALL ]
+ x: 1
+ label: center/big
+ eoyaml
+
+ hash = {
+ 'x' => 1,
+ 'y' => 2,
+ 'r' => 10,
+ 'label' => 'center/big'
+ }
+
+ assert_equal hash, Psych.load(yaml)[4]
+ end
end
end