undercover 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +4 -0
- data/.travis.yml +5 -1
- data/Gemfile +2 -3
- data/Gemfile.lock +18 -3
- data/README.md +73 -7
- data/Rakefile +10 -3
- data/bin/undercover +1 -1
- data/lib/undercover.rb +8 -8
- data/lib/undercover/changeset.rb +8 -3
- data/lib/undercover/cli.rb +3 -1
- data/lib/undercover/formatter.rb +1 -1
- data/lib/undercover/version.rb +3 -1
- data/screenshot_success.png +0 -0
- data/screenshot_warnings.png +0 -0
- data/undercover.gemspec +20 -16
- metadata +37 -11
- data/bin/console +0 -7
- data/bin/setup +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 95823e9c99d27f235ecf164326d14dfaba5ab716
|
4
|
+
data.tar.gz: 6626a7f1d7a6f01a3639f1f682064a30e2fee79c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 909e534984be8f7db602d5863ee31f1e986acaab8be58b84fd870e51f74ffe744a7625501eccca3f8cda2aec5a7a9dd0a6001cc6b1ca98472a0169e943557918
|
7
|
+
data.tar.gz: 6525467a27c472d0b24aa17cec6a986252ab649c8dfe514585dc405f8775803beac8d1aa7840ffc21af362a4bbb804bb890f41c1aca90ca9eeb56ba2b467247b
|
data/.rubocop.yml
CHANGED
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
undercover (0.1.
|
5
|
-
imagen (~> 0.1.
|
4
|
+
undercover (0.1.1)
|
5
|
+
imagen (~> 0.1.1)
|
6
6
|
rainbow (~> 3.0.0)
|
7
7
|
rugged (~> 0.27.0)
|
8
8
|
|
@@ -13,12 +13,14 @@ GEM
|
|
13
13
|
coderay (1.1.2)
|
14
14
|
diff-lcs (1.3)
|
15
15
|
docile (1.3.0)
|
16
|
-
imagen (0.1.
|
16
|
+
imagen (0.1.1)
|
17
17
|
parser
|
18
18
|
json (2.1.0)
|
19
19
|
method_source (0.9.0)
|
20
|
+
parallel (1.12.1)
|
20
21
|
parser (2.5.1.0)
|
21
22
|
ast (~> 2.4.0)
|
23
|
+
powerpack (0.1.1)
|
22
24
|
pry (0.11.3)
|
23
25
|
coderay (~> 1.1.0)
|
24
26
|
method_source (~> 0.9.0)
|
@@ -37,6 +39,14 @@ GEM
|
|
37
39
|
diff-lcs (>= 1.2.0, < 2.0)
|
38
40
|
rspec-support (~> 3.7.0)
|
39
41
|
rspec-support (3.7.1)
|
42
|
+
rubocop (0.55.0)
|
43
|
+
parallel (~> 1.10)
|
44
|
+
parser (>= 2.5)
|
45
|
+
powerpack (~> 0.1)
|
46
|
+
rainbow (>= 2.2.2, < 4.0)
|
47
|
+
ruby-progressbar (~> 1.7)
|
48
|
+
unicode-display_width (~> 1.0, >= 1.0.1)
|
49
|
+
ruby-progressbar (1.9.0)
|
40
50
|
rugged (0.27.0)
|
41
51
|
simplecov (0.16.1)
|
42
52
|
docile (~> 1.1)
|
@@ -44,17 +54,22 @@ GEM
|
|
44
54
|
simplecov-html (~> 0.10.0)
|
45
55
|
simplecov-html (0.10.2)
|
46
56
|
simplecov-lcov (0.7.0)
|
57
|
+
timecop (0.9.1)
|
58
|
+
unicode-display_width (1.3.2)
|
47
59
|
|
48
60
|
PLATFORMS
|
49
61
|
ruby
|
62
|
+
x86_64-darwin-17
|
50
63
|
|
51
64
|
DEPENDENCIES
|
52
65
|
bundler (~> 1.16)
|
53
66
|
pry
|
54
67
|
rake (~> 10.0)
|
55
68
|
rspec (~> 3.0)
|
69
|
+
rubocop (~> 0.55.0)
|
56
70
|
simplecov
|
57
71
|
simplecov-lcov
|
72
|
+
timecop
|
58
73
|
undercover!
|
59
74
|
|
60
75
|
BUNDLED WITH
|
data/README.md
CHANGED
@@ -1,11 +1,21 @@
|
|
1
|
-
#
|
1
|
+
# undercover 👮♂️
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
**RuboCop for code coverage**
|
4
|
+
|
5
|
+
Meaningful warnings for methods and classes which lack testing, using data from coverage reports, git metadata and a parsed structure of your Ruby codebase. `undercover` automates the coverage feedback loop and makes sure no code review passes without tests.
|
6
|
+
|
7
|
+
A sample output of `undercover` ran before a commit may look like this:
|
5
8
|
|
6
|
-
|
9
|
+

|
7
10
|
|
8
|
-
|
11
|
+
And like this, given that specs were added:
|
12
|
+
|
13
|
+

|
14
|
+
|
15
|
+
The project is in an early phase, so please expect the unexpected and [report any problems or feedback as issues](https://github.com/grodowski/undercover/issues).
|
16
|
+
|
17
|
+
[](https://travis-ci.org/grodowski/undercover)
|
18
|
+
[](https://codebeat.co/projects/github-com-grodowski-undercover-master)
|
9
19
|
|
10
20
|
## Installation
|
11
21
|
|
@@ -23,9 +33,65 @@ Or install it yourself as:
|
|
23
33
|
|
24
34
|
$ gem install undercover
|
25
35
|
|
36
|
+
## Setting up required LCOV reporting
|
37
|
+
|
38
|
+
Undercover depends on a git diff, code structure generated by [`imagen`](https://github.com/grodowski/imagen_rb) and a coverage report in LCOV format.
|
39
|
+
|
40
|
+
To make your specs compatible with `undercover` by providing an LCOV report, please add `simplecov` and `simplecov-lcov` to your test setup. Example for rspec:
|
41
|
+
|
42
|
+
```ruby
|
43
|
+
# Gemfile
|
44
|
+
group :test do
|
45
|
+
gem 'simplecov'
|
46
|
+
gem 'simplecov-lcov'
|
47
|
+
end
|
48
|
+
|
49
|
+
# the very top of spec_helper.rb
|
50
|
+
require 'simplecov'
|
51
|
+
require 'simplecov-lcov'
|
52
|
+
SimpleCov::Formatter::LcovFormatter.config.report_with_single_file = true
|
53
|
+
SimpleCov.formatter = SimpleCov::Formatter::LcovFormatter
|
54
|
+
SimpleCov.start do
|
55
|
+
add_filter(/^\/spec\//)
|
56
|
+
end
|
57
|
+
|
58
|
+
require 'undercover'
|
59
|
+
|
60
|
+
# ...
|
61
|
+
```
|
62
|
+
|
26
63
|
## Usage
|
27
64
|
|
28
|
-
|
65
|
+
### Compare method and class coverage with latest commit
|
66
|
+
|
67
|
+
```sh
|
68
|
+
undercover
|
69
|
+
```
|
70
|
+
|
71
|
+
### Compare with branch/ref
|
72
|
+
|
73
|
+
Undercover will list all methods and classes that haven't been covered in specs and have been added since a given git `ref`. Use the `-c --compare ref` flag to specify a git ref (commit hash, branch name, tag) to compare against.
|
74
|
+
|
75
|
+
**This is a recommended usage for CI/CD build environments**, as `undercover` will `exit 1` if there are any warnings.
|
76
|
+
|
77
|
+
```sh
|
78
|
+
undercover --compare master
|
79
|
+
```
|
80
|
+
|
81
|
+
### Options
|
82
|
+
|
83
|
+
```sh
|
84
|
+
undercover -h
|
85
|
+
Usage: undercover [options]
|
86
|
+
-l, --lcov path LCOV report file path
|
87
|
+
-p, --path path Project directory
|
88
|
+
-g, --git-dir dir Override `.git` with a custom directory
|
89
|
+
-c, --compare ref Generate coverage warnings for all changes after `ref`
|
90
|
+
-h, --help Prints this help
|
91
|
+
--version Show version
|
92
|
+
```
|
93
|
+
|
94
|
+
The defaults assume that the program is run from the top level of the project directory.
|
29
95
|
|
30
96
|
## Development
|
31
97
|
|
@@ -35,7 +101,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
35
101
|
|
36
102
|
## Contributing
|
37
103
|
|
38
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
104
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/grodowski/undercover.
|
39
105
|
|
40
106
|
## License
|
41
107
|
|
data/Rakefile
CHANGED
@@ -1,6 +1,13 @@
|
|
1
|
-
|
2
|
-
require "rspec/core/rake_task"
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
3
|
+
require 'bundler/gem_tasks'
|
4
|
+
require 'rspec/core/rake_task'
|
5
|
+
require 'rubocop/rake_task'
|
6
|
+
|
7
|
+
desc 'Run RuboCop'
|
8
|
+
RuboCop::RakeTask.new(:rubocop)
|
9
|
+
|
10
|
+
desc 'Run Tests'
|
4
11
|
RSpec::Core::RakeTask.new(:spec)
|
5
12
|
|
6
|
-
task :
|
13
|
+
task default: %i[rubocop spec]
|
data/bin/undercover
CHANGED
data/lib/undercover.rb
CHANGED
@@ -19,7 +19,6 @@ module Undercover
|
|
19
19
|
def_delegators :changeset, :validate
|
20
20
|
|
21
21
|
attr_reader :changeset,
|
22
|
-
:code_structure,
|
23
22
|
:lcov,
|
24
23
|
:results
|
25
24
|
|
@@ -27,8 +26,6 @@ module Undercover
|
|
27
26
|
# add dependecy on "options" for all opts (dirs, git_dir, etc)
|
28
27
|
def initialize(lcov_report_path, code_dir, git_dir: '.git', compare: nil)
|
29
28
|
@lcov = LcovParser.parse(File.open(lcov_report_path))
|
30
|
-
# TODO: optimise by building changeset structure only!
|
31
|
-
@code_structure = Imagen.from_local(code_dir)
|
32
29
|
@changeset = Changeset.new(File.join(code_dir, git_dir), compare).update
|
33
30
|
@results = Hash.new { |hsh, key| hsh[key] = [] }
|
34
31
|
end
|
@@ -71,13 +68,16 @@ module Undercover
|
|
71
68
|
|
72
69
|
private
|
73
70
|
|
71
|
+
# TODO: some of this could be moved to the imagen gem
|
72
|
+
# TODO: should that start from changeset.file_paths?
|
73
|
+
# this way we could report things that weren't even loaded in any spec,
|
74
|
+
# so is this still good idea? (Rakefile, .gemspec etc)
|
74
75
|
def each_result_arg
|
75
|
-
|
76
|
-
->(node) { node.file_path.end_with?(path) }
|
77
|
-
end
|
78
|
-
|
76
|
+
match_all = ->(_) { true }
|
79
77
|
lcov.source_files.each do |filename, coverage|
|
80
|
-
|
78
|
+
ast = Imagen::Node::Root.new
|
79
|
+
Imagen::Visitor.traverse(Parser::CurrentRuby.parse_file(filename), ast)
|
80
|
+
ast.children[0].find_all(match_all).each do |node|
|
81
81
|
yield(filename, coverage, node)
|
82
82
|
end
|
83
83
|
end
|
data/lib/undercover/changeset.rb
CHANGED
@@ -35,13 +35,18 @@ module Undercover
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def last_modified
|
38
|
-
mod =
|
39
|
-
|
40
|
-
File.
|
38
|
+
mod = file_paths.map do |f|
|
39
|
+
path = File.join(repo.workdir, f)
|
40
|
+
next T_ZERO unless File.exist?(path)
|
41
|
+
File.mtime(path)
|
41
42
|
end.max
|
42
43
|
mod || T_ZERO
|
43
44
|
end
|
44
45
|
|
46
|
+
def file_paths
|
47
|
+
files.keys.sort
|
48
|
+
end
|
49
|
+
|
45
50
|
def each_changed_line
|
46
51
|
files.each do |filepath, line_numbers|
|
47
52
|
line_numbers.each { |ln| yield filepath, ln }
|
data/lib/undercover/cli.rb
CHANGED
@@ -14,6 +14,8 @@ module Undercover
|
|
14
14
|
no_changes: Rainbow('✅ No reportable changes').green
|
15
15
|
}.freeze
|
16
16
|
|
17
|
+
WARNINGS_TO_EXITCODE = {stale_coverage: 1, no_changes: 0}.freeze
|
18
|
+
|
17
19
|
# TODO: add executable in ./bin later
|
18
20
|
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
19
21
|
def self.run(args)
|
@@ -28,7 +30,7 @@ module Undercover
|
|
28
30
|
error = report.validate(opts.lcov)
|
29
31
|
if error
|
30
32
|
puts(WARNINGS_TO_S[error])
|
31
|
-
return
|
33
|
+
return WARNINGS_TO_EXITCODE[error]
|
32
34
|
end
|
33
35
|
|
34
36
|
warnings = report.build_warnings
|
data/lib/undercover/formatter.rb
CHANGED
@@ -15,7 +15,7 @@ module Undercover
|
|
15
15
|
|
16
16
|
def formatted_warnings
|
17
17
|
@results.map.with_index(1) do |res, idx|
|
18
|
-
"🚨 #{idx}) node `#{res.node.name}` type: #{res.node.
|
18
|
+
"🚨 #{idx}) node `#{res.node.name}` type: #{res.node.human_name},\n" +
|
19
19
|
(' ' * pad_size) + "loc: #{res.file_path_with_lines}," \
|
20
20
|
" coverage: #{res.coverage_f * 100}%\n" +
|
21
21
|
res.pretty_print
|
data/lib/undercover/version.rb
CHANGED
Binary file
|
Binary file
|
data/undercover.gemspec
CHANGED
@@ -1,33 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
|
2
|
-
lib = File.expand_path(
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require
|
5
|
+
require 'undercover/version'
|
5
6
|
|
6
7
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
8
|
+
spec.name = 'undercover'
|
8
9
|
spec.version = Undercover::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
10
|
+
spec.authors = ['Jan Grodowski']
|
11
|
+
spec.email = ['jgrodowski@gmail.com']
|
11
12
|
|
12
|
-
spec.summary =
|
13
|
-
|
14
|
-
spec.
|
13
|
+
spec.summary = 'Actionable code coverage - detects untested' \
|
14
|
+
' code blocks in recent changes'
|
15
|
+
spec.homepage = 'https://github.com/grodowski/undercover'
|
16
|
+
spec.license = 'MIT'
|
15
17
|
|
16
18
|
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
17
|
-
f.match(
|
19
|
+
f.match(/^(test|spec|features)\//)
|
18
20
|
end
|
19
|
-
spec.bindir =
|
20
|
-
spec.executables = spec.files.grep(
|
21
|
-
spec.require_paths = [
|
21
|
+
spec.bindir = 'bin'
|
22
|
+
spec.executables = spec.files.grep(/^bin\//) { |f| File.basename(f) }
|
23
|
+
spec.require_paths = ['lib']
|
22
24
|
|
23
|
-
spec.add_dependency 'imagen', '~> 0.1.
|
25
|
+
spec.add_dependency 'imagen', '~> 0.1.1'
|
24
26
|
spec.add_dependency 'rainbow', '~> 3.0.0'
|
25
27
|
spec.add_dependency 'rugged', '~> 0.27.0'
|
26
28
|
|
27
|
-
spec.add_development_dependency
|
28
|
-
spec.add_development_dependency "rake", "~> 10.0"
|
29
|
-
spec.add_development_dependency "rspec", "~> 3.0"
|
29
|
+
spec.add_development_dependency 'bundler', '~> 1.16'
|
30
30
|
spec.add_development_dependency 'pry'
|
31
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
32
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
33
|
+
spec.add_development_dependency 'rubocop', '~> 0.55.0'
|
31
34
|
spec.add_development_dependency 'simplecov'
|
32
35
|
spec.add_development_dependency 'simplecov-lcov'
|
36
|
+
spec.add_development_dependency 'timecop'
|
33
37
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: undercover
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jan Grodowski
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-05-
|
11
|
+
date: 2018-05-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: imagen
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.1.
|
19
|
+
version: 0.1.1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.1.
|
26
|
+
version: 0.1.1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rainbow
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '1.16'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: pry
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: rake
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -95,7 +109,21 @@ dependencies:
|
|
95
109
|
- !ruby/object:Gem::Version
|
96
110
|
version: '3.0'
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
112
|
+
name: rubocop
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 0.55.0
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 0.55.0
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: simplecov
|
99
127
|
requirement: !ruby/object:Gem::Requirement
|
100
128
|
requirements:
|
101
129
|
- - ">="
|
@@ -109,7 +137,7 @@ dependencies:
|
|
109
137
|
- !ruby/object:Gem::Version
|
110
138
|
version: '0'
|
111
139
|
- !ruby/object:Gem::Dependency
|
112
|
-
name: simplecov
|
140
|
+
name: simplecov-lcov
|
113
141
|
requirement: !ruby/object:Gem::Requirement
|
114
142
|
requirements:
|
115
143
|
- - ">="
|
@@ -123,7 +151,7 @@ dependencies:
|
|
123
151
|
- !ruby/object:Gem::Version
|
124
152
|
version: '0'
|
125
153
|
- !ruby/object:Gem::Dependency
|
126
|
-
name:
|
154
|
+
name: timecop
|
127
155
|
requirement: !ruby/object:Gem::Requirement
|
128
156
|
requirements:
|
129
157
|
- - ">="
|
@@ -140,8 +168,6 @@ description:
|
|
140
168
|
email:
|
141
169
|
- jgrodowski@gmail.com
|
142
170
|
executables:
|
143
|
-
- console
|
144
|
-
- setup
|
145
171
|
- undercover
|
146
172
|
extensions: []
|
147
173
|
extra_rdoc_files: []
|
@@ -155,8 +181,6 @@ files:
|
|
155
181
|
- LICENSE.txt
|
156
182
|
- README.md
|
157
183
|
- Rakefile
|
158
|
-
- bin/console
|
159
|
-
- bin/setup
|
160
184
|
- bin/undercover
|
161
185
|
- lib/undercover.rb
|
162
186
|
- lib/undercover/changeset.rb
|
@@ -166,6 +190,8 @@ files:
|
|
166
190
|
- lib/undercover/options.rb
|
167
191
|
- lib/undercover/result.rb
|
168
192
|
- lib/undercover/version.rb
|
193
|
+
- screenshot_success.png
|
194
|
+
- screenshot_warnings.png
|
169
195
|
- undercover.gemspec
|
170
196
|
homepage: https://github.com/grodowski/undercover
|
171
197
|
licenses:
|
data/bin/console
DELETED