spork 0.5.11 → 0.6.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/features/steps/general_steps.rb +3 -0
- data/lib/spork.rb +7 -1
- data/lib/spork/run_strategy.rb +40 -0
- data/lib/spork/run_strategy/forking.rb +30 -0
- data/lib/spork/runner.rb +4 -2
- data/lib/spork/server.rb +5 -26
- data/lib/spork/test_framework.rb +5 -1
- data/spec/spec_helper.rb +0 -30
- data/spec/spork/run_strategy/forking_spec.rb +38 -0
- data/spec/spork/server_spec.rb +2 -38
- data/spec/support/fake_run_strategy.rb +21 -0
- metadata +8 -2
data/lib/spork.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
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
3
|
BINARY = File.expand_path(File.dirname(__FILE__) + '/../bin/spork')
|
4
|
-
LIBDIR = File.expand_path(File.dirname(__FILE__))
|
4
|
+
LIBDIR = File.expand_path("..", File.dirname(__FILE__))
|
5
5
|
|
6
6
|
class << self
|
7
7
|
# Run a block, during prefork mode. By default, if prefork is called twice in the same file and line number, the supplied block will only be ran once.
|
@@ -70,6 +70,12 @@ module Spork
|
|
70
70
|
trap_method((class << klass; self; end), method_name)
|
71
71
|
end
|
72
72
|
|
73
|
+
def detect_and_require(subfolder)
|
74
|
+
([LIBDIR] + Gem.latest_load_paths.grep(/spork/)).uniq.each do |gem_path|
|
75
|
+
Dir.glob(File.join(gem_path, subfolder)).each { |file| require file }
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
73
79
|
private
|
74
80
|
def alias_method_names(method_name, feature)
|
75
81
|
/^(.+?)([\?\!]{0,1})$/.match(method_name.to_s)
|
@@ -0,0 +1,40 @@
|
|
1
|
+
class Spork::RunStrategy
|
2
|
+
attr_reader :test_framework
|
3
|
+
@@run_strategies = []
|
4
|
+
|
5
|
+
def initialize(test_framework)
|
6
|
+
@test_framework = test_framework
|
7
|
+
end
|
8
|
+
|
9
|
+
def preload
|
10
|
+
raise NotImplementedError
|
11
|
+
end
|
12
|
+
|
13
|
+
def run(argv, input, output)
|
14
|
+
raise NotImplementedError
|
15
|
+
end
|
16
|
+
|
17
|
+
def cleanup
|
18
|
+
raise NotImplementedError
|
19
|
+
end
|
20
|
+
|
21
|
+
def running?
|
22
|
+
raise NotImplementedError
|
23
|
+
end
|
24
|
+
|
25
|
+
def abort
|
26
|
+
raise NotImplementedError
|
27
|
+
end
|
28
|
+
|
29
|
+
protected
|
30
|
+
def self.factory(test_framework)
|
31
|
+
Spork::RunStrategy::Forking.new(test_framework)
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.inherited(subclass)
|
35
|
+
@@run_strategies << subclass
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
Dir[File.dirname(__FILE__) + "/run_strategy/*.rb"].each { |file| require file }
|
@@ -0,0 +1,30 @@
|
|
1
|
+
class Spork::RunStrategy::Forking < Spork::RunStrategy
|
2
|
+
def self.available?
|
3
|
+
Kernel.respond_to?(:fork)
|
4
|
+
end
|
5
|
+
|
6
|
+
def run(argv, stderr, stdout)
|
7
|
+
abort if running?
|
8
|
+
|
9
|
+
@child = ::Spork::Forker.new do
|
10
|
+
$stdout, $stderr = stdout, stderr
|
11
|
+
load test_framework.helper_file
|
12
|
+
Spork.exec_each_run
|
13
|
+
test_framework.run_tests(argv, stderr, stdout)
|
14
|
+
end
|
15
|
+
@child.result
|
16
|
+
end
|
17
|
+
|
18
|
+
def abort
|
19
|
+
@child && @child.abort
|
20
|
+
end
|
21
|
+
|
22
|
+
def preload
|
23
|
+
test_framework.preload
|
24
|
+
end
|
25
|
+
|
26
|
+
def running?
|
27
|
+
@child && @child.running?
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
data/lib/spork/runner.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'optparse'
|
2
2
|
require 'spork/server'
|
3
3
|
require 'spork/test_framework'
|
4
|
+
require 'spork/run_strategy'
|
4
5
|
|
5
6
|
module Spork
|
6
7
|
# This is used by bin/spork. It's wrapped in a class because it's easier to test that way.
|
@@ -71,8 +72,9 @@ module Spork
|
|
71
72
|
Spork::Diagnoser.output_results(@output)
|
72
73
|
return true
|
73
74
|
else
|
74
|
-
|
75
|
-
|
75
|
+
run_strategy = Spork::RunStrategy.factory(test_framework)
|
76
|
+
return(false) unless run_strategy.preload
|
77
|
+
Spork::Server.run(:port => @options[:port] || test_framework.default_port, :run_strategy => run_strategy)
|
76
78
|
return true
|
77
79
|
end
|
78
80
|
end
|
data/lib/spork/server.rb
CHANGED
@@ -8,11 +8,11 @@ require 'spork/app_framework.rb'
|
|
8
8
|
#
|
9
9
|
# (This was originally based off of spec_server.rb from rspec-rails (David Chelimsky), which was based on Florian Weber's TDDMate)
|
10
10
|
class Spork::Server
|
11
|
-
attr_reader :
|
11
|
+
attr_reader :run_strategy
|
12
12
|
include Spork::CustomIOStreams
|
13
13
|
|
14
14
|
def initialize(options = {})
|
15
|
-
@
|
15
|
+
@run_strategy = options[:run_strategy]
|
16
16
|
@port = options[:port]
|
17
17
|
end
|
18
18
|
|
@@ -31,11 +31,7 @@ class Spork::Server
|
|
31
31
|
DRb.thread.join
|
32
32
|
end
|
33
33
|
|
34
|
-
|
35
|
-
|
36
|
-
def port
|
37
|
-
@port || test_framework.class.default_port
|
38
|
-
end
|
34
|
+
attr_accessor :port
|
39
35
|
|
40
36
|
# This is the public facing method that is served up by DRb. To use it from the client side (in a testing framework):
|
41
37
|
#
|
@@ -46,20 +42,7 @@ class Spork::Server
|
|
46
42
|
#
|
47
43
|
# When implementing a test server, don't override this method: override run_tests instead.
|
48
44
|
def run(argv, stderr, stdout)
|
49
|
-
|
50
|
-
|
51
|
-
@child = ::Spork::Forker.new do
|
52
|
-
$stdout, $stderr = stdout, stderr
|
53
|
-
load test_framework.helper_file
|
54
|
-
Spork.exec_each_run
|
55
|
-
test_framework.run_tests(argv, stderr, stdout)
|
56
|
-
end
|
57
|
-
@child.result
|
58
|
-
end
|
59
|
-
|
60
|
-
# returns whether or not the child (a test run) is running right now.
|
61
|
-
def running?
|
62
|
-
@child && @child.running?
|
45
|
+
run_strategy.run(argv, stderr, stdout)
|
63
46
|
end
|
64
47
|
|
65
48
|
private
|
@@ -72,12 +55,8 @@ class Spork::Server
|
|
72
55
|
exec(command_line)
|
73
56
|
end
|
74
57
|
|
75
|
-
def abort
|
76
|
-
@child && @child.abort
|
77
|
-
end
|
78
|
-
|
79
58
|
def sig_int_received
|
80
|
-
if running?
|
59
|
+
if run_strategy.running?
|
81
60
|
abort
|
82
61
|
stderr.puts "Running tests stopped. Press CTRL-C again to stop the server."
|
83
62
|
stderr.flush
|
data/lib/spork/test_framework.rb
CHANGED
@@ -150,6 +150,10 @@ class Spork::TestFramework
|
|
150
150
|
bootstrapped? ? helper_file : framework.entry_point
|
151
151
|
end
|
152
152
|
|
153
|
+
def default_port
|
154
|
+
self.class.default_port
|
155
|
+
end
|
156
|
+
|
153
157
|
protected
|
154
158
|
def self.inherited(subclass)
|
155
159
|
@@supported_test_frameworks << subclass
|
@@ -160,4 +164,4 @@ class Spork::TestFramework
|
|
160
164
|
end
|
161
165
|
end
|
162
166
|
|
163
|
-
|
167
|
+
Spork.detect_and_require('spork/test_framework/*.rb')
|
data/spec/spec_helper.rb
CHANGED
@@ -1,34 +1,4 @@
|
|
1
1
|
require 'rubygems'
|
2
|
-
require 'spork'
|
3
|
-
|
4
|
-
Spork.prefork do
|
5
|
-
# Loading more in this block will cause your tests 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
|
-
require 'rubygems'
|
31
|
-
require 'spec'
|
32
2
|
|
33
3
|
unless $spec_helper_loaded
|
34
4
|
$spec_helper_loaded = true
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
+
|
3
|
+
describe Spork::RunStrategy::Forking do
|
4
|
+
before(:each) do
|
5
|
+
@fake_framework = FakeFramework.new
|
6
|
+
@run_strategy = Spork::RunStrategy::Forking.new(@fake_framework)
|
7
|
+
|
8
|
+
end
|
9
|
+
|
10
|
+
it "returns the result of the run_tests method from the forked child" do
|
11
|
+
create_helper_file
|
12
|
+
@fake_framework.stub!(:run_tests).and_return("tests were ran")
|
13
|
+
@run_strategy.run("test", STDOUT, STDIN).should == "tests were ran"
|
14
|
+
end
|
15
|
+
|
16
|
+
it "aborts the current running thread when another run is started" do
|
17
|
+
create_helper_file
|
18
|
+
@fake_framework.wait_time = 0.25
|
19
|
+
first_run = Thread.new { @run_strategy.run("test", STDOUT, STDIN).should == nil }
|
20
|
+
sleep(0.05)
|
21
|
+
@run_strategy.run("test", STDOUT, STDIN).should == true
|
22
|
+
|
23
|
+
# wait for the first to finish
|
24
|
+
first_run.join
|
25
|
+
end
|
26
|
+
|
27
|
+
it "can abort the current run" do
|
28
|
+
create_helper_file
|
29
|
+
@fake_framework.wait_time = 5
|
30
|
+
started_at = Time.now
|
31
|
+
first_run = Thread.new { @run_strategy.run("test", STDOUT, STDIN).should == true }
|
32
|
+
sleep(0.05)
|
33
|
+
@run_strategy.send(:abort)
|
34
|
+
sleep(0.01) while @run_strategy.running?
|
35
|
+
|
36
|
+
(Time.now - started_at).should < @fake_framework.wait_time
|
37
|
+
end
|
38
|
+
end
|
data/spec/spork/server_spec.rb
CHANGED
@@ -3,49 +3,13 @@ require File.dirname(__FILE__) + '/../spec_helper'
|
|
3
3
|
describe Spork::Server do
|
4
4
|
describe "a fake server" do
|
5
5
|
before(:each) do
|
6
|
-
@
|
7
|
-
@server = Spork::Server.new(:
|
6
|
+
@fake_run_strategy = FakeRunStrategy.new
|
7
|
+
@server = Spork::Server.new(:run_strategy => @fake_run_strategy)
|
8
8
|
end
|
9
|
-
|
10
|
-
it "aborts the current running thread when another run is started" do
|
11
|
-
create_helper_file
|
12
|
-
@fake_framework.wait_time = 0.25
|
13
|
-
first_run = Thread.new { @server.run("test", STDOUT, STDIN).should == nil }
|
14
|
-
sleep(0.05)
|
15
|
-
@server.run("test", STDOUT, STDIN).should == true
|
16
9
|
|
17
|
-
# wait for the first to finish
|
18
|
-
first_run.join
|
19
|
-
end
|
20
|
-
|
21
|
-
it "can abort the current run" do
|
22
|
-
create_helper_file
|
23
|
-
@fake_framework.wait_time = 5
|
24
|
-
started_at = Time.now
|
25
|
-
first_run = Thread.new { @server.run("test", STDOUT, STDIN).should == true }
|
26
|
-
sleep(0.05)
|
27
|
-
@server.send(:abort)
|
28
|
-
sleep(0.01) while @server.running?
|
29
|
-
|
30
|
-
(Time.now - started_at).should < @fake_framework.wait_time
|
31
|
-
end
|
32
|
-
|
33
|
-
it "returns the result of the run_tests method from the forked child" do
|
34
|
-
create_helper_file
|
35
|
-
@fake_framework.stub!(:run_tests).and_return("tests were ran")
|
36
|
-
@server.run("test", STDOUT, STDIN).should == "tests were ran"
|
37
|
-
end
|
38
|
-
|
39
10
|
it "accepts a port" do
|
40
|
-
create_helper_file
|
41
11
|
@server.port = 12345
|
42
12
|
@server.port.should == 12345
|
43
13
|
end
|
44
|
-
|
45
|
-
it "falls back to a default port" do
|
46
|
-
create_helper_file
|
47
|
-
@server.port = nil
|
48
|
-
@server.port.should == FakeFramework.default_port
|
49
|
-
end
|
50
14
|
end
|
51
15
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class FakeRunStrategy < Spork::RunStrategy
|
2
|
+
def initialize(*args)
|
3
|
+
end
|
4
|
+
|
5
|
+
def self.available?
|
6
|
+
true
|
7
|
+
end
|
8
|
+
|
9
|
+
def run(argv, stderr, stdout)
|
10
|
+
sleep(@wait_time || 0.5)
|
11
|
+
true
|
12
|
+
end
|
13
|
+
|
14
|
+
def running?
|
15
|
+
false
|
16
|
+
end
|
17
|
+
|
18
|
+
def preload
|
19
|
+
true
|
20
|
+
end
|
21
|
+
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
|
+
version: 0.6.0
|
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-09-12 00:00:00 -04:00
|
13
13
|
default_executable: spork
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -46,6 +46,8 @@ files:
|
|
46
46
|
- lib/spork/custom_io_streams.rb
|
47
47
|
- lib/spork/diagnoser.rb
|
48
48
|
- lib/spork/forker.rb
|
49
|
+
- lib/spork/run_strategy.rb
|
50
|
+
- lib/spork/run_strategy/forking.rb
|
49
51
|
- lib/spork/runner.rb
|
50
52
|
- lib/spork/server.rb
|
51
53
|
- lib/spork/test_framework.rb
|
@@ -57,6 +59,7 @@ files:
|
|
57
59
|
- spec/spork/app_framework_spec.rb
|
58
60
|
- spec/spork/diagnoser_spec.rb
|
59
61
|
- spec/spork/forker_spec.rb
|
62
|
+
- spec/spork/run_strategy/forking_spec.rb
|
60
63
|
- spec/spork/runner_spec.rb
|
61
64
|
- spec/spork/server_spec.rb
|
62
65
|
- spec/spork/test_framework/cucumber_spec.rb
|
@@ -64,6 +67,7 @@ files:
|
|
64
67
|
- spec/spork/test_framework_spec.rb
|
65
68
|
- spec/spork_spec.rb
|
66
69
|
- spec/support/fake_framework.rb
|
70
|
+
- spec/support/fake_run_strategy.rb
|
67
71
|
has_rdoc: true
|
68
72
|
homepage: http://github.com/timcharper/spork
|
69
73
|
licenses: []
|
@@ -100,6 +104,7 @@ test_files:
|
|
100
104
|
- spec/spork/app_framework_spec.rb
|
101
105
|
- spec/spork/diagnoser_spec.rb
|
102
106
|
- spec/spork/forker_spec.rb
|
107
|
+
- spec/spork/run_strategy/forking_spec.rb
|
103
108
|
- spec/spork/runner_spec.rb
|
104
109
|
- spec/spork/server_spec.rb
|
105
110
|
- spec/spork/test_framework/cucumber_spec.rb
|
@@ -107,3 +112,4 @@ test_files:
|
|
107
112
|
- spec/spork/test_framework_spec.rb
|
108
113
|
- spec/spork_spec.rb
|
109
114
|
- spec/support/fake_framework.rb
|
115
|
+
- spec/support/fake_run_strategy.rb
|