minitest-heat 0.0.7 → 0.0.11

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.
@@ -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[:io]
7
+ io = options.fetch(:io, $stdout)
19
8
 
20
- # Clean out the existing reporters.
21
- reporter.reporters = []
9
+ 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
- # Use Reviewer as the sole reporter.
24
- reporter << HeatReporter.new(io, options)
15
+ # Hook up Reviewer
16
+ self.reporter.reporters << HeatReporter.new(io, options)
25
17
  end
26
18
  end
@@ -32,15 +32,15 @@ module Minitest
32
32
  attr_reader :output,
33
33
  :options,
34
34
  :timer,
35
- :results,
36
- :map
35
+ :results
37
36
 
38
37
  def initialize(io = $stdout, options = {})
38
+ super()
39
+
39
40
  @options = options
40
41
 
41
42
  @timer = Heat::Timer.new
42
43
  @results = Heat::Results.new
43
- @map = Heat::Map.new
44
44
  @output = Heat::Output.new(io)
45
45
  end
46
46
 
@@ -64,32 +64,37 @@ module Minitest
64
64
  def record(result)
65
65
  # Convert a Minitest Result into an "issue" to more consistently expose the data needed to
66
66
  # adjust the failure output to the type of failure
67
- issue = Heat::Issue.new(result)
67
+ issue = Heat::Issue.from_result(result)
68
+
69
+ # Note the number of assertions for the performance summary
70
+ timer.increment_counts(issue.assertions)
68
71
 
69
- timer.increment_counts(issue.result.assertions)
72
+ # Record the issue to show details later
70
73
  results.record(issue)
71
- map.add(*issue.to_hit) if issue.hit?
72
74
 
75
+ # Show the marker
73
76
  output.marker(issue.type)
77
+ rescue StandardError => e
78
+ display_exception_guidance(e)
74
79
  end
75
80
 
76
- # Outputs the summary of the run.
77
- def report
78
- timer.stop!
79
-
80
- # A couple of blank lines to create some breathing room
81
+ def display_exception_guidance(exception)
81
82
  output.newline
83
+ puts 'Sorry, but Minitest Heat encountered an exception recording an issue. Disabling Minitest Heat will get you back on track.'
84
+ puts 'Please use the following exception details to submit an issue at https://github.com/garrettdimon/minitest-heat/issues'
85
+ puts "#{exception.message}:"
86
+ exception.backtrace.each do |line|
87
+ puts " #{line}"
88
+ end
82
89
  output.newline
90
+ end
83
91
 
84
- # Issues start with the least critical and go up to the most critical so that the most
85
- # pressing issues are displayed at the bottom of the report in order to reduce scrolling.
86
- # This way, as you fix issues, the list gets shorter, and eventually the least critical
87
- # issues will be displayed without scrolling once more problematic issues are resolved.
88
- %i[slows painfuls skips failures brokens errors].each do |issue_category|
89
- next unless show?(issue_category)
92
+ # Outputs the summary of the run.
93
+ def report
94
+ timer.stop!
90
95
 
91
- results.send(issue_category).each { |issue| output.issue_details(issue) }
92
- end
96
+ # The list of individual issues and their associated details
97
+ output.issues_list(results)
93
98
 
94
99
  # Display a short summary of the total issue counts fore ach category as well as performance
95
100
  # details for the test suite as a whole
@@ -97,9 +102,9 @@ module Minitest
97
102
 
98
103
  # If there were issues, shows a short heat map summary of which files and lines were the most
99
104
  # common sources of issues
100
- output.heat_map(map)
105
+ output.heat_map(results)
101
106
 
102
- # A blank line to create some breathing room
107
+ output.newline
103
108
  output.newline
104
109
  end
105
110
 
@@ -107,23 +112,5 @@ module Minitest
107
112
  def passed?
108
113
  results.errors.empty? && results.failures.empty?
109
114
  end
110
-
111
- private
112
-
113
- def no_problems?
114
- !results.problems?
115
- end
116
-
117
- def no_problems_or_skips?
118
- !results.problems? && !results.skips.any?
119
- end
120
-
121
- def show?(issue_category)
122
- case issue_category
123
- when :skips then no_problems?
124
- when :painfuls, :slows then no_problems_or_skips?
125
- else true
126
- end
127
- end
128
115
  end
129
116
  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.7
4
+ version: 0.0.11
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-14 00:00:00.000000000 Z
11
+ date: 2021-11-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest
@@ -143,10 +143,11 @@ files:
143
143
  - bin/setup
144
144
  - lib/minitest/heat.rb
145
145
  - lib/minitest/heat/backtrace.rb
146
+ - lib/minitest/heat/backtrace/line_parser.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
+ - lib/minitest/heat/locations.rb
150
151
  - lib/minitest/heat/map.rb
151
152
  - lib/minitest/heat/output.rb
152
153
  - lib/minitest/heat/output/backtrace.rb
@@ -188,7 +189,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
188
189
  - !ruby/object:Gem::Version
189
190
  version: '0'
190
191
  requirements: []
191
- rubygems_version: 3.1.6
192
+ rubygems_version: 3.2.22
192
193
  signing_key:
193
194
  specification_version: 4
194
195
  summary: Presents test results in a visual manner to guide you to where to look first.
@@ -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