simplecov 0.18.2 → 0.19.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 +4 -4
- data/CHANGELOG.md +216 -170
- data/CONTRIBUTING.md +3 -3
- data/ISSUE_TEMPLATE.md +1 -1
- data/README.md +67 -20
- data/doc/alternate-formatters.md +7 -2
- data/doc/commercial-services.md +5 -0
- data/lib/minitest/simplecov_plugin.rb +15 -0
- data/lib/simplecov/configuration.rb +52 -3
- data/lib/simplecov/defaults.rb +8 -12
- data/lib/simplecov/exit_codes/exit_code_handling.rb +29 -0
- data/lib/simplecov/exit_codes/maximum_coverage_drop_check.rb +50 -0
- data/lib/simplecov/exit_codes/minimum_coverage_by_file_check.rb +38 -0
- data/lib/simplecov/exit_codes/minimum_overall_coverage_check.rb +53 -0
- data/lib/simplecov/exit_codes.rb +5 -0
- data/lib/simplecov/filter.rb +7 -5
- data/lib/simplecov/formatter/multi_formatter.rb +5 -7
- data/lib/simplecov/formatter.rb +2 -2
- data/lib/simplecov/lines_classifier.rb +1 -1
- data/lib/simplecov/no_defaults.rb +1 -1
- data/lib/simplecov/process.rb +19 -0
- data/lib/simplecov/result.rb +14 -12
- data/lib/simplecov/result_merger.rb +2 -7
- data/lib/simplecov/source_file.rb +46 -1
- data/lib/simplecov/useless_results_remover.rb +5 -3
- data/lib/simplecov/version.rb +1 -1
- data/lib/simplecov.rb +117 -118
- metadata +16 -8
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Process
|
|
4
|
+
class << self
|
|
5
|
+
def fork_with_simplecov(&block)
|
|
6
|
+
if defined?(SimpleCov) && SimpleCov.running
|
|
7
|
+
fork_without_simplecov do
|
|
8
|
+
SimpleCov.at_fork.call(Process.pid)
|
|
9
|
+
block.call if block_given?
|
|
10
|
+
end
|
|
11
|
+
else
|
|
12
|
+
fork_without_simplecov(&block)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
alias fork_without_simplecov fork
|
|
17
|
+
alias fork fork_with_simplecov
|
|
18
|
+
end
|
|
19
|
+
end
|
data/lib/simplecov/result.rb
CHANGED
|
@@ -25,9 +25,11 @@ module SimpleCov
|
|
|
25
25
|
|
|
26
26
|
# Initialize a new SimpleCov::Result from given Coverage.result (a Hash of filenames each containing an array of
|
|
27
27
|
# coverage data)
|
|
28
|
-
def initialize(original_result)
|
|
28
|
+
def initialize(original_result, command_name: nil, created_at: nil)
|
|
29
29
|
result = adapt_result(original_result)
|
|
30
30
|
@original_result = result.freeze
|
|
31
|
+
@command_name = command_name
|
|
32
|
+
@created_at = created_at
|
|
31
33
|
@files = SimpleCov::FileList.new(result.map do |filename, coverage|
|
|
32
34
|
SimpleCov::SourceFile.new(filename, JSON.parse(JSON.dump(coverage))) if File.file?(filename)
|
|
33
35
|
end.compact.sort_by(&:filename))
|
|
@@ -70,15 +72,15 @@ module SimpleCov
|
|
|
70
72
|
}
|
|
71
73
|
end
|
|
72
74
|
|
|
75
|
+
def time_since_creation
|
|
76
|
+
Time.now - created_at
|
|
77
|
+
end
|
|
78
|
+
|
|
73
79
|
# Loads a SimpleCov::Result#to_hash dump
|
|
74
80
|
def self.from_hash(hash)
|
|
75
|
-
command_name, data
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
result.command_name = command_name
|
|
80
|
-
result.created_at = Time.at(data["timestamp"])
|
|
81
|
-
result
|
|
81
|
+
hash.map do |command_name, data|
|
|
82
|
+
new(data.fetch("coverage"), command_name: command_name, created_at: Time.at(data["timestamp"]))
|
|
83
|
+
end
|
|
82
84
|
end
|
|
83
85
|
|
|
84
86
|
private
|
|
@@ -86,7 +88,7 @@ module SimpleCov
|
|
|
86
88
|
# We changed the format of the raw result data in simplecov, as people are likely
|
|
87
89
|
# to have "old" resultsets lying around (but not too old so that they're still
|
|
88
90
|
# considered we can adapt them).
|
|
89
|
-
# See https://github.com/
|
|
91
|
+
# See https://github.com/simplecov-ruby/simplecov/pull/824#issuecomment-576049747
|
|
90
92
|
def adapt_result(result)
|
|
91
93
|
if pre_simplecov_0_18_result?(result)
|
|
92
94
|
adapt_pre_simplecov_0_18_result(result)
|
|
@@ -103,9 +105,9 @@ module SimpleCov
|
|
|
103
105
|
end
|
|
104
106
|
|
|
105
107
|
def adapt_pre_simplecov_0_18_result(result)
|
|
106
|
-
result.
|
|
107
|
-
|
|
108
|
-
end
|
|
108
|
+
result.transform_values do |line_coverage_data|
|
|
109
|
+
{"lines" => line_coverage_data}
|
|
110
|
+
end
|
|
109
111
|
end
|
|
110
112
|
|
|
111
113
|
def coverage
|
|
@@ -53,13 +53,8 @@ module SimpleCov
|
|
|
53
53
|
# All results that are above the SimpleCov.merge_timeout will be
|
|
54
54
|
# dropped. Returns an array of SimpleCov::Result items.
|
|
55
55
|
def results
|
|
56
|
-
results =
|
|
57
|
-
|
|
58
|
-
result = SimpleCov::Result.from_hash(command_name => data)
|
|
59
|
-
# Only add result if the timeout is above the configured threshold
|
|
60
|
-
results << result if (Time.now - result.created_at) < SimpleCov.merge_timeout
|
|
61
|
-
end
|
|
62
|
-
results
|
|
56
|
+
results = Result.from_hash(resultset)
|
|
57
|
+
results.select { |result| result.time_since_creation < SimpleCov.merge_timeout }
|
|
63
58
|
end
|
|
64
59
|
|
|
65
60
|
def merge_and_store(*results)
|
|
@@ -25,7 +25,7 @@ module SimpleCov
|
|
|
25
25
|
def src
|
|
26
26
|
# We intentionally read source code lazily to
|
|
27
27
|
# suppress reading unused source code.
|
|
28
|
-
@src ||=
|
|
28
|
+
@src ||= load_source
|
|
29
29
|
end
|
|
30
30
|
alias source src
|
|
31
31
|
|
|
@@ -175,6 +175,51 @@ module SimpleCov
|
|
|
175
175
|
end
|
|
176
176
|
end
|
|
177
177
|
|
|
178
|
+
def load_source
|
|
179
|
+
lines = []
|
|
180
|
+
# The default encoding is UTF-8
|
|
181
|
+
File.open(filename, "rb:UTF-8") do |file|
|
|
182
|
+
current_line = file.gets
|
|
183
|
+
|
|
184
|
+
if shebang?(current_line)
|
|
185
|
+
lines << current_line
|
|
186
|
+
current_line = file.gets
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
read_lines(file, lines, current_line)
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
SHEBANG_REGEX = /\A#!/.freeze
|
|
194
|
+
def shebang?(line)
|
|
195
|
+
SHEBANG_REGEX.match?(line)
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
def read_lines(file, lines, current_line)
|
|
199
|
+
return lines unless current_line
|
|
200
|
+
|
|
201
|
+
set_encoding_based_on_magic_comment(file, current_line)
|
|
202
|
+
lines.concat([current_line], ensure_remove_undefs(file.readlines))
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
RUBY_FILE_ENCODING_MAGIC_COMMENT_REGEX = /\A#\s*(?:-\*-)?\s*(?:en)?coding:\s*(\S+)\s*(?:-\*-)?\s*\z/.freeze
|
|
206
|
+
def set_encoding_based_on_magic_comment(file, line)
|
|
207
|
+
# Check for encoding magic comment
|
|
208
|
+
# Encoding magic comment must be placed at first line except for shebang
|
|
209
|
+
if (match = RUBY_FILE_ENCODING_MAGIC_COMMENT_REGEX.match(line))
|
|
210
|
+
file.set_encoding(match[1], "UTF-8")
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
def ensure_remove_undefs(file_lines)
|
|
215
|
+
# invalid/undef replace are technically not really necessary but nice to
|
|
216
|
+
# have and work around a JRuby incompatibility. Also moved here from
|
|
217
|
+
# simplecov-html to have encoding shenaningans in one place. See #866
|
|
218
|
+
# also setting these option on `file.set_encoding` doesn't seem to work
|
|
219
|
+
# properly so it has to be done here.
|
|
220
|
+
file_lines.each { |line| line.encode!("UTF-8", invalid: :replace, undef: :replace) }
|
|
221
|
+
end
|
|
222
|
+
|
|
178
223
|
def build_lines
|
|
179
224
|
coverage_exceeding_source_warn if coverage_data["lines"].size > src.size
|
|
180
225
|
lines = src.map.with_index(1) do |src, i|
|
|
@@ -5,12 +5,14 @@ module SimpleCov
|
|
|
5
5
|
# Select the files that related to working scope directory of SimpleCov
|
|
6
6
|
#
|
|
7
7
|
module UselessResultsRemover
|
|
8
|
-
ROOT_REGX = /\A#{Regexp.escape(SimpleCov.root + File::SEPARATOR)}/io.freeze
|
|
9
|
-
|
|
10
8
|
def self.call(coverage_result)
|
|
11
9
|
coverage_result.select do |path, _coverage|
|
|
12
|
-
path =~
|
|
10
|
+
path =~ root_regx
|
|
13
11
|
end
|
|
14
12
|
end
|
|
13
|
+
|
|
14
|
+
def self.root_regx
|
|
15
|
+
@root_regx ||= /\A#{Regexp.escape(SimpleCov.root + File::SEPARATOR)}/i.freeze
|
|
16
|
+
end
|
|
15
17
|
end
|
|
16
18
|
end
|
data/lib/simplecov/version.rb
CHANGED
data/lib/simplecov.rb
CHANGED
|
@@ -7,8 +7,8 @@ if defined?(JRUBY_VERSION) && defined?(JRuby)
|
|
|
7
7
|
|
|
8
8
|
# @see https://github.com/jruby/jruby/issues/1196
|
|
9
9
|
# @see https://github.com/metricfu/metric_fu/pull/226
|
|
10
|
-
# @see https://github.com/
|
|
11
|
-
# @see https://github.com/
|
|
10
|
+
# @see https://github.com/simplecov-ruby/simplecov/issues/420
|
|
11
|
+
# @see https://github.com/simplecov-ruby/simplecov/issues/86
|
|
12
12
|
# @see https://jira.codehaus.org/browse/JRUBY-6106
|
|
13
13
|
|
|
14
14
|
unless org.jruby.RubyInstanceConfig.FULL_TRACE_ENABLED
|
|
@@ -23,9 +23,12 @@ end
|
|
|
23
23
|
#
|
|
24
24
|
module SimpleCov
|
|
25
25
|
class << self
|
|
26
|
-
attr_accessor :running
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
attr_accessor :running, :pid
|
|
27
|
+
|
|
28
|
+
# Basically, should we take care of at_exit behavior or something else?
|
|
29
|
+
# Used by the minitest plugin. See lib/minitest/simplecov_plugin.rb
|
|
30
|
+
attr_accessor :external_at_exit
|
|
31
|
+
alias external_at_exit? external_at_exit
|
|
29
32
|
|
|
30
33
|
#
|
|
31
34
|
# Sets up SimpleCov to run against your project.
|
|
@@ -47,6 +50,9 @@ module SimpleCov
|
|
|
47
50
|
def start(profile = nil, &block)
|
|
48
51
|
require "coverage"
|
|
49
52
|
initial_setup(profile, &block)
|
|
53
|
+
require_relative "./simplecov/process" if SimpleCov.enabled_for_subprocesses?
|
|
54
|
+
make_parallel_tests_available
|
|
55
|
+
|
|
50
56
|
@result = nil
|
|
51
57
|
self.pid = Process.pid
|
|
52
58
|
|
|
@@ -79,13 +85,11 @@ module SimpleCov
|
|
|
79
85
|
|
|
80
86
|
results = result_filenames.flat_map do |filename|
|
|
81
87
|
# Re-create each included instance of SimpleCov::Result from the stored run data.
|
|
82
|
-
(JSON.parse(File.read(filename)) || {})
|
|
83
|
-
SimpleCov::Result.from_hash(command_name => coverage)
|
|
84
|
-
end
|
|
88
|
+
Result.from_hash(JSON.parse(File.read(filename)) || {})
|
|
85
89
|
end
|
|
86
90
|
|
|
87
91
|
# Use the ResultMerger to produce a single, merged result, ready to use.
|
|
88
|
-
@result =
|
|
92
|
+
@result = ResultMerger.merge_and_store(*results)
|
|
89
93
|
|
|
90
94
|
run_exit_tasks!
|
|
91
95
|
end
|
|
@@ -98,7 +102,6 @@ module SimpleCov
|
|
|
98
102
|
return @result if result?
|
|
99
103
|
|
|
100
104
|
# Collect our coverage result
|
|
101
|
-
|
|
102
105
|
process_coverage_result if running
|
|
103
106
|
|
|
104
107
|
# If we're using merging of results, store the current result
|
|
@@ -168,46 +171,71 @@ module SimpleCov
|
|
|
168
171
|
@result = nil
|
|
169
172
|
end
|
|
170
173
|
|
|
174
|
+
def at_exit_behavior
|
|
175
|
+
# If we are in a different process than called start, don't interfere.
|
|
176
|
+
return if SimpleCov.pid != Process.pid
|
|
177
|
+
|
|
178
|
+
# If SimpleCov is no longer running then don't run exit tasks
|
|
179
|
+
SimpleCov.run_exit_tasks! if SimpleCov.running
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
# @api private
|
|
171
183
|
#
|
|
172
|
-
#
|
|
173
|
-
# This will get called inside the at_exit block
|
|
184
|
+
# Called from at_exit block
|
|
174
185
|
#
|
|
175
|
-
def
|
|
176
|
-
|
|
186
|
+
def run_exit_tasks!
|
|
187
|
+
error_exit_status = exit_status_from_exception
|
|
188
|
+
|
|
189
|
+
at_exit.call
|
|
190
|
+
|
|
191
|
+
exit_and_report_previous_error(error_exit_status) if previous_error?(error_exit_status)
|
|
192
|
+
process_results_and_report_error if ready_to_process_results?
|
|
177
193
|
end
|
|
178
194
|
|
|
195
|
+
#
|
|
196
|
+
# @api private
|
|
179
197
|
#
|
|
180
198
|
# Returns the exit status from the exit exception
|
|
181
199
|
#
|
|
182
200
|
def exit_status_from_exception
|
|
183
|
-
|
|
201
|
+
# Capture the current exception if it exists
|
|
202
|
+
@exit_exception = $ERROR_INFO
|
|
203
|
+
return nil unless @exit_exception
|
|
184
204
|
|
|
185
|
-
if exit_exception.is_a?(SystemExit)
|
|
186
|
-
exit_exception.status
|
|
205
|
+
if @exit_exception.is_a?(SystemExit)
|
|
206
|
+
@exit_exception.status
|
|
187
207
|
else
|
|
188
208
|
SimpleCov::ExitCodes::EXCEPTION
|
|
189
209
|
end
|
|
190
210
|
end
|
|
191
211
|
|
|
192
212
|
# @api private
|
|
213
|
+
def previous_error?(error_exit_status)
|
|
214
|
+
# Normally it'd be enough to check for previous error but when running test_unit
|
|
215
|
+
# status is 0
|
|
216
|
+
error_exit_status && error_exit_status != SimpleCov::ExitCodes::SUCCESS
|
|
217
|
+
end
|
|
218
|
+
|
|
193
219
|
#
|
|
194
|
-
#
|
|
220
|
+
# @api private
|
|
195
221
|
#
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
exit_status
|
|
222
|
+
# Thinking: Move this behavior earlier so if there was an error we do nothing?
|
|
223
|
+
def exit_and_report_previous_error(exit_status)
|
|
224
|
+
warn("Stopped processing SimpleCov as a previous error not related to SimpleCov has been detected") if print_error_status
|
|
225
|
+
Kernel.exit(exit_status)
|
|
226
|
+
end
|
|
200
227
|
|
|
201
|
-
|
|
228
|
+
# @api private
|
|
229
|
+
def ready_to_process_results?
|
|
230
|
+
final_result_process? && result?
|
|
231
|
+
end
|
|
202
232
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
exit_status = SimpleCov.process_result(SimpleCov.result, exit_status) if SimpleCov.result?
|
|
233
|
+
def process_results_and_report_error
|
|
234
|
+
exit_status = process_result(result)
|
|
206
235
|
|
|
207
236
|
# Force exit with stored status (see github issue #5)
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
$stderr.printf("SimpleCov failed with exit %<exit_status>d\n", exit_status: exit_status) if print_error_status
|
|
237
|
+
if exit_status.positive?
|
|
238
|
+
warn("SimpleCov failed with exit #{exit_status} due to a coverage related error") if print_error_status
|
|
211
239
|
Kernel.exit exit_status
|
|
212
240
|
end
|
|
213
241
|
end
|
|
@@ -217,55 +245,29 @@ module SimpleCov
|
|
|
217
245
|
# Usage:
|
|
218
246
|
# exit_status = SimpleCov.process_result(SimpleCov.result, exit_status)
|
|
219
247
|
#
|
|
220
|
-
def process_result(result
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
result_exit_status = result_exit_status(result, covered_percent)
|
|
225
|
-
write_last_run(covered_percent) if result_exit_status == SimpleCov::ExitCodes::SUCCESS # No result errors
|
|
226
|
-
final_result_process? ? result_exit_status : SimpleCov::ExitCodes::SUCCESS
|
|
248
|
+
def process_result(result)
|
|
249
|
+
result_exit_status = result_exit_status(result)
|
|
250
|
+
write_last_run(result) if result_exit_status == SimpleCov::ExitCodes::SUCCESS
|
|
251
|
+
result_exit_status
|
|
227
252
|
end
|
|
228
253
|
|
|
229
254
|
# @api private
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
$stderr.printf(
|
|
239
|
-
"File (%<file>s) is only (%<least_covered_percentage>.2f%%) covered. This is below the expected minimum coverage per file of (%<min_coverage>.2f%%).\n",
|
|
240
|
-
file: result.least_covered_file,
|
|
241
|
-
least_covered_percentage: covered_percentages.min,
|
|
242
|
-
min_coverage: SimpleCov.minimum_coverage_by_file
|
|
243
|
-
)
|
|
244
|
-
SimpleCov::ExitCodes::MINIMUM_COVERAGE
|
|
245
|
-
elsif (last_run = SimpleCov::LastRun.read)
|
|
246
|
-
coverage_diff = last_run[:result][:covered_percent] - covered_percent
|
|
247
|
-
if coverage_diff > SimpleCov.maximum_coverage_drop
|
|
248
|
-
$stderr.printf(
|
|
249
|
-
"Coverage has dropped by %<drop_percent>.2f%% since the last time (maximum allowed: %<max_drop>.2f%%).\n",
|
|
250
|
-
drop_percent: coverage_diff,
|
|
251
|
-
max_drop: SimpleCov.maximum_coverage_drop
|
|
252
|
-
)
|
|
253
|
-
SimpleCov::ExitCodes::MAXIMUM_COVERAGE_DROP
|
|
254
|
-
else
|
|
255
|
-
SimpleCov::ExitCodes::SUCCESS
|
|
256
|
-
end
|
|
257
|
-
else
|
|
258
|
-
SimpleCov::ExitCodes::SUCCESS
|
|
259
|
-
end
|
|
255
|
+
CoverageLimits = Struct.new(:minimum_coverage, :minimum_coverage_by_file, :maximum_coverage_drop, keyword_init: true)
|
|
256
|
+
def result_exit_status(result)
|
|
257
|
+
coverage_limits = CoverageLimits.new(
|
|
258
|
+
minimum_coverage: minimum_coverage, minimum_coverage_by_file: minimum_coverage_by_file,
|
|
259
|
+
maximum_coverage_drop: maximum_coverage_drop
|
|
260
|
+
)
|
|
261
|
+
|
|
262
|
+
ExitCodes::ExitCodeHandling.call(result, coverage_limits: coverage_limits)
|
|
260
263
|
end
|
|
261
|
-
# rubocop:enable Metrics/MethodLength
|
|
262
264
|
|
|
263
265
|
#
|
|
264
266
|
# @api private
|
|
265
267
|
#
|
|
266
268
|
def final_result_process?
|
|
267
|
-
# checking for ENV["TEST_ENV_NUMBER"] to determine if the
|
|
268
|
-
!defined?(ParallelTests) || !ENV["TEST_ENV_NUMBER"] || ParallelTests.
|
|
269
|
+
# checking for ENV["TEST_ENV_NUMBER"] to determine if the tests are being run in parallel
|
|
270
|
+
!defined?(ParallelTests) || !ENV["TEST_ENV_NUMBER"] || ParallelTests.last_process?
|
|
269
271
|
end
|
|
270
272
|
|
|
271
273
|
#
|
|
@@ -280,8 +282,16 @@ module SimpleCov
|
|
|
280
282
|
#
|
|
281
283
|
# @api private
|
|
282
284
|
#
|
|
283
|
-
def write_last_run(
|
|
284
|
-
SimpleCov::LastRun.write(result: {covered_percent: covered_percent})
|
|
285
|
+
def write_last_run(result)
|
|
286
|
+
SimpleCov::LastRun.write(result: {covered_percent: round_coverage(result.covered_percent)})
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
#
|
|
290
|
+
# @api private
|
|
291
|
+
#
|
|
292
|
+
# Rounding down to be extra strict, see #679
|
|
293
|
+
def round_coverage(coverage)
|
|
294
|
+
coverage.floor(2)
|
|
285
295
|
end
|
|
286
296
|
|
|
287
297
|
private
|
|
@@ -302,7 +312,7 @@ module SimpleCov
|
|
|
302
312
|
# This blog post gives a good run down of the coverage criterias introduced
|
|
303
313
|
# in Ruby 2.5: https://blog.bigbinary.com/2018/04/11/ruby-2-5-supports-measuring-branch-and-method-coverages.html
|
|
304
314
|
# There is also a nice writeup of the different coverage criteria made in this
|
|
305
|
-
# comment https://github.com/
|
|
315
|
+
# comment https://github.com/simplecov-ruby/simplecov/pull/692#discussion_r281836176 :
|
|
306
316
|
# Ruby < 2.5:
|
|
307
317
|
# https://github.com/ruby/ruby/blob/v1_9_3_374/ext/coverage/coverage.c
|
|
308
318
|
# traditional mode (Array)
|
|
@@ -406,61 +416,50 @@ module SimpleCov
|
|
|
406
416
|
@result = SimpleCov::Result.new(add_not_loaded_files(@result))
|
|
407
417
|
end
|
|
408
418
|
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
minimum_expected: percent,
|
|
414
|
-
actual: result.coverage_statistics[criterion].percent
|
|
415
|
-
}
|
|
416
|
-
end
|
|
419
|
+
# parallel_tests isn't always available, see: https://github.com/grosser/parallel_tests/issues/772
|
|
420
|
+
def make_parallel_tests_available
|
|
421
|
+
return if defined?(ParallelTests)
|
|
422
|
+
return unless probably_running_parallel_tests?
|
|
417
423
|
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
424
|
+
require "parallel_tests"
|
|
425
|
+
rescue LoadError
|
|
426
|
+
warn("SimpleCov guessed you were running inside parallel tests but couldn't load it. Please file a bug report with us!")
|
|
421
427
|
end
|
|
422
428
|
|
|
423
|
-
def
|
|
424
|
-
|
|
425
|
-
$stderr.printf(
|
|
426
|
-
"%<criterion>s coverage (%<covered>.2f%%) is below the expected minimum coverage (%<minimum_coverage>.2f%%).\n",
|
|
427
|
-
covered: violation.fetch(:actual).floor(2),
|
|
428
|
-
minimum_coverage: violation.fetch(:minimum_expected),
|
|
429
|
-
criterion: violation.fetch(:criterion).capitalize
|
|
430
|
-
)
|
|
431
|
-
end
|
|
429
|
+
def probably_running_parallel_tests?
|
|
430
|
+
ENV["TEST_ENV_NUMBER"] && ENV["PARALLEL_TEST_GROUPS"]
|
|
432
431
|
end
|
|
433
432
|
end
|
|
434
433
|
end
|
|
435
434
|
|
|
436
|
-
|
|
435
|
+
# requires are down here here for a load order reason I'm not sure what it is about
|
|
437
436
|
require "set"
|
|
438
437
|
require "forwardable"
|
|
439
|
-
|
|
438
|
+
require_relative "simplecov/configuration"
|
|
440
439
|
SimpleCov.extend SimpleCov::Configuration
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
440
|
+
require_relative "simplecov/coverage_statistics"
|
|
441
|
+
require_relative "simplecov/exit_codes"
|
|
442
|
+
require_relative "simplecov/profiles"
|
|
443
|
+
require_relative "simplecov/source_file/line"
|
|
444
|
+
require_relative "simplecov/source_file/branch"
|
|
445
|
+
require_relative "simplecov/source_file"
|
|
446
|
+
require_relative "simplecov/file_list"
|
|
447
|
+
require_relative "simplecov/result"
|
|
448
|
+
require_relative "simplecov/filter"
|
|
449
|
+
require_relative "simplecov/formatter"
|
|
450
|
+
require_relative "simplecov/last_run"
|
|
451
|
+
require_relative "simplecov/lines_classifier"
|
|
452
|
+
require_relative "simplecov/result_merger"
|
|
453
|
+
require_relative "simplecov/command_guesser"
|
|
454
|
+
require_relative "simplecov/version"
|
|
455
|
+
require_relative "simplecov/result_adapter"
|
|
456
|
+
require_relative "simplecov/combine"
|
|
457
|
+
require_relative "simplecov/combine/branches_combiner"
|
|
458
|
+
require_relative "simplecov/combine/files_combiner"
|
|
459
|
+
require_relative "simplecov/combine/lines_combiner"
|
|
460
|
+
require_relative "simplecov/combine/results_combiner"
|
|
461
|
+
require_relative "simplecov/useless_results_remover"
|
|
462
|
+
require_relative "simplecov/simulate_coverage"
|
|
464
463
|
|
|
465
464
|
# Load default config
|
|
466
|
-
|
|
465
|
+
require_relative "simplecov/defaults" unless ENV["SIMPLECOV_NO_DEFAULTS"]
|
metadata
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: simplecov
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.19.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Christoph Olszowka
|
|
8
|
+
- Tobias Pfeiffer
|
|
8
9
|
autorequire:
|
|
9
10
|
bindir: bin
|
|
10
11
|
cert_chain: []
|
|
11
|
-
date: 2020-
|
|
12
|
+
date: 2020-08-16 00:00:00.000000000 Z
|
|
12
13
|
dependencies:
|
|
13
14
|
- !ruby/object:Gem::Dependency
|
|
14
15
|
name: docile
|
|
@@ -42,6 +43,7 @@ description: Code coverage for Ruby with a powerful configuration library and au
|
|
|
42
43
|
merging of coverage across test suites
|
|
43
44
|
email:
|
|
44
45
|
- christoph at olszowka de
|
|
46
|
+
- pragtob@gmail.com
|
|
45
47
|
executables: []
|
|
46
48
|
extensions: []
|
|
47
49
|
extra_rdoc_files: []
|
|
@@ -55,6 +57,7 @@ files:
|
|
|
55
57
|
- doc/alternate-formatters.md
|
|
56
58
|
- doc/commercial-services.md
|
|
57
59
|
- doc/editor-integration.md
|
|
60
|
+
- lib/minitest/simplecov_plugin.rb
|
|
58
61
|
- lib/simplecov.rb
|
|
59
62
|
- lib/simplecov/combine.rb
|
|
60
63
|
- lib/simplecov/combine/branches_combiner.rb
|
|
@@ -66,6 +69,10 @@ files:
|
|
|
66
69
|
- lib/simplecov/coverage_statistics.rb
|
|
67
70
|
- lib/simplecov/defaults.rb
|
|
68
71
|
- lib/simplecov/exit_codes.rb
|
|
72
|
+
- lib/simplecov/exit_codes/exit_code_handling.rb
|
|
73
|
+
- lib/simplecov/exit_codes/maximum_coverage_drop_check.rb
|
|
74
|
+
- lib/simplecov/exit_codes/minimum_coverage_by_file_check.rb
|
|
75
|
+
- lib/simplecov/exit_codes/minimum_overall_coverage_check.rb
|
|
69
76
|
- lib/simplecov/file_list.rb
|
|
70
77
|
- lib/simplecov/filter.rb
|
|
71
78
|
- lib/simplecov/formatter.rb
|
|
@@ -75,6 +82,7 @@ files:
|
|
|
75
82
|
- lib/simplecov/lines_classifier.rb
|
|
76
83
|
- lib/simplecov/load_global_config.rb
|
|
77
84
|
- lib/simplecov/no_defaults.rb
|
|
85
|
+
- lib/simplecov/process.rb
|
|
78
86
|
- lib/simplecov/profiles.rb
|
|
79
87
|
- lib/simplecov/profiles/bundler_filter.rb
|
|
80
88
|
- lib/simplecov/profiles/hidden_filter.rb
|
|
@@ -90,15 +98,15 @@ files:
|
|
|
90
98
|
- lib/simplecov/source_file/line.rb
|
|
91
99
|
- lib/simplecov/useless_results_remover.rb
|
|
92
100
|
- lib/simplecov/version.rb
|
|
93
|
-
homepage: https://github.com/
|
|
101
|
+
homepage: https://github.com/simplecov-ruby/simplecov
|
|
94
102
|
licenses:
|
|
95
103
|
- MIT
|
|
96
104
|
metadata:
|
|
97
|
-
bug_tracker_uri: https://github.com/
|
|
98
|
-
changelog_uri: https://github.com/
|
|
99
|
-
documentation_uri: https://www.rubydoc.info/gems/simplecov/0.
|
|
105
|
+
bug_tracker_uri: https://github.com/simplecov-ruby/simplecov/issues
|
|
106
|
+
changelog_uri: https://github.com/simplecov-ruby/simplecov/blob/main/CHANGELOG.md
|
|
107
|
+
documentation_uri: https://www.rubydoc.info/gems/simplecov/0.19.0
|
|
100
108
|
mailing_list_uri: https://groups.google.com/forum/#!forum/simplecov
|
|
101
|
-
source_code_uri: https://github.com/
|
|
109
|
+
source_code_uri: https://github.com/simplecov-ruby/simplecov/tree/v0.19.0
|
|
102
110
|
post_install_message:
|
|
103
111
|
rdoc_options: []
|
|
104
112
|
require_paths:
|
|
@@ -107,7 +115,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
107
115
|
requirements:
|
|
108
116
|
- - ">="
|
|
109
117
|
- !ruby/object:Gem::Version
|
|
110
|
-
version: 2.
|
|
118
|
+
version: 2.5.0
|
|
111
119
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
112
120
|
requirements:
|
|
113
121
|
- - ">="
|