Class: RakeServer::Server

Inherits:
EventMachine::Connection
  • Object
show all
Includes:
EventMachine::Protocols::ObjectProtocol
Defined in:
lib/rake_server/server.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.after_fork(&block) ⇒ Object



55
56
57
# File 'lib/rake_server/server.rb', line 55

def after_fork(&block)
  @after_fork = block
end

.before_fork(&block) ⇒ Object



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

def before_fork(&block)
  @before_fork = block
end

.run(eager_tasks, options = {}) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/rake_server/server.rb', line 38

def run(eager_tasks, options = {})
  options = DEFAULT_OPTIONS.merge(options)
  EventMachine.run do
    Rake.application.init
    Rake.application.load_rakefile
    eager_tasks.each { |task| Rake.application[task].invoke }
    EventMachine.start_server(options[:host], options[:port], self)
    unless options[:quiet]
      puts "rake-server listening on #{options[:host]}:#{options[:port]}"
    end
  end
end

.run_after_forkObject



63
64
65
# File 'lib/rake_server/server.rb', line 63

def run_after_fork
  @after_fork.call if @after_fork
end

.run_before_forkObject



59
60
61
# File 'lib/rake_server/server.rb', line 59

def run_before_fork
  @before_fork.call if @before_fork
end

.start(eager_tasks, options = {}) ⇒ Object



15
16
17
18
19
20
21
22
23
24
# File 'lib/rake_server/server.rb', line 15

def start(eager_tasks, options = {})
  pid_file = File.join(pid_dir(options), "rake-server.pid")
  pid = fork do
    fork do
      File.open(pid_file, 'w') { |f| f << Process.pid }
      run(eager_tasks, options)
    end
  end
  Process.waitpid(pid)
end

.stop(options = {}) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
# File 'lib/rake_server/server.rb', line 26

def stop(options = {})
  if File.exist?(pid_file = File.join(pid_dir(options), "rake-server.pid"))
    pid = IO.read(pid_file).to_i
    begin
      Process.kill("TERM", pid)
    rescue Errno::ESRCH
      # No worries
    end
    FileUtils.rm(pid_file)
  end
end

Instance Method Details

#receive_object(message) ⇒ Object



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

def receive_object(message)
  begin
    tasks = message.tasks.map { |task| Rake.application[task.to_sym] }
    pid = fork_and_run_tasks(tasks, message.env || {})
  rescue => e
    send_object("ERR #{e.message}\n")
    send_object(nil)
  end
end