Class: Brujula::Mergers::MapObjectMerger
- Inherits:
-
Object
- Object
- Brujula::Mergers::MapObjectMerger
- Defined in:
- lib/brujula/mergers/map_object_merger.rb
Instance Attribute Summary collapse
-
#instance ⇒ Object
readonly
Returns the value of attribute instance.
-
#superinstance ⇒ Object
readonly
Returns the value of attribute superinstance.
Instance Method Summary collapse
- #call ⇒ Object
- #each_inheritable_items ⇒ Object
-
#initialize(instance:, superinstance:) ⇒ MapObjectMerger
constructor
A new instance of MapObjectMerger.
- #instance_has_item?(key) ⇒ Boolean
- #instance_has_optional_item?(key) ⇒ Boolean
- #item_names ⇒ Object
- #item_reference(key) ⇒ Object
- #merge_item?(key) ⇒ Boolean
- #merger(merge_item, inherit_item) ⇒ Object
- #optional_key?(key) ⇒ Boolean
Constructor Details
#initialize(instance:, superinstance:) ⇒ MapObjectMerger
Returns a new instance of MapObjectMerger.
6 7 8 9 |
# File 'lib/brujula/mergers/map_object_merger.rb', line 6 def initialize(instance:, superinstance:) @superinstance = superinstance @instance = instance end |
Instance Attribute Details
#instance ⇒ Object (readonly)
Returns the value of attribute instance.
4 5 6 |
# File 'lib/brujula/mergers/map_object_merger.rb', line 4 def instance @instance end |
#superinstance ⇒ Object (readonly)
Returns the value of attribute superinstance.
4 5 6 |
# File 'lib/brujula/mergers/map_object_merger.rb', line 4 def superinstance @superinstance end |
Instance Method Details
#call ⇒ Object
11 12 13 14 15 16 17 18 19 |
# File 'lib/brujula/mergers/map_object_merger.rb', line 11 def call return superinstance.dup if instance.nil? instance.dup.tap do |extended_instance| each_inheritable_items do |inherit_item| extended_instance.merge(inherit_item.name, inherit_item) end end end |
#each_inheritable_items ⇒ Object
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
# File 'lib/brujula/mergers/map_object_merger.rb', line 21 def each_inheritable_items superinstance.each do |inherit_item| merge_item = case item_reference(inherit_item.name) when :optional_to_optional instance.fetch(inherit_item.name) when :optional instance.fetch(inherit_item.name.gsub(/\?$/, '')) when :direct instance.key?(inherit_item.name) ? instance.fetch(inherit_item.name) : nil else next end yield merger(merge_item, inherit_item) end end |
#instance_has_item?(key) ⇒ Boolean
65 66 67 |
# File 'lib/brujula/mergers/map_object_merger.rb', line 65 def instance_has_item?(key) item_names.include?(key.gsub(/\?$/, '')) end |
#instance_has_optional_item?(key) ⇒ Boolean
69 70 71 |
# File 'lib/brujula/mergers/map_object_merger.rb', line 69 def instance_has_optional_item?(key) item_names.include?(key) end |
#item_names ⇒ Object
73 74 75 |
# File 'lib/brujula/mergers/map_object_merger.rb', line 73 def item_names @item_names ||= instance.to_a.map(&:name) end |
#item_reference(key) ⇒ Object
44 45 46 47 48 49 50 51 52 53 |
# File 'lib/brujula/mergers/map_object_merger.rb', line 44 def item_reference(key) case when optional_key?(key) && instance_has_optional_item?(key) :optional_to_optional when optional_key?(key) && instance_has_item?(key) :optional when !optional_key?(key) :direct end end |
#merge_item?(key) ⇒ Boolean
55 56 57 58 59 |
# File 'lib/brujula/mergers/map_object_merger.rb', line 55 def merge_item?(key) return true unless optional_key?(key) instance_has_item?(key) || instance_has_optional_item?(key) end |
#merger(merge_item, inherit_item) ⇒ Object
40 41 42 |
# File 'lib/brujula/mergers/map_object_merger.rb', line 40 def merger(merge_item, inherit_item) Merger.new(instance: merge_item, superinstance: inherit_item).call end |
#optional_key?(key) ⇒ Boolean
61 62 63 |
# File 'lib/brujula/mergers/map_object_merger.rb', line 61 def optional_key?(key) key.to_s.end_with?('?') end |