rubocop 1.25.1 → 1.27.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 +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'
|