class Tryouts::Drill::Sergeant::CLI


The sergeant responsible for running command-line interface drills.
= CLI

def initialize(*args)

def initialize(*args)
  require 'rye'
  @rbox_args = args
  @rbox = Rye::Box.new
end

def run(block, context=nil, &inline)

NOTE: Context is ignored for the CLI Sergeant.
def run(block, context=nil, &inline)
  # A Proc object takes precedence over an inline block. 
  runtime = (block.nil? ? inline : block)
  response = Tryouts::Drill::Reality.new
  begin
    if runtime.nil?
      ret = @rbox.send *@rbox_args
    else
      ret = @rbox.instance_eval &runtime
    end
    response.ecode = ret.exit_code
    if ret.stdout.size == 1
      response.output = ret.stdout.first 
    else
      response.output = Array.new(ret.stdout)  # Cast the Rye::Rap object
    end
    response.error = ret.stderr unless ret.stderr.empty?
  rescue Rye::CommandNotFound => ex
    puts ex.message, ex.backtrace if Tryouts.verbose > 2
    response.etype = ex.class
    response.ecode = ex.exit_code
    response.error = "[#{@rbox.host}] Command not found: #{ex.message}"
    response.trace = ex.backtrace
  rescue Rye::CommandError => ex
    puts ex.message, ex.backtrace if Tryouts.verbose > 2
    response.etype = ex.class
    response.ecode = ex.exit_code
    response.output = ex.stdout
    response.error = ex.stderr.join $/
    response.trace = ex.backtrace
  end
  response
end