simplecov 1.2.0 → 1.3.1
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/README.md +1 -1
- data/lib/simplecov/cli/affected/runner.rb +38 -0
- data/lib/simplecov/cli/affected.rb +4 -5
- data/lib/simplecov/cli/annotations.rb +166 -0
- data/lib/simplecov/cli/clean.rb +2 -1
- data/lib/simplecov/cli/coverage_file.rb +2 -1
- data/lib/simplecov/cli/patch/output.rb +16 -0
- data/lib/simplecov/cli/patch.rb +8 -2
- data/lib/simplecov/cli/real_path.rb +41 -0
- data/lib/simplecov/cli/serve/static_file_handler.rb +5 -3
- data/lib/simplecov/cli/uncovered/misses.rb +5 -9
- data/lib/simplecov/cli/uncovered.rb +6 -20
- data/lib/simplecov/cli/usage.rb +2 -1
- data/lib/simplecov/cli.rb +1 -0
- data/lib/simplecov/configuration/eval_coverage.rb +1 -1
- data/lib/simplecov/configuration/view_coverage.rb +2 -3
- data/lib/simplecov/coverage_violations.rb +4 -2
- 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 +1 -0
- data/lib/simplecov/formatter/html_formatter/public/index.html +12 -12
- data/lib/simplecov/production.rb +1 -1
- data/lib/simplecov/profiles/rails.rb +4 -4
- data/lib/simplecov/profiles/strict.rb +3 -3
- data/lib/simplecov/result.rb +6 -0
- data/lib/simplecov/result_processing.rb +20 -5
- data/lib/simplecov/simulate_coverage.rb +2 -2
- data/lib/simplecov/source_file/builder_context.rb +7 -0
- data/lib/simplecov/source_file/skip_chunks.rb +11 -2
- data/lib/simplecov/source_file/statistics.rb +16 -6
- data/lib/simplecov/static_coverage_extractor/condition_folding.rb +9 -42
- data/lib/simplecov/static_coverage_extractor/method_collector.rb +1 -5
- data/lib/simplecov/static_coverage_extractor/visitor.rb +5 -7
- data/lib/simplecov/static_coverage_extractor.rb +27 -23
- data/lib/simplecov/version.rb +1 -1
- data/lib/simplecov/view_coverage/template_compiler.rb +16 -7
- data/man/simplecov.1 +8 -3
- data/sig/simplecov.rbs +5 -0
- metadata +13 -5
|
@@ -22,8 +22,8 @@ module SimpleCov
|
|
|
22
22
|
# left both as empty hashes, which made unloaded files invisible to the
|
|
23
23
|
# branch/method denominators while their lines did count, so a glob that
|
|
24
24
|
# picked up files without specs silently inflated branch% relative to
|
|
25
|
-
# line% (#1059). When
|
|
26
|
-
#
|
|
25
|
+
# line% (#1059). When the file can't be parsed, fall back to the old empty
|
|
26
|
+
# hashes.
|
|
27
27
|
#
|
|
28
28
|
# Pass `synthesize: false` to skip the static analysis. Callers use it when
|
|
29
29
|
# neither branch nor method coverage is enabled, since nothing will read
|
|
@@ -11,8 +11,15 @@ module SimpleCov
|
|
|
11
11
|
# unavailable or parsing fails, signaling callers to keep every Coverage entry
|
|
12
12
|
# rather than risk false drops. The `defined?` guard preserves a nil
|
|
13
13
|
# memoization across calls.
|
|
14
|
+
#
|
|
15
|
+
# Nil for a template too, without parsing: every entry a template reports
|
|
16
|
+
# is eval-generated by construction, so the filter has nothing to
|
|
17
|
+
# distinguish there, and a template whose text happens to parse as Ruby
|
|
18
|
+
# (a Haml `#id` tag reads as a comment) would otherwise lose its real
|
|
19
|
+
# branches to a confident wrong parse.
|
|
14
20
|
def real_source_positions
|
|
15
21
|
return @real_source_positions if instance_variable_defined?(:@real_source_positions)
|
|
22
|
+
return @real_source_positions = nil if Directive::Template.template?(filename)
|
|
16
23
|
|
|
17
24
|
@real_source_positions = StaticCoverageExtractor.real_source_positions(src.join)
|
|
18
25
|
end
|
|
@@ -30,16 +30,25 @@ module SimpleCov
|
|
|
30
30
|
end
|
|
31
31
|
|
|
32
32
|
def directive_chunks
|
|
33
|
-
@directive_chunks ||= Directive.disabled_ranges(
|
|
33
|
+
@directive_chunks ||= Directive.disabled_ranges(ruby_lines)
|
|
34
34
|
end
|
|
35
35
|
|
|
36
36
|
private
|
|
37
37
|
|
|
38
|
+
# The Ruby the file holds, which for a template means the Ruby inside its
|
|
39
|
+
# tags or script lines with its own comments turned into Ruby comments.
|
|
40
|
+
# Both kinds of marker are found there, so a toggle in a template's
|
|
41
|
+
# comment syntax gets the same treatment, and the same deprecation
|
|
42
|
+
# warning, as one in a Ruby file.
|
|
43
|
+
def ruby_lines
|
|
44
|
+
@ruby_lines ||= Directive::Template.ruby_lines(@filename, @src)
|
|
45
|
+
end
|
|
46
|
+
|
|
38
47
|
# An uneven number of nocovs is assumed to run to the end of the file. It
|
|
39
48
|
# cannot be handled inside the each_slice because JRuby behaves differently
|
|
40
49
|
# there (jruby/jruby#6048).
|
|
41
50
|
def build_nocov_chunks
|
|
42
|
-
no_cov_lines =
|
|
51
|
+
no_cov_lines = ruby_lines.filter_map.with_index(1) do |line_src, index|
|
|
43
52
|
index if LinesClassifier.no_cov_line?(line_src)
|
|
44
53
|
end
|
|
45
54
|
|
|
@@ -30,15 +30,11 @@ module SimpleCov
|
|
|
30
30
|
}
|
|
31
31
|
end
|
|
32
32
|
|
|
33
|
-
# Files added via track_files but never loaded have no branch or method data,
|
|
34
|
-
# and report 0% instead of the empty-set default of 100% (#902). A file with
|
|
35
|
-
# missed entries and none covered already computes to 0%, so only a file that
|
|
36
|
-
# really has covered entries keeps its computed percentage.
|
|
37
33
|
def branch_statistics
|
|
38
34
|
sf = @source_file
|
|
39
35
|
covered = sf.covered_branches
|
|
40
36
|
missed = sf.missed_branches
|
|
41
|
-
percent = 0.0 if
|
|
37
|
+
percent = 0.0 if covered.empty? && unaccounted?(sf, "branches")
|
|
42
38
|
|
|
43
39
|
{branch: coverage_statistics(covered, missed, percent: percent)}
|
|
44
40
|
end
|
|
@@ -47,11 +43,25 @@ module SimpleCov
|
|
|
47
43
|
sf = @source_file
|
|
48
44
|
covered = sf.covered_methods
|
|
49
45
|
missed = sf.missed_methods
|
|
50
|
-
percent = 0.0 if
|
|
46
|
+
percent = 0.0 if covered.empty? && unaccounted?(sf, "methods")
|
|
51
47
|
|
|
52
48
|
{method: coverage_statistics(covered, missed, percent: percent)}
|
|
53
49
|
end
|
|
54
50
|
|
|
51
|
+
# A file tracked but never loaded once carried no branch or method tuples
|
|
52
|
+
# at all, so an empty set meant "nobody knows", and answering the
|
|
53
|
+
# empty-set default of 100% overstated it (#902). Simulation now
|
|
54
|
+
# synthesizes those tuples statically, so a file carrying a table at all,
|
|
55
|
+
# empty or not, has been accounted for: it has no branches, or a
|
|
56
|
+
# directive skipped the ones it has, and it is as covered as a loaded
|
|
57
|
+
# file with none. Only a file carrying no table for the criterion is
|
|
58
|
+
# still unaccounted for. A file with missed entries and none covered
|
|
59
|
+
# already computes to 0% either way, so only one that really has covered
|
|
60
|
+
# entries keeps its computed percentage.
|
|
61
|
+
def unaccounted?(source_file, table)
|
|
62
|
+
source_file.not_loaded? && source_file.coverage_data[table].nil?
|
|
63
|
+
end
|
|
64
|
+
|
|
55
65
|
def coverage_statistics(covered, missed, omitted: 0, percent: nil)
|
|
56
66
|
CoverageStatistics.new(
|
|
57
67
|
total_strength: covered.sum { |item| item.coverage.to_i },
|
|
@@ -8,14 +8,9 @@ module SimpleCov
|
|
|
8
8
|
# must not synthesize one either: the arm would be a phantom no loaded run
|
|
9
9
|
# can hit, the same unmergeable-tuple failure as #1226 / #1233.
|
|
10
10
|
module ConditionFolding
|
|
11
|
-
# CRuby 3.4 rebuilt the fold on the Prism compiler, and the parse.y fold
|
|
12
|
-
# replaced
|
|
13
|
-
# 3.2/3.3; parentheses were transparent for every literal on 3.2; and on
|
|
14
|
-
# 3.2 the dead arm's branch table entries survive the fold while its
|
|
15
|
-
# `def`s still never register.
|
|
11
|
+
# CRuby 3.4 rebuilt the fold on the Prism compiler, and the parse.y fold
|
|
12
|
+
# it replaced still differs on 3.3, where `__FILE__` folds.
|
|
16
13
|
FOLDS_SOURCE_FILE = Gem::Version.new(RUBY_VERSION) < Gem::Version.new("3.4")
|
|
17
|
-
PARENS_ALWAYS_TRANSPARENT = Gem::Version.new(RUBY_VERSION) < Gem::Version.new("3.3")
|
|
18
|
-
DEAD_ARM_BRANCHES_SURVIVE = PARENS_ALWAYS_TRANSPARENT
|
|
19
14
|
# Container literals in discarded position are eliminated from 3.3 on, but
|
|
20
15
|
# 3.3's compile.c elides a container whose contents are merely
|
|
21
16
|
# effect-free (`[x]`), while the Prism compiler demands fully static
|
|
@@ -42,8 +37,7 @@ module SimpleCov
|
|
|
42
37
|
|
|
43
38
|
# CRuby folds `if nil`, `if "x"`, and `if -> {}` but keeps a real branch
|
|
44
39
|
# for `if (nil)`, `if ("x")`, and `if (-> {})`, while every other literal
|
|
45
|
-
# folds parenthesized or not.
|
|
46
|
-
# always transparent.
|
|
40
|
+
# folds parenthesized or not.
|
|
47
41
|
PAREN_OPAQUE_TYPES = [
|
|
48
42
|
::Prism::NilNode, ::Prism::StringNode, ::Prism::LambdaNode, ::Prism::SourceFileNode
|
|
49
43
|
].freeze
|
|
@@ -58,42 +52,18 @@ module SimpleCov
|
|
|
58
52
|
::Prism::SourceLineNode, ::Prism::SourceFileNode, ::Prism::SourceEncodingNode, ::Prism::RegularExpressionNode
|
|
59
53
|
].freeze
|
|
60
54
|
|
|
61
|
-
#
|
|
62
|
-
#
|
|
63
|
-
# raise or run hooks is never eliminated and keeps the branch real.
|
|
64
|
-
PRISM_ERA_ELIMINABLE_READS = [
|
|
65
|
-
::Prism::LocalVariableReadNode, ::Prism::InstanceVariableReadNode, ::Prism::DefinedNode
|
|
66
|
-
].freeze
|
|
67
|
-
|
|
68
|
-
# simplecov:disable branch — which arm runs is fixed by the running Ruby's version
|
|
55
|
+
# Non-literal reads that are also eliminated when discarded. Anything that
|
|
56
|
+
# can raise or run hooks is never eliminated and keeps the branch real.
|
|
69
57
|
ELIMINABLE_READ_TYPES = [
|
|
70
|
-
::Prism::SelfNode,
|
|
71
|
-
|
|
58
|
+
::Prism::SelfNode, ::Prism::LocalVariableReadNode,
|
|
59
|
+
::Prism::InstanceVariableReadNode, ::Prism::DefinedNode
|
|
72
60
|
].freeze
|
|
73
|
-
# simplecov:enable branch
|
|
74
61
|
|
|
75
62
|
private
|
|
76
63
|
|
|
77
|
-
#
|
|
78
|
-
# instrumented branches before eliminating dead code) while its methods
|
|
79
|
-
# never register, so the dead arm is visited with method collection
|
|
80
|
-
# suppressed.
|
|
64
|
+
# `visit` is nil-safe, so a missing arm just visits nothing.
|
|
81
65
|
def visit_folded_arms(verdict, truthy_arm, falsy_arm)
|
|
82
|
-
|
|
83
|
-
visit(live)
|
|
84
|
-
visit_dead_arm(dead) if DEAD_ARM_BRANCHES_SURVIVE
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
def visit_dead_arm(arm)
|
|
88
|
-
# Save/restore rather than set/clear: a fold nested inside this dead arm
|
|
89
|
-
# re-enters here and must not clear suppression for the rest of it.
|
|
90
|
-
previous = @suppress_methods
|
|
91
|
-
begin
|
|
92
|
-
@suppress_methods = true
|
|
93
|
-
visit(arm)
|
|
94
|
-
ensure
|
|
95
|
-
@suppress_methods = previous
|
|
96
|
-
end
|
|
66
|
+
visit(verdict.equal?(:truthy) ? truthy_arm : falsy_arm)
|
|
97
67
|
end
|
|
98
68
|
|
|
99
69
|
# `:truthy` or `:falsy` when the compiler folds, nil when it doesn't. The
|
|
@@ -115,8 +85,6 @@ module SimpleCov
|
|
|
115
85
|
def foldable?(node, unwrapped)
|
|
116
86
|
return false unless STATIC_CONDITION_TYPES.any? { |type| unwrapped.instance_of?(type) }
|
|
117
87
|
|
|
118
|
-
return true if PARENS_ALWAYS_TRANSPARENT
|
|
119
|
-
|
|
120
88
|
unwrapped.equal?(node) || PAREN_OPAQUE_TYPES.none? { |type| unwrapped.instance_of?(type) }
|
|
121
89
|
end
|
|
122
90
|
|
|
@@ -151,7 +119,6 @@ module SimpleCov
|
|
|
151
119
|
|
|
152
120
|
def static_container_literal?(node)
|
|
153
121
|
return true if STATIC_LITERAL_LEAF_TYPES.any? { |type| node.instance_of?(type) }
|
|
154
|
-
return false if PARENS_ALWAYS_TRANSPARENT
|
|
155
122
|
|
|
156
123
|
static_container?(node)
|
|
157
124
|
end
|
|
@@ -17,12 +17,8 @@ module SimpleCov
|
|
|
17
17
|
|
|
18
18
|
# `def name(...)` and `def self.name(...)` both produce DefNode. The class
|
|
19
19
|
# context is the surrounding lexical class or module, or `Object` at the top
|
|
20
|
-
# level, matching `Coverage`'s convention.
|
|
21
|
-
# dead arms, where nested branches stay instrumented but a `def` never
|
|
22
|
-
# registers.
|
|
20
|
+
# level, matching `Coverage`'s convention.
|
|
23
21
|
def visit_def_node(node)
|
|
24
|
-
return super if @suppress_methods
|
|
25
|
-
|
|
26
22
|
class_name = @class_stack.last || "Object"
|
|
27
23
|
key = [class_name, node.name, node.start_line, node.start_column, node.end_line, node.end_column]
|
|
28
24
|
@methods[key] = 0
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require "prism"
|
|
3
4
|
require_relative "prism_compat"
|
|
4
5
|
require_relative "condition_folding"
|
|
5
6
|
require_relative "location_conventions"
|
|
@@ -12,7 +13,7 @@ module SimpleCov
|
|
|
12
13
|
# Ruby's `Coverage` reports. Tuple ids are sequential across the file like
|
|
13
14
|
# `Coverage`'s, but the numbering order can differ. That's fine: the
|
|
14
15
|
# combiners intern on source span and the report output drops ids, so
|
|
15
|
-
# nothing downstream compares them.
|
|
16
|
+
# nothing downstream compares them.
|
|
16
17
|
class Visitor < Prism::Visitor
|
|
17
18
|
include MethodCollector
|
|
18
19
|
include LocationConventions
|
|
@@ -31,7 +32,6 @@ module SimpleCov
|
|
|
31
32
|
@next_id = 0
|
|
32
33
|
@class_stack = []
|
|
33
34
|
@value_positions = nil
|
|
34
|
-
@suppress_methods = false
|
|
35
35
|
end
|
|
36
36
|
|
|
37
37
|
# On legacy Rubies the location of an empty branch arm depends on whether
|
|
@@ -48,11 +48,9 @@ module SimpleCov
|
|
|
48
48
|
# Coverage synthesizes a `:else` arm attributed to the whole condition's
|
|
49
49
|
# range, and so do we.
|
|
50
50
|
#
|
|
51
|
-
# A folded condition emits no tuple, and
|
|
52
|
-
#
|
|
53
|
-
#
|
|
54
|
-
# loaded run can produce. On 3.2 the dead arm is visited too, branches
|
|
55
|
-
# only.
|
|
51
|
+
# A folded condition emits no tuple, and only its live arm is descended
|
|
52
|
+
# into: the compiler eliminates the dead arm's entire subtree, so a branch
|
|
53
|
+
# or method nested there would be a phantom no loaded run can produce.
|
|
56
54
|
def visit_if_node(node)
|
|
57
55
|
verdict = folded_condition(node.predicate)
|
|
58
56
|
return visit_folded_arms(verdict, node.statements, PrismCompat.subsequent(node)) if verdict
|
|
@@ -1,13 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
begin
|
|
4
|
-
require "prism"
|
|
5
|
-
rescue LoadError
|
|
6
|
-
# Prism isn't available on this Ruby (older than 3.3 without the gem).
|
|
7
|
-
# `StaticCoverageExtractor.available?` will return false and callers fall
|
|
8
|
-
# back to the previous "empty hashes" behavior.
|
|
9
|
-
end
|
|
10
|
-
|
|
11
3
|
module SimpleCov
|
|
12
4
|
# Static enumeration of the branches and methods Ruby's `Coverage` library
|
|
13
5
|
# would have reported if a file had been loaded with `branches: true` /
|
|
@@ -20,19 +12,20 @@ module SimpleCov
|
|
|
20
12
|
# Position info comes from Prism's reported source locations; it doesn't
|
|
21
13
|
# always match `Coverage`'s byte-for-byte, but lines are reliable and
|
|
22
14
|
# downstream consumers that key off line numbers see the data they expect.
|
|
15
|
+
#
|
|
16
|
+
# Prism loads on the first extraction rather than with SimpleCov, so a
|
|
17
|
+
# line-only run never needs it. Where it cannot load at all (JRuby on
|
|
18
|
+
# Windows, whose FFI backend fails to open libprism), extraction answers nil
|
|
19
|
+
# like any other failure.
|
|
23
20
|
module StaticCoverageExtractor
|
|
24
21
|
extend self
|
|
25
22
|
|
|
26
|
-
def available?
|
|
27
|
-
defined?(Prism) ? true : false
|
|
28
|
-
end
|
|
29
|
-
|
|
30
23
|
# Parse `source` and return `{"branches" => {...}, "methods" => {...}}`
|
|
31
|
-
# matching the shape `Coverage.result[path]` produces. Returns nil
|
|
32
|
-
#
|
|
24
|
+
# matching the shape `Coverage.result[path]` produces. Returns nil when
|
|
25
|
+
# Prism cannot load or parsing fails, which callers treat as "couldn't
|
|
33
26
|
# extract, fall back to empty hashes".
|
|
34
27
|
def call(source)
|
|
35
|
-
return nil unless
|
|
28
|
+
return nil unless prism_loaded?
|
|
36
29
|
|
|
37
30
|
result = Prism.parse(source)
|
|
38
31
|
return nil if result.failure?
|
|
@@ -61,8 +54,8 @@ module SimpleCov
|
|
|
61
54
|
# Coincidental line-sharing between a real branch and an eval-generated one
|
|
62
55
|
# keeps both, an acceptable false-negative for an opt-in filter.
|
|
63
56
|
#
|
|
64
|
-
# Returns nil when Prism
|
|
65
|
-
#
|
|
57
|
+
# Returns nil when Prism cannot load or parsing fails, signaling callers to
|
|
58
|
+
# keep every Coverage entry.
|
|
66
59
|
def real_source_positions(source)
|
|
67
60
|
extracted = call(source)
|
|
68
61
|
return nil unless extracted
|
|
@@ -73,6 +66,14 @@ module SimpleCov
|
|
|
73
66
|
}
|
|
74
67
|
end
|
|
75
68
|
|
|
69
|
+
# Memoized, because a failed load leaves nothing in $LOADED_FEATURES and
|
|
70
|
+
# would otherwise be retried for every file.
|
|
71
|
+
def prism_loaded?
|
|
72
|
+
return @prism_loaded if instance_variable_defined?(:@prism_loaded)
|
|
73
|
+
|
|
74
|
+
@prism_loaded = load_prism
|
|
75
|
+
end
|
|
76
|
+
|
|
76
77
|
# Both keys carry their start line third, after the parts that vary between
|
|
77
78
|
# recordings. Read through a parameter list rather than an index, because
|
|
78
79
|
# every spelling of an index answers the same for a tuple of this fixed
|
|
@@ -84,11 +85,14 @@ module SimpleCov
|
|
|
84
85
|
def method_identity(_class_name, name, start_line, *)
|
|
85
86
|
[name, start_line]
|
|
86
87
|
end
|
|
88
|
+
|
|
89
|
+
private
|
|
90
|
+
|
|
91
|
+
def load_prism
|
|
92
|
+
require_relative "static_coverage_extractor/visitor"
|
|
93
|
+
true
|
|
94
|
+
rescue LoadError
|
|
95
|
+
false
|
|
96
|
+
end
|
|
87
97
|
end
|
|
88
98
|
end
|
|
89
|
-
|
|
90
|
-
# simplecov:disable branch
|
|
91
|
-
# The `else` arm (Prism missing) is unreachable on engines where the dogfood
|
|
92
|
-
# report runs; the Visitor class only matters when Prism is loadable.
|
|
93
|
-
require_relative "static_coverage_extractor/visitor" if SimpleCov::StaticCoverageExtractor.available?
|
|
94
|
-
# simplecov:enable branch
|
data/lib/simplecov/version.rb
CHANGED
|
@@ -64,20 +64,29 @@ module SimpleCov
|
|
|
64
64
|
segments.fetch(-2).to_sym
|
|
65
65
|
end
|
|
66
66
|
|
|
67
|
-
#
|
|
68
|
-
#
|
|
69
|
-
#
|
|
70
|
-
#
|
|
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.
|
|
67
|
+
# Nil when nothing is registered for the extension, which is how a default
|
|
68
|
+
# glob naming `.haml` behaves in a project that has no Haml.
|
|
69
|
+
# `handler_for_extension` is not that lookup: it falls back to the raw
|
|
70
|
+
# handler, and the template would report as static text.
|
|
73
71
|
def build_template(path, source)
|
|
74
72
|
extension = File.extname(path).delete_prefix(".")
|
|
75
|
-
handler =
|
|
73
|
+
handler = handler_for(extension)
|
|
76
74
|
return nil unless handler
|
|
77
75
|
|
|
78
76
|
no_locals = [] #: Array[Symbol]
|
|
79
77
|
ActionView::Template.new(source, path, handler, locals: no_locals, format: format_for(path))
|
|
80
78
|
end
|
|
79
|
+
|
|
80
|
+
# Rails main removed `Template.registered_template_handler` when the
|
|
81
|
+
# registry moved onto `Template::Handlers`. Read that hash directly so an
|
|
82
|
+
# unregistered extension stays nil. Older Rails still have the method.
|
|
83
|
+
def handler_for(extension)
|
|
84
|
+
if ActionView::Template.respond_to?(:registered_template_handler)
|
|
85
|
+
ActionView::Template.registered_template_handler(extension)
|
|
86
|
+
else
|
|
87
|
+
ActionView::Template::Handlers.template_handlers[extension.to_sym]
|
|
88
|
+
end
|
|
89
|
+
end
|
|
81
90
|
end
|
|
82
91
|
end
|
|
83
92
|
end
|
data/man/simplecov.1
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
.TH SIMPLECOV 1 "2026-
|
|
1
|
+
.TH SIMPLECOV 1 "2026-09-22" "simplecov 1.3.1" "User Commands"
|
|
2
2
|
.SH NAME
|
|
3
3
|
simplecov \- coverage reports and questions from the terminal
|
|
4
4
|
.SH SYNOPSIS
|
|
@@ -168,8 +168,9 @@ line, branch, or method (default: line)
|
|
|
168
168
|
.B \-\-missing
|
|
169
169
|
Append the missed line ranges to each row
|
|
170
170
|
.TP
|
|
171
|
-
.B \-\-annotate
|
|
172
|
-
Emit
|
|
171
|
+
.B \-\-annotate KIND
|
|
172
|
+
Emit CI annotations instead of rows: github, gitlab, rdjson, azure, teamcity,
|
|
173
|
+
or buildkite
|
|
173
174
|
.TP
|
|
174
175
|
.B \-\-json
|
|
175
176
|
Emit results as a JSON array (for CI)
|
|
@@ -252,6 +253,10 @@ Exit non\-zero when patch coverage on any measured criterion is below N%
|
|
|
252
253
|
.B \-\-find\-renames
|
|
253
254
|
Follow a renamed file instead of counting the moved file as all\-new
|
|
254
255
|
.TP
|
|
256
|
+
.B \-\-annotate KIND
|
|
257
|
+
Emit CI annotations instead of rows: github, gitlab, rdjson, azure, teamcity,
|
|
258
|
+
or buildkite
|
|
259
|
+
.TP
|
|
255
260
|
.B \-\-json
|
|
256
261
|
Emit results as a JSON array (for CI)
|
|
257
262
|
.SS ratchet
|
data/sig/simplecov.rbs
CHANGED
|
@@ -123,6 +123,8 @@ module SimpleCov
|
|
|
123
123
|
|
|
124
124
|
def self.tracked_file_paths: () -> Array[String]
|
|
125
125
|
|
|
126
|
+
def self.warn_templates_tracked: (Array[String] templates) -> void
|
|
127
|
+
|
|
126
128
|
def self.inject_unloaded_files: (Hash[String, untyped] result, Array[String] candidate_paths, ?synthesize: bool?, ?lines: bool?) -> [Hash[String, untyped], Set[String]]
|
|
127
129
|
|
|
128
130
|
def self.collect_own_coverage: (standalone: bool) -> void
|
|
@@ -669,6 +671,7 @@ module SimpleCov
|
|
|
669
671
|
def source_file_for: (String path) -> SourceFile?
|
|
670
672
|
def coverage_for: (String path) -> Hash[criterion, CoverageStatistics]?
|
|
671
673
|
def groups: () -> Hash[String, FileList]
|
|
674
|
+
def configured_group?: (String group_name) -> bool
|
|
672
675
|
def format!: () -> untyped
|
|
673
676
|
def created_at: () -> Time
|
|
674
677
|
def command_name: () -> String
|
|
@@ -953,6 +956,8 @@ module SimpleCov
|
|
|
953
956
|
|
|
954
957
|
def method_statistics: () -> Hash[criterion, CoverageStatistics]
|
|
955
958
|
|
|
959
|
+
def unaccounted?: (SourceFile source_file, String table) -> bool
|
|
960
|
+
|
|
956
961
|
def coverage_statistics: (Array[Line | Branch | Method] covered, Array[Line | Branch | Method] missed, ?omitted: Integer, ?percent: Float?) -> CoverageStatistics
|
|
957
962
|
end
|
|
958
963
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: simplecov
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.3.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Erik Berlin
|
|
@@ -43,7 +43,9 @@ files:
|
|
|
43
43
|
- lib/simplecov/cli.rb
|
|
44
44
|
- lib/simplecov/cli/affected.rb
|
|
45
45
|
- lib/simplecov/cli/affected/changed_files.rb
|
|
46
|
+
- lib/simplecov/cli/affected/runner.rb
|
|
46
47
|
- lib/simplecov/cli/affected/selection.rb
|
|
48
|
+
- lib/simplecov/cli/annotations.rb
|
|
47
49
|
- lib/simplecov/cli/badge.rb
|
|
48
50
|
- lib/simplecov/cli/badge/svg.rb
|
|
49
51
|
- lib/simplecov/cli/clean.rb
|
|
@@ -67,6 +69,7 @@ files:
|
|
|
67
69
|
- lib/simplecov/cli/patch/output.rb
|
|
68
70
|
- lib/simplecov/cli/ratchet.rb
|
|
69
71
|
- lib/simplecov/cli/ratchet/output.rb
|
|
72
|
+
- lib/simplecov/cli/real_path.rb
|
|
70
73
|
- lib/simplecov/cli/report.rb
|
|
71
74
|
- lib/simplecov/cli/run.rb
|
|
72
75
|
- lib/simplecov/cli/serve.rb
|
|
@@ -125,6 +128,11 @@ files:
|
|
|
125
128
|
- lib/simplecov/defaults.rb
|
|
126
129
|
- lib/simplecov/deprecation.rb
|
|
127
130
|
- lib/simplecov/directive.rb
|
|
131
|
+
- lib/simplecov/directive/erb.rb
|
|
132
|
+
- lib/simplecov/directive/haml.rb
|
|
133
|
+
- lib/simplecov/directive/indented_template.rb
|
|
134
|
+
- lib/simplecov/directive/slim.rb
|
|
135
|
+
- lib/simplecov/directive/template.rb
|
|
128
136
|
- lib/simplecov/exit_codes.rb
|
|
129
137
|
- lib/simplecov/exit_codes/baseline_check.rb
|
|
130
138
|
- lib/simplecov/exit_codes/check.rb
|
|
@@ -233,9 +241,9 @@ licenses:
|
|
|
233
241
|
metadata:
|
|
234
242
|
bug_tracker_uri: https://github.com/simplecov-ruby/simplecov/issues
|
|
235
243
|
changelog_uri: https://github.com/simplecov-ruby/simplecov/blob/main/CHANGELOG.md
|
|
236
|
-
documentation_uri: https://www.rubydoc.info/gems/simplecov/1.
|
|
244
|
+
documentation_uri: https://www.rubydoc.info/gems/simplecov/1.3.1
|
|
237
245
|
mailing_list_uri: https://groups.google.com/forum/#!forum/simplecov
|
|
238
|
-
source_code_uri: https://github.com/simplecov-ruby/simplecov/tree/v1.
|
|
246
|
+
source_code_uri: https://github.com/simplecov-ruby/simplecov/tree/v1.3.1
|
|
239
247
|
rubygems_mfa_required: 'true'
|
|
240
248
|
rdoc_options: []
|
|
241
249
|
require_paths:
|
|
@@ -244,14 +252,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
244
252
|
requirements:
|
|
245
253
|
- - ">="
|
|
246
254
|
- !ruby/object:Gem::Version
|
|
247
|
-
version: '3.
|
|
255
|
+
version: '3.3'
|
|
248
256
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
249
257
|
requirements:
|
|
250
258
|
- - ">="
|
|
251
259
|
- !ruby/object:Gem::Version
|
|
252
260
|
version: '0'
|
|
253
261
|
requirements: []
|
|
254
|
-
rubygems_version: 4.0.
|
|
262
|
+
rubygems_version: 4.0.21
|
|
255
263
|
specification_version: 4
|
|
256
264
|
summary: Code coverage for Ruby
|
|
257
265
|
test_files: []
|