rubocop-definition_validator 0.1.1 → 0.1.2
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/lib/rubocop/cop/lint/definition_validator.rb +5 -4
- data/lib/rubocop/definition_validator.rb +2 -1
- data/lib/rubocop/definition_validator/change_detector.rb +1 -10
- data/lib/rubocop/definition_validator/changed_method.rb +11 -0
- data/lib/rubocop/definition_validator/message.rb +65 -0
- data/lib/rubocop/definition_validator/method.rb +15 -21
- data/lib/rubocop/definition_validator/patch.rb +52 -49
- data/lib/rubocop/definition_validator/version.rb +1 -1
- metadata +4 -3
- data/lib/rubocop/definition_validator/reason.rb +0 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e64054dd1e26a1402b8b3066859dde92e333008a
|
4
|
+
data.tar.gz: e51cf35bcdc4e921b38e983dd9d0f6edf2b0681b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b32c56023f9a88c3baf652dd3f76afdbbf3fe5bc49dce9d6177f9c5175e484728ed43d0f0b6770b40157b6dc4a7b3ae318d9c6a51274430909d77daefbb4b317
|
7
|
+
data.tar.gz: 3b73155495975c9cdb0b1dc13007d0960ad8664478cf1b327328acefcab6f204db0730dfbb154507a8e9c2b5fb9b8741f16feadc861e040d9e1ae9b50b2b97db
|
@@ -9,17 +9,18 @@ module RuboCop
|
|
9
9
|
|
10
10
|
msg = nil
|
11
11
|
Rubocop::DefinitionValidator::ChangeDetector.changed_methods.each do |m|
|
12
|
-
old, new = m
|
12
|
+
old, new = m.removed, m.added
|
13
13
|
|
14
14
|
next if old.name.size <= min
|
15
15
|
|
16
|
-
|
16
|
+
PryTestcase.pry
|
17
|
+
old_callable, *_ = old.callable?(name, args)
|
17
18
|
next unless old_callable
|
18
19
|
|
19
|
-
new_callable, reason = new.callable?(name, args)
|
20
|
+
new_callable, *reason = new.callable?(name, args)
|
20
21
|
next if new_callable
|
21
22
|
|
22
|
-
msg =
|
23
|
+
msg = Rubocop::DefinitionValidator::Message.new(m).of(*reason)
|
23
24
|
end
|
24
25
|
|
25
26
|
return unless msg
|
@@ -9,7 +9,8 @@ RuboCop::DefinitionValidator::Inject.defaults!
|
|
9
9
|
|
10
10
|
require 'rubocop/definition_validator/line'
|
11
11
|
require 'rubocop/definition_validator/patch'
|
12
|
-
require 'rubocop/definition_validator/
|
12
|
+
require 'rubocop/definition_validator/message'
|
13
|
+
require 'rubocop/definition_validator/changed_method'
|
13
14
|
require 'rubocop/definition_validator/method'
|
14
15
|
require 'rubocop/definition_validator/change_detector'
|
15
16
|
|
@@ -15,17 +15,8 @@ module Rubocop::DefinitionValidator::ChangeDetector
|
|
15
15
|
# {added: Method, removed: Method}
|
16
16
|
# ]
|
17
17
|
@changed_methods = patches
|
18
|
-
.map{|patch| patch.
|
18
|
+
.map{|patch| patch.changed_methods}
|
19
19
|
.flatten
|
20
|
-
.map{|code|
|
21
|
-
code.map{|k, v|
|
22
|
-
begin
|
23
|
-
[k, Rubocop::DefinitionValidator::Method.new(v.body)]
|
24
|
-
rescue Rubocop::DefinitionValidator::Method::InvalidAST
|
25
|
-
nil
|
26
|
-
end
|
27
|
-
}.compact.to_h
|
28
|
-
}
|
29
20
|
end
|
30
21
|
end
|
31
22
|
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# This class has added method, removed method, line number and file name.
|
2
|
+
class Rubocop::DefinitionValidator::ChangedMethod
|
3
|
+
attr_reader :added, :removed, :line, :file_name
|
4
|
+
|
5
|
+
def initialize(added_line, removed_line, lineno, fname)
|
6
|
+
@added = Rubocop::DefinitionValidator::Method.new(added_line.body)
|
7
|
+
@removed = Rubocop::DefinitionValidator::Method.new(removed_line.body)
|
8
|
+
@line = lineno
|
9
|
+
@file_name = fname
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
class Rubocop::DefinitionValidator::Message
|
2
|
+
# @param [ChangedMethod] method
|
3
|
+
def initialize(method)
|
4
|
+
@method = method
|
5
|
+
end
|
6
|
+
|
7
|
+
# @param [Symbol] reason
|
8
|
+
def of(reason, *args)
|
9
|
+
__send__(reason, *args) + suffix
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
# @return [Proc]
|
16
|
+
def method_name
|
17
|
+
"#{@method.removed.name} is undefined. Did you mean? #{@method.added.name}"
|
18
|
+
end
|
19
|
+
|
20
|
+
# @param [Integer] given given args size.
|
21
|
+
# @param [Integer] expected expected args size.
|
22
|
+
# @return [Proc]
|
23
|
+
def not_enough_norml_arguments(given, expected)
|
24
|
+
n = expected - given
|
25
|
+
not_enough_arg_names = @method.added.normal_params.dup.pop(n).map{|x| x[1]}
|
26
|
+
"Not enough arguments. Did you forget the following arguments? [#{not_enough_arg_names.join(', ')}]"
|
27
|
+
end
|
28
|
+
|
29
|
+
# @param [Integer] given given args size.
|
30
|
+
# @param [Integer] expected expected args size.
|
31
|
+
# @return [Proc]
|
32
|
+
def not_enough_normal_after_rest_arguments(given, expected)
|
33
|
+
n = expected - given
|
34
|
+
not_enough_arg_names = @method.added.normal_params_after_rest.dup.pop(n).map{|x| x[1]}
|
35
|
+
"Not enough arguments. Did you forget the following arguments? [#{not_enough_arg_names.join(', ')}]"
|
36
|
+
end
|
37
|
+
|
38
|
+
def too_many_arguments
|
39
|
+
'Too many arguments'
|
40
|
+
end
|
41
|
+
|
42
|
+
def kwparam_required
|
43
|
+
"Keyword params is required."
|
44
|
+
end
|
45
|
+
|
46
|
+
# @param [String] got
|
47
|
+
def kwparam_should_be_hash(got)
|
48
|
+
"Keyword params should be a Hash. But got #{got}"
|
49
|
+
end
|
50
|
+
|
51
|
+
# @param [Array<String>] not_founds
|
52
|
+
def kwparam_not_found(not_founds)
|
53
|
+
"The following keyword parameters are required. But not received. [#{not_founds.join(', ')}]"
|
54
|
+
end
|
55
|
+
|
56
|
+
def unexpected_kwparam(unexpected)
|
57
|
+
"The following keyword parameters are not expected. But received. [#{unexpected.join(', ')}]"
|
58
|
+
end
|
59
|
+
|
60
|
+
|
61
|
+
|
62
|
+
def suffix
|
63
|
+
"\nThis method is defined at #{@method.file_name} L#{@method.line}"
|
64
|
+
end
|
65
|
+
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'ripper'
|
2
2
|
|
3
3
|
module Rubocop::DefinitionValidator
|
4
|
+
# a method
|
4
5
|
class Method
|
5
6
|
class InvalidAST < ArgumentError; end
|
6
7
|
|
@@ -47,9 +48,9 @@ module Rubocop::DefinitionValidator
|
|
47
48
|
|
48
49
|
# @param [Array<RuboCop::Node>] args
|
49
50
|
# @return [Boolean] callable
|
50
|
-
# @return [
|
51
|
+
# @return [Object] cause
|
51
52
|
def callable?(name, args)
|
52
|
-
return false,
|
53
|
+
return false, :method_name unless name == @name
|
53
54
|
|
54
55
|
args = args.dup
|
55
56
|
|
@@ -57,11 +58,8 @@ module Rubocop::DefinitionValidator
|
|
57
58
|
normal_params_size = (normal_params || []).size
|
58
59
|
received_normal_params_size = args.shift(normal_params_size).size
|
59
60
|
unless received_normal_params_size == normal_params_size
|
60
|
-
return false,
|
61
|
-
|
62
|
-
normal_params_size,
|
63
|
-
:normal_params,
|
64
|
-
)
|
61
|
+
return false, :not_enough_norml_arguments, received_normal_params_size, normal_params_size
|
62
|
+
|
65
63
|
end
|
66
64
|
|
67
65
|
if has_required_keyword_params?
|
@@ -99,11 +97,7 @@ module Rubocop::DefinitionValidator
|
|
99
97
|
normal_params_after_rest_size = (normal_params_after_rest || []).size
|
100
98
|
given_normal_params_after_rest_size = args.pop(normal_params_after_rest_size).size
|
101
99
|
unless given_normal_params_after_rest_size == normal_params_after_rest_size
|
102
|
-
return false,
|
103
|
-
given_normal_params_after_rest_size,
|
104
|
-
normal_params_after_rest_size,
|
105
|
-
:normal_params_after_rest
|
106
|
-
)
|
100
|
+
return false, :not_enough_normal_after_rest_arguments, given_normal_params_after_rest_size, normal_params_after_rest_size
|
107
101
|
end
|
108
102
|
|
109
103
|
# rest引数があれば全て呑み込むためtrue
|
@@ -112,22 +106,22 @@ module Rubocop::DefinitionValidator
|
|
112
106
|
if default_value_params
|
113
107
|
return true if args.size <= default_value_params.size
|
114
108
|
# XXX: optimize message.
|
115
|
-
return false,
|
109
|
+
return false, :too_many_arguments
|
116
110
|
end
|
117
111
|
return true if args.empty?
|
118
|
-
return false,
|
112
|
+
return false, :too_many_arguments
|
119
113
|
end
|
120
114
|
|
121
115
|
def decide_with_required_keyword_params(args)
|
122
116
|
kwparam = args.pop(1)
|
123
|
-
usable, reason = usable_as_keyword_param?(kwparam[0])
|
124
|
-
return false, reason unless usable
|
117
|
+
usable, *reason = usable_as_keyword_param?(kwparam[0])
|
118
|
+
return false, *reason unless usable
|
125
119
|
|
126
120
|
return decide_rest_args(args)
|
127
121
|
end
|
128
122
|
|
129
123
|
def decide_with_keyword_params(args)
|
130
|
-
ok, _ = decide_rest_args(args.dup)
|
124
|
+
ok, *_ = decide_rest_args(args.dup)
|
131
125
|
return true if ok
|
132
126
|
|
133
127
|
return decide_with_required_keyword_params(args)
|
@@ -148,8 +142,8 @@ module Rubocop::DefinitionValidator
|
|
148
142
|
# @param [RuboCop::Node] arg
|
149
143
|
def usable_as_keyword_param?(arg)
|
150
144
|
# should be hash
|
151
|
-
return false,
|
152
|
-
return false,
|
145
|
+
return false, :kwparam_required unless arg
|
146
|
+
return false, :kwparam_should_be_hash, arg.loc.expression.source unless arg.hash_type? || !arg.literal?
|
153
147
|
|
154
148
|
# should have specified keyword
|
155
149
|
return true unless arg.hash_type?
|
@@ -170,7 +164,7 @@ module Rubocop::DefinitionValidator
|
|
170
164
|
not received_keyword_names.include?(name)
|
171
165
|
end
|
172
166
|
unless not_fould_requireds.empty?
|
173
|
-
return false,
|
167
|
+
return false, :kwparam_not_found, not_fould_requireds.join(', ')
|
174
168
|
end
|
175
169
|
|
176
170
|
return true if keyword_rest_params
|
@@ -183,7 +177,7 @@ module Rubocop::DefinitionValidator
|
|
183
177
|
not allowed_keyword_names.include?(name)
|
184
178
|
end
|
185
179
|
unless unexpected_keywords.empty?
|
186
|
-
return false,
|
180
|
+
return false, :unexpected_kwparam, unexpected_keywords
|
187
181
|
end
|
188
182
|
return true
|
189
183
|
end
|
@@ -3,61 +3,64 @@
|
|
3
3
|
# The original method retuns only added lines.
|
4
4
|
# However we want added and removed lines.
|
5
5
|
#
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
module Rubocop::DefinitionValidator
|
7
|
+
class Patch < GitDiffParser::Patch
|
8
|
+
ADDED_LINE = -> (line) { line.start_with?('+') && line !~ /^\+\+\+/ }
|
9
|
+
REMOVED_LINE = -> (line) { line.start_with?('-') && line !~ /^\-\-\-/ }
|
9
10
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
def initialize(original_patch)
|
12
|
+
@body = original_patch.body
|
13
|
+
@file = original_patch.file
|
14
|
+
@secure_hash = original_patch.secure_hash
|
15
|
+
end
|
16
|
+
|
17
|
+
# @return [Array<Line>] changed lines
|
18
|
+
def changed_lines
|
19
|
+
line_number = 0
|
20
|
+
removed_line_offset = 0
|
15
21
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
22
|
+
lines.each_with_index.inject([]) do |lines, (content, patch_position)|
|
23
|
+
case content
|
24
|
+
when RANGE_INFORMATION_LINE
|
25
|
+
line_number = Regexp.last_match[:line_number].to_i
|
26
|
+
removed_line_offset = 0
|
27
|
+
when ADDED_LINE
|
28
|
+
line = Rubocop::DefinitionValidator::Line.new(
|
29
|
+
content: content,
|
30
|
+
number: line_number,
|
31
|
+
patch_position: patch_position
|
32
|
+
)
|
33
|
+
lines << line
|
34
|
+
line_number += 1
|
35
|
+
removed_line_offset = 0
|
36
|
+
when REMOVED_LINE
|
37
|
+
line = Rubocop::DefinitionValidator::Line.new(
|
38
|
+
content: content,
|
39
|
+
number: line_number + removed_line_offset,
|
40
|
+
patch_position: patch_position
|
41
|
+
)
|
42
|
+
lines << line
|
43
|
+
removed_line_offset +=1
|
44
|
+
when NOT_REMOVED_LINE
|
45
|
+
line_number += 1
|
46
|
+
removed_line_offset = 0
|
47
|
+
end
|
20
48
|
|
21
|
-
|
22
|
-
case content
|
23
|
-
when RANGE_INFORMATION_LINE
|
24
|
-
line_number = Regexp.last_match[:line_number].to_i
|
25
|
-
removed_line_offset = 0
|
26
|
-
when ADDED_LINE
|
27
|
-
line = Rubocop::DefinitionValidator::Line.new(
|
28
|
-
content: content,
|
29
|
-
number: line_number,
|
30
|
-
patch_position: patch_position
|
31
|
-
)
|
32
|
-
lines << line
|
33
|
-
line_number += 1
|
34
|
-
removed_line_offset = 0
|
35
|
-
when REMOVED_LINE
|
36
|
-
line = Rubocop::DefinitionValidator::Line.new(
|
37
|
-
content: content,
|
38
|
-
number: line_number + removed_line_offset,
|
39
|
-
patch_position: patch_position
|
40
|
-
)
|
41
|
-
lines << line
|
42
|
-
removed_line_offset +=1
|
43
|
-
when NOT_REMOVED_LINE
|
44
|
-
line_number += 1
|
45
|
-
removed_line_offset = 0
|
49
|
+
lines
|
46
50
|
end
|
51
|
+
end
|
47
52
|
|
53
|
+
def changed_methods
|
54
|
+
lines = changed_lines
|
48
55
|
lines
|
56
|
+
.group_by{|l| l.number}
|
57
|
+
.select{|_, v| v.size == 2}
|
58
|
+
.select{|_, v| t = v.map(&:type); t.include?('-') && t.include?('+')}
|
59
|
+
.select{|_, v| v.all?{|x| x.content =~ /def\s+\w+/}}
|
60
|
+
.map{|line, v|
|
61
|
+
sorted = v.sort_by(&:type)
|
62
|
+
ChangedMethod.new(sorted.first, sorted.last, line, @file)
|
63
|
+
}
|
49
64
|
end
|
50
65
|
end
|
51
|
-
|
52
|
-
def changed_method_codes
|
53
|
-
lines = changed_lines
|
54
|
-
lines
|
55
|
-
.group_by{|l| l.number}
|
56
|
-
.values
|
57
|
-
.select{|l| l.size == 2}
|
58
|
-
.select{|l| t = l.map(&:type); t.include?('-') && t.include?('+')}
|
59
|
-
.select{|l| l.all?{|x| x.content =~ /def\s+\w+/}}
|
60
|
-
.map{|l| l.sort_by(&:type)}
|
61
|
-
.map{|l| {added: l.first, removed: l.last}}
|
62
|
-
end
|
63
66
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubocop-definition_validator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Masataka Kuwabara
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-06-
|
11
|
+
date: 2016-06-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubocop
|
@@ -186,11 +186,12 @@ files:
|
|
186
186
|
- lib/rubocop/cop/lint/definition_validator.rb
|
187
187
|
- lib/rubocop/definition_validator.rb
|
188
188
|
- lib/rubocop/definition_validator/change_detector.rb
|
189
|
+
- lib/rubocop/definition_validator/changed_method.rb
|
189
190
|
- lib/rubocop/definition_validator/inject.rb
|
190
191
|
- lib/rubocop/definition_validator/line.rb
|
192
|
+
- lib/rubocop/definition_validator/message.rb
|
191
193
|
- lib/rubocop/definition_validator/method.rb
|
192
194
|
- lib/rubocop/definition_validator/patch.rb
|
193
|
-
- lib/rubocop/definition_validator/reason.rb
|
194
195
|
- lib/rubocop/definition_validator/version.rb
|
195
196
|
- rubocop-definition_validator.gemspec
|
196
197
|
homepage: https://github.com/actcat/rubocop-definition_validator
|
@@ -1,20 +0,0 @@
|
|
1
|
-
module Rubocop::DefinitionValidator::Reason
|
2
|
-
class << self
|
3
|
-
# @return [Proc]
|
4
|
-
def method_name
|
5
|
-
-> (old, new) { "#{old.name} is undefined. Did you mean? #{new.name}" }
|
6
|
-
end
|
7
|
-
|
8
|
-
# @param [Integer] given given args size.
|
9
|
-
# @param [Integer] expected expected args size.
|
10
|
-
# @param [Symbol] kind normal_params or normal_params_after_rest
|
11
|
-
# @return [Proc]
|
12
|
-
def not_enough_arguments(given, expected, kind)
|
13
|
-
n = expected - given
|
14
|
-
-> (_old, new) {
|
15
|
-
not_enough_arg_names = new.__send__(kind).dup.pop(n).map{|x| x[1]}
|
16
|
-
"Not enough arguments. Did you forget the following arguments? [#{not_enough_arg_names.join(', ')}]"
|
17
|
-
}
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|