gf-treevisitor 0.0.6 → 0.0.8

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.
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"