undercover 0.4.7 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 208a99638c9f105ea5a9abde3de88efc756e4ca9f739246488b55a80a7118276
4
- data.tar.gz: c1a5926972f1404a0adbf570ef7b28678fb48ecbabe29f8b65469b09a2b4a25c
3
+ metadata.gz: c860e600589d92698fa5df94b1b8fe9283cbb00cdc595410b9c3a413d74b3095
4
+ data.tar.gz: e2c26b709c691201f473846e0cb6a7fa6844c5d1dc73169ca533d95482182f6c
5
5
  SHA512:
6
- metadata.gz: 69937cd20c436a78a403ba4b12eb52d727120771060de928617b81bcfa8c8010c2ef3af64ea0b986d9655b32934e70e33c9482b5d8b68b2149462c3933e143f7
7
- data.tar.gz: 9fe21bbb6cf9af2b45f51033eedb1fe75d744b6611c677c65c4052373251166ce54b870dc53f94b8b564aa7839963e3b038be3f36181a7a78c034583f209e9e8
6
+ metadata.gz: ace70eb4f75d2d57bda9d906925a7b5525c5a67520380ba0327a5344ed6718b79ea2587a5a0fb4d2a09d430d09b30eb2d1ac63c503be17197ff9c6455ab12b00
7
+ data.tar.gz: a2ec9a3b4d27cb9eaa7b4595f71ff9b12108e939864a6f5279aece22cd728e358dd50b16e63d0537780154e3ffd20e0712bce8322a8591e4f08f70d9d6818145
@@ -14,3 +14,7 @@ updates:
14
14
  - 1.12.1
15
15
  - 1.8.1
16
16
  - 1.9.0
17
+ - package-ecosystem: "github-actions"
18
+ directory: "/"
19
+ schedule:
20
+ interval: "weekly"
@@ -5,9 +5,9 @@ jobs:
5
5
  runs-on: ubuntu-latest
6
6
  strategy:
7
7
  matrix:
8
- ruby: ['3.2', '3.0', '2.7']
8
+ ruby: ['3.3', '3.0']
9
9
  steps:
10
- - uses: actions/checkout@v3
10
+ - uses: actions/checkout@v4
11
11
  with:
12
12
  fetch-depth: 0 # fetch all since test fixtures depend on history
13
13
  - name: Set up Ruby ${{ matrix.ruby }}
@@ -16,28 +16,27 @@ jobs:
16
16
  ruby-version: ${{ matrix.ruby }}
17
17
  - name: Build and test with Rake
18
18
  run: |
19
- gem install bundler -v 2.4.22
20
- gem install undercover --no-doc
19
+ gem install bundler undercover --no-doc
21
20
  bundle install --jobs 4 --retry 3
22
21
  bundle exec rake
23
22
  - name: undercover (local)
24
23
  run: |
25
24
  git fetch --update-head-ok origin master:master
26
25
  undercover --compare master
27
- - uses: actions/upload-artifact@v3
26
+ - uses: actions/upload-artifact@v4
28
27
  with:
29
- name: undercover.lcov
28
+ name: undercover-${{ matrix.ruby }}.lcov
30
29
  path: coverage/lcov/undercover.lcov
31
30
  coverage:
32
31
  runs-on: ubuntu-latest
33
32
  needs: build
34
33
  steps:
35
- - uses: actions/download-artifact@v3
34
+ - uses: actions/download-artifact@v4
36
35
  with:
37
- name: undercover.lcov
36
+ name: undercover-3.3.lcov
38
37
  - name: Upload coverage
39
38
  run: |
40
39
  ruby -e "$(curl -s https://undercover-ci.com/uploader.rb)" -- \
41
40
  --repo grodowski/undercover \
42
- --commit $GITHUB_SHA \
41
+ --commit ${{ github.event.pull_request.head.sha || github.sha }} \
43
42
  --lcov /home/runner/work/undercover/undercover/undercover.lcov
data/.rubocop.yml CHANGED
@@ -1,8 +1,9 @@
1
1
  AllCops:
2
2
  NewCops: enable
3
- TargetRubyVersion: 2.7.0
3
+ TargetRubyVersion: 3.0
4
4
  Exclude:
5
5
  - spec/fixtures/**/*
6
+ SuggestExtensions: false
6
7
 
7
8
  Style/RegexpLiteral:
8
9
  EnforcedStyle: slashes
@@ -23,6 +24,12 @@ Metrics/BlockLength:
23
24
  Exclude:
24
25
  - spec/**/*
25
26
 
27
+ Metrics/CyclomaticComplexity:
28
+ Max: 10
29
+
30
+ Metrics/PerceivedComplexity:
31
+ Max: 10
32
+
26
33
  Style/HashEachMethods:
27
34
  Enabled: true
28
35
 
data/.tool-versions ADDED
@@ -0,0 +1 @@
1
+ ruby 3.3.3
data/CHANGELOG.md CHANGED
@@ -6,7 +6,21 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
- # [0.4.7] - 2022-07-28
9
+ # [0.6.0] - 2024-12-12
10
+ ### Added
11
+ - Add support for including and exluding files by glob patterns, supplied through CLI args and the configuration file (#146)
12
+
13
+ ### Fixed
14
+ - Files that were changed but don't appear in the coverage report at all will now be reported as uncovered, as expected.
15
+ - Fixed an issue where top-level methods were not being considered [#135](https://github.com/grodowski/undercover/issues/135). This was caused by a bug in the tree traversal logic.
16
+ - Fixed a bug where `--compare` didn't work with grafted commits as there was no merge base available ([#175](https://github.com/grodowski/undercover/issues/175)). Now it's possible to pass a graft commit as `--compare` which enables `undercover` to work with shallow clones.
17
+
18
+ # [0.5.0] - 2024-01-09
19
+ ### Changed
20
+ - Drop ruby 2.x support, require ruby 3.x in gemspec
21
+ - Dev dependency updates
22
+
23
+ # [0.4.7] - 2024-01-08
10
24
  ### Fixed
11
25
  - [Update of one-line block is ignored](https://github.com/grodowski/undercover/pull/207) by [@lizhangyuh](https://github.com/lizhangyuh)
12
26
 
@@ -123,7 +137,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
123
137
  ### Added
124
138
  - First release of `undercover` 🎉
125
139
 
126
- [Unreleased]: https://github.com/grodowski/undercover/compare/v0.4.7...HEAD
140
+ [Unreleased]: https://github.com/grodowski/undercover/compare/v0.6.0...HEAD
141
+ [0.6.0]: https://github.com/grodowski/undercover/compare/v0.6.0...v0.5.0
142
+ [0.5.0]: https://github.com/grodowski/undercover/compare/v0.4.7...v0.5.0
127
143
  [0.4.7]: https://github.com/grodowski/undercover/compare/v0.4.6...v0.4.7
128
144
  [0.4.6]: https://github.com/grodowski/undercover/compare/v0.4.5...v0.4.6
129
145
  [0.4.5]: https://github.com/grodowski/undercover/compare/v0.4.4...v0.4.5
data/Gemfile CHANGED
@@ -3,3 +3,14 @@
3
3
  source 'https://rubygems.org'
4
4
 
5
5
  gemspec
6
+
7
+ gem 'base64'
8
+ gem 'bundler'
9
+ gem 'pry'
10
+ gem 'rake', '~> 13.0'
11
+ gem 'rspec', '~> 3.0'
12
+ gem 'rubocop'
13
+ gem 'simplecov'
14
+ gem 'simplecov-html'
15
+ gem 'simplecov-lcov', '~> 0.8'
16
+ gem 'timecop'
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  ![logo](https://github.com/grodowski/undercover/assets/4991698/c4bf038b-4472-4406-8f1f-5ddc812908d6)
2
2
 
3
- `undercover` warns about methods, classes and blocks that **were changed without tests**, to help you easily find untested code and reduce the number of bugs. It does so by analysing data from git diffs, code structure and SimpleCov coverage reports.
3
+ `undercover` warns about methods, classes and blocks that **were changed without tests**, to help you easily find untested code and reduce the number of bugs. It does so by analysing data from git diffs, code structure and SimpleCov coverage reports.
4
4
 
5
5
  Works with any Ruby CI pipeline as well as locally as a CLI.
6
6
 
@@ -104,12 +104,14 @@ A few options exist to provide automated comments from `undercover` in Pull Requ
104
104
  Options can be passed when running the command from the command line:
105
105
 
106
106
  ```sh
107
- undercover -h
108
107
  Usage: undercover [options]
109
108
  -l, --lcov path LCOV report file path
110
109
  -p, --path path Project directory
111
110
  -g, --git-dir dir Override `.git` with a custom directory
112
111
  -c, --compare ref Generate coverage warnings for all changes after `ref`
112
+ -r, --ruby-syntax ver Ruby syntax version, one of: current, ruby18, ruby19, ruby20, ruby21, ruby22, ruby23, ruby24, ruby25, ruby26, ruby30, ruby31, ruby32, ruby33
113
+ -f, --include-files globs Include files matching specified glob patterns (comma separated). Defaults to '*.rb,*.rake,*.ru,Rakefile'
114
+ -x, --exclude-files globs Skip files matching specified glob patterns (comma separated). Empty by default.
113
115
  -h, --help Prints this help
114
116
  --version Show version
115
117
  ```
@@ -56,10 +56,10 @@ module Undercover
56
56
  end
57
57
 
58
58
  # TODO: refactor to a standalone validator (depending on changeset AND lcov)
59
- # TODO: add specs
60
59
  def validate(lcov_report_path)
61
60
  return :no_changes if files.empty?
62
- return :stale_coverage if last_modified > File.mtime(lcov_report_path)
61
+
62
+ :stale_coverage if last_modified > File.mtime(lcov_report_path)
63
63
  end
64
64
 
65
65
  private
@@ -74,7 +74,9 @@ module Undercover
74
74
  def compare_base_obj
75
75
  return nil unless compare_base
76
76
 
77
- repo.lookup(repo.merge_base(compare_base.to_s, head))
77
+ merge_base = repo.merge_base(compare_base.to_s, head)
78
+ # merge_base may be nil with --depth 1, compare two refs directly
79
+ merge_base ? repo.lookup(merge_base) : repo.rev_parse(compare_base)
78
80
  end
79
81
 
80
82
  def head
@@ -17,21 +17,21 @@ module Undercover
17
17
  def formatted_warnings
18
18
  @results.map.with_index(1) do |res, idx|
19
19
  "🚨 #{idx}) node `#{res.node.name}` type: #{res.node.human_name},\n" +
20
- (' ' * pad_size) + "loc: #{res.file_path_with_lines}," \
21
- " coverage: #{res.coverage_f * 100}%\n" +
20
+ (' ' * pad_size) + "loc: #{res.file_path_with_lines}, " \
21
+ "coverage: #{res.coverage_f * 100}%\n" +
22
22
  res.pretty_print
23
23
  end
24
24
  end
25
25
 
26
26
  def success
27
- "#{Rainbow('undercover').bold.green}: ✅ No coverage" \
28
- ' is missing in latest changes'
27
+ "#{Rainbow('undercover').bold.green}: ✅ No coverage " \
28
+ 'is missing in latest changes'
29
29
  end
30
30
 
31
31
  def warnings_header
32
32
  "#{Rainbow('undercover').bold.red}: " \
33
- '👮‍♂️ some methods have no test coverage! Please add specs for' \
34
- ' methods listed below'
33
+ '👮‍♂️ some methods have no test coverage! Please add specs for ' \
34
+ 'methods listed below'
35
35
  end
36
36
 
37
37
  def pad_size
@@ -4,7 +4,7 @@ require 'optparse'
4
4
  require 'pathname'
5
5
 
6
6
  module Undercover
7
- class Options
7
+ class Options # rubocop:disable Metrics/ClassLength
8
8
  RUN_MODE = [
9
9
  RUN_MODE_DIFF_STRICT = :diff_strict, # warn for changed lines
10
10
  # RUN_MODE_DIFF_FILES = :diff_files, # warn for changed whole files
@@ -17,7 +17,15 @@ module Undercover
17
17
  # OUTPUT_CIRCLEMATOR = :circlemator # posts warnings as review comments
18
18
  ].freeze
19
19
 
20
- attr_accessor :lcov, :path, :git_dir, :compare, :syntax_version
20
+ DEFAULT_FILE_INCLUDE_GLOBS = %w[*.rb *.rake *.ru Rakefile].freeze
21
+
22
+ attr_accessor :lcov,
23
+ :path,
24
+ :git_dir,
25
+ :compare,
26
+ :syntax_version,
27
+ :glob_allow_filters,
28
+ :glob_reject_filters
21
29
 
22
30
  def initialize
23
31
  # TODO: use run modes
@@ -27,6 +35,8 @@ module Undercover
27
35
  # set defaults
28
36
  self.path = '.'
29
37
  self.git_dir = '.git'
38
+ self.glob_allow_filters = DEFAULT_FILE_INCLUDE_GLOBS
39
+ self.glob_reject_filters = []
30
40
  end
31
41
 
32
42
  # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
@@ -51,9 +61,7 @@ module Undercover
51
61
  git_dir_option(opts)
52
62
  compare_option(opts)
53
63
  ruby_syntax_option(opts)
54
- # TODO: parse dem other options and assign to self
55
- # --quiet (skip progress bar)
56
- # --exit-status (do not print report, just exit)
64
+ file_filters(opts)
57
65
  end.parse(args)
58
66
 
59
67
  guess_lcov_path unless lcov
@@ -119,5 +127,18 @@ module Undercover
119
127
  cwd = Pathname.new(File.expand_path(path))
120
128
  self.lcov = File.join(cwd, 'coverage', 'lcov', "#{cwd.split.last}.lcov")
121
129
  end
130
+
131
+ def file_filters(parser)
132
+ desc = 'Include files matching specified glob patterns (comma separated). ' \
133
+ "Defaults to '#{DEFAULT_FILE_INCLUDE_GLOBS.join(',')}'"
134
+ parser.on('-f', '--include-files globs', desc) do |comma_separated_globs|
135
+ self.glob_allow_filters = comma_separated_globs.strip.split(',')
136
+ end
137
+
138
+ desc = 'Skip files matching specified glob patterns (comma separated). Empty by default.'
139
+ parser.on('-x', '--exclude-files globs', desc) do |comma_separated_globs|
140
+ self.glob_reject_filters = comma_separated_globs.strip.split(',')
141
+ end
142
+ end
122
143
  end
123
144
  end
@@ -13,7 +13,7 @@ module Undercover
13
13
  def initialize(node, file_cov, file_path)
14
14
  @node = node
15
15
  @coverage = file_cov.select do |ln, _|
16
- first_line == last_line ? ln == first_line : ln > first_line && ln < last_line
16
+ (node.empty_def? ? ln >= first_line : ln > first_line) && ln < last_line
17
17
  end
18
18
  @file_path = file_path
19
19
  @flagged = false
@@ -27,8 +27,9 @@ module Undercover
27
27
  @flagged
28
28
  end
29
29
 
30
- # rubocop:disable Metrics/CyclomaticComplexity
31
30
  def uncovered?(line_no)
31
+ return true if coverage.empty?
32
+
32
33
  # check branch coverage for line_no
33
34
  coverage.each do |ln, _block, _branch, cov|
34
35
  return true if ln == line_no && cov && cov.zero?
@@ -38,13 +39,14 @@ module Undercover
38
39
  line_cov = coverage.select { |cov| cov.size == 2 }.find { |ln, _cov| ln == line_no }
39
40
  line_cov && line_cov[1].zero?
40
41
  end
41
- # rubocop:enable Metrics/CyclomaticComplexity
42
42
 
43
43
  # Method `coverage_f` returns the total coverage of this Undercover::Result
44
44
  # as a % value, taking into account missing branches. Line coverage will be counted
45
45
  # as 0 if any branch is untested.
46
46
  # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
47
47
  def coverage_f
48
+ return 0.0 if coverage.empty?
49
+
48
50
  lines = {}
49
51
  coverage.each do |ln, block_or_line_cov, _, branch_cov|
50
52
  lines[ln] = 1 unless lines.key?(ln)
@@ -54,7 +56,6 @@ module Undercover
54
56
  lines[ln] = 0
55
57
  end
56
58
  end
57
- return 1.0 if lines.keys.size.zero?
58
59
 
59
60
  (lines.values.sum.to_f / lines.keys.size).round(4)
60
61
  end
@@ -84,17 +85,17 @@ module Undercover
84
85
  pad = node.last_line.to_s.length
85
86
  pretty_print_lines.map do |covered, (num, line)|
86
87
  formatted_line = "#{num.to_s.rjust(pad)}: #{line}"
87
- if line.strip.length.zero?
88
+ if line.strip.empty?
88
89
  Rainbow(formatted_line).darkgray.dark
89
90
  elsif covered.nil?
90
- Rainbow(formatted_line).darkgray.dark + \
91
+ Rainbow(formatted_line).darkgray.dark +
91
92
  Rainbow(' hits: n/a').italic.darkgray.dark
92
93
  elsif covered.positive?
93
- Rainbow(formatted_line).green + \
94
+ Rainbow(formatted_line).green +
94
95
  Rainbow(" hits: #{covered}").italic.darkgray.dark + \
95
96
  count_covered_branches(num)
96
97
  elsif covered.zero?
97
- Rainbow(formatted_line).red + \
98
+ Rainbow(formatted_line).red +
98
99
  Rainbow(" hits: #{covered}").italic.darkgray.dark + \
99
100
  count_covered_branches(num)
100
101
  end
@@ -107,8 +108,8 @@ module Undercover
107
108
  end
108
109
 
109
110
  def inspect
110
- "#<Undercover::Report::Result:#{object_id}" \
111
- " name: #{node.name}, coverage: #{coverage_f}>"
111
+ "#<Undercover::Report::Result:#{object_id} " \
112
+ "name: #{node.name}, coverage: #{coverage_f}>"
112
113
  end
113
114
  alias to_s inspect
114
115
 
@@ -119,10 +120,10 @@ module Undercover
119
120
  branches = coverage.select { |cov| cov.size == 4 && cov[0] == line_number }
120
121
  count_covered = branches.count { |cov| cov[3].positive? }
121
122
 
122
- return '' if branches.size.zero?
123
+ return '' if branches.empty?
123
124
 
124
125
  if count_covered < branches.size
125
- Rainbow(' branches: ').italic.darkgray.dark + \
126
+ Rainbow(' branches: ').italic.darkgray.dark +
126
127
  Rainbow("#{count_covered}/#{branches.size}").italic.red
127
128
  else
128
129
  Rainbow(" branches: #{count_covered}/#{branches.size}").italic.darkgray.dark
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Undercover
4
- VERSION = '0.4.7'
4
+ VERSION = '0.6.0'
5
5
  end
data/lib/undercover.rb CHANGED
@@ -22,7 +22,8 @@ module Undercover
22
22
  attr_reader :changeset,
23
23
  :lcov,
24
24
  :results,
25
- :code_dir
25
+ :code_dir,
26
+ :glob_filters
26
27
 
27
28
  # Initializes a new Undercover::Report
28
29
  #
@@ -32,11 +33,15 @@ module Undercover
32
33
  @lcov = LcovParser.parse(File.open(opts.lcov))
33
34
  @code_dir = opts.path
34
35
  @changeset = changeset.update
36
+ @glob_filters = {
37
+ allow: opts.glob_allow_filters,
38
+ reject: opts.glob_reject_filters
39
+ }
35
40
  @loaded_files = {}
36
41
  @results = {}
37
42
  end
38
43
 
39
- # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity
44
+ # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
40
45
  def build
41
46
  changeset.each_changed_line do |filepath, line_no|
42
47
  dist_from_line_no = lambda do |res|
@@ -50,6 +55,7 @@ module Undercover
50
55
  dist_from_line_no_sorter = lambda do |res1, res2|
51
56
  dist_from_line_no[res1] <=> dist_from_line_no[res2]
52
57
  end
58
+
53
59
  load_and_parse_file(filepath)
54
60
 
55
61
  next unless loaded_files[filepath]
@@ -61,7 +67,7 @@ module Undercover
61
67
  end
62
68
  self
63
69
  end
64
- # rubocop:enable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity
70
+ # rubocop:enable Metrics/MethodLength, Metrics/AbcSize
65
71
 
66
72
  def build_warnings
67
73
  warn('Undercover::Report#build_warnings is deprecated! ' \
@@ -92,7 +98,8 @@ module Undercover
92
98
  return if loaded_files[key]
93
99
 
94
100
  coverage = lcov.coverage(filepath)
95
- return if coverage.empty?
101
+
102
+ return unless include_file?(filepath)
96
103
 
97
104
  root_ast = Imagen::Node::Root.new.build_from_file(
98
105
  File.join(code_dir, filepath)
@@ -106,5 +113,10 @@ module Undercover
106
113
  end
107
114
  end
108
115
  # rubocop:enable Metrics/MethodLength, Metrics/AbcSize
116
+
117
+ def include_file?(filepath)
118
+ fnmatch = proc { |glob| File.fnmatch(glob, filepath) }
119
+ glob_filters[:allow].any?(fnmatch) && glob_filters[:reject].none?(fnmatch)
120
+ end
109
121
  end
110
122
  end
data/undercover.gemspec CHANGED
@@ -4,15 +4,14 @@ lib = File.expand_path('lib', __dir__)
4
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
5
  require 'undercover/version'
6
6
 
7
- # rubocop:disable Metrics/BlockLength
8
7
  Gem::Specification.new do |spec|
9
8
  spec.name = 'undercover'
10
9
  spec.version = Undercover::VERSION
11
10
  spec.authors = ['Jan Grodowski']
12
11
  spec.email = ['jgrodowski@gmail.com']
13
12
 
14
- spec.summary = 'Actionable code coverage - detects untested' \
15
- ' code blocks in recent changes'
13
+ spec.summary = 'Actionable code coverage - detects untested ' \
14
+ 'code blocks in recent changes'
16
15
  spec.homepage = 'https://github.com/grodowski/undercover'
17
16
  spec.license = 'MIT'
18
17
  spec.metadata = {
@@ -26,20 +25,10 @@ Gem::Specification.new do |spec|
26
25
  spec.executables = spec.files.grep(/^bin\//) { |f| File.basename(f) }
27
26
  spec.require_paths = ['lib']
28
27
 
29
- spec.required_ruby_version = '>= 2.7.0'
28
+ spec.required_ruby_version = '>= 3.0.0'
30
29
 
31
- spec.add_dependency 'imagen', '>= 0.1.8'
30
+ spec.add_dependency 'bigdecimal'
31
+ spec.add_dependency 'imagen', '>= 0.2.0'
32
32
  spec.add_dependency 'rainbow', '>= 2.1', '< 4.0'
33
- spec.add_dependency 'rugged', '>= 0.27', '< 1.7'
34
-
35
- spec.add_development_dependency 'bundler'
36
- spec.add_development_dependency 'pry'
37
- spec.add_development_dependency 'rake', '~> 13.0'
38
- spec.add_development_dependency 'rspec', '~> 3.0'
39
- spec.add_development_dependency 'rubocop', '~> 1.28.2'
40
- spec.add_development_dependency 'simplecov'
41
- spec.add_development_dependency 'simplecov-html'
42
- spec.add_development_dependency 'simplecov-lcov', '~> 0.8'
43
- spec.add_development_dependency 'timecop'
33
+ spec.add_dependency 'rugged', '>= 0.27', '< 1.8'
44
34
  end
45
- # rubocop:enable Metrics/BlockLength
metadata CHANGED
@@ -1,29 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: undercover
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.7
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jan Grodowski
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-01-08 00:00:00.000000000 Z
11
+ date: 2024-12-12 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bigdecimal
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: imagen
15
29
  requirement: !ruby/object:Gem::Requirement
16
30
  requirements:
17
31
  - - ">="
18
32
  - !ruby/object:Gem::Version
19
- version: 0.1.8
33
+ version: 0.2.0
20
34
  type: :runtime
21
35
  prerelease: false
22
36
  version_requirements: !ruby/object:Gem::Requirement
23
37
  requirements:
24
38
  - - ">="
25
39
  - !ruby/object:Gem::Version
26
- version: 0.1.8
40
+ version: 0.2.0
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: rainbow
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -53,7 +67,7 @@ dependencies:
53
67
  version: '0.27'
54
68
  - - "<"
55
69
  - !ruby/object:Gem::Version
56
- version: '1.7'
70
+ version: '1.8'
57
71
  type: :runtime
58
72
  prerelease: false
59
73
  version_requirements: !ruby/object:Gem::Requirement
@@ -63,133 +77,7 @@ dependencies:
63
77
  version: '0.27'
64
78
  - - "<"
65
79
  - !ruby/object:Gem::Version
66
- version: '1.7'
67
- - !ruby/object:Gem::Dependency
68
- name: bundler
69
- requirement: !ruby/object:Gem::Requirement
70
- requirements:
71
- - - ">="
72
- - !ruby/object:Gem::Version
73
- version: '0'
74
- type: :development
75
- prerelease: false
76
- version_requirements: !ruby/object:Gem::Requirement
77
- requirements:
78
- - - ">="
79
- - !ruby/object:Gem::Version
80
- version: '0'
81
- - !ruby/object:Gem::Dependency
82
- name: pry
83
- requirement: !ruby/object:Gem::Requirement
84
- requirements:
85
- - - ">="
86
- - !ruby/object:Gem::Version
87
- version: '0'
88
- type: :development
89
- prerelease: false
90
- version_requirements: !ruby/object:Gem::Requirement
91
- requirements:
92
- - - ">="
93
- - !ruby/object:Gem::Version
94
- version: '0'
95
- - !ruby/object:Gem::Dependency
96
- name: rake
97
- requirement: !ruby/object:Gem::Requirement
98
- requirements:
99
- - - "~>"
100
- - !ruby/object:Gem::Version
101
- version: '13.0'
102
- type: :development
103
- prerelease: false
104
- version_requirements: !ruby/object:Gem::Requirement
105
- requirements:
106
- - - "~>"
107
- - !ruby/object:Gem::Version
108
- version: '13.0'
109
- - !ruby/object:Gem::Dependency
110
- name: rspec
111
- requirement: !ruby/object:Gem::Requirement
112
- requirements:
113
- - - "~>"
114
- - !ruby/object:Gem::Version
115
- version: '3.0'
116
- type: :development
117
- prerelease: false
118
- version_requirements: !ruby/object:Gem::Requirement
119
- requirements:
120
- - - "~>"
121
- - !ruby/object:Gem::Version
122
- version: '3.0'
123
- - !ruby/object:Gem::Dependency
124
- name: rubocop
125
- requirement: !ruby/object:Gem::Requirement
126
- requirements:
127
- - - "~>"
128
- - !ruby/object:Gem::Version
129
- version: 1.28.2
130
- type: :development
131
- prerelease: false
132
- version_requirements: !ruby/object:Gem::Requirement
133
- requirements:
134
- - - "~>"
135
- - !ruby/object:Gem::Version
136
- version: 1.28.2
137
- - !ruby/object:Gem::Dependency
138
- name: simplecov
139
- requirement: !ruby/object:Gem::Requirement
140
- requirements:
141
- - - ">="
142
- - !ruby/object:Gem::Version
143
- version: '0'
144
- type: :development
145
- prerelease: false
146
- version_requirements: !ruby/object:Gem::Requirement
147
- requirements:
148
- - - ">="
149
- - !ruby/object:Gem::Version
150
- version: '0'
151
- - !ruby/object:Gem::Dependency
152
- name: simplecov-html
153
- requirement: !ruby/object:Gem::Requirement
154
- requirements:
155
- - - ">="
156
- - !ruby/object:Gem::Version
157
- version: '0'
158
- type: :development
159
- prerelease: false
160
- version_requirements: !ruby/object:Gem::Requirement
161
- requirements:
162
- - - ">="
163
- - !ruby/object:Gem::Version
164
- version: '0'
165
- - !ruby/object:Gem::Dependency
166
- name: simplecov-lcov
167
- requirement: !ruby/object:Gem::Requirement
168
- requirements:
169
- - - "~>"
170
- - !ruby/object:Gem::Version
171
- version: '0.8'
172
- type: :development
173
- prerelease: false
174
- version_requirements: !ruby/object:Gem::Requirement
175
- requirements:
176
- - - "~>"
177
- - !ruby/object:Gem::Version
178
- version: '0.8'
179
- - !ruby/object:Gem::Dependency
180
- name: timecop
181
- requirement: !ruby/object:Gem::Requirement
182
- requirements:
183
- - - ">="
184
- - !ruby/object:Gem::Version
185
- version: '0'
186
- type: :development
187
- prerelease: false
188
- version_requirements: !ruby/object:Gem::Requirement
189
- requirements:
190
- - - ">="
191
- - !ruby/object:Gem::Version
192
- version: '0'
80
+ version: '1.8'
193
81
  description:
194
82
  email:
195
83
  - jgrodowski@gmail.com
@@ -205,6 +93,7 @@ files:
205
93
  - ".overcommit.yml"
206
94
  - ".rspec"
207
95
  - ".rubocop.yml"
96
+ - ".tool-versions"
208
97
  - CHANGELOG.md
209
98
  - Gemfile
210
99
  - LICENSE.txt
@@ -240,14 +129,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
240
129
  requirements:
241
130
  - - ">="
242
131
  - !ruby/object:Gem::Version
243
- version: 2.7.0
132
+ version: 3.0.0
244
133
  required_rubygems_version: !ruby/object:Gem::Requirement
245
134
  requirements:
246
135
  - - ">="
247
136
  - !ruby/object:Gem::Version
248
137
  version: '0'
249
138
  requirements: []
250
- rubygems_version: 3.5.4
139
+ rubygems_version: 3.5.11
251
140
  signing_key:
252
141
  specification_version: 4
253
142
  summary: Actionable code coverage - detects untested code blocks in recent changes