Class: Eco::Data::Locations::NodeDiff::NodesDiff::DiffsTree
- Defined in:
- lib/eco/data/locations/node_diff/nodes_diff/diffs_tree.rb
Overview
Helper class to wrap into a tree a set of diffs
Defined Under Namespace
Classes: CyclicAncestorsChain, CyclicHierarchy
Constant Summary collapse
- MAX_ITERATIONS =
16
Instance Attribute Summary collapse
-
#children ⇒ Object
readonly
Returns the value of attribute children.
-
#diff ⇒ Object
Returns the value of attribute diff.
-
#id ⇒ Object
readonly
Returns the value of attribute id.
-
#parent ⇒ Object
readonly
Returns the value of attribute parent.
Instance Method Summary collapse
- #add_child(child_tree) ⇒ Object
- #all_descendants(iteration: 0) ⇒ Object
- #ancestors(iteration: 0) ⇒ Object
- #diff? ⇒ Boolean
-
#initialize(diff = nil, id:) ⇒ DiffsTree
constructor
A new instance of DiffsTree.
- #parent_id ⇒ Object
- #parent_present? ⇒ Boolean
Constructor Details
#initialize(diff = nil, id:) ⇒ DiffsTree
Returns a new instance of DiffsTree.
15 16 17 18 19 |
# File 'lib/eco/data/locations/node_diff/nodes_diff/diffs_tree.rb', line 15 def initialize(diff = nil, id:) @diff = diff @id = id @children = [] end |
Instance Attribute Details
#children ⇒ Object (readonly)
Returns the value of attribute children.
13 14 15 |
# File 'lib/eco/data/locations/node_diff/nodes_diff/diffs_tree.rb', line 13 def children @children end |
#diff ⇒ Object
Returns the value of attribute diff.
12 13 14 |
# File 'lib/eco/data/locations/node_diff/nodes_diff/diffs_tree.rb', line 12 def diff @diff end |
#id ⇒ Object (readonly)
Returns the value of attribute id.
11 12 13 |
# File 'lib/eco/data/locations/node_diff/nodes_diff/diffs_tree.rb', line 11 def id @id end |
#parent ⇒ Object (readonly)
Returns the value of attribute parent.
13 14 15 |
# File 'lib/eco/data/locations/node_diff/nodes_diff/diffs_tree.rb', line 13 def parent @parent end |
Instance Method Details
#add_child(child_tree) ⇒ Object
44 45 46 47 48 49 |
# File 'lib/eco/data/locations/node_diff/nodes_diff/diffs_tree.rb', line 44 def add_child(child_tree) raise ArgumentError, "Expecting #{self.class}. Given: #{child_tree.class}" unless child_tree.is_a?(self.class) prevent_cyclic_chain(child_tree) children.push(child_tree) child_tree.link_parent(self) end |
#all_descendants(iteration: 0) ⇒ Object
59 60 61 62 63 64 65 66 67 |
# File 'lib/eco/data/locations/node_diff/nodes_diff/diffs_tree.rb', line 59 def all_descendants(iteration: 0) msg = "Node '#{id}' can't be the #{iteration}th offspring of any other node." raise CyclicAncestorsChain, msg if max_iterations?(iteration) children.each_with_object([]) do |child, out| out.push(child) out.concat(child.all_descendants(iteration: iteration + 1)) end end |
#ancestors(iteration: 0) ⇒ Object
51 52 53 54 55 56 57 |
# File 'lib/eco/data/locations/node_diff/nodes_diff/diffs_tree.rb', line 51 def ancestors(iteration: 0) msg = "Node '#{id}' can't be the #{iteration}th ancestor of any other node." raise CyclicAncestorsChain, msg if max_iterations?(iteration) return [] unless parent [parent].concat(parent.ancestors(iteration: iteration + 1)) end |
#diff? ⇒ Boolean
27 28 29 |
# File 'lib/eco/data/locations/node_diff/nodes_diff/diffs_tree.rb', line 27 def diff? !!diff end |
#parent_id ⇒ Object
Note:
that the abscense of parent_id (i.e. nil) does NOT
mean that this node does not have an actual parent. This class
supports building partial trees (clusters), where some parents
may not have presence.
39 40 41 42 |
# File 'lib/eco/data/locations/node_diff/nodes_diff/diffs_tree.rb', line 39 def parent_id return nil unless parent parent.id end |
#parent_present? ⇒ Boolean
31 32 33 |
# File 'lib/eco/data/locations/node_diff/nodes_diff/diffs_tree.rb', line 31 def parent_present? !!parent && parent.diff? end |