undercover 0.4.7 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.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
|

|
|
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
|