minitest-heat 0.0.2 → 0.0.6

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,8 +2,8 @@
2
2
 
3
3
  module Minitest
4
4
  module Heat
5
+ # A collection of test failures
5
6
  class Results
6
-
7
7
  attr_reader :test_count,
8
8
  :assertion_count,
9
9
  :success_count,
@@ -20,6 +20,7 @@ module Minitest
20
20
  broken: [],
21
21
  failure: [],
22
22
  skipped: [],
23
+ painful: [],
23
24
  slow: []
24
25
  }
25
26
  @start_time = nil
@@ -49,8 +50,8 @@ module Minitest
49
50
  (assertion_count / total_time).round(2)
50
51
  end
51
52
 
52
- def issues?
53
- errors? || failures? || skips?
53
+ def problems?
54
+ errors? || brokens? || failures? || skips?
54
55
  end
55
56
 
56
57
  def errors
@@ -69,12 +70,20 @@ module Minitest
69
70
  issues.fetch(:skipped) { [] }
70
71
  end
71
72
 
73
+ def painfuls
74
+ issues
75
+ .fetch(:painful) { [] }
76
+ .sort_by(&:time)
77
+ .reverse
78
+ .take(5)
79
+ end
80
+
72
81
  def slows
73
82
  issues
74
83
  .fetch(:slow) { [] }
75
- .sort { |issue| issue.time }
84
+ .sort_by(&:time)
76
85
  .reverse
77
- .take(3)
86
+ .take(5)
78
87
  end
79
88
 
80
89
  def errors?
@@ -93,19 +102,21 @@ module Minitest
93
102
  skips.any?
94
103
  end
95
104
 
96
- def count(result)
97
- @test_count += 1
98
- @assertion_count += result.assertions
99
- @success_count += 1 if result.passed?
105
+ def painfuls?
106
+ painfuls.any?
100
107
  end
101
108
 
102
- def record_issue(result)
103
- issue = Heat::Issue.new(result)
109
+ def slows?
110
+ slows.any?
111
+ end
112
+
113
+ def record(issue)
114
+ @test_count += 1
115
+ @assertion_count += issue.result.assertions
116
+ @success_count += 1 if issue.result.passed?
104
117
 
105
118
  @issues[issue.type] ||= []
106
119
  @issues[issue.type] << issue
107
-
108
- issue
109
120
  end
110
121
  end
111
122
  end
@@ -51,10 +51,15 @@ module Minitest
51
51
  #
52
52
  # @return [type] [description]
53
53
  def file_lines
54
- @raw_lines ||= File.readlines("#{Dir.pwd}#{filename}", chomp: true)
54
+ @raw_lines ||= File.readlines(filename, chomp: true)
55
55
  @raw_lines.pop while @raw_lines.last.strip.empty?
56
56
 
57
57
  @raw_lines
58
+ rescue Errno::ENOENT
59
+ # Occasionally, for a variety of reasons, a file can't be read. In those cases, it's best to
60
+ # return no source code lines rather than have the test suite raise an error unrelated to
61
+ # the code being tested becaues that gets confusing.
62
+ []
58
63
  end
59
64
 
60
65
  private
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Minitest
2
4
  module Heat
3
- VERSION = "0.0.2"
5
+ VERSION = '0.0.6'
4
6
  end
5
7
  end
data/lib/minitest/heat.rb CHANGED
@@ -1,7 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'heat/backtrace'
4
+ require_relative 'heat/hit'
4
5
  require_relative 'heat/issue'
6
+ require_relative 'heat/line'
5
7
  require_relative 'heat/location'
6
8
  require_relative 'heat/map'
7
9
  require_relative 'heat/output'
@@ -3,12 +3,12 @@
3
3
  require_relative 'heat_reporter'
4
4
 
5
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
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
8
  # Heat.show_fast!
9
9
  end
10
10
 
11
- # TODO options.
11
+ # TODO: options.
12
12
  # 1. Fail Fast
13
13
  # 2. Don't worry about skips.
14
14
  # 3. Skip coverage.
@@ -18,9 +18,9 @@ module Minitest
18
18
  io = options[:io]
19
19
 
20
20
  # Clean out the existing reporters.
21
- self.reporter.reporters = []
21
+ reporter.reporters = []
22
22
 
23
23
  # Use Reviewer as the sole reporter.
24
- self.reporter << HeatReporter.new(io, options)
24
+ reporter << HeatReporter.new(io, options)
25
25
  end
26
26
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "heat"
3
+ require_relative 'heat'
4
4
 
5
5
  module Minitest
6
6
  # Custom minitest reporter to proactively identify likely culprits in test failures by focusing on
@@ -29,50 +29,49 @@ module Minitest
29
29
  # Pulls from minitest-color as well:
30
30
  # https://github.com/teoljungberg/minitest-color/blob/master/lib/minitest/color_plugin.rb
31
31
  class HeatReporter < AbstractReporter
32
-
33
32
  attr_reader :output,
34
33
  :options,
35
34
  :results,
36
35
  :map
37
36
 
38
37
  def initialize(io = $stdout, options = {})
39
- @output = Heat::Output.new(io)
40
38
  @options = options
41
39
 
42
- @results = Heat::Results.new
43
- @map = Heat::Map.new
40
+ @results = Heat::Results.new
41
+ @map = Heat::Map.new
42
+ @output = Heat::Output.new(io)
44
43
  end
45
44
 
46
45
  # Starts reporting on the run.
47
46
  def start
48
- output.puts
49
- output.puts
50
- @results.start_timer!
47
+ results.start_timer!
48
+
49
+ # A couple of blank lines to create some breathing room
50
+ output.newline
51
+ output.newline
51
52
  end
52
53
 
53
54
  # About to start running a test. This allows a reporter to show that it is starting or that we
54
55
  # are in the middle of a test run.
55
- def prerecord(klass, name)
56
- end
56
+ def prerecord(klass, name); end
57
57
 
58
58
  # Records the data from a result.
59
59
  # Minitest::Result source:
60
60
  # https://github.com/seattlerb/minitest/blob/f4f57afaeb3a11bd0b86ab0757704cb78db96cf4/lib/minitest.rb#L504
61
61
  def record(result)
62
- @results.count(result)
63
- if !result.passed? || result.time > ::Minitest::Heat::Issue::SLOW_THRESHOLD
64
- issue = @results.record_issue(result)
65
- @map.add(*issue.to_hit)
66
- output.marker(issue.marker)
67
- else
68
- output.marker(result.result_code)
69
- end
62
+ issue = Heat::Issue.new(result)
63
+
64
+ results.record(issue)
65
+ map.add(*issue.to_hit) if issue.hit?
66
+
67
+ output.marker(issue.type)
70
68
  end
71
69
 
72
70
  # Outputs the summary of the run.
73
71
  def report
74
- @results.stop_timer!
72
+ results.stop_timer!
75
73
 
74
+ # A couple of blank lines to create some breathing room
76
75
  output.newline
77
76
  output.newline
78
77
 
@@ -80,15 +79,20 @@ module Minitest
80
79
  # pressing issues are displayed at the bottom of the report in order to reduce scrolling.
81
80
  # This way, as you fix issues, the list gets shorter, and eventually the least critical
82
81
  # issues will be displayed without scrolling once more problematic issues are resolved.
83
- results.slows.each { |issue| output.issue_details(issue) }
84
- results.skips.each { |issue| output.issue_details(issue) }
85
- results.failures.each { |issue| output.issue_details(issue) }
86
- results.brokens.each { |issue| output.issue_details(issue) }
87
- results.errors.each { |issue| output.issue_details(issue) }
82
+ %i[slows painfuls skips failures brokens errors].each do |issue_category|
83
+ results.send(issue_category).each { |issue| output.issue_details(issue) }
84
+ end
88
85
 
86
+ # Display a short summary of the total issue counts fore ach category as well as performance
87
+ # details for the test suite as a whole
89
88
  output.compact_summary(results)
90
89
 
90
+ # If there were issues, shows a short heat map summary of which files and lines were the most
91
+ # common sources of issues
91
92
  output.heat_map(map)
93
+
94
+ # A blank line to create some breathing room
95
+ output.newline
92
96
  end
93
97
 
94
98
  # Did this run pass?
@@ -21,8 +21,6 @@ Gem::Specification.new do |spec|
21
21
  spec.metadata['source_code_uri'] = 'https://github.com/garrettdimon/minitest-heat'
22
22
  spec.metadata['wiki_uri'] = 'https://github.com/garrettdimon/minitest-heat/wiki'
23
23
 
24
-
25
-
26
24
  # Specify which files should be added to the gem when it is released.
27
25
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
28
26
  spec.files = Dir.chdir(File.expand_path(__dir__)) do
@@ -34,6 +32,11 @@ Gem::Specification.new do |spec|
34
32
 
35
33
  spec.add_runtime_dependency 'minitest'
36
34
 
35
+ spec.add_development_dependency 'awesome_print'
36
+ spec.add_development_dependency 'dead_end'
37
37
  spec.add_development_dependency 'pry'
38
+ spec.add_development_dependency 'rubocop'
39
+ spec.add_development_dependency 'rubocop-minitest'
40
+ spec.add_development_dependency 'rubocop-rake'
38
41
  spec.add_development_dependency 'simplecov'
39
42
  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.2
4
+ version: 0.0.6
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-08-29 00:00:00.000000000 Z
11
+ date: 2021-10-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest
@@ -24,6 +24,34 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: awesome_print
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: dead_end
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
27
55
  - !ruby/object:Gem::Dependency
28
56
  name: pry
29
57
  requirement: !ruby/object:Gem::Requirement
@@ -38,6 +66,48 @@ dependencies:
38
66
  - - ">="
39
67
  - !ruby/object:Gem::Version
40
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop-minitest
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rubocop-rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
41
111
  - !ruby/object:Gem::Dependency
42
112
  name: simplecov
43
113
  requirement: !ruby/object:Gem::Requirement
@@ -61,6 +131,7 @@ extensions: []
61
131
  extra_rdoc_files: []
62
132
  files:
63
133
  - ".gitignore"
134
+ - ".rubocop.yml"
64
135
  - ".travis.yml"
65
136
  - CODE_OF_CONDUCT.md
66
137
  - Gemfile
@@ -72,10 +143,19 @@ files:
72
143
  - bin/setup
73
144
  - lib/minitest/heat.rb
74
145
  - lib/minitest/heat/backtrace.rb
146
+ - lib/minitest/heat/hit.rb
75
147
  - lib/minitest/heat/issue.rb
148
+ - lib/minitest/heat/line.rb
76
149
  - lib/minitest/heat/location.rb
77
150
  - lib/minitest/heat/map.rb
78
151
  - lib/minitest/heat/output.rb
152
+ - lib/minitest/heat/output/backtrace.rb
153
+ - lib/minitest/heat/output/issue.rb
154
+ - lib/minitest/heat/output/map.rb
155
+ - lib/minitest/heat/output/marker.rb
156
+ - lib/minitest/heat/output/results.rb
157
+ - lib/minitest/heat/output/source_code.rb
158
+ - lib/minitest/heat/output/token.rb
79
159
  - lib/minitest/heat/results.rb
80
160
  - lib/minitest/heat/source.rb
81
161
  - lib/minitest/heat/version.rb
@@ -107,7 +187,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
107
187
  - !ruby/object:Gem::Version
108
188
  version: '0'
109
189
  requirements: []
110
- rubygems_version: 3.1.4
190
+ rubygems_version: 3.1.6
111
191
  signing_key:
112
192
  specification_version: 4
113
193
  summary: Presents test results in a visual manner to guide you to where to look first.