rubytree 0.6.1 → 0.6.2
Sign up to get free protection for your applications and to get access to all the features.
- data/COPYING +2 -2
- data/ChangeLog +26 -1
- data/History.txt +5 -1
- data/README +31 -20
- data/Rakefile +17 -3
- data/TODO +6 -1
- data/lib/tree.rb +205 -126
- data/lib/tree/binarytree.rb +28 -23
- data/test/test_binarytree.rb +3 -3
- data/test/test_tree.rb +24 -21
- metadata +41 -9
data/COPYING
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
http://rubytree.rubyforge.org
|
4
4
|
|
5
|
-
Copyright (c) 2006
|
5
|
+
Copyright (c) 2006, 2007, 2008, 2009, 2010 Anupam Sengupta (anupamsg at gmail dot com)
|
6
6
|
|
7
7
|
All rights reserved.
|
8
8
|
|
@@ -26,4 +26,4 @@ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSE
|
|
26
26
|
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
27
27
|
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
28
28
|
|
29
|
-
$Id
|
29
|
+
$Id$
|
data/ChangeLog
CHANGED
@@ -1,3 +1,28 @@
|
|
1
|
+
2010-01-30 Anupam Sengupta <anupamsg@gmail.com>
|
2
|
+
|
3
|
+
* lib/tree.rb (Tree): Update the example code to use Ruby
|
4
|
+
conventions for the variable names.
|
5
|
+
(Tree): updated the documentation.
|
6
|
+
|
7
|
+
* README: Updated the example to use Ruby conventions for the
|
8
|
+
variable names.
|
9
|
+
|
10
|
+
2010-01-28 Anupam Sengupta <anupamsg@gmail.com>
|
11
|
+
|
12
|
+
* Rakefile: Minor documentation change.
|
13
|
+
|
14
|
+
* README (DOCUMENTATION): Added comments to the example code.
|
15
|
+
|
16
|
+
* test/test_tree.rb: Documentation clean up.
|
17
|
+
|
18
|
+
* test/test_binarytree.rb: Documentation clean up.
|
19
|
+
|
20
|
+
* lib/tree.rb (Tree): Cleaned up documentation. Also some minor
|
21
|
+
code refactoring done.
|
22
|
+
|
23
|
+
* lib/tree/binarytree.rb (Tree): Cleaned up documentation. Minor
|
24
|
+
readability improvement in the isLeftChild? and isRightChild? methods.
|
25
|
+
|
1
26
|
2010-01-05 Anupam Sengupta <anupamsg@gmail.com>
|
2
27
|
|
3
28
|
* README: Updated the requirements section.
|
@@ -207,4 +232,4 @@
|
|
207
232
|
|
208
233
|
* Changelog: Added the Changelog file.
|
209
234
|
|
210
|
-
$Id
|
235
|
+
$Id$
|
data/History.txt
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
=== 0.6.2 / 2010-01-30
|
2
|
+
|
3
|
+
* Updated the documentation.
|
4
|
+
|
1
5
|
=== 0.6.1 / 2010-01-04
|
2
6
|
|
3
7
|
* Changed the hard-dependency on the 'structured_warnings' RubyGem to a soft-dependency - which lets Rubytree still
|
@@ -40,4 +44,4 @@
|
|
40
44
|
|
41
45
|
* Minor code refactoring. Changes in the Rakefile.
|
42
46
|
|
43
|
-
$Id
|
47
|
+
$Id$
|
data/README
CHANGED
@@ -6,15 +6,16 @@
|
|
6
6
|
\/ \_/\__,_|_.__/ \__, |\__|_| \___|\___|
|
7
7
|
|___/
|
8
8
|
|
9
|
-
(c) 2006, 2007, 2008, 2009, 2010 Anupam Sengupta
|
9
|
+
Copyright (c) 2006, 2007, 2008, 2009, 2010 Anupam Sengupta (anupamsg at gmail dot com)
|
10
10
|
http://rubytree.rubyforge.org
|
11
11
|
|
12
12
|
== DESCRIPTION:
|
13
13
|
|
14
|
-
RubyTree is a Ruby implementation of the generic
|
15
|
-
|
16
|
-
the tree are the primary
|
17
|
-
|
14
|
+
RubyTree is a Ruby implementation of the generic tree data structure. It provides a node-based model to store keyed
|
15
|
+
node-elements in the tree and simple APIs to access, modify and traverse the structure. RubyTree is node-centric, where
|
16
|
+
individual nodes on the tree are the primary compositional and structural elements.
|
17
|
+
|
18
|
+
This implementation also mixes in the Enumerable module to allow standard access to the tree as a collection.
|
18
19
|
|
19
20
|
== SYNOPSIS:
|
20
21
|
|
@@ -34,24 +35,34 @@ As an example, the following code-snippet implements this tree structure:
|
|
34
35
|
| GRANDCHILD 1 |
|
35
36
|
+---------------+
|
36
37
|
|
37
|
-
# Example
|
38
|
-
require 'tree'
|
38
|
+
# ..... Example starts.
|
39
|
+
require 'tree' # Load the library
|
40
|
+
|
41
|
+
# ..... Create the root node first. Note that every node has a name and an optional content payload.
|
42
|
+
root_node = Tree::TreeNode.new("ROOT", "Root Content")
|
43
|
+
|
44
|
+
# ..... Now insert the child nodes. Note that you can "chain" the child insertions for a given path to any depth.
|
45
|
+
root_node << Tree::TreeNode.new("CHILD1", "Child1 Content") << Tree::TreeNode.new("GRANDCHILD1", "GrandChild1 Content")
|
46
|
+
root_node << Tree::TreeNode.new("CHILD2", "Child2 Content")
|
47
|
+
|
48
|
+
# ..... Lets print the representation to stdout. This is primarily used for debugging purposes.
|
49
|
+
root_node.printTree
|
39
50
|
|
40
|
-
|
41
|
-
|
42
|
-
|
51
|
+
# ..... Lets directly access children and grandchildren of the root. The can be "chained" for a given path to any depth.
|
52
|
+
child1 = root_node["CHILD1"]
|
53
|
+
grand_child1 = root_node["CHILD1"]["GRANDCHILD1"]
|
43
54
|
|
44
|
-
|
55
|
+
# ..... Now lets retrieve siblings of the current node as an array.
|
56
|
+
siblings_of_child1 = child1.siblings
|
45
57
|
|
46
|
-
|
47
|
-
|
58
|
+
# ..... Lets retrieve immediate children of the root node as an array.
|
59
|
+
children_of_root = root_node.children
|
48
60
|
|
49
|
-
|
50
|
-
|
61
|
+
# ..... This is a depth-first and L-to-R pre-ordered traversal.
|
62
|
+
root_node.each { |node| node.content.reverse }
|
51
63
|
|
52
|
-
#
|
53
|
-
|
54
|
-
myTreeRoot.remove!(child1) # Remove the child
|
64
|
+
# ..... Lets remove a child node from the root node.
|
65
|
+
root_node.remove!(child1)
|
55
66
|
|
56
67
|
|
57
68
|
== REQUIREMENTS:
|
@@ -127,7 +138,7 @@ tasks.
|
|
127
138
|
|
128
139
|
RubyTree is licensed under the BSD[http://www.opensource.org/licenses/bsd-license.php] license.
|
129
140
|
|
130
|
-
Copyright (c) 2006, 2007 Anupam Sengupta
|
141
|
+
Copyright (c) 2006, 2007, 2008, 2009, 2010 Anupam Sengupta
|
131
142
|
All rights reserved.
|
132
143
|
|
133
144
|
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
|
@@ -151,4 +162,4 @@ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWIS
|
|
151
162
|
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
152
163
|
|
153
164
|
|
154
|
-
(Document Revision: $Revision
|
165
|
+
(Document Revision: $Revision$ by $Author$)
|
data/Rakefile
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
# -*- mode: ruby; -*-
|
2
2
|
#
|
3
|
-
# Rakefile
|
3
|
+
# Rakefile - This file is part of the RubyTree package.
|
4
4
|
#
|
5
|
-
# $Revision
|
5
|
+
# $Revision$ by $Author$ on $Date$
|
6
6
|
#
|
7
|
-
# Copyright (c) 2006, 2007 Anupam Sengupta
|
7
|
+
# Copyright (c) 2006, 2007, 2009, 2010 Anupam Sengupta
|
8
8
|
#
|
9
9
|
# All rights reserved.
|
10
10
|
#
|
@@ -61,6 +61,20 @@ begin
|
|
61
61
|
self.need_tar = true
|
62
62
|
self.need_zip = true
|
63
63
|
|
64
|
+
# Post installation message
|
65
|
+
self.post_install_message = <<MSGEND
|
66
|
+
========================================================================
|
67
|
+
|
68
|
+
Thank you for installing #{PKG_NAME.capitalize}.
|
69
|
+
|
70
|
+
Please note that a few APIs have been deprecated since Version 0.6.1
|
71
|
+
|
72
|
+
Specifically, the 'Tree::TreeNode#depth' method is now deprecated, and
|
73
|
+
a new nodeDepth() method has been introduced.
|
74
|
+
|
75
|
+
========================================================================
|
76
|
+
MSGEND
|
77
|
+
|
64
78
|
# Code Metrics ...
|
65
79
|
self.flay_threshold = timebomb 1200, 100 # Default is 1200, 100
|
66
80
|
self.flog_threshold = timebomb 1200, 100 # Default is 1200, 100
|
data/TODO
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
# -*- mode: org; coding: utf-8-unix; -*-
|
2
2
|
|
3
|
+
* TODO Convert all method names to the canonical /^[_a-z<>=\[|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/ pattern
|
4
|
+
See Roodi report at http://getcaliper.com/caliper/tool?tool=roodi&repo=git://github.com/evolve75/RubyTree.git
|
5
|
+
* TODO Fix the TreeNode#root method to return nil for root's root.
|
6
|
+
* TODO Fix the marshal_load method. This probably needs to be a class method.
|
7
|
+
* TODO Fix the semantic inconsistency between the TreeNode#first|lastSibling method and the siblings method w.r.t. the root
|
3
8
|
* TODO Create the basic UML diagrams and upload to the Site
|
4
9
|
DEADLINE: <2010-01-04 Mon>
|
5
10
|
|
@@ -16,4 +21,4 @@
|
|
16
21
|
|
17
22
|
|
18
23
|
|
19
|
-
$Id
|
24
|
+
$Id$
|
data/lib/tree.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
|
-
# tree.rb
|
1
|
+
# tree.rb - This file is part of the RubyTree package.
|
2
2
|
#
|
3
|
-
# $Revision
|
3
|
+
# $Revision$ by $Author$ on $Date$
|
4
4
|
#
|
5
|
-
# = tree.rb - Generic
|
5
|
+
# = tree.rb - Generic implementation of an N-ary tree data structure.
|
6
6
|
#
|
7
7
|
# Provides a generic tree data structure with ability to
|
8
|
-
# store keyed node elements in the tree.
|
8
|
+
# store keyed node elements in the tree. This implementation
|
9
9
|
# mixes in the Enumerable module.
|
10
10
|
#
|
11
11
|
# Author:: Anupam Sengupta (anupamsg@gmail.com)
|
@@ -41,29 +41,42 @@
|
|
41
41
|
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
42
42
|
#
|
43
43
|
|
44
|
-
# This module provides a TreeNode class which is the primary class for
|
45
|
-
# nodes
|
46
|
-
#
|
44
|
+
# This module provides a TreeNode class which is the primary class for representing
|
45
|
+
# nodes in the tree.
|
46
|
+
#
|
47
|
+
# This module mixes in the Enumerable module, and also acts as the namespace for all
|
48
|
+
# classes in RubyTree.
|
47
49
|
module Tree
|
48
50
|
|
49
51
|
# Rubytree Package Version
|
50
|
-
VERSION = '0.6.
|
52
|
+
VERSION = '0.6.2'
|
51
53
|
|
52
54
|
# == TreeNode Class Description
|
53
55
|
#
|
54
|
-
#
|
55
|
-
# place-holder for the node data (i.e.,
|
56
|
-
# names are required to be unique
|
57
|
-
#
|
56
|
+
# This class models the nodes for an N-ary tree data structue. The nodes are +named+
|
57
|
+
# and have a place-holder for the node data (i.e., `content' of the node). The node
|
58
|
+
# names are required to be *unique* within the tree.
|
59
|
+
#
|
60
|
+
# The node content is not required to be unique across different nodes in the tree, and
|
61
|
+
# can be +nil+ as well.
|
62
|
+
#
|
63
|
+
# The class provides various traversal methods to navigate the tree,
|
64
|
+
# methods to modify contents of the node or to change position of the node in the tree
|
65
|
+
# and methods to change structure of the tree.
|
58
66
|
#
|
59
|
-
# A node can have any number of child nodes attached to it
|
60
|
-
#
|
61
|
-
#
|
67
|
+
# A node can have any number of child nodes attached to it and hence can be used to create N-ary trees.
|
68
|
+
# Access to the child nodes can be made in order (with the conventional left to right access), or
|
69
|
+
# randomly.
|
70
|
+
#
|
71
|
+
# The node also provides direct access to its parent and other superior parents in the path to
|
72
|
+
# root of the tree. In addition, a node can also access its sibling nodes, if present.
|
73
|
+
# Note that while this implementation does not explicitly support directed graphs, the class itself makes
|
74
|
+
# no restrictions on associating a node's +CONTENT+ with multiple nodes in the tree.
|
62
75
|
#
|
63
76
|
#
|
64
77
|
# == Example
|
65
78
|
#
|
66
|
-
# The following
|
79
|
+
# The following example implements this tree structure:
|
67
80
|
#
|
68
81
|
# +------------+
|
69
82
|
# | ROOT |
|
@@ -81,36 +94,38 @@ module Tree
|
|
81
94
|
#
|
82
95
|
# require 'tree'
|
83
96
|
#
|
84
|
-
#
|
97
|
+
# root_node = Tree::TreeNode.new("ROOT", "Root Content")
|
85
98
|
#
|
86
|
-
#
|
99
|
+
# root_node << Tree::TreeNode.new("CHILD1", "Child1 Content") << Tree::TreeNode.new("GRANDCHILD1", "GrandChild1 Content")
|
87
100
|
#
|
88
|
-
#
|
101
|
+
# root_node << Tree::TreeNode.new("CHILD2", "Child2 Content")
|
89
102
|
#
|
90
|
-
#
|
103
|
+
# root_node.printTree
|
91
104
|
#
|
92
|
-
# child1
|
105
|
+
# child1 = root_node["CHILD1"]
|
93
106
|
#
|
94
|
-
#
|
107
|
+
# grand_child1 = root_node["CHILD1"]["GRANDCHILD1"]
|
95
108
|
#
|
96
|
-
#
|
109
|
+
# siblings_of_child1 = child1.siblings
|
97
110
|
#
|
98
|
-
#
|
111
|
+
# children_of_root = root_node.children
|
99
112
|
#
|
100
113
|
# # Process all nodes
|
101
114
|
#
|
102
|
-
#
|
115
|
+
# root_node.each { |node| node.content.reverse }
|
103
116
|
#
|
104
|
-
#
|
117
|
+
# root_node.remove!(child1) # Remove the child
|
105
118
|
#
|
106
119
|
class TreeNode
|
107
120
|
include Enumerable
|
108
121
|
|
109
|
-
# Name of this
|
122
|
+
# Name of this node. Expected to be unique within the tree.
|
110
123
|
attr_reader :name
|
111
|
-
|
124
|
+
|
125
|
+
# Content of this node. Can be +nil+.
|
112
126
|
attr_accessor :content
|
113
|
-
|
127
|
+
|
128
|
+
# Parent of this node. Will be +nil+ for root nodes.
|
114
129
|
attr_reader :parent
|
115
130
|
|
116
131
|
|
@@ -128,8 +143,8 @@ module Tree
|
|
128
143
|
@children = []
|
129
144
|
end
|
130
145
|
|
131
|
-
# Returns a copy of
|
132
|
-
# its tree.
|
146
|
+
# Returns a copy of the receiver node, with its parent and children links removed.
|
147
|
+
# The original node remains attached to its tree.
|
133
148
|
def detached_copy
|
134
149
|
Tree::TreeNode.new(@name, @content ? @content.clone : nil)
|
135
150
|
end
|
@@ -143,8 +158,10 @@ module Tree
|
|
143
158
|
" Total Nodes: #{size()}"
|
144
159
|
end
|
145
160
|
|
146
|
-
# Returns an array of ancestors
|
147
|
-
#
|
161
|
+
# Returns an array of ancestors of the receiver node in reversed order
|
162
|
+
# (the first element is the immediate parent of the receiver).
|
163
|
+
#
|
164
|
+
# Returns +nil+ if the receiver is a root node.
|
148
165
|
def parentage
|
149
166
|
return nil if isRoot?
|
150
167
|
|
@@ -158,23 +175,38 @@ module Tree
|
|
158
175
|
parentageArray
|
159
176
|
end
|
160
177
|
|
161
|
-
# Protected method to set the parent node.
|
162
|
-
# This method should NOT be invoked by client code.
|
163
|
-
|
178
|
+
# Protected method to set the parent node for the receiver node.
|
179
|
+
# This method should *NOT* be invoked by client code.
|
180
|
+
#
|
181
|
+
# Returns the parent.
|
182
|
+
def parent=(parent) # :nodoc:
|
164
183
|
@parent = parent
|
165
184
|
end
|
166
185
|
|
167
|
-
# Convenience synonym for TreeNode#add method.
|
168
|
-
#
|
186
|
+
# Convenience synonym for TreeNode#add method.
|
187
|
+
#
|
188
|
+
# This method allows an easy method to add node hierarchies to the tree
|
189
|
+
# on a given path via chaining the method calls to successive child nodes.
|
169
190
|
#
|
170
|
-
#
|
191
|
+
# Example: <tt>root << child << grand_child</tt>
|
192
|
+
#
|
193
|
+
# Returns the added child node.
|
171
194
|
def <<(child)
|
172
195
|
add(child)
|
173
196
|
end
|
174
197
|
|
175
|
-
# Adds the specified child node to the receiver node.
|
176
|
-
#
|
177
|
-
#
|
198
|
+
# Adds the specified child node to the receiver node.
|
199
|
+
#
|
200
|
+
# This method can also be used for *grafting* a subtree into the receiver node's tree, if the specified child node
|
201
|
+
# is the root of a subtree (i.e., has child nodes under it).
|
202
|
+
#
|
203
|
+
# The receiver node becomes parent of the node passed in as the argument, and
|
204
|
+
# the child is added as the last child ("right most") in the current set of
|
205
|
+
# children of the receiver node.
|
206
|
+
#
|
207
|
+
# Returns the added child node.
|
208
|
+
#
|
209
|
+
# An exception is raised if another child node with the same name exists.
|
178
210
|
def add(child)
|
179
211
|
raise "Child already added" if @childrenHash.has_key?(child.name)
|
180
212
|
|
@@ -182,12 +214,15 @@ module Tree
|
|
182
214
|
@children << child
|
183
215
|
child.parent = self
|
184
216
|
return child
|
185
|
-
|
186
217
|
end
|
187
218
|
|
188
|
-
# Removes the specified child node from the receiver node.
|
189
|
-
#
|
190
|
-
#
|
219
|
+
# Removes the specified child node from the receiver node.
|
220
|
+
#
|
221
|
+
# This method can also be used for *pruning* a subtree, in cases where the removed child node is
|
222
|
+
# the root of the subtree to be pruned.
|
223
|
+
#
|
224
|
+
# The removed child node is orphaned but accessible if an alternate reference exists. If accesible via
|
225
|
+
# an alternate reference, the removed child will report itself as a root node for its subtree.
|
191
226
|
#
|
192
227
|
# Returns the child node.
|
193
228
|
def remove!(child)
|
@@ -197,13 +232,18 @@ module Tree
|
|
197
232
|
return child
|
198
233
|
end
|
199
234
|
|
200
|
-
# Removes
|
201
|
-
#
|
235
|
+
# Removes the receiver node from its parent. The reciever node becomes the new root for its subtree.
|
236
|
+
#
|
237
|
+
# If this is the root node, then does nothing.
|
238
|
+
#
|
239
|
+
# Returns self (the removed receiver node) if the operation is successful, and +nil+ otherwise.
|
202
240
|
def removeFromParent!
|
203
241
|
@parent.remove!(self) unless isRoot?
|
204
242
|
end
|
205
243
|
|
206
244
|
# Removes all children from the receiver node.
|
245
|
+
#
|
246
|
+
# Returns the receiver node.
|
207
247
|
def removeAll!
|
208
248
|
for child in @children
|
209
249
|
child.setAsRoot!
|
@@ -213,35 +253,38 @@ module Tree
|
|
213
253
|
self
|
214
254
|
end
|
215
255
|
|
216
|
-
# Returns +true+ if
|
256
|
+
# Returns +true+ if the receiver node has any associated content.
|
217
257
|
def hasContent?
|
218
258
|
@content != nil
|
219
259
|
end
|
220
260
|
|
221
|
-
# Protected method which sets
|
222
|
-
|
261
|
+
# Protected method which sets the receiver node as a root node.
|
262
|
+
#
|
263
|
+
# Returns +nil+.
|
264
|
+
def setAsRoot! # :nodoc:
|
223
265
|
@parent = nil
|
224
266
|
end
|
225
267
|
|
226
|
-
# Returns +true+ if
|
268
|
+
# Returns +true+ if the receiver is a root node. Note that
|
227
269
|
# orphaned children will also be reported as root nodes.
|
228
270
|
def isRoot?
|
229
271
|
@parent == nil
|
230
272
|
end
|
231
273
|
|
232
|
-
# Returns +true+ if
|
274
|
+
# Returns +true+ if the receiver node has any immediate child nodes.
|
233
275
|
def hasChildren?
|
234
276
|
@children.length != 0
|
235
277
|
end
|
236
278
|
|
237
|
-
# Returns +true+ if
|
279
|
+
# Returns +true+ if the receiver node is a 'leaf' - i.e., one without
|
238
280
|
# any children.
|
239
281
|
def isLeaf?
|
240
282
|
!hasChildren?
|
241
283
|
end
|
242
284
|
|
243
|
-
# Returns an array of all the immediate children
|
244
|
-
#
|
285
|
+
# Returns an array of all the immediate children of the receiver node.
|
286
|
+
#
|
287
|
+
# If a block is given, yields each child node to the block traversing from left to right.
|
245
288
|
def children
|
246
289
|
if block_given?
|
247
290
|
@children.each {|child| yield child}
|
@@ -250,34 +293,37 @@ module Tree
|
|
250
293
|
end
|
251
294
|
end
|
252
295
|
|
253
|
-
# Returns the first child of
|
254
|
-
#
|
296
|
+
# Returns the first child of the receiver node.
|
297
|
+
#
|
298
|
+
# Will return +nil+ if no children are present.
|
255
299
|
def firstChild
|
256
300
|
children.first
|
257
301
|
end
|
258
302
|
|
259
|
-
# Returns the last child of
|
260
|
-
#
|
303
|
+
# Returns the last child of the receiver node.
|
304
|
+
#
|
305
|
+
# Will return +nil+ if no children are present.
|
261
306
|
def lastChild
|
262
307
|
children.last
|
263
308
|
end
|
264
309
|
|
265
|
-
#
|
266
|
-
#
|
267
|
-
#
|
268
|
-
|
310
|
+
# Traverses every node (including the receiver node) from the (sub)tree
|
311
|
+
# by yielding the node to the specified block.
|
312
|
+
#
|
313
|
+
# The traversal is depth-first and from left to right in pre-ordered sequence.
|
314
|
+
def each &block # :yields: node
|
269
315
|
yield self
|
270
316
|
children { |child| child.each(&block) }
|
271
317
|
end
|
272
318
|
|
273
|
-
# Traverses the tree in a pre-ordered sequence.
|
319
|
+
# Traverses the tree in a pre-ordered sequence. This is equivalent to
|
274
320
|
# TreeNode#each
|
275
|
-
def preordered_each &block
|
321
|
+
def preordered_each &block # :yields: node
|
276
322
|
each(&block)
|
277
323
|
end
|
278
324
|
|
279
|
-
# Performs breadth first traversal of the tree starting at
|
280
|
-
# traversal
|
325
|
+
# Performs breadth first traversal of the tree starting at the receiver node. The
|
326
|
+
# traversal at a given level is from left to right.
|
281
327
|
def breadth_each &block
|
282
328
|
node_queue = [self] # Create a queue with self as the initial entry
|
283
329
|
|
@@ -290,18 +336,21 @@ module Tree
|
|
290
336
|
end
|
291
337
|
end
|
292
338
|
|
293
|
-
# Yields all leaf nodes from
|
294
|
-
#
|
295
|
-
#
|
339
|
+
# Yields all leaf nodes from the receiver node to the specified block.
|
340
|
+
#
|
341
|
+
# May yield this node as well if this is a leaf node.
|
342
|
+
# Leaf traversal is depth-first and left to right.
|
296
343
|
def each_leaf &block
|
297
344
|
self.each { |node| yield(node) if node.isLeaf? }
|
298
345
|
end
|
299
346
|
|
300
347
|
# Returns the requested node from the set of immediate children.
|
301
348
|
#
|
302
|
-
# If the
|
303
|
-
# accessed (see Tree#children). If the
|
304
|
-
# is assumed to be
|
349
|
+
# If the argument is _numeric_, then the in-sequence array of children is
|
350
|
+
# accessed (see Tree#children). If the argument is *NOT* _numeric_, then it
|
351
|
+
# is assumed to be *name* of the child node to be returned.
|
352
|
+
#
|
353
|
+
# Raises an exception is the requested child node is not found.
|
305
354
|
def [](name_or_index)
|
306
355
|
raise "Name_or_index needs to be provided" if name_or_index == nil
|
307
356
|
|
@@ -312,11 +361,11 @@ module Tree
|
|
312
361
|
end
|
313
362
|
end
|
314
363
|
|
315
|
-
# Returns the total number of nodes in this tree, including
|
364
|
+
# Returns the total number of nodes in this (sub)tree, including the receiver node.
|
316
365
|
#
|
317
366
|
# Size of the tree is defined as:
|
318
367
|
#
|
319
|
-
# Size::
|
368
|
+
# Size:: Total number nodes in the subtree including the receiver node.
|
320
369
|
def size
|
321
370
|
@children.inject(1) {|sum, node| sum + node.size}
|
322
371
|
end
|
@@ -344,105 +393,131 @@ module Tree
|
|
344
393
|
children { |child| child.printTree(level + 1)}
|
345
394
|
end
|
346
395
|
|
347
|
-
# Returns
|
396
|
+
# Returns root node for the (sub)tree to which the receiver node belongs.
|
397
|
+
#
|
398
|
+
# Note that a root node's root is itself (*beware* of any loop construct that may become infinite!)
|
399
|
+
#--
|
400
|
+
# TODO: We should perhaps return nil as root's root.
|
401
|
+
#++
|
348
402
|
def root
|
349
403
|
root = self
|
350
404
|
root = root.parent while !root.isRoot?
|
351
405
|
root
|
352
406
|
end
|
353
407
|
|
354
|
-
# Returns the first sibling for
|
408
|
+
# Returns the first sibling for the receiver node. If this is the root node, returns
|
355
409
|
# itself.
|
410
|
+
#
|
411
|
+
# 'First' sibling is defined as follows:
|
412
|
+
# First sibling:: The left-most child of the receiver's parent, which may be the receiver itself
|
413
|
+
#--
|
414
|
+
# TODO: Fix the inconsistency of returning root as its first sibling, and returning a
|
415
|
+
# a nil array for siblings for the node.
|
416
|
+
#++
|
356
417
|
def firstSibling
|
357
|
-
|
358
|
-
self
|
359
|
-
else
|
360
|
-
parent.children.first
|
361
|
-
end
|
418
|
+
isRoot? ? self : parent.children.first
|
362
419
|
end
|
363
420
|
|
364
|
-
# Returns true if
|
421
|
+
# Returns true if the receiver node is the first sibling.
|
365
422
|
def isFirstSibling?
|
366
423
|
firstSibling == self
|
367
424
|
end
|
368
425
|
|
369
|
-
# Returns the last sibling for
|
426
|
+
# Returns the last sibling for the receiver node. If this is the root node, returns
|
370
427
|
# itself.
|
428
|
+
#
|
429
|
+
# 'Last' sibling is defined as follows:
|
430
|
+
# Last sibling:: The right-most child of the receiver's parent, which may be the receiver itself
|
431
|
+
#--
|
432
|
+
# TODO: Fix the inconsistency of returning root as its last sibling, and returning a
|
433
|
+
# a nil array for siblings for the node.
|
434
|
+
#++
|
371
435
|
def lastSibling
|
372
|
-
|
373
|
-
self
|
374
|
-
else
|
375
|
-
parent.children.last
|
376
|
-
end
|
436
|
+
isRoot? ? self : parent.children.last
|
377
437
|
end
|
378
438
|
|
379
|
-
# Returns true if
|
439
|
+
# Returns true if the receivere node is the last sibling.
|
380
440
|
def isLastSibling?
|
381
441
|
lastSibling == self
|
382
442
|
end
|
383
443
|
|
384
|
-
# Returns an array of siblings for
|
385
|
-
#
|
386
|
-
#
|
444
|
+
# Returns an array of siblings for the receiver node. The receiver node is excluded.
|
445
|
+
#
|
446
|
+
# If a block is provided, yields each of the sibling nodes to the block.
|
447
|
+
# The root always has +nil+ siblings.
|
448
|
+
#--
|
449
|
+
# TODO: Fix the inconsistency of returning root as its first/last sibling, and returning a
|
450
|
+
# a nil array for siblings for the node.
|
451
|
+
#++
|
387
452
|
def siblings
|
388
453
|
return nil if isRoot?
|
454
|
+
|
389
455
|
if block_given?
|
390
456
|
for sibling in parent.children
|
391
457
|
yield sibling if sibling != self
|
392
458
|
end
|
393
459
|
else
|
394
460
|
siblings = []
|
395
|
-
parent.children {|
|
461
|
+
parent.children {|my_sibling| siblings << my_sibling if my_sibling != self}
|
396
462
|
siblings
|
397
463
|
end
|
398
464
|
end
|
399
465
|
|
400
|
-
# Returns true if
|
466
|
+
# Returns true if the receiver node is the only child of its parent.
|
401
467
|
def isOnlyChild?
|
402
468
|
parent.children.size == 1
|
403
469
|
end
|
404
470
|
|
405
|
-
# Returns the next sibling for
|
406
|
-
# node is
|
471
|
+
# Returns the next sibling for the receiver node.
|
472
|
+
# The 'next' node is defined as the node to right of the receiver node.
|
473
|
+
#
|
474
|
+
# Will return +nil+ if no subsequent node is present.
|
407
475
|
def nextSibling
|
408
476
|
if myidx = parent.children.index(self)
|
409
477
|
parent.children.at(myidx + 1)
|
410
478
|
end
|
411
479
|
end
|
412
480
|
|
413
|
-
# Returns the previous sibling for
|
414
|
-
#
|
481
|
+
# Returns the previous sibling for the receiver node.
|
482
|
+
# The 'previous' node is defined as the node to left of the receiver node.
|
483
|
+
#
|
484
|
+
# Will return nil if no predecessor node is present.
|
415
485
|
def previousSibling
|
416
486
|
if myidx = parent.children.index(self)
|
417
487
|
parent.children.at(myidx - 1) if myidx > 0
|
418
488
|
end
|
419
489
|
end
|
420
490
|
|
421
|
-
# Provides a comparision operation for the nodes.
|
422
|
-
#
|
423
|
-
# node
|
491
|
+
# Provides a comparision operation for the nodes.
|
492
|
+
#
|
493
|
+
# Comparision is based on the natural character-set ordering of the *node name*.
|
424
494
|
def <=>(other)
|
425
495
|
return +1 if other == nil
|
426
496
|
self.name <=> other.name
|
427
497
|
end
|
428
498
|
|
429
|
-
# Freezes all nodes in the tree
|
499
|
+
# Freezes all nodes in the (sub)tree rooted at the receiver node.
|
430
500
|
def freezeTree!
|
431
501
|
each {|node| node.freeze}
|
432
502
|
end
|
433
503
|
|
434
|
-
#
|
504
|
+
# Returns a marshal-dump represention of the (sub)tree rooted at the receiver node.
|
435
505
|
def marshal_dump
|
436
506
|
self.collect { |node| node.createDumpRep }
|
437
507
|
end
|
438
508
|
|
439
|
-
# Creates a dump representation and returns the same as a hash.
|
440
|
-
def createDumpRep
|
509
|
+
# Creates a dump representation of the reciever node and returns the same as a hash.
|
510
|
+
def createDumpRep # :nodoc:
|
441
511
|
{ :name => @name, :parent => (isRoot? ? nil : @parent.name), :content => Marshal.dump(@content)}
|
442
512
|
end
|
443
513
|
|
444
|
-
# Loads a marshalled dump of
|
514
|
+
# Loads a marshalled dump of a tree and returns the root node of the
|
445
515
|
# reconstructed tree. See the Marshal class for additional details.
|
516
|
+
#
|
517
|
+
#--
|
518
|
+
# TODO: This method probably should be a class method. It currently clobbers self
|
519
|
+
# and makes itself the root.
|
520
|
+
#++
|
446
521
|
def marshal_load(dumped_tree_array)
|
447
522
|
nodes = { }
|
448
523
|
for node_hash in dumped_tree_array do
|
@@ -458,37 +533,41 @@ module Tree
|
|
458
533
|
initialize(name, content)
|
459
534
|
|
460
535
|
nodes[name] = self # Add self to the list of nodes
|
461
|
-
|
536
|
+
end
|
462
537
|
end
|
463
538
|
end
|
464
539
|
|
465
|
-
# Returns height of the (sub)tree from
|
540
|
+
# Returns height of the (sub)tree from the receiver node. Height of a node is defined as:
|
541
|
+
#
|
542
|
+
# Height:: Length of the longest downward path to a leaf from the node.
|
466
543
|
#
|
467
|
-
#
|
468
|
-
#
|
544
|
+
# - Height from a root node is height of the entire tree.
|
545
|
+
# - The height of a leaf node is zero.
|
469
546
|
def nodeHeight
|
470
547
|
return 0 if isLeaf?
|
471
548
|
1 + @children.collect { |child| child.nodeHeight }.max
|
472
549
|
end
|
473
550
|
|
474
|
-
# Returns depth
|
551
|
+
# Returns depth of the receiver node in its tree. Depth of a node is defined as:
|
475
552
|
#
|
476
553
|
# Depth:: Length of the node's path to its root. Depth of a root node is zero.
|
477
554
|
#
|
478
|
-
# Note that the deprecated method Tree::TreeNode#depth was incorrectly computing this value.
|
479
|
-
# calls to the old method
|
555
|
+
# *Note* that the deprecated method Tree::TreeNode#depth was incorrectly computing this value.
|
556
|
+
# Please replace all calls to the old method with Tree::TreeNode#nodeDepth instead.
|
480
557
|
def nodeDepth
|
481
558
|
return 0 if isRoot?
|
482
559
|
1 + parent.nodeDepth
|
483
560
|
end
|
484
561
|
|
485
|
-
# Returns depth of the tree from
|
562
|
+
# Returns depth of the tree from the receiver node. A single leaf node has a depth of 1.
|
563
|
+
#
|
564
|
+
# This method is *DEPRECATED* and may be removed in the subsequent releases.
|
565
|
+
# Note that the value returned by this method is actually the:
|
486
566
|
#
|
487
|
-
#
|
488
|
-
# returned by this method is actually the _height_ + 1 of the node, *not* the _depth_.
|
567
|
+
# _height_ + 1 of the node, *NOT* the _depth_.
|
489
568
|
#
|
490
|
-
# For correct and conventional behavior, please use Tree::TreeNode#nodeDepth and
|
491
|
-
# instead.
|
569
|
+
# For correct and conventional behavior, please use Tree::TreeNode#nodeDepth and
|
570
|
+
# Tree::TreeNode#nodeHeight methods instead.
|
492
571
|
def depth
|
493
572
|
begin
|
494
573
|
require 'structured_warnings' # To enable a nice way of deprecating of the depth method.
|
@@ -498,17 +577,17 @@ module Tree
|
|
498
577
|
warn 'Tree::TreeNode#depth() method is deprecated. Please use nodeDepth() or nodeHeight() instead (bug # 22535)'
|
499
578
|
end
|
500
579
|
|
501
|
-
|
502
580
|
return 1 if isLeaf?
|
503
581
|
1 + @children.collect { |child| child.depth }.max
|
504
582
|
end
|
505
583
|
|
506
|
-
# Returns breadth of the tree at
|
507
|
-
#
|
508
|
-
#
|
584
|
+
# Returns breadth of the tree at the receiver node's level.
|
585
|
+
# A single node without siblings has a breadth of 1.
|
586
|
+
#
|
587
|
+
# Breadth is defined to be:
|
588
|
+
# Breadth:: Number of sibling nodes to this node + 1 (this node itself), i.e., the number of children the parent of this node has.
|
509
589
|
def breadth
|
510
|
-
|
511
|
-
parent.children.size
|
590
|
+
isRoot? ? 1 : parent.children.size
|
512
591
|
end
|
513
592
|
|
514
593
|
protected :parent=, :setAsRoot!, :createDumpRep
|
data/lib/tree/binarytree.rb
CHANGED
@@ -1,12 +1,11 @@
|
|
1
|
-
# binarytree.rb
|
1
|
+
# binarytree.rb - This file is part of the RubyTree package.
|
2
2
|
#
|
3
|
-
# $Revision
|
3
|
+
# $Revision$ by $Author$ on $Date$
|
4
4
|
#
|
5
|
-
# = binarytree.rb -
|
5
|
+
# = binarytree.rb - An implementation of the binary tree data structure.
|
6
6
|
#
|
7
|
-
# Provides a
|
8
|
-
# store
|
9
|
-
# mixes in the Enumerable module.
|
7
|
+
# Provides a binary tree data structure with ability to
|
8
|
+
# store two node elements as children at each node in the tree.
|
10
9
|
#
|
11
10
|
# Author:: Anupam Sengupta (anupamsg@gmail.com)
|
12
11
|
#
|
@@ -45,61 +44,67 @@ require 'tree'
|
|
45
44
|
|
46
45
|
module Tree
|
47
46
|
|
48
|
-
# Provides a Binary tree implementation. This
|
47
|
+
# Provides a Binary tree implementation. This node allows only two child nodes (left and right child). It also
|
49
48
|
# provides direct access to the left or right child, including assignment to the same.
|
49
|
+
#
|
50
|
+
# This inherits from the Tree::TreeNode class.
|
50
51
|
class BinaryTreeNode < TreeNode
|
51
52
|
|
52
|
-
# Adds the specified child node to the receiver node. The child node's parent is set to be the receiver.
|
53
|
-
#
|
54
|
-
#
|
53
|
+
# Adds the specified child node to the receiver node. The child node's parent is set to be the receiver.
|
54
|
+
#
|
55
|
+
# The child nodes are added in the order of addition, i.e., the first child added becomes the left node, and the
|
56
|
+
# second child added will be the second node.
|
55
57
|
#
|
56
58
|
# If only one child is present, then this will be the left child.
|
59
|
+
#
|
60
|
+
# An exception is raised if two children are already present.
|
57
61
|
def add(child)
|
58
62
|
raise "Already has two child nodes" if @children.size == 2
|
59
63
|
|
60
64
|
super(child)
|
61
65
|
end
|
62
66
|
|
63
|
-
# Returns the left child node. Note that left Child == first Child.
|
67
|
+
# Returns the left child of the receiver node. Note that left Child == first Child.
|
64
68
|
def leftChild
|
65
69
|
children.first
|
66
70
|
end
|
67
71
|
|
68
|
-
# Returns the right child node. Note that right child == last child unless there is only one child.
|
69
|
-
#
|
72
|
+
# Returns the right child of the receiver node. Note that right child == last child unless there is only one child.
|
73
|
+
#
|
74
|
+
# Returns +nil+ if the right child does not exist.
|
70
75
|
def rightChild
|
71
76
|
children[1]
|
72
77
|
end
|
73
78
|
|
74
|
-
# Sets the left child. If a previous child existed, it is replaced.
|
79
|
+
# Sets the left child of the receiver node. If a previous child existed, it is replaced.
|
75
80
|
def leftChild=(child)
|
76
81
|
@children[0] = child
|
77
82
|
@childrenHash[child.name] = child if child # Assign the name mapping
|
78
83
|
end
|
79
84
|
|
80
|
-
# Sets the right child. If a previous child existed, it is replaced.
|
85
|
+
# Sets the right child of the receiver node. If a previous child existed, it is replaced.
|
81
86
|
def rightChild=(child)
|
82
87
|
@children[1] = child
|
83
88
|
@childrenHash[child.name] = child if child # Assign the name mapping
|
84
89
|
end
|
85
90
|
|
86
|
-
# Returns +true+ if
|
91
|
+
# Returns +true+ if the receiver node is the left child of its parent. Always returns +false+ if it is a root node.
|
87
92
|
def isLeftChild?
|
88
|
-
return
|
93
|
+
return false if isRoot?
|
89
94
|
self == parent.leftChild
|
90
95
|
end
|
91
96
|
|
92
|
-
# Returns +true+ if
|
97
|
+
# Returns +true+ if the receiver node is the right child of its parent. Always returns +false+ if it is a root node.
|
93
98
|
def isRightChild?
|
94
|
-
return
|
99
|
+
return false if isRoot?
|
95
100
|
self == parent.rightChild
|
96
101
|
end
|
97
102
|
|
98
|
-
# Swaps the left and right child nodes with each other.
|
103
|
+
# Swaps the left and right child nodes of the receiver node with each other.
|
99
104
|
def swap_children
|
100
|
-
tempChild
|
101
|
-
self.leftChild= rightChild
|
102
|
-
self.rightChild= tempChild
|
105
|
+
tempChild = leftChild
|
106
|
+
self.leftChild = rightChild
|
107
|
+
self.rightChild = tempChild
|
103
108
|
end
|
104
109
|
end
|
105
110
|
|
data/test/test_binarytree.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
# test_binarytree.rb
|
3
|
+
# test_binarytree.rb - This file is part of the RubyTree package.
|
4
4
|
#
|
5
|
-
# $Revision
|
5
|
+
# $Revision$ by $Author$ on $Date$
|
6
6
|
#
|
7
7
|
# Copyright (c) 2006, 2007, 2008, 2009, 2010 Anupam Sengupta
|
8
8
|
#
|
@@ -38,7 +38,7 @@ require 'test/unit'
|
|
38
38
|
require 'tree/binarytree'
|
39
39
|
|
40
40
|
module TestTree
|
41
|
-
# Test class for the
|
41
|
+
# Test class for the binary tree node.
|
42
42
|
class TestBinaryTreeNode < Test::Unit::TestCase
|
43
43
|
|
44
44
|
def setup
|
data/test/test_tree.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
# testtree.rb
|
3
|
+
# testtree.rb - This file is part of the RubyTree package.
|
4
4
|
#
|
5
|
-
# $Revision
|
5
|
+
# $Revision$ by $Author$ on $Date$
|
6
6
|
#
|
7
7
|
# Copyright (c) 2006, 2007, 2008, 2009, 2010 Anupam Sengupta
|
8
8
|
#
|
@@ -41,7 +41,7 @@ module TestTree
|
|
41
41
|
# Test class for the Tree node.
|
42
42
|
class TestTreeNode < Test::Unit::TestCase
|
43
43
|
|
44
|
-
Person = Struct::new(:First, :last)
|
44
|
+
Person = Struct::new(:First, :last) # A simple structure to use as the content for the nodes.
|
45
45
|
|
46
46
|
def setup
|
47
47
|
@root = Tree::TreeNode.new("ROOT", "Root Node")
|
@@ -83,16 +83,16 @@ module TestTree
|
|
83
83
|
|
84
84
|
# This test is for the root alone - without any children being linked
|
85
85
|
def test_root_setup
|
86
|
-
assert_not_nil(@root, "Root cannot be nil")
|
87
|
-
assert_nil(@root.parent, "Parent of root node should be nil")
|
88
|
-
assert_not_nil(@root.name, "Name should not be nil")
|
89
|
-
assert_equal("ROOT", @root.name, "Name should be 'ROOT'")
|
90
|
-
assert_equal("Root Node", @root.content, "Content should be 'Root Node'")
|
91
|
-
assert(@root.isRoot
|
92
|
-
assert(!@root.hasChildren
|
93
|
-
assert(@root.hasContent
|
94
|
-
assert_equal(1, @root.size, "Number of nodes should be one")
|
95
|
-
assert_nil(@root.siblings, "This root does not have any children")
|
86
|
+
assert_not_nil(@root , "Root cannot be nil")
|
87
|
+
assert_nil(@root.parent , "Parent of root node should be nil")
|
88
|
+
assert_not_nil(@root.name , "Name should not be nil")
|
89
|
+
assert_equal("ROOT" , @root.name, "Name should be 'ROOT'")
|
90
|
+
assert_equal("Root Node" , @root.content, "Content should be 'Root Node'")
|
91
|
+
assert(@root.isRoot? , "Should identify as root")
|
92
|
+
assert(!@root.hasChildren? , "Cannot have any children")
|
93
|
+
assert(@root.hasContent? , "This root should have content")
|
94
|
+
assert_equal(1 , @root.size, "Number of nodes should be one")
|
95
|
+
assert_nil(@root.siblings , "This root does not have any children")
|
96
96
|
|
97
97
|
assert_equal(0, @root.nodeHeight, "Root's height before adding any children is 0")
|
98
98
|
assert_raise(RuntimeError) { Tree::TreeNode.new(nil) }
|
@@ -102,16 +102,16 @@ module TestTree
|
|
102
102
|
def test_root
|
103
103
|
loadChildren
|
104
104
|
|
105
|
-
assert_same(@root, @root.root, "Root's root is self")
|
106
|
-
assert_same(@root, @child1.root, "Root should be ROOT")
|
107
|
-
assert_same(@root, @child4.root, "Root should be ROOT")
|
108
|
-
assert_equal(2, @root.nodeHeight, "Root's height after adding the children should be 2")
|
105
|
+
assert_same(@root , @root.root, "Root's root is self")
|
106
|
+
assert_same(@root , @child1.root, "Root should be ROOT")
|
107
|
+
assert_same(@root , @child4.root, "Root should be ROOT")
|
108
|
+
assert_equal(2 , @root.nodeHeight, "Root's height after adding the children should be 2")
|
109
109
|
end
|
110
110
|
|
111
111
|
def test_hasContent_eh
|
112
112
|
aNode = Tree::TreeNode.new("A Node")
|
113
|
-
assert_nil(aNode.content, "The node should not have content")
|
114
|
-
assert(!aNode.hasContent
|
113
|
+
assert_nil(aNode.content , "The node should not have content")
|
114
|
+
assert(!aNode.hasContent? , "The node should not have content")
|
115
115
|
|
116
116
|
aNode.content = "Something"
|
117
117
|
assert_not_nil(aNode.content, "The node should now have content")
|
@@ -496,8 +496,11 @@ module TestTree
|
|
496
496
|
@root.content = "ABC"
|
497
497
|
assert_equal("ABC", @root.content, "Content should be 'ABC'")
|
498
498
|
@root.freezeTree!
|
499
|
-
|
500
|
-
|
499
|
+
# Note: The error raised here depends on the Ruby version.
|
500
|
+
# For Ruby > 1.9, RuntimeError is raised
|
501
|
+
# For Ruby ~ 1.8, TypeError is raised
|
502
|
+
assert_raise(RuntimeError, TypeError) {@root.content = "123"}
|
503
|
+
assert_raise(RuntimeError, TypeError) {@root[0].content = "123"}
|
501
504
|
end
|
502
505
|
|
503
506
|
# Test whether the content is accesible
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubytree
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Anupam Sengupta
|
@@ -9,9 +9,29 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-01-
|
12
|
+
date: 2010-01-30 00:00:00 +05:30
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: rubyforge
|
17
|
+
type: :development
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 2.0.3
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: gemcutter
|
27
|
+
type: :development
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.3.0
|
34
|
+
version:
|
15
35
|
- !ruby/object:Gem::Dependency
|
16
36
|
name: hoe
|
17
37
|
type: :development
|
@@ -20,13 +40,14 @@ dependencies:
|
|
20
40
|
requirements:
|
21
41
|
- - ">="
|
22
42
|
- !ruby/object:Gem::Version
|
23
|
-
version: 2.
|
43
|
+
version: 2.5.0
|
24
44
|
version:
|
25
45
|
description: |-
|
26
|
-
RubyTree is a Ruby implementation of the generic
|
27
|
-
|
28
|
-
the tree are the primary
|
29
|
-
|
46
|
+
RubyTree is a Ruby implementation of the generic tree data structure. It provides a node-based model to store keyed
|
47
|
+
node-elements in the tree and simple APIs to access, modify and traverse the structure. RubyTree is node-centric, where
|
48
|
+
individual nodes on the tree are the primary compositional and structural elements.
|
49
|
+
|
50
|
+
This implementation also mixes in the Enumerable module to allow standard access to the tree as a collection.
|
30
51
|
email:
|
31
52
|
- anupamsg@gmail.com
|
32
53
|
executables: []
|
@@ -56,7 +77,18 @@ has_rdoc: true
|
|
56
77
|
homepage: http://rubytree.rubyforge.org
|
57
78
|
licenses: []
|
58
79
|
|
59
|
-
post_install_message:
|
80
|
+
post_install_message: |
|
81
|
+
========================================================================
|
82
|
+
|
83
|
+
Thank you for installing Rubytree.
|
84
|
+
|
85
|
+
Please note that a few APIs have been deprecated since Version 0.6.1
|
86
|
+
|
87
|
+
Specifically, the 'Tree::TreeNode#depth' method is now deprecated, and
|
88
|
+
a new nodeDepth() method has been introduced.
|
89
|
+
|
90
|
+
========================================================================
|
91
|
+
|
60
92
|
rdoc_options:
|
61
93
|
- --main
|
62
94
|
- README
|
@@ -81,7 +113,7 @@ rubyforge_project: rubytree
|
|
81
113
|
rubygems_version: 1.3.5
|
82
114
|
signing_key:
|
83
115
|
specification_version: 3
|
84
|
-
summary: RubyTree is a Ruby implementation of the generic
|
116
|
+
summary: RubyTree is a Ruby implementation of the generic tree data structure
|
85
117
|
test_files:
|
86
118
|
- test/test_binarytree.rb
|
87
119
|
- test/test_tree.rb
|