timcharper-spork 0.5.10 → 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/rspec_rails_integration.feature +1 -0
- data/features/steps/general_steps.rb +3 -0
- data/lib/spork/app_framework.rb +1 -1
- data/lib/spork/run_strategy/forking.rb +30 -0
- data/lib/spork/run_strategy.rb +40 -0
- data/lib/spork/runner.rb +20 -43
- data/lib/spork/server.rb +9 -143
- data/lib/spork/test_framework/cucumber.rb +24 -0
- data/lib/spork/test_framework/rspec.rb +14 -0
- data/lib/spork/test_framework.rb +167 -0
- data/lib/spork.rb +7 -1
- data/spec/spec_helper.rb +7 -3
- data/spec/spork/run_strategy/forking_spec.rb +38 -0
- data/spec/spork/runner_spec.rb +20 -26
- data/spec/spork/server_spec.rb +4 -130
- data/spec/spork/test_framework/cucumber_spec.rb +11 -0
- data/spec/spork/test_framework/rspec_spec.rb +10 -0
- data/spec/spork/test_framework_spec.rb +114 -0
- data/spec/support/fake_framework.rb +15 -0
- data/spec/support/fake_run_strategy.rb +21 -0
- metadata +20 -8
- data/lib/spork/server/cucumber.rb +0 -35
- data/lib/spork/server/rspec.rb +0 -22
- data/spec/spork/server/cucumber_spec.rb +0 -25
- data/spec/spork/server/rspec_spec.rb +0 -25
@@ -68,6 +68,7 @@ Feature: Rails Integration
|
|
68
68
|
|
69
69
|
|
70
70
|
Scenario: Running spork with a rails app and a non-standard port
|
71
|
+
Given this scenario is pending until rspec releases a version that supports --port
|
71
72
|
Given a file named "spec/did_it_work_spec.rb" with:
|
72
73
|
"""
|
73
74
|
describe "Did it work?" do
|
data/lib/spork/app_framework.rb
CHANGED
@@ -54,7 +54,7 @@ class Spork::AppFramework
|
|
54
54
|
|
55
55
|
# Abstract: The path to the file that loads the project environment, ie config/environment.rb. Returns nil if there is none.
|
56
56
|
def entry_point
|
57
|
-
raise
|
57
|
+
raise NotImplementedError
|
58
58
|
end
|
59
59
|
|
60
60
|
def preload(&block)
|
@@ -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
|
@@ -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 }
|
data/lib/spork/runner.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
1
|
require 'optparse'
|
2
2
|
require 'spork/server'
|
3
|
+
require 'spork/test_framework'
|
4
|
+
require 'spork/run_strategy'
|
3
5
|
|
4
6
|
module Spork
|
5
7
|
# This is used by bin/spork. It's wrapped in a class because it's easier to test that way.
|
6
8
|
class Runner
|
7
|
-
attr_reader :
|
9
|
+
attr_reader :test_framework
|
8
10
|
|
9
11
|
def self.run(args, output, error)
|
10
12
|
self.new(args, output, error).run
|
@@ -30,74 +32,49 @@ module Spork
|
|
30
32
|
if @options[:help]
|
31
33
|
@output.puts opt
|
32
34
|
@output.puts
|
33
|
-
@output.puts
|
35
|
+
@output.puts supported_test_frameworks_text
|
34
36
|
exit(0)
|
35
37
|
end
|
36
38
|
end
|
37
39
|
|
38
|
-
def
|
40
|
+
def supported_test_frameworks_text
|
39
41
|
text = StringIO.new
|
40
42
|
|
41
43
|
text.puts "Supported test frameworks:"
|
42
|
-
text.puts Spork::
|
44
|
+
text.puts Spork::TestFramework.supported_test_frameworks.sort { |a,b| a.short_name <=> b.short_name }.map { |s| (s.available? ? '(*) ' : '( ) ') + s.short_name }
|
43
45
|
text.puts "\nLegend: ( ) - not detected in project (*) - detected\n"
|
44
46
|
text.string
|
45
47
|
end
|
46
48
|
|
47
49
|
# Returns a server for the specified (or the detected default) testing framework. Returns nil if none detected, or if the specified is not supported or available.
|
48
|
-
def
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
#{
|
54
|
-
|
55
|
-
#{supported_servers_text}
|
56
|
-
ERROR
|
57
|
-
return
|
58
|
-
end
|
59
|
-
|
60
|
-
unless @server.available?
|
61
|
-
@error.puts <<-USEFUL_ERROR
|
62
|
-
I can't find the helper file #{@server.helper_file} for the #{@server.server_name} testing framework.
|
63
|
-
Are you running me from the project directory?
|
64
|
-
USEFUL_ERROR
|
65
|
-
return
|
66
|
-
end
|
67
|
-
else
|
68
|
-
@server = Spork::Server.available_servers.first
|
69
|
-
if @server.nil?
|
70
|
-
@error.puts <<-USEFUL_ERROR
|
71
|
-
I can't find any testing frameworks to use.
|
72
|
-
Are you running me from a project directory?
|
73
|
-
USEFUL_ERROR
|
74
|
-
return
|
75
|
-
end
|
76
|
-
end
|
77
|
-
@server
|
50
|
+
def find_test_framework
|
51
|
+
Spork::TestFramework.factory(@output, @error, options[:server_matcher])
|
52
|
+
rescue Spork::TestFramework::NoFrameworksAvailable => e
|
53
|
+
@error.puts e.message
|
54
|
+
rescue Spork::TestFramework::FactoryException => e
|
55
|
+
@error.puts "#{e.message}\n\n#{supported_test_frameworks_text}"
|
78
56
|
end
|
79
57
|
|
80
58
|
def run
|
81
|
-
return false unless
|
59
|
+
return false unless test_framework = find_test_framework
|
82
60
|
ENV["DRB"] = 'true'
|
83
|
-
@error.puts "Using #{
|
61
|
+
@error.puts "Using #{test_framework.short_name}"
|
84
62
|
@error.flush
|
85
63
|
|
86
|
-
server.port = options[:port]
|
87
|
-
|
88
64
|
case
|
89
65
|
when options[:bootstrap]
|
90
|
-
|
66
|
+
test_framework.bootstrap
|
91
67
|
when options[:diagnose]
|
92
68
|
require 'spork/diagnoser'
|
93
69
|
|
94
|
-
Spork::Diagnoser.install_hook!(
|
95
|
-
|
70
|
+
Spork::Diagnoser.install_hook!(test_framework.entry_point)
|
71
|
+
test_framework.preload
|
96
72
|
Spork::Diagnoser.output_results(@output)
|
97
73
|
return true
|
98
74
|
else
|
99
|
-
|
100
|
-
|
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)
|
101
78
|
return true
|
102
79
|
end
|
103
80
|
end
|
data/lib/spork/server.rb
CHANGED
@@ -8,78 +8,16 @@ 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
|
-
|
12
|
-
|
13
|
-
LOAD_PREFERENCE = ['RSpec', 'Cucumber']
|
14
|
-
BOOTSTRAP_FILE = File.dirname(__FILE__) + "/../../assets/bootstrap.rb"
|
15
|
-
|
11
|
+
attr_reader :run_strategy
|
16
12
|
include Spork::CustomIOStreams
|
17
13
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
end
|
22
|
-
|
23
|
-
# Abstract method: returns the entry file that loads the testing environment, such as spec/spec_helper.rb.
|
24
|
-
def self.helper_file
|
25
|
-
raise NotImplemented
|
26
|
-
end
|
27
|
-
|
28
|
-
# Convenience method that turns the class name without the namespace
|
29
|
-
def self.server_name
|
30
|
-
self.name.gsub('Spork::Server::', '')
|
14
|
+
def initialize(options = {})
|
15
|
+
@run_strategy = options[:run_strategy]
|
16
|
+
@port = options[:port]
|
31
17
|
end
|
32
18
|
|
33
|
-
|
34
|
-
|
35
|
-
supported_servers.select { |s| s.available? }
|
36
|
-
end
|
37
|
-
|
38
|
-
# Returns a list of all servers that have been implemented (it keeps track of them automatically via Class.inherited)
|
39
|
-
def self.supported_servers(starting_with = nil)
|
40
|
-
@@supported_servers.sort! { |a,b| a.load_preference_index <=> b.load_preference_index }
|
41
|
-
return @@supported_servers if starting_with.nil?
|
42
|
-
@@supported_servers.select do |s|
|
43
|
-
s.server_name.match(/^#{Regexp.escape(starting_with)}/i)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
# Returns true if the testing frameworks helper file exists. Override if this is not sufficient to detect your testing framework.
|
48
|
-
def self.available?
|
49
|
-
File.exist?(helper_file)
|
50
|
-
end
|
51
|
-
|
52
|
-
# Used to specify
|
53
|
-
def self.load_preference_index
|
54
|
-
LOAD_PREFERENCE.index(server_name) || LOAD_PREFERENCE.length
|
55
|
-
end
|
56
|
-
|
57
|
-
# Detects if the test helper has been bootstrapped.
|
58
|
-
def self.bootstrapped?
|
59
|
-
File.read(helper_file).include?("Spork.prefork")
|
60
|
-
end
|
61
|
-
|
62
|
-
# Bootstraps the current test helper file by prepending a Spork.prefork and Spork.each_run block at the beginning.
|
63
|
-
def self.bootstrap
|
64
|
-
if bootstrapped?
|
65
|
-
stderr.puts "Already bootstrapped!"
|
66
|
-
return
|
67
|
-
end
|
68
|
-
stderr.puts "Bootstrapping #{helper_file}."
|
69
|
-
contents = File.read(helper_file)
|
70
|
-
bootstrap_code = File.read(BOOTSTRAP_FILE)
|
71
|
-
File.open(helper_file, "wb") do |f|
|
72
|
-
f.puts bootstrap_code
|
73
|
-
f.puts contents
|
74
|
-
end
|
75
|
-
|
76
|
-
stderr.puts "Done. Edit #{helper_file} now with your favorite text editor and follow the instructions."
|
77
|
-
true
|
78
|
-
end
|
79
|
-
|
80
|
-
def self.run
|
81
|
-
return unless available?
|
82
|
-
new.listen
|
19
|
+
def self.run(options = {})
|
20
|
+
new(options).listen
|
83
21
|
end
|
84
22
|
|
85
23
|
# Sets up signals and starts the DRb service. If it's successful, it doesn't return. Not ever. You don't need to override this.
|
@@ -93,18 +31,8 @@ class Spork::Server
|
|
93
31
|
DRb.thread.join
|
94
32
|
end
|
95
33
|
|
96
|
-
|
97
|
-
self.class.instance_variable_get("@port") || self.class.port
|
98
|
-
end
|
34
|
+
attr_accessor :port
|
99
35
|
|
100
|
-
def self.port= p
|
101
|
-
@port = p
|
102
|
-
end
|
103
|
-
|
104
|
-
def helper_file
|
105
|
-
self.class.helper_file
|
106
|
-
end
|
107
|
-
|
108
36
|
# This is the public facing method that is served up by DRb. To use it from the client side (in a testing framework):
|
109
37
|
#
|
110
38
|
# DRb.start_service("druby://localhost:0") # this allows Ruby to do some magical stuff so you can pass an output stream over DRb.
|
@@ -114,66 +42,10 @@ class Spork::Server
|
|
114
42
|
#
|
115
43
|
# When implementing a test server, don't override this method: override run_tests instead.
|
116
44
|
def run(argv, stderr, stdout)
|
117
|
-
|
118
|
-
|
119
|
-
@child = ::Spork::Forker.new do
|
120
|
-
$stdout, $stderr = stdout, stderr
|
121
|
-
Spork.exec_each_run { load helper_file }
|
122
|
-
run_tests(argv, stderr, stdout)
|
123
|
-
end
|
124
|
-
@child.result
|
45
|
+
run_strategy.run(argv, stderr, stdout)
|
125
46
|
end
|
126
47
|
|
127
|
-
# returns whether or not the child (a test run) is running right now.
|
128
|
-
def running?
|
129
|
-
@child && @child.running?
|
130
|
-
end
|
131
|
-
|
132
|
-
protected
|
133
|
-
# Abstract method: here is where the server runs the tests.
|
134
|
-
def run_tests(argv, input, output)
|
135
|
-
raise NotImplemented
|
136
|
-
end
|
137
|
-
|
138
48
|
private
|
139
|
-
def self.inherited(subclass)
|
140
|
-
@@supported_servers << subclass
|
141
|
-
end
|
142
|
-
|
143
|
-
def self.framework
|
144
|
-
@framework ||= Spork::AppFramework.detect_framework
|
145
|
-
end
|
146
|
-
|
147
|
-
def self.entry_point
|
148
|
-
bootstrapped? ? helper_file : framework.entry_point
|
149
|
-
end
|
150
|
-
|
151
|
-
def self.preload
|
152
|
-
Spork.exec_prefork do
|
153
|
-
unless bootstrapped?
|
154
|
-
stderr.puts "#{helper_file} has not been bootstrapped. Run spork --bootstrap to do so."
|
155
|
-
stderr.flush
|
156
|
-
|
157
|
-
if framework.bootstrap_required?
|
158
|
-
stderr.puts "I can't do anything for you by default for the framework your using: #{framework.short_name}.\nYou must bootstrap #{helper_file} to continue."
|
159
|
-
stderr.flush
|
160
|
-
return false
|
161
|
-
else
|
162
|
-
load(framework.entry_point)
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
|
-
framework.preload do
|
167
|
-
if bootstrapped?
|
168
|
-
stderr.puts "Loading Spork.prefork block..."
|
169
|
-
stderr.flush
|
170
|
-
load(helper_file)
|
171
|
-
end
|
172
|
-
end
|
173
|
-
end
|
174
|
-
true
|
175
|
-
end
|
176
|
-
|
177
49
|
def restart
|
178
50
|
stderr.puts "restarting"
|
179
51
|
stderr.flush
|
@@ -183,12 +55,8 @@ class Spork::Server
|
|
183
55
|
exec(command_line)
|
184
56
|
end
|
185
57
|
|
186
|
-
def abort
|
187
|
-
@child && @child.abort
|
188
|
-
end
|
189
|
-
|
190
58
|
def sig_int_received
|
191
|
-
if running?
|
59
|
+
if run_strategy.running?
|
192
60
|
abort
|
193
61
|
stderr.puts "Running tests stopped. Press CTRL-C again to stop the server."
|
194
62
|
stderr.flush
|
@@ -197,5 +65,3 @@ class Spork::Server
|
|
197
65
|
end
|
198
66
|
end
|
199
67
|
end
|
200
|
-
|
201
|
-
Dir[File.dirname(__FILE__) + "/server/*.rb"].each { |file| require file }
|
@@ -0,0 +1,24 @@
|
|
1
|
+
class Spork::TestFramework::Cucumber < Spork::TestFramework
|
2
|
+
DEFAULT_PORT = 8990
|
3
|
+
HELPER_FILE = File.join(Dir.pwd, "features/support/env.rb")
|
4
|
+
|
5
|
+
class << self
|
6
|
+
# REMOVE WHEN SUPPORT FOR 0.3.95 AND EARLIER IS DROPPED
|
7
|
+
attr_accessor :mother_object
|
8
|
+
end
|
9
|
+
|
10
|
+
def preload
|
11
|
+
require 'cucumber'
|
12
|
+
begin
|
13
|
+
@step_mother = ::Cucumber::StepMother.new
|
14
|
+
@step_mother.load_programming_language('rb')
|
15
|
+
rescue NoMethodError => pre_cucumber_0_4 # REMOVE WHEN SUPPORT FOR PRE-0.4 IS DROPPED
|
16
|
+
@step_mother = Spork::Server::Cucumber.mother_object
|
17
|
+
end
|
18
|
+
super
|
19
|
+
end
|
20
|
+
|
21
|
+
def run_tests(argv, stderr, stdout)
|
22
|
+
::Cucumber::Cli::Main.new(argv, stdout, stderr).execute!(@step_mother)
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class Spork::TestFramework::RSpec < Spork::TestFramework
|
2
|
+
DEFAULT_PORT = 8989
|
3
|
+
HELPER_FILE = File.join(Dir.pwd, "spec/spec_helper.rb")
|
4
|
+
|
5
|
+
def run_tests(argv, stderr, stdout)
|
6
|
+
::Spec::Runner::CommandLine.run(
|
7
|
+
::Spec::Runner::OptionParser.parse(
|
8
|
+
argv,
|
9
|
+
stderr,
|
10
|
+
stdout
|
11
|
+
)
|
12
|
+
)
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,167 @@
|
|
1
|
+
class Spork::TestFramework
|
2
|
+
LOAD_PREFERENCE = ['RSpec', 'Cucumber']
|
3
|
+
BOOTSTRAP_FILE = File.dirname(__FILE__) + "/../../assets/bootstrap.rb"
|
4
|
+
|
5
|
+
@@supported_test_frameworks = []
|
6
|
+
attr_reader :stdout, :stderr
|
7
|
+
|
8
|
+
class FactoryException < Exception; end
|
9
|
+
|
10
|
+
class NoFrameworksAvailable < FactoryException
|
11
|
+
def message
|
12
|
+
"I can't find any testing frameworks to use. Are you running me from a project directory?"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class FrameworkNotAvailable < FactoryException
|
17
|
+
def initialize(framework)
|
18
|
+
@framework = framework
|
19
|
+
end
|
20
|
+
|
21
|
+
def message
|
22
|
+
"I can't find the file #{e.test_framework.helper_file} for the #{e.test_framework.short_name} testing framework.\nAre you running me from the project directory?"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
class NoFrameworkMatched < FactoryException
|
27
|
+
def initialize(beginning_with)
|
28
|
+
@beginning_with = beginning_with
|
29
|
+
end
|
30
|
+
|
31
|
+
def message
|
32
|
+
"Couldn't find a supported test framework that begins with '#{@beginning_with}'"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def initialize(stdout = STDOUT, stderr = STDERR)
|
37
|
+
@stdout, @stderr = stdout, stderr
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.factory(output = STDOUT, error = STDERR, beginning_with = nil)
|
41
|
+
if beginning_with
|
42
|
+
@klass = supported_test_frameworks(beginning_with).first
|
43
|
+
raise(NoFrameworkMatched.new(beginning_with)) if @klass.nil?
|
44
|
+
raise(FrameworkNotAvailable.new(@klass)) unless @klass.available?
|
45
|
+
else
|
46
|
+
@klass = available_test_frameworks.first
|
47
|
+
raise(NoFrameworksAvailable.new) unless @klass
|
48
|
+
end
|
49
|
+
@klass.new(output, error)
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.helper_file
|
53
|
+
self::HELPER_FILE
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.default_port
|
57
|
+
(ENV["#{short_name.upcase}_DRB"] || self::DEFAULT_PORT).to_i
|
58
|
+
end
|
59
|
+
|
60
|
+
def self.short_name
|
61
|
+
self.name.gsub('Spork::TestFramework::', '')
|
62
|
+
end
|
63
|
+
|
64
|
+
# Returns a list of all testing servers that have detected their testing framework being used in the project.
|
65
|
+
def self.available_test_frameworks
|
66
|
+
supported_test_frameworks.select { |s| s.available? }
|
67
|
+
end
|
68
|
+
|
69
|
+
# Returns a list of all servers that have been implemented (it keeps track of them automatically via Class.inherited)
|
70
|
+
def self.supported_test_frameworks(starting_with = nil)
|
71
|
+
@@supported_test_frameworks.sort! { |a,b| a.load_preference_index <=> b.load_preference_index }
|
72
|
+
return @@supported_test_frameworks if starting_with.nil?
|
73
|
+
@@supported_test_frameworks.select do |s|
|
74
|
+
s.short_name.match(/^#{Regexp.escape(starting_with)}/i)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def short_name
|
79
|
+
self.class.short_name
|
80
|
+
end
|
81
|
+
|
82
|
+
def helper_file
|
83
|
+
self.class.helper_file
|
84
|
+
end
|
85
|
+
|
86
|
+
# Detects if the test helper has been bootstrapped.
|
87
|
+
def bootstrapped?
|
88
|
+
File.read(helper_file).include?("Spork.prefork")
|
89
|
+
end
|
90
|
+
|
91
|
+
# Bootstraps the current test helper file by prepending a Spork.prefork and Spork.each_run block at the beginning.
|
92
|
+
def bootstrap
|
93
|
+
if bootstrapped?
|
94
|
+
stderr.puts "Already bootstrapped!"
|
95
|
+
return
|
96
|
+
end
|
97
|
+
stderr.puts "Bootstrapping #{helper_file}."
|
98
|
+
contents = File.read(helper_file)
|
99
|
+
bootstrap_code = File.read(BOOTSTRAP_FILE)
|
100
|
+
File.open(helper_file, "wb") do |f|
|
101
|
+
f.puts bootstrap_code
|
102
|
+
f.puts contents
|
103
|
+
end
|
104
|
+
|
105
|
+
stderr.puts "Done. Edit #{helper_file} now with your favorite text editor and follow the instructions."
|
106
|
+
true
|
107
|
+
end
|
108
|
+
|
109
|
+
# Returns true if the testing frameworks helper file exists. Override if this is not sufficient to detect your testing framework.
|
110
|
+
def self.available?
|
111
|
+
File.exist?(helper_file)
|
112
|
+
end
|
113
|
+
|
114
|
+
# Used to specify
|
115
|
+
def self.load_preference_index
|
116
|
+
LOAD_PREFERENCE.index(short_name) || LOAD_PREFERENCE.length
|
117
|
+
end
|
118
|
+
|
119
|
+
def preload
|
120
|
+
Spork.exec_prefork do
|
121
|
+
unless bootstrapped?
|
122
|
+
stderr.puts "#{helper_file} has not been bootstrapped. Run spork --bootstrap to do so."
|
123
|
+
stderr.flush
|
124
|
+
|
125
|
+
if framework.bootstrap_required?
|
126
|
+
stderr.puts "I can't do anything for you by default for the framework your using: #{framework.short_name}.\nYou must bootstrap #{helper_file} to continue."
|
127
|
+
stderr.flush
|
128
|
+
return false
|
129
|
+
else
|
130
|
+
load(framework.entry_point)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
framework.preload do
|
135
|
+
if bootstrapped?
|
136
|
+
stderr.puts "Loading Spork.prefork block..."
|
137
|
+
stderr.flush
|
138
|
+
load(helper_file)
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
true
|
143
|
+
end
|
144
|
+
|
145
|
+
def run_tests(argv, stderr, stdout)
|
146
|
+
raise NotImplementedError
|
147
|
+
end
|
148
|
+
|
149
|
+
def entry_point
|
150
|
+
bootstrapped? ? helper_file : framework.entry_point
|
151
|
+
end
|
152
|
+
|
153
|
+
def default_port
|
154
|
+
self.class.default_port
|
155
|
+
end
|
156
|
+
|
157
|
+
protected
|
158
|
+
def self.inherited(subclass)
|
159
|
+
@@supported_test_frameworks << subclass
|
160
|
+
end
|
161
|
+
|
162
|
+
def framework
|
163
|
+
@framework ||= Spork::AppFramework.detect_framework
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
Spork.detect_and_require('spork/test_framework/*.rb')
|
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)
|
data/spec/spec_helper.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'rubygems'
|
2
|
-
require 'spec'
|
3
2
|
|
4
3
|
unless $spec_helper_loaded
|
5
4
|
$spec_helper_loaded = true
|
@@ -9,7 +8,6 @@ unless $spec_helper_loaded
|
|
9
8
|
|
10
9
|
require 'spork'
|
11
10
|
require 'spork/runner.rb'
|
12
|
-
require 'spork/server.rb'
|
13
11
|
require 'spork/diagnoser.rb'
|
14
12
|
require 'stringio'
|
15
13
|
require 'fileutils'
|
@@ -34,7 +32,11 @@ unless $spec_helper_loaded
|
|
34
32
|
File.open(filename, 'wb') { |f| f << contents }
|
35
33
|
end
|
36
34
|
end
|
37
|
-
|
35
|
+
|
36
|
+
def create_helper_file(test_framework = FakeFramework)
|
37
|
+
create_file(test_framework.helper_file, "# stub spec helper file")
|
38
|
+
end
|
39
|
+
|
38
40
|
def in_current_dir(&block)
|
39
41
|
Dir.chdir(current_dir, &block)
|
40
42
|
end
|
@@ -104,4 +106,6 @@ unless $spec_helper_loaded
|
|
104
106
|
end
|
105
107
|
end
|
106
108
|
end
|
109
|
+
|
110
|
+
Dir.glob(File.dirname(__FILE__) + "/support/*.rb").each { |f| require(f) }
|
107
111
|
end
|
@@ -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/runner_spec.rb
CHANGED
@@ -1,60 +1,54 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../spec_helper'
|
2
2
|
|
3
3
|
describe Spork::Runner do
|
4
|
+
def use_test_server(klass = Spork::TestFramework::RSpec)
|
5
|
+
@test_framework = klass.new
|
6
|
+
Spork::TestFramework.stub!(:factory).and_return(@test_framework)
|
7
|
+
end
|
8
|
+
|
4
9
|
before(:each) do
|
5
10
|
@out, @err = StringIO.new, StringIO.new
|
6
11
|
end
|
7
12
|
|
8
13
|
it "finds a matching server with a prefix" do
|
9
|
-
Spork::Runner.new(["rs"], @out, @err).
|
14
|
+
Spork::Runner.new(["rs"], @out, @err).find_test_framework.class.should == Spork::TestFramework::RSpec
|
10
15
|
end
|
11
16
|
|
12
17
|
it "shows an error message if no matching server was found" do
|
13
18
|
Spork::Runner.new(["argle_bargle"], @out, @err).run.should == false
|
14
|
-
@err.string.should include(%(
|
15
|
-
end
|
16
|
-
|
17
|
-
it "defaults to use rspec over cucumber" do
|
18
|
-
Spork::Server::RSpec.stub!(:available?).and_return(true)
|
19
|
-
Spork::Server::Cucumber.stub!(:available?).and_return(true)
|
20
|
-
Spork::Runner.new([], @out, @err).find_server.should == Spork::Server::RSpec
|
21
|
-
end
|
22
|
-
|
23
|
-
it "defaults to use cucumber when rspec not available" do
|
24
|
-
Spork::Server::RSpec.stub!(:available?).and_return(false)
|
25
|
-
Spork::Server::Cucumber.stub!(:available?).and_return(true)
|
26
|
-
Spork::Runner.new([], @out, @err).find_server.should == Spork::Server::Cucumber
|
19
|
+
@err.string.should include(%(Couldn't find a supported test framework that begins with 'argle_bargle'))
|
27
20
|
end
|
28
21
|
|
29
22
|
it "bootstraps a server when -b is passed in" do
|
30
|
-
|
31
|
-
|
23
|
+
use_test_server
|
24
|
+
@test_framework.should_receive(:bootstrap)
|
32
25
|
Spork::Runner.new(['rspec', '-b'], @out, @err).run
|
33
26
|
end
|
34
27
|
|
35
28
|
it "aborts if it can't preload" do
|
36
|
-
|
37
|
-
|
38
|
-
Spork::Server
|
29
|
+
use_test_server
|
30
|
+
@test_framework.should_receive(:preload).and_return(false)
|
31
|
+
Spork::Server.should_not_receive(:run)
|
39
32
|
Spork::Runner.new(['rspec'], @out, @err).run
|
40
33
|
end
|
41
34
|
|
42
35
|
it "runs the server if all is well" do
|
43
|
-
|
44
|
-
|
45
|
-
Spork::Server
|
36
|
+
use_test_server
|
37
|
+
@test_framework.should_receive(:preload).and_return(true)
|
38
|
+
Spork::Server.should_receive(:run)
|
46
39
|
Spork::Runner.new(['rspec'], @out, @err).run
|
47
40
|
@err.string.should include("Using RSpec")
|
48
41
|
end
|
49
42
|
|
50
43
|
it "outputs a list of supported servers, along with supported asterisk" do
|
51
|
-
Spork::Server.stub!(:
|
52
|
-
Spork::
|
53
|
-
Spork::
|
44
|
+
Spork::Server.stub!(:supported_test_frameworks).and_return([Spork::TestFramework::RSpec, Spork::TestFramework::Cucumber])
|
45
|
+
Spork::TestFramework::RSpec.stub!(:available?).and_return(true)
|
46
|
+
Spork::TestFramework::Cucumber.stub!(:available?).and_return(false)
|
54
47
|
|
55
|
-
Spork::Runner.new(['rspec'], @out, @err).
|
48
|
+
Spork::Runner.new(['rspec'], @out, @err).supported_test_frameworks_text.should == <<-EOF
|
56
49
|
Supported test frameworks:
|
57
50
|
( ) Cucumber
|
51
|
+
( ) FakeFramework
|
58
52
|
(*) RSpec
|
59
53
|
|
60
54
|
Legend: ( ) - not detected in project (*) - detected
|
data/spec/spork/server_spec.rb
CHANGED
@@ -1,141 +1,15 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../spec_helper'
|
2
2
|
|
3
|
-
|
4
|
-
class FakeServer < Spork::Server
|
5
|
-
attr_accessor :wait_time
|
6
|
-
|
7
|
-
include Spork::TestIOStreams
|
8
|
-
|
9
|
-
def self.helper_file
|
10
|
-
SPEC_TMP_DIR + "/fake/test_helper.rb"
|
11
|
-
end
|
12
|
-
|
13
|
-
def self.port
|
14
|
-
1000
|
15
|
-
end
|
16
|
-
|
17
|
-
def run_tests(argv, input, output)
|
18
|
-
sleep(@wait_time || 0.5)
|
19
|
-
true
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
3
|
describe Spork::Server do
|
24
|
-
describe ".available_servers" do
|
25
|
-
before(:each) do
|
26
|
-
Spork::Server.supported_servers.each { |s| s.stub!(:available?).and_return(false) }
|
27
|
-
end
|
28
|
-
|
29
|
-
it "returns a list of all available servers" do
|
30
|
-
Spork::Server.available_servers.should == []
|
31
|
-
Spork::Server::RSpec.stub!(:available?).and_return(true)
|
32
|
-
Spork::Server.available_servers.should == [Spork::Server::RSpec]
|
33
|
-
end
|
34
|
-
|
35
|
-
it "returns rspec before cucumber when both are available" do
|
36
|
-
Spork::Server::RSpec.stub!(:available?).and_return(true)
|
37
|
-
Spork::Server::Cucumber.stub!(:available?).and_return(true)
|
38
|
-
Spork::Server.available_servers.should == [Spork::Server::RSpec, Spork::Server::Cucumber]
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
describe ".supported_servers" do
|
43
|
-
it "returns all defined servers" do
|
44
|
-
Spork::Server.supported_servers.should include(Spork::Server::RSpec)
|
45
|
-
Spork::Server.supported_servers.should include(Spork::Server::Cucumber)
|
46
|
-
end
|
47
|
-
|
48
|
-
it "returns a list of servers matching a case-insensitive prefix" do
|
49
|
-
Spork::Server.supported_servers("rspec").should == [Spork::Server::RSpec]
|
50
|
-
Spork::Server.supported_servers("rs").should == [Spork::Server::RSpec]
|
51
|
-
Spork::Server.supported_servers("cuc").should == [Spork::Server::Cucumber]
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
4
|
describe "a fake server" do
|
56
|
-
def create_helper_file
|
57
|
-
create_file(FakeServer.helper_file, "# stub spec helper file")
|
58
|
-
end
|
59
|
-
|
60
5
|
before(:each) do
|
61
|
-
@
|
62
|
-
|
63
|
-
|
64
|
-
it "should be available when the helper_file exists" do
|
65
|
-
FakeServer.available?.should == false
|
66
|
-
create_helper_file
|
67
|
-
FakeServer.available?.should == true
|
68
|
-
end
|
69
|
-
|
70
|
-
it "has a name" do
|
71
|
-
FakeServer.server_name.should == "FakeServer"
|
72
|
-
end
|
73
|
-
|
74
|
-
it "tells if it's testing framework is being used" do
|
75
|
-
Spork::Server.available_servers.should_not include(FakeServer)
|
76
|
-
create_helper_file
|
77
|
-
Spork::Server.available_servers.should include(FakeServer)
|
78
|
-
end
|
79
|
-
|
80
|
-
it "recognizes if the helper_file has been bootstrapped" do
|
81
|
-
bootstrap_contents = File.read(FakeServer::BOOTSTRAP_FILE)
|
82
|
-
File.stub!(:read).with(FakeServer.helper_file).and_return("")
|
83
|
-
FakeServer.bootstrapped?.should == false
|
84
|
-
File.stub!(:read).with(FakeServer.helper_file).and_return(bootstrap_contents)
|
85
|
-
FakeServer.bootstrapped?.should == true
|
86
|
-
end
|
87
|
-
|
88
|
-
it "bootstraps a file" do
|
89
|
-
create_helper_file
|
90
|
-
FakeServer.bootstrap
|
91
|
-
|
92
|
-
$test_stderr.string.should include("Bootstrapping")
|
93
|
-
$test_stderr.string.should include("Edit")
|
94
|
-
$test_stderr.string.should include("favorite text editor")
|
95
|
-
|
96
|
-
File.read(FakeServer.helper_file).should include(File.read(FakeServer::BOOTSTRAP_FILE))
|
6
|
+
@fake_run_strategy = FakeRunStrategy.new
|
7
|
+
@server = Spork::Server.new(:run_strategy => @fake_run_strategy)
|
97
8
|
end
|
98
|
-
|
99
|
-
it "aborts the current running thread when another run is started" do
|
100
|
-
create_helper_file
|
101
|
-
@fake.wait_time = 0.25
|
102
|
-
first_run = Thread.new { @fake.run("test", STDOUT, STDIN).should == nil }
|
103
|
-
sleep(0.05)
|
104
|
-
@fake.run("test", STDOUT, STDIN).should == true
|
105
9
|
|
106
|
-
# wait for the first to finish
|
107
|
-
first_run.join
|
108
|
-
end
|
109
|
-
|
110
|
-
it "can abort the current run" do
|
111
|
-
create_helper_file
|
112
|
-
@fake.wait_time = 5
|
113
|
-
started_at = Time.now
|
114
|
-
first_run = Thread.new { @fake.run("test", STDOUT, STDIN).should == true }
|
115
|
-
sleep(0.05)
|
116
|
-
@fake.send(:abort)
|
117
|
-
sleep(0.01) while @fake.running?
|
118
|
-
|
119
|
-
(Time.now - started_at).should < @fake.wait_time
|
120
|
-
end
|
121
|
-
|
122
|
-
it "returns the result of the run_tests method from the forked child" do
|
123
|
-
create_helper_file
|
124
|
-
@fake.stub!(:run_tests).and_return("tests were ran")
|
125
|
-
@fake.run("test", STDOUT, STDIN).should == "tests were ran"
|
126
|
-
end
|
127
|
-
|
128
10
|
it "accepts a port" do
|
129
|
-
|
130
|
-
@
|
131
|
-
@fake.port.should == 12345
|
132
|
-
end
|
133
|
-
|
134
|
-
it "falls back to a default port" do
|
135
|
-
create_helper_file
|
136
|
-
@fake.class.port = nil
|
137
|
-
@fake.port.should == FakeServer.port
|
11
|
+
@server.port = 12345
|
12
|
+
@server.port.should == 12345
|
138
13
|
end
|
139
|
-
|
140
14
|
end
|
141
15
|
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
+
require File.dirname(__FILE__) + "/../test_framework_spec"
|
3
|
+
|
4
|
+
describe Spork::TestFramework::Cucumber do
|
5
|
+
before(:each) do
|
6
|
+
@klass = Spork::TestFramework::Cucumber
|
7
|
+
@server = @klass.new
|
8
|
+
end
|
9
|
+
|
10
|
+
it_should_behave_like "a TestFramework"
|
11
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
+
require File.dirname(__FILE__) + "/../test_framework_spec"
|
3
|
+
|
4
|
+
describe Spork::TestFramework::RSpec do
|
5
|
+
before(:each) do
|
6
|
+
@klass = Spork::TestFramework::RSpec
|
7
|
+
end
|
8
|
+
|
9
|
+
it_should_behave_like "a TestFramework"
|
10
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
|
3
|
+
describe "a TestFramework", :shared => true do
|
4
|
+
describe ".default_port" do
|
5
|
+
it "uses the DEFAULT_PORT when the environment variable is not set" do
|
6
|
+
@klass.default_port.should == @klass::DEFAULT_PORT
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'uses ENV["#{short_name.upcase}_DRB"] as port if present' do
|
10
|
+
env_name = "#{@klass.short_name.upcase}_DRB"
|
11
|
+
orig, ENV[env_name] = ENV[env_name], "9000"
|
12
|
+
begin
|
13
|
+
@klass.default_port.should == 9000
|
14
|
+
ensure
|
15
|
+
ENV[env_name] = orig
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe ".helper_file" do
|
21
|
+
it "returns ::HELPER_FILE for the TestFramework" do
|
22
|
+
@klass.helper_file.should == @klass::HELPER_FILE
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe Spork::TestFramework do
|
28
|
+
|
29
|
+
before(:each) do
|
30
|
+
@fake = FakeFramework.new
|
31
|
+
end
|
32
|
+
|
33
|
+
describe ".available_test_frameworks" do
|
34
|
+
before(:each) do
|
35
|
+
Spork::TestFramework.supported_test_frameworks.each { |s| s.stub!(:available?).and_return(false) }
|
36
|
+
end
|
37
|
+
|
38
|
+
it "returns a list of all available servers" do
|
39
|
+
Spork::TestFramework.available_test_frameworks.should == []
|
40
|
+
Spork::TestFramework::RSpec.stub!(:available?).and_return(true)
|
41
|
+
Spork::TestFramework.available_test_frameworks.should == [Spork::TestFramework::RSpec]
|
42
|
+
end
|
43
|
+
|
44
|
+
it "returns rspec before cucumber when both are available" do
|
45
|
+
Spork::TestFramework::RSpec.stub!(:available?).and_return(true)
|
46
|
+
Spork::TestFramework::Cucumber.stub!(:available?).and_return(true)
|
47
|
+
Spork::TestFramework.available_test_frameworks.should == [Spork::TestFramework::RSpec, Spork::TestFramework::Cucumber]
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe ".supported_test_frameworks" do
|
52
|
+
it "returns all defined servers" do
|
53
|
+
Spork::TestFramework.supported_test_frameworks.should include(Spork::TestFramework::RSpec)
|
54
|
+
Spork::TestFramework.supported_test_frameworks.should include(Spork::TestFramework::Cucumber)
|
55
|
+
end
|
56
|
+
|
57
|
+
it "returns a list of servers matching a case-insensitive prefix" do
|
58
|
+
Spork::TestFramework.supported_test_frameworks("rspec").should == [Spork::TestFramework::RSpec]
|
59
|
+
Spork::TestFramework.supported_test_frameworks("rs").should == [Spork::TestFramework::RSpec]
|
60
|
+
Spork::TestFramework.supported_test_frameworks("cuc").should == [Spork::TestFramework::Cucumber]
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe ".short_name" do
|
65
|
+
it "returns the name of the framework, without the namespace prefix" do
|
66
|
+
Spork::TestFramework::Cucumber.short_name.should == "Cucumber"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe ".available?" do
|
71
|
+
it "returns true when the helper_file exists" do
|
72
|
+
FakeFramework.available?.should == false
|
73
|
+
create_helper_file(FakeFramework)
|
74
|
+
FakeFramework.available?.should == true
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe ".bootstrapped?" do
|
79
|
+
it "recognizes if the helper_file has been bootstrapped" do
|
80
|
+
bootstrap_contents = File.read(FakeFramework::BOOTSTRAP_FILE)
|
81
|
+
File.stub!(:read).with(@fake.helper_file).and_return("")
|
82
|
+
@fake.bootstrapped?.should == false
|
83
|
+
File.stub!(:read).with(@fake.helper_file).and_return(bootstrap_contents)
|
84
|
+
@fake.bootstrapped?.should == true
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
describe ".bootstrap" do
|
89
|
+
it "bootstraps a file" do
|
90
|
+
create_helper_file
|
91
|
+
@fake.bootstrap
|
92
|
+
|
93
|
+
$test_stderr.string.should include("Bootstrapping")
|
94
|
+
$test_stderr.string.should include("Edit")
|
95
|
+
$test_stderr.string.should include("favorite text editor")
|
96
|
+
|
97
|
+
File.read(@fake.helper_file).should include(File.read(FakeFramework::BOOTSTRAP_FILE))
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
describe ".factory" do
|
102
|
+
it "defaults to use rspec over cucumber" do
|
103
|
+
Spork::TestFramework::RSpec.stub!(:available?).and_return(true)
|
104
|
+
Spork::TestFramework::Cucumber.stub!(:available?).and_return(true)
|
105
|
+
Spork::TestFramework.factory(STDOUT, STDERR).class.should == Spork::TestFramework::RSpec
|
106
|
+
end
|
107
|
+
|
108
|
+
it "defaults to use cucumber when rspec not available" do
|
109
|
+
Spork::TestFramework::RSpec.stub!(:available?).and_return(false)
|
110
|
+
Spork::TestFramework::Cucumber.stub!(:available?).and_return(true)
|
111
|
+
Spork::TestFramework.factory(STDOUT, STDERR).class.should == Spork::TestFramework::Cucumber
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class FakeFramework < Spork::TestFramework
|
2
|
+
include Spork::TestIOStreams
|
3
|
+
|
4
|
+
attr_accessor :wait_time
|
5
|
+
DEFAULT_PORT = 1000
|
6
|
+
|
7
|
+
def self.helper_file
|
8
|
+
SPEC_TMP_DIR + "/fake/test_helper.rb"
|
9
|
+
end
|
10
|
+
|
11
|
+
def run_tests(argv, input, output)
|
12
|
+
sleep(@wait_time || 0.5)
|
13
|
+
true
|
14
|
+
end
|
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: timcharper-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 -07:00
|
13
13
|
default_executable: spork
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -31,6 +31,7 @@ files:
|
|
31
31
|
- features/diagnostic_mode.feature
|
32
32
|
- features/rails_delayed_loading_workarounds.feature
|
33
33
|
- features/rspec_rails_integration.feature
|
34
|
+
- features/steps/general_steps.rb
|
34
35
|
- features/steps/rails_steps.rb
|
35
36
|
- features/steps/sandbox_steps.rb
|
36
37
|
- features/support/env.rb
|
@@ -45,21 +46,28 @@ files:
|
|
45
46
|
- lib/spork/custom_io_streams.rb
|
46
47
|
- lib/spork/diagnoser.rb
|
47
48
|
- lib/spork/forker.rb
|
49
|
+
- lib/spork/run_strategy.rb
|
50
|
+
- lib/spork/run_strategy/forking.rb
|
48
51
|
- lib/spork/runner.rb
|
49
52
|
- lib/spork/server.rb
|
50
|
-
- lib/spork/
|
51
|
-
- lib/spork/
|
53
|
+
- lib/spork/test_framework.rb
|
54
|
+
- lib/spork/test_framework/cucumber.rb
|
55
|
+
- lib/spork/test_framework/rspec.rb
|
52
56
|
- spec/spec_helper.rb
|
53
57
|
- spec/spork/app_framework/rails_spec.rb
|
54
58
|
- spec/spork/app_framework/unknown_spec.rb
|
55
59
|
- spec/spork/app_framework_spec.rb
|
56
60
|
- spec/spork/diagnoser_spec.rb
|
57
61
|
- spec/spork/forker_spec.rb
|
62
|
+
- spec/spork/run_strategy/forking_spec.rb
|
58
63
|
- spec/spork/runner_spec.rb
|
59
|
-
- spec/spork/server/cucumber_spec.rb
|
60
|
-
- spec/spork/server/rspec_spec.rb
|
61
64
|
- spec/spork/server_spec.rb
|
65
|
+
- spec/spork/test_framework/cucumber_spec.rb
|
66
|
+
- spec/spork/test_framework/rspec_spec.rb
|
67
|
+
- spec/spork/test_framework_spec.rb
|
62
68
|
- spec/spork_spec.rb
|
69
|
+
- spec/support/fake_framework.rb
|
70
|
+
- spec/support/fake_run_strategy.rb
|
63
71
|
has_rdoc: false
|
64
72
|
homepage: http://github.com/timcharper/spork
|
65
73
|
post_install_message:
|
@@ -94,8 +102,12 @@ test_files:
|
|
94
102
|
- spec/spork/app_framework_spec.rb
|
95
103
|
- spec/spork/diagnoser_spec.rb
|
96
104
|
- spec/spork/forker_spec.rb
|
105
|
+
- spec/spork/run_strategy/forking_spec.rb
|
97
106
|
- spec/spork/runner_spec.rb
|
98
|
-
- spec/spork/server/cucumber_spec.rb
|
99
|
-
- spec/spork/server/rspec_spec.rb
|
100
107
|
- spec/spork/server_spec.rb
|
108
|
+
- spec/spork/test_framework/cucumber_spec.rb
|
109
|
+
- spec/spork/test_framework/rspec_spec.rb
|
110
|
+
- spec/spork/test_framework_spec.rb
|
101
111
|
- spec/spork_spec.rb
|
112
|
+
- spec/support/fake_framework.rb
|
113
|
+
- spec/support/fake_run_strategy.rb
|
@@ -1,35 +0,0 @@
|
|
1
|
-
require 'cucumber'
|
2
|
-
|
3
|
-
class Spork::Server::Cucumber < Spork::Server
|
4
|
-
CUCUMBER_PORT = 8990
|
5
|
-
CUCUMBER_HELPER_FILE = File.join(Dir.pwd, "features/support/env.rb")
|
6
|
-
|
7
|
-
class << self
|
8
|
-
def port
|
9
|
-
(ENV['CUCUMBER_DRB'] || CUCUMBER_PORT).to_i
|
10
|
-
end
|
11
|
-
|
12
|
-
def helper_file
|
13
|
-
CUCUMBER_HELPER_FILE
|
14
|
-
end
|
15
|
-
|
16
|
-
# REMOVE WHEN SUPPORT FOR 0.3.95 AND EARLIER IS DROPPED
|
17
|
-
attr_accessor :step_mother
|
18
|
-
end
|
19
|
-
|
20
|
-
# REMOVE WHEN SUPPORT FOR 0.3.95 AND EARLIER IS DROPPED
|
21
|
-
def step_mother
|
22
|
-
self.class.step_mother
|
23
|
-
end
|
24
|
-
|
25
|
-
def run_tests(argv, stderr, stdout)
|
26
|
-
::Cucumber::Cli::Main.new(argv, stdout, stderr).execute!(step_mother)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
begin
|
31
|
-
Spork::Server::Cucumber.step_mother = ::Cucumber::StepMother.new
|
32
|
-
Spork::Server::Cucumber.step_mother.load_programming_language('rb') if defined?(Spork::Server)
|
33
|
-
rescue NoMethodError => pre_cucumber_0_4 # REMOVE WHEN SUPPORT FOR 0.3.95 AND EARLIER IS DROPPED
|
34
|
-
Spork::Server::Cucumber.step_mother = self
|
35
|
-
end
|
data/lib/spork/server/rspec.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
class Spork::Server::RSpec < Spork::Server
|
2
|
-
RSPEC_PORT = 8989
|
3
|
-
RSPEC_HELPER_FILE = File.join(Dir.pwd, "spec/spec_helper.rb")
|
4
|
-
|
5
|
-
def self.port
|
6
|
-
(ENV['RSPEC_DRB'] || RSPEC_PORT).to_i
|
7
|
-
end
|
8
|
-
|
9
|
-
def self.helper_file
|
10
|
-
RSPEC_HELPER_FILE
|
11
|
-
end
|
12
|
-
|
13
|
-
def run_tests(argv, stderr, stdout)
|
14
|
-
::Spec::Runner::CommandLine.run(
|
15
|
-
::Spec::Runner::OptionParser.parse(
|
16
|
-
argv,
|
17
|
-
stderr,
|
18
|
-
stdout
|
19
|
-
)
|
20
|
-
)
|
21
|
-
end
|
22
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
-
|
3
|
-
describe Spork::Server::Cucumber do
|
4
|
-
before(:each) do
|
5
|
-
@server = Spork::Server::Cucumber.new
|
6
|
-
end
|
7
|
-
|
8
|
-
it "uses the CUCUMBER_PORT for it's default port" do
|
9
|
-
@server.port.should == Spork::Server::Cucumber::CUCUMBER_PORT
|
10
|
-
end
|
11
|
-
|
12
|
-
it "uses ENV['CUCUMBER_DRB'] as port if present" do
|
13
|
-
orig = ENV['CUCUMBER_DRB']
|
14
|
-
begin
|
15
|
-
ENV['CUCUMBER_DRB'] = "9000"
|
16
|
-
@server.port.should == 9000
|
17
|
-
ensure
|
18
|
-
ENV['CUCUMBER_DRB'] = orig
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
it "uses the CUCUMBER_HELPER_FILE for it's helper_file" do
|
23
|
-
@server.helper_file.should == Spork::Server::Cucumber::CUCUMBER_HELPER_FILE
|
24
|
-
end
|
25
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
-
|
3
|
-
describe Spork::Server::RSpec do
|
4
|
-
before(:each) do
|
5
|
-
@server = Spork::Server::RSpec.new
|
6
|
-
end
|
7
|
-
|
8
|
-
it "uses the RSPEC_PORT for it's default port" do
|
9
|
-
@server.port.should == Spork::Server::RSpec::RSPEC_PORT
|
10
|
-
end
|
11
|
-
|
12
|
-
it "uses ENV['RSPEC_DRB'] as port if present" do
|
13
|
-
orig = ENV['RSPEC_DRB']
|
14
|
-
begin
|
15
|
-
ENV['RSPEC_DRB'] = "9000"
|
16
|
-
@server.port.should == 9000
|
17
|
-
ensure
|
18
|
-
ENV['RSPEC_DRB'] = orig
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
it "uses the RSPEC_HELPER_FILE for it's helper_file" do
|
23
|
-
@server.helper_file.should == Spork::Server::RSpec::RSPEC_HELPER_FILE
|
24
|
-
end
|
25
|
-
end
|