Class: Kaiser::CommandRunner
- Inherits:
-
Object
- Object
- Kaiser::CommandRunner
- 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
-
#initialize(out, cmd, env_vars) ⇒ CommandRunner
constructor
A new instance of CommandRunner.
- #print_and_return_status(status = 0) ⇒ Object
- #print_lines(lines) ⇒ Object
- #run_command(&block) ⇒ Object
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
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
#print_and_return_status(status = 0) ⇒ Object
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 |
#print_lines(lines) ⇒ Object
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 |