Class: TermUtils::PropertyTreeNode
- Inherits:
-
Object
- Object
- TermUtils::PropertyTreeNode
- Defined in:
- lib/term_utils/property_tree_node.rb
Overview
Represents a general-purpose tree node that holds a key-value pair.
Instance Attribute Summary collapse
- #child_nodes ⇒ Array<TermUtils::PropertyTreeNode>
- #key ⇒ Object
- #parent_node ⇒ TermUtils::PropertyTreeNode
- #value ⇒ Object
Instance Method Summary collapse
-
#child_node(key) ⇒ TermUtils::PropertyTreeNode?
Returns the child node identified by a given key.
-
#collect_nodes(opts = {}) ⇒ Array<TermUtils::PropertyTreeNode>
Collects nodes.
-
#collect_paths(opts = {}) ⇒ Array<Array<Object>>
Collects node paths.
-
#collect_values(opts = {}) ⇒ Array<Object>
Collect node values.
-
#define_node(opts = {}, &block) ⇒ TermUtils::PropertyTreeNode
Creates a new node and adds it as a child.
-
#each_node(opts = {}, &block) ⇒ nil
Iterates over every node.
-
#eval_child_count(path) ⇒ Integer
Evaluates the total number of nodes in the tree represented by this one.
-
#find_node(path) ⇒ TermUtils::PropertyTreeNode
Finds the node identified by a given path of keys.
-
#find_node_value(path) ⇒ Object
Finds the node identified by a given path of keys and returns its value.
-
#head? ⇒ Boolean
Tests whether this one is the head of the tree (i.e. has no parent).
-
#initialize(opts = {}, &block) ⇒ PropertyTreeNode
constructor
Creates a new node.
-
#initialize_dup(other) ⇒ Object
For dup method.
-
#leaf? ⇒ Boolean
Tests whether this one is a leaf of the tree (i.e. has no child).
-
#node_exists?(path) ⇒ Boolean
Tests whether the node identified by a given path of keys exists.
-
#path ⇒ Array<Object>
Builds the path of keys.
Constructor Details
#initialize(opts = {}, &block) ⇒ PropertyTreeNode
Creates a new node. option opts [Object] :key option opts [Object] :value
31 32 33 34 35 36 37 |
# File 'lib/term_utils/property_tree_node.rb', line 31 def initialize(opts = {}, &block) @parent_node = nil @child_nodes = nil @key = opts.fetch(:key, nil) @value = opts.fetch(:value, nil) block.call(self) if block end |
Instance Attribute Details
#child_nodes ⇒ Array<TermUtils::PropertyTreeNode>
22 23 24 |
# File 'lib/term_utils/property_tree_node.rb', line 22 def child_nodes @child_nodes end |
#key ⇒ Object
24 25 26 |
# File 'lib/term_utils/property_tree_node.rb', line 24 def key @key end |
#parent_node ⇒ TermUtils::PropertyTreeNode
20 21 22 |
# File 'lib/term_utils/property_tree_node.rb', line 20 def parent_node @parent_node end |
#value ⇒ Object
26 27 28 |
# File 'lib/term_utils/property_tree_node.rb', line 26 def value @value end |
Instance Method Details
#child_node(key) ⇒ TermUtils::PropertyTreeNode?
Returns the child node identified by a given key.
64 65 66 67 68 |
# File 'lib/term_utils/property_tree_node.rb', line 64 def child_node(key) if @child_nodes @child_nodes.find { |n| n.key == key } end end |
#collect_nodes(opts = {}) ⇒ Array<TermUtils::PropertyTreeNode>
Collects nodes.
137 138 139 140 141 142 143 |
# File 'lib/term_utils/property_tree_node.rb', line 137 def collect_nodes(opts = {}) nodes = [] each_node(opts) do |n| nodes << n end nodes end |
#collect_paths(opts = {}) ⇒ Array<Array<Object>>
Collects node paths.
147 148 149 150 151 152 153 |
# File 'lib/term_utils/property_tree_node.rb', line 147 def collect_paths(opts = {}) paths = [] each_node(opts) do |n| paths << n.path end paths end |
#collect_values(opts = {}) ⇒ Array<Object>
Collect node values.
157 158 159 160 161 162 163 |
# File 'lib/term_utils/property_tree_node.rb', line 157 def collect_values(opts = {}) vals = [] each_node(opts) do |n| vals << n.value if n.value end vals end |
#define_node(opts = {}, &block) ⇒ TermUtils::PropertyTreeNode
Creates a new node and adds it as a child.
72 73 74 75 76 77 78 79 |
# File 'lib/term_utils/property_tree_node.rb', line 72 def define_node(opts = {}, &block) new_node = TermUtils::PropertyTreeNode.new(opts) new_node.parent_node = self @child_nodes = [] unless @child_nodes @child_nodes << new_node block.call(new_node) if block new_node end |
#each_node(opts = {}, &block) ⇒ nil
Iterates over every node.
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
# File 'lib/term_utils/property_tree_node.rb', line 90 def each_node(opts = {}, &block) rpath = nil if opts.has_key? :path rpath = opts[:path].dup end dive = true if @key hide = false if rpath if rpath.shift == @key unless rpath.empty? hide = true end else dive = false hide = true end end unless hide or (opts[:leaf_only] and @child_nodes) if opts.has_key? :block opts[:block].call(self) elsif block block.call(self) end end end # if @key if dive and @child_nodes ropts = opts.dup if rpath if rpath.empty? ropts.delete :path else ropts[:path] = rpath end end if block ropts[:block] = block end @child_nodes.each do |n| n.each_node(ropts) end end nil end |
#eval_child_count(path) ⇒ Integer
Evaluates the total number of nodes in the tree represented by this one.
184 185 186 187 188 189 |
# File 'lib/term_utils/property_tree_node.rb', line 184 def eval_child_count(path) node = find_node(path) if node node.child_nodes ? node.child_nodes.length : 0 end end |
#find_node(path) ⇒ TermUtils::PropertyTreeNode
Finds the node identified by a given path of keys.
167 168 169 170 171 172 173 174 |
# File 'lib/term_utils/property_tree_node.rb', line 167 def find_node(path) catch :found do each_node(:path => path) do |n| throw :found, n end nil end end |
#find_node_value(path) ⇒ Object
Finds the node identified by a given path of keys and returns its value.
193 194 195 196 197 198 |
# File 'lib/term_utils/property_tree_node.rb', line 193 def find_node_value(path) node = find_node(path) if node node.value end end |
#head? ⇒ Boolean
Tests whether this one is the head of the tree (i.e. has no parent).
53 54 55 |
# File 'lib/term_utils/property_tree_node.rb', line 53 def head? @parent_node == nil end |
#initialize_dup(other) ⇒ Object
For dup method.
39 40 41 42 43 44 45 46 47 48 49 50 |
# File 'lib/term_utils/property_tree_node.rb', line 39 def initialize_dup(other) @parent_node = nil if other.child_nodes @child_nodes = [] other.child_nodes.each do |n| new_node = n.dup new_node.parent_node = self @child_nodes << new_node end end super end |
#leaf? ⇒ Boolean
Tests whether this one is a leaf of the tree (i.e. has no child).
58 59 60 |
# File 'lib/term_utils/property_tree_node.rb', line 58 def leaf? @child_nodes == nil end |
#node_exists?(path) ⇒ Boolean
Tests whether the node identified by a given path of keys exists.
178 179 180 |
# File 'lib/term_utils/property_tree_node.rb', line 178 def node_exists?(path) find_node(path) != nil end |
#path ⇒ Array<Object>
Builds the path of keys.
82 83 84 85 86 |
# File 'lib/term_utils/property_tree_node.rb', line 82 def path p = @parent_node ? @parent_node.path : [] p << @key if @key p end |