single_cov 1.11.0 → 2.0.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3ffed2c03e29890449010148c9492563266983dd70d0f32e7a600692fa6b6a57
4
- data.tar.gz: a9395fb02ed4dd4f5490cf4faf8a7c8ef3bd8b084081958c3a86fabb3cbbedcf
3
+ metadata.gz: e47ea219fd0ed2b3d8911ca9679c4de43988ba900072e7a3efe349275d230f8b
4
+ data.tar.gz: 24410aaf39a37f4301723bc53b76cbccfeb596ceed364a4ebe4dfbdde54a3556
5
5
  SHA512:
6
- metadata.gz: dddfdd5778b9e3c34b92db87d4288970a6a0bd27154d0c40572bf5fa581f92806214827974b55c2612b19f1298bd1d5827072006fb1d131bf5feb36ccca33513
7
- data.tar.gz: 6b82b17a84a018334c140027bab24ef3ac9c08cb0d52973f87d580006d19b0c7cfd3a80b8331b7d487e38af34c8e51f817066170ddee360378587b0b8af03981
6
+ metadata.gz: 0dd92b86bfa607cfb908cfaa7fc2a5b8e74da99a92d6a116cc88dbf2b241cc27664c027814989cb6e7d180bed5d7dff65e181c76cb71181340e0d947d7a0d183
7
+ data.tar.gz: c42f4b53dfc9e16cb72b57e8180cf81c9cad57dbf1be0f549ceb480e16dd31d7030130dfca58e731dc3398ff61a82d05eeafb9b5fa2a7b905dd43ca6ab60bfa4
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module SingleCov
3
- VERSION = "1.11.0"
3
+ VERSION = "2.0.0"
4
4
  end
data/lib/single_cov.rb CHANGED
@@ -32,7 +32,7 @@ module SingleCov
32
32
 
33
33
  def all_covered?(result)
34
34
  errors = COVERAGES.flat_map do |file, expected_uncovered|
35
- next no_coverage_error(file) unless coverage = result["#{root}/#{file}"]
35
+ next no_coverage_error(file) unless (coverage = result["#{root}/#{file}"])
36
36
 
37
37
  uncovered = uncovered(coverage)
38
38
  next if uncovered.size == expected_uncovered
@@ -119,8 +119,7 @@ module SingleCov
119
119
 
120
120
  case framework
121
121
  when :minitest
122
- minitest_should_not_be_running!
123
- return if minitest_running_subset_of_tests?
122
+ return if minitest_running_subset_of_tests?(ARGV)
124
123
  when :rspec
125
124
  return if rspec_running_subset_of_tests?
126
125
  else
@@ -129,15 +128,35 @@ module SingleCov
129
128
 
130
129
  start_coverage_recording
131
130
 
132
- override_at_exit do |status, _exception|
133
- if enabled? && main_process? && status == 0
134
- results = coverage_results
135
- generate_report results
136
- exit 1 unless SingleCov.all_covered?(results)
131
+ # minitest overrides at_exit, so we need to get into it to execute after it finishes
132
+ # so when using the `minitest` executable or loading minitest before SingleCov the first branch is used
133
+ if defined?(Minitest)
134
+ (class << Minitest; self; end).prepend(Module.new do
135
+ def run(args = [])
136
+ original_args = args.dup # minitest modified them
137
+ result = super
138
+ if result && !SingleCov.send(:minitest_running_subset_of_tests?, original_args)
139
+ return SingleCov.report_at_exit
140
+ end
141
+ result
142
+ end
143
+ end)
144
+ else
145
+ override_at_exit do |status, _exception|
146
+ if main_process? && status == 0 && !report_at_exit
147
+ exit 1
148
+ end
137
149
  end
138
150
  end
139
151
  end
140
152
 
153
+ def report_at_exit
154
+ return unless enabled?
155
+ results = coverage_results
156
+ generate_report results
157
+ SingleCov.all_covered?(results)
158
+ end
159
+
141
160
  # use this in forks when using rspec to silence duplicated output
142
161
  def disable
143
162
  @disabled = true
@@ -159,7 +178,7 @@ module SingleCov
159
178
  end
160
179
 
161
180
  def enabled?
162
- (!defined?(@disabled) || !@disabled)
181
+ !defined?(@disabled) || !@disabled
163
182
  end
164
183
 
165
184
  # assuming that the main process will load all the files, we store it's pid
@@ -168,7 +187,7 @@ module SingleCov
168
187
  end
169
188
 
170
189
  def main_process?
171
- (!defined?(@main_process_pid) || @main_process_pid == Process.pid)
190
+ !defined?(@main_process_pid) || @main_process_pid == Process.pid
172
191
  end
173
192
 
174
193
  # {[branch_id] => {[branch_part] => coverage}} --> uncovered location
@@ -230,56 +249,26 @@ module SingleCov
230
249
  COVERAGES.size == 1
231
250
  end
232
251
 
233
- # we cannot insert our hooks when minitest is already running
234
- def minitest_should_not_be_running!
235
- return unless defined?(Minitest)
236
- return unless Minitest.class_variable_defined?(:@@installed_at_exit)
237
- return unless Minitest.class_variable_get(:@@installed_at_exit)
238
-
239
- # untested
240
- # https://github.com/rails/rails/pull/26515 rails loads autorun before test
241
- # but it works out for some reason
242
- return if Minitest.extensions.include?('rails')
243
-
244
- # untested
245
- # forking test runner does some hacky acrobatics to fake minitest status
246
- # and the resets it ... works out ok in the end ...
247
- return if faked_by_forking_test_runner?
248
-
249
- # ... but only if it's used with `--merge-coverage` otherwise the coverage reporting is useless
250
- if $0.end_with?("/forking-test-runner")
251
- raise "forking-test-runner only work with single_cov when using --merge-coverage"
252
- end
253
-
254
- raise "Load minitest after setting up SingleCov"
255
- end
256
-
257
- # ForkingTestRunner fakes an initialized minitest to avoid multiple hooks being installed
258
- # so hooks still get added in order https://github.com/grosser/forking_test_runner/pull/4
259
- def faked_by_forking_test_runner?
260
- defined?(Coverage) && Coverage.respond_to?(:capture_coverage!)
261
- end
262
-
263
252
  # do not record or verify when only running selected tests since it would be missing data
264
- def minitest_running_subset_of_tests?
253
+ def minitest_running_subset_of_tests?(argv)
265
254
  # via direct option (ruby test.rb -n /foo/)
266
- (ARGV.map { |a| a.split('=', 2).first } & ['-n', '--name', '-l', '--line']).any? ||
255
+ # or `minitest foo.rb:123` which is translated to -n
256
+ argv.map { |a| a.split('=', 2).first }.intersect?(['-n', '--name', '-l', '--line']) ||
267
257
 
268
- # via testrbl or mtest or rails with direct line number (mtest test.rb:123)
269
- (ARGV.first =~ /:\d+\Z/) ||
258
+ # via testrbl, mtest, or rails with direct line number (mtest test.rb:123)
259
+ (argv.first =~ /:\d+\Z/) ||
270
260
 
271
261
  # via rails test which preloads mintest, removes ARGV and fills options
272
262
  (
273
- defined?(Minitest) &&
274
263
  defined?(Minitest.reporter) &&
275
264
  Minitest.reporter &&
276
265
  (reporter = Minitest.reporter.reporters.first) &&
277
- reporter.options[:filter]
266
+ (reporter.options[:filter] || reporter.options[:include]) # MT 5 vs MT 6
278
267
  )
279
268
  end
280
269
 
281
270
  def rspec_running_subset_of_tests?
282
- (ARGV & ['-t', '--tag', '-e', '--example']).any? || ARGV.any? { |a| a =~ /:\d+$|\[[\d:]+\]$/ }
271
+ ARGV.intersect?(['-t', '--tag', '-e', '--example']) || ARGV.any? { |a| a =~ /:\d+$|\[[\d:]+\]$/ }
283
272
  end
284
273
 
285
274
  # code stolen from SimpleCov
@@ -400,7 +389,7 @@ module SingleCov
400
389
  end
401
390
 
402
391
  # remove test extension
403
- if !file_part.sub!(/_(?:test|spec)\.rb\b.*/, '.rb') && !file_part.sub!(/\/test_/, "/")
392
+ if !file_part.sub!(/_(?:test|spec)\.rb\b.*/, '.rb') && !file_part.sub!('/test_', "/")
404
393
  raise "Unable to remove test extension from #{file} ... /test_, _test.rb and _spec.rb are supported"
405
394
  end
406
395
  end
@@ -418,14 +407,14 @@ module SingleCov
418
407
  end
419
408
 
420
409
  def generate_report(results)
421
- return unless report = coverage_report
410
+ return unless (report = coverage_report)
422
411
 
423
412
  # not a hard dependency for the whole library
424
413
  require "json"
425
414
  require "fileutils"
426
415
 
427
416
  used = COVERAGES.map { |f, _| "#{root}/#{f}" }
428
- covered = results.select { |k, _| used.include?(k) }
417
+ covered = results.slice(*used)
429
418
 
430
419
  if coverage_report_lines
431
420
  covered = covered.transform_values { |v| v.is_a?(Hash) ? v.fetch(:lines) : v }
metadata CHANGED
@@ -1,16 +1,98 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: single_cov
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.11.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Grosser
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2023-06-03 00:00:00.000000000 Z
12
- dependencies: []
13
- description:
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: bump
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '0'
19
+ type: :development
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: minitest
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: rake
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ type: :development
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: rspec
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ - !ruby/object:Gem::Dependency
69
+ name: rubocop
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ - !ruby/object:Gem::Dependency
83
+ name: simplecov
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
14
96
  email: michael@grosser.it
15
97
  executables: []
16
98
  extensions: []
@@ -23,7 +105,6 @@ homepage: https://github.com/grosser/single_cov
23
105
  licenses:
24
106
  - MIT
25
107
  metadata: {}
26
- post_install_message:
27
108
  rdoc_options: []
28
109
  require_paths:
29
110
  - lib
@@ -31,15 +112,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
31
112
  requirements:
32
113
  - - ">="
33
114
  - !ruby/object:Gem::Version
34
- version: 2.7.0
115
+ version: 3.2.0
35
116
  required_rubygems_version: !ruby/object:Gem::Requirement
36
117
  requirements:
37
118
  - - ">="
38
119
  - !ruby/object:Gem::Version
39
120
  version: '0'
40
121
  requirements: []
41
- rubygems_version: 3.3.3
42
- signing_key:
122
+ rubygems_version: 3.6.9
43
123
  specification_version: 4
44
124
  summary: Actionable code coverage.
45
125
  test_files: []