4 # Baseclass for text-based formatters. Can in fact be used for
5 # non-text based ones too - just ignore the +output+ constructor
7 class BaseTextFormatter < BaseFormatter
8 # Creates a new instance that will write to +where+. If +where+ is a
9 # String, output will be written to the File with that name, otherwise
10 # +where+ is exected to be an IO (or an object that responds to #puts and #write).
11 def initialize(options, where)
13 if where.is_a?(String)
14 @output = File.open(where, 'w')
23 @snippet_extractor = SnippetExtractor.new
24 @pending_examples = []
27 def example_pending(behaviour_name, example_name, message)
28 @pending_examples << ["#{behaviour_name} #{example_name}", message]
31 def dump_failure(counter, failure)
33 @output.puts "#{counter.to_s})"
34 @output.puts colourise("#{failure.header}\n#{failure.exception.message}", failure)
35 @output.puts format_backtrace(failure.exception.backtrace)
39 def colourise(s, failure)
40 if(failure.expectation_not_met?)
42 elsif(failure.pending_fixed?)
49 def dump_summary(duration, example_count, failure_count, pending_count)
52 @output.puts "Finished in #{duration} seconds"
55 summary = "#{example_count} example#{'s' unless example_count == 1}, #{failure_count} failure#{'s' unless failure_count == 1}"
56 summary << ", #{pending_count} pending" if pending_count > 0
60 @output.puts yellow(summary)
62 @output.puts green(summary)
65 @output.puts red(summary)
71 unless @pending_examples.empty?
73 @output.puts "Pending:"
74 @pending_examples.each do |pending_example|
75 @output.puts "#{pending_example[0]} (#{pending_example[1]})"
87 def format_backtrace(backtrace)
88 return "" if backtrace.nil?
89 backtrace.map { |line| backtrace_line(line) }.join("\n")
95 @options.colour ? true : false
99 @options.dry_run ? true : false
102 def backtrace_line(line)
103 line.sub(/\A([^:]+:\d+)$/, '\\1:')
106 def colour(text, colour_code)
107 return text unless colour? && output_to_tty?
108 "#{colour_code}#{text}\e[0m"
113 @output == Kernel || @output.tty?
119 def green(text); colour(text, "\e[32m"); end
120 def red(text); colour(text, "\e[31m"); end
121 def magenta(text); colour(text, "\e[35m"); end
122 def yellow(text); colour(text, "\e[33m"); end
123 def blue(text); colour(text, "\e[34m"); end