gf-treevisitor 0.0.6 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. data/README.rdoc +28 -9
  2. data/VERSION +1 -0
  3. data/bin/{dirtree.rb → tree.rb} +3 -7
  4. data/lib/{gf_utility → gf_utilities}/file_utilities.rb +1 -1
  5. data/lib/{gf_utility → gf_utilities}/kwartzhelper.rb +8 -0
  6. data/lib/gf_utilities/md5.rb +24 -0
  7. data/lib/{gf_utility → gf_utilities}/numeric.rb +0 -0
  8. data/lib/treevisitor.rb +1 -1
  9. data/lib/treevisitor/cli/{cli_dir_tree.rb → cli_tree.rb} +36 -17
  10. data/lib/treevisitor/dir_tree_walker.rb +51 -34
  11. data/lib/treevisitor/tree_node_visitor.rb +0 -220
  12. data/lib/treevisitor/visitors/block_tree_node_visitor.rb +24 -0
  13. data/lib/treevisitor/{build_dir_tree_visitor.rb → visitors/build_dir_tree_visitor.rb} +7 -19
  14. data/lib/treevisitor/visitors/callback_tree_node_visitor.rb +43 -0
  15. data/lib/treevisitor/visitors/callback_tree_node_visitor2.rb +45 -0
  16. data/lib/treevisitor/visitors/clone_tree_node_visitor.rb +33 -0
  17. data/lib/treevisitor/visitors/depth_tree_node_visitor.rb +24 -0
  18. data/lib/treevisitor/visitors/flat_print_tree_node_visitors.rb +18 -0
  19. data/lib/treevisitor/visitors/print_dir_tree_visitor.rb +18 -0
  20. data/lib/treevisitor/{visitor → visitors}/print_node_visitor2.rb +0 -0
  21. data/lib/treevisitor/visitors/print_tree_node_visitor.rb +35 -0
  22. data/test/{gf_utility → gf_utilities}/tc_kwartz.rb +11 -3
  23. data/test/gf_utilities/tc_md5.rb +14 -0
  24. data/test/{gf_utility → gf_utilities}/tc_numeric.rb +1 -1
  25. data/test/{gf_utility → gf_utilities}/test_helper.rb +0 -0
  26. data/test/treevisitor/cli/tc_cli_tree.rb +61 -0
  27. data/test/treevisitor/tc_dir_processor.rb +6 -1
  28. data/test/treevisitor/tc_dir_tree_walker.rb +19 -9
  29. data/test/treevisitor/tc_tree_node_visitor.rb +5 -0
  30. data/test/treevisitor/test_helper.rb +13 -2
  31. data/test_data/gf_utility/kwartz_test_data/out.certified/dummy.txt +1 -0
  32. data/test_data/gf_utility/kwartz_test_data/out/dummy.txt +1 -0
  33. data/test_data/gf_utility/kwartz_test_data/source/test1.plogic +16 -0
  34. data/test_data/tree_visitor/test_data/.dir_with_dot/dummy.txt +0 -0
  35. metadata +30 -17
  36. data/lib/gf_utility/md5.rb +0 -17
  37. data/test/gf_utility/tc_md5.rb +0 -14
  38. data/test/ts_treevisitor.rb +0 -16
data/README.rdoc CHANGED
@@ -1,21 +1,40 @@
1
- = dirtree.rb / tree visitor lib
1
+ = tree.rb / tree visitor library
2
2
 
3
- <pre>dirtree.rb</pre> is a 'clone' of tree unix command.
4
- It is based on lib tree visitor.
3
+ +dirtree.rb+ is a 'clone' of tree unix command. It is based on lib tree visitor.
5
4
 
6
5
  Tree visitor is an implementation of visitor design pattern.
7
6
 
7
+ # $ tree.rb lib
8
+ # lib
9
+ # | | treevisitor.rb
10
+ # |-treevisitor
11
+ # | | abs_node.rb
12
+ # | | dir_processor.rb
13
+ # | | dir_tree_walker.rb
14
+ # | | leaf_node.rb
15
+ # | | tree_node.rb
16
+ # | | tree_node_visitor.rb
17
+ # |- |-cli
18
+ # |- | cli_tree.rb
19
+ # |- |-visitors
20
+ # |- | print_node_visitor2.rb
21
+ # |- | build_dir_tree_visitor.rb
22
+ # |- | print_dir_tree_visitor.rb
23
+ # |- | block_tree_node_visitor.rb
24
+ # |- | flat_print_tree_node_visitors.rb
25
+ # |- | print_tree_node_visitor.rb
26
+ # |- | depth_tree_node_visitor.rb
27
+ # |- | clone_tree_node_visitor.rb
28
+ # |- | callback_tree_node_visitor.rb
29
+ # |- | callback_tree_node_visitor2.rb
30
+
8
31
  == REQUIREMENTS:
9
32
 
10
- * utilizza la libreria abstract di kwartz
33
+ * require abstract gem
11
34
 
12
35
  == INSTALL:
13
36
 
14
- sudo gem install tree_visitor
15
-
16
- or
17
-
18
- sudo gem install gf-tree_visitor -s gems.github.com
37
+ To install +sudo gem install treevisitor+ or +sudo gem install gf-treevisitor -s http://gems.github.com+
19
38
 
20
39
  == Copyright
21
40
 
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.8
@@ -1,13 +1,9 @@
1
1
  #!/usr/bin/env ruby
2
2
  #
3
- # Piccolo wrapper per richiamare il programma
4
- # clidirtree
5
- #
3
+ # Wrapper for the class CliTree
6
4
 
7
5
  $TREEVISITOR_HOME = File.expand_path( File.join( File.dirname( __FILE__), ".." ) )
8
6
  $:.unshift( File.join($TREEVISITOR_HOME, "lib" ) )
9
7
 
10
- require "treevisitor/cli/cli_dir_tree"
11
-
12
- CliDirTree.run
13
- exit
8
+ require "treevisitor/cli/cli_tree"
9
+ CliTree.run
@@ -12,7 +12,7 @@ def recursive_run( dir, &block )
12
12
  end
13
13
 
14
14
  def copy_dir( indir, outdir, re )
15
- if not File.directory?()
15
+ if not File.directory?(indir)
16
16
  raise "#{indir} is not a directory"
17
17
  end
18
18
  if not File.directory?( outdir )
@@ -9,6 +9,14 @@ rescue LoadError
9
9
  abort 'kwartz gem required!!'
10
10
  end
11
11
 
12
+
13
+ # ruby 1.9
14
+ # cambiare alla linea 73 kwartz/main.rb la linea seguente:
15
+ # return @_option_table.find { |row| row[1] == key }
16
+ # con
17
+ # return @_option_table.find { |row| row[1][0] == key[0] }
18
+
19
+
12
20
  #
13
21
  # kwartz utility
14
22
  # template_dir: directory containing kwartz template
@@ -0,0 +1,24 @@
1
+ #
2
+ # calculate md5 of big files, found on usenet
3
+ #
4
+
5
+ if RUBY_VERSION =~ /1\.8/
6
+ # stdlib
7
+ require 'md5'
8
+ else
9
+ # stdlib
10
+ require 'digest/md5'
11
+ include Digest
12
+ end
13
+
14
+ class MD5
15
+ def self.file(file)
16
+ File.open(file, "rb") do |f|
17
+ res = self.new
18
+ while (data = f.read(4096))
19
+ res << data
20
+ end
21
+ res
22
+ end
23
+ end
24
+ end
File without changes
data/lib/treevisitor.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  class TreeVisitor
2
- VERSION = '0.0.1'
2
+ VERSION = '0.0.8'
3
3
  end
@@ -1,14 +1,16 @@
1
1
  # stdlib
2
2
  require 'optparse'
3
3
 
4
- # common
4
+ # treevisitor
5
+ require 'treevisitor'
5
6
  require 'treevisitor/dir_tree_walker'
6
- require 'treevisitor/build_dir_treevisitor'
7
+ require 'treevisitor/visitors/build_dir_tree_visitor'
8
+ require 'treevisitor/visitors/print_dir_tree_visitor'
7
9
 
8
10
  #
9
11
  #
10
12
  #
11
- class CliDirTree
13
+ class CliTree
12
14
 
13
15
  def self.run
14
16
  self.new.parse_args( ARGV )
@@ -19,15 +21,33 @@ class CliDirTree
19
21
  options = { :verbose => true, :force => false, :algo => 'build' }
20
22
 
21
23
  opts = OptionParser.new
22
- opts.banner = "Usage: example.rb [options]"
24
+ opts.banner = "Usage: tree.rb [options] [directory]"
23
25
 
24
26
  opts.separator ""
25
- opts.separator "programma per testare la classe DirProcessor"
26
- opts.separator "Inserire il nome della directory da cui costuire il tree"
27
+ opts.separator "list contents of directories in a tree-like format"
28
+ opts.separator "this is a clone of tree unix command written in ruby"
27
29
 
28
30
  opts.separator ""
29
- opts.separator "opzioni: "
31
+ opts.separator "options: "
30
32
 
33
+ opts.on("-h", "--help", "Show this message") do
34
+ puts opts
35
+ return 0
36
+ end
37
+
38
+ opts.on("--version", "Show the version") do
39
+ puts "tree.rb version #{TreeVisitor::VERSION}"
40
+ return 0
41
+ end
42
+
43
+ opts.on("-a", "All file are listed") do |v|
44
+ options[:all_files] = true
45
+ end
46
+
47
+ opts.on("-d", "List directories only") do |v|
48
+ options[:only_directories] = true
49
+ end
50
+
31
51
  opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
32
52
  options[:verbose] = v
33
53
  end
@@ -36,17 +56,11 @@ class CliDirTree
36
56
  options[:verbose] = false
37
57
  end
38
58
 
39
- opts.on("-h", "--help", "Show this message") do
40
- puts opts
41
- exit
42
- end
43
-
44
-
45
59
  algos = %w[build visit]
46
60
  algo_aliases = { "b" => "build", "v" => "visit" }
47
61
 
48
62
  algo_list = (algo_aliases.keys + algos).join(',')
49
- opts.on("-a", "--algo ALGO", algos, algo_aliases, "Select algo"," (#{algo_list})") do |algo|
63
+ opts.on("--algo ALGO", algos, algo_aliases, "Select algo"," (#{algo_list})") do |algo|
50
64
  options[:algo] = algo
51
65
  end
52
66
 
@@ -63,17 +77,22 @@ class CliDirTree
63
77
  dirname = rest[0]
64
78
  dirname = File.expand_path( dirname )
65
79
 
66
- puts "reading : #{dirname}"
80
+ # puts "reading : #{dirname}"
67
81
 
68
82
  dtw = DirTreeWalker.new( dirname )
69
- dtw.add_ignore_dir( ".svn" )
70
- dtw.add_ignore_dir( "catalog_data" )
83
+ unless options[:all_files]
84
+ dtw.add_ignore_pattern(/^\.[^.]+/) # ignore all file starting with "."
85
+ end
86
+
87
+ dtw.visit_leaf = !options[:only_directories]
71
88
 
72
89
  case options[:algo]
73
90
  when 'build'
74
91
  visitor = BuildDirTreeVisitor.new
75
92
  dtw.run( visitor )
76
93
  puts visitor.root.to_str
94
+ puts
95
+ puts "#{visitor.nr_directories} directories, #{visitor.nr_files} files"
77
96
  when 'visit'
78
97
  visitor = PrintDirTreeVisitor.new
79
98
  dtw.run( visitor )
@@ -1,3 +1,5 @@
1
+ require 'treevisitor/visitors/block_tree_node_visitor'
2
+
1
3
  class DirTreeWalker
2
4
 
3
5
  def initialize( dirname )
@@ -7,9 +9,28 @@ class DirTreeWalker
7
9
  end
8
10
 
9
11
  @visitor = nil
12
+
13
+ #
14
+ # pattern
15
+ #
10
16
  @ignore_dir_patterns = []
11
- @inspect_file_patterns = []
12
17
  @ignore_file_patterns = []
18
+
19
+ @inspect_file_patterns = []
20
+
21
+ #
22
+ # options
23
+ #
24
+
25
+ @visit_leaf = true
26
+ end
27
+
28
+ ##########################################################################
29
+ # Pattern
30
+ #
31
+ def add_ignore_pattern(pattern)
32
+ @ignore_dir_patterns << pattern
33
+ @ignore_file_patterns << pattern
13
34
  end
14
35
 
15
36
  def add_ignore_dir( pattern )
@@ -28,34 +49,25 @@ class DirTreeWalker
28
49
  @inspect_file_patterns << pattern
29
50
  end
30
51
 
52
+ ##########################################################################
53
+ # Options
54
+
55
+ attr_accessor :visit_leaf
56
+
57
+ ##########################################################################
58
+
59
+
31
60
  def ignore_dir?( dirname )
32
- basename = File.basename( dirname )
33
- @ignore_dir_patterns.find{ |pattern|
34
- basename == pattern
35
- }
61
+ include?( @ignore_dir_patterns, File.basename( dirname ) )
36
62
  end
37
63
 
38
64
  def ignore_file?( filename )
39
- basename = File.basename( filename )
40
- @ignore_file_patterns.find{ |pattern|
41
- if pattern.kind_of? Regexp
42
- pattern =~ basename
43
- else
44
- pattern == basename
45
- end
46
- }
65
+ include?( @ignore_file_patterns, File.basename( filename ) )
47
66
  end
48
67
 
49
68
  def inspect_file?( filename )
50
69
  return true if @inspect_file_patterns.empty?
51
- basename = File.basename( filename )
52
- @inspect_file_patterns.find{ |pattern|
53
- if pattern.kind_of? Regexp
54
- pattern =~ basename
55
- else
56
- pattern == basename
57
- end
58
- }
70
+ include?( @inspect_file_patterns, File.basename( filename ) )
59
71
  end
60
72
 
61
73
  def run( treeNodeVisitor )
@@ -65,33 +77,38 @@ class DirTreeWalker
65
77
 
66
78
  private
67
79
 
80
+ def include?(patterns, basename)
81
+ # return false if the patters.empty?
82
+ patterns.find{ |pattern|
83
+ if pattern.respond_to?(:match) # or if pattern.kind_of? Regexp
84
+ pattern.match( basename )
85
+ else
86
+ basename == pattern
87
+ end
88
+ }
89
+ end
90
+
68
91
  #
69
92
  # recurse on other directories
70
93
  #
71
94
  # def process_directory( parentNode, dirname )
72
95
  def process_directory( dirname )
73
- return if ignore_dir?( dirname )
74
-
75
96
  @visitor.enter_treeNode( dirname )
97
+ # return if ignore_dir?( dirname )
76
98
 
77
99
  Dir.entries( dirname ).each { |basename|
78
- next if basename == "." or basename == ".."
100
+ next if basename == "." or basename == ".." # ignore always "." and ".."
79
101
  pathname = File.join( dirname, basename )
80
102
 
81
103
  if File.directory?( pathname )
82
-
83
104
  # directory
84
- if ! ignore_dir?( basename )
85
- process_directory( pathname )
86
- end
87
-
105
+ process_directory( pathname ) unless ignore_dir?( basename )
88
106
  else
89
-
90
- # file
91
- if inspect_file?( basename ) && ! ignore_file?( basename )
92
- @visitor.visit_leafNode( pathname )
107
+ if @visit_leaf
108
+ if inspect_file?( basename ) && ! ignore_file?( basename )
109
+ @visitor.visit_leafNode( pathname )
110
+ end
93
111
  end
94
-
95
112
  end
96
113
  }
97
114
  @visitor.exit_treeNode( dirname )
@@ -21,231 +21,11 @@ class TreeNodeVisitor
21
21
 
22
22
  end
23
23
 
24
- #
25
- # Utilizzo della classa astratta DirTreeProcessor
26
- # per chimare un blocco su tutti i TreeNode
27
- #
28
- class BlockTreeNodeVisitor
29
-
30
- def initialize( &action )
31
- @block = action
32
- end
33
-
34
- def enter_treeNode( treeNode )
35
- @block.call( treeNode )
36
- end
37
-
38
- def exit_treeNode( treeNode )
39
- end
40
-
41
- def visit_leafNode( leafNode )
42
- @block.call( leafNode )
43
- end
44
-
45
- end
46
-
47
- #
48
- # Utilizzo della classa astratta DirTreeProcessor
49
- # per stampare i nodi di un TreeNode
50
- #
51
- class FlatPrintTreeNodeVisitor < TreeNodeVisitor
52
-
53
- def enter_treeNode( treeNode )
54
- puts treeNode.name
55
- end
56
-
57
- def exit_treeNode( treeNode )
58
- end
59
-
60
- def visit_leafNode( leafNode )
61
- puts leafNode.name
62
- end
63
-
64
- end
65
-
66
-
67
- class PrintTreeNodeVisitor < TreeNodeVisitor
68
-
69
- def initialize( *args )
70
- super( *args )
71
- @depth = 0
72
- end
73
-
74
- def visit_leafNode( leafNode )
75
- str = ""
76
- (0...@depth-1).step {
77
- str << " |-"
78
- }
79
- str << " | "
80
- puts str + leafNode.name.to_s
81
- end
82
-
83
- def enter_treeNode( treeNode )
84
-
85
- str = ""
86
- (0...@depth).step {
87
- str << " |-"
88
- }
89
-
90
- if @depth == 0
91
- puts str + treeNode.name.to_s
92
- else
93
- puts str + treeNode.name.to_s
94
- end
95
- @depth += 1
96
- end
97
-
98
- def exit_treeNode( treeNode )
99
- @depth -= 1
100
- end
101
- end
102
-
103
-
104
- #
105
- #
106
- #
107
- class DepthTreeNodeVisitor < TreeNodeVisitor
108
-
109
- attr_reader :depth
110
-
111
- def initialize
112
- super
113
- @depth = 0
114
- end
115
-
116
- def enter_treeNode( treeNode )
117
- @depth += 1
118
- end
119
-
120
- def exit_treeNode( treeNode )
121
- @depth -= 1
122
- end
123
24
 
124
- def visit_leafNode( leafNode )
125
- end
126
25
 
127
- end
128
-
129
- #
130
- # Esempio
131
- # Clona un TreeNode
132
- #
133
- class CloneTreeNodeVisitor < TreeNodeVisitor
134
-
135
- attr_reader :clonedRoot
136
-
137
- def initialize
138
- super
139
- @clonedRoot = nil
140
- @stack = []
141
- end
142
-
143
- def enter_treeNode( treeNode )
144
- if @stack.empty?
145
- clonedTreeNode = TreeNode.new( treeNode.name )
146
- @clonedRoot = clonedTreeNode
147
- else
148
- clonedTreeNode = TreeNode.new( treeNode.name, @stack.last )
149
- end
150
- @stack.push( clonedTreeNode )
151
- end
152
26
 
153
- def exit_treeNode( treeNode )
154
- @stack.pop
155
- end
156
27
 
157
- def visit_leafNode( leafNode )
158
- clonedLeafNode = LeafNode.new( leafNode.name, @stack.last )
159
- end
160
28
 
161
- end
162
29
 
163
- #
164
- # CallbackTreeNodeVisitor
165
- #
166
- class CallbackTreeNodeVisitor < TreeNodeVisitor
167
-
168
- def initialize( root = nil )
169
- super()
170
- @stack = []
171
- @root = root
172
- @stack.push( root ) if root
173
- @action_enterTreeNode = nil
174
- @action_visitLeafNode = nil
175
- end
176
-
177
- def onEnterTreeNode( &action )
178
- @action_enterTreeNode = action
179
- end
180
-
181
- def onVisitLeafNode( &action )
182
- @action_visitLeafNode = action
183
- end
184
30
 
185
- def enter_treeNode( treeNode )
186
- parentNode = if @stack.empty?
187
- nil
188
- else
189
- @stack.last
190
- end
191
- @root = treeNode if @stack.empty?
192
- @stack.push( treeNode )
193
- @action_enterTreeNode.call( treeNode ) if @action_enterTreeNode
194
- end
195
-
196
- def exit_treeNode( treeNode )
197
- @stack.pop
198
- end
199
-
200
- def visit_leafNode( leafNode )
201
- parentNode = @stack.last
202
- @action_visitLeafNode.call( leafNode ) if @action_visitLeafNode
203
- end
204
-
205
- end
206
-
207
-
208
- #
209
- # CallbackTreeNodeVisitor
210
- #
211
- class CallbackTreeNodeVisitor2 < TreeNodeVisitor
212
-
213
- attr_reader :root
214
-
215
- def initialize( root = nil )
216
- super()
217
- @stack = []
218
- @root = root
219
- @stack.push( root ) if root
220
- end
221
-
222
- def onEnterTreeNode( &action )
223
- @action_enterTreeNode = action
224
- end
225
-
226
- def onVisitLeafNode( &action )
227
- @action_visitLeafNode = action
228
- end
229
-
230
- def enter_treeNode( treeNode )
231
- newParentNode = if @stack.empty?
232
- nil
233
- else
234
- @stack.last
235
- end
236
- newTreeNode = @action_enterTreeNode.call( treeNode, newParentNode )
237
- @root = newTreeNode if @stack.empty?
238
- @stack.push( newTreeNode )
239
- end
240
-
241
- def exit_treeNode( treeNode )
242
- @stack.pop
243
- end
244
-
245
- def visit_leafNode( leafNode )
246
- newParentNode = @stack.last
247
- @action_visitLeafNode.call( leafNode, newParentNode )
248
- end
249
-
250
- end
251
31
 
@@ -0,0 +1,24 @@
1
+ require 'treevisitor/tree_node_visitor.rb'
2
+
3
+ #
4
+ # Utilizzo della classa astratta DirTreeProcessor
5
+ # per chimare un blocco su tutti i TreeNode
6
+ #
7
+ class BlockTreeNodeVisitor < TreeNodeVisitor
8
+
9
+ def initialize( &action )
10
+ @block = action
11
+ end
12
+
13
+ def enter_treeNode( treeNode )
14
+ @block.call( treeNode )
15
+ end
16
+
17
+ def exit_treeNode( treeNode )
18
+ end
19
+
20
+ def visit_leafNode( leafNode )
21
+ @block.call( leafNode )
22
+ end
23
+
24
+ end
@@ -11,11 +11,16 @@ require 'treevisitor/tree_node_visitor'
11
11
  class BuildDirTreeVisitor < TreeNodeVisitor
12
12
 
13
13
  attr_reader :root
14
+
15
+ attr_reader :nr_directories
16
+ attr_reader :nr_files
14
17
 
15
18
  def initialize
16
19
  super
17
20
  @root = nil
18
21
  @stack = []
22
+ @nr_directories = 0
23
+ @nr_files = 0
19
24
  end
20
25
 
21
26
  def enter_treeNode( pathname )
@@ -25,6 +30,7 @@ class BuildDirTreeVisitor < TreeNodeVisitor
25
30
  else
26
31
  treeNode = TreeNode.new( File.basename( pathname ), @stack.last )
27
32
  end
33
+ @nr_directories += 1
28
34
  @stack.push( treeNode )
29
35
  end
30
36
 
@@ -33,26 +39,8 @@ class BuildDirTreeVisitor < TreeNodeVisitor
33
39
  end
34
40
 
35
41
  def visit_leafNode( pathname )
42
+ @nr_files += 1
36
43
  leafNode = LeafNode.new( File.basename(pathname), @stack.last )
37
44
  end
38
45
 
39
46
  end
40
-
41
- #
42
- # Utilizzo della classa astratta DirTreeProcessor
43
- # per stampare i nodi di un TreeNode
44
- #
45
- class PrintDirTreeVisitor < TreeNodeVisitor
46
-
47
- def enter_treeNode( pathname )
48
- puts pathname
49
- end
50
-
51
- def exit_treeNode( treeNode )
52
- end
53
-
54
- def visit_leafNode( pathname )
55
- puts pathname
56
- end
57
-
58
- end
@@ -0,0 +1,43 @@
1
+ #
2
+ # CallbackTreeNodeVisitor
3
+ #
4
+ class CallbackTreeNodeVisitor < TreeNodeVisitor
5
+
6
+ def initialize( root = nil )
7
+ super()
8
+ @stack = []
9
+ @root = root
10
+ @stack.push( root ) if root
11
+ @action_enterTreeNode = nil
12
+ @action_visitLeafNode = nil
13
+ end
14
+
15
+ def onEnterTreeNode( &action )
16
+ @action_enterTreeNode = action
17
+ end
18
+
19
+ def onVisitLeafNode( &action )
20
+ @action_visitLeafNode = action
21
+ end
22
+
23
+ def enter_treeNode( treeNode )
24
+ parentNode = if @stack.empty?
25
+ nil
26
+ else
27
+ @stack.last
28
+ end
29
+ @root = treeNode if @stack.empty?
30
+ @stack.push( treeNode )
31
+ @action_enterTreeNode.call( treeNode ) if @action_enterTreeNode
32
+ end
33
+
34
+ def exit_treeNode( treeNode )
35
+ @stack.pop
36
+ end
37
+
38
+ def visit_leafNode( leafNode )
39
+ parentNode = @stack.last
40
+ @action_visitLeafNode.call( leafNode ) if @action_visitLeafNode
41
+ end
42
+
43
+ end
@@ -0,0 +1,45 @@
1
+
2
+ #
3
+ # CallbackTreeNodeVisitor
4
+ #
5
+ class CallbackTreeNodeVisitor2 < TreeNodeVisitor
6
+
7
+ attr_reader :root
8
+
9
+ def initialize( root = nil )
10
+ super()
11
+ @stack = []
12
+ @root = root
13
+ @stack.push( root ) if root
14
+ end
15
+
16
+ def onEnterTreeNode( &action )
17
+ @action_enterTreeNode = action
18
+ end
19
+
20
+ def onVisitLeafNode( &action )
21
+ @action_visitLeafNode = action
22
+ end
23
+
24
+ def enter_treeNode( treeNode )
25
+ newParentNode = if @stack.empty?
26
+ nil
27
+ else
28
+ @stack.last
29
+ end
30
+ newTreeNode = @action_enterTreeNode.call( treeNode, newParentNode )
31
+ @root = newTreeNode if @stack.empty?
32
+ @stack.push( newTreeNode )
33
+ end
34
+
35
+ def exit_treeNode( treeNode )
36
+ @stack.pop
37
+ end
38
+
39
+ def visit_leafNode( leafNode )
40
+ newParentNode = @stack.last
41
+ @action_visitLeafNode.call( leafNode, newParentNode )
42
+ end
43
+
44
+ end
45
+
@@ -0,0 +1,33 @@
1
+ #
2
+ # Esempio
3
+ # Clona un TreeNode
4
+ #
5
+ class CloneTreeNodeVisitor < TreeNodeVisitor
6
+
7
+ attr_reader :clonedRoot
8
+
9
+ def initialize
10
+ super
11
+ @clonedRoot = nil
12
+ @stack = []
13
+ end
14
+
15
+ def enter_treeNode( treeNode )
16
+ if @stack.empty?
17
+ clonedTreeNode = TreeNode.new( treeNode.name )
18
+ @clonedRoot = clonedTreeNode
19
+ else
20
+ clonedTreeNode = TreeNode.new( treeNode.name, @stack.last )
21
+ end
22
+ @stack.push( clonedTreeNode )
23
+ end
24
+
25
+ def exit_treeNode( treeNode )
26
+ @stack.pop
27
+ end
28
+
29
+ def visit_leafNode( leafNode )
30
+ clonedLeafNode = LeafNode.new( leafNode.name, @stack.last )
31
+ end
32
+
33
+ end
@@ -0,0 +1,24 @@
1
+ #
2
+ #
3
+ #
4
+ class DepthTreeNodeVisitor < TreeNodeVisitor
5
+
6
+ attr_reader :depth
7
+
8
+ def initialize
9
+ super
10
+ @depth = 0
11
+ end
12
+
13
+ def enter_treeNode( treeNode )
14
+ @depth += 1
15
+ end
16
+
17
+ def exit_treeNode( treeNode )
18
+ @depth -= 1
19
+ end
20
+
21
+ def visit_leafNode( leafNode )
22
+ end
23
+
24
+ end
@@ -0,0 +1,18 @@
1
+ #
2
+ # Utilizzo della classa astratta DirTreeProcessor
3
+ # per stampare i nodi di un TreeNode
4
+ #
5
+ class FlatPrintTreeNodeVisitor < TreeNodeVisitor
6
+
7
+ def enter_treeNode( treeNode )
8
+ puts treeNode.name
9
+ end
10
+
11
+ def exit_treeNode( treeNode )
12
+ end
13
+
14
+ def visit_leafNode( leafNode )
15
+ puts leafNode.name
16
+ end
17
+
18
+ end
@@ -0,0 +1,18 @@
1
+ #
2
+ # Utilizzo della classa astratta DirTreeProcessor
3
+ # per stampare i nodi di un TreeNode
4
+ #
5
+ class PrintDirTreeVisitor < TreeNodeVisitor
6
+
7
+ def enter_treeNode( pathname )
8
+ puts pathname
9
+ end
10
+
11
+ def exit_treeNode( treeNode )
12
+ end
13
+
14
+ def visit_leafNode( pathname )
15
+ puts pathname
16
+ end
17
+
18
+ end
@@ -0,0 +1,35 @@
1
+ class PrintTreeNodeVisitor < TreeNodeVisitor
2
+
3
+ def initialize( *args )
4
+ super( *args )
5
+ @depth = 0
6
+ end
7
+
8
+ def visit_leafNode( leafNode )
9
+ str = ""
10
+ (0...@depth-1).step {
11
+ str << " |-"
12
+ }
13
+ str << " | "
14
+ puts str + leafNode.name.to_s
15
+ end
16
+
17
+ def enter_treeNode( treeNode )
18
+
19
+ str = ""
20
+ (0...@depth).step {
21
+ str << " |-"
22
+ }
23
+
24
+ if @depth == 0
25
+ puts str + treeNode.name.to_s
26
+ else
27
+ puts str + treeNode.name.to_s
28
+ end
29
+ @depth += 1
30
+ end
31
+
32
+ def exit_treeNode( treeNode )
33
+ @depth -= 1
34
+ end
35
+ end
@@ -1,17 +1,25 @@
1
1
  require File.join( File.dirname(__FILE__), "test_helper")
2
2
 
3
3
  require 'fileutils'
4
- require 'gf_utility/kwartzhelper'
5
4
 
6
- class TCDirProcessor < Test::Unit::TestCase
5
+ class TCKwartz < Test::Unit::TestCase
7
6
 
8
7
  KWARTZ_TEST_DATA = File.join( $TREEVISITOR_HOME, "test_data", "gf_utility", "kwartz_test_data" )
9
8
 
10
9
  def test_simple
10
+
11
+ begin
12
+ require 'kwartz'
13
+ rescue LoadError
14
+ puts "WARNING kwartz_helper test not runned because kwartz is not present"
15
+ return
16
+ end
17
+
18
+ require 'gf_utilities/kwartzhelper'
11
19
  template_dir = File.join( KWARTZ_TEST_DATA, "source" )
12
20
  template_out = File.join( KWARTZ_TEST_DATA, "out" )
13
21
  kwartz_compile( template_dir, nil, template_out )
14
-
22
+
15
23
  out_filename = File.join( KWARTZ_TEST_DATA, "out", "test1.rb" )
16
24
  assert File.exists?(out_filename)
17
25
  FileUtils.rm out_filename
@@ -0,0 +1,14 @@
1
+ require File.join( File.dirname(__FILE__), "test_helper")
2
+
3
+ require 'gf_utilities/md5.rb'
4
+
5
+ class TCMD5 < Test::Unit::TestCase
6
+
7
+ TEST_FILE = File.join( $TREEVISITOR_HOME, "lib", "gf_utilities", "md5.rb" )
8
+
9
+ def test_simple_md5
10
+ file_name = File.join( TEST_FILE )
11
+ assert_equal "0cac752fb36269471d8265435ed99443", MD5.file( file_name ).to_s
12
+ end
13
+
14
+ end
@@ -1,6 +1,6 @@
1
1
  require File.join( File.dirname(__FILE__), "test_helper")
2
2
 
3
- require 'gf_utility/numeric.rb'
3
+ require 'gf_utilities/numeric.rb'
4
4
 
5
5
  class TCNumeric < Test::Unit::TestCase
6
6
 
File without changes
@@ -0,0 +1,61 @@
1
+ require File.join(File.dirname(__FILE__), "..", "test_helper")
2
+
3
+ require 'treevisitor/cli/cli_tree'
4
+
5
+ class TCCliTree < Test::Unit::TestCase
6
+
7
+ TEST_DIRECTORY = File.join( $TREEVISITOR_HOME, "test_data", "tree_visitor", "test_data" )
8
+
9
+ def test_help_message
10
+ out = with_stdout_captured do
11
+ args = %w{-h}
12
+ CliTree.new.parse_args(args)
13
+ end
14
+ assert out.start_with?("Usage:")
15
+ end
16
+
17
+ def test_version
18
+ out = with_stdout_captured do
19
+ args = %w{--version}
20
+ CliTree.new.parse_args(args)
21
+ end
22
+ version = File.open( File.join($TREEVISITOR_HOME, "VERSION") ).read
23
+ assert_match version, out
24
+ end
25
+
26
+ def test_directories_only
27
+ out = with_stdout_captured do
28
+ args = %w{-d}
29
+ args << TEST_DIRECTORY
30
+ CliTree.new.parse_args(args)
31
+ end
32
+ # puts out
33
+ assert_equal 6, out.split("\n").length
34
+
35
+ out = with_stdout_captured do
36
+ args = %w{-da}
37
+ args << TEST_DIRECTORY
38
+ CliTree.new.parse_args(args)
39
+ end
40
+ #puts out
41
+ assert_equal 7, out.split("\n").length
42
+ end
43
+
44
+ def test_all_files
45
+ out = with_stdout_captured do
46
+ args = %w{-a}
47
+ args << TEST_DIRECTORY
48
+ CliTree.new.parse_args(args)
49
+ end
50
+ # puts out
51
+ assert_equal 11, out.split("\n").length
52
+
53
+ out = with_stdout_captured do
54
+ args = []
55
+ args << TEST_DIRECTORY
56
+ CliTree.new.parse_args(args)
57
+ end
58
+ # puts out
59
+ assert_equal 9, out.split("\n").length
60
+ end
61
+ end
@@ -3,8 +3,13 @@ require File.join(File.dirname(__FILE__), "test_helper")
3
3
  require 'treevisitor/dir_processor'
4
4
 
5
5
  class TCDirProcessor < Test::Unit::TestCase
6
+
7
+ TEST_DATA = File.join( $TREEVISITOR_HOME, "test_data", "tree_visitor", "test_data" )
8
+
6
9
  def test_simple
7
- dp = DirProcessor.new($TEST_DATA) { |f| puts f }
10
+ files = []
11
+ dp = DirProcessor.new(TEST_DATA) { |f| files << f }
8
12
  dp.run
13
+ assert_equal 3, files.length
9
14
  end
10
15
  end
@@ -5,26 +5,36 @@ require 'treevisitor/tree_node_visitor.rb'
5
5
 
6
6
  class TCDirTreeWalker < Test::Unit::TestCase
7
7
 
8
+ TEST_DIRECTORY = File.join( $TREEVISITOR_HOME, "test_data", "tree_visitor", "test_data" )
9
+
8
10
  def test_simple
9
- dir_tree_walker = DirTreeWalker.new( $TEST_DATA )
11
+ dir_tree_walker = DirTreeWalker.new( TEST_DIRECTORY )
10
12
  dir_tree_walker.add_ignore_dir( ".svn" )
11
13
 
12
14
  accumulator = []
13
15
  visitor = BlockTreeNodeVisitor.new { |pathname| accumulator << File.basename( pathname ) }
14
16
  dir_tree_walker.run( visitor )
15
- assert_equal( 7, accumulator.length )
16
- assert_equal( %w{ test_data dir.1 dir.1.2 file.1.2.1 file.1.1 dir.2 file.2.1 }, accumulator )
17
+ assert_equal( 9, accumulator.length )
18
+ assert_equal( %w{ test_data dir.1 dir.1.2 file.1.2.1 file.1.1 dir.2 file.2.1 .dir_with_dot dummy.txt}, accumulator )
17
19
  end
18
20
 
19
- def test_ignore_dir
21
+ def test_ignore_function
20
22
  dtp = DirTreeWalker.new( "." )
21
23
 
22
- dtp.add_ignore_dir(".xvpics")
23
- dtp.add_ignore_dir(".thumbnails")
24
- dtp.add_ignore_dir("catalog_data")
24
+ dtp.add_ignore_pattern(/^\./)
25
+ assert dtp.ignore_file?( ".thumbnails" )
26
+ assert dtp.ignore_dir?( ".thumbnails" )
27
+
28
+ dtp.add_ignore_dir("thumbnails")
29
+
30
+ assert dtp.ignore_dir?( ".thumbnails" )
31
+ assert dtp.ignore_dir?( "thumbnails" )
32
+ assert ! dtp.ignore_dir?( "pippo" )
33
+
34
+
35
+ dtp.add_ignore_file("xvpics")
25
36
 
26
- assert( dtp.ignore_dir?( ".thumbnails" ) )
27
- assert( ! dtp.ignore_dir?( "pippo" ) )
37
+ assert( dtp.ignore_file?( "xvpics" ) )
28
38
  end
29
39
 
30
40
  end
@@ -2,6 +2,11 @@ require File.join(File.dirname(__FILE__), "test_helper")
2
2
 
3
3
  require 'treevisitor/tree_node.rb'
4
4
  require 'treevisitor/tree_node_visitor.rb'
5
+ require 'treevisitor/visitors/block_tree_node_visitor'
6
+ require 'treevisitor/visitors/callback_tree_node_visitor'
7
+ require 'treevisitor/visitors/callback_tree_node_visitor2'
8
+ require 'treevisitor/visitors/clone_tree_node_visitor'
9
+ require 'treevisitor/visitors/depth_tree_node_visitor'
5
10
 
6
11
  class TCTreeNodeVisitor < Test::Unit::TestCase
7
12
 
@@ -5,6 +5,17 @@ test_dir = File.join($TREEVISITOR_HOME, "test" )
5
5
  $:.unshift lib_dir unless $:.include?(lib_dir)
6
6
  $:.unshift test_dir unless $:.include?(test_dir)
7
7
 
8
- $TEST_DATA = File.join( $TREEVISITOR_HOME, "test_data", "tree_visitor", "test_data" )
9
-
10
8
  require 'test/unit'
9
+
10
+ require "stringio"
11
+ def with_stdout_captured
12
+ old_stdout = $stdout
13
+ out = StringIO.new
14
+ $stdout = out
15
+ begin
16
+ yield
17
+ ensure
18
+ $stdout = old_stdout
19
+ end
20
+ out.string
21
+ end
@@ -0,0 +1 @@
1
+ So git create directory
@@ -0,0 +1 @@
1
+ So git create directory
@@ -0,0 +1,16 @@
1
+ /* The element which is marked by 'id="list1"' */
2
+ #list1 {
3
+ logic: {
4
+ for member in @members
5
+ _stag # start tag
6
+ _cont # content
7
+ _etag # end tag
8
+ end
9
+ }
10
+ }
11
+
12
+ /* The element which is marked by 'id="mark:item1"' */
13
+ #item1 {
14
+ /* replace the content with value of a variable 'member' */
15
+ value: member;
16
+ }
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.6
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - gf
@@ -9,8 +9,8 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-05-27 00:00:00 -07:00
13
- default_executable: dirtree.rb
12
+ date: 2009-05-30 00:00:00 -07:00
13
+ default_executable: tree.rb
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: abstract
@@ -25,28 +25,41 @@ dependencies:
25
25
  description:
26
26
  email: giovanni.ferro@gmail.com
27
27
  executables:
28
- - dirtree.rb
28
+ - tree.rb
29
29
  extensions: []
30
30
 
31
31
  extra_rdoc_files:
32
32
  - LICENSE
33
33
  - README.rdoc
34
34
  files:
35
- - lib/gf_utility/file_utilities.rb
36
- - lib/gf_utility/kwartzhelper.rb
37
- - lib/gf_utility/md5.rb
38
- - lib/gf_utility/numeric.rb
35
+ - VERSION
36
+ - lib/gf_utilities/file_utilities.rb
37
+ - lib/gf_utilities/kwartzhelper.rb
38
+ - lib/gf_utilities/md5.rb
39
+ - lib/gf_utilities/numeric.rb
39
40
  - lib/treevisitor.rb
40
41
  - lib/treevisitor/abs_node.rb
41
- - lib/treevisitor/build_dir_tree_visitor.rb
42
- - lib/treevisitor/cli/cli_dir_tree.rb
42
+ - lib/treevisitor/cli/cli_tree.rb
43
43
  - lib/treevisitor/dir_processor.rb
44
44
  - lib/treevisitor/dir_tree_walker.rb
45
45
  - lib/treevisitor/leaf_node.rb
46
46
  - lib/treevisitor/tree_node.rb
47
47
  - lib/treevisitor/tree_node_visitor.rb
48
- - lib/treevisitor/visitor/print_node_visitor2.rb
48
+ - lib/treevisitor/visitors/block_tree_node_visitor.rb
49
+ - lib/treevisitor/visitors/build_dir_tree_visitor.rb
50
+ - lib/treevisitor/visitors/callback_tree_node_visitor.rb
51
+ - lib/treevisitor/visitors/callback_tree_node_visitor2.rb
52
+ - lib/treevisitor/visitors/clone_tree_node_visitor.rb
53
+ - lib/treevisitor/visitors/depth_tree_node_visitor.rb
54
+ - lib/treevisitor/visitors/flat_print_tree_node_visitors.rb
55
+ - lib/treevisitor/visitors/print_dir_tree_visitor.rb
56
+ - lib/treevisitor/visitors/print_node_visitor2.rb
57
+ - lib/treevisitor/visitors/print_tree_node_visitor.rb
58
+ - test_data/gf_utility/kwartz_test_data/out.certified/dummy.txt
59
+ - test_data/gf_utility/kwartz_test_data/out/dummy.txt
49
60
  - test_data/gf_utility/kwartz_test_data/source/test1.html
61
+ - test_data/gf_utility/kwartz_test_data/source/test1.plogic
62
+ - test_data/tree_visitor/test_data/.dir_with_dot/dummy.txt
50
63
  - test_data/tree_visitor/test_data/dir.1/dir.1.2/file.1.2.1
51
64
  - test_data/tree_visitor/test_data/dir.1/file.1.1
52
65
  - test_data/tree_visitor/test_data/dir.2/file.2.1
@@ -76,16 +89,16 @@ requirements: []
76
89
  rubyforge_project: treevisitor
77
90
  rubygems_version: 1.2.0
78
91
  signing_key:
79
- specification_version: 2
92
+ specification_version: 3
80
93
  summary: implementation of visitor design pattern
81
94
  test_files:
82
95
  - test/treevisitor/tc_dir_processor.rb
96
+ - test/treevisitor/cli/tc_cli_tree.rb
83
97
  - test/treevisitor/tc_dir_tree_walker.rb
84
98
  - test/treevisitor/tc_tree_node.rb
85
99
  - test/treevisitor/tc_tree_node_visitor.rb
86
100
  - test/treevisitor/test_helper.rb
87
- - test/gf_utility/tc_md5.rb
88
- - test/gf_utility/tc_kwartz.rb
89
- - test/gf_utility/tc_numeric.rb
90
- - test/gf_utility/test_helper.rb
91
- - test/ts_treevisitor.rb
101
+ - test/gf_utilities/tc_md5.rb
102
+ - test/gf_utilities/tc_kwartz.rb
103
+ - test/gf_utilities/tc_numeric.rb
104
+ - test/gf_utilities/test_helper.rb
@@ -1,17 +0,0 @@
1
- # stdlib
2
- require 'md5'
3
-
4
- #
5
- # calcola md5 di file grandi, copiata da usenet
6
- #
7
- class MD5
8
- def self.file(file)
9
- File.open(file, "rb") do |f|
10
- res = self.new
11
- while (data = f.read(4096))
12
- res << data
13
- end
14
- res
15
- end
16
- end
17
- end
@@ -1,14 +0,0 @@
1
- require File.join( File.dirname(__FILE__), "test_helper")
2
-
3
- require 'gf_utility/md5.rb'
4
-
5
- class TCMD5 < Test::Unit::TestCase
6
-
7
- TEST_FILE = File.join( $TREEVISITOR_HOME, "lib", "treevisitor.rb" )
8
-
9
- def test_simple_build
10
- file_name = File.join( TEST_FILE )
11
- MD5.file( file_name )
12
- end
13
-
14
- end
@@ -1,16 +0,0 @@
1
- # stdlib
2
- require "test/unit"
3
-
4
- # common
5
- $TREEVISITOR_HOME = File.expand_path( File.join( File.dirname( __FILE__), "..") )
6
- $:.unshift( File.join($TREEVISITOR_HOME, "lib" ) )
7
- $:.unshift( File.join($TREEVISITOR_HOME, "test" ) )
8
-
9
- require "tree_visitor"
10
-
11
- require "gf_utility/tc_md5"
12
-
13
- require "treevisitor/tc_dir_processor"
14
- require "treevisitor/tc_dir_tree_walker"
15
- require "treevisitor/tc_tree_node"
16
- require "treevisitor/tc_tree_node_visitor"