rspec-tracer 0.9.1 → 0.9.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/README.md +1 -3
- data/lib/rspec_tracer/cache.rb +8 -3
- data/lib/rspec_tracer/html_reporter/reporter.rb +15 -3
- data/lib/rspec_tracer/reporter.rb +27 -4
- data/lib/rspec_tracer/runner.rb +23 -0
- data/lib/rspec_tracer/version.rb +1 -1
- data/lib/rspec_tracer.rb +1 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3f76c84eee2926bd06511fc4e92112653dd9515a7a486c5c90102e94d1001ba7
|
4
|
+
data.tar.gz: 8b64c63ba96ade735ec0cd1c2982075ece274fc88e4f76eb0bff2a6bd1c4f545
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b296c0812b1b223186eb3e3a789cf2eefb9a035216ef83b7b0ebd98828f64f9c358ca435cd68461f2baf96c710d2fe02547e1eb1f25a4219cc92da4bd59ab7c8
|
7
|
+
data.tar.gz: eb899ae2a04ceb7bd0b6a99af710750a98c03282b431d86e2c038376a76120d1ad794ee917e866638732099a8966a039cbebc5e17514062a262e6ab733700137
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -28,9 +28,7 @@ recommended to use **simplecov >= 0.12.0**. To use RSpec Tracer **cache on CI**,
|
|
28
28
|
need to have an **S3 bucket** and **[AWS CLI](https://aws.amazon.com/cli/)**
|
29
29
|
installed.
|
30
30
|
|
31
|
-
You should take some time and go through the **[document](./RSPEC_TRACER.md)**
|
32
|
-
describing the **intention** and implementation details of **managing dependency**,
|
33
|
-
**managing flaky tests**, **skipping tests**, and **caching on CI**.
|
31
|
+
### You should take some time and go through the **[document](./RSPEC_TRACER.md)** describing the **intention** and implementation details of **managing dependency**, **managing flaky tests**, **skipping tests**, and **caching on CI**.
|
34
32
|
|
35
33
|
## Table of Contents
|
36
34
|
|
data/lib/rspec_tracer/cache.rb
CHANGED
@@ -2,8 +2,8 @@
|
|
2
2
|
|
3
3
|
module RSpecTracer
|
4
4
|
class Cache
|
5
|
-
attr_reader :all_examples, :
|
6
|
-
:all_files, :dependency, :run_id
|
5
|
+
attr_reader :all_examples, :interrupted_examples, :flaky_examples, :failed_examples,
|
6
|
+
:pending_examples, :all_files, :dependency, :run_id
|
7
7
|
|
8
8
|
def initialize
|
9
9
|
@run_id = last_run_id
|
@@ -12,6 +12,7 @@ module RSpecTracer
|
|
12
12
|
@cached = false
|
13
13
|
|
14
14
|
@all_examples = {}
|
15
|
+
@interrupted_examples = Set.new
|
15
16
|
@flaky_examples = Set.new
|
16
17
|
@failed_examples = Set.new
|
17
18
|
@pending_examples = Set.new
|
@@ -74,7 +75,11 @@ module RSpecTracer
|
|
74
75
|
end
|
75
76
|
|
76
77
|
@all_examples.each_value do |example|
|
77
|
-
example
|
78
|
+
if example.key?(:execution_result)
|
79
|
+
example[:execution_result].transform_keys!(&:to_sym)
|
80
|
+
else
|
81
|
+
@interrupted_examples << example[:example_id]
|
82
|
+
end
|
78
83
|
|
79
84
|
example[:run_reason] = nil
|
80
85
|
end
|
@@ -60,7 +60,19 @@ module RSpecTracer
|
|
60
60
|
id: example_id,
|
61
61
|
description: example[:full_description],
|
62
62
|
location: example_location(example[:rerun_file_name], example[:rerun_line_number]),
|
63
|
-
status: example[:run_reason] || 'Skipped'
|
63
|
+
status: example[:run_reason] || 'Skipped'
|
64
|
+
}.merge(example_result(example_id, example))
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def example_result(example_id, example)
|
69
|
+
if example[:execution_result].nil?
|
70
|
+
{
|
71
|
+
result: @reporter.example_interrupted?(example_id) ? 'Interrupted' : '_',
|
72
|
+
last_run: '_'
|
73
|
+
}
|
74
|
+
else
|
75
|
+
{
|
64
76
|
result: example[:execution_result][:status].capitalize,
|
65
77
|
last_run: example_run_local_time(example[:execution_result][:finished_at])
|
66
78
|
}
|
@@ -176,7 +188,7 @@ module RSpecTracer
|
|
176
188
|
|
177
189
|
def example_status_css_class(example_status)
|
178
190
|
case example_status.split.first
|
179
|
-
when 'Failed', 'Flaky'
|
191
|
+
when 'Failed', 'Flaky', 'Interrupted'
|
180
192
|
'red'
|
181
193
|
when 'Pending'
|
182
194
|
'yellow'
|
@@ -189,7 +201,7 @@ module RSpecTracer
|
|
189
201
|
case example_result
|
190
202
|
when 'Passed'
|
191
203
|
'green'
|
192
|
-
when 'Failed'
|
204
|
+
when 'Failed', 'Interrupted'
|
193
205
|
'red'
|
194
206
|
when 'Pending'
|
195
207
|
'yellow'
|
@@ -2,9 +2,10 @@
|
|
2
2
|
|
3
3
|
module RSpecTracer
|
4
4
|
class Reporter
|
5
|
-
attr_reader :all_examples, :
|
6
|
-
:
|
7
|
-
:
|
5
|
+
attr_reader :all_examples, :interrupted_examples, :possibly_flaky_examples,
|
6
|
+
:flaky_examples, :pending_examples, :all_files, :modified_files,
|
7
|
+
:deleted_files, :dependency, :reverse_dependency, :examples_coverage,
|
8
|
+
:last_run
|
8
9
|
|
9
10
|
def initialize
|
10
11
|
initialize_examples
|
@@ -37,8 +38,21 @@ module RSpecTracer
|
|
37
38
|
@all_examples[example_id][:execution_result] = formatted_execution_result(result)
|
38
39
|
end
|
39
40
|
|
41
|
+
def register_interrupted_examples
|
42
|
+
@all_examples.each_pair do |example_id, example|
|
43
|
+
next if example.key?(:execution_result)
|
44
|
+
|
45
|
+
@interrupted_examples << example_id
|
46
|
+
end
|
47
|
+
|
48
|
+
return if @interrupted_examples.empty?
|
49
|
+
|
50
|
+
puts "RSpec tracer is not processing #{@interrupted_examples.count} interrupted examples"
|
51
|
+
end
|
52
|
+
|
40
53
|
def register_deleted_examples(seen_examples)
|
41
54
|
@deleted_examples = seen_examples.keys.to_set - (@skipped_examples | @all_examples.keys)
|
55
|
+
@deleted_examples -= @interrupted_examples
|
42
56
|
|
43
57
|
@deleted_examples.select! do |example_id|
|
44
58
|
example = seen_examples[example_id]
|
@@ -63,6 +77,10 @@ module RSpecTracer
|
|
63
77
|
@pending_examples << example_id
|
64
78
|
end
|
65
79
|
|
80
|
+
def example_interrupted?(example_id)
|
81
|
+
@interrupted_examples.include?(example_id)
|
82
|
+
end
|
83
|
+
|
66
84
|
def example_passed?(example_id)
|
67
85
|
@passed_examples.include?(example_id)
|
68
86
|
end
|
@@ -128,6 +146,8 @@ module RSpecTracer
|
|
128
146
|
|
129
147
|
def generate_reverse_dependency_report
|
130
148
|
@dependency.each_pair do |example_id, files|
|
149
|
+
next if @interrupted_examples.include?(example_id)
|
150
|
+
|
131
151
|
example_file = @all_examples[example_id][:rerun_file_name]
|
132
152
|
|
133
153
|
files.each do |file_name|
|
@@ -145,9 +165,11 @@ module RSpecTracer
|
|
145
165
|
pid: RSpecTracer.pid,
|
146
166
|
actual_count: RSpec.world.example_count + @skipped_examples.count,
|
147
167
|
example_count: RSpec.world.example_count,
|
168
|
+
interrupted_examples: @interrupted_examples.count,
|
148
169
|
failed_examples: @failed_examples.count,
|
149
170
|
skipped_examples: @skipped_examples.count,
|
150
|
-
pending_examples: @pending_examples.count
|
171
|
+
pending_examples: @pending_examples.count,
|
172
|
+
flaky_examples: @flaky_examples.count
|
151
173
|
}
|
152
174
|
end
|
153
175
|
|
@@ -182,6 +204,7 @@ module RSpecTracer
|
|
182
204
|
def initialize_examples
|
183
205
|
@all_examples = {}
|
184
206
|
@duplicate_examples = Hash.new { |examples, example_id| examples[example_id] = [] }
|
207
|
+
@interrupted_examples = Set.new
|
185
208
|
@passed_examples = Set.new
|
186
209
|
@possibly_flaky_examples = Set.new
|
187
210
|
@flaky_examples = Set.new
|
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',
|
@@ -59,6 +60,10 @@ module RSpecTracer
|
|
59
60
|
@reporter.on_example_pending(example_id, execution_result)
|
60
61
|
end
|
61
62
|
|
63
|
+
def register_interrupted_examples
|
64
|
+
@reporter.register_interrupted_examples
|
65
|
+
end
|
66
|
+
|
62
67
|
def register_deleted_examples
|
63
68
|
@reporter.register_deleted_examples(@cache.all_examples)
|
64
69
|
end
|
@@ -77,6 +82,7 @@ module RSpecTracer
|
|
77
82
|
|
78
83
|
@cache.cached_examples_coverage.each_pair do |example_id, example_coverage|
|
79
84
|
example_coverage.each_pair do |file_path, line_coverage|
|
85
|
+
next if @reporter.example_interrupted?(example_id)
|
80
86
|
next unless @reporter.example_skipped?(example_id)
|
81
87
|
|
82
88
|
file_name = RSpecTracer::SourceFile.file_name(file_path)
|
@@ -97,6 +103,8 @@ module RSpecTracer
|
|
97
103
|
filtered_files = Set.new
|
98
104
|
|
99
105
|
examples_coverage.each_pair do |example_id, example_coverage|
|
106
|
+
next if @reporter.example_interrupted?(example_id)
|
107
|
+
|
100
108
|
register_example_files_dependency(example_id)
|
101
109
|
|
102
110
|
example_coverage.each_key do |file_path|
|
@@ -122,6 +130,8 @@ module RSpecTracer
|
|
122
130
|
@reporter.register_source_file(source_file)
|
123
131
|
|
124
132
|
@reporter.all_examples.each_key do |example_id|
|
133
|
+
next if @reporter.example_interrupted?(example_id)
|
134
|
+
|
125
135
|
@reporter.register_dependency(example_id, source_file[:file_name])
|
126
136
|
end
|
127
137
|
end
|
@@ -169,6 +179,7 @@ module RSpecTracer
|
|
169
179
|
end
|
170
180
|
|
171
181
|
def filter_by_example_status
|
182
|
+
add_previously_interrupted_examples
|
172
183
|
add_previously_flaky_examples
|
173
184
|
add_previously_failed_examples
|
174
185
|
add_previously_pending_examples
|
@@ -183,6 +194,12 @@ module RSpecTracer
|
|
183
194
|
end
|
184
195
|
end
|
185
196
|
|
197
|
+
def add_previously_interrupted_examples
|
198
|
+
@cache.interrupted_examples.each do |example_id|
|
199
|
+
@filtered_examples[example_id] = EXAMPLE_RUN_REASON[:interrupted]
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
186
203
|
def add_previously_flaky_examples
|
187
204
|
@cache.flaky_examples.each do |example_id|
|
188
205
|
@filtered_examples[example_id] = EXAMPLE_RUN_REASON[:flaky_example]
|
@@ -249,6 +266,8 @@ module RSpecTracer
|
|
249
266
|
end
|
250
267
|
|
251
268
|
def register_example_files_dependency(example_id)
|
269
|
+
return if @reporter.example_interrupted?(example_id)
|
270
|
+
|
252
271
|
example = @reporter.all_examples[example_id]
|
253
272
|
|
254
273
|
register_example_file_dependency(example_id, example[:file_name])
|
@@ -259,6 +278,8 @@ module RSpecTracer
|
|
259
278
|
end
|
260
279
|
|
261
280
|
def register_example_file_dependency(example_id, file_name)
|
281
|
+
return if @reporter.example_interrupted?(example_id)
|
282
|
+
|
262
283
|
source_file = RSpecTracer::SourceFile.from_name(file_name)
|
263
284
|
|
264
285
|
@reporter.register_source_file(source_file)
|
@@ -266,6 +287,8 @@ module RSpecTracer
|
|
266
287
|
end
|
267
288
|
|
268
289
|
def register_file_dependency(example_id, file_path)
|
290
|
+
return if @reporter.example_interrupted?(example_id)
|
291
|
+
|
269
292
|
source_file = RSpecTracer::SourceFile.from_path(file_path)
|
270
293
|
|
271
294
|
return false if RSpecTracer.filters.any? { |filter| filter.match?(source_file) }
|
data/lib/rspec_tracer/version.rb
CHANGED
data/lib/rspec_tracer.rb
CHANGED
@@ -196,6 +196,7 @@ module RSpecTracer
|
|
196
196
|
def process_dependency
|
197
197
|
starting = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
198
198
|
|
199
|
+
runner.register_interrupted_examples
|
199
200
|
runner.register_deleted_examples
|
200
201
|
runner.register_dependency(coverage_reporter.examples_coverage)
|
201
202
|
runner.register_untraced_dependency(@traced_files)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rspec-tracer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Abhimanyu Singh
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-09-
|
11
|
+
date: 2021-09-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: docile
|
@@ -113,7 +113,7 @@ licenses:
|
|
113
113
|
- MIT
|
114
114
|
metadata:
|
115
115
|
homepage_uri: https://github.com/avmnu-sng/rspec-tracer
|
116
|
-
source_code_uri: https://github.com/avmnu-sng/rspec-tracer/tree/v0.9.
|
116
|
+
source_code_uri: https://github.com/avmnu-sng/rspec-tracer/tree/v0.9.2
|
117
117
|
changelog_uri: https://github.com/avmnu-sng/rspec-tracer/blob/main/CHANGELOG.md
|
118
118
|
bug_tracker_uri: https://github.com/avmnu-sng/rspec-tracer/issues
|
119
119
|
post_install_message:
|