gf-treevisitor 0.0.10 → 0.0.11
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/VERSION +1 -1
- data/lib/treevisitor.rb +1 -1
- data/lib/treevisitor/abs_node.rb +27 -26
- data/lib/treevisitor/dir_tree_walker.rb +6 -6
- data/lib/treevisitor/leaf_node.rb +6 -7
- data/lib/treevisitor/tree_node.rb +25 -24
- data/lib/treevisitor/tree_node_visitor.rb +6 -12
- data/lib/treevisitor/visitors/block_tree_node_visitor.rb +5 -5
- data/lib/treevisitor/visitors/build_dir_tree_visitor.rb +6 -5
- data/lib/treevisitor/visitors/callback_tree_node_visitor.rb +17 -22
- data/lib/treevisitor/visitors/callback_tree_node_visitor2.rb +15 -20
- data/lib/treevisitor/visitors/clone_tree_node_visitor.rb +8 -8
- data/lib/treevisitor/visitors/depth_tree_node_visitor.rb +3 -3
- data/lib/treevisitor/visitors/flat_print_tree_node_visitors.rb +5 -5
- data/lib/treevisitor/visitors/print_dir_tree_visitor.rb +1 -1
- data/lib/treevisitor/visitors/print_tree_node_visitor.rb +15 -15
- data/lib/treevisitor/visitors/print_tree_node_visitor2.rb +11 -11
- data/test/treevisitor/tc_dir_tree_walker.rb +2 -0
- data/test/treevisitor/tc_tree_node.rb +2 -2
- data/test/treevisitor/tc_tree_node_visitor.rb +5 -5
- metadata +2 -2
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.11
|
data/lib/treevisitor.rb
CHANGED
data/lib/treevisitor/abs_node.rb
CHANGED
@@ -3,27 +3,40 @@ require "rubygems"
|
|
3
3
|
require "abstract"
|
4
4
|
|
5
5
|
#
|
6
|
-
#
|
7
|
-
#
|
6
|
+
# Abstract Node
|
7
|
+
# Class hierarchy
|
8
8
|
#
|
9
|
-
# AbsNode
|
10
|
-
#
|
9
|
+
# AbsNode has a name, a parent
|
10
|
+
# ^ and define a path i.e. concatenation ancestor names
|
11
11
|
# |
|
12
|
-
#
|
12
|
+
# |-- LeafNode
|
13
13
|
# |
|
14
|
-
#
|
15
|
-
#
|
14
|
+
# `-- TreeNode
|
16
15
|
#
|
16
|
+
# Object diagram
|
17
|
+
#
|
18
|
+
# TreeNode (parent: nil)
|
19
|
+
# |
|
20
|
+
# |--->[ LeafNode, LeafNode, LeafNode ]
|
21
|
+
# |
|
22
|
+
# |--->[ TreeNode, TreeNode ]
|
23
|
+
# |
|
24
|
+
# |--> [LeafNode]
|
25
|
+
# |
|
26
|
+
# `--> [TreeNode, TreeNode]
|
17
27
|
class AbsNode
|
18
28
|
|
29
|
+
class << self
|
30
|
+
attr_accessor :path_separator
|
31
|
+
end
|
32
|
+
self.path_separator = File::SEPARATOR
|
33
|
+
|
19
34
|
attr_reader :parent
|
20
35
|
attr_reader :name
|
21
36
|
|
22
|
-
# solo TreeNode puo' scrivere vedi funzione add_leaf
|
23
37
|
attr_accessor :prev
|
24
38
|
attr_accessor :next
|
25
39
|
|
26
|
-
|
27
40
|
def initialize( name )
|
28
41
|
@parent = nil
|
29
42
|
@name = name
|
@@ -68,13 +81,9 @@ class AbsNode
|
|
68
81
|
def path
|
69
82
|
return @path unless @path.nil?
|
70
83
|
if @parent.nil?
|
71
|
-
|
72
|
-
@path = @prefix_path + @name
|
73
|
-
else
|
74
|
-
@path = @name
|
75
|
-
end
|
84
|
+
@path = @prefix_path.nil? ? @name : @prefix_path + @name
|
76
85
|
else
|
77
|
-
@path =
|
86
|
+
@path = @parent.path + AbsNode::path_separator + @name
|
78
87
|
end
|
79
88
|
@path
|
80
89
|
end
|
@@ -82,24 +91,16 @@ class AbsNode
|
|
82
91
|
def path_from_root
|
83
92
|
return @path_from_root unless @path_from_root.nil?
|
84
93
|
if @parent.nil?
|
85
|
-
|
86
|
-
@path_from_root = @prefix_path
|
87
|
-
else
|
88
|
-
@path_from_root = ""
|
89
|
-
end
|
94
|
+
@path_from_root = @prefix_path.nil? ? "" : @prefix_path
|
90
95
|
else
|
91
|
-
@path_from_root =
|
96
|
+
@path_from_root = @parent.path_from_root + AbsNode::path_separator + @name
|
92
97
|
end
|
93
98
|
@path_from_root
|
94
99
|
end
|
95
100
|
|
96
101
|
def depth
|
97
102
|
return @depth unless @depth.nil?
|
98
|
-
|
99
|
-
@depth = 1
|
100
|
-
else
|
101
|
-
@depth = @parent.depth + 1
|
102
|
-
end
|
103
|
+
@depth = @parent.nil? ? 1 : @parent.depth + 1
|
103
104
|
@depth
|
104
105
|
end
|
105
106
|
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'treevisitor/visitors/block_tree_node_visitor'
|
2
|
-
|
3
1
|
class DirTreeWalker
|
4
2
|
|
5
3
|
def initialize( dirname )
|
@@ -21,7 +19,6 @@ class DirTreeWalker
|
|
21
19
|
#
|
22
20
|
# options
|
23
21
|
#
|
24
|
-
|
25
22
|
@visit_leaf = true
|
26
23
|
end
|
27
24
|
|
@@ -70,9 +67,13 @@ class DirTreeWalker
|
|
70
67
|
include?( @inspect_file_patterns, File.basename( filename ) )
|
71
68
|
end
|
72
69
|
|
73
|
-
|
74
|
-
|
70
|
+
#
|
71
|
+
# return the visitor
|
72
|
+
#
|
73
|
+
def run( tree_node_visitor )
|
74
|
+
@visitor = tree_node_visitor
|
75
75
|
process_directory( File.expand_path( @dirname ) )
|
76
|
+
tree_node_visitor
|
76
77
|
end
|
77
78
|
|
78
79
|
private
|
@@ -91,7 +92,6 @@ class DirTreeWalker
|
|
91
92
|
#
|
92
93
|
# recurse on other directories
|
93
94
|
#
|
94
|
-
# def process_directory( parentNode, dirname )
|
95
95
|
def process_directory( dirname )
|
96
96
|
@visitor.enter_tree_node( dirname )
|
97
97
|
# return if ignore_dir?( dirname )
|
@@ -1,12 +1,5 @@
|
|
1
|
-
# common
|
2
1
|
require "treevisitor/abs_node"
|
3
2
|
|
4
|
-
#
|
5
|
-
# Deriva da AbsNode
|
6
|
-
#
|
7
|
-
# definisce un metodo to_str
|
8
|
-
#
|
9
|
-
#
|
10
3
|
class LeafNode < AbsNode
|
11
4
|
|
12
5
|
def initialize( name, parent = nil )
|
@@ -16,12 +9,18 @@ class LeafNode < AbsNode
|
|
16
9
|
end
|
17
10
|
end
|
18
11
|
|
12
|
+
#
|
13
|
+
# a leaf_node cannot be a root
|
19
14
|
def root?
|
20
15
|
false
|
21
16
|
end
|
22
17
|
|
18
|
+
#
|
19
|
+
# return the visitor
|
20
|
+
#
|
23
21
|
def accept( visitor )
|
24
22
|
visitor.visit_leaf_node( self )
|
23
|
+
visitor
|
25
24
|
end
|
26
25
|
|
27
26
|
def to_str
|
@@ -1,10 +1,8 @@
|
|
1
|
-
# common
|
2
1
|
require 'treevisitor/leaf_node'
|
3
2
|
|
4
3
|
#
|
5
|
-
#
|
6
|
-
#
|
7
|
-
# altri treeNode e LeafNode
|
4
|
+
# TreeNode can contains other TreeNode (children)
|
5
|
+
# and can contains LeafNode (leves)
|
8
6
|
#
|
9
7
|
# TreeNode @childs -1---n-> TreeNode
|
10
8
|
# @leaves -1---n-> LeafNode
|
@@ -12,11 +10,11 @@ require 'treevisitor/leaf_node'
|
|
12
10
|
class TreeNode < AbsNode
|
13
11
|
|
14
12
|
attr_reader :leaves
|
15
|
-
attr_reader :
|
13
|
+
attr_reader :children
|
16
14
|
|
17
15
|
def initialize( name, parent = nil )
|
18
16
|
@leaves = []
|
19
|
-
@
|
17
|
+
@children = []
|
20
18
|
super( name )
|
21
19
|
if parent
|
22
20
|
parent.add_child( self )
|
@@ -29,30 +27,31 @@ class TreeNode < AbsNode
|
|
29
27
|
|
30
28
|
#
|
31
29
|
# invalidate cached info
|
30
|
+
# invalidate propagates form parent to children and leaves
|
32
31
|
#
|
33
32
|
def invalidate
|
34
33
|
super
|
35
|
-
@
|
34
|
+
@children.each{ |c| c.invalidate }
|
36
35
|
@leaves.each{ |l| l.invalidate }
|
37
36
|
end
|
38
37
|
|
39
38
|
def nr_nodes
|
40
|
-
nr = @leaves.length + @
|
41
|
-
@
|
39
|
+
nr = @leaves.length + @children.length
|
40
|
+
@children.inject( nr ) { |nr,c| nr + c.nr_nodes }
|
42
41
|
end
|
43
42
|
|
44
43
|
def nr_leaves
|
45
|
-
@leaves.length + @
|
44
|
+
@leaves.length + @children.inject(0) { |sum, child| sum + child.nr_leaves }
|
46
45
|
end
|
47
46
|
|
48
|
-
def
|
49
|
-
@
|
47
|
+
def nr_children
|
48
|
+
@children.length + @children.inject(0) { |sum, child| sum + child.nr_children }
|
50
49
|
end
|
51
50
|
|
52
51
|
def add_leaf( leaf )
|
53
52
|
return if leaf.parent == self
|
54
53
|
if not leaf.parent.nil?
|
55
|
-
leaf.remove_from_parent
|
54
|
+
leaf.remove_from_parent
|
56
55
|
end
|
57
56
|
leaf.parent = self
|
58
57
|
if @leaves.length > 0
|
@@ -71,35 +70,37 @@ class TreeNode < AbsNode
|
|
71
70
|
end
|
72
71
|
treeNode.invalidate
|
73
72
|
treeNode.parent = self
|
74
|
-
@
|
73
|
+
@children << treeNode
|
75
74
|
end
|
76
75
|
|
77
76
|
def find( name )
|
78
|
-
if self.name == name
|
79
|
-
return self
|
80
|
-
end
|
77
|
+
return self if self.name == name
|
81
78
|
|
82
79
|
leaf = @leaves.find { |l| l.name == name }
|
83
80
|
if leaf
|
84
81
|
return leaf
|
85
82
|
end
|
86
83
|
|
87
|
-
@
|
84
|
+
@children.each {|c|
|
88
85
|
node = c.find(name)
|
89
86
|
return node if node
|
90
87
|
}
|
91
88
|
nil
|
92
89
|
end
|
93
90
|
|
91
|
+
#
|
92
|
+
# return the visitor
|
93
|
+
#
|
94
94
|
def accept( visitor )
|
95
95
|
visitor.enter_tree_node( self )
|
96
|
-
@leaves.each{ |
|
97
|
-
|
96
|
+
@leaves.each{ |leaf|
|
97
|
+
leaf.accept( visitor )
|
98
98
|
}
|
99
|
-
@
|
100
|
-
|
99
|
+
@children.each { |child|
|
100
|
+
child.accept( visitor )
|
101
101
|
}
|
102
102
|
visitor.exit_tree_node( self )
|
103
|
+
visitor
|
103
104
|
end
|
104
105
|
|
105
106
|
def to_str( depth = 0 )
|
@@ -116,7 +117,7 @@ class TreeNode < AbsNode
|
|
116
117
|
(0...depth-1).step {
|
117
118
|
str << " |-"
|
118
119
|
}
|
119
|
-
if @
|
120
|
+
if @children.empty?
|
120
121
|
str << " | "
|
121
122
|
else
|
122
123
|
str << " | | "
|
@@ -126,7 +127,7 @@ class TreeNode < AbsNode
|
|
126
127
|
}
|
127
128
|
end
|
128
129
|
|
129
|
-
@
|
130
|
+
@children.each { |tn|
|
130
131
|
str << tn.to_str( depth + 1 )
|
131
132
|
}
|
132
133
|
str
|
@@ -1,22 +1,16 @@
|
|
1
|
-
# rubygems
|
2
|
-
require 'rubygems'
|
3
|
-
require 'abstract'
|
4
|
-
|
5
1
|
#
|
6
|
-
#
|
2
|
+
# Callback methods used to visit a tree
|
3
|
+
# Are empty so it is possible defined only a subset
|
7
4
|
#
|
8
5
|
class TreeNodeVisitor
|
9
6
|
|
10
|
-
def enter_tree_node(
|
11
|
-
not_implemented
|
7
|
+
def enter_tree_node( tree_node )
|
12
8
|
end
|
13
9
|
|
14
|
-
def exit_tree_node(
|
15
|
-
not_implemented
|
10
|
+
def exit_tree_node( tree_node )
|
16
11
|
end
|
17
|
-
|
18
|
-
def visit_leaf_node(
|
19
|
-
not_implemented
|
12
|
+
|
13
|
+
def visit_leaf_node( leaf_node )
|
20
14
|
end
|
21
15
|
|
22
16
|
end
|
@@ -9,15 +9,15 @@ class BlockTreeNodeVisitor < TreeNodeVisitor
|
|
9
9
|
@block = action
|
10
10
|
end
|
11
11
|
|
12
|
-
def enter_tree_node(
|
13
|
-
@block.call(
|
12
|
+
def enter_tree_node( tree_node )
|
13
|
+
@block.call( tree_node )
|
14
14
|
end
|
15
15
|
|
16
|
-
def exit_tree_node(
|
16
|
+
def exit_tree_node( tree_node )
|
17
17
|
end
|
18
18
|
|
19
|
-
def visit_leaf_node(
|
20
|
-
@block.call(
|
19
|
+
def visit_leaf_node( leaf_node )
|
20
|
+
@block.call( leaf_node )
|
21
21
|
end
|
22
22
|
|
23
23
|
end
|
@@ -23,13 +23,13 @@ class BuildDirTreeVisitor < TreeNodeVisitor
|
|
23
23
|
|
24
24
|
def enter_tree_node( pathname )
|
25
25
|
if @stack.empty?
|
26
|
-
|
27
|
-
@root =
|
26
|
+
tree_node = TreeNode.new( File.basename( pathname ) )
|
27
|
+
@root = tree_node
|
28
28
|
else
|
29
|
-
|
29
|
+
tree_node = TreeNode.new( File.basename( pathname ), @stack.last )
|
30
30
|
end
|
31
31
|
@nr_directories += 1
|
32
|
-
@stack.push(
|
32
|
+
@stack.push( tree_node )
|
33
33
|
end
|
34
34
|
|
35
35
|
def exit_tree_node( pathname )
|
@@ -38,7 +38,8 @@ class BuildDirTreeVisitor < TreeNodeVisitor
|
|
38
38
|
|
39
39
|
def visit_leaf_node( pathname )
|
40
40
|
@nr_files += 1
|
41
|
-
|
41
|
+
# connect the leaf_node created to the last tree_node on the stack
|
42
|
+
LeafNode.new( File.basename(pathname), @stack.last )
|
42
43
|
end
|
43
44
|
|
44
45
|
end
|
@@ -5,41 +5,36 @@
|
|
5
5
|
#
|
6
6
|
class CallbackTreeNodeVisitor < TreeNodeVisitor
|
7
7
|
|
8
|
-
def initialize
|
8
|
+
def initialize
|
9
9
|
super()
|
10
10
|
@stack = []
|
11
|
-
@root =
|
12
|
-
@
|
13
|
-
@
|
14
|
-
@action_visitLeafNode = nil
|
11
|
+
@root = nil
|
12
|
+
@action_enter_tree_node = nil
|
13
|
+
@action_visit_leaf_node = nil
|
15
14
|
end
|
16
15
|
|
17
|
-
def
|
18
|
-
@
|
16
|
+
def on_enter_tree_node( &action )
|
17
|
+
@action_enter_tree_node = action
|
19
18
|
end
|
20
19
|
|
21
|
-
def
|
22
|
-
@
|
20
|
+
def on_visit_leaf_node( &action )
|
21
|
+
@action_visit_leaf_node = action
|
23
22
|
end
|
24
23
|
|
25
|
-
def enter_tree_node(
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
end
|
31
|
-
@root = treeNode if @stack.empty?
|
32
|
-
@stack.push( treeNode )
|
33
|
-
@action_enterTreeNode.call( treeNode ) if @action_enterTreeNode
|
24
|
+
def enter_tree_node( tree_node )
|
25
|
+
# parent_node = @stack.empty? ? nil : @stack.last
|
26
|
+
@root = tree_node if @stack.empty?
|
27
|
+
@stack.push( tree_node )
|
28
|
+
@action_enter_tree_node.call( tree_node ) if @action_enter_tree_node
|
34
29
|
end
|
35
30
|
|
36
|
-
def exit_tree_node(
|
31
|
+
def exit_tree_node( tree_node )
|
37
32
|
@stack.pop
|
38
33
|
end
|
39
34
|
|
40
|
-
def visit_leaf_node(
|
41
|
-
|
42
|
-
@
|
35
|
+
def visit_leaf_node( leaf_node )
|
36
|
+
# parent_node = @stack.last
|
37
|
+
@action_visit_leaf_node.call( leaf_node ) if @action_visit_leaf_node
|
43
38
|
end
|
44
39
|
|
45
40
|
end
|
@@ -8,39 +8,34 @@ class CallbackTreeNodeVisitor2 < TreeNodeVisitor
|
|
8
8
|
|
9
9
|
attr_reader :root
|
10
10
|
|
11
|
-
def initialize
|
11
|
+
def initialize
|
12
12
|
super()
|
13
13
|
@stack = []
|
14
|
-
@root =
|
15
|
-
@stack.push( root ) if root
|
14
|
+
@root = nil
|
16
15
|
end
|
17
16
|
|
18
|
-
def
|
19
|
-
@
|
17
|
+
def on_enter_tree_node( &action )
|
18
|
+
@action_enter_tree_node = action
|
20
19
|
end
|
21
20
|
|
22
|
-
def
|
23
|
-
@
|
21
|
+
def on_visit_leaf_node( &action )
|
22
|
+
@action_visit_leaf_node = action
|
24
23
|
end
|
25
24
|
|
26
|
-
def enter_tree_node(
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
end
|
32
|
-
newTreeNode = @action_enterTreeNode.call( treeNode, newParentNode )
|
33
|
-
@root = newTreeNode if @stack.empty?
|
34
|
-
@stack.push( newTreeNode )
|
25
|
+
def enter_tree_node( tree_node )
|
26
|
+
parent_node = @stack.empty? ? nil : @stack.last
|
27
|
+
new_tree_node = @action_enter_tree_node.call( tree_node, parent_node )
|
28
|
+
@root = new_tree_node if @stack.empty?
|
29
|
+
@stack.push( new_tree_node )
|
35
30
|
end
|
36
31
|
|
37
|
-
def exit_tree_node(
|
32
|
+
def exit_tree_node( tree_node )
|
38
33
|
@stack.pop
|
39
34
|
end
|
40
35
|
|
41
|
-
def visit_leaf_node(
|
42
|
-
|
43
|
-
@
|
36
|
+
def visit_leaf_node( leaf_node )
|
37
|
+
parent_node = @stack.last
|
38
|
+
@action_visit_leaf_node.call( leaf_node, parent_node )
|
44
39
|
end
|
45
40
|
|
46
41
|
end
|
@@ -3,30 +3,30 @@
|
|
3
3
|
#
|
4
4
|
class CloneTreeNodeVisitor < TreeNodeVisitor
|
5
5
|
|
6
|
-
attr_reader :
|
6
|
+
attr_reader :cloned_root
|
7
7
|
|
8
8
|
def initialize
|
9
9
|
super
|
10
|
-
@
|
10
|
+
@cloned_root = nil
|
11
11
|
@stack = []
|
12
12
|
end
|
13
13
|
|
14
14
|
def enter_tree_node( treeNode )
|
15
15
|
if @stack.empty?
|
16
|
-
|
17
|
-
@
|
16
|
+
cloned_tree_node = TreeNode.new( treeNode.name )
|
17
|
+
@cloned_root = cloned_tree_node
|
18
18
|
else
|
19
|
-
|
19
|
+
cloned_tree_node = TreeNode.new( treeNode.name, @stack.last )
|
20
20
|
end
|
21
|
-
@stack.push(
|
21
|
+
@stack.push( cloned_tree_node )
|
22
22
|
end
|
23
23
|
|
24
24
|
def exit_tree_node( treeNode )
|
25
25
|
@stack.pop
|
26
26
|
end
|
27
27
|
|
28
|
-
def visit_leaf_node(
|
29
|
-
|
28
|
+
def visit_leaf_node( leaf_node )
|
29
|
+
LeafNode.new( leaf_node.name, @stack.last )
|
30
30
|
end
|
31
31
|
|
32
32
|
end
|
@@ -10,15 +10,15 @@ class DepthTreeNodeVisitor < TreeNodeVisitor
|
|
10
10
|
@depth = 0
|
11
11
|
end
|
12
12
|
|
13
|
-
def enter_tree_node(
|
13
|
+
def enter_tree_node( tree_node )
|
14
14
|
@depth += 1
|
15
15
|
end
|
16
16
|
|
17
|
-
def exit_tree_node(
|
17
|
+
def exit_tree_node( tree_node )
|
18
18
|
@depth -= 1
|
19
19
|
end
|
20
20
|
|
21
|
-
def visit_leaf_node(
|
21
|
+
def visit_leaf_node( leaf_node )
|
22
22
|
end
|
23
23
|
|
24
24
|
end
|
@@ -3,15 +3,15 @@
|
|
3
3
|
#
|
4
4
|
class FlatPrintTreeNodeVisitor < TreeNodeVisitor
|
5
5
|
|
6
|
-
def enter_tree_node(
|
7
|
-
puts
|
6
|
+
def enter_tree_node( tree_node )
|
7
|
+
puts tree_node.name
|
8
8
|
end
|
9
9
|
|
10
|
-
def exit_tree_node(
|
10
|
+
def exit_tree_node( tree_node )
|
11
11
|
end
|
12
12
|
|
13
|
-
def visit_leaf_node(
|
14
|
-
puts
|
13
|
+
def visit_leaf_node( leaf_node )
|
14
|
+
puts leaf_node.name
|
15
15
|
end
|
16
16
|
|
17
17
|
end
|
@@ -3,21 +3,11 @@
|
|
3
3
|
#
|
4
4
|
class PrintTreeNodeVisitor < TreeNodeVisitor
|
5
5
|
|
6
|
-
def initialize
|
7
|
-
super( *args )
|
6
|
+
def initialize
|
8
7
|
@depth = 0
|
9
8
|
end
|
10
9
|
|
11
|
-
def
|
12
|
-
str = ""
|
13
|
-
(0...@depth-1).step {
|
14
|
-
str << " |-"
|
15
|
-
}
|
16
|
-
str << " | "
|
17
|
-
puts str + leafNode.name.to_s
|
18
|
-
end
|
19
|
-
|
20
|
-
def enter_tree_node( treeNode )
|
10
|
+
def enter_tree_node( tree_node )
|
21
11
|
|
22
12
|
str = ""
|
23
13
|
(0...@depth).step {
|
@@ -25,14 +15,24 @@ class PrintTreeNodeVisitor < TreeNodeVisitor
|
|
25
15
|
}
|
26
16
|
|
27
17
|
if @depth == 0
|
28
|
-
puts str +
|
18
|
+
puts str + tree_node.name.to_s
|
29
19
|
else
|
30
|
-
puts str +
|
20
|
+
puts str + tree_node.name.to_s
|
31
21
|
end
|
32
22
|
@depth += 1
|
33
23
|
end
|
34
24
|
|
35
|
-
def exit_tree_node(
|
25
|
+
def exit_tree_node( tree_node )
|
36
26
|
@depth -= 1
|
37
27
|
end
|
28
|
+
|
29
|
+
def visit_leaf_node( leaf_node )
|
30
|
+
str = ""
|
31
|
+
(0...@depth-1).step {
|
32
|
+
str << " |-"
|
33
|
+
}
|
34
|
+
str << " | "
|
35
|
+
puts str + leaf_node.name.to_s
|
36
|
+
end
|
37
|
+
|
38
38
|
end
|
@@ -3,20 +3,10 @@
|
|
3
3
|
# TODO: join this with PrintTreeNodeVisitor
|
4
4
|
class PrintTreeNodeVisitor2 < TreeNodeVisitor
|
5
5
|
|
6
|
-
def initialize
|
7
|
-
super( *args )
|
6
|
+
def initialize
|
8
7
|
@depth = 0
|
9
8
|
end
|
10
9
|
|
11
|
-
def visit_leaf_node( leaf_node )
|
12
|
-
str = ""
|
13
|
-
(0...@depth-1).step {
|
14
|
-
str << " |-"
|
15
|
-
}
|
16
|
-
str << " | "
|
17
|
-
puts str + leaf_node.to_s
|
18
|
-
end
|
19
|
-
|
20
10
|
def enter_tree_node( tree_node )
|
21
11
|
|
22
12
|
str = ""
|
@@ -35,4 +25,14 @@ class PrintTreeNodeVisitor2 < TreeNodeVisitor
|
|
35
25
|
def exit_tree_node( tree_node )
|
36
26
|
@depth -= 1
|
37
27
|
end
|
28
|
+
|
29
|
+
def visit_leaf_node( leaf_node )
|
30
|
+
str = ""
|
31
|
+
(0...@depth-1).step {
|
32
|
+
str << " |-"
|
33
|
+
}
|
34
|
+
str << " | "
|
35
|
+
puts str + leaf_node.to_s
|
36
|
+
end
|
37
|
+
|
38
38
|
end
|
@@ -72,11 +72,11 @@ class TCTreeNode < Test::Unit::TestCase
|
|
72
72
|
|
73
73
|
assert_equal( 4, ta.nr_nodes )
|
74
74
|
assert_equal( 3, ta.nr_leaves )
|
75
|
-
assert_equal( 1, ta.
|
75
|
+
assert_equal( 1, ta.nr_children )
|
76
76
|
|
77
77
|
assert_equal( 1, tb.nr_nodes )
|
78
78
|
assert_equal( 1, tb.nr_leaves )
|
79
|
-
assert_equal( 0, tb.
|
79
|
+
assert_equal( 0, tb.nr_children )
|
80
80
|
end
|
81
81
|
|
82
82
|
def test_prefix_path
|
@@ -36,14 +36,14 @@ class TCTreeNodeVisitor < Test::Unit::TestCase
|
|
36
36
|
|
37
37
|
visitor = CloneTreeNodeVisitor.new
|
38
38
|
@tree.accept( visitor )
|
39
|
-
assert_equal(@tree.nr_nodes, visitor.
|
39
|
+
assert_equal(@tree.nr_nodes, visitor.cloned_root.nr_nodes )
|
40
40
|
end
|
41
41
|
|
42
42
|
def test_callback_tree_node_visitor
|
43
43
|
accumulator = []
|
44
44
|
visitor = CallbackTreeNodeVisitor.new
|
45
|
-
visitor.
|
46
|
-
visitor.
|
45
|
+
visitor.on_enter_tree_node{ |treeNode| accumulator << treeNode.name }
|
46
|
+
visitor.on_visit_leaf_node{ |leafNode| accumulator << leafNode.name }
|
47
47
|
@tree.accept( visitor )
|
48
48
|
assert_equal( 5, accumulator.length )
|
49
49
|
assert_equal( %w{ a 1 2 b 3 }, accumulator )
|
@@ -51,10 +51,10 @@ class TCTreeNodeVisitor < Test::Unit::TestCase
|
|
51
51
|
|
52
52
|
def test_callback_tree_node_visitor2
|
53
53
|
visitor = CallbackTreeNodeVisitor2.new
|
54
|
-
visitor.
|
54
|
+
visitor.on_enter_tree_node{ |treeNode, newParentNode|
|
55
55
|
TreeNode.new("n" + treeNode.name, newParentNode)
|
56
56
|
}
|
57
|
-
visitor.
|
57
|
+
visitor.on_visit_leaf_node{ |leafNode, newParentNode|
|
58
58
|
LeafNode.new( "n" + leafNode.name, newParentNode )
|
59
59
|
}
|
60
60
|
@tree.accept( visitor )
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gf-treevisitor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- gf
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-06-
|
12
|
+
date: 2009-06-06 00:00:00 -07:00
|
13
13
|
default_executable: tree.rb
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|