pronto-rubocop 0.10.0 → 0.11.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/CODEOWNERS +3 -0
- data/.github/workflows/checks.yml +22 -0
- data/README.md +32 -4
- data/lib/pronto/rubocop.rb +6 -2
- data/lib/pronto/rubocop/offense_line.rb +128 -0
- data/lib/pronto/rubocop/patch_cop.rb +35 -41
- data/lib/pronto/rubocop/version.rb +1 -1
- data/pronto-rubocop.gemspec +2 -2
- metadata +20 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz: '
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '0588bd2b9b7d1c7a702dba2d9a5cdfc74e4d5df1eaa893557aa13445ab82c9d7'
|
4
|
+
data.tar.gz: 6bd89ce4bcec0647adc3c62abe770c8f43aff21d77b96a6c9679f6e35ffc84c2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2177a1cdf31387028a4dac6aed07b0df8379c33e84d80ac3b1329187beb99ad6b3bb490d1c70b4c098345b5cfac538463beff2767fe0bb28c094e78cbdcd14f1
|
7
|
+
data.tar.gz: 48856034490369353ed28755decda13d3e0f225468c8600a2706257ec2a119b88516de1757e7b5a5969ebd76e00e16fd908ca2b0e642901c1f51389a6ce483fc
|
data/.github/CODEOWNERS
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
name: Checks
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches: [ master ]
|
6
|
+
pull_request:
|
7
|
+
branches: [ master ]
|
8
|
+
|
9
|
+
jobs:
|
10
|
+
ruby:
|
11
|
+
runs-on: ubuntu-latest
|
12
|
+
strategy:
|
13
|
+
matrix:
|
14
|
+
ruby: ['2.3', '2.4', '2.5', '2.6', '2.7', '3.0']
|
15
|
+
steps:
|
16
|
+
- uses: actions/checkout@v2
|
17
|
+
- uses: ruby/setup-ruby@v1
|
18
|
+
with:
|
19
|
+
ruby-version: ${{ matrix.ruby }}
|
20
|
+
bundler-cache: true
|
21
|
+
- name: rake spec
|
22
|
+
run: bundle exec rake spec
|
data/README.md
CHANGED
@@ -1,12 +1,40 @@
|
|
1
|
-
# Pronto runner for
|
1
|
+
# Pronto runner for RuboCop
|
2
2
|
|
3
3
|
[](https://codeclimate.com/github/prontolabs/pronto-rubocop)
|
4
4
|
[](https://travis-ci.org/prontolabs/pronto-rubocop)
|
5
5
|
[](http://badge.fury.io/rb/pronto-rubocop)
|
6
6
|
|
7
|
-
Pronto runner for [
|
7
|
+
Pronto runner for [RuboCop](https://github.com/bbatsov/rubocop), ruby code
|
8
|
+
analyzer. [What is Pronto?](https://github.com/prontolabs/pronto)
|
8
9
|
|
9
10
|
## Configuration
|
10
11
|
|
11
|
-
Configuring
|
12
|
-
|
12
|
+
Configuring RuboCop via `.rubocop.yml` will work just fine with
|
13
|
+
`pronto-rubocop`.
|
14
|
+
|
15
|
+
You can also specify a custom `.rubocop.yml` location with the environment
|
16
|
+
variable `RUBOCOP_CONFIG`.
|
17
|
+
|
18
|
+
You can also provide additional configuration via `.pronto.yml`:
|
19
|
+
|
20
|
+
```yml
|
21
|
+
rubocop:
|
22
|
+
# Map of RuboCop severity level to Pronto severity level
|
23
|
+
severities:
|
24
|
+
refactor: info
|
25
|
+
warning: error
|
26
|
+
|
27
|
+
# Enable suggestions
|
28
|
+
suggestions: true
|
29
|
+
```
|
30
|
+
|
31
|
+
## Suggestions
|
32
|
+
|
33
|
+
When suggestions are enabled, the messages will include a line suggesting
|
34
|
+
what to change, using [GitHub's](https://twitter.com/wa7son/status/1052326282900443137)
|
35
|
+
syntax on Pull Request reviews, that can be approved in one click right from
|
36
|
+
the Pull Request.
|
37
|
+
|
38
|
+
For example:
|
39
|
+
|
40
|
+

|
data/lib/pronto/rubocop.rb
CHANGED
@@ -1,14 +1,18 @@
|
|
1
1
|
require 'pronto'
|
2
2
|
require 'rubocop'
|
3
3
|
require 'pronto/rubocop/patch_cop'
|
4
|
+
require 'pronto/rubocop/offense_line'
|
4
5
|
|
5
6
|
module Pronto
|
6
7
|
class Rubocop < Runner
|
7
8
|
def run
|
8
9
|
ruby_patches
|
9
10
|
.select { |patch| patch.additions > 0 }
|
10
|
-
.
|
11
|
-
|
11
|
+
.flat_map { |patch| PatchCop.new(patch, self).messages }
|
12
|
+
end
|
13
|
+
|
14
|
+
def pronto_rubocop_config
|
15
|
+
@pronto_rubocop_config ||= Pronto::ConfigFile.new.to_h['rubocop'] || {}
|
12
16
|
end
|
13
17
|
end
|
14
18
|
end
|
@@ -0,0 +1,128 @@
|
|
1
|
+
module Pronto
|
2
|
+
class Rubocop < Runner
|
3
|
+
class OffenseLine
|
4
|
+
def initialize(patch_cop, offense, line)
|
5
|
+
@patch_cop = patch_cop
|
6
|
+
@offense = offense
|
7
|
+
@line = line
|
8
|
+
end
|
9
|
+
|
10
|
+
def message
|
11
|
+
Message.new(path, line, level, message_text, nil, Pronto::Rubocop)
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
attr_reader :patch_cop, :offense, :line
|
17
|
+
|
18
|
+
def path
|
19
|
+
line.patch.delta.new_file[:path]
|
20
|
+
end
|
21
|
+
|
22
|
+
def processed_source
|
23
|
+
patch_cop.processed_source
|
24
|
+
end
|
25
|
+
|
26
|
+
def message_text
|
27
|
+
return offense.message unless suggestion_text
|
28
|
+
|
29
|
+
"#{offense.message}\n\n```suggestion\n#{suggestion_text}```"
|
30
|
+
end
|
31
|
+
|
32
|
+
def suggestion_text
|
33
|
+
return unless patch_cop.runner.pronto_rubocop_config['suggestions']
|
34
|
+
return if corrections_count == 0
|
35
|
+
return if differing_lines_count != corrections_count
|
36
|
+
|
37
|
+
@suggestion_text ||= corrected_lines[offense.line - 1]
|
38
|
+
end
|
39
|
+
|
40
|
+
def corrected_lines
|
41
|
+
@corrected_lines ||= corrector.rewrite.lines
|
42
|
+
end
|
43
|
+
|
44
|
+
def differing_lines_count
|
45
|
+
original_lines.each_with_index.count do |line, index|
|
46
|
+
line != corrected_lines[index]
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def original_lines
|
51
|
+
processed_source.lines.join("\n").lines
|
52
|
+
end
|
53
|
+
|
54
|
+
if ::RuboCop::Cop::Team.respond_to?(:mobilize)
|
55
|
+
MOBILIZE = :mobilize
|
56
|
+
|
57
|
+
def report
|
58
|
+
@report ||= autocorrect_team.investigate(processed_source).cop_reports.first
|
59
|
+
end
|
60
|
+
|
61
|
+
def corrector
|
62
|
+
report.corrector
|
63
|
+
end
|
64
|
+
|
65
|
+
def corrections_count
|
66
|
+
report.offenses.size
|
67
|
+
end
|
68
|
+
else
|
69
|
+
# rubocop < v0.85.0
|
70
|
+
MOBILIZE = :new
|
71
|
+
|
72
|
+
def corrector
|
73
|
+
@corrector ||= begin
|
74
|
+
autocorrect_team.inspect_file(processed_source)
|
75
|
+
corrector = RuboCop::Cop::Corrector.new(processed_source.buffer)
|
76
|
+
corrector.corrections.concat(autocorrect_team.cops.first.corrections)
|
77
|
+
corrector
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def corrections_count
|
82
|
+
@corrections_count ||= corrector.corrections.count
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def autocorrect_team
|
87
|
+
@autocorrect_team ||=
|
88
|
+
::RuboCop::Cop::Team.send(MOBILIZE,
|
89
|
+
::RuboCop::Cop::Registry.new([cop_class]),
|
90
|
+
patch_cop.rubocop_config,
|
91
|
+
auto_correct: true,
|
92
|
+
stdin: true,
|
93
|
+
)
|
94
|
+
end
|
95
|
+
|
96
|
+
def cop_class
|
97
|
+
patch_cop.registry.find_by_cop_name(offense.cop_name)
|
98
|
+
end
|
99
|
+
|
100
|
+
def level
|
101
|
+
severities.fetch(offense.severity.name)
|
102
|
+
end
|
103
|
+
|
104
|
+
def severities
|
105
|
+
@severities ||= DEFAULT_SEVERITIES.merge(config_severities)
|
106
|
+
end
|
107
|
+
|
108
|
+
def config_severities
|
109
|
+
patch_cop
|
110
|
+
.runner
|
111
|
+
.pronto_rubocop_config
|
112
|
+
.fetch('severities', {})
|
113
|
+
.map { |k, v| [k.to_sym, v.to_sym] }
|
114
|
+
.to_h
|
115
|
+
end
|
116
|
+
|
117
|
+
DEFAULT_SEVERITIES = {
|
118
|
+
refactor: :warning,
|
119
|
+
convention: :warning,
|
120
|
+
warning: :warning,
|
121
|
+
error: :error,
|
122
|
+
fatal: :fatal
|
123
|
+
}.freeze
|
124
|
+
|
125
|
+
private_constant :DEFAULT_SEVERITIES
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
module Pronto
|
2
2
|
class Rubocop < Runner
|
3
3
|
class PatchCop
|
4
|
+
attr_reader :runner
|
5
|
+
|
4
6
|
def initialize(patch, runner)
|
5
7
|
@patch = patch
|
6
8
|
@runner = runner
|
@@ -9,21 +11,40 @@ module Pronto
|
|
9
11
|
def messages
|
10
12
|
return [] unless valid?
|
11
13
|
|
12
|
-
|
14
|
+
offenses.flat_map do |offense|
|
13
15
|
patch
|
14
16
|
.added_lines
|
15
|
-
.select { |line| line.new_lineno ==
|
16
|
-
.map { |line|
|
17
|
+
.select { |line| line.new_lineno == offense.line }
|
18
|
+
.map { |line| OffenseLine.new(self, offense, line).message }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def processed_source
|
23
|
+
@processed_source ||= ::RuboCop::ProcessedSource.from_file(
|
24
|
+
path,
|
25
|
+
rubocop_config.target_ruby_version
|
26
|
+
)
|
27
|
+
end
|
28
|
+
|
29
|
+
def registry
|
30
|
+
@registry ||= ::RuboCop::Cop::Registry.new(RuboCop::Cop::Cop.all)
|
31
|
+
end
|
32
|
+
|
33
|
+
def rubocop_config
|
34
|
+
@rubocop_config ||= begin
|
35
|
+
store = ::RuboCop::ConfigStore.new
|
36
|
+
store.for(path)
|
17
37
|
end
|
18
38
|
end
|
19
39
|
|
20
40
|
private
|
21
41
|
|
22
|
-
attr_reader :patch
|
42
|
+
attr_reader :patch
|
23
43
|
|
24
44
|
def valid?
|
25
|
-
return false if
|
26
|
-
return true if
|
45
|
+
return false if rubocop_config.file_to_exclude?(path)
|
46
|
+
return true if rubocop_config.file_to_include?(path)
|
47
|
+
|
27
48
|
true
|
28
49
|
end
|
29
50
|
|
@@ -31,15 +52,7 @@ module Pronto
|
|
31
52
|
@path ||= patch.new_file_full_path.to_s
|
32
53
|
end
|
33
54
|
|
34
|
-
def
|
35
|
-
@config ||= begin
|
36
|
-
store = ::RuboCop::ConfigStore.new
|
37
|
-
store.options_config = ENV['RUBOCOP_CONFIG'] if ENV['RUBOCOP_CONFIG']
|
38
|
-
store.for(path)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def offences
|
55
|
+
def offenses
|
43
56
|
team
|
44
57
|
.inspect_file(processed_source)
|
45
58
|
.sort
|
@@ -47,32 +60,13 @@ module Pronto
|
|
47
60
|
end
|
48
61
|
|
49
62
|
def team
|
50
|
-
@team ||=
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
def processed_source
|
58
|
-
@processed_source ||=
|
59
|
-
::RuboCop::ProcessedSource.from_file(path, config.target_ruby_version)
|
60
|
-
end
|
61
|
-
|
62
|
-
def new_message(offence, line)
|
63
|
-
path = line.patch.delta.new_file[:path]
|
64
|
-
level = level(offence.severity.name)
|
65
|
-
|
66
|
-
Message.new(path, line, level, offence.message, nil, runner.class)
|
67
|
-
end
|
68
|
-
|
69
|
-
def level(severity)
|
70
|
-
case severity
|
71
|
-
when :refactor, :convention
|
72
|
-
:warning
|
73
|
-
when :warning, :error, :fatal
|
74
|
-
severity
|
75
|
-
end
|
63
|
+
@team ||=
|
64
|
+
if ::RuboCop::Cop::Team.respond_to?(:mobilize)
|
65
|
+
# rubocop v0.85.0 and later
|
66
|
+
::RuboCop::Cop::Team.mobilize(registry, rubocop_config)
|
67
|
+
else
|
68
|
+
::RuboCop::Cop::Team.new(registry, rubocop_config)
|
69
|
+
end
|
76
70
|
end
|
77
71
|
end
|
78
72
|
end
|
data/pronto-rubocop.gemspec
CHANGED
@@ -32,8 +32,8 @@ Gem::Specification.new do |s|
|
|
32
32
|
s.extra_rdoc_files = ['LICENSE', 'README.md']
|
33
33
|
s.require_paths = ['lib']
|
34
34
|
|
35
|
-
s.add_runtime_dependency('
|
36
|
-
s.add_runtime_dependency('
|
35
|
+
s.add_runtime_dependency('pronto', '~> 0.11.0')
|
36
|
+
s.add_runtime_dependency('rubocop', '>= 0.49.1', '< 1.0')
|
37
37
|
s.add_development_dependency('rake', '~> 12.0')
|
38
38
|
s.add_development_dependency('rspec', '~> 3.4')
|
39
39
|
s.add_development_dependency('rspec-its', '~> 1.2')
|
metadata
CHANGED
@@ -1,49 +1,49 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pronto-rubocop
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mindaugas Mozūras
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-01-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: pronto
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: 0.49.1
|
20
17
|
- - "~>"
|
21
18
|
- !ruby/object:Gem::Version
|
22
|
-
version:
|
19
|
+
version: 0.11.0
|
23
20
|
type: :runtime
|
24
21
|
prerelease: false
|
25
22
|
version_requirements: !ruby/object:Gem::Requirement
|
26
23
|
requirements:
|
27
|
-
- - ">="
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: 0.49.1
|
30
24
|
- - "~>"
|
31
25
|
- !ruby/object:Gem::Version
|
32
|
-
version:
|
26
|
+
version: 0.11.0
|
33
27
|
- !ruby/object:Gem::Dependency
|
34
|
-
name:
|
28
|
+
name: rubocop
|
35
29
|
requirement: !ruby/object:Gem::Requirement
|
36
30
|
requirements:
|
37
|
-
- - "
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.49.1
|
34
|
+
- - "<"
|
38
35
|
- !ruby/object:Gem::Version
|
39
|
-
version:
|
36
|
+
version: '1.0'
|
40
37
|
type: :runtime
|
41
38
|
prerelease: false
|
42
39
|
version_requirements: !ruby/object:Gem::Requirement
|
43
40
|
requirements:
|
44
|
-
- - "
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 0.49.1
|
44
|
+
- - "<"
|
45
45
|
- !ruby/object:Gem::Version
|
46
|
-
version:
|
46
|
+
version: '1.0'
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rake
|
49
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,9 +94,12 @@ extra_rdoc_files:
|
|
94
94
|
- LICENSE
|
95
95
|
- README.md
|
96
96
|
files:
|
97
|
+
- ".github/CODEOWNERS"
|
98
|
+
- ".github/workflows/checks.yml"
|
97
99
|
- LICENSE
|
98
100
|
- README.md
|
99
101
|
- lib/pronto/rubocop.rb
|
102
|
+
- lib/pronto/rubocop/offense_line.rb
|
100
103
|
- lib/pronto/rubocop/patch_cop.rb
|
101
104
|
- lib/pronto/rubocop/version.rb
|
102
105
|
- pronto-rubocop.gemspec
|
@@ -119,7 +122,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
119
122
|
- !ruby/object:Gem::Version
|
120
123
|
version: '0'
|
121
124
|
requirements: []
|
122
|
-
rubygems_version: 3.0.
|
125
|
+
rubygems_version: 3.0.3
|
123
126
|
signing_key:
|
124
127
|
specification_version: 4
|
125
128
|
summary: Pronto runner for Rubocop, ruby code analyzer
|