minitest-heat 0.0.14 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +1 -1
- data/lib/minitest/heat/output/map.rb +39 -26
- data/lib/minitest/heat/output.rb +5 -1
- data/lib/minitest/heat/results.rb +14 -2
- data/lib/minitest/heat/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 887dc01f3a08341f1e88cb24b539d0843cdce81fdb49246fbce8af875ff00d3f
|
4
|
+
data.tar.gz: 875d197ab5c65c2cb85b192201375be653ba30da2fc91896b4a3e61702cacefd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6ef73c9df5b91b5950cc444f6ea7a18ccd867bda4fbdb015b8d713eaebe91b925a2cfb48b596a43a0d36af023dcb04f5c8ec0803602ab27bf709372fe6f9b0f3
|
7
|
+
data.tar.gz: d338944e9d32e8ec326cce9dbe861c5b8bec408bb455e4e984d45567ef9d9c5af9154f4475c2862ddc43778c95d8e58f12beef8757aa37f6b76d91da1b17a4c5
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Minitest::Heat
|
1
|
+
# 🔥 Minitest::Heat 🔥
|
2
2
|
Minitest::Heat helps you identify problems faster so you can more efficiently resolve test failures. It does this through a few different methods.
|
3
3
|
|
4
4
|
It collects failures and inspects backtraces to identify patterns and provide a heat map summary of the files and line numbers that most frequently appear to be the causes of issues.
|
@@ -38,7 +38,7 @@ module Minitest
|
|
38
38
|
break unless traces.any?
|
39
39
|
|
40
40
|
# A short summary explaining the details that will follow
|
41
|
-
@tokens << [[:
|
41
|
+
@tokens << [[:default, " Line #{line_number}"], [:muted, ' issues triggered from:']]
|
42
42
|
|
43
43
|
# The last relevant location for each error's backtrace
|
44
44
|
@tokens += origination_sources(traces)
|
@@ -51,23 +51,27 @@ module Minitest
|
|
51
51
|
private
|
52
52
|
|
53
53
|
def origination_sources(traces)
|
54
|
-
# 1.
|
55
|
-
# 2.
|
54
|
+
# 1. Only pull the traces that have proper locations
|
55
|
+
# 2. Sort the traces by the most recent line number so they're displayed in numeric order
|
56
|
+
# 3. Get the final relevant location from the trace
|
56
57
|
traces.
|
58
|
+
select { |trace| trace.locations.any? }.
|
57
59
|
sort_by { |trace| trace.locations.last.line_number }.
|
58
60
|
map { |trace| origination_location_token(trace) }
|
59
61
|
end
|
60
62
|
|
61
63
|
def file_summary_tokens(hit)
|
62
64
|
pathname_tokens = pathname(hit)
|
63
|
-
line_number_list_tokens =
|
65
|
+
line_number_list_tokens = line_number_tokens_for_hit(hit)
|
64
66
|
|
65
67
|
[*pathname_tokens, *line_number_list_tokens]
|
66
68
|
end
|
67
69
|
|
68
70
|
def origination_location_token(trace)
|
69
71
|
# The earliest project line from the backtrace—this is probabyl wholly incorrect in terms
|
70
|
-
# of what would be the most helpful line to display, but it's a start.
|
72
|
+
# of what would be the most helpful line to display, but it's a start. Otherwise, the
|
73
|
+
# logic will need to compare all traces for the issue and find the unique origination
|
74
|
+
# lines
|
71
75
|
location = trace.locations.last
|
72
76
|
|
73
77
|
[
|
@@ -137,8 +141,10 @@ module Minitest
|
|
137
141
|
line_numbers_for_issue_type = hit.issues.fetch(issue_type) { [] }
|
138
142
|
|
139
143
|
# Build the list of tokens representing styled line numbers
|
140
|
-
line_numbers_for_issue_type.each do |line_number|
|
141
|
-
|
144
|
+
line_numbers_for_issue_type.uniq.sort.each do |line_number|
|
145
|
+
frequency = line_numbers_for_issue_type.count(line_number)
|
146
|
+
|
147
|
+
line_number_tokens += line_number_token(issue_type, line_number, frequency)
|
142
148
|
end
|
143
149
|
end
|
144
150
|
|
@@ -151,27 +157,34 @@ module Minitest
|
|
151
157
|
# @param line_number [Integer] the affected line number
|
152
158
|
#
|
153
159
|
# @return [Array<Symbol,Integer>] array token representing the line number and issue type
|
154
|
-
def line_number_token(style, line_number)
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
#
|
163
|
-
# @return [Array] the arrays representing the line number tokens to display next to a file
|
164
|
-
# name in the heat map. ex [[:error, 12], [:falure, 13]]
|
165
|
-
def sorted_line_number_list(hit)
|
166
|
-
# Sort the collected group of line number hits so they're in order
|
167
|
-
line_number_tokens_for_hit(hit).sort do |a, b|
|
168
|
-
# Ensure the line numbers are integers for sorting (otherwise '100' comes before '12')
|
169
|
-
first_line_number = Integer(a[1].strip)
|
170
|
-
second_line_number = Integer(b[1].strip)
|
171
|
-
|
172
|
-
first_line_number <=> second_line_number
|
160
|
+
def line_number_token(style, line_number, frequency)
|
161
|
+
if frequency > 1
|
162
|
+
[
|
163
|
+
[style, "#{line_number}"],
|
164
|
+
[:muted, "✕#{frequency} "]
|
165
|
+
]
|
166
|
+
else
|
167
|
+
[[style, "#{line_number} "]]
|
173
168
|
end
|
174
169
|
end
|
170
|
+
|
171
|
+
# # Sorts line number tokens so that line numbers are displayed in order regardless of their
|
172
|
+
# # underlying issue type
|
173
|
+
# #
|
174
|
+
# # @param hit [Hit] the instance of the hit file details to build the heat map entry
|
175
|
+
# #
|
176
|
+
# # @return [Array] the arrays representing the line number tokens to display next to a file
|
177
|
+
# # name in the heat map. ex [[:error, 12], [:falure, 13]]
|
178
|
+
# def sorted_line_number_list(hit)
|
179
|
+
# # Sort the collected group of line number hits so they're in order
|
180
|
+
# line_number_tokens_for_hit(hit).sort do |a, b|
|
181
|
+
# # Ensure the line numbers are integers for sorting (otherwise '100' comes before '12')
|
182
|
+
# first_line_number = Integer(a[1].strip)
|
183
|
+
# second_line_number = Integer(b[1].strip)
|
184
|
+
|
185
|
+
# first_line_number <=> second_line_number
|
186
|
+
# end
|
187
|
+
# end
|
175
188
|
end
|
176
189
|
end
|
177
190
|
end
|
data/lib/minitest/heat/output.rb
CHANGED
@@ -57,7 +57,11 @@ module Minitest
|
|
57
57
|
# suppress them until the more critical issues are resolved.
|
58
58
|
next unless show?(issue_category, results)
|
59
59
|
|
60
|
-
results.send(issue_category)
|
60
|
+
issues = results.send(issue_category)
|
61
|
+
|
62
|
+
issues
|
63
|
+
.sort_by { |issue| issue.locations.most_relevant.to_a }
|
64
|
+
.each { |issue| issue_details(issue) }
|
61
65
|
end
|
62
66
|
rescue StandardError => e
|
63
67
|
message = "Sorry, but Minitest Heat couldn't display the details of any failures."
|
@@ -30,8 +30,20 @@ module Minitest
|
|
30
30
|
# For heat map purposes, only the project backtrace lines are interesting
|
31
31
|
pathname, line_number = issue.locations.project.to_a
|
32
32
|
|
33
|
-
#
|
34
|
-
|
33
|
+
# A backtrace is only relevant for exception-generating issues (i.e. errors), not slows or skips
|
34
|
+
# However, while assertion failures won't have a backtrace, there can still be repeated line
|
35
|
+
# numbers if the tests reference a shared method with an assertion in it. So in those cases,
|
36
|
+
# the backtrace is simply the test definition
|
37
|
+
backtrace = if issue.error?
|
38
|
+
# With errors, we have a backtrace
|
39
|
+
issue.locations.backtrace.project_locations
|
40
|
+
else
|
41
|
+
# With failures, the test definition is the most granular backtrace equivalent
|
42
|
+
location = issue.locations.test_definition
|
43
|
+
location.raw_container = issue.test_identifier
|
44
|
+
|
45
|
+
[location]
|
46
|
+
end
|
35
47
|
|
36
48
|
@heat_map.add(pathname, line_number, issue.type, backtrace: backtrace)
|
37
49
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: minitest-heat
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Garrett Dimon
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-12-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|