spork 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +70 -0
- data/assets/bootstrap.rb +29 -0
- data/bin/spork +21 -0
- data/lib/spork.rb +40 -0
- data/lib/spork/runner.rb +97 -0
- data/lib/spork/server.rb +159 -0
- data/lib/spork/server/cucumber.rb +24 -0
- data/lib/spork/server/rspec.rb +22 -0
- data/spec/spec_helper.rb +49 -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 +44 -0
- metadata +70 -0
data/README.rdoc
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
= Spork
|
2
|
+
|
3
|
+
* http://github.com/timcharper/spork
|
4
|
+
|
5
|
+
== SYNOPSIS:
|
6
|
+
|
7
|
+
Spork is a Drb spec server (similar to the script/spec_server provided by rspec-rails), except rather than using the Rails constant unloading to reload your files, it forks a copy of the server each time you run your specs. The result? Spork runs more solid: it doesn't get corrupted over time, and it properly handles modules and any voo-doo meta programming you may have put in your app.
|
8
|
+
|
9
|
+
Because Spork uses Kernel.fork, it only works on POSIX systems. This means Windows users are not invited to this party. Sorry :(
|
10
|
+
|
11
|
+
Spork is still experimental, but is performing solid for us.
|
12
|
+
|
13
|
+
== INSTALL:
|
14
|
+
|
15
|
+
[sudo] gem install timcharper-spork --source http://gems.github.com/
|
16
|
+
|
17
|
+
alternatively:
|
18
|
+
|
19
|
+
git clone git://github.com/timcharper/spork.git
|
20
|
+
cd spork
|
21
|
+
gem build spork.gemspec
|
22
|
+
sudo gem install spork.gemspec
|
23
|
+
|
24
|
+
== Usage
|
25
|
+
|
26
|
+
From a terminal, change to your project directory.
|
27
|
+
|
28
|
+
Then, bootstrap your spec/spec_helper.rb file.
|
29
|
+
|
30
|
+
spork --bootstrap
|
31
|
+
|
32
|
+
Next, edit spec/spec_helper.rb and follow the instructions that were put at the top.
|
33
|
+
|
34
|
+
Finally, run spork. A spec DRb server will be running!
|
35
|
+
|
36
|
+
spork
|
37
|
+
|
38
|
+
To get the TextMate RSpec bundle to use spork, go to config->advanced->shell variables, and add TM_RSPEC_OPTS=--drb.
|
39
|
+
|
40
|
+
To run from the command line, use spec --drb spec/lib/my_spec.rb
|
41
|
+
|
42
|
+
Or, you could add --drb to your spec.opts file.
|
43
|
+
|
44
|
+
== Some potential issues and ways to overcome them:
|
45
|
+
|
46
|
+
=== ActiveRecord reports "connection has gone away" for the first few specs
|
47
|
+
|
48
|
+
Not sure why this happens, but if you simply add a line to re-establish your database connection on each line as follows, the problem goes away:
|
49
|
+
|
50
|
+
Spork.each_run do
|
51
|
+
ActiveRecord::Base.establish_connection # make sure that the db connection is ready.
|
52
|
+
end
|
53
|
+
|
54
|
+
=== Couldn't find formatter class Spec::Runner::Formatter::TextMateFormatter Make sure the --require option is specified *before* --format
|
55
|
+
|
56
|
+
On one of our projects, many of us using TextMate with spork, only one developer got this error message while the rest of us ran just fine. I don't know exactly why it happened, but requiring the textmate formatter in the prefork block made it go away, like this:
|
57
|
+
|
58
|
+
Spork.prefork do
|
59
|
+
gem "rspec", "= 1.2.6"
|
60
|
+
require 'spec'
|
61
|
+
...
|
62
|
+
require 'spec/runner/formatter/text_mate_formatter'
|
63
|
+
...
|
64
|
+
end
|
65
|
+
|
66
|
+
== Kudos to
|
67
|
+
|
68
|
+
* Ben Mabey - help with documentation, testing, suggestions, patches, collaborated with Cucumber support.
|
69
|
+
* David Chelimsky - for the fine RSpec testing framework, and the original rspec-rails spec_server implementation, which Spork has built upon.
|
70
|
+
* Lead Media Partners - just for being an awesome place to work.
|
data/assets/bootstrap.rb
ADDED
@@ -0,0 +1,29 @@
|
|
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
|
+
|
data/bin/spork
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'rubygems'
|
3
|
+
gem 'test-unit', '1.2.3' if RUBY_VERSION.to_f >= 1.9 # Why do we need this?
|
4
|
+
|
5
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__) + '/../lib') unless $LOAD_PATH.include?(File.dirname(__FILE__) + '/../lib')
|
6
|
+
|
7
|
+
require 'spork'
|
8
|
+
require 'spork/runner'
|
9
|
+
|
10
|
+
begin
|
11
|
+
success = Spork::Runner.run(ARGV, STDOUT, STDERR)
|
12
|
+
Kernel.exit(success ? 0 : 1)
|
13
|
+
rescue SystemExit => e
|
14
|
+
Kernel.exit(e.status)
|
15
|
+
rescue Exception => e
|
16
|
+
STDERR.puts("#{e.message} (#{e.class})")
|
17
|
+
STDERR.puts(e.backtrace.join("\n"))
|
18
|
+
Kernel.exit 1
|
19
|
+
end
|
20
|
+
|
21
|
+
|
data/lib/spork.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__))) unless $LOAD_PATH.include?(File.expand_path(File.dirname(__FILE__)))
|
2
|
+
module Spork
|
3
|
+
SPEC_HELPER_FILE = File.join(Dir.pwd, "spec/spec_helper.rb")
|
4
|
+
|
5
|
+
class << self
|
6
|
+
def prefork(&block)
|
7
|
+
return if @already_preforked
|
8
|
+
@already_preforked = true
|
9
|
+
yield
|
10
|
+
end
|
11
|
+
|
12
|
+
def each_run(&block)
|
13
|
+
return if @state == :preforking || (@state != :not_using_spork && @already_run)
|
14
|
+
@already_run = true
|
15
|
+
yield
|
16
|
+
end
|
17
|
+
|
18
|
+
def preforking!
|
19
|
+
@state = :preforking
|
20
|
+
end
|
21
|
+
|
22
|
+
def running!
|
23
|
+
@state = :running
|
24
|
+
end
|
25
|
+
|
26
|
+
def state
|
27
|
+
@state ||= :not_using_spork
|
28
|
+
end
|
29
|
+
|
30
|
+
def exec_prefork(helper_file)
|
31
|
+
preforking!
|
32
|
+
load(helper_file)
|
33
|
+
end
|
34
|
+
|
35
|
+
def exec_each_run(helper_file)
|
36
|
+
running!
|
37
|
+
load(helper_file)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/spork/runner.rb
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
require 'spork/server'
|
3
|
+
|
4
|
+
module Spork
|
5
|
+
class Runner
|
6
|
+
attr_reader :server
|
7
|
+
|
8
|
+
def self.run(args, output, error)
|
9
|
+
self.new(args, output, error).run
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize(args, output, error)
|
13
|
+
raise ArgumentError, "expected array of args" unless args.is_a?(Array)
|
14
|
+
@output = output
|
15
|
+
@error = error
|
16
|
+
@options = {}
|
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)
|
32
|
+
end
|
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
|
63
|
+
else
|
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
|
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
|
84
|
+
return true
|
85
|
+
end
|
86
|
+
|
87
|
+
private
|
88
|
+
attr_reader :options
|
89
|
+
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
|
96
|
+
|
97
|
+
|
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 }
|
@@ -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/spec/spec_helper.rb
ADDED
@@ -0,0 +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'
|
31
|
+
require 'spec'
|
32
|
+
|
33
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
34
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
35
|
+
SPEC_TMP_DIR = File.dirname(__FILE__) + "/tmp"
|
36
|
+
require 'spork'
|
37
|
+
require 'spork/runner.rb'
|
38
|
+
require 'spork/server.rb'
|
39
|
+
require 'stringio'
|
40
|
+
|
41
|
+
Spec::Runner.configure do |config|
|
42
|
+
config.before(:each) do
|
43
|
+
$test_stdout = StringIO.new
|
44
|
+
end
|
45
|
+
|
46
|
+
config.after(:each) do
|
47
|
+
FileUtils.rm_rf(SPEC_TMP_DIR)
|
48
|
+
end
|
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
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
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
|
+
|
11
|
+
describe Spork do
|
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]
|
43
|
+
end
|
44
|
+
end
|
metadata
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: spork
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.4.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Tim Harper
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-05-30 00:00:00 -06:00
|
13
|
+
default_executable: spork
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: A forking Drb spec server
|
17
|
+
email:
|
18
|
+
- timcharper+spork@gmail.com
|
19
|
+
executables:
|
20
|
+
- spork
|
21
|
+
extensions: []
|
22
|
+
|
23
|
+
extra_rdoc_files:
|
24
|
+
- README.rdoc
|
25
|
+
files:
|
26
|
+
- README.rdoc
|
27
|
+
- assets/bootstrap.rb
|
28
|
+
- lib/spork.rb
|
29
|
+
- lib/spork/runner.rb
|
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
|
39
|
+
homepage: http://github.com/timcharper/spork
|
40
|
+
post_install_message:
|
41
|
+
rdoc_options:
|
42
|
+
- --main
|
43
|
+
- README.rdoc
|
44
|
+
require_paths:
|
45
|
+
- lib
|
46
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
47
|
+
requirements:
|
48
|
+
- - ">="
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: "0"
|
51
|
+
version:
|
52
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: "0"
|
57
|
+
version:
|
58
|
+
requirements: []
|
59
|
+
|
60
|
+
rubyforge_project: spork
|
61
|
+
rubygems_version: 1.3.1
|
62
|
+
signing_key:
|
63
|
+
specification_version: 2
|
64
|
+
summary: spork
|
65
|
+
test_files:
|
66
|
+
- spec/spec_helper.rb
|
67
|
+
- spec/spork/runner_spec.rb
|
68
|
+
- spec/spork/server/rspec_spec.rb
|
69
|
+
- spec/spork/server_spec.rb
|
70
|
+
- spec/spork_spec.rb
|