module SimpleCov
Code coverage for ruby. Please check out README for a full introduction.
Constants
- CRITERION_TO_RUBY_COVERAGE
- CoverageLimits
-
@api private
- VERSION
Attributes
Basically, should we take care of at_exit behavior or something else? Used by the minitest plugin. See lib/minitest/simplecov_plugin.rb
Basically, should we take care of at_exit behavior or something else? Used by the minitest plugin. See lib/minitest/simplecov_plugin.rb
Public Class Methods
Source
# File lib/simplecov.rb, line 174 def at_exit_behavior # If we are in a different process than called start, don't interfere. return if SimpleCov.pid != Process.pid # If SimpleCov is no longer running then don't run exit tasks SimpleCov.run_exit_tasks! if SimpleCov.running end
Source
# File lib/simplecov.rb, line 170 def clear_result @result = nil end
Clear out the previously cached .result. Primarily useful in testing
Source
# File lib/simplecov.rb, line 86 def collate(result_filenames, profile = nil, ignore_timeout: true, &block) raise "There are no reports to be merged" if result_filenames.empty? initial_setup(profile, &block) # Use the ResultMerger to produce a single, merged result, ready to use. @result = ResultMerger.merge_and_store(*result_filenames, ignore_timeout: ignore_timeout) run_exit_tasks! end
Collate a series of SimpleCov result files into a single SimpleCov output.
You can optionally specify configuration with a block:
SimpleCov.collate Dir["simplecov-resultset-*/.resultset.json"] OR SimpleCov.collate Dir["simplecov-resultset-*/.resultset.json"], 'rails' # using rails profile OR SimpleCov.collate Dir["simplecov-resultset-*/.resultset.json"] do add_filter 'test' end OR SimpleCov.collate Dir["simplecov-resultset-*/.resultset.json"], 'rails' do add_filter 'test' end
Please check out the RDoc for SimpleCov::Configuration to find about available config options, or checkout the README for more in-depth information about coverage collation
By default ‘collate` ignores the merge_timeout so all results of all files specified will be merged together. If you want to honor the merge_timeout then provide the keyword argument `ignore_timeout: false`.
Source
# File lib/simplecov.rb, line 223 def exit_and_report_previous_error(exit_status) warn("Stopped processing SimpleCov as a previous error not related to SimpleCov has been detected") if print_error_status Kernel.exit(exit_status) end
@api private
Thinking: Move this behavior earlier so if there was an error we do nothing?
Source
# File lib/simplecov.rb, line 200 def exit_status_from_exception # Capture the current exception if it exists @exit_exception = $ERROR_INFO return nil unless @exit_exception if @exit_exception.is_a?(SystemExit) @exit_exception.status else SimpleCov::ExitCodes::EXCEPTION end end
@api private
Returns the exit status from the exit exception
Source
# File lib/simplecov.rb, line 131 def filtered(files) result = files.clone filters.each do |filter| result = result.reject { |source_file| filter.matches?(source_file) } end SimpleCov::FileList.new result end
Applies the configured filters to the given array of SimpleCov::SourceFile items
Source
# File lib/simplecov.rb, line 268 def final_result_process? # checking for ENV["TEST_ENV_NUMBER"] to determine if the tests are being run in parallel !defined?(ParallelTests) || !ENV["TEST_ENV_NUMBER"] || ParallelTests.last_process? end
@api private
Source
# File lib/simplecov.rb, line 142 def grouped(files) grouped = {} grouped_files = [] groups.each do |name, filter| grouped[name] = SimpleCov::FileList.new(files.select { |source_file| filter.matches?(source_file) }) grouped_files += grouped[name] end if !groups.empty? && !(other_files = files.reject { |source_file| grouped_files.include?(source_file) }).empty? grouped["Ungrouped"] = SimpleCov::FileList.new(other_files) end grouped end
Applies the configured groups to the given array of SimpleCov::SourceFile items
Source
# File lib/simplecov.rb, line 162 def load_adapter(name) warn "#{Kernel.caller.first}: [DEPRECATION] #load_adapter is deprecated. Use #load_profile instead." load_profile(name) end
Source
# File lib/simplecov.rb, line 158 def load_profile(name) profiles.load(name) end
Applies the profile of given name on SimpleCov configuration
Source
# File lib/simplecov.rb, line 213 def previous_error?(error_exit_status) # Normally it'd be enough to check for previous error but when running test_unit # status is 0 error_exit_status && error_exit_status != SimpleCov::ExitCodes::SUCCESS end
@api private
Source
# File lib/simplecov.rb, line 248 def process_result(result) result_exit_status = result_exit_status(result) write_last_run(result) if result_exit_status == SimpleCov::ExitCodes::SUCCESS result_exit_status end
@api private
Usage:
exit_status = SimpleCov.process_result(SimpleCov.result, exit_status)
Source
# File lib/simplecov.rb, line 233 def process_results_and_report_error exit_status = process_result(result) # Force exit with stored status (see github issue #5) if exit_status.positive? warn("SimpleCov failed with exit #{exit_status} due to a coverage related error") if print_error_status Kernel.exit exit_status end end
Source
# File lib/simplecov.rb, line 229 def ready_to_process_results? final_result_process? && result? end
@api private
Source
# File lib/simplecov.rb, line 101 def result return @result if result? # Collect our coverage result process_coverage_result if running # If we're using merging of results, store the current result # first (if there is one), then merge the results and return those if use_merging wait_for_other_processes SimpleCov::ResultMerger.store_result(@result) if result? @result = SimpleCov::ResultMerger.merged_result end @result ensure self.running = false end
Returns the result for the current coverage run, merging it across test suites from cache using SimpleCov::ResultMerger if use_merging is activated (default)
Source
# File lib/simplecov.rb, line 124 def result? defined?(@result) && @result end
Returns nil if the result has not been computed Otherwise, returns the result
Source
# File lib/simplecov.rb, line 256 def result_exit_status(result) coverage_limits = CoverageLimits.new( minimum_coverage: minimum_coverage, minimum_coverage_by_file: minimum_coverage_by_file, maximum_coverage_drop: maximum_coverage_drop ) ExitCodes::ExitCodeHandling.call(result, coverage_limits: coverage_limits) end
Source
# File lib/simplecov.rb, line 296 def round_coverage(coverage) coverage.floor(2) end
@api private
Rounding down to be extra strict, see #679
Source
# File lib/simplecov.rb, line 186 def run_exit_tasks! error_exit_status = exit_status_from_exception at_exit.call exit_and_report_previous_error(error_exit_status) if previous_error?(error_exit_status) process_results_and_report_error if ready_to_process_results? end
@api private
Called from at_exit block
Source
# File lib/simplecov.rb, line 48 def start(profile = nil, &block) require "coverage" initial_setup(profile, &block) require_relative "./simplecov/process" if SimpleCov.enabled_for_subprocesses? && ::Process.respond_to?(:fork) make_parallel_tests_available @result = nil self.pid = Process.pid start_coverage_measurement end
Sets up SimpleCov to run against your project. You can optionally specify a profile to use as well as configuration with a block:
SimpleCov.start OR SimpleCov.start 'rails' # using rails profile OR SimpleCov.start do add_filter 'test' end OR SimpleCov.start 'rails' do add_filter 'test' end
Please check out the RDoc for SimpleCov::Configuration to find about available config options
Source
# File lib/simplecov.rb, line 276 def wait_for_other_processes return unless defined?(ParallelTests) && final_result_process? ParallelTests.wait_for_other_processes_to_finish end
@api private
Source
# File lib/simplecov.rb, line 285 def write_last_run(result) SimpleCov::LastRun.write(result: result.coverage_statistics.transform_values do |stats| round_coverage(stats.percent) end) end
@api private