simplecov 0.22.0 → 1.3.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/LICENSE +1 -1
- data/README.md +173 -875
- data/exe/simplecov +8 -0
- data/lib/minitest/simplecov_plugin.rb +18 -7
- data/lib/simplecov/atomic_file.rb +67 -0
- data/lib/simplecov/autostart.rb +9 -0
- data/lib/simplecov/baseline/parser.rb +58 -0
- data/lib/simplecov/baseline.rb +170 -0
- data/lib/simplecov/cli/affected/changed_files.rb +57 -0
- data/lib/simplecov/cli/affected/selection.rb +117 -0
- data/lib/simplecov/cli/affected.rb +148 -0
- data/lib/simplecov/cli/annotations.rb +166 -0
- data/lib/simplecov/cli/badge/svg.rb +70 -0
- data/lib/simplecov/cli/badge.rb +62 -0
- data/lib/simplecov/cli/clean.rb +86 -0
- data/lib/simplecov/cli/command_helpers.rb +91 -0
- data/lib/simplecov/cli/completions/scripts.rb +114 -0
- data/lib/simplecov/cli/completions.rb +83 -0
- data/lib/simplecov/cli/coverage.rb +83 -0
- data/lib/simplecov/cli/coverage_file.rb +109 -0
- data/lib/simplecov/cli/dead_code/output.rb +100 -0
- data/lib/simplecov/cli/dead_code.rb +139 -0
- data/lib/simplecov/cli/diff/output.rb +45 -0
- data/lib/simplecov/cli/diff.rb +115 -0
- data/lib/simplecov/cli/dotfile.rb +156 -0
- data/lib/simplecov/cli/git.rb +41 -0
- data/lib/simplecov/cli/history/output.rb +135 -0
- data/lib/simplecov/cli/history.rb +67 -0
- data/lib/simplecov/cli/merge.rb +115 -0
- data/lib/simplecov/cli/open.rb +45 -0
- data/lib/simplecov/cli/patch/changed_lines.rb +149 -0
- data/lib/simplecov/cli/patch/output.rb +151 -0
- data/lib/simplecov/cli/patch.rb +175 -0
- data/lib/simplecov/cli/ratchet/output.rb +44 -0
- data/lib/simplecov/cli/ratchet.rb +83 -0
- data/lib/simplecov/cli/report.rb +91 -0
- data/lib/simplecov/cli/run.rb +35 -0
- data/lib/simplecov/cli/serve/report_preparer.rb +30 -0
- data/lib/simplecov/cli/serve/static_file_handler.rb +128 -0
- data/lib/simplecov/cli/serve.rb +88 -0
- data/lib/simplecov/cli/show/annotator.rb +87 -0
- data/lib/simplecov/cli/show/sweep.rb +36 -0
- data/lib/simplecov/cli/show.rb +133 -0
- data/lib/simplecov/cli/status/facts.rb +87 -0
- data/lib/simplecov/cli/status.rb +93 -0
- data/lib/simplecov/cli/tests/redundancy.rb +78 -0
- data/lib/simplecov/cli/tests.rb +148 -0
- data/lib/simplecov/cli/uncovered/misses.rb +33 -0
- data/lib/simplecov/cli/uncovered.rb +127 -0
- data/lib/simplecov/cli/usage.rb +153 -0
- data/lib/simplecov/cli/watch/live_report.rb +73 -0
- data/lib/simplecov/cli/watch/narrator.rb +55 -0
- data/lib/simplecov/cli/watch/poller.rb +45 -0
- data/lib/simplecov/cli/watch/session.rb +134 -0
- data/lib/simplecov/cli/watch/test_plan.rb +43 -0
- data/lib/simplecov/cli/watch.rb +85 -0
- data/lib/simplecov/cli.rb +114 -0
- data/lib/simplecov/color.rb +65 -0
- data/lib/simplecov/combine/branches_combiner.rb +44 -21
- data/lib/simplecov/combine/coverage_accumulator.rb +175 -0
- data/lib/simplecov/combine/identity_interner.rb +27 -0
- data/lib/simplecov/combine/interned_counts.rb +28 -0
- data/lib/simplecov/combine/lines_combiner.rb +35 -29
- data/lib/simplecov/combine/methods_combiner.rb +48 -0
- data/lib/simplecov/combine/results_combiner.rb +9 -49
- data/lib/simplecov/combine.rb +0 -24
- data/lib/simplecov/command_guesser.rb +99 -42
- data/lib/simplecov/configuration/baseline.rb +31 -0
- data/lib/simplecov/configuration/coverage.rb +184 -0
- data/lib/simplecov/configuration/coverage_criteria.rb +143 -0
- data/lib/simplecov/configuration/deprecations.rb +21 -0
- data/lib/simplecov/configuration/eval_coverage.rb +37 -0
- data/lib/simplecov/configuration/filters.rb +131 -0
- data/lib/simplecov/configuration/formatting.rb +129 -0
- data/lib/simplecov/configuration/groups.rb +48 -0
- data/lib/simplecov/configuration/history.rb +44 -0
- data/lib/simplecov/configuration/ignored_entries.rb +72 -0
- data/lib/simplecov/configuration/merging.rb +197 -0
- data/lib/simplecov/configuration/missed_caps.rb +51 -0
- data/lib/simplecov/configuration/production.rb +23 -0
- data/lib/simplecov/configuration/test_tracking.rb +48 -0
- data/lib/simplecov/configuration/thresholds.rb +150 -0
- data/lib/simplecov/configuration/view_coverage.rb +37 -0
- data/lib/simplecov/configuration.rb +100 -443
- data/lib/simplecov/configuration_error.rb +5 -0
- data/lib/simplecov/context_map/union.rb +81 -0
- data/lib/simplecov/context_map.rb +187 -0
- data/lib/simplecov/coverage_json.rb +21 -0
- data/lib/simplecov/coverage_statistics.rb +24 -28
- data/lib/simplecov/coverage_violations.rb +254 -0
- data/lib/simplecov/current_run.rb +61 -0
- data/lib/simplecov/defaults.rb +20 -28
- data/lib/simplecov/deprecation.rb +63 -0
- data/lib/simplecov/directive/erb.rb +44 -0
- data/lib/simplecov/directive/haml.rb +33 -0
- data/lib/simplecov/directive/indented_template.rb +37 -0
- data/lib/simplecov/directive/slim.rb +35 -0
- data/lib/simplecov/directive/template.rb +29 -0
- data/lib/simplecov/directive.rb +152 -0
- data/lib/simplecov/exit_codes/baseline_check.rb +46 -0
- data/lib/simplecov/exit_codes/check.rb +39 -0
- data/lib/simplecov/exit_codes/exit_code_handling.rb +24 -5
- data/lib/simplecov/exit_codes/maximum_coverage_drop_check.rb +17 -67
- data/lib/simplecov/exit_codes/maximum_missed_check.rb +26 -0
- data/lib/simplecov/exit_codes/maximum_missed_per_file_check.rb +34 -0
- data/lib/simplecov/exit_codes/maximum_overall_coverage_check.rb +27 -0
- data/lib/simplecov/exit_codes/minimum_coverage_by_file_check.rb +20 -38
- data/lib/simplecov/exit_codes/minimum_coverage_by_group_check.rb +28 -0
- data/lib/simplecov/exit_codes/minimum_overall_coverage_check.rb +37 -34
- data/lib/simplecov/exit_codes.rb +26 -0
- data/lib/simplecov/exit_handling.rb +163 -0
- data/lib/simplecov/file_list.rb +63 -48
- data/lib/simplecov/filter.rb +98 -42
- data/lib/simplecov/formatter/base.rb +100 -0
- data/lib/simplecov/formatter/baseline_formatter.rb +98 -0
- data/lib/simplecov/formatter/coverage_json_writer.rb +95 -0
- data/lib/simplecov/formatter/html_formatter/public/index.html +93 -0
- data/lib/simplecov/formatter/html_formatter/viewer_data_validator.rb +153 -0
- data/lib/simplecov/formatter/html_formatter.rb +88 -0
- data/lib/simplecov/formatter/json_formatter/errors_formatter.rb +122 -0
- data/lib/simplecov/formatter/json_formatter/production_section_formatter.rb +48 -0
- data/lib/simplecov/formatter/json_formatter/result_hash_formatter.rb +132 -0
- data/lib/simplecov/formatter/json_formatter/source_file_formatter.rb +97 -0
- data/lib/simplecov/formatter/json_formatter.rb +40 -0
- data/lib/simplecov/formatter/multi_formatter.rb +8 -10
- data/lib/simplecov/formatter/simple_formatter.rb +12 -15
- data/lib/simplecov/formatter.rb +21 -1
- data/lib/simplecov/group_names.rb +33 -0
- data/lib/simplecov/history.rb +115 -0
- data/lib/simplecov/last_run.rb +16 -5
- data/lib/simplecov/lines_classifier.rb +67 -19
- data/lib/simplecov/load_global_config.rb +12 -4
- data/lib/simplecov/parallel_adapters/base.rb +50 -0
- data/lib/simplecov/parallel_adapters/generic.rb +33 -0
- data/lib/simplecov/parallel_adapters/parallel_tests.rb +72 -0
- data/lib/simplecov/parallel_adapters.rb +54 -0
- data/lib/simplecov/parallel_coordination.rb +124 -0
- data/lib/simplecov/parallel_result_merger/worker_payload.rb +33 -0
- data/lib/simplecov/parallel_result_merger.rb +171 -0
- data/lib/simplecov/process.rb +34 -12
- data/lib/simplecov/production/error.rb +11 -0
- data/lib/simplecov/production/file_sink.rb +130 -0
- data/lib/simplecov/production.rb +249 -0
- data/lib/simplecov/profiles/bundler_filter.rb +1 -1
- data/lib/simplecov/profiles/hidden_filter.rb +1 -1
- data/lib/simplecov/profiles/rails.rb +13 -10
- data/lib/simplecov/profiles/root_filter.rb +2 -5
- data/lib/simplecov/profiles/strict.rb +22 -0
- data/lib/simplecov/profiles/test_frameworks.rb +1 -4
- data/lib/simplecov/profiles.rb +26 -19
- data/lib/simplecov/report_deferral.rb +45 -0
- data/lib/simplecov/report_stamp.rb +25 -0
- data/lib/simplecov/result/filter_config.rb +19 -0
- data/lib/simplecov/result/missing_source_files_reporter.rb +48 -0
- data/lib/simplecov/result/serialization.rb +43 -0
- data/lib/simplecov/result/source_file_builder.rb +46 -0
- data/lib/simplecov/result.rb +123 -47
- data/lib/simplecov/result_adapter.rb +130 -11
- data/lib/simplecov/result_merger/contexts.rb +22 -0
- data/lib/simplecov/result_merger/legacy_format_adapter.rb +24 -0
- data/lib/simplecov/result_merger/resultset_file.rb +67 -0
- data/lib/simplecov/result_merger/resultset_run_identity.rb +65 -0
- data/lib/simplecov/result_merger/resultset_store.rb +62 -0
- data/lib/simplecov/result_merger/unloaded_files.rb +95 -0
- data/lib/simplecov/result_merger.rb +120 -124
- data/lib/simplecov/result_processing.rb +188 -0
- data/lib/simplecov/run_identity.rb +75 -0
- data/lib/simplecov/simulate_coverage.rb +72 -17
- data/lib/simplecov/source_file/branch.rb +8 -35
- data/lib/simplecov/source_file/branch_builder.rb +95 -0
- data/lib/simplecov/source_file/builder_context.rb +28 -0
- data/lib/simplecov/source_file/line.rb +17 -32
- data/lib/simplecov/source_file/line_builder.rb +37 -0
- data/lib/simplecov/source_file/method.rb +54 -0
- data/lib/simplecov/source_file/method_builder.rb +51 -0
- data/lib/simplecov/source_file/ruby_data_parser.rb +103 -0
- data/lib/simplecov/source_file/skip_chunks.rb +72 -0
- data/lib/simplecov/source_file/source_loader.rb +89 -0
- data/lib/simplecov/source_file/statistics.rb +76 -0
- data/lib/simplecov/source_file.rb +64 -260
- data/lib/simplecov/static_coverage_extractor/condition_folding.rb +155 -0
- data/lib/simplecov/static_coverage_extractor/location_conventions.rb +191 -0
- data/lib/simplecov/static_coverage_extractor/method_collector.rb +45 -0
- data/lib/simplecov/static_coverage_extractor/prism_compat.rb +46 -0
- data/lib/simplecov/static_coverage_extractor/value_position.rb +61 -0
- data/lib/simplecov/static_coverage_extractor/visitor.rb +163 -0
- data/lib/simplecov/static_coverage_extractor.rb +78 -0
- data/lib/simplecov/test_tracker/accessors.rb +34 -0
- data/lib/simplecov/test_tracker/constant_watch.rb +49 -0
- data/lib/simplecov/test_tracker/delta.rb +69 -0
- data/lib/simplecov/test_tracker/framework_hooks.rb +130 -0
- data/lib/simplecov/test_tracker.rb +162 -0
- data/lib/simplecov/unloaded_file_injector.rb +62 -0
- data/lib/simplecov/useless_results_remover.rb +17 -7
- data/lib/simplecov/version.rb +1 -1
- data/lib/simplecov/view_coverage/template_compiler.rb +83 -0
- data/lib/simplecov/view_coverage.rb +55 -0
- data/lib/simplecov-html.rb +5 -0
- data/lib/simplecov.rb +143 -394
- data/lib/simplecov_json_formatter.rb +5 -0
- data/man/simplecov.1 +354 -0
- data/sig/simplecov.rbs +1710 -0
- metadata +183 -61
- data/CHANGELOG.md +0 -191
- data/doc/alternate-formatters.md +0 -71
- data/doc/commercial-services.md +0 -25
- data/doc/editor-integration.md +0 -18
- data/lib/simplecov/combine/files_combiner.rb +0 -24
- data/lib/simplecov/default_formatter.rb +0 -20
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module SimpleCov
|
|
4
|
+
module ViewCoverage
|
|
5
|
+
#
|
|
6
|
+
# Compiles a single ActionView template: builds a `Template` for the file on
|
|
7
|
+
# disk and defines its method into a throwaway module, without ever
|
|
8
|
+
# rendering it.
|
|
9
|
+
#
|
|
10
|
+
# Defining the method is the whole trick. `Template#compile` hands the
|
|
11
|
+
# handler's generated Ruby to `module_eval(source, identifier, offset)`,
|
|
12
|
+
# and evaluating a `def` records the body as executable-but-unexecuted
|
|
13
|
+
# rather than running it, so `Coverage` comes away with a zeroed line array
|
|
14
|
+
# and a full set of branch tuples for the template.
|
|
15
|
+
#
|
|
16
|
+
# Never compile a template the suite already rendered. Evaluating the same
|
|
17
|
+
# identifier a second time replaces that file's entry in `Coverage` rather
|
|
18
|
+
# than adding to it, so the recompile would zero the hits the run actually
|
|
19
|
+
# earned and leave a duplicate set of branch tuples behind. `ViewCoverage`
|
|
20
|
+
# filters those out before calling here.
|
|
21
|
+
#
|
|
22
|
+
module TemplateCompiler
|
|
23
|
+
extend self
|
|
24
|
+
|
|
25
|
+
# False in any project that doesn't load ActionView, which is the common
|
|
26
|
+
# case and not an error: view coverage simply has nothing to do there.
|
|
27
|
+
def available?
|
|
28
|
+
!defined?(::ActionView::Template).nil?
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Answers whether the compile produced coverage data. A template that
|
|
32
|
+
# doesn't compile can't render either, so the suite has bigger problems
|
|
33
|
+
# than its coverage, but the report is not the place to discover that and
|
|
34
|
+
# a broken view must not take the whole run down.
|
|
35
|
+
def call(path)
|
|
36
|
+
template = build_template(path, File.binread(path))
|
|
37
|
+
return false unless template
|
|
38
|
+
|
|
39
|
+
compile_into_throwaway_module(template)
|
|
40
|
+
true
|
|
41
|
+
rescue StandardError, ScriptError => e
|
|
42
|
+
warn "[SimpleCov]: Skipping #{path}, which did not compile (#{e.class})"
|
|
43
|
+
false
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# ActionView keeps `compile` private, and the module it compiles into is
|
|
47
|
+
# thrown away: what is wanted is the coverage the compile records, not the
|
|
48
|
+
# method it defines.
|
|
49
|
+
#
|
|
50
|
+
# mutant:disable -- `send` and `__send__` are the same call.
|
|
51
|
+
def compile_into_throwaway_module(template)
|
|
52
|
+
template.send(:compile, Module.new)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# The format the template renders, taken from the extension in front of the
|
|
56
|
+
# handler's: `show.html.erb` is `:html`. It reaches the handler's codegen
|
|
57
|
+
# (an HTML template escapes interpolations, a text one does not), but
|
|
58
|
+
# never the line structure, so a template named without one compiles fine
|
|
59
|
+
# as nil.
|
|
60
|
+
def format_for(path)
|
|
61
|
+
segments = File.basename(path).split(".")
|
|
62
|
+
return nil if segments.length < 3
|
|
63
|
+
|
|
64
|
+
segments.fetch(-2).to_sym
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# The single place ActionView is named. The handler lookup is the one the
|
|
68
|
+
# resolver performs, so a template language the project has registered a
|
|
69
|
+
# handler for compiles here the way it does when rendered. Nil when
|
|
70
|
+
# nothing is registered for the extension, which is how a default glob
|
|
71
|
+
# naming `.haml` behaves in a project that has no Haml: ActionView would
|
|
72
|
+
# hand back the raw handler and the template would report as static text.
|
|
73
|
+
def build_template(path, source)
|
|
74
|
+
extension = File.extname(path).delete_prefix(".")
|
|
75
|
+
handler = ActionView::Template.registered_template_handler(extension)
|
|
76
|
+
return nil unless handler
|
|
77
|
+
|
|
78
|
+
no_locals = [] #: Array[Symbol]
|
|
79
|
+
ActionView::Template.new(source, path, handler, locals: no_locals, format: format_for(path))
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "view_coverage/template_compiler"
|
|
4
|
+
|
|
5
|
+
module SimpleCov
|
|
6
|
+
# Brings ActionView templates into the report, for projects that opt in with
|
|
7
|
+
# `cover_views`.
|
|
8
|
+
#
|
|
9
|
+
# Rendering a template is already enough to measure it: ActionView compiles
|
|
10
|
+
# each one with `module_eval(source, identifier, offset)` where `identifier`
|
|
11
|
+
# is the template's own path, and the offset cancels the `def` line its
|
|
12
|
+
# wrapper adds, so eval coverage attributes the generated code back to the
|
|
13
|
+
# `.erb` file at its own line numbers.
|
|
14
|
+
#
|
|
15
|
+
# A template no test renders is never compiled, so `Coverage` never hears
|
|
16
|
+
# about it and the report omits it entirely. That is the flattering
|
|
17
|
+
# direction to be wrong in, so every template the run didn't reach is
|
|
18
|
+
# compiled here instead, which lands it in the report at 0%.
|
|
19
|
+
module ViewCoverage
|
|
20
|
+
extend self
|
|
21
|
+
|
|
22
|
+
# Called once per process, immediately before `Coverage.result`. It has to
|
|
23
|
+
# happen here rather than at the merge point, where unloaded `.rb` files are
|
|
24
|
+
# injected, because compiling a template needs ActionView and the merging
|
|
25
|
+
# process need not have it loaded. A standalone `simplecov merge` never
|
|
26
|
+
# does.
|
|
27
|
+
def compile_unrendered
|
|
28
|
+
return [] unless enabled?
|
|
29
|
+
|
|
30
|
+
rendered = measured_paths
|
|
31
|
+
discover.reject { |path| rendered.include?(path) }
|
|
32
|
+
.select { |path| TemplateCompiler.call(path) }
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def enabled?
|
|
36
|
+
SimpleCov.view_coverage? && Coverage.running? && TemplateCompiler.available?
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Expanded against `SimpleCov.root` rather than the working directory, and
|
|
40
|
+
# filtered through the same path-only filters the rest of the report honors,
|
|
41
|
+
# so `skip "app/views/admin"` keeps those templates out instead of compiling
|
|
42
|
+
# them only to drop them later.
|
|
43
|
+
def discover
|
|
44
|
+
globs = SimpleCov.view_globs || [] #: Array[String?]
|
|
45
|
+
UnloadedFileInjector.discover(globs, root: SimpleCov.root, reject: SimpleCov.filters.select(&:path_only?))
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# The files `Coverage` is already holding data for, which for a template
|
|
49
|
+
# means the run rendered it. `peek_result` copies the whole coverage state
|
|
50
|
+
# to answer, so this stays a once-per-process call.
|
|
51
|
+
def measured_paths
|
|
52
|
+
Coverage.peek_result.keys.to_set
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|