lib/utils/line_formatter.rb



require 'tins/terminal'
require 'term/ansicolor'
begin
  require 'rpsec'
  require 'rspec/core/formatters/base_text_formatter'
rescue LoadError
end

if defined? RSpec
  module Utils
    class LineFormatter < RSpec::Core::Formatters::BaseTextFormatter
      def start(example_count)
        super
        filename = 'errors.lst'
        output.puts "Storing error list in #{filename.inspect}: "
        @errors_lst = File.new(filename, 'w')
        @errors_lst.sync = true
      end

      def close
        super
        @errors_lst.puts "\n#{?= * 75}\nFinished in #{format_duration(duration)}\n"
        @errors_lst.puts summary_line(example_count, failure_count, pending_count)
        @errors_lst.close
      end

      def example_passed(example)
        super
        output.puts format_line(example)
      end

      def example_pending(example)
        super
        output.puts format_line(example)
      end

      def example_failed(example)
        super
        dump_line_to_error_file(example)
        output.puts format_line(example)
        dump_failure_info(example)
      end

      def dump_failures
      end

      def dump_pending
      end

      def dump_commands_to_rerun_failed_examples
      end

      private

      def dump_failure_for_error_file(example)
        result = ''
        exception = example.execution_result[:exception]
        exception_class_name = exception_class_name_for(exception)
        result << "#{long_padding}Failure/Error: #{read_failed_line(exception, example).strip}\n"
        result << "#{long_padding}#{exception_class_name}:\n" unless exception_class_name =~ /RSpec/
        exception.message.to_s.split("\n").each { |line| result << "#{long_padding}  #{line}\n" } if exception.message
        result
      end

      def dump_line_to_error_file(example)
        @errors_lst.flock File::LOCK_EX
        @errors_lst.puts "%s\n%3.3fs %s\n%s\n%s" % [
          location(example), run_time(example), example.full_description,
          Term::ANSIColor.uncolored(dump_failure_for_error_file(example)),
          (%w[ {{{ ] +
           format_backtrace(example.execution_result[:exception].backtrace, example) +
           %w[ }}} ]) * ?\n
        ]
      ensure
        @errors_lst.flock File::LOCK_UN
      end

      def run_time(example)
        example.execution_result[:run_time]
      end

      def format_line(example)
        description =
          if ENV['VERBOSE'].to_i == 1
            example.full_description
          else
            example.description
          end
        args = [ location(example), run_time(example), description ]
        uncolored = "%s # S %3.3fs %s" % args
        uncolored = uncolored[0, Tins::Terminal.columns]
        case example.execution_result[:status]
        when 'passed'
          success_color(uncolored)
        when 'failed'
          failure_color(uncolored)
        when 'pending'
          pending_color(uncolored)
        else
          uncolored % args
        end
      end

      def location(example)
        RSpec::Core::Metadata::relative_path(example.location)
      end
    end
  end
end