class Nanoc::Extra::Piper

@api private

Public Class Methods

new(stdout: $stdout, stderr: $stderr) click to toggle source

@param [IO] stdout @param [IO] stderr

# File lib/nanoc/extra/piper.rb, line 19
def initialize(stdout: $stdout, stderr: $stderr)
  @stdout = stdout
  @stderr = stderr
end

Public Instance Methods

run(cmd, input) click to toggle source

@param [Array<String>] cmd

@param [String, nil] input

# File lib/nanoc/extra/piper.rb, line 27
def run(cmd, input)
  Open3.popen3(*cmd) do |stdin, stdout, stderr, wait_thr|
    stdout_thread = Thread.new { @stdout << stdout.read }
    stderr_thread = Thread.new { @stderr << stderr.read }

    if input
      stdin << input
    end
    stdin.close

    stdout_thread.join
    stderr_thread.join

    exit_status = wait_thr.value
    unless exit_status.success?
      raise Error.new(cmd, exit_status.to_i)
    end
  end
end