rubycritic 4.1.0 → 4.2.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/CHANGELOG.md +13 -5
- data/CONTRIBUTING.md +1 -0
- data/README.md +10 -18
- data/ROADMAP.md +2 -2
- data/lib/rubycritic/analysers/coverage.rb +118 -0
- data/lib/rubycritic/analysers_runner.rb +3 -1
- data/lib/rubycritic/cli/options.rb +1 -1
- data/lib/rubycritic/cli/options/file.rb +2 -2
- data/lib/rubycritic/core/analysed_module.rb +8 -9
- data/lib/rubycritic/generators/html/assets/javascripts/application.js +13 -0
- data/lib/rubycritic/generators/html/assets/stylesheets/application.css +4 -4
- data/lib/rubycritic/generators/html/simple_cov_index.rb +44 -0
- data/lib/rubycritic/generators/html/templates/code_index.html.erb +4 -4
- data/lib/rubycritic/generators/html/templates/layouts/application.html.erb +3 -0
- data/lib/rubycritic/generators/html/templates/simple_cov_index.html.erb +44 -0
- data/lib/rubycritic/generators/html_report.rb +6 -1
- data/lib/rubycritic/version.rb +1 -1
- metadata +33 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 520355bc0ee6977875d0cf7673e2154ee8d09287b0b26b7a2311b6ead59a849b
|
4
|
+
data.tar.gz: 6dff21b60ac7ee50ae8aaa493b064413af17e0ec40088f555ffc518f82b53bba
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f37353c25acf1d2212075c485456bc1115dff187a80189fe552e02890fd07887e471aae4ccdfbc4c9b448f1e0a224f60f34cda5f273ad5bed328c6c77a18e527
|
7
|
+
data.tar.gz: 5ad4a97670c4416dbd85f268a20c37bb02aa16278f408a20d3878913ce79bd0ea12602a874ab1d4a2db53d8da1984f8712d00420e2d69f558b0264decfadb88a
|
data/CHANGELOG.md
CHANGED
@@ -1,8 +1,14 @@
|
|
1
|
-
# master [(unreleased)](https://github.com/whitesmith/rubycritic/compare/v4.
|
1
|
+
# master [(unreleased)](https://github.com/whitesmith/rubycritic/compare/v4.2.0...master)
|
2
2
|
|
3
|
-
|
3
|
+
# v4.2.0 / 2019-10-22 [(commits)](https://github.com/whitesmith/rubycritic/compare/v4.1.0...v4.2.0)
|
4
4
|
|
5
|
-
|
5
|
+
* [BUGFIX] Fix CSS alignment of columns for when --suppress-ratings is used on the code page (by [@jbampton][])
|
6
|
+
* [BUGFIX] Fix typo in example `.rubycritic.yml` (by [@Adre][])
|
7
|
+
* [BUGFIX] Fix YAML configuration file 'formats' processing (by [@cvoltz][])
|
8
|
+
* [FEATURE] Add Markdown linting to the Travis build by using the Rubygem `markdownlint` (by [@jbampton][])
|
9
|
+
* [FEATURE] Add new report for SimpleCov (by [@etagwerker][])
|
10
|
+
|
11
|
+
# v4.1.0 / 2019-06-07 [(commits)](https://github.com/whitesmith/rubycritic/compare/v4.0.2...v4.1.0)
|
6
12
|
|
7
13
|
* [BUGFIX] Assorted fixes in HTML report (by [@jbampton][])
|
8
14
|
* [BUGFIX] Fix duplicate HTML5 DOCTYPE (by [@jbampton][])
|
@@ -15,7 +21,7 @@
|
|
15
21
|
|
16
22
|
# 4.0.1 / 2019-03-12 [(commits)](https://github.com/whitesmith/rubycritic/compare/v4.0.0...v4.0.1)
|
17
23
|
|
18
|
-
* [
|
24
|
+
* [FEATURE] Allow passing formatters from the outside (by [@marcgrimme][] and [@onumis][])
|
19
25
|
* [CHANGE] Fix aruba deprecation warning
|
20
26
|
|
21
27
|
# 4.0.0 / 2019-02-27 [(commits)](https://github.com/whitesmith/rubycritic/compare/v3.5.1...v4.0.0)
|
@@ -244,7 +250,6 @@
|
|
244
250
|
|
245
251
|
* Official Release
|
246
252
|
|
247
|
-
|
248
253
|
[@LeeXGreen]: https://github.com/LeeXGreen
|
249
254
|
[@crackofdusk]: https://github.com/crackofdusk
|
250
255
|
[@halostatue]: https://github.com/halostatue
|
@@ -289,3 +294,6 @@
|
|
289
294
|
[@jbampton]: https://github.com/jbampton
|
290
295
|
[@nathanbwright]: https://github.com/nathanbwright
|
291
296
|
[@leksster]: https://github.com/leksster
|
297
|
+
[@etagwerker]: https://github.com/etagwerker
|
298
|
+
[@cvoltz]: https://github.com/cvoltz
|
299
|
+
[@Adre]: https://github.com/Adre
|
data/CONTRIBUTING.md
CHANGED
data/README.md
CHANGED
@@ -1,15 +1,14 @@
|
|
1
|
-
RubyCritic
|
2
|
-
==========
|
1
|
+
# RubyCritic
|
3
2
|
|
4
3
|
[](http://badge.fury.io/rb/rubycritic)
|
5
4
|
[](https://travis-ci.org/whitesmith/rubycritic)
|
6
5
|
[](https://codeclimate.com/github/whitesmith/rubycritic)
|
7
6
|
|
8
|
-
<img src="https://github.com/whitesmith/rubycritic/raw/master/images/logo.png" alt="RubyCritic Icon" align="right"
|
7
|
+
<img src="https://github.com/whitesmith/rubycritic/raw/master/images/logo.png" alt="RubyCritic Icon" align="right">
|
9
8
|
|
10
9
|
RubyCritic is a gem that wraps around static analysis gems such as [Reek][1], [Flay][2] and [Flog][3] to provide a quality report of your Ruby code.
|
11
10
|
|
12
|
-
|
11
|
+
## Table of Contents
|
13
12
|
|
14
13
|
- [Overview](#overview)
|
15
14
|
- [Getting Started](#getting-started)
|
@@ -22,7 +21,6 @@ RubyCritic is a gem that wraps around static analysis gems such as [Reek][1], [F
|
|
22
21
|
- [Contributors](#contributors)
|
23
22
|
- [Credits](#credits)
|
24
23
|
|
25
|
-
|
26
24
|
## Overview
|
27
25
|
|
28
26
|
This gem provides features such as:
|
@@ -68,7 +66,6 @@ This gem provides features such as:
|
|
68
66
|
|
69
67
|
Checkout the `/docs` if you want to read more about our [core metrics](https://github.com/whitesmith/rubycritic/blob/master/docs/core-metrics.md).
|
70
68
|
|
71
|
-
|
72
69
|
## Getting Started
|
73
70
|
|
74
71
|
RubyCritic can be installed with the following command:
|
@@ -90,7 +87,6 @@ And then execute:
|
|
90
87
|
$ bundle
|
91
88
|
```
|
92
89
|
|
93
|
-
|
94
90
|
## Usage
|
95
91
|
|
96
92
|
Running `rubycritic` with no arguments will analyse all the Ruby files in the
|
@@ -138,17 +134,19 @@ $ rubycritic --help
|
|
138
134
|
You also can use a config file. Just create a `.rubycritic.yml` on your project root path.
|
139
135
|
|
140
136
|
Here are one example:
|
137
|
+
|
141
138
|
```yml
|
142
139
|
mode_ci:
|
143
140
|
enabled: true # default is false
|
144
141
|
branch: 'production' # default is master
|
145
142
|
branch: 'production' # default is master
|
146
143
|
path: '/tmp/mycustompath' # Set path where report will be saved (tmp/rubycritic by default)
|
147
|
-
|
144
|
+
threshold_score: 10 # default is 0
|
148
145
|
deduplicate_symlinks: true # default is false
|
149
146
|
suppress_ratings: true # default is false
|
150
147
|
no_browser: true # default is false
|
151
|
-
|
148
|
+
formats: # Available values are: html, json, console, lint. Default value is html.
|
149
|
+
- console
|
152
150
|
minimum_score: 95 # default is 0
|
153
151
|
paths: # Files to analyse.
|
154
152
|
- 'app/controllers/'
|
@@ -162,10 +160,9 @@ paths: # Files to analyse.
|
|
162
160
|
project root and `RubyCritic` will respect this configuration.
|
163
161
|
* [`flay`](https://github.com/seattlerb/flay): We use `flay`'s default configuration.
|
164
162
|
* [`flog`](https://github.com/seattlerb/flog): We use `flog`'s default configuration with a couple of [smaller tweaks](https://github.com/whitesmith/rubycritic/blob/master/lib/rubycritic/analysers/helpers/flog.rb#L5):
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
163
|
+
* `all`: Forces `flog` to report scores on all classes and methods. Without this option `flog` will only give results up to a certain threshold.
|
164
|
+
* `continue`: Makes it so that `flog` does not abort when a ruby file cannot be parsed.
|
165
|
+
* `methods`: Configures `flog` to skip code outside of methods. It prevents `flog` from reporting on the "methods" `private` and `protected`. It also prevents `flog` from reporting on Rails methods like `before_action` and `has_many`.
|
169
166
|
|
170
167
|
### Alternative Usage Methods
|
171
168
|
|
@@ -173,7 +170,6 @@ If you're fond of Guard you might like [guard-rubycritic][4]. It automatically a
|
|
173
170
|
|
174
171
|
For continuous integration, you can give [Jenkins CI][5] a spin. With it, you can [easily build your own (poor-man's) Code Climate][6]!
|
175
172
|
|
176
|
-
|
177
173
|
### Rake Task
|
178
174
|
|
179
175
|
You can use RubyCritic as Rake command in its most simple form like this:
|
@@ -225,7 +221,6 @@ RubyCritic is supporting Ruby versions:
|
|
225
221
|
* 2.5
|
226
222
|
* 2.6
|
227
223
|
|
228
|
-
|
229
224
|
## Improving RubyCritic
|
230
225
|
|
231
226
|
RubyCritic doesn't have to remain a second choice to other code quality analysis services. Together, we can improve it and continue to build on the great code metric tools that are available in the Ruby ecosystem.
|
@@ -236,10 +231,8 @@ Similarly, Pull Requests that improve the look and feel of the gem, that tweak t
|
|
236
231
|
|
237
232
|
See RubyCritic's [contributing guidelines](https://github.com/whitesmith/rubycritic/blob/master/CONTRIBUTING.md) about how to proceed.
|
238
233
|
|
239
|
-
|
240
234
|
## Contributors
|
241
235
|
|
242
|
-
|
243
236
|
`RubyCritics` initial author was [Guilherme Simões](https://github.com/guilhermesimoes).
|
244
237
|
|
245
238
|
The current core team consists of:
|
@@ -248,7 +241,6 @@ The current core team consists of:
|
|
248
241
|
* [Lucas Mazza](https://github.com/lucasmazza)
|
249
242
|
* [Timo Rößner](https://github.com/troessner)
|
250
243
|
|
251
|
-
|
252
244
|
## Credits
|
253
245
|
|
254
246
|

|
data/ROADMAP.md
CHANGED
@@ -39,7 +39,7 @@ These are more nice-to-haves than promises. We can always dream. But this is wha
|
|
39
39
|
|
40
40
|
- [ ] [Brakeman](https://github.com/presidentbeef/brakeman) to provide security issues (Rails-only feature)
|
41
41
|
|
42
|
-
- [ ] [Rails Best Practices](https://github.com/railsbp/rails_best_practices) to provide Rails smells (Rails-only feature) #14
|
42
|
+
- [ ] [Rails Best Practices](https://github.com/railsbp/rails_best_practices) to provide Rails smells (Rails-only feature) #14
|
43
43
|
|
44
44
|
- [ ] [SandiMeter](https://github.com/makaroni4/sandi_meter) #15
|
45
45
|
|
@@ -53,4 +53,4 @@ These are more nice-to-haves than promises. We can always dream. But this is wha
|
|
53
53
|
|
54
54
|

|
55
55
|
|
56
|
-
Having an option to toggle between "Smells", "Security" (Brakeman) and "Style" (Rubocop) would be great. But that's already assuming we can integrate those gems into RubyCritic.
|
56
|
+
Having an option to toggle between "Smells", "Security" (Brakeman) and "Style" (Rubocop) would be great. But that's already assuming we can integrate those gems into RubyCritic.
|
@@ -0,0 +1,118 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rubycritic/colorize'
|
4
|
+
require 'json'
|
5
|
+
require 'simplecov'
|
6
|
+
|
7
|
+
module RubyCritic
|
8
|
+
module Analyser
|
9
|
+
class Coverage
|
10
|
+
include Colorize
|
11
|
+
|
12
|
+
def initialize(analysed_modules)
|
13
|
+
@analysed_modules = analysed_modules
|
14
|
+
@result = results.first
|
15
|
+
end
|
16
|
+
|
17
|
+
def run
|
18
|
+
@analysed_modules.each do |analysed_module|
|
19
|
+
analysed_module.coverage = find_coverage_percentage(analysed_module)
|
20
|
+
print green '.'
|
21
|
+
end
|
22
|
+
puts ''
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_s
|
26
|
+
'simple_cov'
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def find_coverage_percentage(analysed_module)
|
32
|
+
source_file = find_source_file(analysed_module)
|
33
|
+
|
34
|
+
return 0 unless source_file
|
35
|
+
|
36
|
+
source_file.covered_percent
|
37
|
+
end
|
38
|
+
|
39
|
+
def find_source_file(analysed_module)
|
40
|
+
return unless @result
|
41
|
+
|
42
|
+
needle = File.join(SimpleCov.root, analysed_module.path)
|
43
|
+
|
44
|
+
@result.source_files.detect { |file| file.filename == needle }
|
45
|
+
end
|
46
|
+
|
47
|
+
# The path to the .resultset.json cache file
|
48
|
+
def resultset_path
|
49
|
+
File.join(SimpleCov.coverage_path, '.resultset.json')
|
50
|
+
end
|
51
|
+
|
52
|
+
def resultset_writelock
|
53
|
+
File.join(SimpleCov.coverage_path, '.resultset.json.lock')
|
54
|
+
end
|
55
|
+
|
56
|
+
# Loads the cached resultset from JSON and returns it as a Hash,
|
57
|
+
# caching it for subsequent accesses.
|
58
|
+
def resultset
|
59
|
+
@resultset ||= begin
|
60
|
+
if (data = stored_data)
|
61
|
+
begin
|
62
|
+
JSON.parse(data) || {}
|
63
|
+
rescue JSON::ParserError => err
|
64
|
+
puts "Error: Loading .resultset.json: #{err.message}"
|
65
|
+
{}
|
66
|
+
end
|
67
|
+
else
|
68
|
+
{}
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
# Returns the contents of the resultset cache as a string or if the file is missing or empty nil
|
74
|
+
def stored_data
|
75
|
+
synchronize_resultset do
|
76
|
+
return unless File.exist?(resultset_path)
|
77
|
+
|
78
|
+
return unless (data = File.read(resultset_path))
|
79
|
+
|
80
|
+
return if data.length < 2
|
81
|
+
|
82
|
+
data
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
# Ensure only one process is reading or writing the resultset at any
|
87
|
+
# given time
|
88
|
+
def synchronize_resultset
|
89
|
+
# make it reentrant
|
90
|
+
return yield if defined?(@resultset_locked) && @resultset_locked == true
|
91
|
+
|
92
|
+
return yield unless File.exist?(resultset_writelock)
|
93
|
+
|
94
|
+
begin
|
95
|
+
@resultset_locked = true
|
96
|
+
File.open(resultset_writelock, 'w+') do |file|
|
97
|
+
file.flock(File::LOCK_EX)
|
98
|
+
yield
|
99
|
+
end
|
100
|
+
ensure
|
101
|
+
@resultset_locked = false
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
# Gets the resultset hash and re-creates all included instances
|
106
|
+
# of SimpleCov::Result from that.
|
107
|
+
# All results that are above the SimpleCov.merge_timeout will be
|
108
|
+
# dropped. Returns an array of SimpleCov::Result items.
|
109
|
+
def results
|
110
|
+
array = []
|
111
|
+
resultset.each do |command_name, data|
|
112
|
+
array << ::SimpleCov::Result.from_hash(command_name => data)
|
113
|
+
end
|
114
|
+
array
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
@@ -7,6 +7,7 @@ require 'rubycritic/analysers/smells/reek'
|
|
7
7
|
require 'rubycritic/analysers/complexity'
|
8
8
|
require 'rubycritic/analysers/churn'
|
9
9
|
require 'rubycritic/analysers/attributes'
|
10
|
+
require 'rubycritic/analysers/coverage'
|
10
11
|
|
11
12
|
module RubyCritic
|
12
13
|
class AnalysersRunner
|
@@ -16,7 +17,8 @@ module RubyCritic
|
|
16
17
|
Analyser::ReekSmells,
|
17
18
|
Analyser::Complexity,
|
18
19
|
Analyser::Attributes,
|
19
|
-
Analyser::Churn
|
20
|
+
Analyser::Churn,
|
21
|
+
Analyser::Coverage
|
20
22
|
].freeze
|
21
23
|
|
22
24
|
def initialize(paths)
|
@@ -76,10 +76,10 @@ module RubyCritic
|
|
76
76
|
end
|
77
77
|
|
78
78
|
def formats
|
79
|
-
formats = options['formats']
|
79
|
+
formats = Array(options['formats'])
|
80
80
|
formats.select do |format|
|
81
81
|
%w[html json console lint].include?(format)
|
82
|
-
end
|
82
|
+
end.map(&:to_sym)
|
83
83
|
end
|
84
84
|
|
85
85
|
def minimum_score
|
@@ -10,6 +10,7 @@ module RubyCritic
|
|
10
10
|
# Complexity is reduced by a factor of 25 when calculating cost
|
11
11
|
COMPLEXITY_FACTOR = 25.0
|
12
12
|
|
13
|
+
attribute :coverage
|
13
14
|
attribute :name
|
14
15
|
attribute :smells_count
|
15
16
|
attribute :file_location
|
@@ -44,6 +45,10 @@ module RubyCritic
|
|
44
45
|
(complexity / COMPLEXITY_FACTOR)
|
45
46
|
end
|
46
47
|
|
48
|
+
def coverage_rating
|
49
|
+
@coverage_rating ||= Rating.from_cost(100 - coverage)
|
50
|
+
end
|
51
|
+
|
47
52
|
def rating
|
48
53
|
@rating ||= Rating.from_cost(cost)
|
49
54
|
end
|
@@ -74,15 +79,9 @@ module RubyCritic
|
|
74
79
|
|
75
80
|
def to_h
|
76
81
|
{
|
77
|
-
name: name,
|
78
|
-
|
79
|
-
|
80
|
-
churn: churn,
|
81
|
-
committed_at: committed_at,
|
82
|
-
complexity: complexity,
|
83
|
-
duplication: duplication,
|
84
|
-
methods_count: methods_count,
|
85
|
-
cost: cost,
|
82
|
+
name: name, path: path, smells: smells,
|
83
|
+
churn: churn, committed_at: committed_at, complexity: complexity,
|
84
|
+
duplication: duplication, methods_count: methods_count, cost: cost,
|
86
85
|
rating: rating
|
87
86
|
}
|
88
87
|
end
|
@@ -12,6 +12,9 @@ $(function() {
|
|
12
12
|
else if(/smells_index/.test(loc)) {
|
13
13
|
$('.smells-index-nav').addClass('active');
|
14
14
|
}
|
15
|
+
else if(/simple_cov_index/.test(loc)) {
|
16
|
+
$('.coverage-index-nav').addClass('active');
|
17
|
+
}
|
15
18
|
});
|
16
19
|
|
17
20
|
var turbulenceData = turbulenceData || [];
|
@@ -208,19 +211,29 @@ function highlightLine(lineReference) {
|
|
208
211
|
|
209
212
|
$("#toggle-code").on("click", showCode);
|
210
213
|
$("#toggle-smells").on("click", showSmells);
|
214
|
+
$("#toggle-coverage").on("click", showCoverage);
|
211
215
|
|
212
216
|
function showCode() {
|
213
217
|
$('#toggle-code').parent('li').addClass('active');
|
214
218
|
$('#toggle-smells').parent('li').removeClass('active');
|
219
|
+
$('#toggle-coverage').parent('li').removeClass('active');
|
215
220
|
$(".smells").hide();
|
216
221
|
}
|
217
222
|
|
218
223
|
function showSmells() {
|
219
224
|
$('#toggle-code').parent('li').removeClass('active');
|
225
|
+
$('#toggle-coverage').parent('li').removeClass('active');
|
220
226
|
$('#toggle-smells').parent('li').addClass('active');
|
221
227
|
$(".smells").show();
|
222
228
|
}
|
223
229
|
|
230
|
+
function showCoverage() {
|
231
|
+
$('#toggle-code').parent('li').removeClass('active');
|
232
|
+
$('#toggle-smells').parent('li').removeClass('active');
|
233
|
+
$('#toggle-coverage').parent('li').addClass('active');
|
234
|
+
$(".coverage").show();
|
235
|
+
}
|
236
|
+
|
224
237
|
$("#codeTable")
|
225
238
|
.tablesorter({ // Sort the table
|
226
239
|
sortList: [[0,1]]
|
@@ -277,10 +277,10 @@ header {
|
|
277
277
|
color: #4e4d4d;
|
278
278
|
font-weight: bold;
|
279
279
|
}
|
280
|
-
.table.code th
|
280
|
+
.table.code th.center {
|
281
281
|
text-align: center;
|
282
282
|
}
|
283
|
-
.table.code th
|
283
|
+
.table.code th.left {
|
284
284
|
text-align: left;
|
285
285
|
}
|
286
286
|
.table.code th {
|
@@ -291,10 +291,10 @@ header {
|
|
291
291
|
.table td {
|
292
292
|
color: #777575;
|
293
293
|
}
|
294
|
-
.table.code td
|
294
|
+
.table.code td.center {
|
295
295
|
text-align: center;
|
296
296
|
}
|
297
|
-
.table.code td
|
297
|
+
.table.code td.left {
|
298
298
|
text-align: left;
|
299
299
|
}
|
300
300
|
.table.code td {
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rubycritic/generators/html/base'
|
4
|
+
|
5
|
+
module RubyCritic
|
6
|
+
module Generator
|
7
|
+
module Html
|
8
|
+
class SimpleCovIndex < Base
|
9
|
+
TEMPLATE = erb_template('simple_cov_index.html.erb')
|
10
|
+
|
11
|
+
def initialize(analysed_modules)
|
12
|
+
@analysed_modules = sorted(filtered(analysed_modules))
|
13
|
+
set_header_links if Config.compare_branches_mode?
|
14
|
+
end
|
15
|
+
|
16
|
+
def set_header_links
|
17
|
+
@base_path = code_index_path(Config.base_root_directory, file_name)
|
18
|
+
@feature_path = code_index_path(Config.feature_root_directory, file_name)
|
19
|
+
@build_path = code_index_path(Config.compare_root_directory, file_name)
|
20
|
+
end
|
21
|
+
|
22
|
+
def file_name
|
23
|
+
'simple_cov_index.html'
|
24
|
+
end
|
25
|
+
|
26
|
+
def render
|
27
|
+
index_body = TEMPLATE.result(base_binding)
|
28
|
+
LAYOUT_TEMPLATE.result(base_binding { index_body })
|
29
|
+
end
|
30
|
+
|
31
|
+
def sorted(mods)
|
32
|
+
mods.sort_by(&:coverage)
|
33
|
+
end
|
34
|
+
|
35
|
+
def filtered(mods)
|
36
|
+
mods.reject do |a_module|
|
37
|
+
path = a_module.pathname.to_s
|
38
|
+
path.start_with?('spec', 'test')
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -9,9 +9,9 @@
|
|
9
9
|
<thead>
|
10
10
|
<tr>
|
11
11
|
<% unless Config.suppress_ratings %>
|
12
|
-
<th width="10%" class="table-header">Rating<span class="sort-type"></span></th>
|
12
|
+
<th width="10%" class="table-header center">Rating<span class="sort-type"></span></th>
|
13
13
|
<% end %>
|
14
|
-
<th width="50%" class="table-header">Name<span class="sort-type"></span></th>
|
14
|
+
<th width="50%" class="table-header left">Name<span class="sort-type"></span></th>
|
15
15
|
<th width="10%" class="table-header">Churn<span class="sort-type"></span></th>
|
16
16
|
<th width="10%" class="table-header">Complexity<span class="sort-type"></span></th>
|
17
17
|
<th width="10%" class="table-header">Duplication<span class="sort-type"></span></th>
|
@@ -22,7 +22,7 @@
|
|
22
22
|
<% @analysed_modules.each do |analysed_module| %>
|
23
23
|
<tr>
|
24
24
|
<% unless Config.suppress_ratings %>
|
25
|
-
<td>
|
25
|
+
<td class="center">
|
26
26
|
<% if Config.build_mode? %>
|
27
27
|
<% master_analysed_module = Config.base_branch_collection.find(analysed_module.pathname) %>
|
28
28
|
<% if master_analysed_module.cost > analysed_module.cost %>
|
@@ -36,7 +36,7 @@
|
|
36
36
|
<div class="rating <%= analysed_module.rating.to_s.downcase %>"><%= analysed_module.rating %></div>
|
37
37
|
</td>
|
38
38
|
<% end %>
|
39
|
-
<td>
|
39
|
+
<td class="left">
|
40
40
|
<ul class="nav nav-pills">
|
41
41
|
<li role="presentation" >
|
42
42
|
<a href="<%= file_path(analysed_module.pathname.sub_ext('.html')) %>"><%= analysed_module.name %></a>
|
@@ -39,6 +39,9 @@
|
|
39
39
|
<li class="sidebar-item">
|
40
40
|
<a href="<%= file_path('smells_index.html') %>" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
|
41
41
|
</li>
|
42
|
+
<li class="sidebar-item">
|
43
|
+
<a href="<%= file_path('simple_cov_index.html') %>" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
|
44
|
+
</li>
|
42
45
|
</ul>
|
43
46
|
</aside>
|
44
47
|
<!-- /#sidebar-wrapper -->
|
@@ -0,0 +1,44 @@
|
|
1
|
+
<!-- Page Content -->
|
2
|
+
<div id="page-content-wrapper">
|
3
|
+
<div class="container-fluid">
|
4
|
+
<div class="row">
|
5
|
+
<!--Page Title -->
|
6
|
+
<div class="Page_Title">
|
7
|
+
<h3>Coverage</h3>
|
8
|
+
</div>
|
9
|
+
<!--End Page Title -->
|
10
|
+
<div class="Content_Wrapper">
|
11
|
+
<table id="js-index-table" class="table coverage-index-table index-table sortable-table">
|
12
|
+
<thead>
|
13
|
+
<tr>
|
14
|
+
<% unless Config.suppress_ratings %>
|
15
|
+
<th width="10%" class="table-header">Rating<span class="sort-type"></span></th>
|
16
|
+
<% end %>
|
17
|
+
<th width="80%" class="table-header">Name<span class="sort-type"></span></th>
|
18
|
+
<th width="10%" class="table-header">Coverage<span class="sort-type"></span></th>
|
19
|
+
</tr>
|
20
|
+
</thead>
|
21
|
+
<% @analysed_modules.each do |analysed_module| %>
|
22
|
+
<tr>
|
23
|
+
<tr>
|
24
|
+
<% unless Config.suppress_ratings %>
|
25
|
+
<td>
|
26
|
+
<div class="rating <%= analysed_module.rating.to_s.downcase %>"><%= analysed_module.coverage_rating %></div>
|
27
|
+
</td>
|
28
|
+
<% end %>
|
29
|
+
<td>
|
30
|
+
<ul class="nav nav-pills">
|
31
|
+
<li role="presentation" >
|
32
|
+
<a href="<%= file_path(analysed_module.pathname.sub_ext('.html')) %>"><%= analysed_module.name %></a>
|
33
|
+
</li>
|
34
|
+
</ul>
|
35
|
+
</td>
|
36
|
+
<td><%= '%g' % analysed_module.coverage %>%</td>
|
37
|
+
</tr>
|
38
|
+
<% end %>
|
39
|
+
</table>
|
40
|
+
</div>
|
41
|
+
</div>
|
42
|
+
</div>
|
43
|
+
</div>
|
44
|
+
<!-- /#page-content-wrapper -->
|
@@ -5,6 +5,7 @@ require 'rubycritic/configuration'
|
|
5
5
|
require 'rubycritic/generators/html/overview'
|
6
6
|
require 'rubycritic/generators/html/smells_index'
|
7
7
|
require 'rubycritic/generators/html/code_index'
|
8
|
+
require 'rubycritic/generators/html/simple_cov_index'
|
8
9
|
require 'rubycritic/generators/html/code_file'
|
9
10
|
|
10
11
|
module RubyCritic
|
@@ -39,7 +40,7 @@ module RubyCritic
|
|
39
40
|
end
|
40
41
|
|
41
42
|
def generators
|
42
|
-
[overview_generator, code_index_generator, smells_index_generator] + file_generators
|
43
|
+
[overview_generator, code_index_generator, smells_index_generator, simple_cov_index_generator] + file_generators
|
43
44
|
end
|
44
45
|
|
45
46
|
def overview_generator
|
@@ -54,6 +55,10 @@ module RubyCritic
|
|
54
55
|
Html::SmellsIndex.new(@analysed_modules)
|
55
56
|
end
|
56
57
|
|
58
|
+
def simple_cov_index_generator
|
59
|
+
Html::SimpleCovIndex.new(@analysed_modules)
|
60
|
+
end
|
61
|
+
|
57
62
|
def file_generators
|
58
63
|
@analysed_modules.map do |analysed_module|
|
59
64
|
Html::CodeFile.new(analysed_module)
|
data/lib/rubycritic/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubycritic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Guilherme Simoes
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-10-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: flay
|
@@ -114,6 +114,20 @@ dependencies:
|
|
114
114
|
- - "~>"
|
115
115
|
- !ruby/object:Gem::Version
|
116
116
|
version: '3.8'
|
117
|
+
- !ruby/object:Gem::Dependency
|
118
|
+
name: simplecov
|
119
|
+
requirement: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - "~>"
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: 0.17.0
|
124
|
+
type: :runtime
|
125
|
+
prerelease: false
|
126
|
+
version_requirements: !ruby/object:Gem::Requirement
|
127
|
+
requirements:
|
128
|
+
- - "~>"
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: 0.17.0
|
117
131
|
- !ruby/object:Gem::Dependency
|
118
132
|
name: tty-which
|
119
133
|
requirement: !ruby/object:Gem::Requirement
|
@@ -256,6 +270,20 @@ dependencies:
|
|
256
270
|
- - "~>"
|
257
271
|
- !ruby/object:Gem::Version
|
258
272
|
version: '0.10'
|
273
|
+
- !ruby/object:Gem::Dependency
|
274
|
+
name: mdl
|
275
|
+
requirement: !ruby/object:Gem::Requirement
|
276
|
+
requirements:
|
277
|
+
- - "~>"
|
278
|
+
- !ruby/object:Gem::Version
|
279
|
+
version: 0.5.0
|
280
|
+
type: :development
|
281
|
+
prerelease: false
|
282
|
+
version_requirements: !ruby/object:Gem::Requirement
|
283
|
+
requirements:
|
284
|
+
- - "~>"
|
285
|
+
- !ruby/object:Gem::Version
|
286
|
+
version: 0.5.0
|
259
287
|
- !ruby/object:Gem::Dependency
|
260
288
|
name: minitest
|
261
289
|
requirement: !ruby/object:Gem::Requirement
|
@@ -371,6 +399,7 @@ files:
|
|
371
399
|
- lib/rubycritic/analysers/attributes.rb
|
372
400
|
- lib/rubycritic/analysers/churn.rb
|
373
401
|
- lib/rubycritic/analysers/complexity.rb
|
402
|
+
- lib/rubycritic/analysers/coverage.rb
|
374
403
|
- lib/rubycritic/analysers/helpers/ast_node.rb
|
375
404
|
- lib/rubycritic/analysers/helpers/flay.rb
|
376
405
|
- lib/rubycritic/analysers/helpers/flog.rb
|
@@ -439,12 +468,14 @@ files:
|
|
439
468
|
- lib/rubycritic/generators/html/code_index.rb
|
440
469
|
- lib/rubycritic/generators/html/line.rb
|
441
470
|
- lib/rubycritic/generators/html/overview.rb
|
471
|
+
- lib/rubycritic/generators/html/simple_cov_index.rb
|
442
472
|
- lib/rubycritic/generators/html/smells_index.rb
|
443
473
|
- lib/rubycritic/generators/html/templates/code_file.html.erb
|
444
474
|
- lib/rubycritic/generators/html/templates/code_index.html.erb
|
445
475
|
- lib/rubycritic/generators/html/templates/layouts/application.html.erb
|
446
476
|
- lib/rubycritic/generators/html/templates/line.html.erb
|
447
477
|
- lib/rubycritic/generators/html/templates/overview.html.erb
|
478
|
+
- lib/rubycritic/generators/html/templates/simple_cov_index.html.erb
|
448
479
|
- lib/rubycritic/generators/html/templates/smells_index.html.erb
|
449
480
|
- lib/rubycritic/generators/html/templates/smelly_line.html.erb
|
450
481
|
- lib/rubycritic/generators/html/turbulence.rb
|