Module: Celsius::Hash

Defined in:
lib/celsius/hash.rb

Class Method Summary collapse

Class Method Details

.deep_find_key(object, key) ⇒ Object

This module provides some helper functions for dealing with hashes



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/celsius/hash.rb', line 7

def self.deep_find_key(object, key)
  results = []

  if key.is_a?(Array)
    key.inject(object) do |memo, key_element|
      deep_find_key(memo, key_element)
    end
  else
    if object.is_a?(Array)
      # flatten(1) prevents unintend array nesting due to recursion
      results.concat object.map { |value| deep_find_key(value, key) }.flatten(1)
    elsif object.is_a?(Hash)
      if object.has_key?(key.to_s) || object.has_key?(key.to_sym)
        results << (object[key.to_s] || object[key.to_sym])
      else
        # its easier to concat an empty array than checking for nil
        results.concat deep_find_key(object.values, key) || []
      end
    end

    # remove nils
    results.compact!

    # in case nothing was found, return nil to ease detecting this case
    results.empty? ? nil : results
  end
end

.smart_fetch(hash, key) ⇒ Object



35
36
37
38
# File 'lib/celsius/hash.rb', line 35

def self.smart_fetch(hash, key)
  result = hash[key.to_s]
  result = result.nil? ? hash[key.to_sym] : result
end

.smart_store(hash, key, value) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/celsius/hash.rb', line 40

def self.smart_store(hash, key, value)
  if hash[key]
    unless hash[key].is_a?(Array)
      hash[key] = [hash[key]]
    end

    hash[key].push(value)
  else
    hash[key] = value
  end

  hash
end