comp_tree 1.0.1 → 1.1.0
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 +9 -1
- data/MANIFEST +2 -3
- data/README.rdoc +16 -12
- data/Rakefile +5 -4
- data/devel/{jumpstart.rb → levitate.rb} +236 -273
- data/lib/comp_tree.rb +52 -2
- data/lib/comp_tree/algorithm.rb +23 -26
- data/lib/comp_tree/driver.rb +19 -26
- data/lib/comp_tree/queue/queue_18.rb +1 -3
- data/lib/comp_tree/queue/queue_19.rb +1 -3
- data/lib/comp_tree/version.rb +3 -0
- data/test/basic_test.rb +15 -12
- data/test/circular_test.rb +2 -2
- data/test/comp_tree_test_base.rb +3 -2
- data/test/drain_test.rb +3 -5
- data/test/exception_test.rb +6 -9
- data/test/flood_test.rb +3 -3
- data/test/grind_test.rb +3 -5
- data/test/readme_test.rb +3 -3
- data/test/sequential_test.rb +3 -3
- data/test/throw_test.rb +2 -2
- metadata +13 -42
- data/install.rb +0 -2
- data/lib/comp_tree/comp_tree.rb +0 -55
data/CHANGES.rdoc
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
|
2
|
-
=
|
2
|
+
= comp_tree Changes
|
3
|
+
|
4
|
+
== Version 1.1.0
|
5
|
+
|
6
|
+
* lazily spawn threads as needed -- no longer pre-allocates possibly
|
7
|
+
unused threads
|
8
|
+
|
9
|
+
* no longer required to specify the number of threads (pass 0 to the
|
10
|
+
second argument of +compute+).
|
3
11
|
|
4
12
|
== Version 1.0.1
|
5
13
|
|
data/MANIFEST
CHANGED
@@ -2,17 +2,16 @@ CHANGES.rdoc
|
|
2
2
|
MANIFEST
|
3
3
|
README.rdoc
|
4
4
|
Rakefile
|
5
|
-
devel/
|
6
|
-
install.rb
|
5
|
+
devel/levitate.rb
|
7
6
|
lib/comp_tree.rb
|
8
7
|
lib/comp_tree/algorithm.rb
|
9
|
-
lib/comp_tree/comp_tree.rb
|
10
8
|
lib/comp_tree/driver.rb
|
11
9
|
lib/comp_tree/error.rb
|
12
10
|
lib/comp_tree/node.rb
|
13
11
|
lib/comp_tree/queue/queue.rb
|
14
12
|
lib/comp_tree/queue/queue_18.rb
|
15
13
|
lib/comp_tree/queue/queue_19.rb
|
14
|
+
lib/comp_tree/version.rb
|
16
15
|
test/basic_test.rb
|
17
16
|
test/circular_test.rb
|
18
17
|
test/comp_tree_test_base.rb
|
data/README.rdoc
CHANGED
@@ -31,7 +31,7 @@ A simple framework for automatic parallelism.
|
|
31
31
|
2
|
32
32
|
}
|
33
33
|
|
34
|
-
# Compute the area using four parallel threads.
|
34
|
+
# Compute the area using up to four parallel threads.
|
35
35
|
puts driver.compute(:area, 4)
|
36
36
|
# => 63
|
37
37
|
|
@@ -44,15 +44,26 @@ A simple framework for automatic parallelism.
|
|
44
44
|
|
45
45
|
% gem install comp_tree
|
46
46
|
|
47
|
-
Or
|
48
|
-
|
49
|
-
% ruby install.rb [--uninstall]
|
47
|
+
Or from inside an unpacked .tgz download, <code>rake install</code> /
|
48
|
+
<code>rake uninstall</code>.
|
50
49
|
|
51
50
|
== Description
|
52
51
|
|
53
52
|
CompTree is a parallel computation tree structure based upon concepts
|
54
53
|
from pure functional programming.
|
55
54
|
|
55
|
+
CompTree has been tested on MRI versions 1.8.6, 1.8.7, 1.9.1, 1.9.2,
|
56
|
+
and jruby versions 1.4, 1.5, 1.6.
|
57
|
+
|
58
|
+
== Links
|
59
|
+
|
60
|
+
* Home: http://quix.github.com/comp_tree
|
61
|
+
* Feature Requests, Bug Reports: http://github.com/quix/comp_tree/issues
|
62
|
+
* Manual Download: http://github.com/quix/comp_tree/archives/master
|
63
|
+
* Repository: http://github.com/quix/comp_tree
|
64
|
+
|
65
|
+
== Background
|
66
|
+
|
56
67
|
The user should have a basic understanding of functional programming
|
57
68
|
(see for example http://en.wikipedia.org/wiki/Functional_programming)
|
58
69
|
and the meaning of <em>side effects</em>.
|
@@ -88,20 +99,13 @@ Note however it is OK affect a state as long as <em>no other function
|
|
88
99
|
depends on that state</em>. This is the principle under which
|
89
100
|
CompTree parallelizes Rake tasks (http://drake.rubyforge.org).
|
90
101
|
|
91
|
-
== Links
|
92
|
-
|
93
|
-
* Documentation: http://comptree.rubyforge.org
|
94
|
-
* Download: http://rubyforge.org/frs/?group_id=6917
|
95
|
-
* Rubyforge home: http://rubyforge.org/projects/comptree
|
96
|
-
* Repository: http://github.com/quix/comp_tree
|
97
|
-
|
98
102
|
== Author
|
99
103
|
|
100
104
|
* James M. Lawrence <quixoticsycophant@gmail.com>
|
101
105
|
|
102
106
|
== License
|
103
107
|
|
104
|
-
Copyright (c) 2008
|
108
|
+
Copyright (c) 2008-2011 James M. Lawrence. All rights reserved.
|
105
109
|
|
106
110
|
Permission is hereby granted, free of charge, to any person
|
107
111
|
obtaining a copy of this software and associated documentation files
|
data/Rakefile
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
$LOAD_PATH.unshift 'devel'
|
2
2
|
|
3
|
-
require '
|
3
|
+
require 'levitate'
|
4
4
|
|
5
|
-
|
6
|
-
s.
|
7
|
-
s.
|
5
|
+
Levitate.new "comp_tree" do |s|
|
6
|
+
s.developers << ["James M. Lawrence", "quixoticsycophant@gmail.com"]
|
7
|
+
s.rubyforge_info = ["quix", "comptree"]
|
8
|
+
s.github_user = "quix"
|
8
9
|
s.rdoc_files = %w[
|
9
10
|
lib/comp_tree/comp_tree.rb
|
10
11
|
lib/comp_tree/driver.rb
|
@@ -1,11 +1,11 @@
|
|
1
1
|
|
2
|
-
class
|
3
|
-
class
|
2
|
+
class Levitate
|
3
|
+
class Installer
|
4
4
|
def initialize
|
5
5
|
require 'fileutils'
|
6
6
|
require 'rbconfig'
|
7
7
|
require 'find'
|
8
|
-
dest_root =
|
8
|
+
dest_root = RbConfig::CONFIG["sitelibdir"]
|
9
9
|
sources = []
|
10
10
|
Find.find("./lib") { |source|
|
11
11
|
if install_file?(source)
|
@@ -146,13 +146,13 @@ class Jumpstart
|
|
146
146
|
require 'rbconfig'
|
147
147
|
|
148
148
|
name = File.join(
|
149
|
-
|
150
|
-
|
149
|
+
RbConfig::CONFIG["bindir"],
|
150
|
+
RbConfig::CONFIG["RUBY_INSTALL_NAME"]
|
151
151
|
)
|
152
152
|
|
153
|
-
if
|
153
|
+
if RbConfig::CONFIG["host"] =~ %r!(mswin|cygwin|mingw)! and
|
154
154
|
File.basename(name) !~ %r!\.(exe|com|bat|cmd)\Z!i
|
155
|
-
name +
|
155
|
+
name + RbConfig::CONFIG["EXEEXT"]
|
156
156
|
else
|
157
157
|
name
|
158
158
|
end
|
@@ -219,17 +219,6 @@ class Jumpstart
|
|
219
219
|
}
|
220
220
|
contents
|
221
221
|
end
|
222
|
-
|
223
|
-
def replace_file(file)
|
224
|
-
old_contents = File.read(file)
|
225
|
-
new_contents = yield(old_contents)
|
226
|
-
if old_contents != new_contents
|
227
|
-
File.open(file, "wb") { |output|
|
228
|
-
output.print(new_contents)
|
229
|
-
}
|
230
|
-
end
|
231
|
-
new_contents
|
232
|
-
end
|
233
222
|
end
|
234
223
|
|
235
224
|
module InstanceEvalWithArgs
|
@@ -260,20 +249,18 @@ class Jumpstart
|
|
260
249
|
include AttrLazy
|
261
250
|
include Util
|
262
251
|
|
263
|
-
def initialize(
|
252
|
+
def initialize(gem_name)
|
264
253
|
$LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
|
265
|
-
$LOAD_PATH.unshift File.dirname(__FILE__)
|
266
254
|
|
267
|
-
require '
|
268
|
-
require 'rake/clean'
|
255
|
+
require 'rubygems/package_task'
|
269
256
|
|
270
|
-
@
|
257
|
+
@gem_name = gem_name
|
271
258
|
|
272
259
|
yield self
|
273
260
|
|
274
261
|
self.class.instance_methods(false).select { |t|
|
275
262
|
t.to_s =~ %r!\Adefine_!
|
276
|
-
}.each { |method_name|
|
263
|
+
}.sort.each { |method_name|
|
277
264
|
send(method_name)
|
278
265
|
}
|
279
266
|
end
|
@@ -282,35 +269,32 @@ class Jumpstart
|
|
282
269
|
alias_method :attribute, :attr_lazy_accessor
|
283
270
|
end
|
284
271
|
|
285
|
-
|
286
|
-
@project_name
|
287
|
-
end
|
272
|
+
attr_reader :gem_name
|
288
273
|
|
289
274
|
attribute :version_constant_name do
|
290
275
|
"VERSION"
|
291
276
|
end
|
292
277
|
|
278
|
+
attribute :camel_name do
|
279
|
+
to_camel_case(gem_name)
|
280
|
+
end
|
281
|
+
|
293
282
|
attribute :version do
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
mod.const_get(version_constant_name)
|
283
|
+
catch :bail do
|
284
|
+
if File.file?(version_file = "./lib/#{gem_name}/version.rb")
|
285
|
+
require version_file
|
286
|
+
elsif File.file?("./lib/#{gem_name}.rb")
|
287
|
+
require gem_name
|
300
288
|
else
|
301
|
-
|
289
|
+
throw :bail
|
302
290
|
end
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
end
|
311
|
-
|
312
|
-
attribute :rubyforge_user do
|
313
|
-
email.first[%r!^.*(?=@)!]
|
291
|
+
mod = Kernel.const_get(camel_name)
|
292
|
+
constants = mod.constants.map { |t| t.to_sym }
|
293
|
+
unless constants.include?(version_constant_name.to_sym)
|
294
|
+
throw :bail
|
295
|
+
end
|
296
|
+
mod.const_get(version_constant_name)
|
297
|
+
end or "0.0.0"
|
314
298
|
end
|
315
299
|
|
316
300
|
attribute :readme_file do
|
@@ -322,7 +306,7 @@ class Jumpstart
|
|
322
306
|
end
|
323
307
|
|
324
308
|
attribute :doc_dir do
|
325
|
-
"
|
309
|
+
"doc"
|
326
310
|
end
|
327
311
|
|
328
312
|
attribute :spec_files do
|
@@ -333,7 +317,7 @@ class Jumpstart
|
|
333
317
|
(Dir["./test/test_*.rb"] + Dir["./test/*_test.rb"]).uniq
|
334
318
|
end
|
335
319
|
|
336
|
-
attribute :
|
320
|
+
attribute :cov_dir do
|
337
321
|
"coverage"
|
338
322
|
end
|
339
323
|
|
@@ -351,7 +335,7 @@ class Jumpstart
|
|
351
335
|
|
352
336
|
[:gem, :tgz].each { |ext|
|
353
337
|
attribute ext do
|
354
|
-
"pkg/#{
|
338
|
+
"pkg/#{gem_name}-#{version}.#{ext}"
|
355
339
|
end
|
356
340
|
}
|
357
341
|
|
@@ -379,90 +363,86 @@ class Jumpstart
|
|
379
363
|
end
|
380
364
|
|
381
365
|
attribute :files do
|
382
|
-
if File.
|
366
|
+
if File.file? manifest_file
|
383
367
|
File.read(manifest_file).split("\n")
|
384
|
-
|
385
|
-
|
386
|
-
end
|
368
|
+
elsif source_control?
|
369
|
+
IO.popen("git ls-files") { |pipe| pipe.read.split "\n" }
|
370
|
+
end.to_a + [manifest_file] + generated_files
|
371
|
+
end
|
372
|
+
|
373
|
+
def files_in_require_paths
|
374
|
+
require_paths.inject([]) { |acc, dir|
|
375
|
+
acc + Dir.glob("#{dir}/**/*.rb")
|
376
|
+
}
|
387
377
|
end
|
388
378
|
|
389
379
|
attribute :rdoc_files do
|
390
|
-
|
380
|
+
files_in_require_paths
|
391
381
|
end
|
392
382
|
|
393
|
-
attribute :
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
383
|
+
attribute :rdoc_title do
|
384
|
+
"#{gem_name}: #{summary}"
|
385
|
+
end
|
386
|
+
|
387
|
+
attribute :require_paths do
|
388
|
+
["lib"]
|
399
389
|
end
|
400
390
|
|
401
391
|
attribute :rdoc_options do
|
402
|
-
if File.
|
392
|
+
if File.file?(readme_file)
|
403
393
|
["--main", readme_file]
|
404
394
|
else
|
405
395
|
[]
|
406
396
|
end + [
|
407
|
-
"--title",
|
408
|
-
] + (
|
397
|
+
"--title", rdoc_title,
|
398
|
+
] + (files_in_require_paths - rdoc_files).inject(Array.new) {
|
399
|
+
|acc, file|
|
409
400
|
acc + ["--exclude", file]
|
410
401
|
}
|
411
402
|
end
|
412
403
|
|
404
|
+
attribute :extra_rdoc_files do
|
405
|
+
result = []
|
406
|
+
[readme_file, history_file].each { |file|
|
407
|
+
result << file if File.file?(file)
|
408
|
+
}
|
409
|
+
result
|
410
|
+
end
|
411
|
+
|
413
412
|
attribute :browser do
|
414
413
|
require 'rbconfig'
|
415
|
-
if
|
416
|
-
|
417
|
-
"/Applications/#{t}.app"
|
418
|
-
}.select { |t|
|
419
|
-
File.exist? t
|
420
|
-
}.first
|
421
|
-
if app
|
422
|
-
["open", app]
|
423
|
-
else
|
424
|
-
raise "need to set `browser'"
|
425
|
-
end
|
414
|
+
if RbConfig::CONFIG["host"] =~ %r!darwin!
|
415
|
+
"open"
|
426
416
|
else
|
427
417
|
"firefox"
|
428
418
|
end
|
429
419
|
end
|
430
420
|
|
431
421
|
attribute :gemspec do
|
432
|
-
Gem::Specification.new
|
433
|
-
g.has_rdoc = true
|
422
|
+
Gem::Specification.new do |g|
|
434
423
|
%w[
|
435
|
-
name
|
436
424
|
authors
|
437
425
|
email
|
438
426
|
summary
|
439
427
|
version
|
440
428
|
description
|
441
429
|
files
|
442
|
-
extra_rdoc_files
|
443
430
|
rdoc_options
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
)
|
448
|
-
}
|
449
|
-
|
450
|
-
if rubyforge_name
|
451
|
-
g.rubyforge_project = rubyforge_name
|
452
|
-
end
|
453
|
-
|
454
|
-
if url
|
455
|
-
g.homepage = url
|
431
|
+
extra_rdoc_files
|
432
|
+
require_paths
|
433
|
+
].each do |param|
|
434
|
+
t = send(param) and g.send("#{param}=", t)
|
456
435
|
end
|
457
|
-
|
458
|
-
|
436
|
+
g.name = gem_name
|
437
|
+
g.has_rdoc = true
|
438
|
+
g.homepage = url if url
|
439
|
+
dependencies.each { |dep|
|
459
440
|
g.add_dependency(*dep)
|
460
441
|
}
|
461
|
-
|
462
|
-
extra_dev_deps.each { |dep|
|
442
|
+
development_dependencies.each { |dep|
|
463
443
|
g.add_development_dependency(*dep)
|
464
444
|
}
|
465
|
-
|
445
|
+
end
|
466
446
|
end
|
467
447
|
|
468
448
|
attribute :readme_contents do
|
@@ -470,10 +450,9 @@ class Jumpstart
|
|
470
450
|
end
|
471
451
|
|
472
452
|
attribute :sections do
|
473
|
-
require 'enumerator'
|
474
453
|
begin
|
475
454
|
data = readme_contents.split(%r!^==\s*(.*?)\s*$!)
|
476
|
-
pairs = data[1..-1].
|
455
|
+
pairs = data[1..-1].each_slice(2).map { |section, contents|
|
477
456
|
[section.downcase, contents.strip]
|
478
457
|
}
|
479
458
|
Hash[*pairs.flatten]
|
@@ -513,58 +492,60 @@ class Jumpstart
|
|
513
492
|
}
|
514
493
|
|
515
494
|
attribute :url do
|
516
|
-
|
517
|
-
readme_contents.match(%r!^\*.*?(http://\S+)!)[1]
|
518
|
-
rescue
|
519
|
-
"http://#{rubyforge_name}.rubyforge.org"
|
520
|
-
end
|
495
|
+
"http://#{github_user}.github.com/#{gem_name}"
|
521
496
|
end
|
522
497
|
|
523
|
-
attribute :
|
524
|
-
|
498
|
+
attribute :github_user do
|
499
|
+
raise "github_user not set"
|
525
500
|
end
|
526
501
|
|
527
|
-
attribute :
|
528
|
-
|
502
|
+
attribute :rubyforge_info do
|
503
|
+
nil
|
529
504
|
end
|
530
505
|
|
531
506
|
attribute :authors do
|
532
|
-
|
507
|
+
developers.map { |d| d[0] }
|
533
508
|
end
|
534
509
|
|
535
510
|
attribute :email do
|
536
|
-
|
511
|
+
developers.map { |d| d[1] }
|
537
512
|
end
|
538
513
|
|
539
|
-
|
540
|
-
|
541
|
-
self.email << email
|
514
|
+
attribute :dependencies do
|
515
|
+
[]
|
542
516
|
end
|
543
517
|
|
544
|
-
|
545
|
-
|
518
|
+
attribute :development_dependencies do
|
519
|
+
[]
|
520
|
+
end
|
521
|
+
|
522
|
+
attribute :developers do
|
523
|
+
[]
|
546
524
|
end
|
547
525
|
|
548
526
|
def define_clean
|
549
|
-
|
527
|
+
require 'rake/clean'
|
528
|
+
task :clean do
|
550
529
|
Rake::Task[:clobber].invoke
|
551
530
|
end
|
552
531
|
end
|
553
532
|
|
554
533
|
def define_package
|
555
|
-
|
556
|
-
|
534
|
+
if source_control?
|
535
|
+
task manifest_file do
|
536
|
+
create_manifest
|
537
|
+
end
|
538
|
+
CLEAN.add manifest_file
|
539
|
+
task :package => :clean
|
540
|
+
Gem::PackageTask.new(gemspec).define
|
557
541
|
end
|
558
|
-
CLEAN.include manifest_file
|
559
|
-
task :package => :clean
|
560
|
-
Rake::GemPackageTask.new(gemspec) { |t|
|
561
|
-
t.need_tar = true
|
562
|
-
}
|
563
542
|
end
|
564
543
|
|
565
544
|
def define_spec
|
566
545
|
unless spec_files.empty?
|
567
|
-
|
546
|
+
Ruby.no_warnings {
|
547
|
+
require 'spec/rake/spectask'
|
548
|
+
}
|
568
549
|
|
569
550
|
desc "run specs"
|
570
551
|
Spec::Rake::SpecTask.new('spec') do |t|
|
@@ -585,9 +566,11 @@ class Jumpstart
|
|
585
566
|
t.spec_opts = ["-fh:#{spec_output}"]
|
586
567
|
end
|
587
568
|
|
569
|
+
suppress_task_warnings :spec, :full_spec, :text_spec
|
570
|
+
|
588
571
|
desc "run full_spec then open browser"
|
589
572
|
task :show_spec => :full_spec do
|
590
|
-
open_browser(spec_output,
|
573
|
+
open_browser(spec_output, cov_dir + "/index.html")
|
591
574
|
end
|
592
575
|
|
593
576
|
desc "run specs individually"
|
@@ -598,7 +581,7 @@ class Jumpstart
|
|
598
581
|
task :prerelease => [:spec, :spec_deps]
|
599
582
|
task :default => :spec
|
600
583
|
|
601
|
-
CLEAN.
|
584
|
+
CLEAN.add spec_output_dir
|
602
585
|
end
|
603
586
|
end
|
604
587
|
|
@@ -606,23 +589,44 @@ class Jumpstart
|
|
606
589
|
unless test_files.empty?
|
607
590
|
desc "run tests"
|
608
591
|
task :test do
|
609
|
-
test_files.each { |file|
|
610
|
-
|
611
|
-
|
592
|
+
test_files.each { |file| require file }
|
593
|
+
|
594
|
+
# if we use at_exit hook instead, it won't run before :release
|
595
|
+
MiniTest::Unit.new.run ARGV
|
612
596
|
end
|
613
597
|
|
614
|
-
desc "run tests with
|
615
|
-
|
616
|
-
|
617
|
-
|
618
|
-
|
619
|
-
|
620
|
-
|
598
|
+
desc "run tests with coverage"
|
599
|
+
if ruby_18?
|
600
|
+
task :full_test do
|
601
|
+
verbose(false) {
|
602
|
+
sh("rcov", "-o", cov_dir, "--text-report",
|
603
|
+
*(test_files + rcov_options)
|
604
|
+
)
|
605
|
+
}
|
606
|
+
end
|
607
|
+
else
|
608
|
+
task :full_test do
|
609
|
+
rm_rf cov_dir
|
610
|
+
require 'simplecov'
|
611
|
+
SimpleCov.start do
|
612
|
+
add_filter "test/"
|
613
|
+
add_filter "devel/"
|
614
|
+
end
|
615
|
+
Rake::Task[:test].invoke
|
616
|
+
end
|
621
617
|
end
|
622
618
|
|
623
619
|
desc "run full_test then open browser"
|
624
620
|
task :show_test => :full_test do
|
625
|
-
open_browser(
|
621
|
+
show = lambda { open_browser(cov_dir + "/index.html") }
|
622
|
+
if ruby_18?
|
623
|
+
show.call
|
624
|
+
else
|
625
|
+
SimpleCov.at_exit do
|
626
|
+
SimpleCov.result.format!
|
627
|
+
show.call
|
628
|
+
end
|
629
|
+
end
|
626
630
|
end
|
627
631
|
|
628
632
|
desc "run tests individually"
|
@@ -633,13 +637,14 @@ class Jumpstart
|
|
633
637
|
task :prerelease => [:test, :test_deps]
|
634
638
|
task :default => :test
|
635
639
|
|
636
|
-
CLEAN.
|
640
|
+
CLEAN.add cov_dir
|
637
641
|
end
|
638
642
|
end
|
639
643
|
|
640
644
|
def define_doc
|
641
645
|
desc "run rdoc"
|
642
646
|
task :doc => :clean_doc do
|
647
|
+
Kernel.send :gem, 'rdoc' rescue nil
|
643
648
|
require 'rdoc/rdoc'
|
644
649
|
args = (
|
645
650
|
gemspec.rdoc_options +
|
@@ -665,108 +670,48 @@ class Jumpstart
|
|
665
670
|
end
|
666
671
|
|
667
672
|
def define_publish
|
668
|
-
|
669
|
-
|
670
|
-
|
671
|
-
|
672
|
-
|
673
|
-
|
674
|
-
|
675
|
-
|
673
|
+
if source_control?
|
674
|
+
desc "publish docs"
|
675
|
+
task :publish => [:clean, :check_directory, :doc] do
|
676
|
+
if rubyforge_info
|
677
|
+
user, project = rubyforge_info
|
678
|
+
Dir.chdir(doc_dir) do
|
679
|
+
sh "scp", "-r",
|
680
|
+
".",
|
681
|
+
"#{user}@rubyforge.org:/var/www/gforge-projects/#{project}"
|
682
|
+
end
|
683
|
+
end
|
684
|
+
git "branch", "-D", "gh-pages"
|
685
|
+
git "checkout", "--orphan", "gh-pages"
|
686
|
+
FileUtils.rm ".git/index"
|
687
|
+
git "clean", "-fdx", "-e", "doc"
|
688
|
+
Dir["doc/*"].each { |path|
|
689
|
+
FileUtils.mv path, "."
|
690
|
+
}
|
691
|
+
FileUtils.rmdir "doc"
|
692
|
+
git "add", "."
|
693
|
+
git "commit", "-m", "generated by rdoc"
|
694
|
+
git "push", "-f", "origin", "gh-pages"
|
695
|
+
end
|
676
696
|
end
|
677
697
|
end
|
678
698
|
|
679
699
|
def define_install
|
680
700
|
desc "direct install (no gem)"
|
681
701
|
task :install do
|
682
|
-
|
702
|
+
Installer.new.run([])
|
683
703
|
end
|
684
704
|
|
685
705
|
desc "direct uninstall (no gem)"
|
686
706
|
task :uninstall do
|
687
|
-
|
707
|
+
Installer.new.run(["--uninstall"])
|
688
708
|
end
|
689
709
|
end
|
690
710
|
|
691
|
-
def define_debug
|
692
|
-
runner = Class.new do
|
693
|
-
def comment_src_dst(on)
|
694
|
-
on ? ["", "#"] : ["#", ""]
|
695
|
-
end
|
696
|
-
|
697
|
-
def comment_regions(on, contents, start)
|
698
|
-
src, dst = comment_src_dst(on)
|
699
|
-
contents.gsub(%r!^(\s+)#{src}#{start}.*?^\1#{src}(\}|end)!m) { |chunk|
|
700
|
-
indent = $1
|
701
|
-
chunk.gsub(%r!^#{indent}#{src}!, "#{indent}#{dst}")
|
702
|
-
}
|
703
|
-
end
|
704
|
-
|
705
|
-
def comment_lines(on, contents, start)
|
706
|
-
src, dst = comment_src_dst(on)
|
707
|
-
contents.gsub(%r!^(\s*)#{src}#{start}!) {
|
708
|
-
$1 + dst + start
|
709
|
-
}
|
710
|
-
end
|
711
|
-
|
712
|
-
def debug_info(enable)
|
713
|
-
require 'find'
|
714
|
-
Find.find("lib", "test") { |path|
|
715
|
-
if path =~ %r!\.rb\Z!
|
716
|
-
replace_file(path) { |contents|
|
717
|
-
result = comment_regions(!enable, contents, "debug")
|
718
|
-
comment_lines(!enable, result, "trace")
|
719
|
-
}
|
720
|
-
end
|
721
|
-
}
|
722
|
-
end
|
723
|
-
end
|
724
|
-
|
725
|
-
desc "enable debug and trace calls"
|
726
|
-
task :debug_on do
|
727
|
-
runner.new.debug_info(true)
|
728
|
-
end
|
729
|
-
|
730
|
-
desc "disable debug and trace calls"
|
731
|
-
task :debug_off do
|
732
|
-
runner.new.debug_info(false)
|
733
|
-
end
|
734
|
-
end
|
735
|
-
|
736
|
-
def define_columns
|
737
|
-
desc "check for columns > 80"
|
738
|
-
task :check_columns do
|
739
|
-
Dir["**/*.rb"].each { |file|
|
740
|
-
File.read(file).scan(%r!^.{81}!) { |match|
|
741
|
-
unless match =~ %r!http://!
|
742
|
-
raise "#{file} greater than 80 columns: #{match}"
|
743
|
-
end
|
744
|
-
}
|
745
|
-
}
|
746
|
-
end
|
747
|
-
task :prerelease => :check_columns
|
748
|
-
end
|
749
|
-
|
750
|
-
def define_comments
|
751
|
-
task :comments do
|
752
|
-
file = "comments.txt"
|
753
|
-
write_file(file) {
|
754
|
-
result = Array.new
|
755
|
-
(["Rakefile"] + Dir["**/*.{rb,rake}"]).each { |f|
|
756
|
-
File.read(f).scan(%r!\#[^\{].*$!) { |match|
|
757
|
-
result << match
|
758
|
-
}
|
759
|
-
}
|
760
|
-
result.join("\n")
|
761
|
-
}
|
762
|
-
CLEAN.include file
|
763
|
-
end
|
764
|
-
end
|
765
|
-
|
766
711
|
def define_check_directory
|
767
712
|
task :check_directory do
|
768
713
|
unless `git status` =~ %r!nothing to commit \(working directory clean\)!
|
769
|
-
raise "
|
714
|
+
raise "directory not clean"
|
770
715
|
end
|
771
716
|
end
|
772
717
|
end
|
@@ -774,9 +719,9 @@ class Jumpstart
|
|
774
719
|
def define_ping
|
775
720
|
task :ping do
|
776
721
|
require 'rbconfig'
|
777
|
-
%w[github.com
|
722
|
+
%w[github.com].each { |server|
|
778
723
|
cmd = "ping " + (
|
779
|
-
if
|
724
|
+
if RbConfig::CONFIG["host"] =~ %r!darwin!
|
780
725
|
"-c2 #{server}"
|
781
726
|
else
|
782
727
|
"#{server} 2 2"
|
@@ -789,24 +734,45 @@ class Jumpstart
|
|
789
734
|
end
|
790
735
|
end
|
791
736
|
|
792
|
-
def
|
793
|
-
url = ENV["
|
794
|
-
|
795
|
-
|
796
|
-
|
797
|
-
|
798
|
-
|
799
|
-
|
800
|
-
|
801
|
-
|
802
|
-
|
803
|
-
|
804
|
-
|
737
|
+
def define_update_levitate
|
738
|
+
url = ENV["LEVITATE"] ||
|
739
|
+
"https://github.com/quix/levitate/raw/master/levitate.rb"
|
740
|
+
task :update_levitate do
|
741
|
+
if system "curl", "-s", "-o", __FILE__, url
|
742
|
+
if `git diff #{__FILE__}` == ""
|
743
|
+
puts "Already up-to-date."
|
744
|
+
else
|
745
|
+
git "commit", __FILE__, "-m", "updated levitate"
|
746
|
+
puts "Updated levitate."
|
747
|
+
end
|
748
|
+
else
|
749
|
+
raise "levitate download failed"
|
750
|
+
end
|
805
751
|
end
|
806
752
|
end
|
807
753
|
|
754
|
+
def define_changes
|
755
|
+
task :changes do
|
756
|
+
header = "\n\n== Version ____\n\n"
|
757
|
+
|
758
|
+
bullets = `git log --format=%s #{last_release}..HEAD`.lines.map { |line|
|
759
|
+
"* #{line}"
|
760
|
+
}.join.chomp
|
761
|
+
|
762
|
+
write_file(history_file) do
|
763
|
+
File.read(history_file).sub(/(?<=#{gem_name} Changes)/) {
|
764
|
+
header + bullets
|
765
|
+
}
|
766
|
+
end
|
767
|
+
end
|
768
|
+
end
|
769
|
+
|
770
|
+
def last_release
|
771
|
+
`git tag`.lines.select { |t| t.index(gem_name) == 0 }.last.chomp
|
772
|
+
end
|
773
|
+
|
808
774
|
def git(*args)
|
809
|
-
sh
|
775
|
+
sh "git", *args
|
810
776
|
end
|
811
777
|
|
812
778
|
def create_manifest
|
@@ -815,38 +781,16 @@ class Jumpstart
|
|
815
781
|
}
|
816
782
|
end
|
817
783
|
|
818
|
-
def rubyforge(mode, file, *options)
|
819
|
-
command = ["rubyforge", mode] + options + [
|
820
|
-
rubyforge_name,
|
821
|
-
rubyforge_name,
|
822
|
-
version.to_s,
|
823
|
-
file,
|
824
|
-
]
|
825
|
-
sh(*command)
|
826
|
-
end
|
827
|
-
|
828
784
|
def define_release
|
829
785
|
task :prerelease => [:clean, :check_directory, :ping, history_file]
|
830
786
|
|
831
787
|
task :finish_release do
|
832
|
-
|
833
|
-
|
834
|
-
|
835
|
-
md5
|
836
|
-
}
|
837
|
-
|
838
|
-
rubyforge(
|
839
|
-
"add_release", gem, "--release_changes", history_file, "--preformatted"
|
840
|
-
)
|
841
|
-
[gem_md5, tgz, tgz_md5].each { |file|
|
842
|
-
rubyforge("add_file", file)
|
843
|
-
}
|
844
|
-
|
845
|
-
git("tag", "#{name}-" + version.to_s)
|
846
|
-
git(*%w(push --tags origin master))
|
788
|
+
git "tag", "#{gem_name}-" + version.to_s
|
789
|
+
git "push", "--tags", "origin", "master"
|
790
|
+
sh "gem", "push", gem
|
847
791
|
end
|
848
792
|
|
849
|
-
task :release => [:prerelease, :package, :
|
793
|
+
task :release => [:prerelease, :package, :finish_release]
|
850
794
|
end
|
851
795
|
|
852
796
|
def define_debug_gem
|
@@ -859,6 +803,26 @@ class Jumpstart
|
|
859
803
|
sh(*([browser].flatten + files))
|
860
804
|
end
|
861
805
|
|
806
|
+
def suppress_task_warnings(*task_names)
|
807
|
+
task_names.each { |task_name|
|
808
|
+
Rake::Task[task_name].actions.map! { |action|
|
809
|
+
lambda { |*args|
|
810
|
+
Ruby.no_warnings {
|
811
|
+
action.call(*args)
|
812
|
+
}
|
813
|
+
}
|
814
|
+
}
|
815
|
+
}
|
816
|
+
end
|
817
|
+
|
818
|
+
def ruby_18?
|
819
|
+
RUBY_VERSION =~ %r!\A1\.8!
|
820
|
+
end
|
821
|
+
|
822
|
+
def source_control?
|
823
|
+
File.directory? ".git"
|
824
|
+
end
|
825
|
+
|
862
826
|
class << self
|
863
827
|
include Util
|
864
828
|
include InstanceEvalWithArgs
|
@@ -883,12 +847,11 @@ class Jumpstart
|
|
883
847
|
lib = File.expand_path(File.dirname(__FILE__) + "/../lib")
|
884
848
|
header = %{
|
885
849
|
$LOAD_PATH.unshift "#{lib}"
|
886
|
-
require 'rubygems'
|
887
850
|
begin
|
888
851
|
}
|
889
852
|
footer = %{
|
890
|
-
rescue Exception =>
|
891
|
-
puts "raises \#{
|
853
|
+
rescue Exception => __levitate_exception
|
854
|
+
puts "raises \#{__levitate_exception.class}"
|
892
855
|
end
|
893
856
|
}
|
894
857
|
final_code = header + code + footer
|
@@ -931,15 +894,15 @@ class Jumpstart
|
|
931
894
|
end
|
932
895
|
|
933
896
|
def doc_to_spec(file, *sections, &block)
|
934
|
-
|
897
|
+
levitate = self
|
935
898
|
describe file do
|
936
899
|
sections.each { |section|
|
937
900
|
describe "section `#{section}'" do
|
938
901
|
it "should run as claimed" do
|
939
902
|
if block
|
940
|
-
|
903
|
+
levitate.run_doc_section(file, section, self, &block)
|
941
904
|
else
|
942
|
-
|
905
|
+
levitate.run_doc_section(file, section, self) {
|
943
906
|
|expected, actual, index|
|
944
907
|
actual.should == expected
|
945
908
|
}
|
@@ -951,14 +914,14 @@ class Jumpstart
|
|
951
914
|
end
|
952
915
|
|
953
916
|
def doc_to_test(file, *sections, &block)
|
954
|
-
|
955
|
-
klass = Class.new
|
917
|
+
levitate = self
|
918
|
+
klass = Class.new MiniTest::Unit::TestCase do
|
956
919
|
sections.each { |section|
|
957
920
|
define_method "test_#{file}_#{section}" do
|
958
921
|
if block
|
959
|
-
|
922
|
+
levitate.run_doc_section(file, section, self, &block)
|
960
923
|
else
|
961
|
-
|
924
|
+
levitate.run_doc_section(file, section, self) {
|
962
925
|
|expected, actual, index|
|
963
926
|
assert_equal expected, actual
|
964
927
|
}
|