2014-04-30 17:34:37 +00:00
|
|
|
module Hashie
|
|
|
|
module Extensions
|
|
|
|
module SymbolizeKeys
|
|
|
|
# Convert all keys in the hash to symbols.
|
|
|
|
#
|
|
|
|
# @example
|
|
|
|
# test = {'abc' => 'def'}
|
|
|
|
# test.symbolize_keys!
|
|
|
|
# test # => {:abc => 'def'}
|
|
|
|
def symbolize_keys!
|
2014-12-23 20:06:40 +00:00
|
|
|
SymbolizeKeys.symbolize_keys!(self)
|
2014-04-30 17:34:37 +00:00
|
|
|
self
|
|
|
|
end
|
|
|
|
|
|
|
|
# Return a new hash with all keys converted
|
|
|
|
# to symbols.
|
|
|
|
def symbolize_keys
|
2015-06-05 16:48:09 +00:00
|
|
|
SymbolizeKeys.symbolize_keys(self)
|
2014-04-30 17:34:37 +00:00
|
|
|
end
|
|
|
|
|
2014-12-23 20:06:40 +00:00
|
|
|
module ClassMethods
|
|
|
|
# Symbolize all keys recursively within nested
|
|
|
|
# hashes and arrays.
|
|
|
|
# @api private
|
|
|
|
def symbolize_keys_recursively!(object)
|
|
|
|
case object
|
2015-06-05 16:48:09 +00:00
|
|
|
when self.class
|
|
|
|
symbolize_keys!(object)
|
2014-12-23 20:06:40 +00:00
|
|
|
when ::Array
|
|
|
|
object.each do |i|
|
|
|
|
symbolize_keys_recursively!(i)
|
|
|
|
end
|
|
|
|
when ::Hash
|
|
|
|
symbolize_keys!(object)
|
2014-04-30 17:34:37 +00:00
|
|
|
end
|
2014-11-30 04:27:58 +00:00
|
|
|
end
|
|
|
|
|
2014-12-23 20:06:40 +00:00
|
|
|
# Convert all keys in hash to symbols.
|
|
|
|
#
|
|
|
|
# @param [Hash] hash
|
|
|
|
# @example
|
|
|
|
# test = {'abc' => 'def'}
|
|
|
|
# Hashie.symbolize_keys! test
|
|
|
|
# test # => {:abc => 'def'}
|
|
|
|
def symbolize_keys!(hash)
|
2015-06-05 16:48:09 +00:00
|
|
|
hash.extend(Hashie::Extensions::SymbolizeKeys) unless hash.respond_to?(:symbolize_keys!)
|
2018-02-03 16:23:14 +00:00
|
|
|
hash.keys.each do |k| # rubocop:disable Performance/HashEachMethods
|
2014-12-23 20:06:40 +00:00
|
|
|
symbolize_keys_recursively!(hash[k])
|
2020-05-05 01:15:32 +00:00
|
|
|
hash[convert_key(k)] = hash.delete(k)
|
2014-12-23 20:06:40 +00:00
|
|
|
end
|
|
|
|
hash
|
2014-04-30 17:34:37 +00:00
|
|
|
end
|
2014-12-23 20:06:40 +00:00
|
|
|
|
|
|
|
# Return a copy of hash with all keys converted
|
|
|
|
# to symbols.
|
|
|
|
# @param [::Hash] hash
|
|
|
|
def symbolize_keys(hash)
|
2015-06-05 16:48:09 +00:00
|
|
|
copy = hash.dup
|
|
|
|
copy.extend(Hashie::Extensions::SymbolizeKeys) unless copy.respond_to?(:symbolize_keys!)
|
|
|
|
copy.tap do |new_hash|
|
|
|
|
symbolize_keys!(new_hash)
|
2014-12-23 20:06:40 +00:00
|
|
|
end
|
|
|
|
end
|
2020-05-05 01:15:32 +00:00
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
# Converts a key to a symbol, if possible
|
|
|
|
#
|
|
|
|
# @api private
|
|
|
|
# @param [<K>] key the key to attempt convert to a symbol
|
|
|
|
# @return [Symbol, K]
|
|
|
|
def convert_key(key)
|
|
|
|
key.respond_to?(:to_sym) ? key.to_sym : key
|
|
|
|
end
|
2014-12-23 20:06:40 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
class << self
|
|
|
|
include ClassMethods
|
2014-04-30 17:34:37 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|