rubocop 0.76.0 → 0.79.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/README.md +2 -2
- data/config/default.yml +290 -264
- data/lib/rubocop/ast/builder.rb +43 -42
- data/lib/rubocop/ast/node/block_node.rb +2 -0
- data/lib/rubocop/ast/node/def_node.rb +11 -0
- data/lib/rubocop/ast/node/forward_args_node.rb +18 -0
- data/lib/rubocop/ast/node.rb +1 -1
- data/lib/rubocop/ast/traversal.rb +11 -3
- data/lib/rubocop/cli/command/auto_genenerate_config.rb +105 -0
- data/lib/rubocop/cli/command/base.rb +33 -0
- data/lib/rubocop/cli/command/execute_runner.rb +76 -0
- data/lib/rubocop/cli/command/init_dotfile.rb +45 -0
- data/lib/rubocop/cli/command/show_cops.rb +80 -0
- data/lib/rubocop/cli/command/version.rb +17 -0
- data/lib/rubocop/cli/command.rb +21 -0
- data/lib/rubocop/cli/environment.rb +21 -0
- data/lib/rubocop/cli.rb +11 -230
- data/lib/rubocop/config.rb +1 -1
- data/lib/rubocop/config_loader.rb +19 -19
- data/lib/rubocop/config_obsoletion.rb +65 -12
- data/lib/rubocop/config_validator.rb +56 -98
- data/lib/rubocop/cop/autocorrect_logic.rb +7 -4
- data/lib/rubocop/cop/bundler/gem_comment.rb +4 -4
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +2 -2
- data/lib/rubocop/cop/cop.rb +21 -0
- data/lib/rubocop/cop/correctors/space_corrector.rb +1 -2
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
- data/lib/rubocop/cop/generator/configuration_injector.rb +1 -1
- data/lib/rubocop/cop/generator.rb +3 -4
- data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +59 -0
- data/lib/rubocop/cop/internal_affairs.rb +1 -0
- data/lib/rubocop/cop/layout/{align_arguments.rb → argument_alignment.rb} +1 -1
- data/lib/rubocop/cop/layout/{align_array.rb → array_alignment.rb} +1 -1
- data/lib/rubocop/cop/layout/{indent_assignment.rb → assignment_indentation.rb} +1 -1
- data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
- data/lib/rubocop/cop/layout/{indent_first_argument.rb → first_argument_indentation.rb} +5 -5
- data/lib/rubocop/cop/layout/{indent_first_array_element.rb → first_array_element_indentation.rb} +4 -4
- data/lib/rubocop/cop/layout/{indent_first_hash_element.rb → first_hash_element_indentation.rb} +3 -3
- data/lib/rubocop/cop/layout/{indent_first_parameter.rb → first_parameter_indentation.rb} +3 -3
- data/lib/rubocop/cop/layout/{align_hash.rb → hash_alignment.rb} +10 -6
- data/lib/rubocop/cop/layout/{indent_heredoc.rb → heredoc_indentation.rb} +5 -5
- data/lib/rubocop/cop/layout/{leading_blank_lines.rb → leading_empty_lines.rb} +1 -1
- data/lib/rubocop/cop/{metrics → layout}/line_length.rb +40 -110
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +14 -5
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
- data/lib/rubocop/cop/layout/{align_parameters.rb → parameter_alignment.rb} +1 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +12 -0
- data/lib/rubocop/cop/layout/space_around_operators.rb +32 -7
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +17 -0
- data/lib/rubocop/cop/layout/{trailing_blank_lines.rb → trailing_empty_lines.rb} +1 -1
- data/lib/rubocop/cop/lint/debugger.rb +2 -2
- data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +1 -1
- data/lib/rubocop/cop/lint/{duplicated_key.rb → duplicate_hash_key.rb} +1 -1
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
- data/lib/rubocop/cop/lint/{multiple_compare.rb → multiple_comparison.rb} +1 -1
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +89 -0
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +3 -3
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +4 -4
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +1 -1
- data/lib/rubocop/cop/lint/{string_conversion_in_interpolation.rb → redundant_string_coercion.rb} +1 -1
- data/lib/rubocop/cop/lint/redundant_with_index.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_with_object.rb +2 -2
- data/lib/rubocop/cop/lint/{handle_exceptions.rb → suppressed_exception.rb} +1 -1
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +57 -23
- data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -1
- data/lib/rubocop/cop/metrics/method_length.rb +1 -1
- data/lib/rubocop/cop/migration/department_name.rb +16 -1
- data/lib/rubocop/cop/mixin/alignment.rb +1 -1
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -7
- data/lib/rubocop/cop/mixin/{hash_alignment.rb → hash_alignment_styles.rb} +1 -1
- data/lib/rubocop/cop/mixin/line_length_help.rb +88 -0
- data/lib/rubocop/cop/mixin/nil_methods.rb +4 -4
- data/lib/rubocop/cop/mixin/rational_literal.rb +18 -0
- data/lib/rubocop/cop/mixin/statement_modifier.rb +2 -2
- data/lib/rubocop/cop/mixin/trailing_comma.rb +6 -3
- data/lib/rubocop/cop/naming/{uncommunicative_block_param_name.rb → block_parameter_name.rb} +3 -3
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +5 -5
- data/lib/rubocop/cop/naming/{uncommunicative_method_param_name.rb → method_parameter_name.rb} +4 -4
- data/lib/rubocop/cop/naming/predicate_name.rb +6 -6
- data/lib/rubocop/cop/offense.rb +11 -0
- data/lib/rubocop/cop/registry.rb +7 -2
- data/lib/rubocop/cop/style/alias.rb +1 -1
- data/lib/rubocop/cop/style/array_join.rb +1 -1
- data/lib/rubocop/cop/style/attr.rb +8 -0
- data/lib/rubocop/cop/style/conditional_assignment.rb +2 -2
- data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
- data/lib/rubocop/cop/style/even_odd.rb +1 -1
- data/lib/rubocop/cop/style/guard_clause.rb +3 -2
- data/lib/rubocop/cop/style/if_unless_modifier.rb +38 -3
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/ip_addresses.rb +4 -4
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +168 -0
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +54 -0
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +4 -207
- data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
- data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -1
- data/lib/rubocop/cop/style/multiline_when_then.rb +5 -1
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +5 -5
- data/lib/rubocop/cop/style/next.rb +5 -5
- data/lib/rubocop/cop/style/numeric_literals.rb +7 -3
- data/lib/rubocop/cop/style/numeric_predicate.rb +4 -3
- data/lib/rubocop/cop/style/option_hash.rb +3 -3
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +7 -7
- data/lib/rubocop/cop/style/redundant_parentheses.rb +3 -3
- data/lib/rubocop/cop/style/redundant_return.rb +2 -8
- data/lib/rubocop/cop/style/redundant_sort.rb +1 -1
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +7 -1
- data/lib/rubocop/cop/style/trivial_accessors.rb +5 -5
- data/lib/rubocop/cop/style/while_until_modifier.rb +1 -1
- data/lib/rubocop/cop/style/yoda_condition.rb +16 -1
- data/lib/rubocop/cop/team.rb +5 -0
- data/lib/rubocop/formatter/base_formatter.rb +2 -2
- data/lib/rubocop/formatter/clang_style_formatter.rb +1 -3
- data/lib/rubocop/formatter/json_formatter.rb +6 -5
- data/lib/rubocop/formatter/tap_formatter.rb +1 -3
- data/lib/rubocop/node_pattern.rb +1 -1
- data/lib/rubocop/options.rb +8 -8
- data/lib/rubocop/processed_source.rb +1 -1
- data/lib/rubocop/rake_task.rb +1 -0
- data/lib/rubocop/result_cache.rb +23 -7
- data/lib/rubocop/rspec/shared_contexts.rb +5 -0
- data/lib/rubocop/runner.rb +18 -2
- data/lib/rubocop/target_ruby.rb +151 -0
- data/lib/rubocop/version.rb +1 -1
- data/lib/rubocop.rb +38 -22
- metadata +40 -25
- data/lib/rubocop/cop/mixin/safe_mode.rb +0 -24
@@ -19,9 +19,9 @@ module RuboCop
|
|
19
19
|
#
|
20
20
|
# @example
|
21
21
|
# # bad
|
22
|
-
# # rubocop:disable
|
22
|
+
# # rubocop:disable Layout/LineLength
|
23
23
|
# x += 1
|
24
|
-
# # rubocop:enable
|
24
|
+
# # rubocop:enable Layout/LineLength
|
25
25
|
#
|
26
26
|
# # good
|
27
27
|
# x += 1
|
@@ -213,7 +213,7 @@ module RuboCop
|
|
213
213
|
end
|
214
214
|
|
215
215
|
def matching_range(haystack, needle)
|
216
|
-
offset =
|
216
|
+
offset = haystack.source.index(needle)
|
217
217
|
return unless offset
|
218
218
|
|
219
219
|
offset += haystack.begin_pos
|
@@ -15,20 +15,20 @@ module RuboCop
|
|
15
15
|
# @example
|
16
16
|
# # bad
|
17
17
|
# foo = 1
|
18
|
-
# # rubocop:enable
|
18
|
+
# # rubocop:enable Layout/LineLength
|
19
19
|
#
|
20
20
|
# # good
|
21
21
|
# foo = 1
|
22
22
|
# @example
|
23
23
|
# # bad
|
24
|
-
# # rubocop:disable
|
24
|
+
# # rubocop:disable Layout/LineLength
|
25
25
|
# baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarrrrrrrrrrrrr
|
26
|
-
# # rubocop:enable
|
26
|
+
# # rubocop:enable Layout/LineLength
|
27
27
|
# baz
|
28
28
|
# # rubocop:enable all
|
29
29
|
#
|
30
30
|
# # good
|
31
|
-
# # rubocop:disable
|
31
|
+
# # rubocop:disable Layout/LineLength
|
32
32
|
# baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarrrrrrrrrrrrr
|
33
33
|
# # rubocop:enable all
|
34
34
|
# baz
|
@@ -50,7 +50,7 @@ module RuboCop
|
|
50
50
|
def autocorrect(node)
|
51
51
|
lambda do |corrector|
|
52
52
|
redundant_with_index?(node) do |send|
|
53
|
-
if send.
|
53
|
+
if send.method?(:each_with_index)
|
54
54
|
corrector.replace(send.loc.selector, 'each')
|
55
55
|
else
|
56
56
|
corrector.remove(with_index_range(send))
|
@@ -63,7 +63,7 @@ module RuboCop
|
|
63
63
|
private
|
64
64
|
|
65
65
|
def message(node)
|
66
|
-
if node.
|
66
|
+
if node.method?(:each_with_index)
|
67
67
|
MSG_EACH_WITH_INDEX
|
68
68
|
else
|
69
69
|
MSG_WITH_INDEX
|
@@ -51,7 +51,7 @@ module RuboCop
|
|
51
51
|
def autocorrect(node)
|
52
52
|
lambda do |corrector|
|
53
53
|
redundant_with_object?(node) do |send|
|
54
|
-
if send.
|
54
|
+
if send.method?(:each_with_object)
|
55
55
|
corrector.replace(with_object_range(send), 'each')
|
56
56
|
else
|
57
57
|
corrector.remove(with_object_range(send))
|
@@ -64,7 +64,7 @@ module RuboCop
|
|
64
64
|
private
|
65
65
|
|
66
66
|
def message(node)
|
67
|
-
if node.
|
67
|
+
if node.method?(:each_with_object)
|
68
68
|
MSG_EACH_WITH_OBJECT
|
69
69
|
else
|
70
70
|
MSG_WITH_OBJECT
|
@@ -9,23 +9,64 @@ module RuboCop
|
|
9
9
|
# always being defined, and thus access modifiers guarding such methods
|
10
10
|
# are not redundant.
|
11
11
|
#
|
12
|
-
#
|
12
|
+
# This cop has `ContextCreatingMethods` option. The default setting value
|
13
|
+
# is an empty array that means no method is specified.
|
14
|
+
# This setting is an array of methods which, when called, are known to
|
15
|
+
# create its own context in the module's current access context.
|
16
|
+
#
|
17
|
+
# It also has `MethodCreatingMethods` option. The default setting value
|
18
|
+
# is an empty array that means no method is specified.
|
19
|
+
# This setting is an array of methods which, when called, are known to
|
20
|
+
# create other methods in the module's current access context.
|
13
21
|
#
|
22
|
+
# @example
|
23
|
+
# # bad
|
14
24
|
# class Foo
|
15
25
|
# public # this is redundant (default access is public)
|
16
26
|
#
|
17
27
|
# def method
|
18
28
|
# end
|
29
|
+
# end
|
19
30
|
#
|
20
|
-
#
|
21
|
-
#
|
31
|
+
# # bad
|
32
|
+
# class Foo
|
33
|
+
# # The following is redundant (methods defined on the class'
|
34
|
+
# # singleton class are not affected by the public modifier)
|
35
|
+
# public
|
36
|
+
#
|
37
|
+
# def self.method3
|
22
38
|
# end
|
39
|
+
# end
|
23
40
|
#
|
41
|
+
# # bad
|
42
|
+
# class Foo
|
43
|
+
# protected
|
44
|
+
#
|
45
|
+
# define_method(:method2) do
|
46
|
+
# end
|
47
|
+
#
|
48
|
+
# protected # this is redundant (repeated from previous modifier)
|
49
|
+
#
|
50
|
+
# [1,2,3].each do |i|
|
51
|
+
# define_method("foo#{i}") do
|
52
|
+
# end
|
53
|
+
# end
|
54
|
+
# end
|
55
|
+
#
|
56
|
+
# # bad
|
57
|
+
# class Foo
|
24
58
|
# private # this is redundant (no following methods are defined)
|
25
59
|
# end
|
26
60
|
#
|
27
|
-
#
|
61
|
+
# # good
|
62
|
+
# class Foo
|
63
|
+
# private # this is not redundant (a method is defined)
|
64
|
+
#
|
65
|
+
# def method2
|
66
|
+
# end
|
67
|
+
# end
|
28
68
|
#
|
69
|
+
# # good
|
29
70
|
# class Foo
|
30
71
|
# # The following is not redundant (conditionally defined methods are
|
31
72
|
# # considered as always defining a method)
|
@@ -35,31 +76,22 @@ module RuboCop
|
|
35
76
|
# def method
|
36
77
|
# end
|
37
78
|
# end
|
79
|
+
# end
|
38
80
|
#
|
39
|
-
#
|
81
|
+
# # good
|
82
|
+
# class Foo
|
83
|
+
# protected # this is not redundant (a method is defined)
|
40
84
|
#
|
41
85
|
# define_method(:method2) do
|
42
86
|
# end
|
43
|
-
#
|
44
|
-
# protected # this is redundant (repeated from previous modifier)
|
45
|
-
#
|
46
|
-
# [1,2,3].each do |i|
|
47
|
-
# define_method("foo#{i}") do
|
48
|
-
# end
|
49
|
-
# end
|
50
|
-
#
|
51
|
-
# # The following is redundant (methods defined on the class'
|
52
|
-
# # singleton class are not affected by the public modifier)
|
53
|
-
# public
|
54
|
-
#
|
55
|
-
# def self.method3
|
56
|
-
# end
|
57
87
|
# end
|
58
88
|
#
|
59
|
-
# @example
|
89
|
+
# @example ContextCreatingMethods: concerning
|
60
90
|
# # Lint/UselessAccessModifier:
|
61
91
|
# # ContextCreatingMethods:
|
62
92
|
# # - concerning
|
93
|
+
#
|
94
|
+
# # good
|
63
95
|
# require 'active_support/concern'
|
64
96
|
# class Foo
|
65
97
|
# concerning :Bar do
|
@@ -79,10 +111,12 @@ module RuboCop
|
|
79
111
|
# end
|
80
112
|
# end
|
81
113
|
#
|
82
|
-
# @example
|
114
|
+
# @example MethodCreatingMethods: delegate
|
83
115
|
# # Lint/UselessAccessModifier:
|
84
116
|
# # MethodCreatingMethods:
|
85
117
|
# # - delegate
|
118
|
+
#
|
119
|
+
# # good
|
86
120
|
# require 'active_support/core_ext/module/delegation'
|
87
121
|
# class Foo
|
88
122
|
# # this is not redundant because `delegate` creates methods
|
@@ -141,7 +175,7 @@ module RuboCop
|
|
141
175
|
|
142
176
|
def access_modifier?(node)
|
143
177
|
node.bare_access_modifier? ||
|
144
|
-
node.
|
178
|
+
node.method?(:private_class_method)
|
145
179
|
end
|
146
180
|
|
147
181
|
def check_scope(node)
|
@@ -169,7 +203,7 @@ module RuboCop
|
|
169
203
|
def check_send_node(node, cur_vis, unused)
|
170
204
|
if node.bare_access_modifier?
|
171
205
|
check_new_visibility(node, unused, node.method_name, cur_vis)
|
172
|
-
elsif node.
|
206
|
+
elsif node.method?(:private_class_method) && !node.arguments?
|
173
207
|
add_offense(node, message: format(MSG, current: node.method_name))
|
174
208
|
[cur_vis, unused]
|
175
209
|
end
|
@@ -10,13 +10,24 @@ module RuboCop
|
|
10
10
|
|
11
11
|
MSG = 'Department name is missing.'
|
12
12
|
|
13
|
+
DISABLE_COMMENT_FORMAT =
|
14
|
+
/\A(# *rubocop *: *((dis|en)able|todo) +)(.*)/.freeze
|
15
|
+
|
16
|
+
# The token that makes up a disable comment.
|
17
|
+
# The token used after `# rubocop: disable` are `A-z`, `/`, and `,`.
|
18
|
+
# Also `A-z` includes `all`.
|
19
|
+
DISABLING_COPS_CONTENT_TOKEN = %r{[A-z/,]+}.freeze
|
20
|
+
|
13
21
|
def investigate(processed_source)
|
14
22
|
processed_source.each_comment do |comment|
|
15
|
-
next if comment.text !~
|
23
|
+
next if comment.text !~ DISABLE_COMMENT_FORMAT
|
16
24
|
|
17
25
|
offset = Regexp.last_match(1).length
|
18
26
|
Regexp.last_match(4).scan(%r{[\w/]+|\W+}) do |name|
|
27
|
+
break unless valid_content_token?(name.strip)
|
28
|
+
|
19
29
|
check_cop_name(name, comment, offset)
|
30
|
+
|
20
31
|
offset += name.length
|
21
32
|
end
|
22
33
|
end
|
@@ -38,6 +49,10 @@ module RuboCop
|
|
38
49
|
range = range_between(start, start + name.length)
|
39
50
|
add_offense(range, location: range)
|
40
51
|
end
|
52
|
+
|
53
|
+
def valid_content_token?(content_token)
|
54
|
+
!DISABLING_COPS_CONTENT_TOKEN.match(content_token).nil?
|
55
|
+
end
|
41
56
|
end
|
42
57
|
end
|
43
58
|
end
|
@@ -35,7 +35,7 @@ module RuboCop
|
|
35
35
|
# If this offense is within a line range that is already being
|
36
36
|
# realigned by autocorrect, we report the offense without
|
37
37
|
# autocorrecting it. Two rewrites in the same area by the same
|
38
|
-
# cop
|
38
|
+
# cop cannot be handled. The next iteration will find the
|
39
39
|
# offense again and correct it.
|
40
40
|
add_offense(nil, location: expr)
|
41
41
|
else
|
@@ -40,13 +40,7 @@ module RuboCop
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def leading_comment_lines
|
43
|
-
|
44
|
-
|
45
|
-
comments.each_with_object([]) do |comment, leading_comments|
|
46
|
-
next if comment.loc.line > 3
|
47
|
-
|
48
|
-
leading_comments << comment.text
|
49
|
-
end
|
43
|
+
processed_source.comments.first(3).map(&:text)
|
50
44
|
end
|
51
45
|
end
|
52
46
|
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
# Help methods for determining if a line is too long.
|
6
|
+
module LineLengthHelp
|
7
|
+
private
|
8
|
+
|
9
|
+
def ignore_cop_directives?
|
10
|
+
config.for_cop('Layout/LineLength')['IgnoreCopDirectives']
|
11
|
+
end
|
12
|
+
|
13
|
+
def directive_on_source_line?(line_index)
|
14
|
+
source_line_number = line_index + processed_source.buffer.first_line
|
15
|
+
comment =
|
16
|
+
processed_source.comments
|
17
|
+
.detect { |e| e.location.line == source_line_number }
|
18
|
+
|
19
|
+
return false unless comment
|
20
|
+
|
21
|
+
comment.text.match(CommentConfig::COMMENT_DIRECTIVE_REGEXP)
|
22
|
+
end
|
23
|
+
|
24
|
+
def allow_uri?
|
25
|
+
config.for_cop('Layout/LineLength')['AllowURI']
|
26
|
+
end
|
27
|
+
|
28
|
+
def allowed_uri_position?(line, uri_range)
|
29
|
+
uri_range.begin < max_line_length &&
|
30
|
+
(uri_range.end == line_length(line) ||
|
31
|
+
uri_range.end == line_length(line) - 1)
|
32
|
+
end
|
33
|
+
|
34
|
+
def line_length(line)
|
35
|
+
line.length + indentation_difference(line)
|
36
|
+
end
|
37
|
+
|
38
|
+
def find_excessive_uri_range(line)
|
39
|
+
last_uri_match = match_uris(line).last
|
40
|
+
return nil unless last_uri_match
|
41
|
+
|
42
|
+
begin_position, end_position = last_uri_match.offset(0).map do |pos|
|
43
|
+
pos + indentation_difference(line)
|
44
|
+
end
|
45
|
+
return nil if begin_position < max_line_length &&
|
46
|
+
end_position < max_line_length
|
47
|
+
|
48
|
+
begin_position...end_position
|
49
|
+
end
|
50
|
+
|
51
|
+
def match_uris(string)
|
52
|
+
matches = []
|
53
|
+
string.scan(uri_regexp) do
|
54
|
+
matches << $LAST_MATCH_INFO if valid_uri?($LAST_MATCH_INFO[0])
|
55
|
+
end
|
56
|
+
matches
|
57
|
+
end
|
58
|
+
|
59
|
+
def indentation_difference(line)
|
60
|
+
return 0 unless tab_indentation_width
|
61
|
+
|
62
|
+
line.match(/^\t*/)[0].size * (tab_indentation_width - 1)
|
63
|
+
end
|
64
|
+
|
65
|
+
def tab_indentation_width
|
66
|
+
config.for_cop('Layout/Tab')['IndentationWidth']
|
67
|
+
end
|
68
|
+
|
69
|
+
def uri_regexp
|
70
|
+
@uri_regexp ||=
|
71
|
+
URI::DEFAULT_PARSER
|
72
|
+
.make_regexp(config.for_cop('Layout/LineLength')['URISchemes'])
|
73
|
+
end
|
74
|
+
|
75
|
+
def valid_uri?(uri_ish_string)
|
76
|
+
URI.parse(uri_ish_string)
|
77
|
+
true
|
78
|
+
rescue URI::InvalidURIError, NoMethodError
|
79
|
+
false
|
80
|
+
end
|
81
|
+
|
82
|
+
def line_length_without_directive(line)
|
83
|
+
before_comment, = line.split(CommentConfig::COMMENT_DIRECTIVE_REGEXP)
|
84
|
+
before_comment.rstrip.length
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -5,20 +5,20 @@ module RuboCop
|
|
5
5
|
# This module provides a list of methods that are:
|
6
6
|
# 1. In the NilClass by default
|
7
7
|
# 2. Added to NilClass by explicitly requiring any standard libraries
|
8
|
-
# 3. Cop's configuration parameter
|
8
|
+
# 3. Cop's configuration parameter AllowedMethods.
|
9
9
|
module NilMethods
|
10
10
|
private
|
11
11
|
|
12
12
|
def nil_methods
|
13
|
-
nil.methods + other_stdlib_methods +
|
13
|
+
nil.methods + other_stdlib_methods + allowed_methods
|
14
14
|
end
|
15
15
|
|
16
16
|
def other_stdlib_methods
|
17
17
|
[:to_d]
|
18
18
|
end
|
19
19
|
|
20
|
-
def
|
21
|
-
cop_config['
|
20
|
+
def allowed_methods
|
21
|
+
cop_config['AllowedMethods'].map(&:to_sym)
|
22
22
|
end
|
23
23
|
end
|
24
24
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
# Common functionality for handling Rational literals.
|
6
|
+
module RationalLiteral
|
7
|
+
extend NodePattern::Macros
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def_node_matcher :rational_literal?, <<~PATTERN
|
12
|
+
(send
|
13
|
+
(int _) :/
|
14
|
+
(rational _))
|
15
|
+
PATTERN
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -52,9 +52,9 @@ module RuboCop
|
|
52
52
|
end
|
53
53
|
|
54
54
|
def max_line_length
|
55
|
-
return unless config.for_cop('
|
55
|
+
return unless config.for_cop('Layout/LineLength')['Enabled']
|
56
56
|
|
57
|
-
config.for_cop('
|
57
|
+
config.for_cop('Layout/LineLength')['Max']
|
58
58
|
end
|
59
59
|
|
60
60
|
def indentation_multiplier
|
@@ -93,9 +93,12 @@ module RuboCop
|
|
93
93
|
end
|
94
94
|
|
95
95
|
def method_name_and_arguments_on_same_line?(node)
|
96
|
-
|
97
|
-
|
98
|
-
|
96
|
+
return false unless node.call_type?
|
97
|
+
|
98
|
+
line = node.loc.selector.nil? ? node.loc.line : node.loc.selector.line
|
99
|
+
|
100
|
+
line == node.last_argument.last_line &&
|
101
|
+
node.last_line == node.last_argument.last_line
|
99
102
|
end
|
100
103
|
|
101
104
|
# A single argument with the closing bracket on the same line as the end
|
@@ -11,9 +11,9 @@ module RuboCop
|
|
11
11
|
# The `AllowNamesEndingInNumbers` config option takes a boolean. When
|
12
12
|
# set to false, this cop will register offenses for names ending with
|
13
13
|
# numbers. Its default is false. The `AllowedNames` config option
|
14
|
-
# takes an array of
|
14
|
+
# takes an array of permitted names that will never register an
|
15
15
|
# offense. The `ForbiddenNames` config option takes an array of
|
16
|
-
#
|
16
|
+
# restricted names that will always register an offense.
|
17
17
|
#
|
18
18
|
# @example
|
19
19
|
# # bad
|
@@ -35,7 +35,7 @@ module RuboCop
|
|
35
35
|
# foo { |speed, distance| speed * distance }
|
36
36
|
#
|
37
37
|
# baz { |age, height, gender| do_stuff(age, height, gender) }
|
38
|
-
class
|
38
|
+
class BlockParameterName < Cop
|
39
39
|
include UncommunicativeName
|
40
40
|
|
41
41
|
def on_block(node)
|
@@ -5,7 +5,7 @@ module RuboCop
|
|
5
5
|
module Naming
|
6
6
|
# This cop checks that your heredocs are using meaningful delimiters.
|
7
7
|
# By default it disallows `END` and `EO*`, and can be configured through
|
8
|
-
#
|
8
|
+
# forbidden listing additional delimiters.
|
9
9
|
#
|
10
10
|
# @example
|
11
11
|
#
|
@@ -41,13 +41,13 @@ module RuboCop
|
|
41
41
|
|
42
42
|
return false unless delimiters =~ /\w/
|
43
43
|
|
44
|
-
|
45
|
-
delimiters =~ Regexp.new(
|
44
|
+
forbidden_delimiters.none? do |forbidden_delimiter|
|
45
|
+
delimiters =~ Regexp.new(forbidden_delimiter)
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
49
|
-
def
|
50
|
-
cop_config['
|
49
|
+
def forbidden_delimiters
|
50
|
+
cop_config['ForbiddenDelimiters'] || []
|
51
51
|
end
|
52
52
|
end
|
53
53
|
end
|
data/lib/rubocop/cop/naming/{uncommunicative_method_param_name.rb → method_parameter_name.rb}
RENAMED
@@ -11,9 +11,9 @@ module RuboCop
|
|
11
11
|
# The `AllowNamesEndingInNumbers` config option takes a boolean. When
|
12
12
|
# set to false, this cop will register offenses for names ending with
|
13
13
|
# numbers. Its default is false. The `AllowedNames` config option
|
14
|
-
# takes an array of
|
14
|
+
# takes an array of permitted names that will never register an
|
15
15
|
# offense. The `ForbiddenNames` config option takes an array of
|
16
|
-
#
|
16
|
+
# restricted names that will always register an offense.
|
17
17
|
#
|
18
18
|
# @example
|
19
19
|
# # bad
|
@@ -43,13 +43,13 @@ module RuboCop
|
|
43
43
|
# def baz(age_a, height_b, gender_c)
|
44
44
|
# do_stuff(age_a, height_b, gender_c)
|
45
45
|
# end
|
46
|
-
class
|
46
|
+
class MethodParameterName < Cop
|
47
47
|
include UncommunicativeName
|
48
48
|
|
49
49
|
def on_def(node)
|
50
50
|
return unless node.arguments?
|
51
51
|
|
52
|
-
check(node, node.arguments)
|
52
|
+
check(node, node.arguments.reject(&:forward_args_type?))
|
53
53
|
end
|
54
54
|
alias on_defs on_def
|
55
55
|
end
|
@@ -70,11 +70,11 @@ module RuboCop
|
|
70
70
|
!method_name.match(/^#{prefix}[^0-9]/) ||
|
71
71
|
method_name == expected_name(method_name, prefix) ||
|
72
72
|
method_name.end_with?('=') ||
|
73
|
-
|
73
|
+
allowed_methods.include?(method_name)
|
74
74
|
end
|
75
75
|
|
76
76
|
def expected_name(method_name, prefix)
|
77
|
-
new_name = if
|
77
|
+
new_name = if forbidden_prefixes.include?(prefix)
|
78
78
|
method_name.sub(prefix, '')
|
79
79
|
else
|
80
80
|
method_name.dup
|
@@ -87,16 +87,16 @@ module RuboCop
|
|
87
87
|
"Rename `#{method_name}` to `#{new_name}`."
|
88
88
|
end
|
89
89
|
|
90
|
-
def
|
91
|
-
cop_config['
|
90
|
+
def forbidden_prefixes
|
91
|
+
cop_config['ForbiddenPrefixes']
|
92
92
|
end
|
93
93
|
|
94
94
|
def predicate_prefixes
|
95
95
|
cop_config['NamePrefix']
|
96
96
|
end
|
97
97
|
|
98
|
-
def
|
99
|
-
cop_config['
|
98
|
+
def allowed_methods
|
99
|
+
cop_config['AllowedMethods']
|
100
100
|
end
|
101
101
|
|
102
102
|
def method_definition_macros(macro_name)
|
data/lib/rubocop/cop/offense.rb
CHANGED
@@ -65,6 +65,17 @@ module RuboCop
|
|
65
65
|
freeze
|
66
66
|
end
|
67
67
|
|
68
|
+
# @api public
|
69
|
+
#
|
70
|
+
# @!attribute [r] correctable?
|
71
|
+
#
|
72
|
+
# @return [Boolean]
|
73
|
+
# whether this offense can be automatically corrected via
|
74
|
+
# autocorrect or a todo.
|
75
|
+
def correctable?
|
76
|
+
@status != :unsupported
|
77
|
+
end
|
78
|
+
|
68
79
|
# @api public
|
69
80
|
#
|
70
81
|
# @!attribute [r] corrected?
|
data/lib/rubocop/cop/registry.rb
CHANGED
@@ -146,10 +146,15 @@ module RuboCop
|
|
146
146
|
|
147
147
|
def enabled?(cop, config, only_safe)
|
148
148
|
cfg = config.for_cop(cop)
|
149
|
+
|
150
|
+
# cfg['Enabled'] might be a string `pending`, which is considered
|
151
|
+
# disabled
|
152
|
+
cop_enabled = cfg.fetch('Enabled') == true
|
153
|
+
|
149
154
|
if only_safe
|
150
|
-
|
155
|
+
cop_enabled && cfg.fetch('Safe', true)
|
151
156
|
else
|
152
|
-
|
157
|
+
cop_enabled
|
153
158
|
end
|
154
159
|
end
|
155
160
|
|