-
-
Notifications
You must be signed in to change notification settings - Fork 763
/
base_formatter.rb
127 lines (98 loc) · 3.96 KB
/
base_formatter.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
module Rspec
module Core
module Formatters
class BaseFormatter
include Helpers
attr_accessor :example_group
attr_reader :example_count, :duration, :examples
def initialize
@example_count = 0
@examples = []
@example_group = nil
end
def configuration
Rspec.configuration
end
def output
Rspec.configuration.output
end
def profile_examples?
Rspec.configuration.profile_examples
end
def color_enabled?
configuration.color_enabled?
end
def pending_examples
@pending_examples ||= ::Rspec::Core.world.find(examples, :positive, :execution_result => { :status => 'pending' })
end
def failed_examples
@failed_examples ||= ::Rspec::Core.world.find(examples, :positive, :execution_result => { :status => 'failed' })
end
# This method is invoked before any examples are run, right after
# they have all been collected. This can be useful for special
# formatters that need to provide progress on feedback (graphical ones)
#
# This method will only be invoked once, and the next one to be invoked
# is #add_example_group
def start(example_count)
@example_count = example_count
end
def example_finished(example)
examples << example
end
# This method is invoked at the beginning of the execution of each example group.
# +example_group+ is the example_group.
#
# The next method to be invoked after this is #example_failed or #example_finished
def add_example_group(example_group)
@example_group = example_group
end
alias_method :add_example_group, :add_example_group
# This method is invoked after all of the examples have executed. The next method
# to be invoked after this one is #dump_failure (once for each failed example),
def start_dump(duration)
@duration = duration
end
# Dumps detailed information about each example failure.
def dump_failures
end
# This method is invoked after the dumping of examples and failures.
def dump_summary
end
# This gets invoked after the summary if option is set to do so.
def dump_pending
end
# This method is invoked at the very end. Allows the formatter to clean up, like closing open streams.
def close
end
def format_backtrace(backtrace, example)
return "" unless backtrace
return backtrace if example.metadata[:full_backtrace] == true
cleansed = backtrace.select { |line| backtrace_line(line) }
# Kick the describe stack info off the list, just keep the line the problem happened on from that file
# cleansed = [cleansed.detect { |line| line.split(':').first == example.metadata[:caller].split(':').first }] if cleansed.size > 1
cleansed.empty? ? backtrace : cleansed
end
protected
def backtrace_line(line)
return nil if configuration.cleaned_from_backtrace?(line)
line.sub!(File.expand_path("."), ".")
line.sub!(/\A([^:]+:\d+)$/, '\\1')
return nil if line == '-e:1'
line
end
def read_failed_line(exception, example)
original_file = example.file_path.to_s.downcase
matching_line = exception.backtrace.detect { |line| line.split(':').first.downcase == original_file.downcase }
return "Unable to find matching line from backtrace" if matching_line.nil?
file_path, line_number = matching_line.split(':')
if File.exist?(file_path)
open(file_path, 'r') { |f| f.readlines[line_number.to_i - 1] }
else
"Unable to find #{file_path} to read failed line"
end
end
end
end
end
end