aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--activesupport/CHANGELOG2
-rw-r--r--activesupport/lib/active_support/ordered_hash.rb10
-rw-r--r--activesupport/test/ordered_hash_test.rb13
3 files changed, 22 insertions, 3 deletions
diff --git a/activesupport/CHANGELOG b/activesupport/CHANGELOG
index 3f61e9949d..54ac9d9588 100644
--- a/activesupport/CHANGELOG
+++ b/activesupport/CHANGELOG
@@ -1,5 +1,7 @@
*Rails 3.0.0 [Release Candidate] (unreleased)*
+* Ruby 1.9 compatibility: ActiveSupport::OrderedHash#merge and #merge! accept a block. #4838 [Paul Mucur]
+
* Date#since, #ago, #beginning_of_day, #end_of_day, and #xmlschema honor now the user time zone if set. [Geoff Buesing]
diff --git a/activesupport/lib/active_support/ordered_hash.rb b/activesupport/lib/active_support/ordered_hash.rb
index e1a2866863..eda33f827e 100644
--- a/activesupport/lib/active_support/ordered_hash.rb
+++ b/activesupport/lib/active_support/ordered_hash.rb
@@ -130,12 +130,16 @@ module ActiveSupport
end
def merge!(other_hash)
- other_hash.each {|k,v| self[k] = v }
+ if block_given?
+ other_hash.each {|k,v| self[k] = yield(k, self[k], v) }
+ else
+ other_hash.each {|k,v| self[k] = v }
+ end
self
end
- def merge(other_hash)
- dup.merge!(other_hash)
+ def merge(other_hash, &block)
+ dup.merge!(other_hash, &block)
end
# When replacing with another hash, the initial order of our keys must come from the other hash -ordered or not.
diff --git a/activesupport/test/ordered_hash_test.rb b/activesupport/test/ordered_hash_test.rb
index d070206d44..66e727007a 100644
--- a/activesupport/test/ordered_hash_test.rb
+++ b/activesupport/test/ordered_hash_test.rb
@@ -142,9 +142,22 @@ class OrderedHashTest < Test::Unit::TestCase
assert_equal merged.length, @ordered_hash.length + other_hash.length
assert_equal @keys + ['purple', 'violet'], merged.keys
+ another_hash = ActiveSupport::OrderedHash.new
+ another_hash['white'] = 'ff'
+ another_hash['black'] = '00'
+ merged_with_block = @ordered_hash.merge(another_hash) do |key, old_value, new_value|
+ new_value * 3
+ end
+ assert_equal 'ffffff', merged_with_block['white']
+ assert_equal '000000', merged_with_block['black']
+
@ordered_hash.merge! other_hash
assert_equal @ordered_hash, merged
assert_equal @ordered_hash.keys, merged.keys
+
+ @ordered_hash.merge! another_hash
+ assert_equal 'ffffff', merged_with_block['white']
+ assert_equal '000000', merged_with_block['black']
end
def test_shift