Class: Belzebuth::Process

Inherits:
Object
  • Object
show all
Defined in:
lib/belzebuth/process.rb

Constant Summary collapse

DEFAULT_OPTIONS =
{
  :directory => Dir.pwd,
  :environment => {},
  :timeout => -1
}

Instance Method Summary collapse

Constructor Details

#initialize(command, options = {}) ⇒ Process

Returns a new instance of Process.



40
41
42
43
44
# 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

Instance Method Details

#runObject



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# 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