Class: Pangea::Testing::IndifferentHash

Inherits:
Hash
  • Object
show all
Defined in:
lib/pangea/testing/indifferent_hash.rb

Overview

Hash that transparently handles both string and symbol keys. TerraformSynthesizer#synthesis returns symbol keys, but many tests use string keys. This class makes both work seamlessly.

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.deep_convert(obj) ⇒ Object



55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/pangea/testing/indifferent_hash.rb', line 55

def self.deep_convert(obj)
  case obj
  when Hash
    result = IndifferentHash.new
    obj.each { |k, v| result[k.to_s] = deep_convert(v) }
    result
  when Array
    obj.map { |v| deep_convert(v) }
  else
    obj
  end
end

Instance Method Details

#[](key) ⇒ Object



23
24
25
26
27
28
# File 'lib/pangea/testing/indifferent_hash.rb', line 23

def [](key)
  result = super(key.to_s)
  return result unless result.nil?

  key.respond_to?(:to_sym) ? super(key.to_sym) : nil
end

#dig(key, *rest) ⇒ Object



30
31
32
33
34
35
# File 'lib/pangea/testing/indifferent_hash.rb', line 30

def dig(key, *rest)
  val = self[key]
  return val if rest.empty? || val.nil?

  val.respond_to?(:dig) ? val.dig(*rest) : nil
end

#fetch(key, *args, &block) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
# File 'lib/pangea/testing/indifferent_hash.rb', line 43

def fetch(key, *args, &block)
  if has_key?(key)
    self[key]
  elsif args.any?
    args.first
  elsif block
    block.call(key)
  else
    raise KeyError, "key not found: #{key.inspect}"
  end
end

#has_key?(key) ⇒ Boolean Also known as: key?, include?

Returns:

  • (Boolean)


37
38
39
# File 'lib/pangea/testing/indifferent_hash.rb', line 37

def has_key?(key)
  super(key.to_s) || (key.respond_to?(:to_sym) && super(key.to_sym))
end