rspec-tracer 0.9.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +28 -0
- data/README.md +41 -14
- data/lib/rspec_tracer/cache.rb +76 -36
- data/lib/rspec_tracer/configuration.rb +16 -9
- data/lib/rspec_tracer/coverage_merger.rb +41 -0
- data/lib/rspec_tracer/coverage_reporter.rb +31 -28
- data/lib/rspec_tracer/coverage_writer.rb +58 -0
- data/lib/rspec_tracer/html_reporter/reporter.rb +56 -16
- data/lib/rspec_tracer/html_reporter/views/duplicate_examples.erb +34 -0
- data/lib/rspec_tracer/html_reporter/views/examples.erb +5 -0
- data/lib/rspec_tracer/html_reporter/views/layout.erb +8 -5
- data/lib/rspec_tracer/remote_cache/validator.rb +1 -1
- data/lib/rspec_tracer/report_generator.rb +158 -0
- data/lib/rspec_tracer/report_merger.rb +81 -0
- data/lib/rspec_tracer/report_writer.rb +141 -0
- data/lib/rspec_tracer/reporter.rb +42 -174
- data/lib/rspec_tracer/rspec_runner.rb +2 -4
- data/lib/rspec_tracer/runner.rb +41 -113
- data/lib/rspec_tracer/version.rb +1 -1
- data/lib/rspec_tracer.rb +202 -29
- metadata +23 -17
@@ -2,9 +2,12 @@
|
|
2
2
|
|
3
3
|
module RSpecTracer
|
4
4
|
class Reporter
|
5
|
-
attr_reader :all_examples, :
|
6
|
-
:
|
7
|
-
:
|
5
|
+
attr_reader :all_examples, :interrupted_examples, :duplicate_examples,
|
6
|
+
:possibly_flaky_examples, :flaky_examples, :pending_examples,
|
7
|
+
:skipped_examples, :failed_examples, :all_files, :modified_files,
|
8
|
+
:deleted_files, :dependency, :examples_coverage
|
9
|
+
|
10
|
+
attr_accessor :reverse_dependency, :last_run
|
8
11
|
|
9
12
|
def initialize
|
10
13
|
initialize_examples
|
@@ -18,27 +21,54 @@ module RSpecTracer
|
|
18
21
|
@duplicate_examples[example[:example_id]] << example
|
19
22
|
end
|
20
23
|
|
24
|
+
def deregister_duplicate_examples
|
25
|
+
@duplicate_examples.select! { |_, examples| examples.count > 1 }
|
26
|
+
|
27
|
+
return if @duplicate_examples.empty?
|
28
|
+
|
29
|
+
@all_examples.reject! { |example_id, _| @duplicate_examples.key?(example_id) }
|
30
|
+
end
|
31
|
+
|
21
32
|
def on_example_skipped(example_id)
|
22
33
|
@skipped_examples << example_id
|
23
34
|
end
|
24
35
|
|
25
36
|
def on_example_passed(example_id, result)
|
37
|
+
return if @duplicate_examples.key?(example_id)
|
38
|
+
|
26
39
|
@passed_examples << example_id
|
27
40
|
@all_examples[example_id][:execution_result] = formatted_execution_result(result)
|
28
41
|
end
|
29
42
|
|
30
43
|
def on_example_failed(example_id, result)
|
44
|
+
return if @duplicate_examples.key?(example_id)
|
45
|
+
|
31
46
|
@failed_examples << example_id
|
32
47
|
@all_examples[example_id][:execution_result] = formatted_execution_result(result)
|
33
48
|
end
|
34
49
|
|
35
50
|
def on_example_pending(example_id, result)
|
51
|
+
return if @duplicate_examples.key?(example_id)
|
52
|
+
|
36
53
|
@pending_examples << example_id
|
37
54
|
@all_examples[example_id][:execution_result] = formatted_execution_result(result)
|
38
55
|
end
|
39
56
|
|
57
|
+
def register_interrupted_examples
|
58
|
+
@all_examples.each_pair do |example_id, example|
|
59
|
+
next if example.key?(:execution_result)
|
60
|
+
|
61
|
+
@interrupted_examples << example_id
|
62
|
+
end
|
63
|
+
|
64
|
+
return if @interrupted_examples.empty?
|
65
|
+
|
66
|
+
puts "RSpec tracer is not processing #{@interrupted_examples.count} interrupted examples"
|
67
|
+
end
|
68
|
+
|
40
69
|
def register_deleted_examples(seen_examples)
|
41
70
|
@deleted_examples = seen_examples.keys.to_set - (@skipped_examples | @all_examples.keys)
|
71
|
+
@deleted_examples -= @interrupted_examples
|
42
72
|
|
43
73
|
@deleted_examples.select! do |example_id|
|
44
74
|
example = seen_examples[example_id]
|
@@ -63,6 +93,14 @@ module RSpecTracer
|
|
63
93
|
@pending_examples << example_id
|
64
94
|
end
|
65
95
|
|
96
|
+
def duplicate_example?(example_id)
|
97
|
+
@duplicate_examples.key?(example_id)
|
98
|
+
end
|
99
|
+
|
100
|
+
def example_interrupted?(example_id)
|
101
|
+
@interrupted_examples.include?(example_id)
|
102
|
+
end
|
103
|
+
|
66
104
|
def example_passed?(example_id)
|
67
105
|
@passed_examples.include?(example_id)
|
68
106
|
end
|
@@ -107,17 +145,6 @@ module RSpecTracer
|
|
107
145
|
file_deleted?(file_name) || file_modified?(file_name)
|
108
146
|
end
|
109
147
|
|
110
|
-
def incorrect_analysis?
|
111
|
-
@duplicate_examples.select! { |_, examples| examples.count > 1 }
|
112
|
-
|
113
|
-
return false if @duplicate_examples.empty?
|
114
|
-
|
115
|
-
print_not_use_notice
|
116
|
-
print_duplicate_examples
|
117
|
-
|
118
|
-
true
|
119
|
-
end
|
120
|
-
|
121
148
|
def register_dependency(example_id, file_name)
|
122
149
|
@dependency[example_id] << file_name
|
123
150
|
end
|
@@ -126,62 +153,12 @@ module RSpecTracer
|
|
126
153
|
@examples_coverage = examples_coverage
|
127
154
|
end
|
128
155
|
|
129
|
-
def generate_reverse_dependency_report
|
130
|
-
@dependency.each_pair do |example_id, files|
|
131
|
-
example_file = @all_examples[example_id][:rerun_file_name]
|
132
|
-
|
133
|
-
files.each do |file_name|
|
134
|
-
@reverse_dependency[file_name][:example_count] += 1
|
135
|
-
@reverse_dependency[file_name][:examples][example_file] += 1
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
|
-
format_reverse_dependency_report
|
140
|
-
end
|
141
|
-
|
142
|
-
def generate_last_run_report
|
143
|
-
@last_run = {
|
144
|
-
run_id: @run_id,
|
145
|
-
pid: RSpecTracer.pid,
|
146
|
-
actual_count: RSpec.world.example_count + @skipped_examples.count,
|
147
|
-
example_count: RSpec.world.example_count,
|
148
|
-
failed_examples: @failed_examples.count,
|
149
|
-
skipped_examples: @skipped_examples.count,
|
150
|
-
pending_examples: @pending_examples.count
|
151
|
-
}
|
152
|
-
end
|
153
|
-
|
154
|
-
def write_reports
|
155
|
-
starting = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
156
|
-
|
157
|
-
@run_id = Digest::MD5.hexdigest(@all_examples.keys.sort.to_json)
|
158
|
-
@cache_dir = File.join(RSpecTracer.cache_path, @run_id)
|
159
|
-
|
160
|
-
FileUtils.mkdir_p(@cache_dir)
|
161
|
-
|
162
|
-
%i[
|
163
|
-
all_examples
|
164
|
-
flaky_examples
|
165
|
-
failed_examples
|
166
|
-
pending_examples
|
167
|
-
all_files
|
168
|
-
dependency
|
169
|
-
reverse_dependency
|
170
|
-
examples_coverage
|
171
|
-
last_run
|
172
|
-
].each { |report_type| send("write_#{report_type}_report") }
|
173
|
-
|
174
|
-
ending = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
175
|
-
elpased = RSpecTracer::TimeFormatter.format_time(ending - starting)
|
176
|
-
|
177
|
-
puts "RSpec tracer reports written to #{@cache_dir} (took #{elpased})"
|
178
|
-
end
|
179
|
-
|
180
156
|
private
|
181
157
|
|
182
158
|
def initialize_examples
|
183
159
|
@all_examples = {}
|
184
160
|
@duplicate_examples = Hash.new { |examples, example_id| examples[example_id] = [] }
|
161
|
+
@interrupted_examples = Set.new
|
185
162
|
@passed_examples = Set.new
|
186
163
|
@possibly_flaky_examples = Set.new
|
187
164
|
@flaky_examples = Set.new
|
@@ -223,114 +200,5 @@ module RSpecTracer
|
|
223
200
|
status: result.status.to_s
|
224
201
|
}
|
225
202
|
end
|
226
|
-
|
227
|
-
def format_reverse_dependency_report
|
228
|
-
@reverse_dependency.transform_values! do |data|
|
229
|
-
{
|
230
|
-
example_count: data[:example_count],
|
231
|
-
examples: data[:examples].sort_by { |file_name, count| [-count, file_name] }.to_h
|
232
|
-
}
|
233
|
-
end
|
234
|
-
|
235
|
-
report = @reverse_dependency.sort_by do |file_name, data|
|
236
|
-
[-data[:example_count], file_name]
|
237
|
-
end
|
238
|
-
|
239
|
-
@reverse_dependency = report.to_h
|
240
|
-
end
|
241
|
-
|
242
|
-
def print_not_use_notice
|
243
|
-
justify = ' ' * 4
|
244
|
-
four_justify = justify * 4
|
245
|
-
|
246
|
-
puts '=' * 80
|
247
|
-
puts "#{four_justify}IMPORTANT NOTICE -- DO NOT USE RSPEC TRACER"
|
248
|
-
puts '=' * 80
|
249
|
-
puts "#{justify}It would be best to make changes so that the RSpec tracer can uniquely"
|
250
|
-
puts "#{justify}identify all the examples, and then you can enable the RSpec tracer back."
|
251
|
-
puts '=' * 80
|
252
|
-
puts
|
253
|
-
end
|
254
|
-
|
255
|
-
# rubocop:disable Metrics/AbcSize
|
256
|
-
def print_duplicate_examples
|
257
|
-
total = @duplicate_examples.sum { |_, examples| examples.length }
|
258
|
-
|
259
|
-
puts "RSpec tracer could not uniquely identify the following #{total} examples:"
|
260
|
-
|
261
|
-
justify = ' ' * 2
|
262
|
-
nested_justify = justify * 3
|
263
|
-
|
264
|
-
@duplicate_examples.each_pair do |example_id, examples|
|
265
|
-
puts "#{justify}- Example ID: #{example_id} (#{examples.count} examples)"
|
266
|
-
|
267
|
-
examples.each do |example|
|
268
|
-
description = example[:full_description].strip
|
269
|
-
file_name = example[:rerun_file_name].sub(%r{^/}, '')
|
270
|
-
line_number = example[:rerun_line_number]
|
271
|
-
location = "#{file_name}:#{line_number}"
|
272
|
-
|
273
|
-
puts "#{nested_justify}* #{description} (#{location})"
|
274
|
-
end
|
275
|
-
end
|
276
|
-
|
277
|
-
puts
|
278
|
-
end
|
279
|
-
# rubocop:enable Metrics/AbcSize
|
280
|
-
|
281
|
-
def write_all_examples_report
|
282
|
-
file_name = File.join(@cache_dir, 'all_examples.json')
|
283
|
-
|
284
|
-
File.write(file_name, JSON.pretty_generate(@all_examples))
|
285
|
-
end
|
286
|
-
|
287
|
-
def write_flaky_examples_report
|
288
|
-
file_name = File.join(@cache_dir, 'flaky_examples.json')
|
289
|
-
|
290
|
-
File.write(file_name, JSON.pretty_generate(@flaky_examples.to_a))
|
291
|
-
end
|
292
|
-
|
293
|
-
def write_failed_examples_report
|
294
|
-
file_name = File.join(@cache_dir, 'failed_examples.json')
|
295
|
-
|
296
|
-
File.write(file_name, JSON.pretty_generate(@failed_examples.to_a))
|
297
|
-
end
|
298
|
-
|
299
|
-
def write_pending_examples_report
|
300
|
-
file_name = File.join(@cache_dir, 'pending_examples.json')
|
301
|
-
|
302
|
-
File.write(file_name, JSON.pretty_generate(@pending_examples.to_a))
|
303
|
-
end
|
304
|
-
|
305
|
-
def write_all_files_report
|
306
|
-
file_name = File.join(@cache_dir, 'all_files.json')
|
307
|
-
|
308
|
-
File.write(file_name, JSON.pretty_generate(@all_files))
|
309
|
-
end
|
310
|
-
|
311
|
-
def write_dependency_report
|
312
|
-
file_name = File.join(@cache_dir, 'dependency.json')
|
313
|
-
|
314
|
-
File.write(file_name, JSON.pretty_generate(@dependency))
|
315
|
-
end
|
316
|
-
|
317
|
-
def write_reverse_dependency_report
|
318
|
-
file_name = File.join(@cache_dir, 'reverse_dependency.json')
|
319
|
-
|
320
|
-
File.write(file_name, JSON.pretty_generate(@reverse_dependency))
|
321
|
-
end
|
322
|
-
|
323
|
-
def write_examples_coverage_report
|
324
|
-
file_name = File.join(@cache_dir, 'examples_coverage.json')
|
325
|
-
|
326
|
-
File.write(file_name, JSON.pretty_generate(@examples_coverage))
|
327
|
-
end
|
328
|
-
|
329
|
-
def write_last_run_report
|
330
|
-
file_name = File.join(RSpecTracer.cache_path, 'last_run.json')
|
331
|
-
last_run_data = @last_run.merge(run_id: @run_id, timestamp: Time.now.utc)
|
332
|
-
|
333
|
-
File.write(file_name, JSON.pretty_generate(last_run_data))
|
334
|
-
end
|
335
203
|
end
|
336
204
|
end
|
@@ -2,7 +2,6 @@
|
|
2
2
|
|
3
3
|
module RSpecTracer
|
4
4
|
module RSpecRunner
|
5
|
-
# rubocop:disable Metrics/AbcSize
|
6
5
|
def run_specs(example_groups)
|
7
6
|
actual_count = RSpec.world.example_count
|
8
7
|
RSpecTracer.no_examples = actual_count.zero?
|
@@ -23,18 +22,17 @@ module RSpecTracer
|
|
23
22
|
|
24
23
|
current_count = RSpec.world.example_count
|
25
24
|
ending = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
26
|
-
|
25
|
+
elapsed = RSpecTracer::TimeFormatter.format_time(ending - starting)
|
27
26
|
|
28
27
|
puts
|
29
28
|
puts <<-EXAMPLES.strip.gsub(/\s+/, ' ')
|
30
29
|
RSpec tracer is running #{current_count} examples (actual: #{actual_count},
|
31
|
-
skipped: #{actual_count - current_count}) (took #{
|
30
|
+
skipped: #{actual_count - current_count}) (took #{elapsed})
|
32
31
|
EXAMPLES
|
33
32
|
|
34
33
|
RSpecTracer.running = true
|
35
34
|
|
36
35
|
super(filtered_example_groups)
|
37
36
|
end
|
38
|
-
# rubocop:enable Metrics/AbcSize
|
39
37
|
end
|
40
38
|
end
|
data/lib/rspec_tracer/runner.rb
CHANGED
@@ -8,6 +8,7 @@ module RSpecTracer
|
|
8
8
|
EXAMPLE_RUN_REASON = {
|
9
9
|
explicit_run: 'Explicit run',
|
10
10
|
no_cache: 'No cache',
|
11
|
+
interrupted: 'Interrupted previously',
|
11
12
|
flaky_example: 'Flaky example',
|
12
13
|
failed_example: 'Failed previously',
|
13
14
|
pending_example: 'Pending previously',
|
@@ -21,8 +22,6 @@ module RSpecTracer
|
|
21
22
|
@reporter = RSpecTracer::Reporter.new
|
22
23
|
@filtered_examples = {}
|
23
24
|
|
24
|
-
return if @cache.run_id.nil?
|
25
|
-
|
26
25
|
@cache.load_cache_for_run
|
27
26
|
filter_examples_to_run
|
28
27
|
end
|
@@ -43,6 +42,10 @@ module RSpecTracer
|
|
43
42
|
@reporter.register_example(example)
|
44
43
|
end
|
45
44
|
|
45
|
+
def deregister_duplicate_examples
|
46
|
+
@reporter.deregister_duplicate_examples
|
47
|
+
end
|
48
|
+
|
46
49
|
def on_example_skipped(example_id)
|
47
50
|
@reporter.on_example_skipped(example_id)
|
48
51
|
end
|
@@ -59,15 +62,14 @@ module RSpecTracer
|
|
59
62
|
@reporter.on_example_pending(example_id, execution_result)
|
60
63
|
end
|
61
64
|
|
62
|
-
def
|
63
|
-
@reporter.
|
65
|
+
def register_interrupted_examples
|
66
|
+
@reporter.register_interrupted_examples
|
64
67
|
end
|
65
68
|
|
66
|
-
def
|
67
|
-
@reporter.
|
69
|
+
def register_deleted_examples
|
70
|
+
@reporter.register_deleted_examples(@cache.all_examples)
|
68
71
|
end
|
69
72
|
|
70
|
-
# rubocop:disable Metrics/AbcSize
|
71
73
|
def generate_missed_coverage
|
72
74
|
missed_coverage = Hash.new do |files_coverage, file_path|
|
73
75
|
files_coverage[file_path] = Hash.new do |strength, line_number|
|
@@ -77,6 +79,9 @@ module RSpecTracer
|
|
77
79
|
|
78
80
|
@cache.cached_examples_coverage.each_pair do |example_id, example_coverage|
|
79
81
|
example_coverage.each_pair do |file_path, line_coverage|
|
82
|
+
next if @reporter.example_interrupted?(example_id) ||
|
83
|
+
@reporter.duplicate_example?(example_id)
|
84
|
+
|
80
85
|
next unless @reporter.example_skipped?(example_id)
|
81
86
|
|
82
87
|
file_name = RSpecTracer::SourceFile.file_name(file_path)
|
@@ -91,12 +96,14 @@ module RSpecTracer
|
|
91
96
|
|
92
97
|
missed_coverage
|
93
98
|
end
|
94
|
-
# rubocop:enable Metrics/AbcSize
|
95
99
|
|
96
100
|
def register_dependency(examples_coverage)
|
97
101
|
filtered_files = Set.new
|
98
102
|
|
99
103
|
examples_coverage.each_pair do |example_id, example_coverage|
|
104
|
+
next if @reporter.example_interrupted?(example_id) ||
|
105
|
+
@reporter.duplicate_example?(example_id)
|
106
|
+
|
100
107
|
register_example_files_dependency(example_id)
|
101
108
|
|
102
109
|
example_coverage.each_key do |file_path|
|
@@ -122,6 +129,9 @@ module RSpecTracer
|
|
122
129
|
@reporter.register_source_file(source_file)
|
123
130
|
|
124
131
|
@reporter.all_examples.each_key do |example_id|
|
132
|
+
next if @reporter.example_interrupted?(example_id) ||
|
133
|
+
@reporter.duplicate_example?(example_id)
|
134
|
+
|
125
135
|
@reporter.register_dependency(example_id, source_file[:file_name])
|
126
136
|
end
|
127
137
|
end
|
@@ -131,22 +141,9 @@ module RSpecTracer
|
|
131
141
|
@reporter.register_examples_coverage(examples_coverage)
|
132
142
|
end
|
133
143
|
|
134
|
-
def
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
%i[all_files all_examples dependency examples_coverage reverse_dependency].each do |report_type|
|
139
|
-
starting = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
140
|
-
|
141
|
-
send("generate_#{report_type}_report")
|
142
|
-
|
143
|
-
ending = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
144
|
-
elpased = RSpecTracer::TimeFormatter.format_time(ending - starting)
|
145
|
-
|
146
|
-
puts "RSpec tracer generated #{report_type.to_s.tr('_', ' ')} report (took #{elpased})" if RSpecTracer.verbose?
|
147
|
-
end
|
148
|
-
|
149
|
-
@reporter.write_reports
|
144
|
+
def non_zero_exit_code?
|
145
|
+
!@reporter.duplicate_examples.empty? &&
|
146
|
+
ENV.fetch('RSPEC_TRACER_FAIL_ON_DUPLICATES', 'true') == 'true'
|
150
147
|
end
|
151
148
|
|
152
149
|
private
|
@@ -163,12 +160,13 @@ module RSpecTracer
|
|
163
160
|
filter_by_files_changed
|
164
161
|
|
165
162
|
ending = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
166
|
-
|
163
|
+
elapsed = RSpecTracer::TimeFormatter.format_time(ending - starting)
|
167
164
|
|
168
|
-
puts "RSpec tracer processed cache (took #{
|
165
|
+
puts "RSpec tracer processed cache (took #{elapsed})" if RSpecTracer.verbose?
|
169
166
|
end
|
170
167
|
|
171
168
|
def filter_by_example_status
|
169
|
+
add_previously_interrupted_examples
|
172
170
|
add_previously_flaky_examples
|
173
171
|
add_previously_failed_examples
|
174
172
|
add_previously_pending_examples
|
@@ -183,10 +181,17 @@ module RSpecTracer
|
|
183
181
|
end
|
184
182
|
end
|
185
183
|
|
184
|
+
def add_previously_interrupted_examples
|
185
|
+
@cache.interrupted_examples.each do |example_id|
|
186
|
+
@filtered_examples[example_id] = EXAMPLE_RUN_REASON[:interrupted]
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
186
190
|
def add_previously_flaky_examples
|
187
191
|
@cache.flaky_examples.each do |example_id|
|
188
192
|
@filtered_examples[example_id] = EXAMPLE_RUN_REASON[:flaky_example]
|
189
193
|
|
194
|
+
next unless @cache.dependency.key?(example_id)
|
190
195
|
next unless (@changed_files & @cache.dependency[example_id]).empty?
|
191
196
|
|
192
197
|
@reporter.register_possibly_flaky_example(example_id)
|
@@ -199,6 +204,7 @@ module RSpecTracer
|
|
199
204
|
|
200
205
|
@filtered_examples[example_id] = EXAMPLE_RUN_REASON[:failed_example]
|
201
206
|
|
207
|
+
next unless @cache.dependency.key?(example_id)
|
202
208
|
next unless (@changed_files & @cache.dependency[example_id]).empty?
|
203
209
|
|
204
210
|
@reporter.register_possibly_flaky_example(example_id)
|
@@ -247,6 +253,9 @@ module RSpecTracer
|
|
247
253
|
end
|
248
254
|
|
249
255
|
def register_example_files_dependency(example_id)
|
256
|
+
return if @reporter.example_interrupted?(example_id) ||
|
257
|
+
@reporter.duplicate_example?(example_id)
|
258
|
+
|
250
259
|
example = @reporter.all_examples[example_id]
|
251
260
|
|
252
261
|
register_example_file_dependency(example_id, example[:file_name])
|
@@ -257,6 +266,9 @@ module RSpecTracer
|
|
257
266
|
end
|
258
267
|
|
259
268
|
def register_example_file_dependency(example_id, file_name)
|
269
|
+
return if @reporter.example_interrupted?(example_id) ||
|
270
|
+
@reporter.duplicate_example?(example_id)
|
271
|
+
|
260
272
|
source_file = RSpecTracer::SourceFile.from_name(file_name)
|
261
273
|
|
262
274
|
@reporter.register_source_file(source_file)
|
@@ -264,6 +276,9 @@ module RSpecTracer
|
|
264
276
|
end
|
265
277
|
|
266
278
|
def register_file_dependency(example_id, file_path)
|
279
|
+
return if @reporter.example_interrupted?(example_id) ||
|
280
|
+
@reporter.duplicate_example?(example_id)
|
281
|
+
|
267
282
|
source_file = RSpecTracer::SourceFile.from_path(file_path)
|
268
283
|
|
269
284
|
return false if RSpecTracer.filters.any? { |filter| filter.match?(source_file) }
|
@@ -273,92 +288,5 @@ module RSpecTracer
|
|
273
288
|
|
274
289
|
true
|
275
290
|
end
|
276
|
-
|
277
|
-
def generate_examples_status_report
|
278
|
-
starting = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
279
|
-
|
280
|
-
generate_flaky_examples_report
|
281
|
-
generate_failed_examples_report
|
282
|
-
generate_pending_examples_report
|
283
|
-
|
284
|
-
ending = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
285
|
-
elpased = RSpecTracer::TimeFormatter.format_time(ending - starting)
|
286
|
-
|
287
|
-
puts "RSpec tracer generated flaky, failed, and pending examples report (took #{elpased})" if RSpecTracer.verbose?
|
288
|
-
end
|
289
|
-
|
290
|
-
def generate_all_files_report
|
291
|
-
@cache.all_files.each_pair do |file_name, data|
|
292
|
-
next if @reporter.all_files.key?(file_name) ||
|
293
|
-
@reporter.file_deleted?(file_name)
|
294
|
-
|
295
|
-
@reporter.all_files[file_name] = data
|
296
|
-
end
|
297
|
-
end
|
298
|
-
|
299
|
-
def generate_all_examples_report
|
300
|
-
@cache.all_examples.each_pair do |example_id, data|
|
301
|
-
next if @reporter.all_examples.key?(example_id) ||
|
302
|
-
@reporter.example_deleted?(example_id)
|
303
|
-
|
304
|
-
@reporter.all_examples[example_id] = data
|
305
|
-
end
|
306
|
-
end
|
307
|
-
|
308
|
-
def generate_flaky_examples_report
|
309
|
-
@reporter.possibly_flaky_examples.each do |example_id|
|
310
|
-
next if @reporter.example_deleted?(example_id)
|
311
|
-
next unless @cache.flaky_examples.include?(example_id) ||
|
312
|
-
@reporter.example_passed?(example_id)
|
313
|
-
|
314
|
-
@reporter.register_flaky_example(example_id)
|
315
|
-
end
|
316
|
-
end
|
317
|
-
|
318
|
-
def generate_failed_examples_report
|
319
|
-
@cache.failed_examples.each do |example_id|
|
320
|
-
next if @reporter.example_deleted?(example_id) ||
|
321
|
-
@reporter.all_examples.key?(example_id)
|
322
|
-
|
323
|
-
@reporter.register_failed_example(example_id)
|
324
|
-
end
|
325
|
-
end
|
326
|
-
|
327
|
-
def generate_pending_examples_report
|
328
|
-
@cache.pending_examples.each do |example_id|
|
329
|
-
next if @reporter.example_deleted?(example_id) ||
|
330
|
-
@reporter.all_examples.key?(example_id)
|
331
|
-
|
332
|
-
@reporter.register_pending_example(example_id)
|
333
|
-
end
|
334
|
-
end
|
335
|
-
|
336
|
-
def generate_dependency_report
|
337
|
-
@cache.dependency.each_pair do |example_id, data|
|
338
|
-
next if @reporter.dependency.key?(example_id) ||
|
339
|
-
@reporter.example_deleted?(example_id)
|
340
|
-
|
341
|
-
@reporter.dependency[example_id] = data.reject do |file_name|
|
342
|
-
@reporter.file_deleted?(file_name)
|
343
|
-
end
|
344
|
-
end
|
345
|
-
|
346
|
-
@reporter.dependency.transform_values!(&:to_a)
|
347
|
-
end
|
348
|
-
|
349
|
-
def generate_examples_coverage_report
|
350
|
-
@cache.cached_examples_coverage.each_pair do |example_id, data|
|
351
|
-
next if @reporter.examples_coverage.key?(example_id) ||
|
352
|
-
@reporter.example_deleted?(example_id)
|
353
|
-
|
354
|
-
@reporter.examples_coverage[example_id] = data.reject do |file_name|
|
355
|
-
@reporter.file_deleted?(file_name)
|
356
|
-
end
|
357
|
-
end
|
358
|
-
end
|
359
|
-
|
360
|
-
def generate_reverse_dependency_report
|
361
|
-
@reporter.generate_reverse_dependency_report
|
362
|
-
end
|
363
291
|
end
|
364
292
|
end
|
data/lib/rspec_tracer/version.rb
CHANGED