diff options
| -rw-r--r-- | activesupport/CHANGELOG.md | 4 | ||||
| -rw-r--r-- | activesupport/lib/active_support/core_ext/hash/slice.rb | 2 | ||||
| -rw-r--r-- | activesupport/test/core_ext/hash_ext_test.rb | 18 | 
3 files changed, 24 insertions, 0 deletions
| diff --git a/activesupport/CHANGELOG.md b/activesupport/CHANGELOG.md index 246d94882b..cae4ee7fde 100644 --- a/activesupport/CHANGELOG.md +++ b/activesupport/CHANGELOG.md @@ -1,3 +1,7 @@ +*   Fix `slice!` deleting the default value of the hash. + +    *Antonio Santos* +  *   `require_dependency` accepts objects that respond to `to_path`, in      particular `Pathname` instances. diff --git a/activesupport/lib/active_support/core_ext/hash/slice.rb b/activesupport/lib/active_support/core_ext/hash/slice.rb index 9fa9b3dac4..8ad600b171 100644 --- a/activesupport/lib/active_support/core_ext/hash/slice.rb +++ b/activesupport/lib/active_support/core_ext/hash/slice.rb @@ -26,6 +26,8 @@ class Hash      keys.map! { |key| convert_key(key) } if respond_to?(:convert_key, true)      omit = slice(*self.keys - keys)      hash = slice(*keys) +    hash.default      = default +    hash.default_proc = default_proc if default_proc      replace(hash)      omit    end diff --git a/activesupport/test/core_ext/hash_ext_test.rb b/activesupport/test/core_ext/hash_ext_test.rb index 2d0c56bef5..b059bc3e89 100644 --- a/activesupport/test/core_ext/hash_ext_test.rb +++ b/activesupport/test/core_ext/hash_ext_test.rb @@ -781,6 +781,24 @@ class HashExtTest < ActiveSupport::TestCase      assert_equal 'bender', slice['login']    end +  def test_slice_bang_does_not_override_default +    hash = Hash.new(0) +    hash.update(a: 1, b: 2) + +    hash.slice!(:a) + +    assert_equal 0, hash[:c] +  end + +  def test_slice_bang_does_not_override_default_proc +    hash = Hash.new { |h, k| h[k] = [] } +    hash.update(a: 1, b: 2) + +    hash.slice!(:a) + +    assert_equal [], hash[:c] +  end +    def test_extract      original = {:a => 1, :b => 2, :c => 3, :d => 4}      expected = {:a => 1, :b => 2} | 
