Class: Kaiser::CommandRunner

Inherits:
Object
  • Object
show all
Defined in:
lib/kaiser/command_runner.rb

Overview

This is the command runner it abstracts away the complicated syntax required to deal with PTY and to pass the lines programmatically to the host application as well as to capture the return code at the end.

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(out, cmd, env_vars) ⇒ CommandRunner

Returns a new instance of CommandRunner.



22
23
24
25
26
# File 'lib/kaiser/command_runner.rb', line 22

def initialize(out, cmd, env_vars)
  @out = out
  @cmd = cmd.tr "\n", ' '
  @env_vars = env_vars
end

Class Method Details

.run(out, cmd, env_vars: {}, &block) ⇒ Object



12
13
14
15
# File 'lib/kaiser/command_runner.rb', line 12

def self.run(out, cmd, env_vars: {}, &block)
  out.puts "> #{cmd}"
  CommandRunner.new(out, cmd, env_vars).run_command(&block)
end

.run!(out, cmd, env_vars: {}, &block) ⇒ Object

Raises:



17
18
19
20
# File 'lib/kaiser/command_runner.rb', line 17

def self.run!(out, cmd, env_vars: {}, &block)
  status = run(out, cmd, env_vars: env_vars, &block)
  raise Kaiser::CmdError.new(cmd, status) if status.to_s != '0'
end

Instance Method Details



28
29
30
31
32
# File 'lib/kaiser/command_runner.rb', line 28

def print_and_return_status(status = 0)
  @out.puts "$? = #{status}"
  @out.flush
  status
end


34
35
36
37
38
39
40
41
42
# File 'lib/kaiser/command_runner.rb', line 34

def print_lines(lines)
  lines.each do |line|
    @out.print line
    @out.flush
    yield line.chomp if block_given?
  end
rescue Errno::EIO
  # Happens when `lines` stream is closed
end

#run_command(&block) ⇒ Object



44
45
46
47
48
49
50
51
52
# File 'lib/kaiser/command_runner.rb', line 44

def run_command(&block)
  PTY.spawn(@env_vars, "#{@cmd} 2>&1") do |stdout, _stdin, pid|
    print_lines(stdout, &block)
    Process.wait(pid)
  end
  print_and_return_status $CHILD_STATUS.exitstatus
rescue PTY::ChildExited => e
  print_and_return_status(e.status)
end