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.
@@ -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
+ 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
- # 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
@@ -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.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)
66
71
 
67
- timer.increment_counts(issue.result.assertions)
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
- # A couple of blank lines to create some breathing room
78
- output.newline
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.9
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-26 00:00:00.000000000 Z
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
@@ -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