class RSpec::Core::Formatters::BaseTextFormatter
def blue(text)
def blue(text) color(text, "\e[34m") end
def bold(text)
def bold(text) color(text, "\e[1m") end
def close
def close output.close if IO === output && output != $stdout end
def color(text, color_code)
def color(text, color_code) color_enabled? ? "#{color_code}#{text}\e[0m" : text end
def colorise_summary(summary)
def colorise_summary(summary) if failure_count > 0 red(summary) elsif pending_count > 0 yellow(summary) else green(summary) end end
def cyan(text)
def cyan(text) color(text, "\e[36m") end
def dump_backtrace(example)
def dump_backtrace(example) format_backtrace(example.execution_result[:exception].backtrace, example).each do |backtrace_info| output.puts cyan("#{long_padding}# #{backtrace_info}") end end
def dump_commands_to_rerun_failed_examples
def dump_commands_to_rerun_failed_examples return if failed_examples.empty? output.puts output.puts("Failed examples:") output.puts failed_examples.each do |example| output.puts(red("rspec #{BaseFormatter::relative_path(example.location)}") + " " + cyan("# #{example.full_description}")) end end
def dump_failure(example, index)
def dump_failure(example, index) output.puts "#{short_padding}#{index.next}) #{example.full_description}" dump_failure_info(example) end
def dump_failure_info(example)
def dump_failure_info(example) exception = example.execution_result[:exception] output.puts "#{long_padding}#{red("Failure/Error:")} #{red(read_failed_line(exception, example).strip)}" output.puts "#{long_padding}#{red(exception.class.name << ":")}" unless exception.class.name =~ /RSpec/ exception.message.split("\n").each { |line| output.puts "#{long_padding} #{red(line)}" } if exception.message if shared_group = find_shared_group(example) dump_shared_failure_info(shared_group) end end
def dump_failures
def dump_failures return if failed_examples.empty? output.puts output.puts "Failures:" failed_examples.each_with_index do |example, index| output.puts pending_fixed?(example) ? dump_pending_fixed(example, index) : dump_failure(example, index) dump_backtrace(example) end end
def dump_pending
def dump_pending unless pending_examples.empty? output.puts output.puts "Pending:" pending_examples.each do |pending_example| output.puts yellow(" #{pending_example.full_description}") output.puts cyan(" # #{pending_example.execution_result[:pending_message]}") output.puts cyan(" # #{format_caller(pending_example.location)}") if pending_example.execution_result[:exception] \ && RSpec.configuration.show_failures_in_pending_blocks? dump_failure_info(pending_example) dump_backtrace(pending_example) end end end end
def dump_pending_fixed(example, index)
def dump_pending_fixed(example, index) output.puts "#{short_padding}#{index.next}) #{example.full_description} FIXED" output.puts blue("#{long_padding}Expected pending '#{example.metadata[:execution_result][:pending_message]}' to fail. No Error was raised.") end
def dump_profile
def dump_profile sorted_examples = examples.sort_by { |example| example.execution_result[:run_time] }.reverse.first(10) output.puts "\nTop #{sorted_examples.size} slowest examples:\n" sorted_examples.each do |example| output.puts " #{example.full_description}" output.puts cyan(" #{red(format_seconds(example.execution_result[:run_time]))} #{red("seconds")} #{format_caller(example.location)}") end end
def dump_shared_failure_info(group)
def dump_shared_failure_info(group) output.puts "#{long_padding}Shared Example Group: \"#{group.metadata[:shared_group_name]}\" called from " + "#{backtrace_line(group.metadata[:example_group][:location])}" end
def dump_summary(duration, example_count, failure_count, pending_count)
def dump_summary(duration, example_count, failure_count, pending_count) super(duration, example_count, failure_count, pending_count) # Don't print out profiled info if there are failures, it just clutters the output dump_profile if profile_examples? && failure_count == 0 output.puts "\nFinished in #{format_duration(duration)}\n" output.puts colorise_summary(summary_line(example_count, failure_count, pending_count)) dump_commands_to_rerun_failed_examples end
def find_shared_group(example)
def find_shared_group(example) group_and_ancestors(example).find {|group| group.metadata[:shared_group_name]} end
def format_caller(caller_info)
def format_caller(caller_info) backtrace_line(caller_info.to_s.split(':in `block').first) end
def green(text)
def green(text) color(text, "\e[32m") end
def group_and_ancestors(example)
def group_and_ancestors(example) example.example_group.ancestors.push(example.example_group) end
def long_padding
def long_padding ' ' end
def magenta(text)
def magenta(text) color(text, "\e[35m") end
def message(message)
def message(message) output.puts message end
def pending_fixed?(example)
def pending_fixed?(example) example.execution_result[:exception].pending_fixed? end
def red(text)
def red(text) color(text, "\e[31m") end
def seed(number)
def seed(number) output.puts output.puts "Randomized with seed #{number}" output.puts end
def short_padding
def short_padding ' ' end
def summary_line(example_count, failure_count, pending_count)
def summary_line(example_count, failure_count, pending_count) summary = pluralize(example_count, "example") summary << ", " << pluralize(failure_count, "failure") summary << ", #{pending_count} pending" if pending_count > 0 summary end
def white(text)
def white(text) color(text, "\e[37m") end
def yellow(text)
def yellow(text) color(text, "\e[33m") end