add a simple runner for autospec
This commit is contained in:
parent
666264879c
commit
1357f16563
|
@ -0,0 +1,22 @@
|
||||||
|
module Autospec
|
||||||
|
class BaseRunner
|
||||||
|
def run(args, specs)
|
||||||
|
end
|
||||||
|
|
||||||
|
def abort
|
||||||
|
end
|
||||||
|
|
||||||
|
def reload
|
||||||
|
end
|
||||||
|
|
||||||
|
def running?
|
||||||
|
true
|
||||||
|
end
|
||||||
|
|
||||||
|
def start
|
||||||
|
end
|
||||||
|
|
||||||
|
def stop
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -2,6 +2,9 @@ require "drb/drb"
|
||||||
require "thread"
|
require "thread"
|
||||||
require "fileutils"
|
require "fileutils"
|
||||||
require "autospec/reload_css"
|
require "autospec/reload_css"
|
||||||
|
require "autospec/base_runner"
|
||||||
|
require "autospec/simple_runner"
|
||||||
|
require "autospec/spork_runner"
|
||||||
|
|
||||||
module Autospec; end
|
module Autospec; end
|
||||||
|
|
||||||
|
@ -48,19 +51,19 @@ class Autospec::Runner
|
||||||
end
|
end
|
||||||
|
|
||||||
def run(opts = {})
|
def run(opts = {})
|
||||||
if already_running?(pid_file)
|
|
||||||
puts "autospec appears to be running, it is possible the pid file is old"
|
|
||||||
puts "if you are sure it is not running, delete #{pid_file}"
|
|
||||||
return
|
|
||||||
end
|
|
||||||
write_pid_file(pid_file, Process.pid)
|
|
||||||
|
|
||||||
start_spork
|
|
||||||
Signal.trap("HUP") {stop_spork; exit }
|
|
||||||
Signal.trap("SIGINT") {stop_spork; exit }
|
|
||||||
|
|
||||||
puts "Forced polling (slower) - inotify does not work on network filesystems, use local filesystem to avoid" if opts[:force_polling]
|
puts "Forced polling (slower) - inotify does not work on network filesystems, use local filesystem to avoid" if opts[:force_polling]
|
||||||
|
|
||||||
|
if ENV["SPORK"] == 0
|
||||||
|
@runner = Autospec::SimpleRunner.new
|
||||||
|
else
|
||||||
|
@runner = Autospec::SporkRunner.new
|
||||||
|
end
|
||||||
|
@runner.start
|
||||||
|
|
||||||
|
Signal.trap("HUP") {@runner.stop; exit }
|
||||||
|
Signal.trap("SIGINT") {@runner.stop; exit }
|
||||||
|
|
||||||
options = {filter: /^app|^spec|^lib/, relative_paths: true}
|
options = {filter: /^app|^spec|^lib/, relative_paths: true}
|
||||||
|
|
||||||
if opts[:force_polling]
|
if opts[:force_polling]
|
||||||
|
@ -79,22 +82,14 @@ class Autospec::Runner
|
||||||
@signal.signal
|
@signal.signal
|
||||||
end
|
end
|
||||||
|
|
||||||
spork_running = true
|
while @runner.running?
|
||||||
Thread.new do
|
|
||||||
Process.wait(@spork_pid)
|
|
||||||
spork_running = false
|
|
||||||
end
|
|
||||||
|
|
||||||
while spork_running
|
|
||||||
process_queue
|
process_queue
|
||||||
end
|
end
|
||||||
|
|
||||||
puts "Spork has been terminated, exiting"
|
|
||||||
|
|
||||||
rescue => e
|
rescue => e
|
||||||
puts e
|
puts e
|
||||||
puts e.backtrace
|
puts e.backtrace
|
||||||
stop_spork
|
@runner.stop
|
||||||
end
|
end
|
||||||
|
|
||||||
def process_queue
|
def process_queue
|
||||||
|
@ -168,15 +163,13 @@ class Autospec::Runner
|
||||||
|
|
||||||
def process_change(files)
|
def process_change(files)
|
||||||
return unless files.length > 0
|
return unless files.length > 0
|
||||||
|
|
||||||
specs = []
|
specs = []
|
||||||
hit = false
|
hit = false
|
||||||
files.each do |file|
|
files.each do |file|
|
||||||
RELOAD_MATCHERS.each do |k|
|
RELOAD_MATCHERS.each do |k|
|
||||||
if k.match(file)
|
if k.match(file)
|
||||||
spork_service.abort
|
@runner.reload
|
||||||
stop_spork
|
|
||||||
sleep 1
|
|
||||||
start_spork
|
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -213,7 +206,7 @@ class Autospec::Runner
|
||||||
end
|
end
|
||||||
return
|
return
|
||||||
else
|
else
|
||||||
spork_service.abort
|
@runner.abort
|
||||||
end
|
end
|
||||||
|
|
||||||
@mutex.synchronize do
|
@mutex.synchronize do
|
||||||
|
@ -305,72 +298,9 @@ class Autospec::Runner
|
||||||
"-r", "#{File.dirname(__FILE__)}/formatter.rb",
|
"-r", "#{File.dirname(__FILE__)}/formatter.rb",
|
||||||
"-f", "Autospec::Formatter"].flatten
|
"-f", "Autospec::Formatter"].flatten
|
||||||
|
|
||||||
spork_service.run(args,$stderr,$stdout)
|
@runner.run(args, specs)
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
def spork_pid_file
|
|
||||||
Rails.root + "tmp/pids/spork.pid"
|
|
||||||
end
|
|
||||||
|
|
||||||
def pid_file
|
|
||||||
Rails.root + "tmp/pids/autospec.pid"
|
|
||||||
end
|
|
||||||
|
|
||||||
def already_running?(pid_file)
|
|
||||||
if File.exists? pid_file
|
|
||||||
pid = File.read(pid_file).to_i
|
|
||||||
Process.getpgid(pid) rescue nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def write_pid_file(file,pid)
|
|
||||||
FileUtils.mkdir_p(Rails.root + "tmp/pids")
|
|
||||||
File.open(file,'w') do |f|
|
|
||||||
f.write(pid)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def spork_running?
|
|
||||||
spork_service.port rescue nil
|
|
||||||
end
|
|
||||||
|
|
||||||
def spork_service
|
|
||||||
|
|
||||||
unless @drb_listener_running
|
|
||||||
begin
|
|
||||||
DRb.start_service("druby://127.0.0.1:0")
|
|
||||||
rescue SocketError, Errno::EADDRNOTAVAIL
|
|
||||||
DRb.start_service("druby://:0")
|
|
||||||
end
|
|
||||||
|
|
||||||
@drb_listener_running = true
|
|
||||||
end
|
|
||||||
|
|
||||||
@spork_service ||= DRbObject.new_with_uri("druby://127.0.0.1:8989")
|
|
||||||
end
|
|
||||||
|
|
||||||
def stop_spork
|
|
||||||
pid = File.read(spork_pid_file).to_i
|
|
||||||
Process.kill("SIGTERM",pid)
|
|
||||||
end
|
|
||||||
|
|
||||||
def start_spork
|
|
||||||
|
|
||||||
if already_running?(spork_pid_file)
|
|
||||||
puts "Killing old orphan spork instance"
|
|
||||||
stop_spork
|
|
||||||
sleep 1
|
|
||||||
end
|
|
||||||
|
|
||||||
@spork_pid = Process.spawn({'RAILS_ENV' => 'test'}, "bundle exec spork")
|
|
||||||
write_pid_file(spork_pid_file, @spork_pid)
|
|
||||||
|
|
||||||
running = false
|
|
||||||
while !running
|
|
||||||
running = spork_running?
|
|
||||||
sleep 0.1
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
module Autospec
|
||||||
|
class SimpleRunner < BaseRunner
|
||||||
|
|
||||||
|
def abort
|
||||||
|
if @pid
|
||||||
|
Process.kill("SIGINT", @pid) rescue nil
|
||||||
|
while(Process.getpgid(@pid) rescue nil)
|
||||||
|
sleep 0.001
|
||||||
|
end
|
||||||
|
@pid = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def run(args, spec)
|
||||||
|
self.abort
|
||||||
|
puts "Running: " << spec
|
||||||
|
@pid = Process.spawn({"RAILS_ENV" => "test"}, "bundle exec rspec " << args.join(" "))
|
||||||
|
pid, status = Process.wait2(@pid)
|
||||||
|
status
|
||||||
|
end
|
||||||
|
|
||||||
|
def stop
|
||||||
|
self.abort
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,107 @@
|
||||||
|
module Autospec
|
||||||
|
class SporkRunner < BaseRunner
|
||||||
|
|
||||||
|
def start
|
||||||
|
if already_running?(pid_file)
|
||||||
|
puts "autospec appears to be running, it is possible the pid file is old"
|
||||||
|
puts "if you are sure it is not running, delete #{pid_file}"
|
||||||
|
return
|
||||||
|
end
|
||||||
|
write_pid_file(pid_file, Process.pid)
|
||||||
|
start_spork
|
||||||
|
@spork_running = true
|
||||||
|
end
|
||||||
|
|
||||||
|
def running?
|
||||||
|
@monitor_thread ||=
|
||||||
|
Thread.new do
|
||||||
|
Process.wait(@spork_pid)
|
||||||
|
@spork_running = false
|
||||||
|
end
|
||||||
|
@spork_running
|
||||||
|
end
|
||||||
|
|
||||||
|
def stop
|
||||||
|
stop_spork
|
||||||
|
end
|
||||||
|
|
||||||
|
def run(args,specs)
|
||||||
|
spork_service.run(args,$stderr,$stdout)
|
||||||
|
end
|
||||||
|
|
||||||
|
def abort
|
||||||
|
spork_service.abort
|
||||||
|
end
|
||||||
|
|
||||||
|
def reload
|
||||||
|
stop_spork
|
||||||
|
sleep 1
|
||||||
|
start_spork
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
def spork_pid_file
|
||||||
|
Rails.root + "tmp/pids/spork.pid"
|
||||||
|
end
|
||||||
|
|
||||||
|
def pid_file
|
||||||
|
Rails.root + "tmp/pids/autospec.pid"
|
||||||
|
end
|
||||||
|
|
||||||
|
def already_running?(pid_file)
|
||||||
|
if File.exists? pid_file
|
||||||
|
pid = File.read(pid_file).to_i
|
||||||
|
Process.getpgid(pid) rescue nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def write_pid_file(file,pid)
|
||||||
|
FileUtils.mkdir_p(Rails.root + "tmp/pids")
|
||||||
|
File.open(file,'w') do |f|
|
||||||
|
f.write(pid)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def spork_running?
|
||||||
|
spork_service.port rescue nil
|
||||||
|
end
|
||||||
|
|
||||||
|
def spork_service
|
||||||
|
|
||||||
|
unless @drb_listener_running
|
||||||
|
begin
|
||||||
|
DRb.start_service("druby://127.0.0.1:0")
|
||||||
|
rescue SocketError, Errno::EADDRNOTAVAIL
|
||||||
|
DRb.start_service("druby://:0")
|
||||||
|
end
|
||||||
|
|
||||||
|
@drb_listener_running = true
|
||||||
|
end
|
||||||
|
|
||||||
|
@spork_service ||= DRbObject.new_with_uri("druby://127.0.0.1:8989")
|
||||||
|
end
|
||||||
|
|
||||||
|
def stop_spork
|
||||||
|
pid = File.read(spork_pid_file).to_i
|
||||||
|
Process.kill("SIGTERM",pid)
|
||||||
|
end
|
||||||
|
|
||||||
|
def start_spork
|
||||||
|
if already_running?(spork_pid_file)
|
||||||
|
puts "Killing old orphan spork instance"
|
||||||
|
stop_spork
|
||||||
|
sleep 1
|
||||||
|
end
|
||||||
|
|
||||||
|
@spork_pid = Process.spawn({'RAILS_ENV' => 'test'}, "bundle exec spork")
|
||||||
|
write_pid_file(spork_pid_file, @spork_pid)
|
||||||
|
|
||||||
|
running = false
|
||||||
|
while !running
|
||||||
|
running = spork_running?
|
||||||
|
sleep 0.01
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue