Module: Cosmo::Utils::Hash

Defined in:
lib/cosmo/utils/hash.rb

Class Method Summary collapse

Class Method Details

.dup(hash) ⇒ Object

deep dup



27
28
29
# File 'lib/cosmo/utils/hash.rb', line 27

def dup(hash)
  Marshal.load(Marshal.dump(hash))
end

.keys?(hash, *keys) ⇒ Boolean

dig keys

Returns:

  • (Boolean)


32
33
34
35
36
37
38
39
40
# File 'lib/cosmo/utils/hash.rb', line 32

def keys?(hash, *keys)
  keys.reduce(hash) do |base, key|
    return false if !base.is_a?(::Hash) || !base.key?(key)

    base[key]
  end

  true
end

.merge(hash1, hash2) ⇒ Object

deep merge



53
54
55
56
57
58
59
60
61
62
63
# File 'lib/cosmo/utils/hash.rb', line 53

def merge(hash1, hash2)
  return hash1 unless hash2

  hash1.merge(hash2) do |_key, old_val, new_val|
    if old_val.is_a?(::Hash) && new_val.is_a?(::Hash)
      merge(old_val, new_val)
    else
      new_val
    end
  end
end

.set(hash, *keys, value) ⇒ Object

deep set



43
44
45
46
47
48
49
50
# File 'lib/cosmo/utils/hash.rb', line 43

def set(hash, *keys, value)
  last_key = keys.pop
  target = keys.reduce(hash) do |base, key|
    base[key] ||= {}
    base[key]
  end
  target[last_key] = value
end

.symbolize_keys!(obj) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/cosmo/utils/hash.rb', line 8

def symbolize_keys!(obj)
  case obj
  when ::Hash
    obj.keys.each do |key|
      raise ArgumentError, "key cannot be converted to symbol" unless key.respond_to?(:to_sym)

      sym = key.to_sym
      value = obj.delete(key)
      obj[sym] = symbolize_keys!(value)
    end
    obj
  when ::Array
    obj.map! { |v| symbolize_keys!(v) }
  else
    obj
  end
end