diff --git a/activesupport/CHANGELOG.md b/activesupport/CHANGELOG.md index ba696374b5753db8c54500c9482036ad31c9089d..cebe19be8918af63430f1378efd1fb2a7db43d8f 100644 --- a/activesupport/CHANGELOG.md +++ b/activesupport/CHANGELOG.md @@ -1,3 +1,7 @@ +* Match `HashWithIndifferentAccess#default`'s behaviour with `Hash#default` + + *David Cornu* + * Adds `:exception_object` key to `ActiveSupport::Notifications::Instrumenter` payload when an exception is raised. Adds new key/value pair to payload when an exception is raised: e.g. `:exception_object => #`. diff --git a/activesupport/lib/active_support/hash_with_indifferent_access.rb b/activesupport/lib/active_support/hash_with_indifferent_access.rb index 4ff35a45a16186eeab31481bdc68ec0bfb263336..b878f31e754808bb8d442c17f56f6de961dd19fa 100644 --- a/activesupport/lib/active_support/hash_with_indifferent_access.rb +++ b/activesupport/lib/active_support/hash_with_indifferent_access.rb @@ -68,12 +68,10 @@ def initialize(constructor = {}) end end - def default(key = nil) - if key.is_a?(Symbol) && include?(key = key.to_s) - self[key] - else - super - end + def default(*args) + key = args.first + args[0] = key.to_s if key.is_a?(Symbol) + super(*args) end def self.new_from_hash_copying_default(hash) @@ -159,6 +157,20 @@ def key?(key) alias_method :has_key?, :key? alias_method :member?, :key? + + # Same as Hash#[] where the key passed as argument can be + # either a string or a symbol: + # + # counters = ActiveSupport::HashWithIndifferentAccess.new + # counters[:foo] = 1 + # + # counters['foo'] # => 1 + # counters[:foo] # => 1 + # counters[:zoo] # => nil + def [](key) + super(convert_key(key)) + end + # Same as Hash#fetch where the key passed as argument can be # either a string or a symbol: # diff --git a/activesupport/test/core_ext/hash_ext_test.rb b/activesupport/test/core_ext/hash_ext_test.rb index 2119352df038378378cdb9c041347d146a6d3215..1b66f784e4c651ccf3b908802b494f72c26600ce 100644 --- a/activesupport/test/core_ext/hash_ext_test.rb +++ b/activesupport/test/core_ext/hash_ext_test.rb @@ -1587,9 +1587,9 @@ def test_should_use_default_proc_for_unknown_key assert_equal 3, hash_wia[:new_key] end - def test_should_use_default_proc_if_no_key_is_supplied + def test_should_return_nil_if_no_key_is_supplied hash_wia = HashWithIndifferentAccess.new { 1 + 2 } - assert_equal 3, hash_wia.default + assert_equal nil, hash_wia.default end def test_should_use_default_value_for_unknown_key