ConsoleSourceConsoleTerminalFormatterFailure

class Failure

Format a failure event, including the exception message and backtrace.

Definitions

KEY = :failure

The key used to identify this formatter.

def initialize(terminal)

Create a new failure formatter.

Implementation

def initialize(terminal)
	@terminal = terminal
	
	@terminal[:exception_title] ||= @terminal.style(:red, nil, :bold)
	@terminal[:exception_detail] ||= @terminal.style(:yellow)
	@terminal[:exception_backtrace] ||= @terminal.style(:red)
	@terminal[:exception_backtrace_other] ||= @terminal.style(:red, nil, :faint)
	@terminal[:exception_message] ||= @terminal.style(:default)
end

def format(event, stream, prefix: nil, verbose: false, **options)

Format the given event.

Signature

parameter event Hash

The event to format.

parameter stream IO

The stream to write the formatted event to.

parameter prefix String

The prefix to use before the title.

parameter verbose Boolean

Whether to include additional information.

parameter options Hash

Additional options.

Implementation

def format(event, stream, prefix: nil, verbose: false, **options)
	title = event[:class]
	message = event[:message]
	backtrace = event[:backtrace]
	root = event[:root]
	
	lines = message.lines.map(&:chomp)
	
	stream.puts "  #{prefix}#{@terminal[:exception_title]}#{title}#{@terminal.reset}: #{lines.shift}"
	
	lines.each do |line|
		stream.puts "  #{@terminal[:exception_detail]}#{line}#{@terminal.reset}"
	end
	
	root_pattern = /^#{root}\// if root
	
	backtrace&.each_with_index do |line, index|
		path, offset, message = line.split(":", 3)
		style = :exception_backtrace
		
		# Make the path a bit more readable:
		if root_pattern and path.sub!(root_pattern, "").nil?
			style = :exception_backtrace_other
		end
		
		stream.puts "  #{index == 0 ? "→" : " "} #{@terminal[style]}#{path}:#{offset}#{@terminal[:exception_message]} #{message}#{@terminal.reset}"
	end
	
	if cause = event[:cause]
		format(cause, stream, prefix: "Caused by ", verbose: verbose, **options)
	end
end