Class: Spork::Server

Inherits:
Object
  • Object
show all
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

Class Method Details

.available?Boolean

Returns:

  • (Boolean)


39
40
41
# File 'lib/spork/server.rb', line 39

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

.available_serversObject



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

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

.bootstrapObject



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

def self.bootstrap
  if bootstrapped?
    puts "Already bootstrapped!"
    return
  end
  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
  
  puts "Done. Edit #{helper_file} now with your favorite text editor and follow the instructions."
  true
end

.bootstrapped?Boolean

Returns:

  • (Boolean)


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

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

.helper_fileObject

Raises:

  • (NotImplemented)


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

def self.helper_file
  raise NotImplemented
end

.inherited(subclass) ⇒ Object



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

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

.load_preference_indexObject



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

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

.portObject

Raises:

  • (NotImplemented)


11
12
13
# File 'lib/spork/server.rb', line 11

def self.port
  raise NotImplemented
end

.runObject



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

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

.server_nameObject



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

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

.supported_servers(starting_with = nil) ⇒ Object



31
32
33
34
35
36
37
# File 'lib/spork/server.rb', line 31

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

.using_rails?Boolean

Returns:

  • (Boolean)


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

def self.using_rails?
  File.exist?("config/environment.rb")
end

Instance Method Details

#helper_fileObject



90
91
92
# File 'lib/spork/server.rb', line 90

def helper_file
  self.class.helper_file
end

#listenObject



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

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)
  puts "Spork is ready and listening on #{port}!"
  DRb.thread.join
end

#portObject



86
87
88
# File 'lib/spork/server.rb', line 86

def port
  self.class.port
end

#run(argv, stderr, stdout) ⇒ Object



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

def run(argv, stderr, stdout)
  return false if running?
  $stdout = stdout
  $stderr = stderr
  @child_pid = Kernel.fork do
    Spork.exec_each_run(helper_file)
    run_tests(argv, stderr, stdout)
  end
  Process.wait(@child_pid)
  @child_pid = nil
  true
end

#running?Boolean

Returns:

  • (Boolean)


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

def running?
  !! @child_pid
end