class Yacli::Base

Public Class Methods

new(opt = {}) click to toggle source
# File lib/yacli/base.rb, line 33
def initialize(opt = {})
  @opt = opt
  @log = init_logger
  @log.debug "@opt: #{@opt.inspect}"
end
options(&block) click to toggle source
# File lib/yacli/base.rb, line 29
def self.options(&block)
  Optimist.options(&block)
end

Public Instance Methods

cli(opts = {}) click to toggle source
# File lib/yacli/base.rb, line 72
def cli(opts = {})
  cmd = init_opt(:cmd, opts, '')
  valid_out_pattern = init_opt(:valid_out_pattern, opts, nil)
  reverse_match = init_opt(:reverse_match, opts, false)
  hide_output = init_opt(:hide_output, opts, false).to_bool
  include_stderr = init_opt(:include_stderr, opts, true).to_bool
  cmd += ' 2>&1' if include_stderr
  @log.debug "running cmd: #{cmd}"

  cmd_out = []
  exit_code = nil
  Open3.popen2(cmd) do |stdin, stdout, thread|
    stdin.close
    while line = stdout.gets
      @log.info ">>> #{line.chomp}" unless hide_output
      cmd_out << line.chomp
    end

    exit_code = thread.value
  end
  success_exec = exit_code.success?
  cmd_out = cmd_out.join($INPUT_RECORD_SEPARATOR)
  @log.debug "success_exec: #{success_exec.inspect}"
  @log.debug "cmd_out: #{cmd_out.inspect}" unless hide_output

  @log.debug "reverse_match: #{reverse_match.inspect}"
  output_match = reverse_match ? cmd_out.match(/#{valid_out_pattern}/).nil? : !cmd_out.match(/#{valid_out_pattern}/).nil?
  @log.debug "output_match: #{output_match.inspect}"
  valid_content = valid_out_pattern.nil? ? true : output_match
  @log.debug "valid_content: #{valid_content}"

  raise InvalidExitCodeError, cmd_out unless success_exec
  raise InvalidContentError, cmd_out unless valid_content
  result = { success: success_exec, output: cmd_out, exit_code: exit_code.to_i }
  @log.debug "run result: #{result.inspect}"
  result
end
error_exit(msg) click to toggle source
# File lib/yacli/base.rb, line 43
def error_exit(msg)
  @log.error msg
  raise ExecutionError
end
init_logger(log_path = nil) click to toggle source
# File lib/yacli/base.rb, line 21
def init_logger(log_path = nil)
  output_file = log_path.nil? ? STDOUT : log_path
  logger = Logger.new(output_file)
  logger.level = !ENV['DEBUG'].nil? ? Logger::DEBUG : Logger::INFO
  logger.debug "logger.level: #{logger.level}"
  logger
end
init_opt(key, opt, default = '') click to toggle source
# File lib/yacli/base.rb, line 48
def init_opt(key, opt, default = '')
  val = opt[key] || default
  @log.debug "#{key}: #{val}"
  val
end
log(msg, level = :info) click to toggle source
# File lib/yacli/base.rb, line 39
def log(msg, level = :info)
  @log.send(level, msg)
end
pass_cli(cmd, valid_out_pattern = nil) click to toggle source
# File lib/yacli/base.rb, line 54
def pass_cli(cmd, valid_out_pattern = nil)
  cmd += ' 2>&1'
  @log.debug "running cmd: #{cmd}"
  cmd_out = `#{cmd}`
  success_exec = $?.success?
  @log.info "cmd_out: #{cmd_out}"
  @log.debug "success_exec: #{success_exec}"

  valid_content = valid_out_pattern.nil? ? true : !cmd_out.match(/#{valid_out_pattern}/).nil?
  @log.debug "valid_content: #{valid_content}"

  raise InvalidExitCodeError, cmd_out unless success_exec
  raise InvalidContentError, cmd_out unless valid_content
  result = { success: success_exec, output: cmd_out, exit_code: exit_code.to_i }
  @log.debug "run result: #{result.inspect}"
  result
end