minitest-heat 0.0.9 → 0.0.10

Sign up to get free protection for your applications and to get access to all the features.
@@ -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