From aee804ffb97557e8f02bea61152d8a91592b9e12 Mon Sep 17 00:00:00 2001 From: Paul Mucur Date: Fri, 11 Jun 2010 23:38:18 +0100 Subject: [PATCH 1/2] Support passing a block to ActiveSupport::OrderedHash's merge and merge! For better consistency with Ruby's own Hash implementation. --- activesupport/lib/active_support/ordered_hash.rb | 10 +++++++--- activesupport/test/ordered_hash_test.rb | 13 +++++++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/activesupport/lib/active_support/ordered_hash.rb b/activesupport/lib/active_support/ordered_hash.rb index e1a2866..eda33f8 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 d070206..66e7270 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 -- 1.6.6.1 From c3da60dbb3f21fd1c3adce74babdb9576b1611be Mon Sep 17 00:00:00 2001 From: Paul Barry Date: Fri, 11 Jun 2010 23:28:09 -0400 Subject: [PATCH 2/2] [#4838] re-organized test for merge into separate tests --- activesupport/test/ordered_hash_test.rb | 34 +++++++++++++++++++----------- 1 files changed, 21 insertions(+), 13 deletions(-) diff --git a/activesupport/test/ordered_hash_test.rb b/activesupport/test/ordered_hash_test.rb index 66e7270..5636958 100644 --- a/activesupport/test/ordered_hash_test.rb +++ b/activesupport/test/ordered_hash_test.rb @@ -141,23 +141,31 @@ class OrderedHashTest < Test::Unit::TestCase merged = @ordered_hash.merge other_hash assert_equal merged.length, @ordered_hash.length + other_hash.length assert_equal @keys + ['purple', 'violet'], merged.keys + end - 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| + def test_merge_with_block + other_hash = ActiveSupport::OrderedHash.new + other_hash['white'] = 'ff' + other_hash['black'] = '00' + merged = @ordered_hash.merge(other_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'] + assert_equal 'ffffff', merged['white'] + assert_equal '000000', merged['black'] - @ordered_hash.merge! other_hash - assert_equal @ordered_hash, merged - assert_equal @ordered_hash.keys, merged.keys + assert_nil @ordered_hash['white'] + assert_nil @ordered_hash['black'] + end - @ordered_hash.merge! another_hash - assert_equal 'ffffff', merged_with_block['white'] - assert_equal '000000', merged_with_block['black'] + def test_merge_bang_with_block + other_hash = ActiveSupport::OrderedHash.new + other_hash['white'] = 'ff' + other_hash['black'] = '00' + @ordered_hash.merge!(other_hash) do |key, old_value, new_value| + new_value * 3 + end + assert_equal 'ffffff', @ordered_hash['white'] + assert_equal '000000', @ordered_hash['black'] end def test_shift @@ -165,7 +173,7 @@ class OrderedHashTest < Test::Unit::TestCase assert_equal [@keys.first, @values.first], pair assert !@ordered_hash.keys.include?(pair.first) end - + def test_keys original = @ordered_hash.keys.dup @ordered_hash.keys.pop -- 1.6.6.1