comp_tree 0.7.3 → 0.7.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGES.rdoc +4 -0
- data/README.rdoc +1 -2
- data/Rakefile +7 -2
- data/devel/jumpstart/jumpstart.rb +606 -0
- data/devel/jumpstart.rb +1 -594
- data/lib/comp_tree.rb +1 -1
- metadata +15 -2
data/CHANGES.rdoc
CHANGED
data/README.rdoc
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
|
2
2
|
= CompTree
|
3
3
|
|
4
|
-
* http://comptree.rubyforge.org
|
5
|
-
|
6
4
|
== Summary
|
7
5
|
|
8
6
|
Automatic parallelism and lazy evaluation via pure functional
|
@@ -94,6 +92,7 @@ depends on that state</em>. This is the principle under which
|
|
94
92
|
|
95
93
|
== Links
|
96
94
|
|
95
|
+
* Documentation: http://comptree.rubyforge.org
|
97
96
|
* Download: http://rubyforge.org/frs/?group_id=6917
|
98
97
|
* Rubyforge home: http://rubyforge.org/projects/comptree
|
99
98
|
* Repository: http://github.com/quix/comp_tree
|
data/Rakefile
CHANGED
@@ -2,7 +2,12 @@ $LOAD_PATH.unshift 'devel'
|
|
2
2
|
|
3
3
|
require 'jumpstart'
|
4
4
|
|
5
|
-
Jumpstart.new
|
6
|
-
s.developer
|
5
|
+
Jumpstart.new "comp_tree" do |s|
|
6
|
+
s.developer "James M. Lawrence", "quixoticsycophant@gmail.com"
|
7
7
|
s.rubyforge_user = "quix"
|
8
|
+
s.rdoc_files = %w[
|
9
|
+
lib/comp_tree.rb
|
10
|
+
lib/comp_tree/driver.rb
|
11
|
+
lib/comp_tree/error.rb
|
12
|
+
]
|
8
13
|
end
|
@@ -0,0 +1,606 @@
|
|
1
|
+
$LOAD_PATH.unshift File.dirname(__FILE__) + '/../../lib'
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'ostruct'
|
5
|
+
require 'rbconfig'
|
6
|
+
|
7
|
+
require 'rake/gempackagetask'
|
8
|
+
require 'rake/contrib/sshpublisher'
|
9
|
+
require 'rake/clean'
|
10
|
+
|
11
|
+
require 'rdoc/rdoc'
|
12
|
+
|
13
|
+
require 'jumpstart/ruby'
|
14
|
+
require 'jumpstart/lazy_attribute'
|
15
|
+
require 'jumpstart/simple_installer'
|
16
|
+
|
17
|
+
class Jumpstart
|
18
|
+
include LazyAttribute
|
19
|
+
|
20
|
+
def not_provided(param)
|
21
|
+
raise "#{self.class}##{param} not provided"
|
22
|
+
end
|
23
|
+
|
24
|
+
def must_define(*params)
|
25
|
+
params.each { |param|
|
26
|
+
attribute param do
|
27
|
+
not_provided(param)
|
28
|
+
end
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
def initialize(project_name)
|
33
|
+
must_define :authors, :email
|
34
|
+
|
35
|
+
attribute :name do
|
36
|
+
project_name
|
37
|
+
end
|
38
|
+
|
39
|
+
attribute :version do
|
40
|
+
str = "VERSION"
|
41
|
+
begin
|
42
|
+
require name
|
43
|
+
if mod = Object.const_get(to_camel_case(name))
|
44
|
+
if mod.constants.include? str
|
45
|
+
mod.const_get str
|
46
|
+
else
|
47
|
+
raise
|
48
|
+
end
|
49
|
+
else
|
50
|
+
raise
|
51
|
+
end
|
52
|
+
rescue Exception
|
53
|
+
"0.0.0"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
attribute :rubyforge_name do
|
58
|
+
name.gsub('_', '')
|
59
|
+
end
|
60
|
+
|
61
|
+
attribute :rubyforge_user do
|
62
|
+
email.first[%r!^.*(?=@)!]
|
63
|
+
end
|
64
|
+
|
65
|
+
attribute :readme_file do
|
66
|
+
"README.rdoc"
|
67
|
+
end
|
68
|
+
|
69
|
+
attribute :history_file do
|
70
|
+
"CHANGES.rdoc"
|
71
|
+
end
|
72
|
+
|
73
|
+
attribute :doc_dir do
|
74
|
+
"documentation"
|
75
|
+
end
|
76
|
+
|
77
|
+
attribute :spec_files do
|
78
|
+
Dir["spec/*_{spec,example}.rb"]
|
79
|
+
end
|
80
|
+
|
81
|
+
attribute :test_files do
|
82
|
+
Dir["test/test_*.rb"]
|
83
|
+
end
|
84
|
+
|
85
|
+
attribute :rcov_dir do
|
86
|
+
"coverage"
|
87
|
+
end
|
88
|
+
|
89
|
+
attribute :spec_output do
|
90
|
+
"spec.html"
|
91
|
+
end
|
92
|
+
|
93
|
+
%w[gem tgz].map { |ext|
|
94
|
+
attribute ext.to_sym do
|
95
|
+
"pkg/#{name}-#{version}.#{ext}"
|
96
|
+
end
|
97
|
+
}
|
98
|
+
|
99
|
+
attribute :rcov_options do
|
100
|
+
# workaround for the default rspec task
|
101
|
+
Dir["*"].select { |f| File.directory? f }.inject(Array.new) { |acc, dir|
|
102
|
+
if dir == "lib"
|
103
|
+
acc
|
104
|
+
else
|
105
|
+
acc + ["--exclude", dir + "/"]
|
106
|
+
end
|
107
|
+
} + ["--text-report"]
|
108
|
+
end
|
109
|
+
|
110
|
+
attribute :readme_file do
|
111
|
+
"README.rdoc"
|
112
|
+
end
|
113
|
+
|
114
|
+
attribute :files do
|
115
|
+
if File.exist?(manifest = "Manifest.txt")
|
116
|
+
File.read(manifest).split("\n")
|
117
|
+
elsif File.directory? ".git"
|
118
|
+
`git ls-files`.split("\n")
|
119
|
+
elsif File.directory? ".svn"
|
120
|
+
`svn status --verbose`.split("\n").map { |t|
|
121
|
+
t.split[3]
|
122
|
+
}.select { |t|
|
123
|
+
t and File.file?(t)
|
124
|
+
}
|
125
|
+
else
|
126
|
+
[]
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
attribute :rdoc_files do
|
131
|
+
Dir["lib/**/*.rb"]
|
132
|
+
end
|
133
|
+
|
134
|
+
attribute :extra_rdoc_files do
|
135
|
+
[readme_file]
|
136
|
+
end
|
137
|
+
|
138
|
+
attribute :rdoc_options do
|
139
|
+
[
|
140
|
+
"--main",
|
141
|
+
readme_file,
|
142
|
+
"--title",
|
143
|
+
"#{name}: #{summary}",
|
144
|
+
] + (files - rdoc_files).inject(Array.new) { |acc, file|
|
145
|
+
acc + ["--exclude", file]
|
146
|
+
}
|
147
|
+
end
|
148
|
+
|
149
|
+
attribute :browser do
|
150
|
+
if Config::CONFIG["host"] =~ %r!darwin!
|
151
|
+
app = %w[Firefox Safari].map { |t|
|
152
|
+
"/Applications/#{t}.app"
|
153
|
+
}.select { |t|
|
154
|
+
File.exist? t
|
155
|
+
}.first
|
156
|
+
if app
|
157
|
+
["open", app]
|
158
|
+
else
|
159
|
+
not_provided(:browser)
|
160
|
+
end
|
161
|
+
else
|
162
|
+
"firefox"
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
attribute :gemspec do
|
167
|
+
Gem::Specification.new { |g|
|
168
|
+
g.has_rdoc = true
|
169
|
+
%w[
|
170
|
+
name
|
171
|
+
authors
|
172
|
+
email
|
173
|
+
summary
|
174
|
+
version
|
175
|
+
description
|
176
|
+
files
|
177
|
+
extra_rdoc_files
|
178
|
+
rdoc_options
|
179
|
+
].each { |param|
|
180
|
+
value = send(param) and (
|
181
|
+
g.send("#{param}=", value)
|
182
|
+
)
|
183
|
+
}
|
184
|
+
|
185
|
+
if rubyforge_name
|
186
|
+
g.rubyforge_project = rubyforge_name
|
187
|
+
end
|
188
|
+
|
189
|
+
if url
|
190
|
+
g.homepage = url
|
191
|
+
end
|
192
|
+
}
|
193
|
+
end
|
194
|
+
|
195
|
+
attribute :readme_contents do
|
196
|
+
File.read(readme_file)
|
197
|
+
end
|
198
|
+
|
199
|
+
attribute :sections do
|
200
|
+
begin
|
201
|
+
pairs = Hash[*readme_contents.split(%r!^== (\w+).*?$!)[1..-1]].map {
|
202
|
+
|section, contents|
|
203
|
+
[section.downcase, contents.strip]
|
204
|
+
}
|
205
|
+
Hash[*pairs.flatten]
|
206
|
+
rescue
|
207
|
+
nil
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
attribute :description_section do
|
212
|
+
"description"
|
213
|
+
end
|
214
|
+
|
215
|
+
attribute :summary_section do
|
216
|
+
"summary"
|
217
|
+
end
|
218
|
+
|
219
|
+
attribute :description_sentences do
|
220
|
+
1
|
221
|
+
end
|
222
|
+
|
223
|
+
attribute :summary_sentences do
|
224
|
+
1
|
225
|
+
end
|
226
|
+
|
227
|
+
[:summary, :description].each { |section|
|
228
|
+
attribute section do
|
229
|
+
begin
|
230
|
+
sections[send("#{section}_section")].
|
231
|
+
gsub("\n", " ").
|
232
|
+
split(%r!\.\s*!m).
|
233
|
+
first(send("#{section}_sentences")).
|
234
|
+
join(". ") << "."
|
235
|
+
rescue
|
236
|
+
if section == :description
|
237
|
+
summary
|
238
|
+
end
|
239
|
+
end
|
240
|
+
end
|
241
|
+
}
|
242
|
+
|
243
|
+
attribute :url do
|
244
|
+
begin
|
245
|
+
readme_contents.match(%r!^\*.*?(http://\S+)!)[1]
|
246
|
+
rescue
|
247
|
+
"http://#{rubyforge_name}.rubyforge.org"
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
yield self
|
252
|
+
|
253
|
+
self.class.instance_methods(false).select { |t|
|
254
|
+
t.to_s =~ %r!\Adefine_!
|
255
|
+
}.each { |method_name|
|
256
|
+
send(method_name)
|
257
|
+
}
|
258
|
+
end
|
259
|
+
|
260
|
+
def developer(name, email)
|
261
|
+
self.authors rescue self.authors = []
|
262
|
+
self.email rescue self.email = []
|
263
|
+
self.authors << name
|
264
|
+
self.email << email
|
265
|
+
end
|
266
|
+
|
267
|
+
def author=(name)
|
268
|
+
self.authors = [name]
|
269
|
+
end
|
270
|
+
|
271
|
+
def define_clean
|
272
|
+
task :clean do
|
273
|
+
Rake::Task[:clobber].invoke
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
def define_package
|
278
|
+
task :package => :clean
|
279
|
+
Rake::GemPackageTask.new(gemspec) { |t|
|
280
|
+
t.need_tar = true
|
281
|
+
}
|
282
|
+
end
|
283
|
+
|
284
|
+
def define_spec
|
285
|
+
unless spec_files.empty?
|
286
|
+
require 'spec/rake/spectask'
|
287
|
+
|
288
|
+
desc "run specs"
|
289
|
+
Spec::Rake::SpecTask.new('spec') do |t|
|
290
|
+
t.spec_files = spec_files
|
291
|
+
end
|
292
|
+
|
293
|
+
desc "run specs with text output"
|
294
|
+
Spec::Rake::SpecTask.new('text_spec') do |t|
|
295
|
+
t.spec_files = spec_files
|
296
|
+
t.spec_opts = ['-fs']
|
297
|
+
end
|
298
|
+
|
299
|
+
desc "run specs with html output"
|
300
|
+
Spec::Rake::SpecTask.new('full_spec') do |t|
|
301
|
+
t.spec_files = spec_files
|
302
|
+
t.rcov = true
|
303
|
+
t.rcov_opts = rcov_options
|
304
|
+
t.spec_opts = ["-fh:#{spec_output}"]
|
305
|
+
end
|
306
|
+
|
307
|
+
desc "run full_spec then open browser"
|
308
|
+
task :show_spec => :full_spec do
|
309
|
+
open_browser(spec_output, rcov_dir + "/index.html")
|
310
|
+
end
|
311
|
+
|
312
|
+
desc "run specs individually"
|
313
|
+
task :spec_deps do
|
314
|
+
run_ruby_on_each(*spec_files)
|
315
|
+
end
|
316
|
+
|
317
|
+
task :prerelease => [:spec, :spec_deps]
|
318
|
+
task :default => :spec
|
319
|
+
|
320
|
+
CLEAN.include spec_output
|
321
|
+
end
|
322
|
+
end
|
323
|
+
|
324
|
+
def define_test
|
325
|
+
unless test_files.empty?
|
326
|
+
desc "run tests"
|
327
|
+
task :test do
|
328
|
+
test_files.each { |file|
|
329
|
+
require file
|
330
|
+
}
|
331
|
+
end
|
332
|
+
|
333
|
+
desc "run tests with rcov"
|
334
|
+
task :full_test do
|
335
|
+
verbose(false) {
|
336
|
+
sh("rcov", "-o", rcov_dir, "--text-report",
|
337
|
+
*(test_files + rcov_options)
|
338
|
+
)
|
339
|
+
}
|
340
|
+
end
|
341
|
+
|
342
|
+
desc "run full_test then open browser"
|
343
|
+
task :show_test => :full_test do
|
344
|
+
open_browser(rcov_dir + "/index.html")
|
345
|
+
end
|
346
|
+
|
347
|
+
desc "run tests individually"
|
348
|
+
task :test_deps do
|
349
|
+
run_ruby_on_each(*test_files)
|
350
|
+
end
|
351
|
+
|
352
|
+
task :prerelease => [:test, :test_deps]
|
353
|
+
task :default => :test
|
354
|
+
|
355
|
+
CLEAN.include rcov_dir
|
356
|
+
end
|
357
|
+
end
|
358
|
+
|
359
|
+
def define_doc
|
360
|
+
desc "run rdoc"
|
361
|
+
task :doc => :clean_doc do
|
362
|
+
args = (
|
363
|
+
gemspec.rdoc_options +
|
364
|
+
gemspec.require_paths.clone +
|
365
|
+
gemspec.extra_rdoc_files +
|
366
|
+
["-o", doc_dir]
|
367
|
+
).flatten.map { |t| t.to_s }
|
368
|
+
RDoc::RDoc.new.document args
|
369
|
+
end
|
370
|
+
|
371
|
+
task :clean_doc do
|
372
|
+
# normally rm_rf, but mimic rake/clean output
|
373
|
+
rm_r(doc_dir) rescue nil
|
374
|
+
end
|
375
|
+
|
376
|
+
desc "run rdoc then open browser"
|
377
|
+
task :show_doc => :doc do
|
378
|
+
open_browser(doc_dir + "/index.html")
|
379
|
+
end
|
380
|
+
|
381
|
+
task :rdoc => :doc
|
382
|
+
task :clean => :clean_doc
|
383
|
+
end
|
384
|
+
|
385
|
+
def define_publish
|
386
|
+
desc "upload docs"
|
387
|
+
task :publish => [:clean_doc, :doc] do
|
388
|
+
Rake::SshDirPublisher.new(
|
389
|
+
"#{rubyforge_user}@rubyforge.org",
|
390
|
+
"/var/www/gforge-projects/#{rubyforge_name}",
|
391
|
+
doc_dir
|
392
|
+
).upload
|
393
|
+
end
|
394
|
+
end
|
395
|
+
|
396
|
+
def define_install
|
397
|
+
desc "direct install (no gem)"
|
398
|
+
task :install do
|
399
|
+
SimpleInstaller.new.run([])
|
400
|
+
end
|
401
|
+
|
402
|
+
desc "direct uninstall (no gem)"
|
403
|
+
task :uninstall do
|
404
|
+
SimpleInstaller.new.run(["--uninstall"])
|
405
|
+
end
|
406
|
+
end
|
407
|
+
|
408
|
+
def define_debug
|
409
|
+
runner = Class.new do
|
410
|
+
def comment_src_dst(on)
|
411
|
+
on ? ["", "#"] : ["#", ""]
|
412
|
+
end
|
413
|
+
|
414
|
+
def comment_regions(on, contents, start)
|
415
|
+
src, dst = comment_src_dst(on)
|
416
|
+
contents.gsub(%r!^(\s+)#{src}#{start}.*?^\1#{src}(\}|end)!m) { |chunk|
|
417
|
+
indent = $1
|
418
|
+
chunk.gsub(%r!^#{indent}#{src}!, "#{indent}#{dst}")
|
419
|
+
}
|
420
|
+
end
|
421
|
+
|
422
|
+
def comment_lines(on, contents, start)
|
423
|
+
src, dst = comment_src_dst(on)
|
424
|
+
contents.gsub(%r!^(\s*)#{src}#{start}!) {
|
425
|
+
$1 + dst + start
|
426
|
+
}
|
427
|
+
end
|
428
|
+
|
429
|
+
def debug_info(enable)
|
430
|
+
Find.find("lib", "test") { |path|
|
431
|
+
if path =~ %r!\.rb\Z!
|
432
|
+
Jumpstart.replace_file(path) { |contents|
|
433
|
+
result = comment_regions(!enable, contents, "debug")
|
434
|
+
comment_lines(!enable, result, "trace")
|
435
|
+
}
|
436
|
+
end
|
437
|
+
}
|
438
|
+
end
|
439
|
+
end
|
440
|
+
|
441
|
+
desc "enable debug and trace calls"
|
442
|
+
task :debug_on do
|
443
|
+
runner.new.debug_info(true)
|
444
|
+
end
|
445
|
+
|
446
|
+
desc "disable debug and trace calls"
|
447
|
+
task :debug_off do
|
448
|
+
runner.new.debug_info(false)
|
449
|
+
end
|
450
|
+
end
|
451
|
+
|
452
|
+
def define_columns
|
453
|
+
desc "check for columns > 80"
|
454
|
+
task :check_columns do
|
455
|
+
Dir["**/*.rb"].each { |file|
|
456
|
+
File.read(file).scan(%r!^.{81}!) { |match|
|
457
|
+
unless match =~ %r!http://!
|
458
|
+
raise "#{file} greater than 80 columns: #{match}"
|
459
|
+
end
|
460
|
+
}
|
461
|
+
}
|
462
|
+
end
|
463
|
+
task :prerelease => :check_columns
|
464
|
+
end
|
465
|
+
|
466
|
+
def define_comments
|
467
|
+
task :comments do
|
468
|
+
file = "comments.txt"
|
469
|
+
write_file(file) {
|
470
|
+
Array.new.tap { |result|
|
471
|
+
(["Rakefile"] + Dir["**/*.{rb,rake}"]).each { |file|
|
472
|
+
File.read(file).scan(%r!\#[^\{].*$!) { |match|
|
473
|
+
result << match
|
474
|
+
}
|
475
|
+
}
|
476
|
+
}.join("\n")
|
477
|
+
}
|
478
|
+
CLEAN.include file
|
479
|
+
end
|
480
|
+
end
|
481
|
+
|
482
|
+
def define_check_directory
|
483
|
+
task :check_directory do
|
484
|
+
unless `git status` =~ %r!nothing to commit \(working directory clean\)!
|
485
|
+
raise "Directory not clean"
|
486
|
+
end
|
487
|
+
end
|
488
|
+
end
|
489
|
+
|
490
|
+
def define_ping
|
491
|
+
task :ping do
|
492
|
+
%w[github.com rubyforge.org].each { |server|
|
493
|
+
cmd = "ping " + (
|
494
|
+
if Config::CONFIG["host"] =~ %r!darwin!
|
495
|
+
"-c2 #{server}"
|
496
|
+
else
|
497
|
+
"#{server} 2 2"
|
498
|
+
end
|
499
|
+
)
|
500
|
+
unless `#{cmd}` =~ %r!0% packet loss!
|
501
|
+
raise "No ping for #{server}"
|
502
|
+
end
|
503
|
+
}
|
504
|
+
end
|
505
|
+
end
|
506
|
+
|
507
|
+
def define_update_jumpstart
|
508
|
+
url = ENV["RUBY_JUMPSTART"] || "git://github.com/quix/jumpstart.git"
|
509
|
+
task :update_jumpstart do
|
510
|
+
Dir.chdir("devel") {
|
511
|
+
rm_rf "jumpstart"
|
512
|
+
git "clone", url
|
513
|
+
rm_rf "jumpstart/.git"
|
514
|
+
git "commit", "jumpstart", "-m", "update jumpstart"
|
515
|
+
}
|
516
|
+
end
|
517
|
+
end
|
518
|
+
|
519
|
+
def git(*args)
|
520
|
+
sh("git", *args)
|
521
|
+
end
|
522
|
+
|
523
|
+
def rubyforge(command, file)
|
524
|
+
sh(
|
525
|
+
"rubyforge",
|
526
|
+
command,
|
527
|
+
rubyforge_name,
|
528
|
+
rubyforge_name,
|
529
|
+
version.to_s,
|
530
|
+
file
|
531
|
+
)
|
532
|
+
end
|
533
|
+
|
534
|
+
def define_release
|
535
|
+
task :prerelease => [:clean, :check_directory, :ping]
|
536
|
+
|
537
|
+
task :finish_release do
|
538
|
+
gem_md5, tgz_md5 = [gem, tgz].map { |file|
|
539
|
+
"#{file}.md5".tap { |md5|
|
540
|
+
sh("md5sum #{file} > #{md5}")
|
541
|
+
}
|
542
|
+
}
|
543
|
+
|
544
|
+
rubyforge("add_release", gem)
|
545
|
+
[gem_md5, tgz, tgz_md5].each { |file|
|
546
|
+
rubyforge("add_file", file)
|
547
|
+
}
|
548
|
+
|
549
|
+
git("tag", "#{name}-" + version.to_s)
|
550
|
+
git(*%w(push --tags origin master))
|
551
|
+
end
|
552
|
+
|
553
|
+
task :release => [:prerelease, :package, :publish, :finish_release]
|
554
|
+
end
|
555
|
+
|
556
|
+
def define_debug_gem
|
557
|
+
task :debug_gem do
|
558
|
+
puts gemspec.to_ruby
|
559
|
+
end
|
560
|
+
end
|
561
|
+
|
562
|
+
def open_browser(*files)
|
563
|
+
sh(*([browser].flatten + files))
|
564
|
+
end
|
565
|
+
|
566
|
+
def write_file(file)
|
567
|
+
yield.tap { |contents|
|
568
|
+
File.open(file, "wb") { |out|
|
569
|
+
out.print(contents)
|
570
|
+
}
|
571
|
+
}
|
572
|
+
end
|
573
|
+
|
574
|
+
def run_ruby_on_each(*files)
|
575
|
+
files.each { |file|
|
576
|
+
Ruby.run_or_raise("-w", file)
|
577
|
+
}
|
578
|
+
end
|
579
|
+
|
580
|
+
def to_camel_case(str)
|
581
|
+
str.split('_').map { |t| t.capitalize }.join
|
582
|
+
end
|
583
|
+
|
584
|
+
class << self
|
585
|
+
def replace_file(file)
|
586
|
+
old_contents = File.read(file)
|
587
|
+
yield(old_contents).tap { |new_contents|
|
588
|
+
if old_contents != new_contents
|
589
|
+
File.open(file, "wb") { |output|
|
590
|
+
output.print(new_contents)
|
591
|
+
}
|
592
|
+
end
|
593
|
+
}
|
594
|
+
end
|
595
|
+
end
|
596
|
+
end
|
597
|
+
|
598
|
+
unless respond_to? :tap
|
599
|
+
class Object
|
600
|
+
def tap
|
601
|
+
yield self
|
602
|
+
self
|
603
|
+
end
|
604
|
+
end
|
605
|
+
end
|
606
|
+
|
data/devel/jumpstart.rb
CHANGED
@@ -1,594 +1 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require 'rubygems'
|
4
|
-
require 'ostruct'
|
5
|
-
require 'rbconfig'
|
6
|
-
|
7
|
-
require 'rake/gempackagetask'
|
8
|
-
require 'rake/contrib/sshpublisher'
|
9
|
-
require 'rake/clean'
|
10
|
-
|
11
|
-
require 'rdoc/rdoc'
|
12
|
-
|
13
|
-
require 'jumpstart/ruby'
|
14
|
-
require 'jumpstart/lazy_attribute'
|
15
|
-
require 'jumpstart/simple_installer'
|
16
|
-
|
17
|
-
class Jumpstart
|
18
|
-
include LazyAttribute
|
19
|
-
|
20
|
-
def not_provided(param)
|
21
|
-
raise "#{self.class}##{param} not provided"
|
22
|
-
end
|
23
|
-
|
24
|
-
def must_define(*params)
|
25
|
-
params.each { |param|
|
26
|
-
attribute param do
|
27
|
-
not_provided(param)
|
28
|
-
end
|
29
|
-
}
|
30
|
-
end
|
31
|
-
|
32
|
-
def initialize(project_name)
|
33
|
-
must_define :authors, :email
|
34
|
-
|
35
|
-
attribute :name do
|
36
|
-
project_name
|
37
|
-
end
|
38
|
-
|
39
|
-
attribute :version do
|
40
|
-
str = "VERSION"
|
41
|
-
begin
|
42
|
-
require name
|
43
|
-
if mod = Object.const_get(to_camel_case(name))
|
44
|
-
if mod.constants.include? str
|
45
|
-
mod.const_get str
|
46
|
-
else
|
47
|
-
raise
|
48
|
-
end
|
49
|
-
else
|
50
|
-
raise
|
51
|
-
end
|
52
|
-
rescue Exception
|
53
|
-
"0.0.0"
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
attribute :rubyforge_name do
|
58
|
-
name.gsub('_', '')
|
59
|
-
end
|
60
|
-
|
61
|
-
attribute :rubyforge_user do
|
62
|
-
email.first[%r!^.*(?=@)!]
|
63
|
-
end
|
64
|
-
|
65
|
-
attribute :readme_file do
|
66
|
-
"README.rdoc"
|
67
|
-
end
|
68
|
-
|
69
|
-
attribute :history_file do
|
70
|
-
"CHANGES.rdoc"
|
71
|
-
end
|
72
|
-
|
73
|
-
attribute :doc_dir do
|
74
|
-
"documentation"
|
75
|
-
end
|
76
|
-
|
77
|
-
attribute :spec_files do
|
78
|
-
Dir["spec/*_{spec,example}.rb"]
|
79
|
-
end
|
80
|
-
|
81
|
-
attribute :test_files do
|
82
|
-
Dir["test/test_*.rb"]
|
83
|
-
end
|
84
|
-
|
85
|
-
attribute :rcov_dir do
|
86
|
-
"coverage"
|
87
|
-
end
|
88
|
-
|
89
|
-
attribute :spec_output do
|
90
|
-
"spec.html"
|
91
|
-
end
|
92
|
-
|
93
|
-
%w[gem tgz].map { |ext|
|
94
|
-
attribute ext.to_sym do
|
95
|
-
"pkg/#{name}-#{version}.#{ext}"
|
96
|
-
end
|
97
|
-
}
|
98
|
-
|
99
|
-
attribute :rcov_options do
|
100
|
-
# workaround for the default rspec task
|
101
|
-
Dir["*"].select { |f| File.directory? f }.inject(Array.new) { |acc, dir|
|
102
|
-
if dir == "lib"
|
103
|
-
acc
|
104
|
-
else
|
105
|
-
acc + ["--exclude", dir + "/"]
|
106
|
-
end
|
107
|
-
} + ["--text-report"]
|
108
|
-
end
|
109
|
-
|
110
|
-
attribute :readme_file do
|
111
|
-
"README.rdoc"
|
112
|
-
end
|
113
|
-
|
114
|
-
attribute :files do
|
115
|
-
if File.exist?(manifest = "Manifest.txt")
|
116
|
-
File.read(manifest).split("\n")
|
117
|
-
elsif File.directory? ".git"
|
118
|
-
`git ls-files`.split("\n")
|
119
|
-
elsif File.directory? ".svn"
|
120
|
-
`svn status --verbose`.split("\n").map { |t|
|
121
|
-
t.split[3]
|
122
|
-
}.select { |t|
|
123
|
-
t and File.file?(t)
|
124
|
-
}
|
125
|
-
else
|
126
|
-
[]
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
attribute :rdoc_files do
|
131
|
-
Dir["lib/**/*.rb"]
|
132
|
-
end
|
133
|
-
|
134
|
-
attribute :extra_rdoc_files do
|
135
|
-
[readme_file]
|
136
|
-
end
|
137
|
-
|
138
|
-
attribute :rdoc_options do
|
139
|
-
[
|
140
|
-
"--main",
|
141
|
-
readme_file,
|
142
|
-
"--title",
|
143
|
-
"#{name}: #{summary}",
|
144
|
-
] + (files - rdoc_files).inject(Array.new) { |acc, file|
|
145
|
-
acc + ["--exclude", file]
|
146
|
-
}
|
147
|
-
end
|
148
|
-
|
149
|
-
attribute :browser do
|
150
|
-
if Config::CONFIG["host"] =~ %r!darwin!
|
151
|
-
app = %w[Firefox Safari].map { |t|
|
152
|
-
"/Applications/#{t}.app"
|
153
|
-
}.select { |t|
|
154
|
-
File.exist? t
|
155
|
-
}.first
|
156
|
-
if app
|
157
|
-
["open", app]
|
158
|
-
else
|
159
|
-
not_provided(:browser)
|
160
|
-
end
|
161
|
-
else
|
162
|
-
"firefox"
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
|
-
attribute :gemspec do
|
167
|
-
Gem::Specification.new { |g|
|
168
|
-
g.has_rdoc = true
|
169
|
-
%w[
|
170
|
-
name
|
171
|
-
authors
|
172
|
-
email
|
173
|
-
summary
|
174
|
-
version
|
175
|
-
description
|
176
|
-
files
|
177
|
-
extra_rdoc_files
|
178
|
-
rdoc_options
|
179
|
-
].each { |param|
|
180
|
-
value = send(param) and (
|
181
|
-
g.send("#{param}=", value)
|
182
|
-
)
|
183
|
-
}
|
184
|
-
|
185
|
-
if rubyforge_name
|
186
|
-
g.rubyforge_project = rubyforge_name
|
187
|
-
end
|
188
|
-
|
189
|
-
if url
|
190
|
-
g.homepage = url
|
191
|
-
end
|
192
|
-
}
|
193
|
-
end
|
194
|
-
|
195
|
-
attribute :readme_contents do
|
196
|
-
File.read(readme_file)
|
197
|
-
end
|
198
|
-
|
199
|
-
attribute :sections do
|
200
|
-
begin
|
201
|
-
pairs = Hash[*readme_contents.split(%r!^== (\w+).*?$!)[1..-1]].map {
|
202
|
-
|section, contents|
|
203
|
-
[section.downcase, contents.strip]
|
204
|
-
}
|
205
|
-
Hash[*pairs.flatten]
|
206
|
-
rescue
|
207
|
-
nil
|
208
|
-
end
|
209
|
-
end
|
210
|
-
|
211
|
-
attribute :description_section do
|
212
|
-
"description"
|
213
|
-
end
|
214
|
-
|
215
|
-
attribute :summary_section do
|
216
|
-
"summary"
|
217
|
-
end
|
218
|
-
|
219
|
-
attribute :description_sentences do
|
220
|
-
1
|
221
|
-
end
|
222
|
-
|
223
|
-
attribute :summary_sentences do
|
224
|
-
1
|
225
|
-
end
|
226
|
-
|
227
|
-
[:summary, :description].each { |section|
|
228
|
-
attribute section do
|
229
|
-
begin
|
230
|
-
sections[send("#{section}_section")].
|
231
|
-
gsub("\n", " ").
|
232
|
-
split(%r!\.\s*!m).
|
233
|
-
first(send("#{section}_sentences")).
|
234
|
-
join(". ") << "."
|
235
|
-
rescue
|
236
|
-
if section == :description
|
237
|
-
summary
|
238
|
-
end
|
239
|
-
end
|
240
|
-
end
|
241
|
-
}
|
242
|
-
|
243
|
-
attribute :url do
|
244
|
-
begin
|
245
|
-
readme_contents.match(%r!^\* (\S+)!)[1]
|
246
|
-
rescue
|
247
|
-
"http://#{rubyforge_name}.rubyforge.org"
|
248
|
-
end
|
249
|
-
end
|
250
|
-
|
251
|
-
yield self
|
252
|
-
|
253
|
-
self.class.instance_methods(false).select { |t|
|
254
|
-
t.to_s =~ %r!\Adefine_!
|
255
|
-
}.each { |method_name|
|
256
|
-
send(method_name)
|
257
|
-
}
|
258
|
-
end
|
259
|
-
|
260
|
-
def developer(name, email)
|
261
|
-
self.authors rescue self.authors = []
|
262
|
-
self.email rescue self.email = []
|
263
|
-
self.authors << name
|
264
|
-
self.email << email
|
265
|
-
end
|
266
|
-
|
267
|
-
def author=(name)
|
268
|
-
self.authors = [name]
|
269
|
-
end
|
270
|
-
|
271
|
-
def define_clean
|
272
|
-
task :clean do
|
273
|
-
Rake::Task[:clobber].invoke
|
274
|
-
end
|
275
|
-
end
|
276
|
-
|
277
|
-
def define_package
|
278
|
-
task :package => :clean
|
279
|
-
Rake::GemPackageTask.new(gemspec) { |t|
|
280
|
-
t.need_tar = true
|
281
|
-
}
|
282
|
-
end
|
283
|
-
|
284
|
-
def define_spec
|
285
|
-
unless spec_files.empty?
|
286
|
-
require 'spec/rake/spectask'
|
287
|
-
|
288
|
-
desc "run specs"
|
289
|
-
Spec::Rake::SpecTask.new('spec') do |t|
|
290
|
-
t.spec_files = spec_files
|
291
|
-
end
|
292
|
-
|
293
|
-
desc "run specs with text output"
|
294
|
-
Spec::Rake::SpecTask.new('text_spec') do |t|
|
295
|
-
t.spec_files = spec_files
|
296
|
-
t.spec_opts = ['-fs']
|
297
|
-
end
|
298
|
-
|
299
|
-
desc "run specs with html output"
|
300
|
-
Spec::Rake::SpecTask.new('full_spec') do |t|
|
301
|
-
t.spec_files = spec_files
|
302
|
-
t.rcov = true
|
303
|
-
t.rcov_opts = rcov_options
|
304
|
-
t.spec_opts = ["-fh:#{spec_output}"]
|
305
|
-
end
|
306
|
-
|
307
|
-
desc "run full_spec then open browser"
|
308
|
-
task :show_spec => :full_spec do
|
309
|
-
open_browser(spec_output, rcov_dir + "/index.html")
|
310
|
-
end
|
311
|
-
|
312
|
-
desc "run specs individually"
|
313
|
-
task :spec_deps do
|
314
|
-
run_ruby_on_each(*spec_files)
|
315
|
-
end
|
316
|
-
|
317
|
-
task :prerelease => [:spec, :spec_deps]
|
318
|
-
task :default => :spec
|
319
|
-
|
320
|
-
CLEAN.include spec_output
|
321
|
-
end
|
322
|
-
end
|
323
|
-
|
324
|
-
def define_test
|
325
|
-
unless test_files.empty?
|
326
|
-
desc "run tests"
|
327
|
-
task :test do
|
328
|
-
test_files.each { |file|
|
329
|
-
require file
|
330
|
-
}
|
331
|
-
end
|
332
|
-
|
333
|
-
desc "run tests with rcov"
|
334
|
-
task :full_test do
|
335
|
-
verbose(false) {
|
336
|
-
sh("rcov", "-o", rcov_dir, "--text-report",
|
337
|
-
*(test_files + rcov_options)
|
338
|
-
)
|
339
|
-
}
|
340
|
-
end
|
341
|
-
|
342
|
-
desc "run full_test then open browser"
|
343
|
-
task :show_test => :full_test do
|
344
|
-
open_browser(rcov_dir + "/index.html")
|
345
|
-
end
|
346
|
-
|
347
|
-
desc "run tests individually"
|
348
|
-
task :test_deps do
|
349
|
-
run_ruby_on_each(*test_files)
|
350
|
-
end
|
351
|
-
|
352
|
-
task :prerelease => [:test, :test_deps]
|
353
|
-
task :default => :test
|
354
|
-
|
355
|
-
CLEAN.include rcov_dir
|
356
|
-
end
|
357
|
-
end
|
358
|
-
|
359
|
-
def define_doc
|
360
|
-
desc "run rdoc"
|
361
|
-
task :doc => :clean_doc do
|
362
|
-
args = (
|
363
|
-
gemspec.rdoc_options +
|
364
|
-
gemspec.require_paths.clone +
|
365
|
-
gemspec.extra_rdoc_files +
|
366
|
-
["-o", doc_dir]
|
367
|
-
).flatten.map { |t| t.to_s }
|
368
|
-
RDoc::RDoc.new.document args
|
369
|
-
end
|
370
|
-
|
371
|
-
task :clean_doc do
|
372
|
-
# normally rm_rf, but mimic rake/clean output
|
373
|
-
rm_r(doc_dir) rescue nil
|
374
|
-
end
|
375
|
-
|
376
|
-
desc "run rdoc then open browser"
|
377
|
-
task :show_doc => :doc do
|
378
|
-
open_browser(doc_dir + "/index.html")
|
379
|
-
end
|
380
|
-
|
381
|
-
task :rdoc => :doc
|
382
|
-
task :clean => :clean_doc
|
383
|
-
end
|
384
|
-
|
385
|
-
def define_publish
|
386
|
-
desc "upload docs"
|
387
|
-
task :publish => [:clean_doc, :doc] do
|
388
|
-
Rake::SshDirPublisher.new(
|
389
|
-
"#{rubyforge_user}@rubyforge.org",
|
390
|
-
"/var/www/gforge-projects/#{rubyforge_name}",
|
391
|
-
doc_dir
|
392
|
-
).upload
|
393
|
-
end
|
394
|
-
end
|
395
|
-
|
396
|
-
def define_install
|
397
|
-
desc "direct install (no gem)"
|
398
|
-
task :install do
|
399
|
-
SimpleInstaller.new.run([])
|
400
|
-
end
|
401
|
-
|
402
|
-
desc "direct uninstall (no gem)"
|
403
|
-
task :uninstall do
|
404
|
-
SimpleInstaller.new.run(["--uninstall"])
|
405
|
-
end
|
406
|
-
end
|
407
|
-
|
408
|
-
def define_debug
|
409
|
-
runner = Class.new do
|
410
|
-
def comment_src_dst(on)
|
411
|
-
on ? ["", "#"] : ["#", ""]
|
412
|
-
end
|
413
|
-
|
414
|
-
def comment_regions(on, contents, start)
|
415
|
-
src, dst = comment_src_dst(on)
|
416
|
-
contents.gsub(%r!^(\s+)#{src}#{start}.*?^\1#{src}(\}|end)!m) { |chunk|
|
417
|
-
indent = $1
|
418
|
-
chunk.gsub(%r!^#{indent}#{src}!, "#{indent}#{dst}")
|
419
|
-
}
|
420
|
-
end
|
421
|
-
|
422
|
-
def comment_lines(on, contents, start)
|
423
|
-
src, dst = comment_src_dst(on)
|
424
|
-
contents.gsub(%r!^(\s*)#{src}#{start}!) {
|
425
|
-
$1 + dst + start
|
426
|
-
}
|
427
|
-
end
|
428
|
-
|
429
|
-
def debug_info(enable)
|
430
|
-
Find.find("lib", "test") { |path|
|
431
|
-
if path =~ %r!\.rb\Z!
|
432
|
-
Jumpstart.replace_file(path) { |contents|
|
433
|
-
result = comment_regions(!enable, contents, "debug")
|
434
|
-
comment_lines(!enable, result, "trace")
|
435
|
-
}
|
436
|
-
end
|
437
|
-
}
|
438
|
-
end
|
439
|
-
end
|
440
|
-
|
441
|
-
desc "enable debug and trace calls"
|
442
|
-
task :debug_on do
|
443
|
-
runner.new.debug_info(true)
|
444
|
-
end
|
445
|
-
|
446
|
-
desc "disable debug and trace calls"
|
447
|
-
task :debug_off do
|
448
|
-
runner.new.debug_info(false)
|
449
|
-
end
|
450
|
-
end
|
451
|
-
|
452
|
-
def define_columns
|
453
|
-
desc "check for columns > 80"
|
454
|
-
task :check_columns do
|
455
|
-
Dir["**/*.rb"].each { |file|
|
456
|
-
File.read(file).scan(%r!^.{81}!) { |match|
|
457
|
-
unless match =~ %r!http://!
|
458
|
-
raise "#{file} greater than 80 columns: #{match}"
|
459
|
-
end
|
460
|
-
}
|
461
|
-
}
|
462
|
-
end
|
463
|
-
task :prerelease => :check_columns
|
464
|
-
end
|
465
|
-
|
466
|
-
def define_comments
|
467
|
-
task :comments do
|
468
|
-
file = "comments.txt"
|
469
|
-
write_file(file) {
|
470
|
-
Array.new.tap { |result|
|
471
|
-
(["Rakefile"] + Dir["**/*.{rb,rake}"]).each { |file|
|
472
|
-
File.read(file).scan(%r!\#[^\{].*$!) { |match|
|
473
|
-
result << match
|
474
|
-
}
|
475
|
-
}
|
476
|
-
}.join("\n")
|
477
|
-
}
|
478
|
-
CLEAN.include file
|
479
|
-
end
|
480
|
-
end
|
481
|
-
|
482
|
-
def define_check_directory
|
483
|
-
task :check_directory do
|
484
|
-
unless `git status` =~ %r!nothing to commit \(working directory clean\)!
|
485
|
-
raise "Directory not clean"
|
486
|
-
end
|
487
|
-
end
|
488
|
-
end
|
489
|
-
|
490
|
-
def define_ping
|
491
|
-
task :ping do
|
492
|
-
%w[github.com rubyforge.org].each { |server|
|
493
|
-
cmd = "ping " + (
|
494
|
-
if Config::CONFIG["host"] =~ %r!darwin!
|
495
|
-
"-c2 #{server}"
|
496
|
-
else
|
497
|
-
"#{server} 2 2"
|
498
|
-
end
|
499
|
-
)
|
500
|
-
unless `#{cmd}` =~ %r!0% packet loss!
|
501
|
-
raise "No ping for #{server}"
|
502
|
-
end
|
503
|
-
}
|
504
|
-
end
|
505
|
-
end
|
506
|
-
|
507
|
-
def git(*args)
|
508
|
-
sh("git", *args)
|
509
|
-
end
|
510
|
-
|
511
|
-
def rubyforge(command, file)
|
512
|
-
sh(
|
513
|
-
"rubyforge",
|
514
|
-
command,
|
515
|
-
rubyforge_name,
|
516
|
-
rubyforge_name,
|
517
|
-
version.to_s,
|
518
|
-
file
|
519
|
-
)
|
520
|
-
end
|
521
|
-
|
522
|
-
def define_release
|
523
|
-
task :prerelease => [:clean, :check_directory, :ping]
|
524
|
-
|
525
|
-
task :finish_release do
|
526
|
-
gem_md5, tgz_md5 = [gem, tgz].map { |file|
|
527
|
-
"#{file}.md5".tap { |md5|
|
528
|
-
sh("md5sum #{file} > #{md5}")
|
529
|
-
}
|
530
|
-
}
|
531
|
-
|
532
|
-
rubyforge("add_release", gem)
|
533
|
-
[gem_md5, tgz, tgz_md5].each { |file|
|
534
|
-
rubyforge("add_file", file)
|
535
|
-
}
|
536
|
-
|
537
|
-
git("tag", "#{name}-" + version.to_s)
|
538
|
-
git(*%w(push --tags origin master))
|
539
|
-
end
|
540
|
-
|
541
|
-
task :release => [:prerelease, :package, :publish, :finish_release]
|
542
|
-
end
|
543
|
-
|
544
|
-
def define_debug_gem
|
545
|
-
task :debug_gem do
|
546
|
-
puts gemspec.to_ruby
|
547
|
-
end
|
548
|
-
end
|
549
|
-
|
550
|
-
def open_browser(*files)
|
551
|
-
sh(*([browser].flatten + files))
|
552
|
-
end
|
553
|
-
|
554
|
-
def write_file(file)
|
555
|
-
yield.tap { |contents|
|
556
|
-
File.open(file, "wb") { |out|
|
557
|
-
out.print(contents)
|
558
|
-
}
|
559
|
-
}
|
560
|
-
end
|
561
|
-
|
562
|
-
def run_ruby_on_each(*files)
|
563
|
-
files.each { |file|
|
564
|
-
Ruby.run_or_raise("-w", file)
|
565
|
-
}
|
566
|
-
end
|
567
|
-
|
568
|
-
def to_camel_case(str)
|
569
|
-
str.split('_').map { |t| t.capitalize }.join
|
570
|
-
end
|
571
|
-
|
572
|
-
class << self
|
573
|
-
def replace_file(file)
|
574
|
-
old_contents = File.read(file)
|
575
|
-
yield(old_contents).tap { |new_contents|
|
576
|
-
if old_contents != new_contents
|
577
|
-
File.open(file, "wb") { |output|
|
578
|
-
output.print(new_contents)
|
579
|
-
}
|
580
|
-
end
|
581
|
-
}
|
582
|
-
end
|
583
|
-
end
|
584
|
-
end
|
585
|
-
|
586
|
-
unless respond_to? :tap
|
587
|
-
class Object
|
588
|
-
def tap
|
589
|
-
yield self
|
590
|
-
self
|
591
|
-
end
|
592
|
-
end
|
593
|
-
end
|
594
|
-
|
1
|
+
require 'jumpstart/jumpstart'
|
data/lib/comp_tree.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: comp_tree
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James M. Lawrence
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-04-
|
12
|
+
date: 2009-04-28 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -27,6 +27,7 @@ files:
|
|
27
27
|
- README.rdoc
|
28
28
|
- Rakefile
|
29
29
|
- devel/jumpstart.rb
|
30
|
+
- devel/jumpstart/jumpstart.rb
|
30
31
|
- devel/jumpstart/lazy_attribute.rb
|
31
32
|
- devel/jumpstart/ruby.rb
|
32
33
|
- devel/jumpstart/simple_installer.rb
|
@@ -64,6 +65,8 @@ rdoc_options:
|
|
64
65
|
- --exclude
|
65
66
|
- devel/jumpstart.rb
|
66
67
|
- --exclude
|
68
|
+
- devel/jumpstart/jumpstart.rb
|
69
|
+
- --exclude
|
67
70
|
- devel/jumpstart/lazy_attribute.rb
|
68
71
|
- --exclude
|
69
72
|
- devel/jumpstart/ruby.rb
|
@@ -72,6 +75,16 @@ rdoc_options:
|
|
72
75
|
- --exclude
|
73
76
|
- install.rb
|
74
77
|
- --exclude
|
78
|
+
- lib/comp_tree/algorithm.rb
|
79
|
+
- --exclude
|
80
|
+
- lib/comp_tree/node.rb
|
81
|
+
- --exclude
|
82
|
+
- lib/comp_tree/queue.rb
|
83
|
+
- --exclude
|
84
|
+
- lib/comp_tree/queue_new.rb
|
85
|
+
- --exclude
|
86
|
+
- lib/comp_tree/queue_old.rb
|
87
|
+
- --exclude
|
75
88
|
- test/common.rb
|
76
89
|
- --exclude
|
77
90
|
- test/test_basic.rb
|