tree.rb 0.3.7 → 0.3.8
Sign up to get free protection for your applications and to get access to all the features.
- data/examples/prova1/prova1.html +22 -0
- data/lib/colors.rb +39 -0
- data/lib/tree_rb/cli/cli_tree.rb +37 -18
- data/lib/tree_rb/directory_walker.rb +19 -13
- data/lib/tree_rb/tree_node.rb +103 -45
- data/lib/tree_rb/version.rb +1 -1
- data/lib/tree_rb/visitors/build_dir_tree_visitor.rb +3 -5
- data/lib/tree_rb/visitors/directory_to_hash2_visitor.rb +10 -6
- data/lib/tree_rb/visitors/sqlite_dir_tree_visitor.rb +4 -3
- data/spec/tree_rb/cli/cli_tree_generic_spec.rb +25 -3
- metadata +4 -8
@@ -0,0 +1,22 @@
|
|
1
|
+
|
2
|
+
<!DOCTYPE html>
|
3
|
+
<html lang="en">
|
4
|
+
<head>
|
5
|
+
<meta charset="utf-8">
|
6
|
+
<title>D3 Test</title>
|
7
|
+
<script type="text/javascript" src="../../d3/d3.v2.js"></script>
|
8
|
+
</head>
|
9
|
+
<body>
|
10
|
+
<script type="text/javascript">
|
11
|
+
|
12
|
+
var dataset = [ 5, 10, 15, 20, 25 ];
|
13
|
+
|
14
|
+
d3.select("body").selectAll("p")
|
15
|
+
.data(dataset)
|
16
|
+
.enter()
|
17
|
+
.append("p")
|
18
|
+
.text("New paragraph!");
|
19
|
+
|
20
|
+
</script>
|
21
|
+
</body>
|
22
|
+
</html>
|
data/lib/colors.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
# Below are the color init strings for the basic file types. A color init
|
2
|
+
# string consists of one or more of the following numeric codes:
|
3
|
+
# Attribute codes:
|
4
|
+
# 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed
|
5
|
+
# Text color codes:
|
6
|
+
# 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white
|
7
|
+
# Background color codes:
|
8
|
+
# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white
|
9
|
+
|
10
|
+
|
11
|
+
m = { }
|
12
|
+
ENV['LS_COLORS'].split(":").each do |e|
|
13
|
+
k, v = e.split('=')
|
14
|
+
m[k] = v
|
15
|
+
end
|
16
|
+
|
17
|
+
puts m
|
18
|
+
|
19
|
+
|
20
|
+
## ANSIname => ANSIcode LUT
|
21
|
+
#ANSINAME2CODE= { "reset" => "\e[0m", "bold" => "\e[1m",
|
22
|
+
# "underline" => "\e[4m", "blink" => "\e[5m",
|
23
|
+
# "reverse" => "\e[7m", "invisible" => "\e[8m",
|
24
|
+
# "black" => "\e[0;30m", "darkgrey" => "\e[1;30m",
|
25
|
+
# "red" => "\e[0;31m", "lightred" => "\e[1;31m",
|
26
|
+
# "green" => "\e[0;32m", "lightgreen" => "\e[1;32m",
|
27
|
+
# "brown" => "\e[0;33m", "yellow" => "\e[1;33m",
|
28
|
+
# "blue" => "\e[0;34m", "lightblue" => "\e[1;34m",
|
29
|
+
# "purple" => "\e[0;35m", "magenta" => "\e[1;35m",
|
30
|
+
# "cyan" => "\e[1;36m", "lightcyan" => "\e[1;36m",
|
31
|
+
# "grey" => "\e[0;37m", "white" => "\e[1;37m",
|
32
|
+
# "bgblack" => "\e[40m", "bgred" => "\e[41m",
|
33
|
+
# "bggreen" => "\e[42m", "bgyellow" => "\e[43m",
|
34
|
+
# "bgblue" => "\e[44m", "bgmagenta" => "\e[45m",
|
35
|
+
# "bgcyan" => "\e[46m", "bgwhite" => "\e[47m"
|
36
|
+
i,e= m['*.tga'].split(';')
|
37
|
+
|
38
|
+
puts "\e[#{i}m\e[1;#{e}m prova.tga \e[0m"
|
39
|
+
|
data/lib/tree_rb/cli/cli_tree.rb
CHANGED
@@ -17,9 +17,22 @@ module TreeRb
|
|
17
17
|
parser.separator "this is a almost :-) a clone of tree unix command written in ruby"
|
18
18
|
parser.separator "Code https://github.com/tokiro/treevisitor. Feedback to tokiro.oyama@gmail.com"
|
19
19
|
|
20
|
+
#
|
21
|
+
# Generic
|
22
|
+
#
|
20
23
|
parser.separator ""
|
21
24
|
parser.separator "Generic options: "
|
22
25
|
|
26
|
+
parser.on_tail("--help", "Show this message") do
|
27
|
+
puts parser
|
28
|
+
options[:exit] = 1
|
29
|
+
end
|
30
|
+
|
31
|
+
parser.on_tail("--version", "Show the version") do
|
32
|
+
puts "tree.rb version #{TreeRb::VERSION}"
|
33
|
+
options[:exit] = 1
|
34
|
+
end
|
35
|
+
|
23
36
|
parser.on("-v", "--[no-]verbose", "Run verbosely") do |v|
|
24
37
|
options[:verbose] = v
|
25
38
|
end
|
@@ -41,6 +54,9 @@ module TreeRb
|
|
41
54
|
options[:force_overwrite_output] = true
|
42
55
|
end
|
43
56
|
|
57
|
+
#
|
58
|
+
# Filters
|
59
|
+
#
|
44
60
|
parser.separator ""
|
45
61
|
parser.separator "Filter options: "
|
46
62
|
|
@@ -66,6 +82,14 @@ module TreeRb
|
|
66
82
|
options[:algo] = algo
|
67
83
|
end
|
68
84
|
|
85
|
+
options[:max_level] = nil
|
86
|
+
parser.on("-L [LEVEL]", Integer, "Max display depth of the directory tree.") do |l|
|
87
|
+
options[:max_level] = l
|
88
|
+
end
|
89
|
+
|
90
|
+
#
|
91
|
+
# Presentation options
|
92
|
+
#
|
69
93
|
parser.separator ""
|
70
94
|
parser.separator "print options:"
|
71
95
|
|
@@ -84,14 +108,13 @@ module TreeRb
|
|
84
108
|
" Useful to colorize output to a pipe.") do
|
85
109
|
options[:colorize_force] = true
|
86
110
|
end
|
87
|
-
|
88
111
|
#
|
89
112
|
# end colorize
|
90
113
|
#
|
91
114
|
|
92
|
-
options[:
|
93
|
-
parser.on("-
|
94
|
-
options[:
|
115
|
+
options[:ansi_line_graphics] = false
|
116
|
+
parser.on("-A", "Turn on ANSI line graphics hack when printing the indentation lines.") do
|
117
|
+
options[:ansi_line_graphics] = true
|
95
118
|
end
|
96
119
|
|
97
120
|
options[:show_full_path] = false
|
@@ -151,18 +174,6 @@ module TreeRb
|
|
151
174
|
options[:show_report] = false
|
152
175
|
end
|
153
176
|
|
154
|
-
parser.separator ""
|
155
|
-
parser.separator "Other options:"
|
156
|
-
|
157
|
-
parser.on_tail("--help", "Show this message") do
|
158
|
-
puts parser
|
159
|
-
options[:exit] = 1
|
160
|
-
end
|
161
|
-
|
162
|
-
parser.on_tail("--version", "Show the version") do
|
163
|
-
puts "tree.rb version #{TreeRb::VERSION}"
|
164
|
-
options[:exit] = 1
|
165
|
-
end
|
166
177
|
|
167
178
|
parser
|
168
179
|
end
|
@@ -248,12 +259,20 @@ module TreeRb
|
|
248
259
|
when 'json'
|
249
260
|
visitor = DirectoryToHashVisitor.new(dirname)
|
250
261
|
root = dtw.run(visitor).root
|
251
|
-
|
262
|
+
begin
|
263
|
+
output.puts JSON.pretty_generate(root)
|
264
|
+
rescue JSON::NestingError => e
|
265
|
+
$stderr.puts "#{File.basename(__FILE__)}:#{__LINE__} #{e.to_s}"
|
266
|
+
end
|
252
267
|
|
253
268
|
when 'json2'
|
254
269
|
visitor = DirectoryToHash2Visitor.new(dirname)
|
255
270
|
root = dtw.run(visitor).root
|
256
|
-
|
271
|
+
begin
|
272
|
+
output.puts JSON.pretty_generate(root)
|
273
|
+
rescue JSON::NestingError => e
|
274
|
+
$stderr.puts "#{File.basename(__FILE__)}:#{__LINE__} #{e.to_s}"
|
275
|
+
end
|
257
276
|
|
258
277
|
when 'yaml'
|
259
278
|
visitor = DirectoryToHashVisitor.new(dirname)
|
@@ -149,7 +149,7 @@ module TreeRb
|
|
149
149
|
#
|
150
150
|
# Test directory ignore pattern
|
151
151
|
#
|
152
|
-
# @param [String] directory name
|
152
|
+
# @param [String] dirname directory name
|
153
153
|
# @return [boolean] if dirname match almost one pattern
|
154
154
|
#
|
155
155
|
def ignore_dir?(dirname)
|
@@ -159,7 +159,7 @@ module TreeRb
|
|
159
159
|
#
|
160
160
|
# Test file ignore pattern
|
161
161
|
#
|
162
|
-
# @param [String]
|
162
|
+
# @param [String] filename
|
163
163
|
# @return [boolean] if filename match almost one pattern
|
164
164
|
#
|
165
165
|
def ignore_file?(filename)
|
@@ -169,7 +169,7 @@ module TreeRb
|
|
169
169
|
#
|
170
170
|
# Test common ignore pattern
|
171
171
|
#
|
172
|
-
# @param [String]
|
172
|
+
# @param [String] filename
|
173
173
|
# @return [boolean] if filename match almost one pattern
|
174
174
|
#
|
175
175
|
def match?(filename)
|
@@ -263,14 +263,18 @@ module TreeRb
|
|
263
263
|
#
|
264
264
|
# recurse on other directories
|
265
265
|
#
|
266
|
-
def process_directory(dirname, level=
|
266
|
+
def process_directory(dirname, level=1)
|
267
267
|
begin
|
268
268
|
entries = Dir.entries(dirname).sort
|
269
269
|
rescue Errno::EACCES => e
|
270
270
|
$stderr.puts e
|
271
271
|
@visitor.cannot_enter_node(dirname, e)
|
272
272
|
return
|
273
|
-
rescue
|
273
|
+
rescue Errno::EPERM => e
|
274
|
+
$stderr.puts e
|
275
|
+
@visitor.cannot_enter_node(dirname, e)
|
276
|
+
return
|
277
|
+
rescue Errno::ENOENT => e
|
274
278
|
$stderr.puts e
|
275
279
|
@visitor.cannot_enter_node(dirname, e)
|
276
280
|
return
|
@@ -278,26 +282,28 @@ module TreeRb
|
|
278
282
|
|
279
283
|
|
280
284
|
@visitor.enter_node(dirname)
|
281
|
-
|
282
|
-
|
285
|
+
entries.each do |basename|
|
286
|
+
begin
|
283
287
|
next if basename == "." or basename == ".." # ignore always "." and ".."
|
284
288
|
pathname = File.join(dirname, basename)
|
285
289
|
|
286
290
|
if File.directory?(pathname)
|
287
291
|
if not ignore_dir?(basename) and (@max_level.nil? or @max_level > level)
|
288
|
-
process_directory(pathname, level+1)
|
292
|
+
process_directory(pathname, level+1)
|
289
293
|
end
|
290
294
|
else
|
291
295
|
if !!@visit_file && match?(basename) && !ignore_file?(basename)
|
292
296
|
@visitor.visit_leaf(pathname)
|
293
297
|
end
|
294
298
|
end
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
299
|
+
rescue Errno::EACCES => e
|
300
|
+
$stderr.puts e
|
301
|
+
rescue Errno::EPERM => e
|
302
|
+
$stderr.puts e
|
303
|
+
rescue Errno::ENOENT => e
|
304
|
+
$stderr.puts e
|
300
305
|
end
|
306
|
+
end
|
301
307
|
|
302
308
|
@visitor.exit_node(dirname)
|
303
309
|
end
|
data/lib/tree_rb/tree_node.rb
CHANGED
@@ -6,6 +6,7 @@ module TreeRb
|
|
6
6
|
#
|
7
7
|
# TreeNode @children -1---n-> TreeNode
|
8
8
|
# @leaves -1---n-> LeafNode
|
9
|
+
# @children_leaves -1---n-> AbsNode (to preserve insert order)
|
9
10
|
#
|
10
11
|
# define dsl to create Tree
|
11
12
|
#
|
@@ -22,9 +23,19 @@ module TreeRb
|
|
22
23
|
|
23
24
|
class << self
|
24
25
|
|
25
|
-
# DSL create a root node
|
26
|
+
# DSL create a root node:
|
26
27
|
#
|
27
|
-
#
|
28
|
+
# tree = TreeNode.create do
|
29
|
+
# ...
|
30
|
+
# end
|
31
|
+
#
|
32
|
+
# tree = TreeNode.create(LeafDerivedClass) do
|
33
|
+
# ...
|
34
|
+
# end
|
35
|
+
#
|
36
|
+
# tree = TreeNode.create(TreeNodeDerivedClass, LeafDerivedClass) do
|
37
|
+
# ...
|
38
|
+
# end
|
28
39
|
#
|
29
40
|
# @param [Class] class1 Subclass of TreeNode default TreeNode
|
30
41
|
# @param [Class] class2 Subclass of LeafNode default LeafNode
|
@@ -39,7 +50,7 @@ module TreeRb
|
|
39
50
|
end
|
40
51
|
|
41
52
|
if @tree_node_class.nil? || @leaf_node_class.nil?
|
42
|
-
raise "Must be specified
|
53
|
+
raise "Must be specified classes derived from TreeNode and LeafNode"
|
43
54
|
end
|
44
55
|
|
45
56
|
@scope_stack = []
|
@@ -48,15 +59,18 @@ module TreeRb
|
|
48
59
|
|
49
60
|
private
|
50
61
|
|
51
|
-
# DSL node
|
52
|
-
#
|
53
|
-
#
|
54
|
-
#
|
62
|
+
# DSL 'node' adds a child (TreeClass) to the current node
|
63
|
+
#
|
64
|
+
# TreeNode.create do
|
65
|
+
# node "..."
|
66
|
+
# end
|
55
67
|
def node(*args, &block)
|
56
68
|
parent_node = @scope_stack.length > 0 ? @scope_stack[-1] : nil
|
57
69
|
args << parent_node
|
58
70
|
tree_node = @tree_node_class.new(*args)
|
59
71
|
@scope_stack.push tree_node
|
72
|
+
|
73
|
+
# evaluate block if any
|
60
74
|
if block
|
61
75
|
if block.arity == 0 || block.arity == -1
|
62
76
|
class_eval(&block)
|
@@ -67,17 +81,21 @@ module TreeRb
|
|
67
81
|
raise "block take too much arguments #{block.arity}"
|
68
82
|
end
|
69
83
|
end
|
84
|
+
|
70
85
|
@scope_stack.pop
|
71
86
|
end
|
72
87
|
|
73
|
-
# DSL
|
74
|
-
#
|
75
|
-
#
|
76
|
-
#
|
88
|
+
# DSL 'leaf' add a leaf (LeafClass) to the surround node
|
89
|
+
#
|
90
|
+
# TreeNode.create do
|
91
|
+
# leaf "..."
|
92
|
+
# end
|
77
93
|
def leaf(*args, &block)
|
78
94
|
tree_node = @scope_stack[-1]
|
79
95
|
args << tree_node
|
80
96
|
leaf_node = @leaf_node_class.new(*args)
|
97
|
+
|
98
|
+
# evaluate block if any
|
81
99
|
if block
|
82
100
|
if block.arity == 0 || block.arity == -1
|
83
101
|
class_eval(&block)
|
@@ -98,12 +116,17 @@ module TreeRb
|
|
98
116
|
# children i.e. other tree node
|
99
117
|
attr_reader :children
|
100
118
|
|
119
|
+
# leaves and children to preserve insert order
|
120
|
+
attr_reader :leaves_and_children
|
121
|
+
|
101
122
|
#
|
102
123
|
# @param [Object] content of this node
|
103
124
|
# @param [Object] parent of this node. If parent is nil, it is a root
|
125
|
+
#
|
104
126
|
def initialize(content, parent = nil)
|
105
|
-
@leaves
|
106
|
-
@children
|
127
|
+
@leaves = []
|
128
|
+
@children = []
|
129
|
+
@leaves_and_children = []
|
107
130
|
super(content)
|
108
131
|
parent.add_child(self) if parent
|
109
132
|
end
|
@@ -150,15 +173,13 @@ module TreeRb
|
|
150
173
|
|
151
174
|
#
|
152
175
|
# Add a Leaf
|
153
|
-
# @param [LeafNode]
|
176
|
+
# @param [LeafNode] leaf
|
154
177
|
#
|
155
178
|
# @return self
|
156
179
|
#
|
157
180
|
def add_leaf(leaf)
|
158
181
|
return if leaf.parent == self
|
159
|
-
if
|
160
|
-
leaf.remove_from_parent
|
161
|
-
end
|
182
|
+
leaf.remove_from_parent if leaf.parent
|
162
183
|
leaf.parent = self
|
163
184
|
if @leaves.length > 0
|
164
185
|
@leaves.last.next = leaf
|
@@ -169,12 +190,13 @@ module TreeRb
|
|
169
190
|
leaf.next = nil
|
170
191
|
leaf.invalidate
|
171
192
|
@leaves << leaf
|
193
|
+
@leaves_and_children << leaf
|
172
194
|
self
|
173
195
|
end
|
174
196
|
|
175
197
|
#
|
176
198
|
# Add a Tree
|
177
|
-
# @param [LeafNode]
|
199
|
+
# @param [LeafNode] tree_node
|
178
200
|
#
|
179
201
|
# @return self
|
180
202
|
#
|
@@ -195,6 +217,7 @@ module TreeRb
|
|
195
217
|
end
|
196
218
|
tree_node.next = nil
|
197
219
|
@children << tree_node
|
220
|
+
@leaves_and_children << tree_node
|
198
221
|
self
|
199
222
|
end
|
200
223
|
|
@@ -228,7 +251,8 @@ module TreeRb
|
|
228
251
|
end
|
229
252
|
|
230
253
|
#
|
231
|
-
#
|
254
|
+
# @param [Visitor] visitor
|
255
|
+
# @return the visitor
|
232
256
|
#
|
233
257
|
def accept(visitor)
|
234
258
|
visitor.enter_node(self)
|
@@ -255,32 +279,16 @@ module TreeRb
|
|
255
279
|
# puts "aaaa \033[7;31;40m ciao \033[0m"
|
256
280
|
|
257
281
|
|
258
|
-
#
|
259
|
-
# check console character encoding
|
260
|
-
# altre variabili LC_CTYPE
|
261
|
-
# LC_ALL
|
262
|
-
# comando locale
|
263
|
-
# puts "enconding: #{ENV['LANG']}"
|
264
|
-
#
|
265
|
-
|
266
|
-
|
267
|
-
# │ (ascii 179)
|
268
|
-
# ├ (ascii 195)
|
269
|
-
# └ (ascii 192)
|
270
|
-
# ─ (ascii 196)
|
271
|
-
|
272
|
-
|
273
|
-
BRANCH = '|-- '
|
274
|
-
LAST_BRANCH = '`-- '
|
275
|
-
CONT_1 = "| "
|
276
|
-
CONT_2 = " "
|
277
|
-
|
278
282
|
def to_str(prefix= "", options = { })
|
279
283
|
#TODO: find a more idiomatic mode to assign an array of options
|
284
|
+
|
280
285
|
tty_color = options[:colorize].nil? ? false : options[:colorize]
|
281
286
|
show_indentation = options[:show_indentation].nil? ? true : options[:show_indentation]
|
282
287
|
str = ""
|
283
288
|
|
289
|
+
prepare_color_map if tty_color
|
290
|
+
prepare_prefix_map(options)
|
291
|
+
|
284
292
|
# print node itself
|
285
293
|
if root?
|
286
294
|
unless options[:only_files]
|
@@ -291,16 +299,16 @@ module TreeRb
|
|
291
299
|
if show_indentation
|
292
300
|
str << prefix
|
293
301
|
if self.next
|
294
|
-
str << BRANCH
|
302
|
+
str << @prefix[:BRANCH]
|
295
303
|
else
|
296
|
-
str << LAST_BRANCH
|
304
|
+
str << @prefix[:LAST_BRANCH]
|
297
305
|
end
|
298
306
|
end
|
299
307
|
|
300
308
|
unless options[:only_files]
|
301
309
|
str << node_content_to_str(content, options)
|
302
310
|
if show_indentation
|
303
|
-
prefix += self.next ? CONT_1 : CONT_2
|
311
|
+
prefix += self.next ? @prefix[:CONT_1] : @prefix[:CONT_2]
|
304
312
|
end
|
305
313
|
end
|
306
314
|
end
|
@@ -311,9 +319,9 @@ module TreeRb
|
|
311
319
|
if show_indentation
|
312
320
|
str << prefix
|
313
321
|
if !leaf.next.nil? or !@children.empty?
|
314
|
-
str << BRANCH
|
322
|
+
str << @prefix[:BRANCH]
|
315
323
|
else
|
316
|
-
str << LAST_BRANCH
|
324
|
+
str << @prefix[:LAST_BRANCH]
|
317
325
|
end
|
318
326
|
end
|
319
327
|
|
@@ -347,12 +355,62 @@ module TreeRb
|
|
347
355
|
|
348
356
|
def leaf_content_to_str(content, options)
|
349
357
|
if options[:colorize]
|
350
|
-
"#{ANSI.green { content.to_str }}\n"
|
358
|
+
# "#{ANSI.green { content.to_str }}\n"
|
359
|
+
color_file(content.to_str)
|
351
360
|
else
|
352
361
|
"#{content.to_str }\n"
|
353
362
|
end
|
354
363
|
end
|
355
364
|
|
365
|
+
def prepare_color_map
|
366
|
+
@fileToColor = { }
|
367
|
+
ENV['LS_COLORS'].split(":").each do |e|
|
368
|
+
k, v = e.split('=')
|
369
|
+
@fileToColor[k] = v
|
370
|
+
end
|
371
|
+
end
|
372
|
+
|
373
|
+
def color_file(filename)
|
374
|
+
k = "*.#{File.extname(filename)}"
|
375
|
+
v = @fileToColor[k]
|
376
|
+
if v
|
377
|
+
attribute, color= v.split(';')
|
378
|
+
"\e[#{attribute}m\e[1;#{color}m #{filename}tr \e[0m\n"
|
379
|
+
else
|
380
|
+
"#{filename}\n"
|
381
|
+
end
|
382
|
+
end
|
383
|
+
|
384
|
+
def prepare_prefix_map(options)
|
385
|
+
#
|
386
|
+
# check console character encoding
|
387
|
+
# altre variabili LC_CTYPE
|
388
|
+
# LC_ALL
|
389
|
+
# comando locale
|
390
|
+
# puts "enconding: #{ENV['LANG']}"
|
391
|
+
#
|
392
|
+
|
393
|
+
|
394
|
+
# │ (ascii 179)
|
395
|
+
# ├ (ascii 195)
|
396
|
+
# └ (ascii 192)
|
397
|
+
# ─ (ascii 196)
|
398
|
+
|
399
|
+
|
400
|
+
@prefix = { }
|
401
|
+
|
402
|
+
if options[:ansi_line_graphics]
|
403
|
+
@prefix[:BRANCH] = '├── '
|
404
|
+
@prefix[:LAST_BRANCH] = '└── '
|
405
|
+
@prefix[:CONT_1] = "│ "
|
406
|
+
@prefix[:CONT_2] = " "
|
407
|
+
else
|
408
|
+
@prefix[:BRANCH] = '|-- '
|
409
|
+
@prefix[:LAST_BRANCH] = '`-- '
|
410
|
+
@prefix[:CONT_1] = "| "
|
411
|
+
@prefix[:CONT_2] = " "
|
412
|
+
end
|
413
|
+
end
|
356
414
|
|
357
415
|
end # end class
|
358
416
|
end # end module TreeRb
|
data/lib/tree_rb/version.rb
CHANGED
@@ -7,16 +7,14 @@ module TreeRb
|
|
7
7
|
class ContentDir
|
8
8
|
def initialize(pathname, options)
|
9
9
|
if options[:show_full_path]
|
10
|
-
|
10
|
+
@contents = pathname
|
11
11
|
else
|
12
|
-
|
12
|
+
@contents = File.basename(pathname)
|
13
13
|
end
|
14
|
-
|
15
|
-
@str = file_name
|
16
14
|
end
|
17
15
|
|
18
16
|
def to_str
|
19
|
-
@
|
17
|
+
@contents
|
20
18
|
end
|
21
19
|
end
|
22
20
|
|
@@ -384,9 +384,9 @@ module TreeRb
|
|
384
384
|
#}
|
385
385
|
#
|
386
386
|
|
387
|
-
|
388
|
-
|
389
|
-
|
387
|
+
#
|
388
|
+
# Build hash with directory structure
|
389
|
+
#
|
390
390
|
class DirectoryToHash2Visitor < BasicTreeNodeVisitor
|
391
391
|
|
392
392
|
attr_reader :root
|
@@ -397,8 +397,8 @@ module TreeRb
|
|
397
397
|
|
398
398
|
def enter_node(pathname)
|
399
399
|
@root = @node if @root.nil?
|
400
|
-
@node = {name: File.basename(pathname), children: []}
|
401
|
-
@stack.last[:children] << @node
|
400
|
+
@node = { name: File.basename(pathname), children: [] }
|
401
|
+
@stack.last[:children] << @node unless @stack.empty?
|
402
402
|
@stack.push(@node)
|
403
403
|
end
|
404
404
|
|
@@ -407,7 +407,11 @@ module TreeRb
|
|
407
407
|
end
|
408
408
|
|
409
409
|
def visit_leaf(pathname)
|
410
|
-
|
410
|
+
begin
|
411
|
+
@node[:children] << { name: File.basename(pathname), size: File.stat(pathname).size }
|
412
|
+
rescue Errno::ENOENT => e
|
413
|
+
$stderr.puts e.to_s
|
414
|
+
end
|
411
415
|
end
|
412
416
|
|
413
417
|
end
|
@@ -3,6 +3,7 @@ module TreeRb
|
|
3
3
|
|
4
4
|
class SqliteDirTreeVisitor < BasicTreeNodeVisitor
|
5
5
|
|
6
|
+
|
6
7
|
def initialize(filename)
|
7
8
|
@db = SQLite3::Database.new(filename)
|
8
9
|
@db.execute("create table files(path varchar(1024), size integer, digest varchar(40))")
|
@@ -24,10 +25,10 @@ module TreeRb
|
|
24
25
|
# sec = Time.now - start
|
25
26
|
# print "#{CR}bytes: #{bytes.to_human} time: #{sec} bytes/sec #{bytes/sec} #{CLEAR}"
|
26
27
|
# end
|
27
|
-
#content = ContentFile.new(pathname, @options)
|
28
|
+
# content = ContentFile.new(pathname, @options)
|
28
29
|
# connect the leaf_node created to the last tree_node on the stack
|
29
|
-
|
30
|
-
#LeafNode.new(content, @stack.last)
|
30
|
+
# nr_files += 1
|
31
|
+
# LeafNode.new(content, @stack.last)
|
31
32
|
end
|
32
33
|
|
33
34
|
def find_duplicates
|
@@ -26,7 +26,8 @@ describe CliTree do
|
|
26
26
|
args << File.join(FIXTURES, "test_dir_1")
|
27
27
|
CliTree.new.parse_args(args)
|
28
28
|
end
|
29
|
-
|
29
|
+
expected = "test_dir_1\n|-- dir.1\n| `-- dir.1.2\n`-- dir.2\n\n4 directories, 0 files\n"
|
30
|
+
captured.out.should == expected
|
30
31
|
captured.out.split("\n").length.should == 6
|
31
32
|
end
|
32
33
|
|
@@ -36,7 +37,8 @@ describe CliTree do
|
|
36
37
|
args << File.join(FIXTURES, "test_dir_1")
|
37
38
|
CliTree.new.parse_args(args)
|
38
39
|
end
|
39
|
-
|
40
|
+
expected = "test_dir_1\n|-- .dir_with_dot\n|-- dir.1\n| `-- dir.1.2\n`-- dir.2\n\n5 directories, 0 files\n"
|
41
|
+
captured.out.should == expected
|
40
42
|
captured.out.split("\n").length.should == 7
|
41
43
|
end
|
42
44
|
|
@@ -47,6 +49,8 @@ describe CliTree do
|
|
47
49
|
CliTree.new.parse_args(args)
|
48
50
|
end
|
49
51
|
# pp captured
|
52
|
+
expected ="test_dir_1\n|-- .dir_with_dot\n| `-- dummy.txt\n|-- dir.1\n| |-- file.1.1\n| `-- dir.1.2\n| `-- file.1.2.1\n`-- dir.2\n `-- file.2.1\n\n5 directories, 4 files\n"
|
53
|
+
captured.out.should == expected
|
50
54
|
captured.out.split("\n").length.should == 11
|
51
55
|
end
|
52
56
|
|
@@ -57,16 +61,34 @@ describe CliTree do
|
|
57
61
|
CliTree.new.parse_args(args)
|
58
62
|
end
|
59
63
|
# puts captured
|
64
|
+
expected ="test_dir_1\n|-- dir.1\n| |-- file.1.1\n| `-- dir.1.2\n| `-- file.1.2.1\n`-- dir.2\n `-- file.2.1\n\n4 directories, 3 files\n"
|
65
|
+
captured.out.should == expected
|
60
66
|
captured.out.split("\n").length.should == 9
|
61
67
|
end
|
62
68
|
|
69
|
+
it "should accepts -A switch (ascii line graphics)" do
|
70
|
+
captured = capture_output do
|
71
|
+
args = %w{-A}
|
72
|
+
args << File.join(FIXTURES, "test_dir_1")
|
73
|
+
CliTree.new.parse_args(args)
|
74
|
+
end
|
75
|
+
# puts captured
|
76
|
+
expected ="test_dir_1\n├── dir.1\n│ ├── file.1.1\n│ └── dir.1.2\n│ └── file.1.2.1\n└── dir.2\n └── file.2.1\n\n4 directories, 3 files\n"
|
77
|
+
captured.out.should == expected
|
78
|
+
end
|
79
|
+
|
63
80
|
it "should show tree with inaccessible directories" do
|
64
81
|
captured = capture_output do
|
65
82
|
args = []
|
66
83
|
args << File.join(FIXTURES, "test_dir_3_with_error")
|
67
84
|
CliTree.new.parse_args(args)
|
68
85
|
end
|
69
|
-
#puts captured
|
86
|
+
# puts captured
|
87
|
+
|
88
|
+
expected_out="test_dir_3_with_error\n`-- accessible_dir\n\n2 directories, 0 files\n"
|
89
|
+
expected_err="Permission denied - /home/gf/GioPrj.home/tree.rb/spec/fixtures/test_dir_3_with_error/no_accessible_dir\n"
|
90
|
+
captured.out.should == expected_out
|
91
|
+
captured.err.should == expected_err
|
70
92
|
captured.err.should_not be_empty
|
71
93
|
captured.out.split("\n").length.should == 4
|
72
94
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tree.rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.8
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-09-
|
12
|
+
date: 2012-09-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: json
|
@@ -144,6 +144,7 @@ files:
|
|
144
144
|
- tree.rb.gemspec
|
145
145
|
- .gemtest
|
146
146
|
- ext/mkrf_conf.rb
|
147
|
+
- lib/colors.rb
|
147
148
|
- lib/treevisitor_cli.rb
|
148
149
|
- lib/tree_visitor.rb
|
149
150
|
- lib/tree_rb/cli/cli_json.rb
|
@@ -186,6 +187,7 @@ files:
|
|
186
187
|
- examples/d3_treemap/prova.html
|
187
188
|
- examples/d3_treemap/d3_tree_rb_output.json
|
188
189
|
- examples/d3_treemap/d3.layout.js
|
190
|
+
- examples/prova1/prova1.html
|
189
191
|
- examples/protovis/treevisitor.png
|
190
192
|
- examples/protovis/protovis-r3.2.js
|
191
193
|
- examples/protovis/index.html
|
@@ -233,18 +235,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
233
235
|
- - ! '>='
|
234
236
|
- !ruby/object:Gem::Version
|
235
237
|
version: '0'
|
236
|
-
segments:
|
237
|
-
- 0
|
238
|
-
hash: 3743714857926214739
|
239
238
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
240
239
|
none: false
|
241
240
|
requirements:
|
242
241
|
- - ! '>='
|
243
242
|
- !ruby/object:Gem::Version
|
244
243
|
version: '0'
|
245
|
-
segments:
|
246
|
-
- 0
|
247
|
-
hash: 3743714857926214739
|
248
244
|
requirements: []
|
249
245
|
rubyforge_project:
|
250
246
|
rubygems_version: 1.8.24
|