minitest-heat 0.0.9 → 0.0.10
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/.rubocop.yml +1 -0
- data/Gemfile.lock +1 -1
- data/README.md +1 -1
- data/lib/minitest/heat/backtrace/line.rb +118 -0
- data/lib/minitest/heat/backtrace.rb +48 -14
- data/lib/minitest/heat/hit.rb +23 -18
- data/lib/minitest/heat/issue.rb +89 -70
- data/lib/minitest/heat/location.rb +71 -53
- data/lib/minitest/heat/map.rb +14 -1
- data/lib/minitest/heat/output/backtrace.rb +12 -7
- data/lib/minitest/heat/output/issue.rb +42 -6
- data/lib/minitest/heat/output/map.rb +17 -3
- data/lib/minitest/heat/output/marker.rb +5 -3
- data/lib/minitest/heat/output/results.rb +3 -2
- data/lib/minitest/heat/output/source_code.rb +1 -1
- data/lib/minitest/heat/output/token.rb +2 -1
- data/lib/minitest/heat/output.rb +60 -4
- data/lib/minitest/heat/results.rb +18 -3
- data/lib/minitest/heat/version.rb +1 -1
- data/lib/minitest/heat.rb +2 -2
- data/lib/minitest/heat_plugin.rb +9 -17
- data/lib/minitest/heat_reporter.rb +19 -36
- metadata +3 -3
- data/lib/minitest/heat/line.rb +0 -74
data/lib/minitest/heat_plugin.rb
CHANGED
@@ -2,25 +2,17 @@
|
|
2
2
|
|
3
3
|
require_relative 'heat_reporter'
|
4
4
|
|
5
|
-
module Minitest
|
6
|
-
def self.plugin_heat_options(opts, _options)
|
7
|
-
opts.on '--show-fast', 'Show failures as they happen instead of waiting for the entire suite.' do
|
8
|
-
# Heat.show_fast!
|
9
|
-
end
|
10
|
-
|
11
|
-
# TODO: options.
|
12
|
-
# 1. Fail Fast
|
13
|
-
# 2. Don't worry about skips.
|
14
|
-
# 3. Skip coverage.
|
15
|
-
end
|
16
|
-
|
5
|
+
module Minitest # rubocop:disable Style/Documentation
|
17
6
|
def self.plugin_heat_init(options)
|
18
|
-
io = options
|
7
|
+
io = options.fetch(:io, $stdout)
|
19
8
|
|
20
|
-
|
21
|
-
|
9
|
+
self.reporter.reporters.reject! do |reporter|
|
10
|
+
# Minitest Heat acts as a unified Progress *and* Summary reporter. Using other reporters of
|
11
|
+
# those types in conjunction with it creates some overly-verbose output
|
12
|
+
reporter.is_a?(ProgressReporter) || reporter.is_a?(SummaryReporter)
|
13
|
+
end
|
22
14
|
|
23
|
-
#
|
24
|
-
reporter << HeatReporter.new(io, options)
|
15
|
+
# Hook up Reviewer
|
16
|
+
self.reporter.reporters << HeatReporter.new(io, options)
|
25
17
|
end
|
26
18
|
end
|
@@ -35,6 +35,8 @@ module Minitest
|
|
35
35
|
:results
|
36
36
|
|
37
37
|
def initialize(io = $stdout, options = {})
|
38
|
+
super()
|
39
|
+
|
38
40
|
@options = options
|
39
41
|
|
40
42
|
@timer = Heat::Timer.new
|
@@ -62,31 +64,33 @@ module Minitest
|
|
62
64
|
def record(result)
|
63
65
|
# Convert a Minitest Result into an "issue" to more consistently expose the data needed to
|
64
66
|
# adjust the failure output to the type of failure
|
65
|
-
issue = Heat::Issue.
|
67
|
+
issue = Heat::Issue.from_result(result)
|
68
|
+
|
69
|
+
# Note the number of assertions for the performance summary
|
70
|
+
timer.increment_counts(issue.assertions)
|
66
71
|
|
67
|
-
|
72
|
+
# Record the issue to show details later
|
68
73
|
results.record(issue)
|
69
74
|
|
75
|
+
# Show the marker
|
70
76
|
output.marker(issue.type)
|
77
|
+
rescue => e
|
78
|
+
output.newline
|
79
|
+
puts "Sorry, but Minitest Heat encountered an exception recording an issue. Disabling Minitest Heat will get you back on track."
|
80
|
+
puts "Please use the following exception details to submit an issue at https://github.com/garrettdimon/minitest-heat/issues"
|
81
|
+
puts "#{e.message}:"
|
82
|
+
e.backtrace.each do |line|
|
83
|
+
puts " #{line}"
|
84
|
+
end
|
85
|
+
output.newline
|
71
86
|
end
|
72
87
|
|
73
88
|
# Outputs the summary of the run.
|
74
89
|
def report
|
75
90
|
timer.stop!
|
76
91
|
|
77
|
-
#
|
78
|
-
output.
|
79
|
-
output.newline
|
80
|
-
|
81
|
-
# Issues start with the least critical and go up to the most critical so that the most
|
82
|
-
# pressing issues are displayed at the bottom of the report in order to reduce scrolling.
|
83
|
-
# This way, as you fix issues, the list gets shorter, and eventually the least critical
|
84
|
-
# issues will be displayed without scrolling once more problematic issues are resolved.
|
85
|
-
%i[slows painfuls skips failures brokens errors].each do |issue_category|
|
86
|
-
next unless show?(issue_category)
|
87
|
-
|
88
|
-
results.send(issue_category).each { |issue| output.issue_details(issue) }
|
89
|
-
end
|
92
|
+
# The list of individual issues and their associated details
|
93
|
+
output.issues_list(results)
|
90
94
|
|
91
95
|
# Display a short summary of the total issue counts fore ach category as well as performance
|
92
96
|
# details for the test suite as a whole
|
@@ -95,32 +99,11 @@ module Minitest
|
|
95
99
|
# If there were issues, shows a short heat map summary of which files and lines were the most
|
96
100
|
# common sources of issues
|
97
101
|
output.heat_map(results)
|
98
|
-
|
99
|
-
# A blank line to create some breathing room
|
100
|
-
output.newline
|
101
102
|
end
|
102
103
|
|
103
104
|
# Did this run pass?
|
104
105
|
def passed?
|
105
106
|
results.errors.empty? && results.failures.empty?
|
106
107
|
end
|
107
|
-
|
108
|
-
private
|
109
|
-
|
110
|
-
def no_problems?
|
111
|
-
!results.problems?
|
112
|
-
end
|
113
|
-
|
114
|
-
def no_problems_or_skips?
|
115
|
-
!results.problems? && !results.skips.any?
|
116
|
-
end
|
117
|
-
|
118
|
-
def show?(issue_category)
|
119
|
-
case issue_category
|
120
|
-
when :skips then no_problems?
|
121
|
-
when :painfuls, :slows then no_problems_or_skips?
|
122
|
-
else true
|
123
|
-
end
|
124
|
-
end
|
125
108
|
end
|
126
109
|
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: 0.0.10
|
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-10-
|
11
|
+
date: 2021-10-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
@@ -143,9 +143,9 @@ files:
|
|
143
143
|
- bin/setup
|
144
144
|
- lib/minitest/heat.rb
|
145
145
|
- lib/minitest/heat/backtrace.rb
|
146
|
+
- lib/minitest/heat/backtrace/line.rb
|
146
147
|
- lib/minitest/heat/hit.rb
|
147
148
|
- lib/minitest/heat/issue.rb
|
148
|
-
- lib/minitest/heat/line.rb
|
149
149
|
- lib/minitest/heat/location.rb
|
150
150
|
- lib/minitest/heat/map.rb
|
151
151
|
- lib/minitest/heat/output.rb
|
data/lib/minitest/heat/line.rb
DELETED
@@ -1,74 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'forwardable'
|
4
|
-
|
5
|
-
module Minitest
|
6
|
-
module Heat
|
7
|
-
# Represents a line of code from the project and provides convenient access to information about
|
8
|
-
# the line for displaying in test results
|
9
|
-
class Line
|
10
|
-
attr_accessor :pathname, :number, :container
|
11
|
-
alias line_number number
|
12
|
-
|
13
|
-
def initialize(pathname:, number:, container: nil)
|
14
|
-
@pathname = Pathname(pathname)
|
15
|
-
@number = number.to_i
|
16
|
-
@container = container.to_s
|
17
|
-
end
|
18
|
-
|
19
|
-
# Convenient interface to read a line from a backtrace convert it to usable components
|
20
|
-
def self.parse_backtrace(raw_text)
|
21
|
-
raw_pathname, raw_line_number, raw_container = raw_text.split(':')
|
22
|
-
raw_container = raw_container.delete_prefix('in `').delete_suffix("'")
|
23
|
-
|
24
|
-
new(pathname: raw_pathname, number: raw_line_number, container: raw_container)
|
25
|
-
end
|
26
|
-
|
27
|
-
def to_s
|
28
|
-
"#{location} in `#{container}`"
|
29
|
-
end
|
30
|
-
|
31
|
-
def path
|
32
|
-
pathname.exist? ? pathname.dirname : UNRECOGNIZED
|
33
|
-
end
|
34
|
-
|
35
|
-
def file
|
36
|
-
pathname.exist? ? pathname.basename : UNRECOGNIZED
|
37
|
-
end
|
38
|
-
|
39
|
-
def mtime
|
40
|
-
pathname.exist? ? pathname.mtime : UNKNOWN_MODIFICATION_TIME
|
41
|
-
end
|
42
|
-
|
43
|
-
def age_in_seconds
|
44
|
-
pathname.exist? ? seconds_ago : UNKNOWN_MODIFICATION_SECONDS
|
45
|
-
end
|
46
|
-
|
47
|
-
def location
|
48
|
-
"#{pathname}:#{number}"
|
49
|
-
end
|
50
|
-
|
51
|
-
def short_location
|
52
|
-
"#{file}:#{number}"
|
53
|
-
end
|
54
|
-
|
55
|
-
def source_code(max_line_count: 1)
|
56
|
-
Minitest::Heat::Source.new(
|
57
|
-
pathname.to_s,
|
58
|
-
line_number: line_number,
|
59
|
-
max_line_count: max_line_count
|
60
|
-
)
|
61
|
-
end
|
62
|
-
|
63
|
-
private
|
64
|
-
|
65
|
-
UNRECOGNIZED = '(Unrecognized File)'
|
66
|
-
UNKNOWN_MODIFICATION_TIME = Time.at(0)
|
67
|
-
UNKNOWN_MODIFICATION_SECONDS = -1
|
68
|
-
|
69
|
-
def seconds_ago
|
70
|
-
(Time.now - mtime).to_i
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|