Class: PeakFlowUtils::DeepMerger

Inherits:
ApplicationService show all
Defined in:
app/services/peak_flow_utils/deep_merger.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(hashes:, object_mappings: {}) ⇒ DeepMerger

Returns a new instance of DeepMerger.



4
5
6
7
# File 'app/services/peak_flow_utils/deep_merger.rb', line 4

def initialize(hashes:, object_mappings: {})
  @hashes = hashes
  @object_mappings = object_mappings
end

Instance Attribute Details

#hashesObject (readonly)

Returns the value of attribute hashes.



2
3
4
# File 'app/services/peak_flow_utils/deep_merger.rb', line 2

def hashes
  @hashes
end

#object_mappingsObject (readonly)

Returns the value of attribute object_mappings.



2
3
4
# File 'app/services/peak_flow_utils/deep_merger.rb', line 2

def object_mappings
  @object_mappings
end

Instance Method Details

#clone_something(object) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'app/services/peak_flow_utils/deep_merger.rb', line 19

def clone_something(object)
  if object.is_a?(Hash)
    new_hash = {}
    merge_hash(object, new_hash)
    new_hash
  elsif object.is_a?(Array)
    new_array = []
    merge_array(object, new_array)
    new_array
  else
    object
  end
end

#merge_array(array, merged) ⇒ Object



43
44
45
46
47
# File 'app/services/peak_flow_utils/deep_merger.rb', line 43

def merge_array(array, merged)
  array.each do |value|
    merged << clone_something(value)
  end
end

#merge_hash(hash, merged) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'app/services/peak_flow_utils/deep_merger.rb', line 49

def merge_hash(hash, merged)
  hash.each do |key, value|
    if value.is_a?(Array)
      merged[key] = []
      merge_array(value, merged[key])
    elsif value.is_a?(Hash)
      merged[key] ||= {}
      merge_hash(value, merged[key])
    else
      merged[key] = clone_something(value)
    end
  end
end

#merge_something(object, merged) ⇒ Object



33
34
35
36
37
38
39
40
41
# File 'app/services/peak_flow_utils/deep_merger.rb', line 33

def merge_something(object, merged)
  if object.is_a?(Array)
    merge_array(object, merged)
  elsif object.is_a?(Hash)
    merge_hash(object, merged)
  else
    raise "Unknown object: #{object.class.name}"
  end
end

#performObject



9
10
11
12
13
14
15
16
17
# File 'app/services/peak_flow_utils/deep_merger.rb', line 9

def perform
  merged = {}

  hashes.each do |hash|
    merge_hash(hash, merged)
  end

  succeed! merged
end