spork 0.7.8 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ext/mkrf_conf.rb +19 -0
- data/geminstaller.yml +1 -0
- data/lib/spork/run_strategy.rb +5 -1
- data/lib/spork/run_strategy/magazine.rb +114 -0
- data/lib/spork/run_strategy/magazine/magazine_slave.rb +30 -0
- data/lib/spork/run_strategy/magazine/magazine_slave_provider.rb +27 -0
- data/lib/spork/run_strategy/magazine/ring_server.rb +10 -0
- data/lib/spork/server.rb +1 -1
- metadata +28 -38
data/ext/mkrf_conf.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rubygems/command.rb'
|
3
|
+
require 'rubygems/dependency_installer.rb'
|
4
|
+
STDERR.puts "Actually, there aren't any native extensions. I'm just dynamically installing dependencies based off of your operating system"
|
5
|
+
begin
|
6
|
+
Gem::Command.build_args = ARGV
|
7
|
+
rescue NoMethodError
|
8
|
+
end
|
9
|
+
inst = Gem::DependencyInstaller.new
|
10
|
+
begin
|
11
|
+
inst.install "rake"
|
12
|
+
inst.install "win32-process", "~> 0.6.1" if RUBY_PLATFORM =~ /mswin|mingw/
|
13
|
+
rescue
|
14
|
+
exit(1)
|
15
|
+
end
|
16
|
+
|
17
|
+
f = File.open(File.join(File.dirname(__FILE__), "Rakefile"), "w") # create dummy rakefile to indicate success
|
18
|
+
f.write("task :default\n")
|
19
|
+
f.close
|
data/geminstaller.yml
CHANGED
data/lib/spork/run_strategy.rb
CHANGED
@@ -28,7 +28,11 @@ class Spork::RunStrategy
|
|
28
28
|
|
29
29
|
protected
|
30
30
|
def self.factory(test_framework)
|
31
|
-
|
31
|
+
if RUBY_PLATFORM =~ /mswin|mingw/
|
32
|
+
Spork::RunStrategy::Magazine.new(test_framework)
|
33
|
+
else
|
34
|
+
Spork::RunStrategy::Forking.new(test_framework)
|
35
|
+
end
|
32
36
|
end
|
33
37
|
|
34
38
|
def self.inherited(subclass)
|
@@ -0,0 +1,114 @@
|
|
1
|
+
# this class' goal:
|
2
|
+
# to boldly just run test after test
|
3
|
+
# as they come in
|
4
|
+
require 'drb'
|
5
|
+
require 'rinda/ring'
|
6
|
+
require 'win32/process' if RUBY_PLATFORM =~ /mswin|mingw/
|
7
|
+
|
8
|
+
$:.unshift(File.dirname(__FILE__))
|
9
|
+
require 'magazine/magazine_slave'
|
10
|
+
|
11
|
+
|
12
|
+
class Spork::RunStrategy::Magazine < Spork::RunStrategy
|
13
|
+
|
14
|
+
Slave_Id_Range = 1..2 # Ringserver uses id: 0. Slave use: 1..MAX_SLAVES
|
15
|
+
|
16
|
+
def slave_max
|
17
|
+
Slave_Id_Range.to_a.size
|
18
|
+
end
|
19
|
+
|
20
|
+
def initialize(test_framework)
|
21
|
+
@test_framework = test_framework
|
22
|
+
this_path = File.expand_path(File.dirname(__FILE__))
|
23
|
+
@path = File.join(this_path, 'magazine')
|
24
|
+
@pids = []
|
25
|
+
|
26
|
+
@pids << start_Rinda_ringserver
|
27
|
+
sleep 1
|
28
|
+
|
29
|
+
fill_slave_pool
|
30
|
+
rescue RuntimeError => e
|
31
|
+
kill_all_processes
|
32
|
+
raise e
|
33
|
+
end
|
34
|
+
|
35
|
+
def start_Rinda_ringserver
|
36
|
+
app_name = 'ruby ring_server.rb'
|
37
|
+
Process.create( :app_name => app_name, :cwd => @path ).process_id
|
38
|
+
end
|
39
|
+
|
40
|
+
def fill_slave_pool
|
41
|
+
Slave_Id_Range.each do |id|
|
42
|
+
start_slave(id)
|
43
|
+
end
|
44
|
+
puts " -- Starting to fill pool..."
|
45
|
+
puts " Wait until at least one slave is provided before running tests..."
|
46
|
+
puts " ** CTRL+BREAK to stop Spork and kill all ruby slave processes **"
|
47
|
+
$stdout.flush
|
48
|
+
end
|
49
|
+
|
50
|
+
def start_slave(id)
|
51
|
+
app_pwd = Dir.pwd # path running app in
|
52
|
+
app = "ruby magazine_slave_provider.rb #{id} #{app_pwd} #{@test_framework.short_name}"
|
53
|
+
@pids[id] = Process.create( :app_name => app, :cwd => @path ).process_id
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
def self.available?
|
58
|
+
true
|
59
|
+
end
|
60
|
+
|
61
|
+
def run(argv, stderr, stdout)
|
62
|
+
DRb.start_service
|
63
|
+
ts = Rinda::RingFinger.primary
|
64
|
+
if ts.read_all([:name, :MagazineSlave, nil, nil]).size > 0
|
65
|
+
print ' <-- take tuple'; stdout.flush
|
66
|
+
tuple = ts.take([:name, :MagazineSlave, nil, nil])
|
67
|
+
slave = tuple[2]
|
68
|
+
id = tuple[3]
|
69
|
+
|
70
|
+
puts "(#{slave.id_num}); slave.run..."; $stdout.flush
|
71
|
+
begin
|
72
|
+
slave.run(argv,stderr,stdout)
|
73
|
+
puts " -- (#{slave.id_num});run done"; $stdout.flush
|
74
|
+
ensure
|
75
|
+
restart_slave(id)
|
76
|
+
end
|
77
|
+
else
|
78
|
+
puts '- NO tuple'; $stdout.flush
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def restart_slave(id)
|
83
|
+
pid = @pids[id]
|
84
|
+
Process.kill(4, pid)
|
85
|
+
start_slave(id)
|
86
|
+
end
|
87
|
+
|
88
|
+
def kill_all_processes
|
89
|
+
|
90
|
+
@pids.each {|pid| Process.kill(4, pid)}
|
91
|
+
puts "\nKilling processes."; $stdout.flush
|
92
|
+
end
|
93
|
+
|
94
|
+
def slave_count
|
95
|
+
DRb.start_service
|
96
|
+
ts = Rinda::RingFinger.primary
|
97
|
+
ts.read_all([:name, :MagazineSlave, nil, nil]).size
|
98
|
+
end
|
99
|
+
|
100
|
+
|
101
|
+
def abort
|
102
|
+
kill_all_processes
|
103
|
+
end
|
104
|
+
|
105
|
+
def preload
|
106
|
+
true
|
107
|
+
# @test_framework.preload
|
108
|
+
end
|
109
|
+
|
110
|
+
def running?
|
111
|
+
@running
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'drb'
|
3
|
+
$:.unshift(File.dirname(__FILE__) + "/../../..") # directory of spork.rb
|
4
|
+
require 'spork'
|
5
|
+
|
6
|
+
class MagazineSlave
|
7
|
+
include DRb::DRbUndumped
|
8
|
+
attr_reader :id_num
|
9
|
+
def initialize(id_num, test_framework_short_name)
|
10
|
+
@id_num = id_num
|
11
|
+
@test_framework = Spork::TestFramework.factory(STDOUT, STDERR,
|
12
|
+
test_framework_short_name)
|
13
|
+
# ENV["DRB"] = 'true'
|
14
|
+
# Spork.using_spork!
|
15
|
+
return(nil) unless preload
|
16
|
+
end
|
17
|
+
|
18
|
+
def run(argv, stderr, stdout)
|
19
|
+
$stdout, $stderr = stdout, stderr
|
20
|
+
Spork.exec_each_run
|
21
|
+
load @test_framework.helper_file
|
22
|
+
@test_framework.run_tests(argv, stderr, stdout)
|
23
|
+
puts " <-- Slave(#{@id_num}) run done!"; stdout.flush
|
24
|
+
end
|
25
|
+
|
26
|
+
def preload
|
27
|
+
@test_framework.preload
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# magazine_slave_provider.rb
|
2
|
+
require 'drb'
|
3
|
+
require 'rinda/ring'
|
4
|
+
require 'rinda/tuplespace'
|
5
|
+
require 'magazine_slave'
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
# pass on
|
10
|
+
|
11
|
+
id = ARGV[0].to_i || "?"
|
12
|
+
app_pwd = ARGV[1]
|
13
|
+
test_framework_short_name = ARGV[2]
|
14
|
+
|
15
|
+
# start up the Rinda service
|
16
|
+
|
17
|
+
DRb.start_service
|
18
|
+
|
19
|
+
Dir.chdir app_pwd
|
20
|
+
puts " -- build slave #{id}..."; $stdout.flush
|
21
|
+
magazine_slave = MagazineSlave.new(id, test_framework_short_name )
|
22
|
+
Rinda::RingProvider.new(:MagazineSlave, magazine_slave, id).provide
|
23
|
+
|
24
|
+
puts " --> DRb magazine_slave_service: #{id} provided..."; $stdout.flush
|
25
|
+
|
26
|
+
# wait for the DRb service to finish before exiting
|
27
|
+
DRb.thread.join
|
data/lib/spork/server.rb
CHANGED
@@ -27,7 +27,7 @@ class Spork::Server
|
|
27
27
|
trap("SIGTERM") { abort; exit!(0) }
|
28
28
|
trap("USR2") { abort; restart } if Signal.list.has_key?("USR2")
|
29
29
|
@drb_service = DRb.start_service("druby://127.0.0.1:#{port}", self)
|
30
|
-
Spork.each_run { @drb_service.stop_service }
|
30
|
+
Spork.each_run { @drb_service.stop_service } if @run_strategy.class == Spork::RunStrategy::Forking
|
31
31
|
stderr.puts "Spork is ready and listening on #{port}!"
|
32
32
|
stderr.flush
|
33
33
|
DRb.thread.join
|
metadata
CHANGED
@@ -1,15 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spork
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tim Harper
|
8
|
+
- Donald Parish
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
12
|
|
12
|
-
date: 2010-03-
|
13
|
+
date: 2010-03-04 00:00:00 -07:00
|
13
14
|
default_executable: spork
|
14
15
|
dependencies: []
|
15
16
|
|
@@ -18,62 +19,39 @@ email:
|
|
18
19
|
- timcharper+spork@gmail.com
|
19
20
|
executables:
|
20
21
|
- spork
|
21
|
-
extensions:
|
22
|
-
|
22
|
+
extensions:
|
23
|
+
- ext/mkrf_conf.rb
|
23
24
|
extra_rdoc_files:
|
24
25
|
- MIT-LICENSE
|
25
26
|
- README.rdoc
|
26
27
|
files:
|
27
|
-
- MIT-LICENSE
|
28
|
-
- README.rdoc
|
29
|
-
- assets/bootstrap.rb
|
30
|
-
- features/at_exit_during_each_run.feature
|
31
|
-
- features/cucumber_rails_integration.feature
|
32
|
-
- features/diagnostic_mode.feature
|
33
|
-
- features/rails_delayed_loading_workarounds.feature
|
34
|
-
- features/rspec_rails_integration.feature
|
35
|
-
- features/spork_debugger.feature
|
36
|
-
- features/steps/general_steps.rb
|
37
|
-
- features/steps/rails_steps.rb
|
38
|
-
- features/steps/sandbox_steps.rb
|
39
|
-
- features/support/background_job.rb
|
40
|
-
- features/support/env.rb
|
41
|
-
- features/unknown_app_framework.feature
|
42
28
|
- geminstaller.yml
|
43
|
-
-
|
44
|
-
-
|
29
|
+
- README.rdoc
|
30
|
+
- MIT-LICENSE
|
45
31
|
- lib/spork/app_framework/rails.rb
|
46
32
|
- lib/spork/app_framework/rails_stub_files/application.rb
|
47
33
|
- lib/spork/app_framework/rails_stub_files/application_controller.rb
|
48
34
|
- lib/spork/app_framework/rails_stub_files/application_helper.rb
|
49
35
|
- lib/spork/app_framework/unknown.rb
|
36
|
+
- lib/spork/app_framework.rb
|
50
37
|
- lib/spork/custom_io_streams.rb
|
51
38
|
- lib/spork/diagnoser.rb
|
52
39
|
- lib/spork/ext/rails-reloader.rb
|
53
40
|
- lib/spork/ext/ruby-debug.rb
|
54
41
|
- lib/spork/forker.rb
|
55
|
-
- lib/spork/run_strategy.rb
|
56
42
|
- lib/spork/run_strategy/forking.rb
|
43
|
+
- lib/spork/run_strategy/magazine/magazine_slave.rb
|
44
|
+
- lib/spork/run_strategy/magazine/magazine_slave_provider.rb
|
45
|
+
- lib/spork/run_strategy/magazine/ring_server.rb
|
46
|
+
- lib/spork/run_strategy/magazine.rb
|
47
|
+
- lib/spork/run_strategy.rb
|
57
48
|
- lib/spork/runner.rb
|
58
49
|
- lib/spork/server.rb
|
59
|
-
- lib/spork/test_framework.rb
|
60
50
|
- lib/spork/test_framework/cucumber.rb
|
61
51
|
- lib/spork/test_framework/rspec.rb
|
62
|
-
-
|
63
|
-
-
|
64
|
-
-
|
65
|
-
- spec/spork/app_framework_spec.rb
|
66
|
-
- spec/spork/diagnoser_spec.rb
|
67
|
-
- spec/spork/forker_spec.rb
|
68
|
-
- spec/spork/run_strategy/forking_spec.rb
|
69
|
-
- spec/spork/runner_spec.rb
|
70
|
-
- spec/spork/server_spec.rb
|
71
|
-
- spec/spork/test_framework/cucumber_spec.rb
|
72
|
-
- spec/spork/test_framework/rspec_spec.rb
|
73
|
-
- spec/spork/test_framework_spec.rb
|
74
|
-
- spec/spork_spec.rb
|
75
|
-
- spec/support/fake_framework.rb
|
76
|
-
- spec/support/fake_run_strategy.rb
|
52
|
+
- lib/spork/test_framework.rb
|
53
|
+
- lib/spork.rb
|
54
|
+
- assets/bootstrap.rb
|
77
55
|
has_rdoc: true
|
78
56
|
homepage: http://github.com/timcharper/spork
|
79
57
|
licenses: []
|
@@ -104,6 +82,18 @@ signing_key:
|
|
104
82
|
specification_version: 3
|
105
83
|
summary: spork
|
106
84
|
test_files:
|
85
|
+
- features/at_exit_during_each_run.feature
|
86
|
+
- features/cucumber_rails_integration.feature
|
87
|
+
- features/diagnostic_mode.feature
|
88
|
+
- features/rails_delayed_loading_workarounds.feature
|
89
|
+
- features/rspec_rails_integration.feature
|
90
|
+
- features/spork_debugger.feature
|
91
|
+
- features/steps/general_steps.rb
|
92
|
+
- features/steps/rails_steps.rb
|
93
|
+
- features/steps/sandbox_steps.rb
|
94
|
+
- features/support/background_job.rb
|
95
|
+
- features/support/env.rb
|
96
|
+
- features/unknown_app_framework.feature
|
107
97
|
- spec/spec_helper.rb
|
108
98
|
- spec/spork/app_framework/rails_spec.rb
|
109
99
|
- spec/spork/app_framework/unknown_spec.rb
|