Merge pull request #52234 from kwstannard/indifferent

refactor HashWithIndifferentAccess#to_hash
This commit is contained in:
Jean Boussier 2024-06-30 09:55:26 +02:00 committed by GitHub
commit d43ee20881
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -378,13 +378,10 @@ def compact
# Convert to a regular hash with string keys. # Convert to a regular hash with string keys.
def to_hash def to_hash
_new_hash = Hash.new copy = Hash[self]
set_defaults(_new_hash) copy.transform_values! { |v| convert_value_to_hash(v) }
set_defaults(copy)
each do |key, value| copy
_new_hash[key] = convert_value(value, conversion: :to_hash)
end
_new_hash
end end
def to_proc def to_proc
@ -398,11 +395,7 @@ def convert_key(key)
def convert_value(value, conversion: nil) def convert_value(value, conversion: nil)
if value.is_a? Hash if value.is_a? Hash
if conversion == :to_hash value.nested_under_indifferent_access
value.to_hash
else
value.nested_under_indifferent_access
end
elsif value.is_a?(Array) elsif value.is_a?(Array)
if conversion != :assignment || value.frozen? if conversion != :assignment || value.frozen?
value = value.dup value = value.dup
@ -413,6 +406,17 @@ def convert_value(value, conversion: nil)
end end
end end
def convert_value_to_hash(value)
if value.is_a? Hash
value.to_hash
elsif value.is_a?(Array)
value.map { |e| convert_value_to_hash(e) }
else
value
end
end
def set_defaults(target) def set_defaults(target)
if default_proc if default_proc
target.default_proc = default_proc.dup target.default_proc = default_proc.dup