Merge pull request #29757 from lugray/hash_with_indifferent_access_default

Fix HashWithIndifferentAccess#default when include?(nil)
This commit is contained in:
Sean Griffin 2017-07-17 13:41:56 -05:00 committed by GitHub
commit a3d704bd11
2 changed files with 56 additions and 10 deletions

@ -76,16 +76,6 @@ def initialize(constructor = {})
end
end
def default(*args)
arg_key = args.first
if include?(key = convert_key(arg_key))
self[key]
else
super
end
end
def self.[](*args)
new.merge!(Hash[*args])
end
@ -187,6 +177,36 @@ def fetch(key, *extras)
super(convert_key(key), *extras)
end
if Hash.new.respond_to?(:dig)
# Same as <tt>Hash#dig</tt> where the key passed as argument can be
# either a string or a symbol:
#
# counters = ActiveSupport::HashWithIndifferentAccess.new
# counters[:foo] = { bar: 1 }
#
# counters.dig('foo', 'bar') # => 1
# counters.dig(:foo, :bar) # => 1
# counters.dig(:zoo) # => nil
def dig(*args)
args[0] = convert_key(args[0]) if args.size > 0
super(*args)
end
end
# Same as <tt>Hash#default</tt> where the key passed as argument can be
# either a string or a symbol:
#
# hash = ActiveSupport::HashWithIndifferentAccess.new(1)
# hash.default # => 1
#
# hash = ActiveSupport::HashWithIndifferentAccess.new { |hash, key| key }
# hash.default # => nil
# hash.default('foo') # => 'foo'
# hash.default(:foo) # => 'foo'
def default(*args)
super(*args.map { |arg| convert_key(arg) })
end
# Returns an array of the values at the specified indices:
#
# hash = ActiveSupport::HashWithIndifferentAccess.new

@ -537,6 +537,32 @@ def test_nested_dig_indifferent_access
assert_equal 1234, data.dig(:this, :views)
end
def test_argless_default_with_existing_nil_key
h = Hash.new(:default).merge(nil => "defined").with_indifferent_access
assert_equal :default, h.default
end
def test_default_with_argument
h = Hash.new { 5 }.merge(1 => 2).with_indifferent_access
assert_equal 5, h.default(1)
end
def test_default_proc
h = ActiveSupport::HashWithIndifferentAccess.new { |hash, key| key }
assert_nil h.default
assert_equal "foo", h.default("foo")
assert_equal "foo", h.default(:foo)
end
def test_double_conversion_with_nil_key
h = { nil => "defined" }.with_indifferent_access.with_indifferent_access
assert_equal nil, h[:undefined_key]
end
def test_assorted_keys_not_stringified
original = { Object.new => 2, 1 => 2, [] => true }
indiff = original.with_indifferent_access