From fa30dd6d2e3151ac2be16673d40cb458a76f1dbe Mon Sep 17 00:00:00 2001 From: Simon Eskildsen Date: Fri, 10 Jul 2015 03:11:37 +0000 Subject: active_support/indifferent_hash: dont raise on to_hash when default_proc raises --- activesupport/CHANGELOG.md | 5 +++++ .../lib/active_support/hash_with_indifferent_access.rb | 4 +++- activesupport/test/core_ext/hash_ext_test.rb | 14 ++++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) (limited to 'activesupport') diff --git a/activesupport/CHANGELOG.md b/activesupport/CHANGELOG.md index e2eb539353..4ffaa666b9 100644 --- a/activesupport/CHANGELOG.md +++ b/activesupport/CHANGELOG.md @@ -1,3 +1,8 @@ +* Fix not calling `#default` on `HashWithIndifferentAcess#to_hash` when only + `default_proc` is set, which could raise. + + *Simon Eskildsen* + * Fix setting `default_proc` on `HashWithIndifferentAccess#dup` *Simon Eskildsen* diff --git a/activesupport/lib/active_support/hash_with_indifferent_access.rb b/activesupport/lib/active_support/hash_with_indifferent_access.rb index bf34a4ef32..63690a1342 100644 --- a/activesupport/lib/active_support/hash_with_indifferent_access.rb +++ b/activesupport/lib/active_support/hash_with_indifferent_access.rb @@ -247,7 +247,9 @@ module ActiveSupport # Convert to a regular hash with string keys. def to_hash - _new_hash = Hash.new(default) + _new_hash = Hash.new + set_defaults(_new_hash) + each do |key, value| _new_hash[key] = convert_value(value, for: :to_hash) end diff --git a/activesupport/test/core_ext/hash_ext_test.rb b/activesupport/test/core_ext/hash_ext_test.rb index 137a03873e..6f66d70217 100644 --- a/activesupport/test/core_ext/hash_ext_test.rb +++ b/activesupport/test/core_ext/hash_ext_test.rb @@ -1015,6 +1015,20 @@ class HashExtTest < ActiveSupport::TestCase new_hash.default = 2 assert_equal 2, new_hash[:non_existant] end + + def test_to_hash_with_raising_default_proc + hash = HashWithIndifferentAccess.new + hash.default_proc = proc { |h, k| raise "walrus" } + + assert_nothing_raised { hash.to_hash } + end + + def test_new_from_hash_copying_default_should_not_raise_when_default_proc_does + hash = Hash.new + hash.default_proc = proc { |h, k| raise "walrus" } + + assert_nothing_raised { HashWithIndifferentAccess.new_from_hash_copying_default(hash) } + end end class IWriteMyOwnXML -- cgit v1.2.3