rubocop 1.30.1 → 1.31.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/config/default.yml +41 -8
- data/config/obsoletion.yml +2 -0
- data/exe/rubocop +15 -7
- data/lib/rubocop/cli/command/auto_genenerate_config.rb +1 -1
- data/lib/rubocop/cli/command/suggest_extensions.rb +3 -3
- data/lib/rubocop/config.rb +4 -0
- data/lib/rubocop/config_loader.rb +1 -0
- data/lib/rubocop/config_loader_resolver.rb +1 -1
- data/lib/rubocop/config_validator.rb +3 -3
- data/lib/rubocop/cop/base.rb +5 -1
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +1 -1
- data/lib/rubocop/cop/bundler/gem_filename.rb +4 -4
- data/lib/rubocop/cop/bundler/ordered_gems.rb +2 -2
- data/lib/rubocop/cop/corrector.rb +2 -2
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +3 -3
- data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +1 -1
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +31 -16
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +1 -1
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/require_mfa.rb +20 -20
- data/lib/rubocop/cop/generator.rb +5 -1
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -5
- data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +54 -0
- data/lib/rubocop/cop/internal_affairs.rb +1 -0
- data/lib/rubocop/cop/layout/empty_comment.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +25 -4
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +20 -13
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +51 -12
- data/lib/rubocop/cop/layout/initial_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +68 -0
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +130 -0
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_first_arg.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +5 -3
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +1 -1
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +51 -0
- data/lib/rubocop/cop/lint/interpolation_check.rb +1 -1
- data/lib/rubocop/cop/lint/literal_as_condition.rb +5 -0
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +126 -0
- data/lib/rubocop/cop/lint/number_conversion.rb +3 -3
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +5 -5
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +1 -1
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +2 -2
- data/lib/rubocop/cop/lint/struct_new_override.rb +2 -2
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1 -1
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +44 -0
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -1
- data/lib/rubocop/cop/mixin/def_node.rb +2 -7
- data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +34 -12
- data/lib/rubocop/cop/mixin/range_help.rb +7 -3
- data/lib/rubocop/cop/style/accessor_grouping.rb +1 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +1 -1
- data/lib/rubocop/cop/style/block_delimiters.rb +4 -2
- data/lib/rubocop/cop/style/commented_keyword.rb +1 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +1 -0
- data/lib/rubocop/cop/style/empty_method.rb +16 -1
- data/lib/rubocop/cop/style/encoding.rb +1 -1
- data/lib/rubocop/cop/style/explicit_block_argument.rb +1 -1
- data/lib/rubocop/cop/style/format_string_token.rb +48 -17
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
- data/lib/rubocop/cop/style/guard_clause.rb +8 -6
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +1 -1
- data/lib/rubocop/cop/style/hash_except.rb +88 -8
- data/lib/rubocop/cop/style/hash_syntax.rb +2 -2
- data/lib/rubocop/cop/style/implicit_runtime_error.rb +2 -2
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +1 -1
- data/lib/rubocop/cop/style/line_end_concatenation.rb +1 -1
- data/lib/rubocop/cop/style/map_to_hash.rb +1 -1
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +2 -2
- data/lib/rubocop/cop/style/module_function.rb +2 -2
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +2 -2
- data/lib/rubocop/cop/style/multiline_if_then.rb +1 -1
- data/lib/rubocop/cop/style/multiline_in_pattern_then.rb +1 -3
- data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -1
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +1 -1
- data/lib/rubocop/cop/style/multiline_when_then.rb +1 -3
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +1 -1
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +19 -7
- data/lib/rubocop/cop/style/nil_lambda.rb +1 -1
- data/lib/rubocop/cop/style/not.rb +1 -1
- data/lib/rubocop/cop/style/redundant_argument.rb +1 -1
- data/lib/rubocop/cop/style/redundant_parentheses.rb +2 -1
- data/lib/rubocop/cop/style/redundant_return.rb +1 -1
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +1 -1
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +2 -2
- data/lib/rubocop/cop/style/struct_inheritance.rb +2 -2
- data/lib/rubocop/cop/style/swap_values.rb +1 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +1 -1
- data/lib/rubocop/cop/style/top_level_method_definition.rb +0 -2
- data/lib/rubocop/cop/style/unpack_first.rb +1 -1
- data/lib/rubocop/cop/util.rb +1 -1
- data/lib/rubocop/formatter/formatter_set.rb +20 -19
- data/lib/rubocop/formatter/git_hub_actions_formatter.rb +15 -2
- data/lib/rubocop/formatter/html_formatter.rb +0 -1
- data/lib/rubocop/formatter/offense_count_formatter.rb +2 -0
- data/lib/rubocop/formatter/simple_text_formatter.rb +6 -7
- data/lib/rubocop/formatter.rb +31 -0
- data/lib/rubocop/options.rb +24 -1
- data/lib/rubocop/rake_task.rb +34 -9
- data/lib/rubocop/server/cache.rb +109 -0
- data/lib/rubocop/server/cli.rb +104 -0
- data/lib/rubocop/server/client_command/base.rb +44 -0
- data/lib/rubocop/server/client_command/exec.rb +59 -0
- data/lib/rubocop/server/client_command/restart.rb +25 -0
- data/lib/rubocop/server/client_command/start.rb +43 -0
- data/lib/rubocop/server/client_command/status.rb +28 -0
- data/lib/rubocop/server/client_command/stop.rb +31 -0
- data/lib/rubocop/server/client_command.rb +26 -0
- data/lib/rubocop/server/core.rb +79 -0
- data/lib/rubocop/server/errors.rb +23 -0
- data/lib/rubocop/server/helper.rb +34 -0
- data/lib/rubocop/server/server_command/base.rb +50 -0
- data/lib/rubocop/server/server_command/exec.rb +34 -0
- data/lib/rubocop/server/server_command/stop.rb +24 -0
- data/lib/rubocop/server/server_command.rb +21 -0
- data/lib/rubocop/server/socket_reader.rb +65 -0
- data/lib/rubocop/server.rb +53 -0
- data/lib/rubocop/version.rb +15 -8
- data/lib/rubocop.rb +8 -27
- metadata +42 -4
- data/lib/rubocop/cop/gemspec/date_assignment.rb +0 -49
@@ -110,7 +110,7 @@ module RuboCop
|
|
110
110
|
kw = if guard_clause_in_if
|
111
111
|
node.loc.keyword.source
|
112
112
|
else
|
113
|
-
|
113
|
+
node.inverse_keyword
|
114
114
|
end
|
115
115
|
|
116
116
|
register_offense(node, guard_clause_source(guard_clause), kw)
|
@@ -123,7 +123,7 @@ module RuboCop
|
|
123
123
|
return if allowed_consecutive_conditionals? &&
|
124
124
|
consecutive_conditionals?(node.parent, node)
|
125
125
|
|
126
|
-
register_offense(node, 'return',
|
126
|
+
register_offense(node, 'return', node.inverse_keyword)
|
127
127
|
end
|
128
128
|
|
129
129
|
def consecutive_conditionals?(parent, node)
|
@@ -134,14 +134,12 @@ module RuboCop
|
|
134
134
|
end
|
135
135
|
end
|
136
136
|
|
137
|
-
def opposite_keyword(node)
|
138
|
-
node.if? ? 'unless' : 'if'
|
139
|
-
end
|
140
|
-
|
141
137
|
def register_offense(node, scope_exiting_keyword, conditional_keyword)
|
142
138
|
condition, = node.node_parts
|
143
139
|
example = [scope_exiting_keyword, conditional_keyword, condition.source].join(' ')
|
144
140
|
if too_long_for_single_line?(node, example)
|
141
|
+
return if trivial?(node)
|
142
|
+
|
145
143
|
example = "#{conditional_keyword} #{condition.source}; #{scope_exiting_keyword}; end"
|
146
144
|
end
|
147
145
|
|
@@ -167,6 +165,10 @@ module RuboCop
|
|
167
165
|
accepted_if?(node, ending) || node.condition.multiline? || node.parent&.assignment?
|
168
166
|
end
|
169
167
|
|
168
|
+
def trivial?(node)
|
169
|
+
node.branches.one? && !node.if_branch.if_type? && !node.if_branch.begin_type?
|
170
|
+
end
|
171
|
+
|
170
172
|
def accepted_if?(node, ending)
|
171
173
|
return true if node.modifier_form? || node.ternary?
|
172
174
|
|
@@ -19,6 +19,9 @@ module RuboCop
|
|
19
19
|
# {foo: 1, bar: 2, baz: 3}.reject {|k, v| k == :bar }
|
20
20
|
# {foo: 1, bar: 2, baz: 3}.select {|k, v| k != :bar }
|
21
21
|
# {foo: 1, bar: 2, baz: 3}.filter {|k, v| k != :bar }
|
22
|
+
# {foo: 1, bar: 2, baz: 3}.reject {|k, v| %i[foo bar].include?(k) }
|
23
|
+
# {foo: 1, bar: 2, baz: 3}.select {|k, v| !%i[foo bar].include?(k) }
|
24
|
+
# {foo: 1, bar: 2, baz: 3}.filter {|k, v| !%i[foo bar].include?(k) }
|
22
25
|
#
|
23
26
|
# # good
|
24
27
|
# {foo: 1, bar: 2, baz: 3}.except(:bar)
|
@@ -33,15 +36,36 @@ module RuboCop
|
|
33
36
|
MSG = 'Use `%<prefer>s` instead.'
|
34
37
|
RESTRICT_ON_SEND = %i[reject select filter].freeze
|
35
38
|
|
36
|
-
# @!method
|
37
|
-
def_node_matcher :
|
39
|
+
# @!method bad_method_with_poro?(node)
|
40
|
+
def_node_matcher :bad_method_with_poro?, <<~PATTERN
|
38
41
|
(block
|
39
42
|
(send _ _)
|
40
43
|
(args
|
41
44
|
(arg _)
|
42
45
|
(arg _))
|
43
|
-
|
44
|
-
|
46
|
+
{
|
47
|
+
(send
|
48
|
+
_ {:== :!= :eql? :include?} _)
|
49
|
+
(send
|
50
|
+
(send
|
51
|
+
_ {:== :!= :eql? :include?} _) :!)
|
52
|
+
})
|
53
|
+
PATTERN
|
54
|
+
|
55
|
+
# @!method bad_method_with_active_support?(node)
|
56
|
+
def_node_matcher :bad_method_with_active_support?, <<~PATTERN
|
57
|
+
(block
|
58
|
+
(send _ _)
|
59
|
+
(args
|
60
|
+
(arg _)
|
61
|
+
(arg _))
|
62
|
+
{
|
63
|
+
(send
|
64
|
+
_ {:== :!= :eql? :in? :include? :exclude?} _)
|
65
|
+
(send
|
66
|
+
(send
|
67
|
+
_ {:== :!= :eql? :in? :include? :exclude?} _) :!)
|
68
|
+
})
|
45
69
|
PATTERN
|
46
70
|
|
47
71
|
def on_send(node)
|
@@ -52,7 +76,7 @@ module RuboCop
|
|
52
76
|
return if except_key.nil? || !safe_to_register_offense?(block, except_key)
|
53
77
|
|
54
78
|
range = offense_range(node)
|
55
|
-
preferred_method = "except(#{except_key
|
79
|
+
preferred_method = "except(#{except_key_source(except_key)})"
|
56
80
|
|
57
81
|
add_offense(range, message: format(MSG, prefer: preferred_method)) do |corrector|
|
58
82
|
corrector.replace(range, preferred_method)
|
@@ -61,28 +85,84 @@ module RuboCop
|
|
61
85
|
|
62
86
|
private
|
63
87
|
|
88
|
+
def bad_method?(block)
|
89
|
+
if active_support_extensions_enabled?
|
90
|
+
bad_method_with_active_support?(block)
|
91
|
+
else
|
92
|
+
bad_method_with_poro?(block)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
64
96
|
def semantically_except_method?(send, block)
|
65
97
|
body = block.body
|
66
98
|
|
99
|
+
negated = body.method?('!')
|
100
|
+
body = body.receiver if negated
|
101
|
+
|
67
102
|
case send.method_name
|
68
103
|
when :reject
|
69
|
-
body.method?('==') || body.method?('eql?')
|
104
|
+
body.method?('==') || body.method?('eql?') || included?(negated, body)
|
70
105
|
when :select, :filter
|
71
|
-
body.method?('!=')
|
106
|
+
body.method?('!=') || not_included?(negated, body)
|
72
107
|
else
|
73
108
|
false
|
74
109
|
end
|
75
110
|
end
|
76
111
|
|
112
|
+
def included?(negated, body)
|
113
|
+
body.method?('include?') || body.method?('in?') || (negated && body.method?('exclude?'))
|
114
|
+
end
|
115
|
+
|
116
|
+
def not_included?(negated, body)
|
117
|
+
body.method?('exclude?') || (negated && (body.method?('include?') || body.method?('in?')))
|
118
|
+
end
|
119
|
+
|
77
120
|
def safe_to_register_offense?(block, except_key)
|
121
|
+
extracted = extract_body_if_nagated(block.body)
|
122
|
+
if extracted.method?('in?') || extracted.method?('include?') || \
|
123
|
+
extracted.method?('exclude?')
|
124
|
+
return true
|
125
|
+
end
|
78
126
|
return true if block.body.method?('eql?')
|
79
127
|
|
80
128
|
except_key.sym_type? || except_key.str_type?
|
81
129
|
end
|
82
130
|
|
131
|
+
def extract_body_if_nagated(body)
|
132
|
+
return body unless body.method?('!')
|
133
|
+
|
134
|
+
body.receiver
|
135
|
+
end
|
136
|
+
|
137
|
+
def except_key_source(key)
|
138
|
+
if key.array_type?
|
139
|
+
key = if key.percent_literal?
|
140
|
+
key.each_value.map { |v| decorate_source(v) }
|
141
|
+
else
|
142
|
+
key.each_value.map(&:source)
|
143
|
+
end
|
144
|
+
return key.join(', ')
|
145
|
+
end
|
146
|
+
|
147
|
+
key.literal? ? key.source : "*#{key.source}"
|
148
|
+
end
|
149
|
+
|
150
|
+
def decorate_source(value)
|
151
|
+
return ":\"#{value.source}\"" if value.dsym_type?
|
152
|
+
return "\"#{value.source}\"" if value.dstr_type?
|
153
|
+
return ":#{value.source}" if value.sym_type?
|
154
|
+
|
155
|
+
"'#{value.source}'"
|
156
|
+
end
|
157
|
+
|
83
158
|
def except_key(node)
|
84
159
|
key_argument = node.argument_list.first.source
|
85
|
-
|
160
|
+
body = extract_body_if_nagated(node.body)
|
161
|
+
lhs, _method_name, rhs = *body
|
162
|
+
|
163
|
+
return lhs if body.method?('include?')
|
164
|
+
return lhs if body.method?('exclude?')
|
165
|
+
return rhs if body.method?('in?')
|
86
166
|
return if [lhs, rhs].map(&:source).none?(key_argument)
|
87
167
|
|
88
168
|
[lhs, rhs].find { |operand| operand.source != key_argument }
|
@@ -223,7 +223,7 @@ module RuboCop
|
|
223
223
|
operator = pair_node.loc.operator
|
224
224
|
|
225
225
|
range = key.join(operator)
|
226
|
-
range_with_surrounding_space(range
|
226
|
+
range_with_surrounding_space(range, side: :right)
|
227
227
|
end
|
228
228
|
|
229
229
|
def argument_without_space?(node)
|
@@ -235,7 +235,7 @@ module RuboCop
|
|
235
235
|
|
236
236
|
key_with_hash_rocket = ":#{pair_node.key.source}#{pair_node.inverse_delimiter(true)}"
|
237
237
|
corrector.replace(pair_node.key, key_with_hash_rocket)
|
238
|
-
corrector.remove(range_with_surrounding_space(
|
238
|
+
corrector.remove(range_with_surrounding_space(op))
|
239
239
|
end
|
240
240
|
|
241
241
|
def autocorrect_no_mixed_keys(corrector, pair_node)
|
@@ -15,8 +15,8 @@ module RuboCop
|
|
15
15
|
# # good
|
16
16
|
# raise ArgumentError, 'Error message here'
|
17
17
|
class ImplicitRuntimeError < Base
|
18
|
-
MSG = 'Use `%<method>s` with an explicit exception class and message,' \
|
19
|
-
'
|
18
|
+
MSG = 'Use `%<method>s` with an explicit exception class and message, ' \
|
19
|
+
'rather than just a message.'
|
20
20
|
RESTRICT_ON_SEND = %i[raise fail].freeze
|
21
21
|
|
22
22
|
# @!method implicit_runtime_error_raise_or_fail(node)
|
@@ -65,7 +65,7 @@ module RuboCop
|
|
65
65
|
|
66
66
|
def remove_kwargs(kwarg_nodes, corrector)
|
67
67
|
kwarg_nodes.each do |kwarg|
|
68
|
-
with_space = range_with_surrounding_space(
|
68
|
+
with_space = range_with_surrounding_space(kwarg.source_range)
|
69
69
|
corrector.remove(range_with_surrounding_comma(with_space, :left))
|
70
70
|
end
|
71
71
|
end
|
@@ -70,7 +70,7 @@ module RuboCop
|
|
70
70
|
|
71
71
|
def autocorrect(corrector, operator_range)
|
72
72
|
# Include any trailing whitespace so we don't create a syntax error.
|
73
|
-
operator_range = range_with_surrounding_space(
|
73
|
+
operator_range = range_with_surrounding_space(operator_range,
|
74
74
|
side: :right,
|
75
75
|
newlines: false)
|
76
76
|
one_more_char = operator_range.resize(operator_range.size + 1)
|
@@ -59,7 +59,7 @@ module RuboCop
|
|
59
59
|
def autocorrect(corrector, to_h, map)
|
60
60
|
removal_range = range_between(to_h.loc.dot.begin_pos, to_h.loc.selector.end_pos)
|
61
61
|
|
62
|
-
corrector.remove(range_with_surrounding_space(
|
62
|
+
corrector.remove(range_with_surrounding_space(removal_range, side: :left))
|
63
63
|
corrector.replace(map.loc.selector, 'to_h')
|
64
64
|
end
|
65
65
|
end
|
@@ -25,12 +25,12 @@ module RuboCop
|
|
25
25
|
return if allowed_string_interpolation_method_call?(node)
|
26
26
|
|
27
27
|
add_offense(offense_range(node), message: OMIT_MSG) do |corrector|
|
28
|
-
|
28
|
+
autocorrect(corrector, node)
|
29
29
|
end
|
30
30
|
end
|
31
31
|
# rubocop:enable Metrics/PerceivedComplexity
|
32
32
|
|
33
|
-
def
|
33
|
+
def autocorrect(corrector, node)
|
34
34
|
if parentheses_at_the_end_of_multiline_call?(node)
|
35
35
|
corrector.replace(args_begin(node), ' \\')
|
36
36
|
else
|
@@ -117,10 +117,10 @@ module RuboCop
|
|
117
117
|
end
|
118
118
|
|
119
119
|
def check_module_function(nodes)
|
120
|
-
|
120
|
+
return if nodes.any? { |node| private_directive?(node) }
|
121
121
|
|
122
122
|
nodes.each do |node|
|
123
|
-
yield node if extend_self_node?(node)
|
123
|
+
yield node if extend_self_node?(node)
|
124
124
|
end
|
125
125
|
end
|
126
126
|
|
@@ -19,8 +19,8 @@ module RuboCop
|
|
19
19
|
include Alignment
|
20
20
|
extend AutoCorrector
|
21
21
|
|
22
|
-
MSG = 'Favor a normal %<keyword>s-statement over a modifier' \
|
23
|
-
'
|
22
|
+
MSG = 'Favor a normal %<keyword>s-statement over a modifier ' \
|
23
|
+
'clause in a multiline statement.'
|
24
24
|
|
25
25
|
def on_if(node)
|
26
26
|
return unless node.modifier_form? && node.body.multiline?
|
@@ -29,7 +29,7 @@ module RuboCop
|
|
29
29
|
return unless non_modifier_then?(node)
|
30
30
|
|
31
31
|
add_offense(node.loc.begin, message: format(MSG, keyword: node.keyword)) do |corrector|
|
32
|
-
corrector.remove(range_with_surrounding_space(
|
32
|
+
corrector.remove(range_with_surrounding_space(node.loc.begin, side: :left))
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
@@ -41,9 +41,7 @@ module RuboCop
|
|
41
41
|
|
42
42
|
range = node.loc.begin
|
43
43
|
add_offense(range) do |corrector|
|
44
|
-
corrector.remove(
|
45
|
-
range_with_surrounding_space(range: range, side: :left, newlines: false)
|
46
|
-
)
|
44
|
+
corrector.remove(range_with_surrounding_space(range, side: :left, newlines: false))
|
47
45
|
end
|
48
46
|
end
|
49
47
|
|
@@ -73,7 +73,7 @@ module RuboCop
|
|
73
73
|
end
|
74
74
|
|
75
75
|
def enforce_single_line_ternary_operator?(node)
|
76
|
-
SINGLE_LINE_TYPES.include?(node.parent
|
76
|
+
SINGLE_LINE_TYPES.include?(node.parent&.type) && !use_assignment_method?(node.parent)
|
77
77
|
end
|
78
78
|
|
79
79
|
def use_assignment_method?(node)
|
@@ -39,9 +39,7 @@ module RuboCop
|
|
39
39
|
|
40
40
|
range = node.loc.begin
|
41
41
|
add_offense(range) do |corrector|
|
42
|
-
corrector.remove(
|
43
|
-
range_with_surrounding_space(range: range, side: :left, newlines: false)
|
44
|
-
)
|
42
|
+
corrector.remove(range_with_surrounding_space(range, side: :left, newlines: false))
|
45
43
|
end
|
46
44
|
end
|
47
45
|
|
@@ -17,6 +17,8 @@ module RuboCop
|
|
17
17
|
# end
|
18
18
|
class NestedTernaryOperator < Base
|
19
19
|
extend AutoCorrector
|
20
|
+
include RangeHelp
|
21
|
+
include IgnoredNode
|
20
22
|
|
21
23
|
MSG = 'Ternary operators must not be nested. Prefer `if` or `else` constructs instead.'
|
22
24
|
|
@@ -26,14 +28,10 @@ module RuboCop
|
|
26
28
|
node.each_descendant(:if).select(&:ternary?).each do |nested_ternary|
|
27
29
|
add_offense(nested_ternary) do |corrector|
|
28
30
|
if_node = if_node(nested_ternary)
|
31
|
+
next if part_of_ignored_node?(if_node)
|
29
32
|
|
30
|
-
corrector
|
31
|
-
|
32
|
-
#{remove_parentheses(if_node.if_branch.source)}
|
33
|
-
else
|
34
|
-
#{if_node.else_branch.source}
|
35
|
-
end
|
36
|
-
RUBY
|
33
|
+
autocorrect(corrector, if_node)
|
34
|
+
ignore_node(if_node)
|
37
35
|
end
|
38
36
|
end
|
39
37
|
end
|
@@ -47,11 +45,25 @@ module RuboCop
|
|
47
45
|
if_node(node)
|
48
46
|
end
|
49
47
|
|
48
|
+
def autocorrect(corrector, if_node)
|
49
|
+
replace_loc_and_whitespace(corrector, if_node.loc.question, "\n")
|
50
|
+
replace_loc_and_whitespace(corrector, if_node.loc.colon, "\nelse\n")
|
51
|
+
corrector.replace(if_node.if_branch, remove_parentheses(if_node.if_branch.source))
|
52
|
+
corrector.wrap(if_node, 'if ', "\nend")
|
53
|
+
end
|
54
|
+
|
50
55
|
def remove_parentheses(source)
|
51
56
|
return source unless source.start_with?('(')
|
52
57
|
|
53
58
|
source.delete_prefix('(').delete_suffix(')')
|
54
59
|
end
|
60
|
+
|
61
|
+
def replace_loc_and_whitespace(corrector, range, replacement)
|
62
|
+
corrector.replace(
|
63
|
+
range_with_surrounding_space(range: range, whitespace: true),
|
64
|
+
replacement
|
65
|
+
)
|
66
|
+
end
|
55
67
|
end
|
56
68
|
end
|
57
69
|
end
|
@@ -57,7 +57,7 @@ module RuboCop
|
|
57
57
|
|
58
58
|
def autocorrect(corrector, node)
|
59
59
|
range = if node.single_line?
|
60
|
-
range_with_surrounding_space(
|
60
|
+
range_with_surrounding_space(node.body.loc.expression)
|
61
61
|
else
|
62
62
|
range_by_whole_lines(node.body.loc.expression, include_final_newline: true)
|
63
63
|
end
|
@@ -33,7 +33,7 @@ module RuboCop
|
|
33
33
|
return unless node.prefix_not?
|
34
34
|
|
35
35
|
add_offense(node.loc.selector) do |corrector|
|
36
|
-
range = range_with_surrounding_space(
|
36
|
+
range = range_with_surrounding_space(node.loc.selector, side: :right)
|
37
37
|
|
38
38
|
if opposite_method?(node.receiver)
|
39
39
|
correct_opposite_method(corrector, range, node.receiver)
|
@@ -86,7 +86,7 @@ module RuboCop
|
|
86
86
|
if node.parenthesized?
|
87
87
|
range_between(node.loc.begin.begin_pos, node.loc.end.end_pos)
|
88
88
|
else
|
89
|
-
range_with_surrounding_space(
|
89
|
+
range_with_surrounding_space(node.first_argument.source_range, newlines: false)
|
90
90
|
end
|
91
91
|
end
|
92
92
|
end
|
@@ -81,7 +81,8 @@ module RuboCop
|
|
81
81
|
end
|
82
82
|
|
83
83
|
def like_method_argument_parentheses?(node)
|
84
|
-
node.send_type? && node.arguments.
|
84
|
+
node.send_type? && node.arguments.one? &&
|
85
|
+
!node.arithmetic_operation? && node.first_argument.begin_type?
|
85
86
|
end
|
86
87
|
|
87
88
|
def empty_parentheses?(node)
|
@@ -76,7 +76,7 @@ module RuboCop
|
|
76
76
|
corrector.replace(first_argument, first_argument.source.delete_prefix('*'))
|
77
77
|
end
|
78
78
|
|
79
|
-
keyword = range_with_surrounding_space(
|
79
|
+
keyword = range_with_surrounding_space(return_node.loc.keyword, side: :right)
|
80
80
|
corrector.remove(keyword)
|
81
81
|
end
|
82
82
|
|
@@ -138,7 +138,7 @@ module RuboCop
|
|
138
138
|
corrector.insert_after(outer_condition, "#{and_operator}#{replace_condition(condition)}")
|
139
139
|
|
140
140
|
range = range_between(if_branch.loc.keyword.begin_pos, condition.source_range.end_pos)
|
141
|
-
corrector.remove(range_with_surrounding_space(range
|
141
|
+
corrector.remove(range_with_surrounding_space(range, newlines: false))
|
142
142
|
corrector.remove(if_branch.loc.keyword)
|
143
143
|
end
|
144
144
|
|
@@ -157,7 +157,7 @@ module RuboCop
|
|
157
157
|
"#{'!' if node.unless?}#{replace_condition(node.condition)} && ")
|
158
158
|
|
159
159
|
corrector.remove(node.condition.loc.expression)
|
160
|
-
corrector.remove(range_with_surrounding_space(
|
160
|
+
corrector.remove(range_with_surrounding_space(node.loc.keyword, newlines: false))
|
161
161
|
corrector.replace(if_branch.loc.keyword, 'if')
|
162
162
|
end
|
163
163
|
|
@@ -34,7 +34,7 @@ module RuboCop
|
|
34
34
|
return unless struct_constructor?(node.parent_class)
|
35
35
|
|
36
36
|
add_offense(node.parent_class.source_range) do |corrector|
|
37
|
-
corrector.remove(range_with_surrounding_space(
|
37
|
+
corrector.remove(range_with_surrounding_space(node.loc.keyword, newlines: false))
|
38
38
|
corrector.replace(node.loc.operator, '=')
|
39
39
|
|
40
40
|
correct_parent(node.parent_class, corrector)
|
@@ -51,7 +51,7 @@ module RuboCop
|
|
51
51
|
|
52
52
|
def correct_parent(parent, corrector)
|
53
53
|
if parent.block_type?
|
54
|
-
corrector.remove(range_with_surrounding_space(
|
54
|
+
corrector.remove(range_with_surrounding_space(parent.loc.end, newlines: false))
|
55
55
|
elsif (class_node = parent.parent).body.nil?
|
56
56
|
corrector.remove(range_for_empty_class_body(class_node, parent))
|
57
57
|
else
|
@@ -22,7 +22,7 @@ module RuboCop
|
|
22
22
|
include RangeHelp
|
23
23
|
extend AutoCorrector
|
24
24
|
|
25
|
-
MSG = 'Replace this and assignments at lines %<x_line>d '\
|
25
|
+
MSG = 'Replace this and assignments at lines %<x_line>d ' \
|
26
26
|
'and %<y_line>d with `%<replacement>s`.'
|
27
27
|
|
28
28
|
SIMPLE_ASSIGNMENT_TYPES = %i[lvasgn ivasgn cvasgn gvasgn casgn].to_set.freeze
|
@@ -152,7 +152,7 @@ module RuboCop
|
|
152
152
|
|
153
153
|
def block_range_with_space(node)
|
154
154
|
block_range = range_between(begin_pos_for_replacement(node), node.loc.end.end_pos)
|
155
|
-
range_with_surrounding_space(
|
155
|
+
range_with_surrounding_space(block_range, side: :left)
|
156
156
|
end
|
157
157
|
|
158
158
|
def begin_pos_for_replacement(node)
|
@@ -23,7 +23,7 @@ module RuboCop
|
|
23
23
|
|
24
24
|
minimum_target_ruby_version 2.4
|
25
25
|
|
26
|
-
MSG = 'Use `%<receiver>s.unpack1(%<format>s)` instead of '\
|
26
|
+
MSG = 'Use `%<receiver>s.unpack1(%<format>s)` instead of ' \
|
27
27
|
'`%<receiver>s.unpack(%<format>s)%<method>s`.'
|
28
28
|
RESTRICT_ON_SEND = %i[first [] slice at].freeze
|
29
29
|
|
data/lib/rubocop/cop/util.rb
CHANGED
@@ -34,7 +34,7 @@ module RuboCop
|
|
34
34
|
def add_parentheses(node, corrector)
|
35
35
|
if node.args_type?
|
36
36
|
arguments_range = node.source_range
|
37
|
-
args_with_space = range_with_surrounding_space(
|
37
|
+
args_with_space = range_with_surrounding_space(arguments_range, side: :left)
|
38
38
|
leading_space = range_between(args_with_space.begin_pos, arguments_range.begin_pos)
|
39
39
|
corrector.replace(leading_space, '(')
|
40
40
|
corrector.insert_after(arguments_range, ')')
|
@@ -9,23 +9,23 @@ module RuboCop
|
|
9
9
|
# which invoke same method of each formatters.
|
10
10
|
class FormatterSet < Array
|
11
11
|
BUILTIN_FORMATTERS_FOR_KEYS = {
|
12
|
-
'[a]utogenconf' => AutoGenConfigFormatter,
|
13
|
-
'[c]lang' => ClangStyleFormatter,
|
14
|
-
'[e]macs' => EmacsStyleFormatter,
|
15
|
-
'[fi]les' => FileListFormatter,
|
16
|
-
'[fu]ubar' => FuubarStyleFormatter,
|
17
|
-
'[g]ithub' => GitHubActionsFormatter,
|
18
|
-
'[h]tml' => HTMLFormatter,
|
19
|
-
'[j]son' => JSONFormatter,
|
20
|
-
'[ju]nit' => JUnitFormatter,
|
21
|
-
'[m]arkdown' => MarkdownFormatter,
|
22
|
-
'[o]ffenses' => OffenseCountFormatter,
|
23
|
-
'[pa]cman' => PacmanFormatter,
|
24
|
-
'[p]rogress' => ProgressFormatter,
|
25
|
-
'[q]uiet' => QuietFormatter,
|
26
|
-
'[s]imple' => SimpleTextFormatter,
|
27
|
-
'[t]ap' => TapFormatter,
|
28
|
-
'[w]orst' => WorstOffendersFormatter
|
12
|
+
'[a]utogenconf' => 'AutoGenConfigFormatter',
|
13
|
+
'[c]lang' => 'ClangStyleFormatter',
|
14
|
+
'[e]macs' => 'EmacsStyleFormatter',
|
15
|
+
'[fi]les' => 'FileListFormatter',
|
16
|
+
'[fu]ubar' => 'FuubarStyleFormatter',
|
17
|
+
'[g]ithub' => 'GitHubActionsFormatter',
|
18
|
+
'[h]tml' => 'HTMLFormatter',
|
19
|
+
'[j]son' => 'JSONFormatter',
|
20
|
+
'[ju]nit' => 'JUnitFormatter',
|
21
|
+
'[m]arkdown' => 'MarkdownFormatter',
|
22
|
+
'[o]ffenses' => 'OffenseCountFormatter',
|
23
|
+
'[pa]cman' => 'PacmanFormatter',
|
24
|
+
'[p]rogress' => 'ProgressFormatter',
|
25
|
+
'[q]uiet' => 'QuietFormatter',
|
26
|
+
'[s]imple' => 'SimpleTextFormatter',
|
27
|
+
'[t]ap' => 'TapFormatter',
|
28
|
+
'[w]orst' => 'WorstOffendersFormatter'
|
29
29
|
}.freeze
|
30
30
|
|
31
31
|
FORMATTER_APIS = %i[started finished].freeze
|
@@ -55,7 +55,7 @@ module RuboCop
|
|
55
55
|
def add_formatter(formatter_type, output_path = nil)
|
56
56
|
if output_path
|
57
57
|
dir_path = File.dirname(output_path)
|
58
|
-
FileUtils.mkdir_p(dir_path)
|
58
|
+
FileUtils.mkdir_p(dir_path)
|
59
59
|
output = File.open(output_path, 'w')
|
60
60
|
else
|
61
61
|
output = $stdout
|
@@ -92,7 +92,8 @@ module RuboCop
|
|
92
92
|
|
93
93
|
raise %(Cannot determine formatter for "#{specified_key}") if matching_keys.size > 1
|
94
94
|
|
95
|
-
BUILTIN_FORMATTERS_FOR_KEYS[matching_keys.first]
|
95
|
+
formatter_name = BUILTIN_FORMATTERS_FOR_KEYS[matching_keys.first]
|
96
|
+
RuboCop::Formatter.const_get(formatter_name)
|
96
97
|
end
|
97
98
|
|
98
99
|
def custom_formatter_class(specified_class_name)
|