module Kitchen

def self.debug_log(lines)

Other tags:
    Api: - private

Parameters:
  • lines (Array) -- an array of strings to log
def self.debug_log(lines)
  Array(lines).each { |line| Kitchen.logger.debug(line) }
end

def self.file_log(level, lines)

Other tags:
    Api: - private

Parameters:
  • lines (Array) -- an array of strings to log
  • level (Symbol, String) -- the desired log level
def self.file_log(level, lines)
  Array(lines).each do |line|
    if Kitchen.logger.debug?
      Kitchen.logger.debug(line)
    else
      Kitchen.logger.logdev && Kitchen.logger.logdev.public_send(level, line)
    end
  end
end

def self.handle_error(e)

Other tags:
    Api: - private

Other tags:
    See: Kitchen.with_friendly_errors -

Parameters:
  • e (StandardError) -- an exception to handle
def self.handle_error(e)
  stderr_log(Error.formatted_exception(e))
  stderr_log("Please see .kitchen/logs/kitchen.log for more details")
  stderr_log("Also try running `kitchen diagnose --all` for configuration\n")
  file_log(:error, Error.formatted_trace(e))
end

def self.handle_instance_failure(e)

Other tags:
    Api: - private

Other tags:
    See: Kitchen.with_friendly_errors -

Parameters:
  • e (StandardError) -- an exception to handle
def self.handle_instance_failure(e)
  stderr_log(e.message.split(/\s{2,}/))
  stderr_log(Error.formatted_exception(e.original))
  file_log(:error, e.message.split(/\s{2,}/).first)
  debug_log(Error.formatted_trace(e))
end

def self.stderr_log(lines)

Other tags:
    Api: - private

Parameters:
  • lines (Array) -- an array of strings to log
def self.stderr_log(lines)
  Array(lines).map { |line| ">>>>>> #{line}" }.each do |line|
    line = Color.colorize(line, :red) if Kitchen.tty?
    $stderr.puts(line)
  end
end

def self.with_friendly_errors

Raises:
  • (SystemExit) - if an exception is raised in the yielded block
def self.with_friendly_errors
  yield
rescue Kitchen::InstanceFailure => e
  Kitchen.mutex.synchronize do
    handle_instance_failure(e)
  end
  exit 10
rescue Kitchen::Error => e
  Kitchen.mutex.synchronize do
    handle_error(e)
  end
  exit 20
end

def default_file_logger(level = nil, log_overwrite = nil)

Returns:
  • (Logger) - a logger

Parameters:
  • log_overwrite (Boolean) -- logging level
  • level (Symbol) -- logging level
def default_file_logger(level = nil, log_overwrite = nil)
  level ||= env_log
  log_overwrite = log_overwrite.nil? ? env_log_overwrite : log_overwrite
  log_location = File.expand_path(File.join(DEFAULT_LOG_DIR, "kitchen.log"))
  log_location = log_location.to_s
  Logger.new(
    stdout: $stdout,
    logdev: log_location,
    level: Util.to_logger_level(level),
    log_overwrite:
  )
end

def default_logger

Returns:
  • (Logger) - a logger
def default_logger
  Logger.new(stdout: $stdout, level: Util.to_logger_level(env_log))
end

def env_log

Other tags:
    Api: - private

Returns:
  • (Symbol, nil) - a log level or nil if not set
def env_log
  ENV["KITCHEN_LOG"] && ENV["KITCHEN_LOG"].downcase.to_sym
end

def env_log_overwrite

Other tags:
    Api: - private

Returns:
  • (Boolean, nil) -
def env_log_overwrite
  case ENV["KITCHEN_LOG_OVERWRITE"] && ENV["KITCHEN_LOG_OVERWRITE"].downcase
  when nil, ""
    nil
  when "false", "f", "no"
    false
  else
    true
  end
end

def source_root

Returns:
  • (Pathname) - root path of gem
def source_root
  @source_root ||= Pathname.new(File.expand_path("..", __dir__))
end

def tty?

Returns:
  • (true, false) - is there a tty?
def tty?
  $stdout.tty?
end