spork 0.4.2 → 0.4.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/lib/spork.rb +18 -6
- data/lib/spork/forker.rb +54 -0
- data/lib/spork/server.rb +7 -12
- data/lib/spork/server/cucumber.rb +15 -11
- data/spec/spec_helper.rb +0 -29
- data/spec/spork/forker_spec.rb +36 -0
- data/spec/spork/server/rspec_spec.rb +6 -2
- data/spec/spork/server_spec.rb +8 -1
- data/spec/spork_spec.rb +11 -0
- metadata +5 -2
data/lib/spork.rb
CHANGED
@@ -1,17 +1,23 @@
|
|
1
1
|
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__))) unless $LOAD_PATH.include?(File.expand_path(File.dirname(__FILE__)))
|
2
2
|
module Spork
|
3
|
-
SPEC_HELPER_FILE = File.join(Dir.pwd, "spec/spec_helper.rb")
|
4
|
-
|
5
3
|
class << self
|
4
|
+
def already_preforked
|
5
|
+
@already_preforked ||= []
|
6
|
+
end
|
7
|
+
|
8
|
+
def already_run
|
9
|
+
@already_run ||= []
|
10
|
+
end
|
11
|
+
|
6
12
|
def prefork(&block)
|
7
|
-
return if
|
8
|
-
|
13
|
+
return if already_preforked.include?(expanded_caller(caller.first))
|
14
|
+
already_preforked << expanded_caller(caller.first)
|
9
15
|
yield
|
10
16
|
end
|
11
17
|
|
12
18
|
def each_run(&block)
|
13
|
-
return if @state == :preforking || (@state != :not_using_spork &&
|
14
|
-
|
19
|
+
return if @state == :preforking || (@state != :not_using_spork && already_run.include?(expanded_caller(caller.first)))
|
20
|
+
already_run << expanded_caller(caller.first)
|
15
21
|
yield
|
16
22
|
end
|
17
23
|
|
@@ -36,5 +42,11 @@ module Spork
|
|
36
42
|
running!
|
37
43
|
load(helper_file)
|
38
44
|
end
|
45
|
+
|
46
|
+
def expanded_caller(caller_line)
|
47
|
+
file, line = caller_line.split(":")
|
48
|
+
line.gsub(/:.+/, '')
|
49
|
+
File.expand_path(Dir.pwd, file) + ":" + line
|
50
|
+
end
|
39
51
|
end
|
40
52
|
end
|
data/lib/spork/forker.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
class Spork::Forker
|
2
|
+
class ForkDiedException < Exception; end
|
3
|
+
def initialize(&block)
|
4
|
+
return unless block_given?
|
5
|
+
@child_io, @server_io = UNIXSocket.socketpair
|
6
|
+
@child_pid = Kernel.fork do
|
7
|
+
@server_io.close
|
8
|
+
Marshal.dump(yield, @child_io)
|
9
|
+
# wait for the parent to acknowledge receipt of the result.
|
10
|
+
master_response =
|
11
|
+
begin
|
12
|
+
Marshal.load(@child_io)
|
13
|
+
rescue EOFError
|
14
|
+
nil
|
15
|
+
end
|
16
|
+
|
17
|
+
# terminate, skipping any at_exit blocks.
|
18
|
+
exit!(0)
|
19
|
+
end
|
20
|
+
@child_io.close
|
21
|
+
end
|
22
|
+
|
23
|
+
def result
|
24
|
+
return unless running?
|
25
|
+
result_thread = Thread.new do
|
26
|
+
begin
|
27
|
+
@result = Marshal.load(@server_io)
|
28
|
+
Marshal.dump('ACK', @server_io)
|
29
|
+
rescue ForkDiedException
|
30
|
+
@result = nil
|
31
|
+
end
|
32
|
+
end
|
33
|
+
Process.wait(@child_pid)
|
34
|
+
result_thread.raise(ForkDiedException) if @result.nil?
|
35
|
+
@child_pid = nil
|
36
|
+
@result
|
37
|
+
end
|
38
|
+
|
39
|
+
def abort
|
40
|
+
if running?
|
41
|
+
Process.kill(Signal.list['TERM'], @child_pid)
|
42
|
+
@child_pid = nil
|
43
|
+
true
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def running?
|
48
|
+
return false unless @child_pid
|
49
|
+
Process.getpgid(@child_pid)
|
50
|
+
true
|
51
|
+
rescue Errno::ESRCH
|
52
|
+
false
|
53
|
+
end
|
54
|
+
end
|
data/lib/spork/server.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'drb/drb'
|
2
2
|
require 'rbconfig'
|
3
|
+
require 'spork/forker.rb'
|
3
4
|
|
4
5
|
# This is based off of spec_server.rb from rspec-rails (David Chelimsky), which was based on Florian Weber's TDDMate
|
5
6
|
class Spork::Server
|
@@ -93,19 +94,16 @@ class Spork::Server
|
|
93
94
|
|
94
95
|
def run(argv, stderr, stdout)
|
95
96
|
return false if running?
|
96
|
-
|
97
|
-
|
98
|
-
@child_pid = Kernel.fork do
|
97
|
+
@child = ::Spork::Forker.new do
|
98
|
+
$stdout, $stderr = stdout, stderr
|
99
99
|
Spork.exec_each_run(helper_file)
|
100
100
|
run_tests(argv, stderr, stdout)
|
101
101
|
end
|
102
|
-
|
103
|
-
@child_pid = nil
|
104
|
-
true
|
102
|
+
@child.result
|
105
103
|
end
|
106
104
|
|
107
105
|
def running?
|
108
|
-
|
106
|
+
@child && @child.running?
|
109
107
|
end
|
110
108
|
|
111
109
|
private
|
@@ -140,16 +138,13 @@ class Spork::Server
|
|
140
138
|
end
|
141
139
|
|
142
140
|
def abort
|
143
|
-
|
144
|
-
Process.kill(Signal.list['TERM'], @child_pid)
|
145
|
-
true
|
146
|
-
end
|
141
|
+
@child && @child.abort
|
147
142
|
end
|
148
143
|
|
149
144
|
def sig_int_received
|
150
145
|
if running?
|
151
146
|
abort
|
152
|
-
puts "Running
|
147
|
+
puts "Running tests stopped. Press CTRL-C again to stop the server."
|
153
148
|
else
|
154
149
|
exit!(0)
|
155
150
|
end
|
@@ -2,23 +2,27 @@ class Spork::Server::Cucumber < Spork::Server
|
|
2
2
|
CUCUMBER_PORT = 8990
|
3
3
|
CUCUMBER_HELPER_FILE = File.join(Dir.pwd, "features/support/env.rb")
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
5
|
+
class << self
|
6
|
+
def port
|
7
|
+
CUCUMBER_PORT
|
8
|
+
end
|
9
|
+
|
10
|
+
def helper_file
|
11
|
+
CUCUMBER_HELPER_FILE
|
12
|
+
end
|
13
|
+
|
14
|
+
attr_accessor :step_mother
|
11
15
|
end
|
12
16
|
|
13
|
-
def
|
14
|
-
|
17
|
+
def step_mother
|
18
|
+
self.class.step_mother
|
15
19
|
end
|
16
20
|
|
17
21
|
def run_tests(argv, stderr, stdout)
|
18
22
|
require 'cucumber/cli/main'
|
19
|
-
::Cucumber::Cli::Main.step_mother =
|
20
|
-
::Cucumber::Cli::Main.new(argv,
|
23
|
+
::Cucumber::Cli::Main.step_mother = step_mother
|
24
|
+
::Cucumber::Cli::Main.new(argv, stdout, stderr).execute!(step_mother)
|
21
25
|
end
|
22
26
|
end
|
23
27
|
|
24
|
-
Spork::Server::Cucumber.step_mother = self
|
28
|
+
Spork::Server::Cucumber.step_mother = self
|
data/spec/spec_helper.rb
CHANGED
@@ -1,32 +1,3 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'spork'
|
3
|
-
|
4
|
-
Spork.prefork do
|
5
|
-
# Loading more in this block will cause your specs to run faster. However,
|
6
|
-
# if you change any configuration or code from libraries loaded here, you'll
|
7
|
-
# need to restart spork for it take effect.
|
8
|
-
|
9
|
-
end
|
10
|
-
|
11
|
-
Spork.each_run do
|
12
|
-
# This code will be run each time you run your specs.
|
13
|
-
|
14
|
-
end
|
15
|
-
|
16
|
-
# --- Instructions ---
|
17
|
-
# - Sort through your spec_helper file. Place as much environment loading
|
18
|
-
# code that you don't normally modify during development in the
|
19
|
-
# Spork.prefork block.
|
20
|
-
# - Place the rest under Spork.each_run block
|
21
|
-
# - Any code that is left outside of the blocks will be ran during preforking
|
22
|
-
# and during each_run!
|
23
|
-
# - These instructions should self-destruct in 10 seconds. If they don't,
|
24
|
-
# feel free to delete them.
|
25
|
-
#
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
1
|
require 'rubygems'
|
31
2
|
require 'spec'
|
32
3
|
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
|
3
|
+
describe Spork::Forker do
|
4
|
+
it "runs a block in a fork" do
|
5
|
+
@var = "hello world"
|
6
|
+
Spork::Forker.new { @var = "booyah" }.result
|
7
|
+
@var.should == "hello world"
|
8
|
+
end
|
9
|
+
|
10
|
+
it "returns the result" do
|
11
|
+
Spork::Forker.new { "results" }.result.should == "results"
|
12
|
+
end
|
13
|
+
|
14
|
+
it "reports when the fork is running" do
|
15
|
+
forker = Spork::Forker.new { sleep 0.1 }
|
16
|
+
forker.running?.should == true
|
17
|
+
forker.result
|
18
|
+
sleep 0.1
|
19
|
+
forker.running?.should == false
|
20
|
+
end
|
21
|
+
|
22
|
+
it "aborts a fork and returns nil for the result" do
|
23
|
+
started_at = Time.now
|
24
|
+
ended_at = nil
|
25
|
+
forker = Spork::Forker.new { sleep 5 }
|
26
|
+
Thread.new do
|
27
|
+
forker.result.should == nil
|
28
|
+
ended_at = Time.now
|
29
|
+
end
|
30
|
+
sleep 0.5
|
31
|
+
forker.abort
|
32
|
+
sleep 0.1
|
33
|
+
(ended_at - started_at).should be_close(0.5, 0.1)
|
34
|
+
forker.running?.should == false
|
35
|
+
end
|
36
|
+
end
|
@@ -2,10 +2,14 @@ require File.dirname(__FILE__) + '/../../spec_helper'
|
|
2
2
|
|
3
3
|
describe Spork::Server::RSpec do
|
4
4
|
before(:each) do
|
5
|
-
@
|
5
|
+
@server = Spork::Server::RSpec.new
|
6
6
|
end
|
7
7
|
|
8
8
|
it "uses the RSPEC_PORT for it's port" do
|
9
|
-
@
|
9
|
+
@server.port.should == Spork::Server::RSpec::RSPEC_PORT
|
10
|
+
end
|
11
|
+
|
12
|
+
it "uses the RSPEC_HELPER_FILE for it's helper_file" do
|
13
|
+
@server.helper_file.should == Spork::Server::RSpec::RSPEC_HELPER_FILE
|
10
14
|
end
|
11
15
|
end
|
data/spec/spork/server_spec.rb
CHANGED
@@ -20,6 +20,7 @@ class FakeServer < Spork::Server
|
|
20
20
|
|
21
21
|
def run_tests(argv, input, output)
|
22
22
|
sleep(@wait_time || 0.5)
|
23
|
+
true
|
23
24
|
end
|
24
25
|
end
|
25
26
|
|
@@ -119,8 +120,14 @@ describe Spork::Server do
|
|
119
120
|
sleep(0.05)
|
120
121
|
@fake.send(:abort)
|
121
122
|
sleep(0.01) while @fake.running?
|
122
|
-
|
123
|
+
|
123
124
|
(Time.now - started_at).should < @fake.wait_time
|
124
125
|
end
|
126
|
+
|
127
|
+
it "returns the result of the run_tests method from the forked child" do
|
128
|
+
create_helper_file
|
129
|
+
@fake.stub!(:run_tests).and_return("tests were ran")
|
130
|
+
@fake.run("test", STDOUT, STDIN).should == "tests were ran"
|
131
|
+
end
|
125
132
|
end
|
126
133
|
end
|
data/spec/spork_spec.rb
CHANGED
@@ -41,4 +41,15 @@ describe Spork do
|
|
41
41
|
it "runs both blocks when Spork not activated" do
|
42
42
|
spec_helper_simulator.should == [:prefork, :each_run]
|
43
43
|
end
|
44
|
+
|
45
|
+
it "prevents blocks from being ran twice" do
|
46
|
+
spec_helper_simulator.should == [:prefork, :each_run]
|
47
|
+
spec_helper_simulator.should == []
|
48
|
+
end
|
49
|
+
|
50
|
+
it "runs multiple prefork and each_run blocks at different locations" do
|
51
|
+
Spork.prefork { }
|
52
|
+
Spork.each_run { }
|
53
|
+
spec_helper_simulator.should == [:prefork, :each_run]
|
54
|
+
end
|
44
55
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spork
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tim Harper
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-06-01 00:00:00 -06:00
|
13
13
|
default_executable: spork
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -28,11 +28,13 @@ files:
|
|
28
28
|
- README.rdoc
|
29
29
|
- assets/bootstrap.rb
|
30
30
|
- lib/spork.rb
|
31
|
+
- lib/spork/forker.rb
|
31
32
|
- lib/spork/runner.rb
|
32
33
|
- lib/spork/server.rb
|
33
34
|
- lib/spork/server/cucumber.rb
|
34
35
|
- lib/spork/server/rspec.rb
|
35
36
|
- spec/spec_helper.rb
|
37
|
+
- spec/spork/forker_spec.rb
|
36
38
|
- spec/spork/runner_spec.rb
|
37
39
|
- spec/spork/server/rspec_spec.rb
|
38
40
|
- spec/spork/server_spec.rb
|
@@ -66,6 +68,7 @@ specification_version: 2
|
|
66
68
|
summary: spork
|
67
69
|
test_files:
|
68
70
|
- spec/spec_helper.rb
|
71
|
+
- spec/spork/forker_spec.rb
|
69
72
|
- spec/spork/runner_spec.rb
|
70
73
|
- spec/spork/server/rspec_spec.rb
|
71
74
|
- spec/spork/server_spec.rb
|