timcharper-spork 0.3.1 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|