Class: Spork::Server

Inherits:
Object
  • Object
show all
Includes:
CustomIOStreams
Defined in:
lib/spork/server.rb

Overview

This is based off of spec_server.rb from rspec-rails (David Chelimsky), which was based on Florian Weber’s TDDMate

Direct Known Subclasses

Cucumber, RSpec

Defined Under Namespace

Classes: Cucumber, RSpec

Constant Summary collapse

LOAD_PREFERENCE =
['RSpec', 'Cucumber']
BOOTSTRAP_FILE =
File.dirname(__FILE__) + "/../../assets/bootstrap.rb"
@@supported_servers =
[]

Class Method Summary collapse

Instance Method Summary collapse

Methods included from CustomIOStreams

included, #stderr, #stdout

Class Method Details

.available?Boolean

Returns:

  • (Boolean)


44
45
46
# File 'lib/spork/server.rb', line 44

def self.available?
  File.exist?(helper_file)
end

.available_serversObject



32
33
34
# File 'lib/spork/server.rb', line 32

def self.available_servers
  supported_servers.select { |s| s.available? }
end

.bootstrapObject



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/spork/server.rb', line 56

def self.bootstrap
  if bootstrapped?
    stderr.puts "Already bootstrapped!"
    return
  end
  stderr.puts "Bootstrapping #{helper_file}."
  contents = File.read(helper_file)
  bootstrap_code = File.read(BOOTSTRAP_FILE)
  File.open(helper_file, "wb") do |f|
    f.puts bootstrap_code
    f.puts contents
  end
  
  stderr.puts "Done. Edit #{helper_file} now with your favorite text editor and follow the instructions."
  true
end

.bootstrapped?Boolean

Returns:

  • (Boolean)


52
53
54
# File 'lib/spork/server.rb', line 52

def self.bootstrapped?
  File.read(helper_file).include?("Spork.prefork")
end

.helper_fileObject

Raises:

  • (NotImplemented)


20
21
22
# File 'lib/spork/server.rb', line 20

def self.helper_file
  raise NotImplemented
end

.inherited(subclass) ⇒ Object



28
29
30
# File 'lib/spork/server.rb', line 28

def self.inherited(subclass)
  @@supported_servers << subclass
end

.load_preference_indexObject



48
49
50
# File 'lib/spork/server.rb', line 48

def self.load_preference_index
  LOAD_PREFERENCE.index(server_name) || LOAD_PREFERENCE.length
end

.portObject

Raises:

  • (NotImplemented)


16
17
18
# File 'lib/spork/server.rb', line 16

def self.port
  raise NotImplemented
end

.runObject



73
74
75
76
# File 'lib/spork/server.rb', line 73

def self.run
  return unless available?
  new.listen
end

.server_nameObject



24
25
26
# File 'lib/spork/server.rb', line 24

def self.server_name
  self.name.gsub('Spork::Server::', '')
end

.supported_servers(starting_with = nil) ⇒ Object



36
37
38
39
40
41
42
# File 'lib/spork/server.rb', line 36

def self.supported_servers(starting_with = nil)
  @@supported_servers.sort! { |a,b| a.load_preference_index <=> b.load_preference_index }
  return @@supported_servers if starting_with.nil?
  @@supported_servers.select do |s|
    s.server_name.match(/^#{Regexp.escape(starting_with)}/i)
  end
end

Instance Method Details

#helper_fileObject



92
93
94
# File 'lib/spork/server.rb', line 92

def helper_file
  self.class.helper_file
end

#listenObject



78
79
80
81
82
83
84
85
86
# File 'lib/spork/server.rb', line 78

def listen
  trap("SIGINT") { sig_int_received }
  trap("SIGTERM") { abort; exit!(0) }
  trap("USR2") { abort; restart } if Signal.list.has_key?("USR2")
  DRb.start_service("druby://127.0.0.1:#{port}", self)
  stderr.puts "Spork is ready and listening on #{port}!"
  stderr.flush
  DRb.thread.join
end

#portObject



88
89
90
# File 'lib/spork/server.rb', line 88

def port
  self.class.port
end

#run(argv, stderr, stdout) ⇒ Object



96
97
98
99
100
101
102
103
104
105
# File 'lib/spork/server.rb', line 96

def run(argv, stderr, stdout)
  return false if running?
  
  @child = ::Spork::Forker.new do
    $stdout, $stderr = stdout, stderr
    Spork.exec_each_run { load helper_file }
    run_tests(argv, stderr, stdout)
  end
  @child.result
end

#running?Boolean

Returns:

  • (Boolean)


107
108
109
# File 'lib/spork/server.rb', line 107

def running?
  @child && @child.running?
end