class Belzebuth::Process

Constants

DEFAULT_OPTIONS

Public Class Methods

new(command, options = {}) click to toggle source
# File lib/belzebuth/process.rb, line 40
def initialize(command, options = {})
  @command = command
  @options = DEFAULT_OPTIONS.merge(options)
  @wait_condition = Belzebuth::WaitCondition(@options.fetch(:wait_condition, WaitCondition::Blocking.new))
end

Public Instance Methods

run() click to toggle source
# File lib/belzebuth/process.rb, line 46
def run
  Bundler.with_clean_env do
    child_process = Response.new(ChildProcess.new(*Shellwords.split(@command)))
    child_process.cwd = @options[:directory]
    child_process.io.stdout = create_tempfile("stdout")
    child_process.io.stderr = create_tempfile("stderr")

    started_at = Time.now

    child_process.start
    @wait_condition.start(child_process)

    while !@wait_condition.call(child_process)
      sleep(@wait_condition.sleep_time_between_condition(child_process))

      if can_timeout? && Time.now - started_at > @options[:timeout]
        child_process.stop
        raise ExecutionTimeout, "`#{@command}` took too much time to execute (timeout: #{@options[:timeout]}) #{child_process}"
      end
    end

    @wait_condition.complete(child_process)
    child_process
  end
end

Private Instance Methods

can_timeout?() click to toggle source
# File lib/belzebuth/process.rb, line 74
def can_timeout?
  @options[:timeout] != -1
end
create_tempfile(name) click to toggle source
# File lib/belzebuth/process.rb, line 78
def create_tempfile(name)
  io = Tempfile.new("#{name}")
  io.sync = true
  io
end