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 +4 -4
- data/.github/dependabot.yml +4 -0
- data/.github/workflows/ruby.yml +8 -9
- data/.rubocop.yml +8 -1
- data/.tool-versions +1 -0
- data/CHANGELOG.md +18 -2
- data/Gemfile +11 -0
- data/README.md +4 -2
- data/lib/undercover/changeset.rb +5 -3
- data/lib/undercover/formatter.rb +6 -6
- data/lib/undercover/options.rb +26 -5
- data/lib/undercover/result.rb +13 -12
- data/lib/undercover/version.rb +1 -1
- data/lib/undercover.rb +16 -4
- data/undercover.gemspec +6 -17
- metadata +23 -134
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c860e600589d92698fa5df94b1b8fe9283cbb00cdc595410b9c3a413d74b3095
|
4
|
+
data.tar.gz: e2c26b709c691201f473846e0cb6a7fa6844c5d1dc73169ca533d95482182f6c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ace70eb4f75d2d57bda9d906925a7b5525c5a67520380ba0327a5344ed6718b79ea2587a5a0fb4d2a09d430d09b30eb2d1ac63c503be17197ff9c6455ab12b00
|
7
|
+
data.tar.gz: a2ec9a3b4d27cb9eaa7b4595f71ff9b12108e939864a6f5279aece22cd728e358dd50b16e63d0537780154e3ffd20e0712bce8322a8591e4f08f70d9d6818145
|
data/.github/dependabot.yml
CHANGED
data/.github/workflows/ruby.yml
CHANGED
@@ -5,9 +5,9 @@ jobs:
|
|
5
5
|
runs-on: ubuntu-latest
|
6
6
|
strategy:
|
7
7
|
matrix:
|
8
|
-
ruby: ['3.
|
8
|
+
ruby: ['3.3', '3.0']
|
9
9
|
steps:
|
10
|
-
- uses: actions/checkout@
|
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 -
|
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@
|
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@
|
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 $
|
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:
|
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.
|
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.
|
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
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
|
```
|
data/lib/undercover/changeset.rb
CHANGED
@@ -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
|
-
|
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.
|
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
|
data/lib/undercover/formatter.rb
CHANGED
@@ -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
|
-
"
|
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
|
-
'
|
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
|
-
'
|
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
|
data/lib/undercover/options.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
data/lib/undercover/result.rb
CHANGED
@@ -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
|
-
|
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.
|
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
|
-
"
|
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.
|
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
|
data/lib/undercover/version.rb
CHANGED
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
|
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
|
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
|
-
|
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
|
-
'
|
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 = '>=
|
28
|
+
spec.required_ruby_version = '>= 3.0.0'
|
30
29
|
|
31
|
-
spec.add_dependency '
|
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.
|
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
|
+
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-
|
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.
|
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.
|
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.
|
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.
|
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:
|
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.
|
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
|