class Hash

:nodoc:

def deep_key?(key)


Returns true if the given key is present inside deeply nested hash
def deep_key?(key)
  self.deep_keys.include? key
end unless method_defined? :deep_key?

def deep_keys


Searches for all deeply nested keys
def deep_keys
  keys = self.keys
  keys.each do |key|
    if self[key].is_a?(Hash)
      keys << self[key].deep_keys.compact.flatten
      next
    end
  end
  keys.flatten
end unless method_defined? :deep_keys

def deep_merge(other, &block)


Recursively merges self with other hash and returns new hash.
def deep_merge(other, &block)
  dup.deep_merge!(other, &block)
end unless method_defined? :deep_merge

def deep_merge!(other, &block)


Similar as deep_merge but modifies self
def deep_merge!(other, &block)
  other.each_pair do |key, val|
    tval = self[key]
    if tval.is_a?(Hash) && val.is_a?(Hash)
      self[key] = tval.deep_merge(val)
    else
      self[key] = block && tval ? block.call(k, tval, val) : val
    end
  end
  self
end unless method_defined? :deep_merge!

def except(*items)


Returns a new hash with keys removed
def except(*items)
  self.dup.except!(*items)
end unless method_defined? :except

def except!(*keys)


Similar to except but modifies self
def except!(*keys)
  keys.each { |key| delete(key) }
  self
end unless method_defined? :except!

def serialize


Returns hash collapsed into a query string
def serialize
  self.map { |key, val| [key, val].join("=") }.join("&")
end unless method_defined? :serialize

def symbolize_keys


Returns a new hash with all the keys converted to symbols
def symbolize_keys
  inject({}) do |hash, (key, value)|
    hash[(key.to_sym rescue key) || key] = value
    hash
  end
end unless method_defined? :symbolize_keys

def symbolize_keys!


Similar to symbolize_keys but modifies self
def symbolize_keys!
  hash = symbolize_keys
  hash.each do |key, val|
    hash[key] = case val
      when Hash
        val.symbolize_keys!
      when Array
        val.map do |item|
          item.is_a?(Hash) ? item.symbolize_keys! : item
        end
      else
        val
      end
  end
  return hash
end unless method_defined? :symbolize_keys!