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.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/lib/simplecov/cli/affected/runner.rb +38 -0
  4. data/lib/simplecov/cli/affected.rb +4 -5
  5. data/lib/simplecov/cli/annotations.rb +166 -0
  6. data/lib/simplecov/cli/clean.rb +2 -1
  7. data/lib/simplecov/cli/coverage_file.rb +2 -1
  8. data/lib/simplecov/cli/patch/output.rb +16 -0
  9. data/lib/simplecov/cli/patch.rb +8 -2
  10. data/lib/simplecov/cli/real_path.rb +41 -0
  11. data/lib/simplecov/cli/serve/static_file_handler.rb +5 -3
  12. data/lib/simplecov/cli/uncovered/misses.rb +5 -9
  13. data/lib/simplecov/cli/uncovered.rb +6 -20
  14. data/lib/simplecov/cli/usage.rb +2 -1
  15. data/lib/simplecov/cli.rb +1 -0
  16. data/lib/simplecov/configuration/eval_coverage.rb +1 -1
  17. data/lib/simplecov/configuration/view_coverage.rb +2 -3
  18. data/lib/simplecov/coverage_violations.rb +4 -2
  19. data/lib/simplecov/directive/erb.rb +44 -0
  20. data/lib/simplecov/directive/haml.rb +33 -0
  21. data/lib/simplecov/directive/indented_template.rb +37 -0
  22. data/lib/simplecov/directive/slim.rb +35 -0
  23. data/lib/simplecov/directive/template.rb +29 -0
  24. data/lib/simplecov/directive.rb +1 -0
  25. data/lib/simplecov/formatter/html_formatter/public/index.html +12 -12
  26. data/lib/simplecov/production.rb +1 -1
  27. data/lib/simplecov/profiles/rails.rb +4 -4
  28. data/lib/simplecov/profiles/strict.rb +3 -3
  29. data/lib/simplecov/result.rb +6 -0
  30. data/lib/simplecov/result_processing.rb +20 -5
  31. data/lib/simplecov/simulate_coverage.rb +2 -2
  32. data/lib/simplecov/source_file/builder_context.rb +7 -0
  33. data/lib/simplecov/source_file/skip_chunks.rb +11 -2
  34. data/lib/simplecov/source_file/statistics.rb +16 -6
  35. data/lib/simplecov/static_coverage_extractor/condition_folding.rb +9 -42
  36. data/lib/simplecov/static_coverage_extractor/method_collector.rb +1 -5
  37. data/lib/simplecov/static_coverage_extractor/visitor.rb +5 -7
  38. data/lib/simplecov/static_coverage_extractor.rb +27 -23
  39. data/lib/simplecov/version.rb +1 -1
  40. data/lib/simplecov/view_coverage/template_compiler.rb +16 -7
  41. data/man/simplecov.1 +8 -3
  42. data/sig/simplecov.rbs +5 -0
  43. 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 Prism isn't loadable or the file can't be parsed,
26
- # fall back to the old empty hashes.
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(@src)
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 = @src.filter_map.with_index(1) do |line_src, index|
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 sf.not_loaded? && covered.empty?
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 sf.not_loaded? && covered.empty?
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 it
12
- # replaced differed in three observable ways: `__FILE__` folded on
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. Consulted only when parentheses are 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
- # `self` is eliminated by every supported compiler; local/ivar/defined?
62
- # elimination arrived with the Prism-era compilers. Anything that can
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
- *(PRISM_ERA_ELIMINABLE_READS unless PARENS_ALWAYS_TRANSPARENT)
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
- # On 3.2 the dead arm's branch table entries survive the fold (parse.y
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
- live, dead = verdict.equal?(:truthy) ? [truthy_arm, falsy_arm] : [falsy_arm, truthy_arm]
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. Suppression covers 3.2's folded
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. Only defined when Prism is loadable.
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 on modern Rubies only its live
52
- # arm is descended into: the compiler eliminates the dead arm's entire
53
- # subtree, so a branch or method nested there would be a phantom no
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 on parse
32
- # failure or when Prism isn't available, which callers treat as "couldn't
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 available?
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 is unavailable or parsing fails, signaling callers
65
- # to keep every Coverage entry.
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SimpleCov
4
- VERSION = "1.2.0"
4
+ VERSION = "1.3.1"
5
5
  end
@@ -64,20 +64,29 @@ module SimpleCov
64
64
  segments.fetch(-2).to_sym
65
65
  end
66
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.
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 = ActionView::Template.registered_template_handler(extension)
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-08-24" "simplecov 1.2.0" "User Commands"
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 github
172
- Emit ::warning workflow commands instead of rows
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.2.0
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.2.0
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.2.0
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.2'
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.20
262
+ rubygems_version: 4.0.21
255
263
  specification_version: 4
256
264
  summary: Code coverage for Ruby
257
265
  test_files: []