class Hash

Public Instance Methods

contains(contains) click to toggle source

deep check if all values are contained

# File lib/inspec/utils/hash.rb, line 28
def contains(contains)
  hash = smash
  contains = contains.smash

  contains.each do |key, val|
    return false if hash[key] != val
  end
  true
end
deep_merge(second) click to toggle source

Inspired by: stackoverflow.com/a/9381776

# File lib/inspec/utils/hash.rb, line 3
def deep_merge(second)
  merger = proc { |_key, v1, v2|
    v1.is_a?(Hash) && v2.is_a?(Hash) ? v1.merge(v2, &merger) : v2
  }
  merge(second, &merger)
end
smash(prefix = nil) click to toggle source

converts a deep hash into a flat hash hash = {

'a' => 1,
'b' => {'c' => 2},

} hash.smash # => {ā€œaā€=>1, ā€œb-cā€=>2}

# File lib/inspec/utils/hash.rb, line 16
def smash(prefix = nil)
  inject({}) do |acc, (key, value)|
    index = prefix.to_s + key.to_s
    if value.is_a?(Hash)
      acc.merge(value.smash(index + "-"))
    else
      acc.merge(index => value)
    end
  end
end