jumoku 0.2.4 → 0.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/jumoku.rb +40 -25
- data/lib/jumoku/builders/arborescence.rb +14 -4
- data/lib/jumoku/builders/extended.rb +1 -1
- data/lib/jumoku/builders/raw_directed_tree.rb +7 -11
- data/lib/jumoku/builders/raw_undirected_tree.rb +4 -10
- data/lib/jumoku/builders/shared.rb +6 -13
- data/lib/jumoku/classes/tree_classes.rb +6 -0
- data/lib/jumoku/strategies.rb +32 -0
- data/lib/jumoku/strategies/edge_labeling.rb +10 -2
- data/lib/jumoku/strategies/edge_labeling/simple.rb +3 -3
- data/lib/jumoku/support/branch.rb +7 -1
- data/lib/jumoku/support/ruby_compatibility.rb +1 -1
- data/lib/jumoku/support/support.rb +6 -0
- data/lib/jumoku/version.rb +1 -1
- data/spec/strategies/simple_edge_labeling.rb +3 -3
- metadata +32 -3
- data/lib/jumoku/raw_tree_node.rb +0 -27
data/lib/jumoku.rb
CHANGED
@@ -9,44 +9,59 @@ require 'hashery'
|
|
9
9
|
require 'plexus'
|
10
10
|
|
11
11
|
# Jumoku provides you with several modules and classes to build and manipulate
|
12
|
-
# tree
|
13
|
-
# ({RawUndirectedTree}) and directed trees ({RawDirectedTree}).
|
12
|
+
# tree-graphs.
|
14
13
|
#
|
15
|
-
#
|
16
|
-
#
|
17
|
-
#
|
18
|
-
#
|
14
|
+
# A tree is a structure composed of branches binding nodes. Branches may be
|
15
|
+
# directed (arcs) or undirected (edges). When a there is only one general
|
16
|
+
# direction (flow), there is a root node, and one or several leaf nodes. A
|
17
|
+
# directed, uni-flow tree where each node only branches in once and branches
|
18
|
+
# out once is called a path. For more information on what a tree-graph is and
|
19
|
+
# how you could make use of it, see the README.
|
19
20
|
#
|
20
|
-
#
|
21
|
-
#
|
22
|
-
#
|
23
|
-
#
|
24
|
-
#
|
21
|
+
# Two basic implementations are available: undirected trees
|
22
|
+
# ({RawUndirectedTree}) and directed trees ({RawDirectedTree}). They offer
|
23
|
+
# limited features, so one will certainly drop to their civilized siblings:
|
24
|
+
#
|
25
|
+
# * {Tree} is derived from an undirected tree and sticks to the mathematical
|
26
|
+
# tree definition.
|
27
|
+
# * {Arborescence} is derived from a directed tree and is likely to be used
|
28
|
+
# as the basis to modelize hierarchy structures, such as a family tree, a file
|
29
|
+
# browser…
|
30
|
+
#
|
31
|
+
# A node can be any Object: there is no "node type". A nice object "type" to
|
32
|
+
# use as a node may be an OpenStruct or an OpenHash (from the Facets library),
|
33
|
+
# but really any object is valid.
|
34
|
+
#
|
35
|
+
# Jumoku allows you to enable some strategies when creating a new tree. For
|
36
|
+
# instance, you may enable an edge/arc labeling strategy, which will cause
|
37
|
+
# indexing of branches as they are added. Jumoku provides a few basic
|
38
|
+
# strategies mixin, and one may implement custom ones.
|
25
39
|
#
|
26
40
|
module Jumoku
|
27
41
|
# core implementations
|
28
|
-
autoload :Shared,
|
29
|
-
autoload :Extended,
|
42
|
+
autoload :Shared, 'jumoku/builders/shared'
|
43
|
+
autoload :Extended, 'jumoku/builders/extended'
|
30
44
|
|
31
45
|
# branch types
|
32
|
-
autoload :UndirectedBranch,
|
33
|
-
autoload :DirectedBranch,
|
46
|
+
autoload :UndirectedBranch, 'jumoku/support/branch'
|
47
|
+
autoload :DirectedBranch, 'jumoku/support/branch'
|
34
48
|
|
35
49
|
# tree builders
|
36
|
-
autoload :RawUndirectedTreeBuilder,
|
37
|
-
autoload :RawDirectedTreeBuilder,
|
38
|
-
autoload :TreeBuilder,
|
39
|
-
autoload :ArborescenceBuilder,
|
50
|
+
autoload :RawUndirectedTreeBuilder, 'jumoku/builders/raw_undirected_tree'
|
51
|
+
autoload :RawDirectedTreeBuilder, 'jumoku/builders/raw_directed_tree'
|
52
|
+
autoload :TreeBuilder, 'jumoku/builders/tree'
|
53
|
+
autoload :ArborescenceBuilder, 'jumoku/builders/arborescence'
|
40
54
|
|
41
55
|
# tree classes
|
42
|
-
autoload :RawDirectedTree,
|
43
|
-
autoload :RawUndirectedTree,
|
44
|
-
autoload :Tree,
|
45
|
-
autoload :Arborescence,
|
56
|
+
autoload :RawDirectedTree, 'jumoku/classes/tree_classes'
|
57
|
+
autoload :RawUndirectedTree, 'jumoku/classes/tree_classes'
|
58
|
+
autoload :Tree, 'jumoku/classes/tree_classes'
|
59
|
+
autoload :Arborescence, 'jumoku/classes/tree_classes'
|
46
60
|
|
47
61
|
# strategies
|
48
|
-
autoload :
|
49
|
-
|
62
|
+
autoload :Strategies, 'jumoku/strategies'
|
63
|
+
Strategies.autoload :EdgeLabelingBackend, 'jumoku/strategies/edge_labeling'
|
64
|
+
Strategies.autoload :SimpleEdgeLabeling, 'jumoku/strategies/edge_labeling/simple'
|
50
65
|
|
51
66
|
# support
|
52
67
|
require 'jumoku/support/ruby_compatibility'
|
@@ -4,6 +4,17 @@ module Jumoku
|
|
4
4
|
# It provides a directed tree which acts as a hierarchical structure, known
|
5
5
|
# as an arborescence.
|
6
6
|
#
|
7
|
+
# By default, it is ensured that new arcs remain in the same general flow
|
8
|
+
# direction, based on the first arc added (binding the node known as root
|
9
|
+
# to its first children, known as leaf). This constraint may be relaxed by
|
10
|
+
# passing the `:free_flow` option to true when initializing:
|
11
|
+
#
|
12
|
+
# Arborescence.new(:free_flow => true)
|
13
|
+
#
|
14
|
+
# This way, the tree remains directed (nodes are bound using arcs, not
|
15
|
+
# undirected edges), but a node may be either a pure source (only outing
|
16
|
+
# arcs), a pure target (only arcs pointing at it), or a mix.
|
17
|
+
#
|
7
18
|
module ArborescenceBuilder
|
8
19
|
include RawDirectedTreeBuilder
|
9
20
|
include Extended
|
@@ -64,9 +75,8 @@ module Jumoku
|
|
64
75
|
end
|
65
76
|
alias parent_of parent
|
66
77
|
|
67
|
-
# Check whether a node is a parent. If another node is provided as
|
68
|
-
#
|
69
|
-
# latter node.
|
78
|
+
# Check whether a node is a parent. If another node is provided as second
|
79
|
+
# parameter, check whether the former is the parent of the latter.
|
70
80
|
#
|
71
81
|
# @overload parent?(node)
|
72
82
|
# @param [Node] node
|
@@ -137,7 +147,7 @@ module Jumoku
|
|
137
147
|
alias cousins neighbours
|
138
148
|
|
139
149
|
# Check whether two nodes are neighbours. To include the node's siblings
|
140
|
-
# in the matching candidates, pass the
|
150
|
+
# in the matching candidates, pass the `:siblings` option to true.
|
141
151
|
#
|
142
152
|
# @param [Node] node1
|
143
153
|
# @param [Node] node2
|
@@ -1,11 +1,12 @@
|
|
1
1
|
module Jumoku
|
2
2
|
# A {RawDirectedTree} relax the undirected constraint of trees as defined in
|
3
|
-
# Graph Theory. They remain connected and acyclic.
|
3
|
+
# Graph Theory. They remain connected and acyclic though.
|
4
4
|
#
|
5
|
-
# It thus uses Plexus::DirectedGraphBuilder as its backend.
|
5
|
+
# It thus uses `Plexus::DirectedGraphBuilder` as its backend.
|
6
6
|
#
|
7
7
|
# It offers limited functionalities, therefore the main tree structure you'll likely to
|
8
8
|
# use is its extended version, {Arborescence}.
|
9
|
+
#
|
9
10
|
module RawDirectedTreeBuilder
|
10
11
|
include Plexus::DirectedGraphBuilder
|
11
12
|
include Shared
|
@@ -22,14 +23,8 @@ module Jumoku
|
|
22
23
|
#
|
23
24
|
def initialize(*params)
|
24
25
|
super(*params) # Delegates to Plexus.
|
25
|
-
|
26
|
-
|
27
|
-
strategies = _extract_strategies(args)
|
28
|
-
|
29
|
-
class << self; self; end.module_eval do
|
30
|
-
strategies.each { |strategy| include strategy }
|
31
|
-
alias has_branch? has_arc?
|
32
|
-
end
|
26
|
+
@_options = (params.pop if params.last.is_a? Hash) || {}
|
27
|
+
_delay { alias has_branch? has_arc? }
|
33
28
|
end
|
34
29
|
|
35
30
|
# Checks whether the tree is *really* a valid tree, that is if the
|
@@ -39,7 +34,8 @@ module Jumoku
|
|
39
34
|
# * acyclic
|
40
35
|
# * connected
|
41
36
|
#
|
42
|
-
# @return [
|
37
|
+
# @return [true, false]
|
38
|
+
#
|
43
39
|
def valid?
|
44
40
|
super and directed?
|
45
41
|
end
|
@@ -1,8 +1,10 @@
|
|
1
1
|
module Jumoku
|
2
2
|
# A {RawUndirectedTree} sticks to the standard definition of trees in Graph Theory:
|
3
|
+
#
|
3
4
|
# * undirected,
|
4
5
|
# * connected,
|
5
6
|
# * acyclic.
|
7
|
+
#
|
6
8
|
# It thus uses Plexus::UndirectedGraphBuilder as its backend, which ensure the first
|
7
9
|
# constraint.
|
8
10
|
#
|
@@ -26,16 +28,8 @@ module Jumoku
|
|
26
28
|
#
|
27
29
|
def initialize(*params)
|
28
30
|
super(*params) # Delegates to Plexus.
|
29
|
-
|
30
|
-
|
31
|
-
strategies = _extract_strategies(args)
|
32
|
-
|
33
|
-
super(*params) # Delegates to Plexus.
|
34
|
-
|
35
|
-
class << self; self; end.module_eval do
|
36
|
-
strategies.each { |strategy| include strategy }
|
37
|
-
alias has_branch? has_edge?
|
38
|
-
end
|
31
|
+
@_options = (params.pop if params.last.is_a? Hash) || {}
|
32
|
+
_delay { alias has_branch? has_edge? }
|
39
33
|
end
|
40
34
|
|
41
35
|
# Checks whether the tree is *really* a valid tree, that is if the
|
@@ -1,14 +1,13 @@
|
|
1
1
|
module Jumoku
|
2
2
|
# This module provides the basic routines needed to implement the specialized
|
3
|
-
# builders: {
|
3
|
+
# builders: {RawUndirectedTreeBuilder} and {RawDirectedTreeBuilder}.
|
4
4
|
#
|
5
5
|
module Shared
|
6
|
-
STRATEGIES = [:edge_labeling, :node_labeling]
|
7
|
-
|
8
6
|
def self.included(base)
|
9
7
|
base.class_eval do
|
10
8
|
# Late aliasing as it references methods provided by Plexus modules.
|
11
9
|
alias has_node? has_vertex?
|
10
|
+
include Jumoku::Strategies
|
12
11
|
end
|
13
12
|
end
|
14
13
|
|
@@ -211,16 +210,10 @@ module Jumoku
|
|
211
210
|
self.class.new(self)
|
212
211
|
end
|
213
212
|
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
strategies << Jumoku.const_get(k.to_s.constantize).const_get(v.to_s.constantize)
|
219
|
-
strategies
|
220
|
-
rescue NameError # silently ignored
|
221
|
-
strategies
|
222
|
-
end
|
223
|
-
end
|
213
|
+
# Some code chunks must be module evaled at runtime.
|
214
|
+
#
|
215
|
+
def _delay
|
216
|
+
class << self; self; end.module_eval { yield }
|
224
217
|
end
|
225
218
|
end
|
226
219
|
end
|
@@ -1,9 +1,15 @@
|
|
1
1
|
module Jumoku
|
2
2
|
# "Raw" implementations.
|
3
|
+
|
4
|
+
# See {RawUndirectedTreeBuilder}.
|
3
5
|
class RawUndirectedTree; include RawUndirectedTreeBuilder; end
|
6
|
+
# See {RawDirectedTreeBuilder}.
|
4
7
|
class RawDirectedTree; include RawDirectedTreeBuilder; end
|
5
8
|
|
6
9
|
# "Useful" implementations.
|
10
|
+
|
11
|
+
# See {TreeBuilder}.
|
7
12
|
class Tree; include TreeBuilder; end
|
13
|
+
# See {ArborescenceBuilder}.
|
8
14
|
class Arborescence; include ArborescenceBuilder; end
|
9
15
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Jumoku
|
2
|
+
# Strategies are decorators implemented as mixins which taint a tree object
|
3
|
+
# with new or extended features. For instance, the `SimpleEdgeLabeling`
|
4
|
+
# strategy alters the way new nodes and branches are added to a tree,
|
5
|
+
# enforcing labeling of edges with increasing integers, `Binary` enforces
|
6
|
+
# a tree to grow as a binary tree, etc.
|
7
|
+
#
|
8
|
+
# It is easy to develop your own decorators and `use` them.
|
9
|
+
#
|
10
|
+
module Strategies
|
11
|
+
# Activate a strategy.
|
12
|
+
#
|
13
|
+
# @param [#to_s, Module] strategy strategy's name, either as a module
|
14
|
+
# namespace (like `Strategies::SimpleEdgeLabeling`) or a symbol (like
|
15
|
+
# `:simple_edge_labeling`)
|
16
|
+
#
|
17
|
+
def use(strategy)
|
18
|
+
strategy = catch(:unknown_strategy) do
|
19
|
+
begin
|
20
|
+
if strategy.is_a?(Symbol) || strategy.is_a?(String)
|
21
|
+
strategy = Strategies.const_get(strategy.to_s.constantize)
|
22
|
+
end
|
23
|
+
rescue NameError
|
24
|
+
throw :unknown_strategy, nil
|
25
|
+
end
|
26
|
+
strategy
|
27
|
+
end
|
28
|
+
extend strategy unless strategy.nil?
|
29
|
+
end
|
30
|
+
alias strategy use
|
31
|
+
end
|
32
|
+
end
|
@@ -1,6 +1,14 @@
|
|
1
1
|
module Jumoku
|
2
|
-
module
|
3
|
-
|
2
|
+
module Strategies
|
3
|
+
# Edge labeling strategies are concerned with the way edges or arcs are
|
4
|
+
# labeled. Simple labeling schemes are based on indexing with increasing
|
5
|
+
# integers, whereas some other strategies elaborate on notions such as
|
6
|
+
# weight or symetry.
|
7
|
+
#
|
8
|
+
# This module provides basic implementation for the common ground used
|
9
|
+
# by custom strategies.
|
10
|
+
#
|
11
|
+
module EdgeLabelingBackend
|
4
12
|
# Sort edges by the provided block's logic. The block takes edge as
|
5
13
|
# parameter, and this method delegates to Enumerable#sort_by for
|
6
14
|
# sorting edges. Return unsorted edges list if no block is provided.
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Jumoku
|
2
|
-
module
|
2
|
+
module Strategies
|
3
3
|
# A simple edge labeling strategy: as new nodes are added, new edges are
|
4
4
|
# assigned increasing integers. Removed edges do not trigger reindexing,
|
5
5
|
# so for a tree with n nodes, the labeling set is ||n|| but indexes are
|
@@ -8,8 +8,8 @@ module Jumoku
|
|
8
8
|
# This simple strategy allows for using simple search algorithms as well
|
9
9
|
# for simple ordering schemes.
|
10
10
|
#
|
11
|
-
module
|
12
|
-
include
|
11
|
+
module SimpleEdgeLabeling
|
12
|
+
include Strategies::EdgeLabelingBackend
|
13
13
|
|
14
14
|
attr_accessor :next_simple_edge_label_number
|
15
15
|
|
@@ -1,11 +1,17 @@
|
|
1
1
|
module Jumoku
|
2
|
-
#
|
2
|
+
# Used only as a namespace. Useful for duck typing criteria: both
|
3
|
+
# `Plexus::Edge` and `Plexus::Arc` are seen as `Branch`.
|
4
|
+
#
|
3
5
|
module Branch; end
|
4
6
|
|
7
|
+
# Delegates to `Plexus::Edge`.
|
8
|
+
#
|
5
9
|
class UndirectedBranch < Plexus::Edge
|
6
10
|
include Branch
|
7
11
|
end
|
8
12
|
|
13
|
+
# Delegates to `Plexus::Arc`.
|
14
|
+
#
|
9
15
|
class DirectedBranch < Plexus::Arc
|
10
16
|
include Branch
|
11
17
|
end
|
@@ -1,8 +1,14 @@
|
|
1
1
|
module Jumoku
|
2
|
+
# Generic error class.
|
2
3
|
class JumokuError < StandardError; end
|
4
|
+
# Generic error class for raw builders.
|
3
5
|
class RawTreeError < JumokuError; end
|
6
|
+
# Node-related error class for raw builders.
|
4
7
|
class RawTreeNodeError < RawTreeError; end
|
8
|
+
# Raised when a branch already exist, causing an operation to abort.
|
5
9
|
class BranchAlreadyExistError < JumokuError; end
|
10
|
+
# Raised when breaking the connexion constraint, causing an operation to abort.
|
6
11
|
class ForbiddenCycle < JumokuError; end
|
12
|
+
# Raised when a referenced node does not exist.
|
7
13
|
class UndefinedNode < JumokuError; end
|
8
14
|
end
|
data/lib/jumoku/version.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe
|
4
|
-
let(:tree) { Tree.new
|
5
|
-
let(:arbo) { Arborescence.new
|
3
|
+
describe Strategies::SimpleEdgeLabeling do
|
4
|
+
let(:tree) { Tree.new.use Strategies::SimpleEdgeLabeling }
|
5
|
+
let(:arbo) { Arborescence.new.use :simple_edge_labeling }
|
6
6
|
|
7
7
|
describe 'a tree with simple edge labeling' do
|
8
8
|
it "should label its edges with increasing integers when new nodes are added or removed" do
|
metadata
CHANGED
@@ -1,8 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jumoku
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
4
5
|
prerelease:
|
5
|
-
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 2
|
9
|
+
- 5
|
10
|
+
version: 0.2.5
|
6
11
|
platform: ruby
|
7
12
|
authors:
|
8
13
|
- Jean-Denis Vauguet <jd@vauguet.fr>
|
@@ -10,7 +15,7 @@ autorequire:
|
|
10
15
|
bindir: bin
|
11
16
|
cert_chain: []
|
12
17
|
|
13
|
-
date: 2011-07-
|
18
|
+
date: 2011-07-14 00:00:00 +02:00
|
14
19
|
default_executable:
|
15
20
|
dependencies:
|
16
21
|
- !ruby/object:Gem::Dependency
|
@@ -21,6 +26,9 @@ dependencies:
|
|
21
26
|
requirements:
|
22
27
|
- - ">="
|
23
28
|
- !ruby/object:Gem::Version
|
29
|
+
hash: 3
|
30
|
+
segments:
|
31
|
+
- 0
|
24
32
|
version: "0"
|
25
33
|
type: :runtime
|
26
34
|
version_requirements: *id001
|
@@ -32,6 +40,9 @@ dependencies:
|
|
32
40
|
requirements:
|
33
41
|
- - ">="
|
34
42
|
- !ruby/object:Gem::Version
|
43
|
+
hash: 3
|
44
|
+
segments:
|
45
|
+
- 0
|
35
46
|
version: "0"
|
36
47
|
type: :runtime
|
37
48
|
version_requirements: *id002
|
@@ -43,6 +54,9 @@ dependencies:
|
|
43
54
|
requirements:
|
44
55
|
- - ">="
|
45
56
|
- !ruby/object:Gem::Version
|
57
|
+
hash: 3
|
58
|
+
segments:
|
59
|
+
- 0
|
46
60
|
version: "0"
|
47
61
|
type: :runtime
|
48
62
|
version_requirements: *id003
|
@@ -54,6 +68,9 @@ dependencies:
|
|
54
68
|
requirements:
|
55
69
|
- - ">="
|
56
70
|
- !ruby/object:Gem::Version
|
71
|
+
hash: 3
|
72
|
+
segments:
|
73
|
+
- 0
|
57
74
|
version: "0"
|
58
75
|
type: :runtime
|
59
76
|
version_requirements: *id004
|
@@ -65,6 +82,9 @@ dependencies:
|
|
65
82
|
requirements:
|
66
83
|
- - ">="
|
67
84
|
- !ruby/object:Gem::Version
|
85
|
+
hash: 3
|
86
|
+
segments:
|
87
|
+
- 0
|
68
88
|
version: "0"
|
69
89
|
type: :development
|
70
90
|
version_requirements: *id005
|
@@ -76,6 +96,9 @@ dependencies:
|
|
76
96
|
requirements:
|
77
97
|
- - ">="
|
78
98
|
- !ruby/object:Gem::Version
|
99
|
+
hash: 3
|
100
|
+
segments:
|
101
|
+
- 0
|
79
102
|
version: "0"
|
80
103
|
type: :development
|
81
104
|
version_requirements: *id006
|
@@ -96,7 +119,7 @@ files:
|
|
96
119
|
- lib/jumoku/builders/shared.rb
|
97
120
|
- lib/jumoku/builders/arborescence.rb
|
98
121
|
- lib/jumoku/builders/raw_directed_tree.rb
|
99
|
-
- lib/jumoku/
|
122
|
+
- lib/jumoku/strategies.rb
|
100
123
|
- lib/jumoku/classes/tree_classes.rb
|
101
124
|
- lib/jumoku/strategies/edge_labeling/simple.rb
|
102
125
|
- lib/jumoku/strategies/edge_labeling.rb
|
@@ -131,12 +154,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
131
154
|
requirements:
|
132
155
|
- - ">="
|
133
156
|
- !ruby/object:Gem::Version
|
157
|
+
hash: 3
|
158
|
+
segments:
|
159
|
+
- 0
|
134
160
|
version: "0"
|
135
161
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
136
162
|
none: false
|
137
163
|
requirements:
|
138
164
|
- - ">="
|
139
165
|
- !ruby/object:Gem::Version
|
166
|
+
hash: 3
|
167
|
+
segments:
|
168
|
+
- 0
|
140
169
|
version: "0"
|
141
170
|
requirements: []
|
142
171
|
|
data/lib/jumoku/raw_tree_node.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
module Jumoku
|
2
|
-
module RawTree
|
3
|
-
# This module describes RawTree nodes.
|
4
|
-
#
|
5
|
-
# You may also use this module as a mixin to have a class behave
|
6
|
-
# as a RawTree node, while customizing behaviors.
|
7
|
-
#
|
8
|
-
module Node
|
9
|
-
# Creates a new node.
|
10
|
-
#
|
11
|
-
# @param [#to_s, #to_sym] name a valid name, considering the :names_as options
|
12
|
-
# passed to the raw tree you want to create a node for.
|
13
|
-
# @param [Object] data the data field type to use. Defaults to an empty OpenObject
|
14
|
-
# @param [Array(#to_s)] children an array of children nodes ids
|
15
|
-
#
|
16
|
-
# @return [OpenObject] the node as an OpenObject instance
|
17
|
-
#
|
18
|
-
def create name, data = OpenObject.new, children = []
|
19
|
-
@name = name
|
20
|
-
@data = data
|
21
|
-
@children = children
|
22
|
-
|
23
|
-
OpenObject.new(:name => @name, :data => @data, :children => @children)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|