rubocop 1.76.2 → 1.77.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 +1 -1
- data/config/default.yml +19 -0
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -2
- data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +0 -22
- data/lib/rubocop/cop/gemspec/require_mfa.rb +15 -1
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +4 -4
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/line_length.rb +26 -5
- data/lib/rubocop/cop/layout/space_before_brackets.rb +2 -9
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +7 -2
- data/lib/rubocop/cop/lint/float_comparison.rb +4 -4
- data/lib/rubocop/cop/lint/literal_as_condition.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
- data/lib/rubocop/cop/lint/self_assignment.rb +25 -0
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +8 -0
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +3 -3
- data/lib/rubocop/cop/mixin/alignment.rb +1 -1
- data/lib/rubocop/cop/mixin/gemspec_help.rb +22 -0
- data/lib/rubocop/cop/mixin/line_length_help.rb +24 -8
- data/lib/rubocop/cop/naming/file_name.rb +2 -2
- data/lib/rubocop/cop/naming/predicate_method.rb +42 -6
- data/lib/rubocop/cop/naming/predicate_prefix.rb +2 -2
- data/lib/rubocop/cop/style/case_like_if.rb +1 -1
- data/lib/rubocop/cop/style/collection_querying.rb +167 -0
- data/lib/rubocop/cop/style/exponential_notation.rb +2 -2
- data/lib/rubocop/cop/style/fetch_env_var.rb +32 -6
- data/lib/rubocop/cop/style/hash_conversion.rb +12 -3
- data/lib/rubocop/cop/style/if_unless_modifier.rb +11 -2
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/redundant_interpolation.rb +1 -1
- data/lib/rubocop/cop/style/redundant_parentheses.rb +4 -1
- data/lib/rubocop/cop/style/redundant_self.rb +3 -0
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +2 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +1 -1
- data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/offense_count_formatter.rb +1 -1
- data/lib/rubocop/lsp/diagnostic.rb +4 -4
- data/lib/rubocop/version.rb +1 -1
- data/lib/rubocop.rb +2 -0
- data/lib/ruby_lsp/rubocop/addon.rb +2 -2
- metadata +6 -4
@@ -25,20 +25,24 @@ module RuboCop
|
|
25
25
|
config.for_cop('Layout/LineLength')['AllowURI']
|
26
26
|
end
|
27
27
|
|
28
|
-
def
|
29
|
-
|
28
|
+
def allow_qualified_name?
|
29
|
+
config.for_cop('Layout/LineLength')['AllowQualifiedName']
|
30
|
+
end
|
31
|
+
|
32
|
+
def allowed_position?(line, range)
|
33
|
+
range.begin < max_line_length && range.end == line_length(line)
|
30
34
|
end
|
31
35
|
|
32
36
|
def line_length(line)
|
33
37
|
line.length + indentation_difference(line)
|
34
38
|
end
|
35
39
|
|
36
|
-
def
|
37
|
-
|
38
|
-
return nil unless
|
40
|
+
def find_excessive_range(line, type)
|
41
|
+
last_match = (type == :uri ? match_uris(line) : match_qualified_names(line)).last
|
42
|
+
return nil unless last_match
|
39
43
|
|
40
|
-
begin_position, end_position =
|
41
|
-
end_position =
|
44
|
+
begin_position, end_position = last_match.offset(0)
|
45
|
+
end_position = extend_end_position(line, end_position)
|
42
46
|
|
43
47
|
line_indentation_difference = indentation_difference(line)
|
44
48
|
begin_position += line_indentation_difference
|
@@ -57,6 +61,14 @@ module RuboCop
|
|
57
61
|
matches
|
58
62
|
end
|
59
63
|
|
64
|
+
def match_qualified_names(string)
|
65
|
+
matches = []
|
66
|
+
string.scan(qualified_name_regexp) do
|
67
|
+
matches << $LAST_MATCH_INFO
|
68
|
+
end
|
69
|
+
matches
|
70
|
+
end
|
71
|
+
|
60
72
|
def indentation_difference(line)
|
61
73
|
return 0 unless tab_indentation_width
|
62
74
|
|
@@ -70,7 +82,7 @@ module RuboCop
|
|
70
82
|
index * (tab_indentation_width - 1)
|
71
83
|
end
|
72
84
|
|
73
|
-
def
|
85
|
+
def extend_end_position(line, end_position)
|
74
86
|
# Extend the end position YARD comments with linked URLs of the form {<uri> <title>}
|
75
87
|
if line&.match(/{(\s|\S)*}$/)
|
76
88
|
match = line[end_position..line_length(line)]&.match(/(\s|\S)*}/)
|
@@ -101,6 +113,10 @@ module RuboCop
|
|
101
113
|
end
|
102
114
|
end
|
103
115
|
|
116
|
+
def qualified_name_regexp
|
117
|
+
/\b(?:[A-Z][A-Za-z0-9_]*::)+[A-Za-z_][A-Za-z0-9_]*\b/
|
118
|
+
end
|
119
|
+
|
104
120
|
def valid_uri?(uri_ish_string)
|
105
121
|
URI.parse(uri_ish_string)
|
106
122
|
true
|
@@ -152,7 +152,7 @@ module RuboCop
|
|
152
152
|
|
153
153
|
const_namespace, const_name = *const
|
154
154
|
next if name != const_name && !match_acronym?(name, const_name)
|
155
|
-
next unless namespace.empty? ||
|
155
|
+
next unless namespace.empty? || namespace_matches?(child, const_namespace, namespace)
|
156
156
|
|
157
157
|
return node
|
158
158
|
end
|
@@ -169,7 +169,7 @@ module RuboCop
|
|
169
169
|
s(:const, namespace, name) if name
|
170
170
|
end
|
171
171
|
|
172
|
-
def
|
172
|
+
def namespace_matches?(node, namespace, expected)
|
173
173
|
match_partial = partial_matcher!(expected)
|
174
174
|
|
175
175
|
match_partial.call(namespace)
|
@@ -10,8 +10,9 @@ module RuboCop
|
|
10
10
|
# end in a question mark.
|
11
11
|
#
|
12
12
|
# The cop assesses a predicate method as one that returns boolean values. Likewise,
|
13
|
-
# a method that only returns literal values is assessed as non-predicate.
|
14
|
-
#
|
13
|
+
# a method that only returns literal values is assessed as non-predicate. Other predicate
|
14
|
+
# method calls are assumed to return boolean values. The cop does not make an assessment
|
15
|
+
# if the return type is unknown (non-predicate method calls, variables, etc.).
|
15
16
|
#
|
16
17
|
# NOTE: Operator methods (`def ==`, etc.) are ignored.
|
17
18
|
#
|
@@ -49,6 +50,36 @@ module RuboCop
|
|
49
50
|
# 5
|
50
51
|
# end
|
51
52
|
#
|
53
|
+
# # bad
|
54
|
+
# def foo
|
55
|
+
# x == y
|
56
|
+
# end
|
57
|
+
#
|
58
|
+
# # good
|
59
|
+
# def foo?
|
60
|
+
# x == y
|
61
|
+
# end
|
62
|
+
#
|
63
|
+
# # bad
|
64
|
+
# def foo
|
65
|
+
# !x
|
66
|
+
# end
|
67
|
+
#
|
68
|
+
# # good
|
69
|
+
# def foo?
|
70
|
+
# !x
|
71
|
+
# end
|
72
|
+
#
|
73
|
+
# # bad - returns the value of another predicate method
|
74
|
+
# def foo
|
75
|
+
# bar?
|
76
|
+
# end
|
77
|
+
#
|
78
|
+
# # good
|
79
|
+
# def foo?
|
80
|
+
# bar?
|
81
|
+
# end
|
82
|
+
#
|
52
83
|
# # good - operator method
|
53
84
|
# def ==(other)
|
54
85
|
# hash == other.hash
|
@@ -126,12 +157,14 @@ module RuboCop
|
|
126
157
|
return false unless conservative?
|
127
158
|
|
128
159
|
return_values.any? do |value|
|
129
|
-
value.type?(:super, :zsuper) ||
|
160
|
+
value.type?(:super, :zsuper) || unknown_method_call?(value)
|
130
161
|
end
|
131
162
|
end
|
132
163
|
|
133
|
-
def
|
134
|
-
|
164
|
+
def unknown_method_call?(value)
|
165
|
+
return false unless value.call_type?
|
166
|
+
|
167
|
+
!value.comparison_method? && !value.predicate_method? && !value.negation_method?
|
135
168
|
end
|
136
169
|
|
137
170
|
def return_values(node)
|
@@ -156,7 +189,10 @@ module RuboCop
|
|
156
189
|
end
|
157
190
|
|
158
191
|
def boolean_return?(value)
|
159
|
-
|
192
|
+
return true if value.boolean_type?
|
193
|
+
return false unless value.call_type?
|
194
|
+
|
195
|
+
value.comparison_method? || value.predicate_method? || value.negation_method?
|
160
196
|
end
|
161
197
|
|
162
198
|
def potential_non_predicate?(return_values)
|
@@ -105,7 +105,7 @@ module RuboCop
|
|
105
105
|
|
106
106
|
# @!method dynamic_method_define(node)
|
107
107
|
def_node_matcher :dynamic_method_define, <<~PATTERN
|
108
|
-
(send nil? #
|
108
|
+
(send nil? #method_definition_macro?
|
109
109
|
(sym $_)
|
110
110
|
...)
|
111
111
|
PATTERN
|
@@ -195,7 +195,7 @@ module RuboCop
|
|
195
195
|
cop_config['UseSorbetSigs']
|
196
196
|
end
|
197
197
|
|
198
|
-
def
|
198
|
+
def method_definition_macro?(macro_name)
|
199
199
|
cop_config['MethodDefinitionMacros'].include?(macro_name.to_s)
|
200
200
|
end
|
201
201
|
end
|
@@ -0,0 +1,167 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# Prefer `Enumerable` predicate methods over expressions with `count`.
|
7
|
+
#
|
8
|
+
# The cop checks calls to `count` without arguments, or with a
|
9
|
+
# block. It doesn't register offenses for `count` with a positional
|
10
|
+
# argument because its behavior differs from predicate methods (`count`
|
11
|
+
# matches the argument using `==`, while `any?`, `none?` and `one?` use
|
12
|
+
# `===`).
|
13
|
+
#
|
14
|
+
# NOTE: This cop doesn't check `length` and `size` methods because they
|
15
|
+
# would yield false positives. For example, `String` implements `length`
|
16
|
+
# and `size`, but it doesn't include `Enumerable`.
|
17
|
+
#
|
18
|
+
# @safety
|
19
|
+
# The cop is unsafe because receiver might not include `Enumerable`, or
|
20
|
+
# it has nonstandard implementation of `count` or any replacement
|
21
|
+
# methods.
|
22
|
+
#
|
23
|
+
# It's also unsafe because for collections with falsey values, expressions
|
24
|
+
# with `count` without a block return a different result than methods `any?`,
|
25
|
+
# `none?` and `one?`:
|
26
|
+
#
|
27
|
+
# [source,ruby]
|
28
|
+
# ----
|
29
|
+
# [nil, false].count.positive?
|
30
|
+
# [nil].count == 1
|
31
|
+
# # => true
|
32
|
+
#
|
33
|
+
# [nil, false].any?
|
34
|
+
# [nil].one?
|
35
|
+
# # => false
|
36
|
+
#
|
37
|
+
# [nil].count == 0
|
38
|
+
# # => false
|
39
|
+
#
|
40
|
+
# [nil].none?
|
41
|
+
# # => true
|
42
|
+
# ----
|
43
|
+
#
|
44
|
+
# Autocorrection is unsafe when replacement methods don't iterate over
|
45
|
+
# every element in collection and the given block runs side effects:
|
46
|
+
#
|
47
|
+
# [source,ruby]
|
48
|
+
# ----
|
49
|
+
# x.count(&:method_with_side_effects).positive?
|
50
|
+
# # calls `method_with_side_effects` on every element
|
51
|
+
#
|
52
|
+
# x.any?(&:method_with_side_effects)
|
53
|
+
# # calls `method_with_side_effects` until first element returns a truthy value
|
54
|
+
# ----
|
55
|
+
#
|
56
|
+
# @example
|
57
|
+
#
|
58
|
+
# # bad
|
59
|
+
# x.count.positive?
|
60
|
+
# x.count > 0
|
61
|
+
# x.count != 0
|
62
|
+
#
|
63
|
+
# x.count(&:foo?).positive?
|
64
|
+
# x.count { |item| item.foo? }.positive?
|
65
|
+
#
|
66
|
+
# # good
|
67
|
+
# x.any?
|
68
|
+
#
|
69
|
+
# x.any?(&:foo?)
|
70
|
+
# x.any? { |item| item.foo? }
|
71
|
+
#
|
72
|
+
# # bad
|
73
|
+
# x.count.zero?
|
74
|
+
# x.count == 0
|
75
|
+
#
|
76
|
+
# # good
|
77
|
+
# x.none?
|
78
|
+
#
|
79
|
+
# # bad
|
80
|
+
# x.count == 1
|
81
|
+
# x.one?
|
82
|
+
#
|
83
|
+
# @example AllCops:ActiveSupportExtensionsEnabled: false (default)
|
84
|
+
#
|
85
|
+
# # good
|
86
|
+
# x.count > 1
|
87
|
+
#
|
88
|
+
# @example AllCops:ActiveSupportExtensionsEnabled: true
|
89
|
+
#
|
90
|
+
# # bad
|
91
|
+
# x.count > 1
|
92
|
+
#
|
93
|
+
# # good
|
94
|
+
# x.many?
|
95
|
+
#
|
96
|
+
class CollectionQuerying < Base
|
97
|
+
include RangeHelp
|
98
|
+
extend AutoCorrector
|
99
|
+
|
100
|
+
MSG = 'Use `%<prefer>s` instead.'
|
101
|
+
|
102
|
+
RESTRICT_ON_SEND = %i[positive? > != zero? ==].freeze
|
103
|
+
|
104
|
+
REPLACEMENTS = {
|
105
|
+
[:positive?, nil] => :any?,
|
106
|
+
[:>, 0] => :any?,
|
107
|
+
[:!=, 0] => :any?,
|
108
|
+
[:zero?, nil] => :none?,
|
109
|
+
[:==, 0] => :none?,
|
110
|
+
[:==, 1] => :one?,
|
111
|
+
[:>, 1] => :many?
|
112
|
+
}.freeze
|
113
|
+
|
114
|
+
# @!method count_predicate(node)
|
115
|
+
def_node_matcher :count_predicate, <<~PATTERN
|
116
|
+
(send
|
117
|
+
{
|
118
|
+
(any_block $(call !nil? :count) _ _)
|
119
|
+
$(call !nil? :count (block-pass _)?)
|
120
|
+
}
|
121
|
+
{
|
122
|
+
:positive? |
|
123
|
+
:> (int 0) |
|
124
|
+
:!= (int 0) |
|
125
|
+
:zero? |
|
126
|
+
:== (int 0) |
|
127
|
+
:== (int 1) |
|
128
|
+
:> (int 1)
|
129
|
+
})
|
130
|
+
PATTERN
|
131
|
+
|
132
|
+
def on_send(node)
|
133
|
+
return unless (count_node = count_predicate(node))
|
134
|
+
|
135
|
+
replacement_method = replacement_method(node)
|
136
|
+
|
137
|
+
return unless replacement_supported?(replacement_method)
|
138
|
+
|
139
|
+
offense_range = count_node.loc.selector.join(node.source_range.end)
|
140
|
+
add_offense(offense_range,
|
141
|
+
message: format(MSG, prefer: replacement_method)) do |corrector|
|
142
|
+
corrector.replace(count_node.loc.selector, replacement_method)
|
143
|
+
corrector.remove(removal_range(node))
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
private
|
148
|
+
|
149
|
+
def replacement_method(node)
|
150
|
+
REPLACEMENTS.fetch([node.method_name, node.first_argument&.value])
|
151
|
+
end
|
152
|
+
|
153
|
+
def replacement_supported?(method_name)
|
154
|
+
return true if active_support_extensions_enabled?
|
155
|
+
|
156
|
+
method_name != :many?
|
157
|
+
end
|
158
|
+
|
159
|
+
def removal_range(node)
|
160
|
+
range = (node.loc.dot || node.loc.selector).join(node.source_range.end)
|
161
|
+
|
162
|
+
range_with_surrounding_space(range, side: :left)
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
@@ -87,7 +87,7 @@ module RuboCop
|
|
87
87
|
true
|
88
88
|
end
|
89
89
|
|
90
|
-
def integral(node)
|
90
|
+
def integral?(node)
|
91
91
|
mantissa, = node.source.split('e')
|
92
92
|
/^-?[1-9](\d*[1-9])?$/.match?(mantissa)
|
93
93
|
end
|
@@ -101,7 +101,7 @@ module RuboCop
|
|
101
101
|
when :engineering
|
102
102
|
!engineering?(node)
|
103
103
|
when :integral
|
104
|
-
!integral(node)
|
104
|
+
!integral?(node)
|
105
105
|
else
|
106
106
|
false
|
107
107
|
end
|
@@ -9,7 +9,20 @@ module RuboCop
|
|
9
9
|
# On the other hand, `ENV.fetch` raises `KeyError` or returns the explicitly
|
10
10
|
# specified default value.
|
11
11
|
#
|
12
|
-
# @example
|
12
|
+
# @example DefaultToNil: true (default)
|
13
|
+
# # bad
|
14
|
+
# ENV['X']
|
15
|
+
# x = ENV['X']
|
16
|
+
#
|
17
|
+
# # good
|
18
|
+
# ENV.fetch('X', nil)
|
19
|
+
# x = ENV.fetch('X', nil)
|
20
|
+
#
|
21
|
+
# # also good
|
22
|
+
# !ENV['X']
|
23
|
+
# ENV['X'].some_method # (e.g. `.nil?`)
|
24
|
+
#
|
25
|
+
# @example DefaultToNil: false
|
13
26
|
# # bad
|
14
27
|
# ENV['X']
|
15
28
|
# x = ENV['X']
|
@@ -25,7 +38,8 @@ module RuboCop
|
|
25
38
|
class FetchEnvVar < Base
|
26
39
|
extend AutoCorrector
|
27
40
|
|
28
|
-
|
41
|
+
MSG_WITH_NIL = 'Use `ENV.fetch(%<key>s, nil)` instead of `ENV[%<key>s]`.'
|
42
|
+
MSG_WITHOUT_NIL = 'Use `ENV.fetch(%<key>s)` instead of `ENV[%<key>s]`.'
|
29
43
|
RESTRICT_ON_SEND = [:[]].freeze
|
30
44
|
|
31
45
|
# @!method env_with_bracket?(node)
|
@@ -37,7 +51,7 @@ module RuboCop
|
|
37
51
|
env_with_bracket?(node) do |name_node|
|
38
52
|
break unless offensive?(node)
|
39
53
|
|
40
|
-
message = format(
|
54
|
+
message = format(offense_message, key: name_node.source)
|
41
55
|
add_offense(node, message: message) do |corrector|
|
42
56
|
corrector.replace(node, new_code(name_node))
|
43
57
|
end
|
@@ -46,6 +60,14 @@ module RuboCop
|
|
46
60
|
|
47
61
|
private
|
48
62
|
|
63
|
+
def default_to_nil?
|
64
|
+
cop_config.fetch('DefaultToNil', true)
|
65
|
+
end
|
66
|
+
|
67
|
+
def offense_message
|
68
|
+
default_to_nil? ? MSG_WITH_NIL : MSG_WITHOUT_NIL
|
69
|
+
end
|
70
|
+
|
49
71
|
def allowed_var?(node)
|
50
72
|
env_key_node = node.children.last
|
51
73
|
env_key_node.str_type? && cop_config['AllowedVars'].include?(env_key_node.value)
|
@@ -53,12 +75,12 @@ module RuboCop
|
|
53
75
|
|
54
76
|
def used_as_flag?(node)
|
55
77
|
return false if node.root?
|
56
|
-
return true if used_if_condition_in_body(node)
|
78
|
+
return true if used_if_condition_in_body?(node)
|
57
79
|
|
58
80
|
node.parent.send_type? && (node.parent.prefix_bang? || node.parent.comparison_method?)
|
59
81
|
end
|
60
82
|
|
61
|
-
def used_if_condition_in_body(node)
|
83
|
+
def used_if_condition_in_body?(node)
|
62
84
|
if_node = node.ancestors.find(&:if_type?)
|
63
85
|
|
64
86
|
return false unless (condition = if_node&.condition)
|
@@ -125,7 +147,11 @@ module RuboCop
|
|
125
147
|
end
|
126
148
|
|
127
149
|
def new_code(name_node)
|
128
|
-
|
150
|
+
if default_to_nil?
|
151
|
+
"ENV.fetch(#{name_node.source}, nil)"
|
152
|
+
else
|
153
|
+
"ENV.fetch(#{name_node.source})"
|
154
|
+
end
|
129
155
|
end
|
130
156
|
end
|
131
157
|
end
|
@@ -54,7 +54,7 @@ module RuboCop
|
|
54
54
|
def_node_matcher :hash_from_array?, '(send (const {nil? cbase} :Hash) :[] ...)'
|
55
55
|
|
56
56
|
def on_send(node)
|
57
|
-
return
|
57
|
+
return if part_of_ignored_node?(node) || !hash_from_array?(node)
|
58
58
|
|
59
59
|
# There are several cases:
|
60
60
|
# If there is one argument:
|
@@ -63,11 +63,12 @@ module RuboCop
|
|
63
63
|
# If there is 0 or 2+ arguments:
|
64
64
|
# Hash[a1, a2, a3, a4] => {a1 => a2, a3 => a4}
|
65
65
|
# ...but don't suggest correction if there is odd number of them (it is a bug)
|
66
|
-
node.arguments.
|
66
|
+
node.arguments.one? ? single_argument(node) : multi_argument(node)
|
67
67
|
end
|
68
68
|
|
69
69
|
private
|
70
70
|
|
71
|
+
# rubocop:disable Metrics/MethodLength
|
71
72
|
def single_argument(node)
|
72
73
|
first_argument = node.first_argument
|
73
74
|
if first_argument.hash_type?
|
@@ -82,8 +83,11 @@ module RuboCop
|
|
82
83
|
replacement = "(#{replacement})" if requires_parens?(first_argument)
|
83
84
|
corrector.replace(node, "#{replacement}.to_h")
|
84
85
|
end
|
86
|
+
|
87
|
+
ignore_node(node)
|
85
88
|
end
|
86
89
|
end
|
90
|
+
# rubocop:enable Metrics/MethodLength
|
87
91
|
|
88
92
|
def use_zip_method_without_argument?(first_argument)
|
89
93
|
return false unless first_argument&.send_type?
|
@@ -111,7 +115,12 @@ module RuboCop
|
|
111
115
|
end
|
112
116
|
|
113
117
|
def requires_parens?(node)
|
114
|
-
|
118
|
+
if node.call_type?
|
119
|
+
return false if node.method?(:[])
|
120
|
+
return true if node.arguments.any? && !node.parenthesized?
|
121
|
+
end
|
122
|
+
|
123
|
+
node.operator_keyword?
|
115
124
|
end
|
116
125
|
|
117
126
|
def multi_argument(node)
|
@@ -223,8 +223,17 @@ module RuboCop
|
|
223
223
|
|
224
224
|
def too_long_line_based_on_allow_uri?(line)
|
225
225
|
if allow_uri?
|
226
|
-
uri_range =
|
227
|
-
return false if uri_range &&
|
226
|
+
uri_range = find_excessive_range(line, :uri)
|
227
|
+
return false if uri_range && allowed_position?(line, uri_range)
|
228
|
+
end
|
229
|
+
|
230
|
+
true
|
231
|
+
end
|
232
|
+
|
233
|
+
def too_long_line_based_on_allow_qualified_name?(line)
|
234
|
+
if allow_qualified_name?
|
235
|
+
namespace_range = find_excessive_range(line, :namespace)
|
236
|
+
return false if namespace_range && allowed_position?(line, namespace_range)
|
228
237
|
end
|
229
238
|
|
230
239
|
true
|
@@ -251,7 +251,7 @@ module RuboCop
|
|
251
251
|
return false unless (last_argument = node.last_argument)
|
252
252
|
return true if last_argument.forwarded_restarg_type?
|
253
253
|
|
254
|
-
last_argument.hash_type? && last_argument.children.
|
254
|
+
last_argument.hash_type? && last_argument.children.any?(&:forwarded_kwrestarg_type?)
|
255
255
|
end
|
256
256
|
end
|
257
257
|
# rubocop:enable Metrics/ModuleLength, Metrics/CyclomaticComplexity
|
@@ -255,7 +255,10 @@ module RuboCop
|
|
255
255
|
end
|
256
256
|
|
257
257
|
def disallowed_one_line_pattern_matching?(begin_node, node)
|
258
|
-
|
258
|
+
if (parent = begin_node.parent)
|
259
|
+
return false if parent.any_def_type? && parent.endless?
|
260
|
+
return false if parent.assignment?
|
261
|
+
end
|
259
262
|
|
260
263
|
node.any_match_pattern_type? && node.each_ancestor.none?(&:operator_keyword?)
|
261
264
|
end
|
@@ -115,8 +115,9 @@ module RuboCop
|
|
115
115
|
end
|
116
116
|
|
117
117
|
def correct_node(corrector, node)
|
118
|
-
corrector.replace(node.loc.keyword, 'if') if node.unless?
|
118
|
+
corrector.replace(node.loc.keyword, 'if') if node.unless? && !part_of_ignored_node?(node)
|
119
119
|
corrector.replace(node.condition, chainable_condition(node))
|
120
|
+
ignore_node(node)
|
120
121
|
end
|
121
122
|
|
122
123
|
def correct_for_guard_condition_style(corrector, node, if_branch)
|
@@ -270,7 +270,7 @@ module RuboCop
|
|
270
270
|
end
|
271
271
|
|
272
272
|
def allow_if_method_has_argument?(send_node)
|
273
|
-
!!cop_config.fetch('AllowMethodsWithArguments', false) &&
|
273
|
+
!!cop_config.fetch('AllowMethodsWithArguments', false) && send_node.arguments.any?
|
274
274
|
end
|
275
275
|
|
276
276
|
def allow_comments?
|
@@ -79,7 +79,7 @@ module RuboCop
|
|
79
79
|
LanguageServer::Protocol::Interface::CodeDescription.new(href: doc_url)
|
80
80
|
end
|
81
81
|
|
82
|
-
# rubocop:disable
|
82
|
+
# rubocop:disable Metrics/MethodLength
|
83
83
|
def autocorrect_action
|
84
84
|
LanguageServer::Protocol::Interface::CodeAction.new(
|
85
85
|
title: "Autocorrect #{@offense.cop_name}",
|
@@ -98,7 +98,7 @@ module RuboCop
|
|
98
98
|
is_preferred: true
|
99
99
|
)
|
100
100
|
end
|
101
|
-
# rubocop:enable
|
101
|
+
# rubocop:enable Metrics/MethodLength
|
102
102
|
|
103
103
|
# rubocop:disable Metrics/MethodLength
|
104
104
|
def offense_replacements
|
@@ -120,7 +120,7 @@ module RuboCop
|
|
120
120
|
end
|
121
121
|
# rubocop:enable Metrics/MethodLength
|
122
122
|
|
123
|
-
# rubocop:disable
|
123
|
+
# rubocop:disable Metrics/MethodLength
|
124
124
|
def disable_line_action
|
125
125
|
LanguageServer::Protocol::Interface::CodeAction.new(
|
126
126
|
title: "Disable #{@offense.cop_name} for this line",
|
@@ -138,7 +138,7 @@ module RuboCop
|
|
138
138
|
)
|
139
139
|
)
|
140
140
|
end
|
141
|
-
# rubocop:enable
|
141
|
+
# rubocop:enable Metrics/MethodLength
|
142
142
|
|
143
143
|
def line_disable_comment
|
144
144
|
new_text = if @offense.source_line.include?(' # rubocop:disable ')
|
data/lib/rubocop/version.rb
CHANGED
data/lib/rubocop.rb
CHANGED
@@ -180,6 +180,7 @@ require_relative 'rubocop/cop/bundler/insecure_protocol_source'
|
|
180
180
|
require_relative 'rubocop/cop/bundler/ordered_gems'
|
181
181
|
|
182
182
|
require_relative 'rubocop/cop/gemspec/add_runtime_dependency'
|
183
|
+
require_relative 'rubocop/cop/gemspec/attribute_assignment'
|
183
184
|
require_relative 'rubocop/cop/gemspec/dependency_version'
|
184
185
|
require_relative 'rubocop/cop/gemspec/deprecated_attribute_assignment'
|
185
186
|
require_relative 'rubocop/cop/gemspec/development_dependencies'
|
@@ -507,6 +508,7 @@ require_relative 'rubocop/cop/style/class_methods_definitions'
|
|
507
508
|
require_relative 'rubocop/cop/style/class_vars'
|
508
509
|
require_relative 'rubocop/cop/style/collection_compact'
|
509
510
|
require_relative 'rubocop/cop/style/collection_methods'
|
511
|
+
require_relative 'rubocop/cop/style/collection_querying'
|
510
512
|
require_relative 'rubocop/cop/style/colon_method_call'
|
511
513
|
require_relative 'rubocop/cop/style/colon_method_definition'
|
512
514
|
require_relative 'rubocop/cop/style/combinable_defined'
|