rubocop 1.25.1 → 1.27.0
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 +29 -6
- data/lib/rubocop/cli.rb +1 -1
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +3 -1
- data/lib/rubocop/cop/autocorrect_logic.rb +4 -0
- data/lib/rubocop/cop/badge.rb +7 -1
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +1 -5
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +1 -5
- data/lib/rubocop/cop/gemspec/require_mfa.rb +4 -3
- data/lib/rubocop/cop/generator.rb +2 -7
- data/lib/rubocop/cop/internal_affairs/redundant_context_config_parameter.rb +46 -0
- data/lib/rubocop/cop/internal_affairs.rb +1 -0
- data/lib/rubocop/cop/layout/case_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +1 -2
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +7 -8
- data/lib/rubocop/cop/layout/redundant_line_break.rb +3 -4
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +6 -6
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +3 -1
- data/lib/rubocop/cop/lint/empty_in_pattern.rb +3 -1
- data/lib/rubocop/cop/lint/empty_when.rb +3 -1
- data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +11 -4
- data/lib/rubocop/cop/lint/inherit_exception.rb +19 -28
- data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +8 -1
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +3 -2
- data/lib/rubocop/cop/lint/redundant_dir_glob_sort.rb +5 -0
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +51 -0
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +10 -0
- data/lib/rubocop/cop/lint/symbol_conversion.rb +3 -2
- data/lib/rubocop/cop/lint/syntax.rb +1 -2
- data/lib/rubocop/cop/lint/unused_method_argument.rb +1 -1
- data/lib/rubocop/cop/lint/useless_times.rb +13 -9
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -2
- data/lib/rubocop/cop/mixin/comments_help.rb +22 -2
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +2 -3
- data/lib/rubocop/cop/mixin/line_length_help.rb +17 -6
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +4 -3
- data/lib/rubocop/cop/mixin/surrounding_space.rb +4 -2
- data/lib/rubocop/cop/naming/block_forwarding.rb +1 -1
- data/lib/rubocop/cop/security/yaml_load.rb +9 -3
- data/lib/rubocop/cop/style/def_with_parentheses.rb +16 -11
- data/lib/rubocop/cop/style/double_negation.rb +32 -1
- data/lib/rubocop/cop/style/empty_case_condition.rb +1 -2
- data/lib/rubocop/cop/style/file_write.rb +12 -0
- data/lib/rubocop/cop/style/for.rb +4 -0
- data/lib/rubocop/cop/style/lambda_call.rb +12 -20
- data/lib/rubocop/cop/style/nested_file_dirname.rb +66 -0
- data/lib/rubocop/cop/style/optional_boolean_parameter.rb +3 -2
- data/lib/rubocop/cop/style/raise_args.rb +5 -2
- data/lib/rubocop/cop/style/redundant_capital_w.rb +1 -2
- data/lib/rubocop/cop/style/redundant_initialize.rb +119 -0
- data/lib/rubocop/cop/style/safe_navigation.rb +12 -7
- data/lib/rubocop/cop/style/select_by_regexp.rb +6 -1
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +50 -12
- data/lib/rubocop/cop/style/string_concatenation.rb +7 -1
- data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -2
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +1 -1
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +1 -1
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +1 -4
- data/lib/rubocop/cop/style/unless_else.rb +4 -0
- data/lib/rubocop/cop/variable_force.rb +1 -5
- data/lib/rubocop/cops_documentation_generator.rb +2 -2
- data/lib/rubocop/formatter/disabled_config_formatter.rb +2 -2
- data/lib/rubocop/formatter/offense_count_formatter.rb +6 -2
- data/lib/rubocop/formatter/worst_offenders_formatter.rb +1 -2
- data/lib/rubocop/options.rb +8 -2
- data/lib/rubocop/result_cache.rb +9 -1
- data/lib/rubocop/rspec/shared_contexts.rb +4 -0
- data/lib/rubocop/runner.rb +1 -1
- data/lib/rubocop/target_ruby.rb +1 -1
- data/lib/rubocop/version.rb +1 -1
- data/lib/rubocop.rb +3 -0
- metadata +9 -5
@@ -0,0 +1,119 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# Checks for `initialize` methods that are redundant.
|
7
|
+
#
|
8
|
+
# An initializer is redundant if it does not do anything, or if it only
|
9
|
+
# calls `super` with the same arguments given to it. If the initializer takes
|
10
|
+
# an argument that accepts multiple values (`restarg`, `kwrestarg`, etc.) it
|
11
|
+
# will not register an offense, because it allows the initializer to take a different
|
12
|
+
# number of arguments as its superclass potentially does.
|
13
|
+
#
|
14
|
+
# NOTE: If an initializer argument has a default value, RuboCop assumes it
|
15
|
+
# to *not* be redundant.
|
16
|
+
#
|
17
|
+
# NOTE: Empty initializers are registered as offenses, but it is possible
|
18
|
+
# to purposely create an empty `initialize` method to override a superclass's
|
19
|
+
# initializer.
|
20
|
+
#
|
21
|
+
# @example
|
22
|
+
# # bad
|
23
|
+
# def initialize
|
24
|
+
# end
|
25
|
+
#
|
26
|
+
# # bad
|
27
|
+
# def initialize
|
28
|
+
# super
|
29
|
+
# end
|
30
|
+
#
|
31
|
+
# # bad
|
32
|
+
# def initialize(a, b)
|
33
|
+
# super
|
34
|
+
# end
|
35
|
+
#
|
36
|
+
# # bad
|
37
|
+
# def initialize(a, b)
|
38
|
+
# super(a, b)
|
39
|
+
# end
|
40
|
+
#
|
41
|
+
# # good
|
42
|
+
# def initialize
|
43
|
+
# do_something
|
44
|
+
# end
|
45
|
+
#
|
46
|
+
# # good
|
47
|
+
# def initialize
|
48
|
+
# do_something
|
49
|
+
# super
|
50
|
+
# end
|
51
|
+
#
|
52
|
+
# # good (different number of parameters)
|
53
|
+
# def initialize(a, b)
|
54
|
+
# super(a)
|
55
|
+
# end
|
56
|
+
#
|
57
|
+
# # good (default value)
|
58
|
+
# def initialize(a, b = 5)
|
59
|
+
# super
|
60
|
+
# end
|
61
|
+
#
|
62
|
+
# # good (default value)
|
63
|
+
# def initialize(a, b: 5)
|
64
|
+
# super
|
65
|
+
# end
|
66
|
+
#
|
67
|
+
# # good (changes the parameter requirements)
|
68
|
+
# def initialize(*)
|
69
|
+
# end
|
70
|
+
#
|
71
|
+
# # good (changes the parameter requirements)
|
72
|
+
# def initialize(**)
|
73
|
+
# end
|
74
|
+
#
|
75
|
+
# # good (changes the parameter requirements)
|
76
|
+
# def initialize(...)
|
77
|
+
# end
|
78
|
+
#
|
79
|
+
class RedundantInitialize < Base
|
80
|
+
MSG = 'Remove unnecessary `initialize` method.'
|
81
|
+
MSG_EMPTY = 'Remove unnecessary empty `initialize` method.'
|
82
|
+
|
83
|
+
# @!method initialize_forwards?(node)
|
84
|
+
def_node_matcher :initialize_forwards?, <<~PATTERN
|
85
|
+
(def _ (args $arg*) $({super zsuper} ...))
|
86
|
+
PATTERN
|
87
|
+
|
88
|
+
def on_def(node)
|
89
|
+
return unless node.method?(:initialize)
|
90
|
+
return if forwards?(node)
|
91
|
+
|
92
|
+
if node.body.nil?
|
93
|
+
add_offense(node, message: MSG_EMPTY)
|
94
|
+
else
|
95
|
+
return if node.body.begin_type?
|
96
|
+
|
97
|
+
if (args, super_node = initialize_forwards?(node))
|
98
|
+
return unless same_args?(super_node, args)
|
99
|
+
|
100
|
+
add_offense(node)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
private
|
106
|
+
|
107
|
+
def forwards?(node)
|
108
|
+
node.arguments.each_child_node(:restarg, :kwrestarg, :forward_args, :forward_arg).any?
|
109
|
+
end
|
110
|
+
|
111
|
+
def same_args?(super_node, args)
|
112
|
+
return true if super_node.zsuper_type?
|
113
|
+
|
114
|
+
args.map(&:name) == super_node.arguments.map { |a| a.children[0] }
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
@@ -7,8 +7,7 @@ module RuboCop
|
|
7
7
|
# check for the variable whose method is being called to
|
8
8
|
# safe navigation (`&.`). If there is a method chain, all of the methods
|
9
9
|
# in the chain need to be checked for safety, and all of the methods will
|
10
|
-
# need to be changed to use safe navigation.
|
11
|
-
# not register an offense for method chains that exceed 2 methods.
|
10
|
+
# need to be changed to use safe navigation.
|
12
11
|
#
|
13
12
|
# The default for `ConvertCodeThatCanStartToReturnNil` is `false`.
|
14
13
|
# When configured to `true`, this will
|
@@ -18,6 +17,10 @@ module RuboCop
|
|
18
17
|
# `foo&.bar` can start returning `nil` as well as what the method
|
19
18
|
# returns.
|
20
19
|
#
|
20
|
+
# The default for `MaxChainLength` is `2`
|
21
|
+
# We have limited the cop to not register an offense for method chains
|
22
|
+
# that exceed this option is set.
|
23
|
+
#
|
21
24
|
# @safety
|
22
25
|
# Autocorrection is unsafe because if a value is `false`, the resulting
|
23
26
|
# code will have different behaviour or raise an error.
|
@@ -116,9 +119,7 @@ module RuboCop
|
|
116
119
|
checked_variable, receiver, method_chain, method = extract_parts(node)
|
117
120
|
return unless receiver == checked_variable
|
118
121
|
return if use_var_only_in_unless_modifier?(node, checked_variable)
|
119
|
-
|
120
|
-
# chain greater than 2
|
121
|
-
return if chain_size(method_chain, method) > 1
|
122
|
+
return if chain_length(method_chain, method) > max_chain_length
|
122
123
|
return if unsafe_method_used?(method_chain, method)
|
123
124
|
return if method_chain.method?(:empty?)
|
124
125
|
|
@@ -225,8 +226,8 @@ module RuboCop
|
|
225
226
|
find_matching_receiver_invocation(receiver, checked_variable)
|
226
227
|
end
|
227
228
|
|
228
|
-
def
|
229
|
-
method.each_ancestor(:send).inject(
|
229
|
+
def chain_length(method_chain, method)
|
230
|
+
method.each_ancestor(:send).inject(1) do |total, ancestor|
|
230
231
|
break total + 1 if ancestor == method_chain
|
231
232
|
|
232
233
|
total + 1
|
@@ -281,6 +282,10 @@ module RuboCop
|
|
281
282
|
break if ancestor == method_chain
|
282
283
|
end
|
283
284
|
end
|
285
|
+
|
286
|
+
def max_chain_length
|
287
|
+
cop_config.fetch('MaxChainLength', 2)
|
288
|
+
end
|
284
289
|
end
|
285
290
|
end
|
286
291
|
end
|
@@ -69,6 +69,11 @@ module RuboCop
|
|
69
69
|
}
|
70
70
|
PATTERN
|
71
71
|
|
72
|
+
# @!method env_const?(node)
|
73
|
+
def_node_matcher :env_const?, <<~PATTERN
|
74
|
+
(const {nil? cbase} :ENV)
|
75
|
+
PATTERN
|
76
|
+
|
72
77
|
# @!method calls_lvar?(node, name)
|
73
78
|
def_node_matcher :calls_lvar?, <<~PATTERN
|
74
79
|
{
|
@@ -94,7 +99,7 @@ module RuboCop
|
|
94
99
|
def receiver_allowed?(node)
|
95
100
|
return false unless node
|
96
101
|
|
97
|
-
node.hash_type? || creates_hash?(node)
|
102
|
+
node.hash_type? || creates_hash?(node) || env_const?(node)
|
98
103
|
end
|
99
104
|
|
100
105
|
def register_offense(node, block_node, regexp)
|
@@ -15,6 +15,11 @@ module RuboCop
|
|
15
15
|
# end
|
16
16
|
# end
|
17
17
|
#
|
18
|
+
# # bad
|
19
|
+
# if condition_b
|
20
|
+
# do_something
|
21
|
+
# end if condition_a
|
22
|
+
#
|
18
23
|
# # good
|
19
24
|
# if condition_a && condition_b
|
20
25
|
# do_something
|
@@ -26,12 +31,21 @@ module RuboCop
|
|
26
31
|
# do_something if condition_b
|
27
32
|
# end
|
28
33
|
#
|
34
|
+
# # bad
|
35
|
+
# if condition_b
|
36
|
+
# do_something
|
37
|
+
# end if condition_a
|
38
|
+
#
|
29
39
|
# @example AllowModifier: true
|
30
40
|
# # good
|
31
41
|
# if condition_a
|
32
42
|
# do_something if condition_b
|
33
43
|
# end
|
34
44
|
#
|
45
|
+
# # good
|
46
|
+
# if condition_b
|
47
|
+
# do_something
|
48
|
+
# end if condition_a
|
35
49
|
class SoleNestedConditional < Base
|
36
50
|
include RangeHelp
|
37
51
|
extend AutoCorrector
|
@@ -47,7 +61,7 @@ module RuboCop
|
|
47
61
|
|
48
62
|
if_branch = node.if_branch
|
49
63
|
return if use_variable_assignment_in_condition?(node.condition, if_branch)
|
50
|
-
return unless offending_branch?(if_branch)
|
64
|
+
return unless offending_branch?(node, if_branch)
|
51
65
|
|
52
66
|
message = format(MSG, conditional_type: node.keyword)
|
53
67
|
add_offense(if_branch.loc.keyword, message: message) do |corrector|
|
@@ -72,13 +86,13 @@ module RuboCop
|
|
72
86
|
end
|
73
87
|
end
|
74
88
|
|
75
|
-
def offending_branch?(branch)
|
89
|
+
def offending_branch?(node, branch)
|
76
90
|
return false unless branch
|
77
91
|
|
78
92
|
branch.if_type? &&
|
79
93
|
!branch.else? &&
|
80
94
|
!branch.ternary? &&
|
81
|
-
!(branch.modifier_form? && allow_modifier?)
|
95
|
+
!((node.modifier_form? || branch.modifier_form?) && allow_modifier?)
|
82
96
|
end
|
83
97
|
|
84
98
|
def autocorrect(corrector, node, if_branch)
|
@@ -86,6 +100,14 @@ module RuboCop
|
|
86
100
|
corrector.wrap(node.condition, '(', ')')
|
87
101
|
end
|
88
102
|
|
103
|
+
if outer_condition_modify_form?(node, if_branch)
|
104
|
+
autocorrect_outer_condition_modify_form(corrector, node, if_branch)
|
105
|
+
else
|
106
|
+
autocorrect_outer_condition_basic(corrector, node, if_branch)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def autocorrect_outer_condition_basic(corrector, node, if_branch)
|
89
111
|
correct_from_unless_to_if(corrector, node) if node.unless?
|
90
112
|
|
91
113
|
and_operator = if_branch.unless? ? ' && !' : ' && '
|
@@ -97,11 +119,17 @@ module RuboCop
|
|
97
119
|
end
|
98
120
|
end
|
99
121
|
|
100
|
-
def
|
122
|
+
def autocorrect_outer_condition_modify_form(corrector, node, if_branch)
|
123
|
+
correct_from_unless_to_if(corrector, if_branch, is_modify_form: true) if if_branch.unless?
|
124
|
+
correct_for_outer_condition_modify_form_style(corrector, node, if_branch)
|
125
|
+
end
|
126
|
+
|
127
|
+
def correct_from_unless_to_if(corrector, node, is_modify_form: false)
|
101
128
|
corrector.replace(node.loc.keyword, 'if')
|
102
129
|
|
103
130
|
condition = node.condition
|
104
|
-
if condition.send_type? && condition.comparison_method? && !condition.parenthesized?
|
131
|
+
if (condition.send_type? && condition.comparison_method? && !condition.parenthesized?) ||
|
132
|
+
(is_modify_form && wrap_condition?(condition))
|
105
133
|
corrector.wrap(node.condition, '!(', ')')
|
106
134
|
else
|
107
135
|
corrector.insert_before(node.condition, '!')
|
@@ -113,7 +141,7 @@ module RuboCop
|
|
113
141
|
correct_outer_condition(corrector, outer_condition)
|
114
142
|
|
115
143
|
condition = if_branch.condition
|
116
|
-
corrector.insert_after(outer_condition,
|
144
|
+
corrector.insert_after(outer_condition, "#{and_operator}#{replace_condition(condition)}")
|
117
145
|
|
118
146
|
range = range_between(if_branch.loc.keyword.begin_pos, condition.source_range.end_pos)
|
119
147
|
corrector.remove(range_with_surrounding_space(range: range, newlines: false))
|
@@ -129,6 +157,16 @@ module RuboCop
|
|
129
157
|
corrector.wrap(if_branch.condition, '(', ')') if wrap_condition?(if_branch.condition)
|
130
158
|
end
|
131
159
|
|
160
|
+
def correct_for_outer_condition_modify_form_style(corrector, node, if_branch)
|
161
|
+
condition = if_branch.condition
|
162
|
+
corrector.insert_before(condition,
|
163
|
+
"#{'!' if node.unless?}#{replace_condition(node.condition)} && ")
|
164
|
+
|
165
|
+
corrector.remove(node.condition.loc.expression)
|
166
|
+
corrector.remove(range_with_surrounding_space(range: node.loc.keyword, newlines: false))
|
167
|
+
corrector.replace(if_branch.loc.keyword, 'if')
|
168
|
+
end
|
169
|
+
|
132
170
|
def correct_for_comment(corrector, node, if_branch)
|
133
171
|
return if config.for_cop('Style/IfUnlessModifier')['Enabled']
|
134
172
|
|
@@ -165,17 +203,17 @@ module RuboCop
|
|
165
203
|
(node.send_type? && node.arguments.any? && !node.parenthesized?)
|
166
204
|
end
|
167
205
|
|
168
|
-
def
|
169
|
-
|
170
|
-
"#{and_operator}(#{condition.source})"
|
171
|
-
else
|
172
|
-
"#{and_operator}#{condition.source}"
|
173
|
-
end
|
206
|
+
def replace_condition(condition)
|
207
|
+
wrap_condition?(condition) ? "(#{condition.source})" : condition.source
|
174
208
|
end
|
175
209
|
|
176
210
|
def allow_modifier?
|
177
211
|
cop_config['AllowModifier']
|
178
212
|
end
|
213
|
+
|
214
|
+
def outer_condition_modify_form?(node, if_branch)
|
215
|
+
node.condition.loc.expression.begin_pos > if_branch.condition.loc.expression.begin_pos
|
216
|
+
end
|
179
217
|
end
|
180
218
|
end
|
181
219
|
end
|
@@ -134,7 +134,13 @@ module RuboCop
|
|
134
134
|
end
|
135
135
|
|
136
136
|
def uncorrectable?(part)
|
137
|
-
part.multiline? || (part
|
137
|
+
part.multiline? || heredoc?(part) || part.each_descendant(:block).any?
|
138
|
+
end
|
139
|
+
|
140
|
+
def heredoc?(node)
|
141
|
+
return false unless node.str_type? || node.dstr_type?
|
142
|
+
|
143
|
+
node.heredoc?
|
138
144
|
end
|
139
145
|
|
140
146
|
def corrected_ancestor?(node)
|
@@ -184,8 +184,7 @@ module RuboCop
|
|
184
184
|
|
185
185
|
def unsafe_autocorrect?(condition)
|
186
186
|
condition.children.any? do |child|
|
187
|
-
unparenthesized_method_call?(child) ||
|
188
|
-
below_ternary_precedence?(child)
|
187
|
+
unparenthesized_method_call?(child) || below_ternary_precedence?(child)
|
189
188
|
end
|
190
189
|
end
|
191
190
|
|
@@ -10,7 +10,7 @@ module RuboCop
|
|
10
10
|
# last item of all non-empty, multiline array literals.
|
11
11
|
# * `comma`: Requires a comma after last item in an array,
|
12
12
|
# but only when each item is on its own line.
|
13
|
-
# * `no_comma`: Does not
|
13
|
+
# * `no_comma`: Does not require a comma after the
|
14
14
|
# last item in an array
|
15
15
|
#
|
16
16
|
# @example EnforcedStyleForMultiline: consistent_comma
|
@@ -10,7 +10,7 @@ module RuboCop
|
|
10
10
|
# last item of all non-empty, multiline hash literals.
|
11
11
|
# * `comma`: Requires a comma after the last item in a hash,
|
12
12
|
# but only when each item is on its own line.
|
13
|
-
# * `no_comma`: Does not
|
13
|
+
# * `no_comma`: Does not require a comma after the
|
14
14
|
# last item in a hash
|
15
15
|
#
|
16
16
|
# @example EnforcedStyleForMultiline: consistent_comma
|
@@ -42,10 +42,7 @@ module RuboCop
|
|
42
42
|
return if node.endless? || !trailing_end?(node)
|
43
43
|
|
44
44
|
add_offense(node.loc.end) do |corrector|
|
45
|
-
corrector.insert_before(
|
46
|
-
node.loc.end,
|
47
|
-
"\n#{' ' * node.loc.keyword.column}"
|
48
|
-
)
|
45
|
+
corrector.insert_before(node.loc.end, "\n#{' ' * node.loc.keyword.column}")
|
49
46
|
end
|
50
47
|
end
|
51
48
|
|
@@ -32,10 +32,14 @@ module RuboCop
|
|
32
32
|
body_range = range_between_condition_and_else(node, node.condition)
|
33
33
|
else_range = range_between_else_and_end(node)
|
34
34
|
|
35
|
+
next if part_of_ignored_node?(node)
|
36
|
+
|
35
37
|
corrector.replace(node.loc.keyword, 'if')
|
36
38
|
corrector.replace(body_range, else_range.source)
|
37
39
|
corrector.replace(else_range, body_range.source)
|
38
40
|
end
|
41
|
+
|
42
|
+
ignore_node(node)
|
39
43
|
end
|
40
44
|
|
41
45
|
def range_between_condition_and_else(node, condition)
|
@@ -186,11 +186,7 @@ module RuboCop
|
|
186
186
|
end
|
187
187
|
|
188
188
|
def regexp_captured_names(node)
|
189
|
-
|
190
|
-
child.children.first
|
191
|
-
end.join || ''
|
192
|
-
|
193
|
-
regexp = Regexp.new(regexp_string)
|
189
|
+
regexp = node.to_regexp
|
194
190
|
|
195
191
|
regexp.named_captures.keys
|
196
192
|
end
|
@@ -191,8 +191,8 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
|
|
191
191
|
|
192
192
|
def wrap_backtick(value)
|
193
193
|
if value.is_a?(String)
|
194
|
-
# Use `+` to prevent text like `**/*.gemspec` from being bold.
|
195
|
-
value.
|
194
|
+
# Use `+` to prevent text like `**/*.gemspec`, `spec/**/*` from being bold.
|
195
|
+
value.include?('*') ? "`+#{value}+`" : "`#{value}`"
|
196
196
|
else
|
197
197
|
"`#{value}`"
|
198
198
|
end
|
@@ -124,9 +124,9 @@ module RuboCop
|
|
124
124
|
default_cfg = default_config(cop_name)
|
125
125
|
|
126
126
|
if supports_safe_auto_correct?(cop_class, default_cfg)
|
127
|
-
output_buffer.puts '#
|
127
|
+
output_buffer.puts '# This cop supports safe auto-correction (--auto-correct).'
|
128
128
|
elsif supports_unsafe_autocorrect?(cop_class, default_cfg)
|
129
|
-
output_buffer.puts '#
|
129
|
+
output_buffer.puts '# This cop supports unsafe auto-correction (--auto-correct-all).'
|
130
130
|
end
|
131
131
|
|
132
132
|
return unless default_cfg
|
@@ -17,6 +17,7 @@ module RuboCop
|
|
17
17
|
def started(target_files)
|
18
18
|
super
|
19
19
|
@offense_counts = Hash.new(0)
|
20
|
+
@style_guide_links = {}
|
20
21
|
|
21
22
|
return unless output.tty?
|
22
23
|
|
@@ -37,6 +38,9 @@ module RuboCop
|
|
37
38
|
|
38
39
|
def file_finished(_file, offenses)
|
39
40
|
offenses.each { |o| @offense_counts[o.cop_name] += 1 }
|
41
|
+
if options[:display_style_guide]
|
42
|
+
offenses.each { |o| @style_guide_links[o.cop_name] ||= o.message[/ \(http\S+\)\Z/] }
|
43
|
+
end
|
40
44
|
@progressbar.increment if instance_variable_defined?(:@progressbar)
|
41
45
|
end
|
42
46
|
|
@@ -52,8 +56,8 @@ module RuboCop
|
|
52
56
|
output.puts
|
53
57
|
|
54
58
|
per_cop_counts.each do |cop_name, count|
|
55
|
-
output.puts "#{count.to_s.ljust(total_count.to_s.length + 2)}" \
|
56
|
-
"#{cop_name}\n"
|
59
|
+
output.puts "#{count.to_s.ljust(total_count.to_s.length + 2)}#{cop_name}" \
|
60
|
+
"#{@style_guide_links[cop_name]}\n"
|
57
61
|
end
|
58
62
|
output.puts '--'
|
59
63
|
output.puts "#{total_count} Total"
|
@@ -40,8 +40,7 @@ module RuboCop
|
|
40
40
|
output.puts
|
41
41
|
|
42
42
|
per_file_counts.each do |file_name, count|
|
43
|
-
output.puts "#{count.to_s.ljust(total_count.to_s.length + 2)}"
|
44
|
-
"#{file_name}\n"
|
43
|
+
output.puts "#{count.to_s.ljust(total_count.to_s.length + 2)}#{file_name}\n"
|
45
44
|
end
|
46
45
|
output.puts '--'
|
47
46
|
output.puts "#{total_count} Total"
|
data/lib/rubocop/options.rb
CHANGED
@@ -467,8 +467,14 @@ module RuboCop
|
|
467
467
|
'This option applies to the previously',
|
468
468
|
'specified --format, or the default format',
|
469
469
|
'if no format is specified.'],
|
470
|
-
fail_level: ['Minimum severity
|
471
|
-
'
|
470
|
+
fail_level: ['Minimum severity for exit with error code.',
|
471
|
+
' [A] autocorrect',
|
472
|
+
' [I] info',
|
473
|
+
' [R] refactor',
|
474
|
+
' [C] convention',
|
475
|
+
' [W] warning',
|
476
|
+
' [E] error',
|
477
|
+
' [F] fatal'],
|
472
478
|
display_time: 'Display elapsed time in seconds.',
|
473
479
|
display_only_failed: ['Only output offense messages. Omit passing',
|
474
480
|
'cops. Only valid for --format junit.'],
|
data/lib/rubocop/result_cache.rb
CHANGED
@@ -73,7 +73,15 @@ module RuboCop
|
|
73
73
|
# access.
|
74
74
|
File.join(ENV['XDG_CACHE_HOME'], Process.uid.to_s)
|
75
75
|
else
|
76
|
-
|
76
|
+
# On FreeBSD, the /home path is a symbolic link to /usr/home
|
77
|
+
# and the $HOME environment variable returns the /home path.
|
78
|
+
#
|
79
|
+
# As $HOME is a built-in environment variable, FreeBSD users
|
80
|
+
# always get a warning message.
|
81
|
+
#
|
82
|
+
# To avoid raising warn log messages on FreeBSD, we retrieve
|
83
|
+
# the real path of the home folder.
|
84
|
+
File.join(File.realpath(ENV['HOME']), '.cache')
|
77
85
|
end
|
78
86
|
File.join(root, 'rubocop_cache')
|
79
87
|
end
|
data/lib/rubocop/runner.rb
CHANGED
@@ -8,7 +8,7 @@ module RuboCop
|
|
8
8
|
class Runner # rubocop:disable Metrics/ClassLength
|
9
9
|
# An exception indicating that the inspection loop got stuck correcting
|
10
10
|
# offenses back and forth.
|
11
|
-
class InfiniteCorrectionLoop <
|
11
|
+
class InfiniteCorrectionLoop < StandardError
|
12
12
|
attr_reader :offenses
|
13
13
|
|
14
14
|
def initialize(path, offenses_by_iteration, loop_start: -1)
|
data/lib/rubocop/target_ruby.rb
CHANGED
@@ -4,7 +4,7 @@ module RuboCop
|
|
4
4
|
# The kind of Ruby that code inspected by RuboCop is written in.
|
5
5
|
# @api private
|
6
6
|
class TargetRuby
|
7
|
-
KNOWN_RUBIES = [2.5, 2.6, 2.7, 3.0, 3.1].freeze
|
7
|
+
KNOWN_RUBIES = [2.5, 2.6, 2.7, 3.0, 3.1, 3.2].freeze
|
8
8
|
DEFAULT_VERSION = KNOWN_RUBIES.first
|
9
9
|
|
10
10
|
OBSOLETE_RUBIES = {
|
data/lib/rubocop/version.rb
CHANGED
data/lib/rubocop.rb
CHANGED
@@ -348,6 +348,7 @@ require_relative 'rubocop/cop/lint/redundant_splat_expansion'
|
|
348
348
|
require_relative 'rubocop/cop/lint/redundant_string_coercion'
|
349
349
|
require_relative 'rubocop/cop/lint/redundant_with_index'
|
350
350
|
require_relative 'rubocop/cop/lint/redundant_with_object'
|
351
|
+
require_relative 'rubocop/cop/lint/refinement_import_methods'
|
351
352
|
require_relative 'rubocop/cop/lint/regexp_as_condition'
|
352
353
|
require_relative 'rubocop/cop/lint/require_parentheses'
|
353
354
|
require_relative 'rubocop/cop/lint/require_relative_self_path'
|
@@ -527,6 +528,7 @@ require_relative 'rubocop/cop/style/open_struct_use'
|
|
527
528
|
require_relative 'rubocop/cop/style/redundant_assignment'
|
528
529
|
require_relative 'rubocop/cop/style/redundant_fetch_block'
|
529
530
|
require_relative 'rubocop/cop/style/redundant_file_extension_in_require'
|
531
|
+
require_relative 'rubocop/cop/style/redundant_initialize'
|
530
532
|
require_relative 'rubocop/cop/style/redundant_self_assignment'
|
531
533
|
require_relative 'rubocop/cop/style/redundant_self_assignment_branch'
|
532
534
|
require_relative 'rubocop/cop/style/sole_nested_conditional'
|
@@ -552,6 +554,7 @@ require_relative 'rubocop/cop/style/negated_if'
|
|
552
554
|
require_relative 'rubocop/cop/style/negated_if_else_condition'
|
553
555
|
require_relative 'rubocop/cop/style/negated_unless'
|
554
556
|
require_relative 'rubocop/cop/style/negated_while'
|
557
|
+
require_relative 'rubocop/cop/style/nested_file_dirname'
|
555
558
|
require_relative 'rubocop/cop/style/nested_modifier'
|
556
559
|
require_relative 'rubocop/cop/style/nested_parenthesized_calls'
|
557
560
|
require_relative 'rubocop/cop/style/nested_ternary_operator'
|