timcharper-spork 0.3.1 → 0.4.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/bin/spork +2 -0
- data/lib/spork/runner.rb +69 -33
- data/lib/spork/server/cucumber.rb +24 -0
- data/lib/spork/server/rspec.rb +22 -0
- data/lib/spork/server.rb +159 -0
- data/lib/spork.rb +26 -54
- data/spec/spec_helper.rb +40 -0
- data/spec/spork/runner_spec.rb +63 -0
- data/spec/spork/server/rspec_spec.rb +11 -0
- data/spec/spork/server_spec.rb +126 -0
- data/spec/spork_spec.rb +39 -2
- metadata +16 -7
- data/History.txt +0 -10
- data/lib/spork/spec_server.rb +0 -58
data/bin/spork
CHANGED
|
@@ -10,6 +10,8 @@ require 'spork/runner'
|
|
|
10
10
|
begin
|
|
11
11
|
success = Spork::Runner.run(ARGV, STDOUT, STDERR)
|
|
12
12
|
Kernel.exit(success ? 0 : 1)
|
|
13
|
+
rescue SystemExit => e
|
|
14
|
+
Kernel.exit(e.status)
|
|
13
15
|
rescue Exception => e
|
|
14
16
|
STDERR.puts("#{e.message} (#{e.class})")
|
|
15
17
|
STDERR.puts(e.backtrace.join("\n"))
|
data/lib/spork/runner.rb
CHANGED
|
@@ -1,50 +1,86 @@
|
|
|
1
1
|
require 'optparse'
|
|
2
|
+
require 'spork/server'
|
|
2
3
|
|
|
3
4
|
module Spork
|
|
4
5
|
class Runner
|
|
5
|
-
|
|
6
|
+
attr_reader :server
|
|
7
|
+
|
|
6
8
|
def self.run(args, output, error)
|
|
7
9
|
self.new(args, output, error).run
|
|
8
10
|
end
|
|
9
|
-
|
|
11
|
+
|
|
10
12
|
def initialize(args, output, error)
|
|
13
|
+
raise ArgumentError, "expected array of args" unless args.is_a?(Array)
|
|
11
14
|
@output = output
|
|
12
15
|
@error = error
|
|
13
16
|
@options = {}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
@output.puts
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
I can't find the file spec/spec_helper.rb, which I need in order to run.
|
|
31
|
-
|
|
32
|
-
Are you running me from a project directory that has rspec set up?
|
|
33
|
-
USEFUL_ERROR
|
|
34
|
-
return false
|
|
17
|
+
opt = OptionParser.new
|
|
18
|
+
opt.banner = "Usage: spork [test framework name] [options]\n\n"
|
|
19
|
+
|
|
20
|
+
opt.separator "Options:"
|
|
21
|
+
opt.on("-b", "--bootstrap") {|ignore| @options[:bootstrap] = true }
|
|
22
|
+
opt.on("-h", "--help") {|ignore| @options[:help] = true }
|
|
23
|
+
non_option_args = args.select { |arg| ! args[0].match(/^-/) }
|
|
24
|
+
@options[:server_matcher] = non_option_args[0]
|
|
25
|
+
opt.parse!(args)
|
|
26
|
+
|
|
27
|
+
if @options[:help]
|
|
28
|
+
@output.puts opt
|
|
29
|
+
@output.puts
|
|
30
|
+
@output.puts supported_servers_text
|
|
31
|
+
exit(0)
|
|
35
32
|
end
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def supported_servers_text
|
|
36
|
+
text = StringIO.new
|
|
37
|
+
|
|
38
|
+
text.puts "Supported test frameworks:"
|
|
39
|
+
text.puts Spork::Server.supported_servers.sort { |a,b| a.server_name <=> b.server_name }.map { |s| (s.available? ? '(*) ' : '( ) ') + s.server_name }
|
|
40
|
+
text.puts "\nLegend: ( ) - not detected in project (*) - detected\n"
|
|
41
|
+
text.string
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def find_server
|
|
45
|
+
if options[:server_matcher]
|
|
46
|
+
@server = Spork::Server.supported_servers(options[:server_matcher]).first
|
|
47
|
+
unless @server
|
|
48
|
+
@output.puts <<-ERROR
|
|
49
|
+
#{options[:server_matcher].inspect} didn't match a supported test framework.
|
|
50
|
+
|
|
51
|
+
#{supported_servers_text}
|
|
52
|
+
ERROR
|
|
53
|
+
return
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
unless @server.available?
|
|
57
|
+
@output.puts <<-USEFUL_ERROR
|
|
58
|
+
I can't find the helper file #{@server.helper_file} for the #{@server.server_name} testing framework.
|
|
59
|
+
Are you running me from the project directory?
|
|
60
|
+
USEFUL_ERROR
|
|
61
|
+
return
|
|
62
|
+
end
|
|
45
63
|
else
|
|
46
|
-
|
|
64
|
+
@server = Spork::Server.available_servers.first
|
|
65
|
+
if @server.nil?
|
|
66
|
+
@output.puts <<-USEFUL_ERROR
|
|
67
|
+
I can't find any testing frameworks to use.
|
|
68
|
+
Are you running me from a project directory?
|
|
69
|
+
USEFUL_ERROR
|
|
70
|
+
return
|
|
71
|
+
end
|
|
47
72
|
end
|
|
73
|
+
@server
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def run
|
|
77
|
+
return false unless find_server
|
|
78
|
+
ENV["DRB"] = 'true'
|
|
79
|
+
ENV["RAILS_ENV"] ||= 'test' if server.using_rails?
|
|
80
|
+
@output.puts "Using #{server.server_name}"
|
|
81
|
+
return server.bootstrap if options[:bootstrap]
|
|
82
|
+
return(false) unless server.preload
|
|
83
|
+
server.run
|
|
48
84
|
return true
|
|
49
85
|
end
|
|
50
86
|
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
class Spork::Server::Cucumber < Spork::Server
|
|
2
|
+
CUCUMBER_PORT = 8990
|
|
3
|
+
CUCUMBER_HELPER_FILE = File.join(Dir.pwd, "features/support/env.rb")
|
|
4
|
+
|
|
5
|
+
def self.port
|
|
6
|
+
CUCUMBER_PORT
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def self.helper_file
|
|
10
|
+
CUCUMBER_HELPER_FILE
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def self.step_mother=(value)
|
|
14
|
+
@step_mother = value
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def run_tests(argv, stderr, stdout)
|
|
18
|
+
require 'cucumber/cli/main'
|
|
19
|
+
::Cucumber::Cli::Main.step_mother = @step_mother
|
|
20
|
+
::Cucumber::Cli::Main.new(argv, stderr, stdout).execute!(@step_mother)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
Spork::Server::Cucumber.step_mother = self
|
|
@@ -0,0 +1,22 @@
|
|
|
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
|
+
RSPEC_PORT
|
|
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
|
data/lib/spork/server.rb
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
require 'drb/drb'
|
|
2
|
+
require 'rbconfig'
|
|
3
|
+
|
|
4
|
+
# This is based off of spec_server.rb from rspec-rails (David Chelimsky), which was based on Florian Weber's TDDMate
|
|
5
|
+
class Spork::Server
|
|
6
|
+
@@supported_servers = []
|
|
7
|
+
|
|
8
|
+
LOAD_PREFERENCE = ['RSpec', 'Cucumber']
|
|
9
|
+
BOOTSTRAP_FILE = File.dirname(__FILE__) + "/../../assets/bootstrap.rb"
|
|
10
|
+
|
|
11
|
+
def self.port
|
|
12
|
+
raise NotImplemented
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def self.helper_file
|
|
16
|
+
raise NotImplemented
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def self.server_name
|
|
20
|
+
self.name.gsub('Spork::Server::', '')
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def self.inherited(subclass)
|
|
24
|
+
@@supported_servers << subclass
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def self.available_servers
|
|
28
|
+
supported_servers.select { |s| s.available? }
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def self.supported_servers(starting_with = nil)
|
|
32
|
+
@@supported_servers.sort! { |a,b| a.load_preference_index <=> b.load_preference_index }
|
|
33
|
+
return @@supported_servers if starting_with.nil?
|
|
34
|
+
@@supported_servers.select do |s|
|
|
35
|
+
s.server_name.match(/^#{Regexp.escape(starting_with)}/i)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def self.available?
|
|
40
|
+
File.exist?(helper_file)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def self.load_preference_index
|
|
44
|
+
LOAD_PREFERENCE.index(server_name) || LOAD_PREFERENCE.length
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def self.using_rails?
|
|
48
|
+
File.exist?("config/environment.rb")
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def self.bootstrapped?
|
|
52
|
+
File.read(helper_file).include?("Spork.prefork")
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def self.bootstrap
|
|
56
|
+
if bootstrapped?
|
|
57
|
+
puts "Already bootstrapped!"
|
|
58
|
+
return
|
|
59
|
+
end
|
|
60
|
+
puts "Bootstrapping #{helper_file}."
|
|
61
|
+
contents = File.read(helper_file)
|
|
62
|
+
bootstrap_code = File.read(BOOTSTRAP_FILE)
|
|
63
|
+
File.open(helper_file, "wb") do |f|
|
|
64
|
+
f.puts bootstrap_code
|
|
65
|
+
f.puts contents
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
puts "Done. Edit #{helper_file} now with your favorite text editor and follow the instructions."
|
|
69
|
+
true
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def self.run
|
|
73
|
+
return unless available?
|
|
74
|
+
new.listen
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def listen
|
|
78
|
+
trap("SIGINT") { sig_int_received }
|
|
79
|
+
trap("SIGTERM") { abort; exit!(0) }
|
|
80
|
+
trap("USR2") { abort; restart } if Signal.list.has_key?("USR2")
|
|
81
|
+
DRb.start_service("druby://127.0.0.1:#{port}", self)
|
|
82
|
+
puts "Spork is ready and listening on #{port}!"
|
|
83
|
+
DRb.thread.join
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def port
|
|
87
|
+
self.class.port
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def helper_file
|
|
91
|
+
self.class.helper_file
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def run(argv, stderr, stdout)
|
|
95
|
+
return false if running?
|
|
96
|
+
$stdout = stdout
|
|
97
|
+
$stderr = stderr
|
|
98
|
+
@child_pid = Kernel.fork do
|
|
99
|
+
Spork.exec_each_run(helper_file)
|
|
100
|
+
run_tests(argv, stderr, stdout)
|
|
101
|
+
end
|
|
102
|
+
Process.wait(@child_pid)
|
|
103
|
+
@child_pid = nil
|
|
104
|
+
true
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def running?
|
|
108
|
+
!! @child_pid
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
private
|
|
112
|
+
def self.preload
|
|
113
|
+
if bootstrapped?
|
|
114
|
+
puts "Loading Spork.prefork block..."
|
|
115
|
+
Spork.exec_prefork(helper_file)
|
|
116
|
+
else
|
|
117
|
+
puts "#{helper_file} has not been sporked. Run spork --bootstrap to do so."
|
|
118
|
+
# are we in a rails app?
|
|
119
|
+
if using_rails?
|
|
120
|
+
puts "Preloading Rails environment"
|
|
121
|
+
require "config/environment.rb"
|
|
122
|
+
else
|
|
123
|
+
puts "There's nothing I can really do for you. Bailing."
|
|
124
|
+
return false
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
true
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def run_tests(argv, input, output)
|
|
131
|
+
raise NotImplemented
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def restart
|
|
135
|
+
puts "restarting"
|
|
136
|
+
config = ::Config::CONFIG
|
|
137
|
+
ruby = File::join(config['bindir'], config['ruby_install_name']) + config['EXEEXT']
|
|
138
|
+
command_line = [ruby, $0, ARGV].flatten.join(' ')
|
|
139
|
+
exec(command_line)
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def abort
|
|
143
|
+
if running?
|
|
144
|
+
Process.kill(Signal.list['TERM'], @child_pid)
|
|
145
|
+
true
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def sig_int_received
|
|
150
|
+
if running?
|
|
151
|
+
abort
|
|
152
|
+
puts "Running specs stopped. Press CTRL-C again to stop the server."
|
|
153
|
+
else
|
|
154
|
+
exit!(0)
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
Dir[File.dirname(__FILE__) + "/server/*.rb"].each { |file| require file }
|
data/lib/spork.rb
CHANGED
|
@@ -2,67 +2,39 @@ $LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__))) unless $LOAD_PATH.i
|
|
|
2
2
|
module Spork
|
|
3
3
|
SPEC_HELPER_FILE = File.join(Dir.pwd, "spec/spec_helper.rb")
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def self.each_run(&block)
|
|
12
|
-
return if @state == :preforking || (@state != :not_using_spork && @already_run)
|
|
13
|
-
@already_run = true
|
|
14
|
-
yield
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
def self.preforking!
|
|
18
|
-
@state = :preforking
|
|
19
|
-
end
|
|
5
|
+
class << self
|
|
6
|
+
def prefork(&block)
|
|
7
|
+
return if @already_preforked
|
|
8
|
+
@already_preforked = true
|
|
9
|
+
yield
|
|
10
|
+
end
|
|
20
11
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
12
|
+
def each_run(&block)
|
|
13
|
+
return if @state == :preforking || (@state != :not_using_spork && @already_run)
|
|
14
|
+
@already_run = true
|
|
15
|
+
yield
|
|
16
|
+
end
|
|
24
17
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
18
|
+
def preforking!
|
|
19
|
+
@state = :preforking
|
|
20
|
+
end
|
|
28
21
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
22
|
+
def running!
|
|
23
|
+
@state = :running
|
|
24
|
+
end
|
|
32
25
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
26
|
+
def state
|
|
27
|
+
@state ||= :not_using_spork
|
|
28
|
+
end
|
|
36
29
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
bootstrap_code = File.read(File.dirname(__FILE__) + "/../assets/bootstrap.rb")
|
|
41
|
-
File.open(SPEC_HELPER_FILE, "wb") do |f|
|
|
42
|
-
f.puts bootstrap_code
|
|
43
|
-
f.puts contents
|
|
30
|
+
def exec_prefork(helper_file)
|
|
31
|
+
preforking!
|
|
32
|
+
load(helper_file)
|
|
44
33
|
end
|
|
45
|
-
|
|
46
|
-
puts "Done. Edit #{SPEC_HELPER_FILE} now with your favorite text editor and follow the instructions."
|
|
47
|
-
true
|
|
48
|
-
end
|
|
49
34
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
Spork.preforking!
|
|
54
|
-
load SPEC_HELPER_FILE
|
|
55
|
-
else
|
|
56
|
-
puts "spec_helper.rb is has not been sporked. Run spork --bootstrap to do so."
|
|
57
|
-
# are we in a rails app?
|
|
58
|
-
if using_rails?
|
|
59
|
-
puts "Preloading Rails environment"
|
|
60
|
-
require "config/environment.rb"
|
|
61
|
-
else
|
|
62
|
-
puts "There's nothing I can really do for you. Bailing."
|
|
63
|
-
return false
|
|
64
|
-
end
|
|
35
|
+
def exec_each_run(helper_file)
|
|
36
|
+
running!
|
|
37
|
+
load(helper_file)
|
|
65
38
|
end
|
|
66
|
-
true
|
|
67
39
|
end
|
|
68
40
|
end
|
data/spec/spec_helper.rb
CHANGED
|
@@ -1,9 +1,49 @@
|
|
|
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
|
+
require 'rubygems'
|
|
1
31
|
require 'spec'
|
|
2
32
|
|
|
3
33
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
|
4
34
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
|
35
|
+
SPEC_TMP_DIR = File.dirname(__FILE__) + "/tmp"
|
|
5
36
|
require 'spork'
|
|
37
|
+
require 'spork/runner.rb'
|
|
38
|
+
require 'spork/server.rb'
|
|
39
|
+
require 'stringio'
|
|
6
40
|
|
|
7
41
|
Spec::Runner.configure do |config|
|
|
42
|
+
config.before(:each) do
|
|
43
|
+
$test_stdout = StringIO.new
|
|
44
|
+
end
|
|
8
45
|
|
|
46
|
+
config.after(:each) do
|
|
47
|
+
FileUtils.rm_rf(SPEC_TMP_DIR)
|
|
48
|
+
end
|
|
9
49
|
end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Spork::Runner do
|
|
4
|
+
before(:each) do
|
|
5
|
+
@out, @err = StringIO.new, StringIO.new
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
it "finds a matching server with a prefix" do
|
|
9
|
+
Spork::Runner.new(["rs"], @out, @err).find_server.should == Spork::Server::RSpec
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it "shows an error message if no matching server was found" do
|
|
13
|
+
Spork::Runner.new(["argle_bargle"], @out, @err).run.should == false
|
|
14
|
+
@out.string.should include(%("argle_bargle" didn't match a supported test framework))
|
|
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
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "bootstraps a server when -b is passed in" do
|
|
30
|
+
Spork::Server::RSpec.stub!(:available?).and_return(true)
|
|
31
|
+
Spork::Server::RSpec.should_receive(:bootstrap).and_return(true)
|
|
32
|
+
Spork::Runner.new(['rspec', '-b'], @out, @err).run
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "aborts if it can't preload" do
|
|
36
|
+
Spork::Server::RSpec.stub!(:available?).and_return(true)
|
|
37
|
+
Spork::Server::RSpec.should_receive(:preload).and_return(false)
|
|
38
|
+
Spork::Server::RSpec.should_not_receive(:run)
|
|
39
|
+
Spork::Runner.new(['rspec'], @out, @err).run
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it "runs the server if all is well" do
|
|
43
|
+
Spork::Server::RSpec.stub!(:available?).and_return(true)
|
|
44
|
+
Spork::Server::RSpec.should_receive(:preload).and_return(true)
|
|
45
|
+
Spork::Server::RSpec.should_receive(:run).and_return(true)
|
|
46
|
+
Spork::Runner.new(['rspec'], @out, @err).run
|
|
47
|
+
@out.string.should include("Using RSpec")
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it "outputs a list of supported servers, along with supported asterisk" do
|
|
51
|
+
Spork::Server.stub!(:supported_servers).and_return([Spork::Server::RSpec, Spork::Server::Cucumber])
|
|
52
|
+
Spork::Server::RSpec.stub!(:available?).and_return(true)
|
|
53
|
+
Spork::Server::Cucumber.stub!(:available?).and_return(false)
|
|
54
|
+
|
|
55
|
+
Spork::Runner.new(['rspec'], @out, @err).supported_servers_text.should == <<-EOF
|
|
56
|
+
Supported test frameworks:
|
|
57
|
+
( ) Cucumber
|
|
58
|
+
(*) RSpec
|
|
59
|
+
|
|
60
|
+
Legend: ( ) - not detected in project (*) - detected
|
|
61
|
+
EOF
|
|
62
|
+
end
|
|
63
|
+
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Spork::Server::RSpec do
|
|
4
|
+
before(:each) do
|
|
5
|
+
@adapter = Spork::Adapter::RSpec.new
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
it "uses the RSPEC_PORT for it's port" do
|
|
9
|
+
@adapter.port.should == Spork::Adapter::RSpec::RSPEC_PORT
|
|
10
|
+
end
|
|
11
|
+
end
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
|
2
|
+
|
|
3
|
+
class FakeServer < Spork::Server
|
|
4
|
+
attr_accessor :wait_time
|
|
5
|
+
def self.helper_file
|
|
6
|
+
SPEC_TMP_DIR + "/fake/test_helper.rb"
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def self.port
|
|
10
|
+
1000
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def self.puts(string)
|
|
14
|
+
$test_stdout.puts(string)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def puts(string)
|
|
18
|
+
$test_stdout.puts(string)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def run_tests(argv, input, output)
|
|
22
|
+
sleep(@wait_time || 0.5)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
describe Spork::Server do
|
|
27
|
+
describe ".available_servers" do
|
|
28
|
+
before(:each) do
|
|
29
|
+
Spork::Server.supported_servers.each { |s| s.stub!(:available?).and_return(false) }
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it "returns a list of all available servers" do
|
|
33
|
+
Spork::Server.available_servers.should == []
|
|
34
|
+
Spork::Server::RSpec.stub!(:available?).and_return(true)
|
|
35
|
+
Spork::Server.available_servers.should == [Spork::Server::RSpec]
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "returns rspec before cucumber when both are available" do
|
|
39
|
+
Spork::Server::RSpec.stub!(:available?).and_return(true)
|
|
40
|
+
Spork::Server::Cucumber.stub!(:available?).and_return(true)
|
|
41
|
+
Spork::Server.available_servers.should == [Spork::Server::RSpec, Spork::Server::Cucumber]
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
describe ".supported_servers" do
|
|
46
|
+
it "returns all defined servers" do
|
|
47
|
+
Spork::Server.supported_servers.should include(Spork::Server::RSpec)
|
|
48
|
+
Spork::Server.supported_servers.should include(Spork::Server::Cucumber)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it "returns a list of servers matching a case-insensitive prefix" do
|
|
52
|
+
Spork::Server.supported_servers("rspec").should == [Spork::Server::RSpec]
|
|
53
|
+
Spork::Server.supported_servers("rs").should == [Spork::Server::RSpec]
|
|
54
|
+
Spork::Server.supported_servers("cuc").should == [Spork::Server::Cucumber]
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
describe "a fake server" do
|
|
59
|
+
def create_helper_file
|
|
60
|
+
FileUtils.mkdir_p(File.dirname(FakeServer.helper_file))
|
|
61
|
+
FileUtils.touch(FakeServer.helper_file)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
before(:each) do
|
|
65
|
+
@fake = FakeServer.new
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
it "should be available when the helper_file exists" do
|
|
69
|
+
FakeServer.available?.should == false
|
|
70
|
+
create_helper_file
|
|
71
|
+
FakeServer.available?.should == true
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
it "has a name" do
|
|
75
|
+
FakeServer.server_name.should == "FakeServer"
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
it "tells if it's testing framework is being used" do
|
|
79
|
+
Spork::Server.available_servers.should_not include(FakeServer)
|
|
80
|
+
create_helper_file
|
|
81
|
+
Spork::Server.available_servers.should include(FakeServer)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
it "recognizes if the helper_file has been bootstrapped" do
|
|
85
|
+
bootstrap_contents = File.read(FakeServer::BOOTSTRAP_FILE)
|
|
86
|
+
File.stub!(:read).with(FakeServer.helper_file).and_return("")
|
|
87
|
+
FakeServer.bootstrapped?.should == false
|
|
88
|
+
File.stub!(:read).with(FakeServer.helper_file).and_return(bootstrap_contents)
|
|
89
|
+
FakeServer.bootstrapped?.should == true
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
it "bootstraps a file" do
|
|
93
|
+
create_helper_file
|
|
94
|
+
FakeServer.bootstrap
|
|
95
|
+
|
|
96
|
+
$test_stdout.string.should include("Bootstrapping")
|
|
97
|
+
$test_stdout.string.should include("Edit")
|
|
98
|
+
$test_stdout.string.should include("favorite text editor")
|
|
99
|
+
|
|
100
|
+
File.read(FakeServer.helper_file).should include(File.read(FakeServer::BOOTSTRAP_FILE))
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
it "prevents you from running specs twice in parallel" do
|
|
104
|
+
create_helper_file
|
|
105
|
+
@fake.wait_time = 0.25
|
|
106
|
+
first_run = Thread.new { @fake.run("test", STDOUT, STDIN).should == true }
|
|
107
|
+
sleep(0.05)
|
|
108
|
+
@fake.run("test", STDOUT, STDIN).should == false
|
|
109
|
+
|
|
110
|
+
# wait for the first to finish
|
|
111
|
+
first_run.join
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
it "can abort the current run" do
|
|
115
|
+
create_helper_file
|
|
116
|
+
@fake.wait_time = 5
|
|
117
|
+
started_at = Time.now
|
|
118
|
+
first_run = Thread.new { @fake.run("test", STDOUT, STDIN).should == true }
|
|
119
|
+
sleep(0.05)
|
|
120
|
+
@fake.send(:abort)
|
|
121
|
+
sleep(0.01) while @fake.running?
|
|
122
|
+
|
|
123
|
+
(Time.now - started_at).should < @fake.wait_time
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
data/spec/spork_spec.rb
CHANGED
|
@@ -1,7 +1,44 @@
|
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
|
2
2
|
|
|
3
|
+
Spork.class_eval do
|
|
4
|
+
def self.reset!
|
|
5
|
+
@state = nil
|
|
6
|
+
@already_run = nil
|
|
7
|
+
@already_preforked = nil
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
3
11
|
describe Spork do
|
|
4
|
-
|
|
5
|
-
|
|
12
|
+
before(:each) do
|
|
13
|
+
Spork.reset!
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def spec_helper_simulator
|
|
17
|
+
ran = []
|
|
18
|
+
Spork.prefork do
|
|
19
|
+
ran << :prefork
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
Spork.each_run do
|
|
23
|
+
ran << :each_run
|
|
24
|
+
end
|
|
25
|
+
ran
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it "only runs the preload block when preforking" do
|
|
29
|
+
ran = []
|
|
30
|
+
Spork.preforking!
|
|
31
|
+
spec_helper_simulator.should == [:prefork]
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "only runs the each_run block when running" do
|
|
35
|
+
Spork.preforking!
|
|
36
|
+
spec_helper_simulator
|
|
37
|
+
Spork.running!
|
|
38
|
+
spec_helper_simulator.should == [:each_run]
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it "runs both blocks when Spork not activated" do
|
|
42
|
+
spec_helper_simulator.should == [:prefork, :each_run]
|
|
6
43
|
end
|
|
7
44
|
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.4.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-05-
|
|
12
|
+
date: 2009-05-29 00:00:00 -07:00
|
|
13
13
|
default_executable: spork
|
|
14
14
|
dependencies: []
|
|
15
15
|
|
|
@@ -23,13 +23,19 @@ extensions: []
|
|
|
23
23
|
extra_rdoc_files:
|
|
24
24
|
- README.rdoc
|
|
25
25
|
files:
|
|
26
|
-
- History.txt
|
|
27
26
|
- README.rdoc
|
|
28
27
|
- assets/bootstrap.rb
|
|
29
28
|
- lib/spork.rb
|
|
30
29
|
- lib/spork/runner.rb
|
|
31
|
-
- lib/spork/
|
|
32
|
-
|
|
30
|
+
- lib/spork/server.rb
|
|
31
|
+
- lib/spork/server/cucumber.rb
|
|
32
|
+
- lib/spork/server/rspec.rb
|
|
33
|
+
- spec/spec_helper.rb
|
|
34
|
+
- spec/spork/runner_spec.rb
|
|
35
|
+
- spec/spork/server/rspec_spec.rb
|
|
36
|
+
- spec/spork/server_spec.rb
|
|
37
|
+
- spec/spork_spec.rb
|
|
38
|
+
has_rdoc: true
|
|
33
39
|
homepage: http://github.com/timcharper/spork
|
|
34
40
|
post_install_message:
|
|
35
41
|
rdoc_options:
|
|
@@ -54,8 +60,11 @@ requirements: []
|
|
|
54
60
|
rubyforge_project: spork
|
|
55
61
|
rubygems_version: 1.2.0
|
|
56
62
|
signing_key:
|
|
57
|
-
specification_version:
|
|
58
|
-
summary: spork
|
|
63
|
+
specification_version: 2
|
|
64
|
+
summary: spork
|
|
59
65
|
test_files:
|
|
60
66
|
- spec/spec_helper.rb
|
|
67
|
+
- spec/spork/runner_spec.rb
|
|
68
|
+
- spec/spork/server/rspec_spec.rb
|
|
69
|
+
- spec/spork/server_spec.rb
|
|
61
70
|
- spec/spork_spec.rb
|
data/History.txt
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
== 0.3.x (Git)
|
|
2
|
-
=== New Features
|
|
3
|
-
|
|
4
|
-
=== Bugfixes
|
|
5
|
-
|
|
6
|
-
== 0.3.1 2009-05-25
|
|
7
|
-
* Extracted bin logic into Runner file, improved requiring and load path setup, and cleaned up file organization. (Ben Mabey)
|
|
8
|
-
|
|
9
|
-
== 0.3.0 2009-05
|
|
10
|
-
* Initial release with SpecServer, Bootstraper, and basic option parsing. (Tim Harper)
|
data/lib/spork/spec_server.rb
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
require 'drb/drb'
|
|
2
|
-
require 'rbconfig'
|
|
3
|
-
|
|
4
|
-
# This is based off of spec_server.rb from rspec-rails (David Chelimsky), which was based on Florian Weber's TDDMate
|
|
5
|
-
class Spork::SpecServer
|
|
6
|
-
DRB_PORT = 8989
|
|
7
|
-
def self.restart_test_server
|
|
8
|
-
puts "restarting"
|
|
9
|
-
config = ::Config::CONFIG
|
|
10
|
-
ruby = File::join(config['bindir'], config['ruby_install_name']) + config['EXEEXT']
|
|
11
|
-
command_line = [ruby, $0, ARGV].flatten.join(' ')
|
|
12
|
-
exec(command_line)
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def self.daemonize(pid_file = nil)
|
|
16
|
-
return yield if $DEBUG
|
|
17
|
-
pid = Process.fork{
|
|
18
|
-
Process.setsid
|
|
19
|
-
trap("SIGINT"){ exit! 0 }
|
|
20
|
-
trap("SIGTERM"){ exit! 0 }
|
|
21
|
-
trap("SIGHUP"){ restart_test_server }
|
|
22
|
-
File.open("/dev/null"){|f|
|
|
23
|
-
STDERR.reopen f
|
|
24
|
-
STDIN.reopen f
|
|
25
|
-
STDOUT.reopen f
|
|
26
|
-
}
|
|
27
|
-
run
|
|
28
|
-
}
|
|
29
|
-
puts "spec_server launched (PID: %d)" % pid
|
|
30
|
-
File.open(pid_file,"w"){|f| f.puts pid } if pid_file
|
|
31
|
-
exit! 0
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
def self.run
|
|
35
|
-
trap("USR2") { ::Spork::SpecServer.restart_test_server } if Signal.list.has_key?("USR2")
|
|
36
|
-
DRb.start_service("druby://127.0.0.1:#{DRB_PORT}", ::Spork::SpecServer.new)
|
|
37
|
-
puts "Spork is ready and listening on #{DRB_PORT}!"
|
|
38
|
-
DRb.thread.join
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def run(argv, stderr, stdout)
|
|
42
|
-
$stdout = stdout
|
|
43
|
-
$stderr = stderr
|
|
44
|
-
child_pid = Kernel.fork do
|
|
45
|
-
Spork.running!
|
|
46
|
-
load ::Spork::SPEC_HELPER_FILE
|
|
47
|
-
|
|
48
|
-
::Spec::Runner::CommandLine.run(
|
|
49
|
-
::Spec::Runner::OptionParser.parse(
|
|
50
|
-
argv,
|
|
51
|
-
$stderr,
|
|
52
|
-
$stdout
|
|
53
|
-
)
|
|
54
|
-
)
|
|
55
|
-
end
|
|
56
|
-
Process.wait(child_pid)
|
|
57
|
-
end
|
|
58
|
-
end
|