module TestBench::Output::PrintError

Attributes

omit_backtrace_pattern[W]
reverse_backtraces[W]

Public Class Methods

call(error, writer: nil, omit_backtrace_pattern: nil, reverse_backtraces: nil) click to toggle source
# File lib/test_bench/output/print_error.rb, line 22
def self.call(error, writer: nil, omit_backtrace_pattern: nil, reverse_backtraces: nil)
  writer ||= Writer.build
  omit_backtrace_pattern ||= Defaults.omit_backtrace_pattern
  reverse_backtraces = Defaults.reverse_backtraces if reverse_backtraces.nil?

  writer.escape_code(:red)

  if reverse_backtraces && error.backtrace.length > 1
    writer
      .indent
      .escape_code(:bold)
      .text("Traceback")
      .escape_code(:reset_intensity)
      .text(" (most recent call last):")
      .newline
  end

  error(error, writer: writer, omit_backtrace_pattern: omit_backtrace_pattern, reverse_backtraces: reverse_backtraces)

  writer
    .escape_code(:reset_fg)
    .sync
end
error(error, writer: nil, omit_backtrace_pattern: nil, reverse_backtraces: nil) click to toggle source
# File lib/test_bench/output/print_error.rb, line 46
def self.error(error, writer: nil, omit_backtrace_pattern: nil, reverse_backtraces: nil)
  reverse_backtraces = self.reverse_backtraces if reverse_backtraces.nil?

  if reverse_backtraces
    error_cause(error, writer: writer, omit_backtrace_pattern: omit_backtrace_pattern, reverse_backtraces: reverse_backtraces)
    error_backtrace(error, writer: writer, omit_backtrace_pattern: omit_backtrace_pattern, reverse_backtraces: reverse_backtraces)
    error_message(error, writer: writer)
  else
    error_message(error, writer: writer)
    error_backtrace(error, writer: writer, omit_backtrace_pattern: omit_backtrace_pattern, reverse_backtraces: reverse_backtraces)
    error_cause(error, writer: writer, omit_backtrace_pattern: omit_backtrace_pattern, reverse_backtraces: reverse_backtraces)
  end
end
error_backtrace(error, writer: nil, omit_backtrace_pattern: nil, reverse_backtraces: nil) click to toggle source
# File lib/test_bench/output/print_error.rb, line 84
def self.error_backtrace(error, writer: nil, omit_backtrace_pattern: nil, reverse_backtraces: nil)
  writer ||= self.writer
  omit_backtrace_pattern ||= self.omit_backtrace_pattern
  reverse_backtraces = self.reverse_backtraces if reverse_backtraces.nil?

  omitting = false

  backtrace = error.backtrace[1..-1]

  unless reverse_backtraces
    backtrace_iterator = backtrace.each.with_index
  else
    frame_count = backtrace.count

    number_width = frame_count.to_s.each_char.count

    backtrace_iterator = backtrace.reverse_each.map.with_index do |location, index|
      ordinal = frame_count - index

      ordinal = ordinal.to_s.rjust(number_width, ' ')

      [location, ordinal]
    end
  end

  backtrace_iterator.each do |location, ordinal|
    omit = omit_backtrace_pattern.match?(location)

    next if omit && omitting

    writer
      .text("\t")
      .indent

    if omit
      omitting = true

      if reverse_backtraces
        ordinal.gsub!(/[[:digit:]]/, '?')

        writer.text("#{ordinal}: ")
      end

      writer
        .escape_code(:faint)
        .escape_code(:italic)
        .text('*omitted*')
        .escape_code(:reset_italic)
        .escape_code(:reset_intensity)

    else
      omitting = false

      if reverse_backtraces
        writer.text("#{ordinal}: ")
      end

      writer.text("from #{location}")
    end

    writer.newline
  end
end
error_cause(error, **args) click to toggle source
# File lib/test_bench/output/print_error.rb, line 60
def self.error_cause(error, **args)
  error(error.cause, **args) unless error.cause.nil?
end
error_message(error, writer: nil) click to toggle source
# File lib/test_bench/output/print_error.rb, line 64
def self.error_message(error, writer: nil)
  caller_location = error.backtrace[0]

  message = error.message

  error_class = error.class.name

  writer
    .indent
    .text("#{caller_location}: ")
    .escape_code(:bold)
    .text("#{message} (")
    .escape_code(:underline)
    .text(error_class)
    .escape_code(:reset_underline)
    .text(")")
    .escape_code(:reset_intensity)
    .newline
end

Public Instance Methods

omit_backtrace_pattern() click to toggle source
# File lib/test_bench/output/print_error.rb, line 6
def omit_backtrace_pattern
  @omit_backtrace_pattern ||= Defaults.omit_backtrace_pattern
end
print_error(error) click to toggle source
reverse_backtraces() click to toggle source
# File lib/test_bench/output/print_error.rb, line 11
def reverse_backtraces
  instance_variable_defined?(:@reverse_backtraces) ?
    @reverse_backtraces :
    @reverse_backtraces = Defaults.reverse_backtraces
end