timcharper-spork 0.3
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 +45 -0
- data/lib/spork/spec_server.rb +58 -0
- data/lib/spork.rb +67 -0
- metadata +59 -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.
|
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,45 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
gem 'test-unit', '1.2.3' if RUBY_VERSION.to_f >= 1.9
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'spork'
|
6
|
+
require 'optparse'
|
7
|
+
|
8
|
+
ENV["DRB"] = 'true'
|
9
|
+
ENV["RAILS_ENV"] ||= 'test' if Spork.using_rails?
|
10
|
+
|
11
|
+
options = {}
|
12
|
+
parser = OptionParser.new
|
13
|
+
parser.on("-d", "--daemon") {|ignore| options[:daemon] = true }
|
14
|
+
parser.on("-b", "--bootstrap") {|ignore| options[:bootstrap] = true }
|
15
|
+
parser.on("-p", "--pid PIDFILE"){|pid| options[:pid] = pid }
|
16
|
+
parser.parse!(ARGV)
|
17
|
+
|
18
|
+
unless File.exist?(Spork::SPEC_HELPER_FILE)
|
19
|
+
puts <<-USEFUL_ERROR
|
20
|
+
Bummer!
|
21
|
+
|
22
|
+
I can't find the file spec/spec_helper.rb, which I need in order to run.
|
23
|
+
|
24
|
+
Are you running me from a project directory that has rspec set up?
|
25
|
+
USEFUL_ERROR
|
26
|
+
exit 1
|
27
|
+
end
|
28
|
+
|
29
|
+
if options[:bootstrap]
|
30
|
+
if Spork.bootstrap
|
31
|
+
exit 0
|
32
|
+
else
|
33
|
+
exit 1
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
require 'spork/spec_server'
|
38
|
+
Spork.preload || exit(1)
|
39
|
+
|
40
|
+
if options[:daemon]
|
41
|
+
::Spork::SpecServer.daemonize(options[:pid])
|
42
|
+
else
|
43
|
+
::Spork::SpecServer.run
|
44
|
+
end
|
45
|
+
|
@@ -0,0 +1,58 @@
|
|
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
|
data/lib/spork.rb
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
module Spork
|
2
|
+
SPEC_HELPER_FILE = File.join(Dir.pwd, "spec/spec_helper.rb")
|
3
|
+
|
4
|
+
def self.prefork(&block)
|
5
|
+
return if @already_preforked
|
6
|
+
@already_preforked = true
|
7
|
+
yield
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.each_run(&block)
|
11
|
+
return if @state == :preforking || (@state != :not_using_spork && @already_run)
|
12
|
+
@already_run = true
|
13
|
+
yield
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.preforking!
|
17
|
+
@state = :preforking
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.running!
|
21
|
+
@state = :running
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.state
|
25
|
+
@state ||= :not_using_spork
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.using_rails?
|
29
|
+
File.exist?("config/environment.rb")
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.using_prefork?
|
33
|
+
File.read(SPEC_HELPER_FILE).include?("Spork.prefork")
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.bootstrap
|
37
|
+
puts "Bootstrapping #{SPEC_HELPER_FILE}"
|
38
|
+
contents = File.read(SPEC_HELPER_FILE)
|
39
|
+
bootstrap_code = File.read(File.dirname(__FILE__) + "/../assets/bootstrap.rb")
|
40
|
+
File.open(SPEC_HELPER_FILE, "wb") do |f|
|
41
|
+
f.puts bootstrap_code
|
42
|
+
f.puts contents
|
43
|
+
end
|
44
|
+
|
45
|
+
puts "Done. Edit #{SPEC_HELPER_FILE} now with your favorite text editor and follow the instructions."
|
46
|
+
true
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.preload
|
50
|
+
if using_prefork?
|
51
|
+
puts "Loading Spork.prefork block..."
|
52
|
+
Spork.preforking!
|
53
|
+
load SPEC_HELPER_FILE
|
54
|
+
else
|
55
|
+
puts "spec_helper.rb is has not been sporked. Run spork --bootstrap to do so."
|
56
|
+
# are we in a rails app?
|
57
|
+
if using_rails?
|
58
|
+
puts "Preloading Rails environment"
|
59
|
+
require "config/environment.rb"
|
60
|
+
else
|
61
|
+
puts "There's nothing I can really do for you. Bailing."
|
62
|
+
return false
|
63
|
+
end
|
64
|
+
end
|
65
|
+
true
|
66
|
+
end
|
67
|
+
end
|
metadata
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: timcharper-spork
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: "0.3"
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Tim Harper
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-05-20 00:00:00 -07:00
|
13
|
+
default_executable:
|
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
|
+
- lib/spork
|
28
|
+
- lib/spork/spec_server.rb
|
29
|
+
- lib/spork.rb
|
30
|
+
- assets/bootstrap.rb
|
31
|
+
has_rdoc: true
|
32
|
+
homepage: http://github.com/timcharper/spork
|
33
|
+
post_install_message:
|
34
|
+
rdoc_options:
|
35
|
+
- --main
|
36
|
+
- README.rdoc
|
37
|
+
require_paths:
|
38
|
+
- lib
|
39
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: "0"
|
44
|
+
version:
|
45
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: "0"
|
50
|
+
version:
|
51
|
+
requirements: []
|
52
|
+
|
53
|
+
rubyforge_project: spork
|
54
|
+
rubygems_version: 1.2.0
|
55
|
+
signing_key:
|
56
|
+
specification_version: 2
|
57
|
+
summary: spork 0.3
|
58
|
+
test_files: []
|
59
|
+
|