rubocop 0.76.0 → 0.79.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 +2 -2
- data/config/default.yml +290 -264
- data/lib/rubocop/ast/builder.rb +43 -42
- data/lib/rubocop/ast/node/block_node.rb +2 -0
- data/lib/rubocop/ast/node/def_node.rb +11 -0
- data/lib/rubocop/ast/node/forward_args_node.rb +18 -0
- data/lib/rubocop/ast/node.rb +1 -1
- data/lib/rubocop/ast/traversal.rb +11 -3
- data/lib/rubocop/cli/command/auto_genenerate_config.rb +105 -0
- data/lib/rubocop/cli/command/base.rb +33 -0
- data/lib/rubocop/cli/command/execute_runner.rb +76 -0
- data/lib/rubocop/cli/command/init_dotfile.rb +45 -0
- data/lib/rubocop/cli/command/show_cops.rb +80 -0
- data/lib/rubocop/cli/command/version.rb +17 -0
- data/lib/rubocop/cli/command.rb +21 -0
- data/lib/rubocop/cli/environment.rb +21 -0
- data/lib/rubocop/cli.rb +11 -230
- data/lib/rubocop/config.rb +1 -1
- data/lib/rubocop/config_loader.rb +19 -19
- data/lib/rubocop/config_obsoletion.rb +65 -12
- data/lib/rubocop/config_validator.rb +56 -98
- data/lib/rubocop/cop/autocorrect_logic.rb +7 -4
- data/lib/rubocop/cop/bundler/gem_comment.rb +4 -4
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +2 -2
- data/lib/rubocop/cop/cop.rb +21 -0
- data/lib/rubocop/cop/correctors/space_corrector.rb +1 -2
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
- data/lib/rubocop/cop/generator/configuration_injector.rb +1 -1
- data/lib/rubocop/cop/generator.rb +3 -4
- data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +59 -0
- data/lib/rubocop/cop/internal_affairs.rb +1 -0
- data/lib/rubocop/cop/layout/{align_arguments.rb → argument_alignment.rb} +1 -1
- data/lib/rubocop/cop/layout/{align_array.rb → array_alignment.rb} +1 -1
- data/lib/rubocop/cop/layout/{indent_assignment.rb → assignment_indentation.rb} +1 -1
- data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
- data/lib/rubocop/cop/layout/{indent_first_argument.rb → first_argument_indentation.rb} +5 -5
- data/lib/rubocop/cop/layout/{indent_first_array_element.rb → first_array_element_indentation.rb} +4 -4
- data/lib/rubocop/cop/layout/{indent_first_hash_element.rb → first_hash_element_indentation.rb} +3 -3
- data/lib/rubocop/cop/layout/{indent_first_parameter.rb → first_parameter_indentation.rb} +3 -3
- data/lib/rubocop/cop/layout/{align_hash.rb → hash_alignment.rb} +10 -6
- data/lib/rubocop/cop/layout/{indent_heredoc.rb → heredoc_indentation.rb} +5 -5
- data/lib/rubocop/cop/layout/{leading_blank_lines.rb → leading_empty_lines.rb} +1 -1
- data/lib/rubocop/cop/{metrics → layout}/line_length.rb +40 -110
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +14 -5
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
- data/lib/rubocop/cop/layout/{align_parameters.rb → parameter_alignment.rb} +1 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +12 -0
- data/lib/rubocop/cop/layout/space_around_operators.rb +32 -7
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +17 -0
- data/lib/rubocop/cop/layout/{trailing_blank_lines.rb → trailing_empty_lines.rb} +1 -1
- data/lib/rubocop/cop/lint/debugger.rb +2 -2
- data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +1 -1
- data/lib/rubocop/cop/lint/{duplicated_key.rb → duplicate_hash_key.rb} +1 -1
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
- data/lib/rubocop/cop/lint/{multiple_compare.rb → multiple_comparison.rb} +1 -1
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +89 -0
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +3 -3
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +4 -4
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +1 -1
- data/lib/rubocop/cop/lint/{string_conversion_in_interpolation.rb → redundant_string_coercion.rb} +1 -1
- data/lib/rubocop/cop/lint/redundant_with_index.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_with_object.rb +2 -2
- data/lib/rubocop/cop/lint/{handle_exceptions.rb → suppressed_exception.rb} +1 -1
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +57 -23
- data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -1
- data/lib/rubocop/cop/metrics/method_length.rb +1 -1
- data/lib/rubocop/cop/migration/department_name.rb +16 -1
- data/lib/rubocop/cop/mixin/alignment.rb +1 -1
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -7
- data/lib/rubocop/cop/mixin/{hash_alignment.rb → hash_alignment_styles.rb} +1 -1
- data/lib/rubocop/cop/mixin/line_length_help.rb +88 -0
- data/lib/rubocop/cop/mixin/nil_methods.rb +4 -4
- data/lib/rubocop/cop/mixin/rational_literal.rb +18 -0
- data/lib/rubocop/cop/mixin/statement_modifier.rb +2 -2
- data/lib/rubocop/cop/mixin/trailing_comma.rb +6 -3
- data/lib/rubocop/cop/naming/{uncommunicative_block_param_name.rb → block_parameter_name.rb} +3 -3
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +5 -5
- data/lib/rubocop/cop/naming/{uncommunicative_method_param_name.rb → method_parameter_name.rb} +4 -4
- data/lib/rubocop/cop/naming/predicate_name.rb +6 -6
- data/lib/rubocop/cop/offense.rb +11 -0
- data/lib/rubocop/cop/registry.rb +7 -2
- data/lib/rubocop/cop/style/alias.rb +1 -1
- data/lib/rubocop/cop/style/array_join.rb +1 -1
- data/lib/rubocop/cop/style/attr.rb +8 -0
- data/lib/rubocop/cop/style/conditional_assignment.rb +2 -2
- data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
- data/lib/rubocop/cop/style/even_odd.rb +1 -1
- data/lib/rubocop/cop/style/guard_clause.rb +3 -2
- data/lib/rubocop/cop/style/if_unless_modifier.rb +38 -3
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/ip_addresses.rb +4 -4
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +168 -0
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +54 -0
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +4 -207
- data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
- data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -1
- data/lib/rubocop/cop/style/multiline_when_then.rb +5 -1
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +5 -5
- data/lib/rubocop/cop/style/next.rb +5 -5
- data/lib/rubocop/cop/style/numeric_literals.rb +7 -3
- data/lib/rubocop/cop/style/numeric_predicate.rb +4 -3
- data/lib/rubocop/cop/style/option_hash.rb +3 -3
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +7 -7
- data/lib/rubocop/cop/style/redundant_parentheses.rb +3 -3
- data/lib/rubocop/cop/style/redundant_return.rb +2 -8
- data/lib/rubocop/cop/style/redundant_sort.rb +1 -1
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +7 -1
- data/lib/rubocop/cop/style/trivial_accessors.rb +5 -5
- data/lib/rubocop/cop/style/while_until_modifier.rb +1 -1
- data/lib/rubocop/cop/style/yoda_condition.rb +16 -1
- data/lib/rubocop/cop/team.rb +5 -0
- data/lib/rubocop/formatter/base_formatter.rb +2 -2
- data/lib/rubocop/formatter/clang_style_formatter.rb +1 -3
- data/lib/rubocop/formatter/json_formatter.rb +6 -5
- data/lib/rubocop/formatter/tap_formatter.rb +1 -3
- data/lib/rubocop/node_pattern.rb +1 -1
- data/lib/rubocop/options.rb +8 -8
- data/lib/rubocop/processed_source.rb +1 -1
- data/lib/rubocop/rake_task.rb +1 -0
- data/lib/rubocop/result_cache.rb +23 -7
- data/lib/rubocop/rspec/shared_contexts.rb +5 -0
- data/lib/rubocop/runner.rb +18 -2
- data/lib/rubocop/target_ruby.rb +151 -0
- data/lib/rubocop/version.rb +1 -1
- data/lib/rubocop.rb +38 -22
- metadata +40 -25
- data/lib/rubocop/cop/mixin/safe_mode.rb +0 -24
@@ -35,7 +35,7 @@ module RuboCop
|
|
35
35
|
return if !node.children.last.nil? && !node.multiline? && node.then?
|
36
36
|
|
37
37
|
# With more than one statements after then, there's not offense
|
38
|
-
return if node.
|
38
|
+
return if accept_node_type?(node.body)
|
39
39
|
|
40
40
|
add_offense(node, location: :begin)
|
41
41
|
end
|
@@ -49,6 +49,10 @@ module RuboCop
|
|
49
49
|
)
|
50
50
|
end
|
51
51
|
end
|
52
|
+
|
53
|
+
def accept_node_type?(node)
|
54
|
+
node&.begin_type? || node&.array_type? || node&.hash_type?
|
55
|
+
end
|
52
56
|
end
|
53
57
|
end
|
54
58
|
end
|
@@ -49,17 +49,17 @@ module RuboCop
|
|
49
49
|
def allowed_omission?(send_node)
|
50
50
|
!send_node.arguments? || send_node.parenthesized? ||
|
51
51
|
send_node.setter_method? || send_node.operator_method? ||
|
52
|
-
|
52
|
+
allowed?(send_node)
|
53
53
|
end
|
54
54
|
|
55
|
-
def
|
55
|
+
def allowed?(send_node)
|
56
56
|
send_node.parent.arguments.one? &&
|
57
|
-
|
57
|
+
allowed_methods.include?(send_node.method_name.to_s) &&
|
58
58
|
send_node.arguments.one?
|
59
59
|
end
|
60
60
|
|
61
|
-
def
|
62
|
-
cop_config['
|
61
|
+
def allowed_methods
|
62
|
+
cop_config['AllowedMethods'] || []
|
63
63
|
end
|
64
64
|
end
|
65
65
|
end
|
@@ -20,18 +20,18 @@ module RuboCop
|
|
20
20
|
# end
|
21
21
|
#
|
22
22
|
# # good
|
23
|
-
# [1, 2].each do |
|
24
|
-
# puts
|
23
|
+
# [1, 2].each do |a|
|
24
|
+
# puts a if a == 1
|
25
25
|
# end
|
26
26
|
#
|
27
27
|
# @example EnforcedStyle: always
|
28
28
|
# # With `always` all conditions at the end of an iteration needs to be
|
29
29
|
# # replaced by next - with `skip_modifier_ifs` the modifier if like
|
30
|
-
# # this one are ignored: `[1, 2].each { |a|
|
30
|
+
# # this one are ignored: `[1, 2].each { |a| puts a if a == 1 }`
|
31
31
|
#
|
32
32
|
# # bad
|
33
|
-
# [1, 2].each do |
|
34
|
-
# puts
|
33
|
+
# [1, 2].each do |a|
|
34
|
+
# puts a if a == 1
|
35
35
|
# end
|
36
36
|
#
|
37
37
|
# # bad
|
@@ -9,18 +9,22 @@ module RuboCop
|
|
9
9
|
# @example
|
10
10
|
#
|
11
11
|
# # bad
|
12
|
-
#
|
13
12
|
# 1000000
|
14
13
|
# 1_00_000
|
15
14
|
# 1_0000
|
16
15
|
#
|
17
16
|
# # good
|
18
|
-
#
|
19
17
|
# 1_000_000
|
20
18
|
# 1000
|
21
19
|
#
|
22
|
-
#
|
20
|
+
# @example Strict: false (default)
|
23
21
|
#
|
22
|
+
# # good
|
23
|
+
# 10_000_00 # typical representation of $10,000 in cents
|
24
|
+
#
|
25
|
+
# @example Strict: true
|
26
|
+
#
|
27
|
+
# # bad
|
24
28
|
# 10_000_00 # typical representation of $10,000 in cents
|
25
29
|
#
|
26
30
|
class NumericLiterals < Cop
|
@@ -54,9 +54,10 @@ module RuboCop
|
|
54
54
|
}.freeze
|
55
55
|
|
56
56
|
def on_send(node)
|
57
|
-
return if node.
|
58
|
-
|
59
|
-
|
57
|
+
return if ignored_method?(node.method_name) ||
|
58
|
+
node.each_ancestor(:send, :block).any? do |ancestor|
|
59
|
+
ignored_method?(ancestor.method_name)
|
60
|
+
end
|
60
61
|
|
61
62
|
numeric, replacement = check(node)
|
62
63
|
|
@@ -28,7 +28,7 @@ module RuboCop
|
|
28
28
|
|
29
29
|
def on_args(node)
|
30
30
|
return if super_used?(node)
|
31
|
-
return if
|
31
|
+
return if allowlist.include?(node.parent.method_name.to_s)
|
32
32
|
|
33
33
|
option_hash(node) do |options|
|
34
34
|
add_offense(options)
|
@@ -37,8 +37,8 @@ module RuboCop
|
|
37
37
|
|
38
38
|
private
|
39
39
|
|
40
|
-
def
|
41
|
-
cop_config['
|
40
|
+
def allowlist
|
41
|
+
cop_config['Allowlist'] || []
|
42
42
|
end
|
43
43
|
|
44
44
|
def suspicious_name?(arg_name)
|
@@ -88,27 +88,27 @@ module RuboCop
|
|
88
88
|
end
|
89
89
|
|
90
90
|
def contains_preferred_delimiter?(node, type)
|
91
|
-
|
92
|
-
node
|
93
|
-
.children.map { |n| string_source(n) }.compact
|
94
|
-
.any? { |s| preferred_delimiters.any? { |d| s.include?(d) } }
|
91
|
+
contains_delimiter?(node, preferred_delimiters_for(type))
|
95
92
|
end
|
96
93
|
|
97
94
|
def include_same_character_as_used_for_delimiter?(node, type)
|
98
95
|
return false unless %w[%w %i].include?(type)
|
99
96
|
|
100
97
|
used_delimiters = matchpairs(begin_source(node)[-1])
|
101
|
-
|
98
|
+
contains_delimiter?(node, used_delimiters)
|
99
|
+
end
|
102
100
|
|
101
|
+
def contains_delimiter?(node, delimiters)
|
102
|
+
delimiters_regexp = Regexp.union(delimiters)
|
103
103
|
node
|
104
104
|
.children.map { |n| string_source(n) }.compact
|
105
|
-
.any? { |s|
|
105
|
+
.any? { |s| delimiters_regexp =~ s }
|
106
106
|
end
|
107
107
|
|
108
108
|
def string_source(node)
|
109
109
|
if node.is_a?(String)
|
110
110
|
node
|
111
|
-
elsif node.respond_to?(:type) && node.str_type?
|
111
|
+
elsif node.respond_to?(:type) && (node.str_type? || node.sym_type?)
|
112
112
|
node.source
|
113
113
|
end
|
114
114
|
end
|
@@ -19,7 +19,7 @@ module RuboCop
|
|
19
19
|
def_node_matcher :square_brackets?,
|
20
20
|
'(send {(send _recv _msg) str array hash} :[] ...)'
|
21
21
|
def_node_matcher :range_end?, '^^{irange erange}'
|
22
|
-
def_node_matcher :method_node_and_args, '$(
|
22
|
+
def_node_matcher :method_node_and_args, '$(call _recv _msg $...)'
|
23
23
|
def_node_matcher :rescue?, '{^resbody ^^resbody}'
|
24
24
|
def_node_matcher :arg_in_call_with_block?,
|
25
25
|
'^^(block (send _ _ equal?(%0) ...) ...)'
|
@@ -102,7 +102,7 @@ module RuboCop
|
|
102
102
|
return offense(begin_node, 'a variable') if node.variable?
|
103
103
|
return offense(begin_node, 'a constant') if node.const_type?
|
104
104
|
|
105
|
-
check_send(begin_node, node) if node.
|
105
|
+
check_send(begin_node, node) if node.call_type?
|
106
106
|
end
|
107
107
|
|
108
108
|
def check_send(begin_node, node)
|
@@ -195,7 +195,7 @@ module RuboCop
|
|
195
195
|
end
|
196
196
|
|
197
197
|
def method_call_with_redundant_parentheses?(node)
|
198
|
-
return false unless node.
|
198
|
+
return false unless node.call_type?
|
199
199
|
return false if node.prefix_not?
|
200
200
|
return false if range_end?(node)
|
201
201
|
|
@@ -54,8 +54,6 @@ module RuboCop
|
|
54
54
|
MULTI_RETURN_MSG = 'To return multiple values, use an array.'
|
55
55
|
|
56
56
|
def on_def(node)
|
57
|
-
return unless node.body
|
58
|
-
|
59
57
|
check_branch(node.body)
|
60
58
|
end
|
61
59
|
alias on_defs on_def
|
@@ -152,12 +150,8 @@ module RuboCop
|
|
152
150
|
end
|
153
151
|
|
154
152
|
def check_begin_node(node)
|
155
|
-
|
156
|
-
last_expr
|
157
|
-
|
158
|
-
return unless last_expr&.return_type?
|
159
|
-
|
160
|
-
check_return_node(last_expr)
|
153
|
+
last_expr = node.children.last
|
154
|
+
check_branch(last_expr)
|
161
155
|
end
|
162
156
|
|
163
157
|
def allow_multiple_return_values?
|
@@ -20,8 +20,14 @@ module RuboCop
|
|
20
20
|
# a, *b, _ = foo()
|
21
21
|
# # => The correction `a, *b, = foo()` is a syntax error
|
22
22
|
#
|
23
|
-
#
|
23
|
+
# @example AllowNamedUnderscoreVariables: true (default)
|
24
|
+
# # good
|
24
25
|
# a, b, _something = foo()
|
26
|
+
#
|
27
|
+
# @example AllowNamedUnderscoreVariables: false
|
28
|
+
# # bad
|
29
|
+
# a, b, _something = foo()
|
30
|
+
#
|
25
31
|
class TrailingUnderscoreVariable < Cop
|
26
32
|
include SurroundingSpace
|
27
33
|
include RangeHelp
|
@@ -60,7 +60,7 @@ module RuboCop
|
|
60
60
|
when :module
|
61
61
|
return true
|
62
62
|
else
|
63
|
-
return true if pnode.
|
63
|
+
return true if pnode.method?(:instance_eval)
|
64
64
|
end
|
65
65
|
end
|
66
66
|
false
|
@@ -95,9 +95,9 @@ module RuboCop
|
|
95
95
|
cop_config['IgnoreClassMethods']
|
96
96
|
end
|
97
97
|
|
98
|
-
def
|
99
|
-
|
100
|
-
Array(
|
98
|
+
def allowed_methods
|
99
|
+
allowed_methods = cop_config['AllowedMethods']
|
100
|
+
Array(allowed_methods).map(&:to_sym) + [:initialize]
|
101
101
|
end
|
102
102
|
|
103
103
|
def dsl_writer?(method_name)
|
@@ -124,7 +124,7 @@ module RuboCop
|
|
124
124
|
PATTERN
|
125
125
|
|
126
126
|
def allowed_method?(node)
|
127
|
-
|
127
|
+
allowed_methods.include?(node.method_name) ||
|
128
128
|
exact_name_match? && !names_match?(node)
|
129
129
|
end
|
130
130
|
|
@@ -5,7 +5,7 @@ module RuboCop
|
|
5
5
|
module Style
|
6
6
|
# Checks for while and until statements that would fit on one line
|
7
7
|
# if written as a modifier while/until. The maximum line length is
|
8
|
-
# configured in the `
|
8
|
+
# configured in the `Layout/LineLength` cop.
|
9
9
|
#
|
10
10
|
# @example
|
11
11
|
# # bad
|
@@ -67,9 +67,16 @@ module RuboCop
|
|
67
67
|
|
68
68
|
NONCOMMUTATIVE_OPERATORS = %i[===].freeze
|
69
69
|
|
70
|
+
PROGRAM_NAMES = %i[$0 $PROGRAM_NAME].freeze
|
71
|
+
|
72
|
+
def_node_matcher :file_constant_equal_program_name?, <<~PATTERN
|
73
|
+
(send #source_file_path_constant? {:== :!=} (gvar #program_name?))
|
74
|
+
PATTERN
|
75
|
+
|
70
76
|
def on_send(node)
|
71
77
|
return unless yoda_compatible_condition?(node)
|
72
|
-
return if equality_only? && non_equality_operator?(node)
|
78
|
+
return if equality_only? && non_equality_operator?(node) ||
|
79
|
+
file_constant_equal_program_name?(node)
|
73
80
|
|
74
81
|
valid_yoda?(node) || add_offense(node)
|
75
82
|
end
|
@@ -135,6 +142,14 @@ module RuboCop
|
|
135
142
|
def noncommutative_operator?(node)
|
136
143
|
NONCOMMUTATIVE_OPERATORS.include?(node.method_name)
|
137
144
|
end
|
145
|
+
|
146
|
+
def source_file_path_constant?(node)
|
147
|
+
node.source == '__FILE__'
|
148
|
+
end
|
149
|
+
|
150
|
+
def program_name?(name)
|
151
|
+
PROGRAM_NAMES.include?(name)
|
152
|
+
end
|
138
153
|
end
|
139
154
|
end
|
140
155
|
end
|
data/lib/rubocop/cop/team.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# rubocop:disable
|
3
|
+
# rubocop:disable Layout/LineLength
|
4
4
|
|
5
5
|
module RuboCop
|
6
6
|
module Formatter
|
@@ -41,7 +41,7 @@ module RuboCop
|
|
41
41
|
# * `#finished`
|
42
42
|
#
|
43
43
|
class BaseFormatter
|
44
|
-
# rubocop:enable
|
44
|
+
# rubocop:enable Layout/LineLength
|
45
45
|
|
46
46
|
# @api public
|
47
47
|
#
|
@@ -24,16 +24,14 @@ module RuboCop
|
|
24
24
|
message: message(offense)
|
25
25
|
)
|
26
26
|
|
27
|
-
# rubocop:disable Lint/HandleExceptions
|
28
27
|
begin
|
29
28
|
return unless valid_line?(offense)
|
30
29
|
|
31
30
|
report_line(offense.location)
|
32
31
|
report_highlighted_area(offense.highlighted_area)
|
33
|
-
rescue IndexError
|
32
|
+
rescue IndexError # rubocop:disable Lint/SuppressedException
|
34
33
|
# range is not on a valid line; perhaps the source file is empty
|
35
34
|
end
|
36
|
-
# rubocop:enable Lint/HandleExceptions
|
37
35
|
end
|
38
36
|
|
39
37
|
def valid_line?(offense)
|
@@ -53,11 +53,12 @@ module RuboCop
|
|
53
53
|
|
54
54
|
def hash_for_offense(offense)
|
55
55
|
{
|
56
|
-
severity:
|
57
|
-
message:
|
58
|
-
cop_name:
|
59
|
-
corrected:
|
60
|
-
|
56
|
+
severity: offense.severity.name,
|
57
|
+
message: offense.message,
|
58
|
+
cop_name: offense.cop_name,
|
59
|
+
corrected: offense.corrected?,
|
60
|
+
correctable: offense.correctable?,
|
61
|
+
location: hash_for_location(offense)
|
61
62
|
}
|
62
63
|
end
|
63
64
|
|
@@ -51,16 +51,14 @@ module RuboCop
|
|
51
51
|
message: message(offense)
|
52
52
|
)
|
53
53
|
|
54
|
-
# rubocop:disable Lint/HandleExceptions
|
55
54
|
begin
|
56
55
|
return unless valid_line?(offense)
|
57
56
|
|
58
57
|
report_line(offense.location)
|
59
58
|
report_highlighted_area(offense.highlighted_area)
|
60
|
-
rescue IndexError
|
59
|
+
rescue IndexError # rubocop:disable Lint/SuppressedException
|
61
60
|
# range is not on a valid line; perhaps the source file is empty
|
62
61
|
end
|
63
|
-
# rubocop:enable Lint/HandleExceptions
|
64
62
|
end
|
65
63
|
|
66
64
|
def annotate_message(msg)
|
data/lib/rubocop/node_pattern.rb
CHANGED
data/lib/rubocop/options.rb
CHANGED
@@ -264,18 +264,18 @@ module RuboCop
|
|
264
264
|
# rubocop:disable Metrics/AbcSize
|
265
265
|
def validate_compatibility # rubocop:disable Metrics/MethodLength
|
266
266
|
if only_includes_redundant_disable?
|
267
|
-
raise OptionArgumentError, 'Lint/RedundantCopDisableDirective
|
268
|
-
'
|
267
|
+
raise OptionArgumentError, 'Lint/RedundantCopDisableDirective cannot ' \
|
268
|
+
'be used with --only.'
|
269
269
|
end
|
270
270
|
if except_syntax?
|
271
|
-
raise OptionArgumentError, 'Syntax checking
|
271
|
+
raise OptionArgumentError, 'Syntax checking cannot be turned off.'
|
272
272
|
end
|
273
273
|
unless boolean_or_empty_cache?
|
274
274
|
raise OptionArgumentError, '-C/--cache argument must be true or false'
|
275
275
|
end
|
276
276
|
|
277
277
|
if display_only_fail_level_offenses_with_autocorrect?
|
278
|
-
raise OptionArgumentError, '--autocorrect
|
278
|
+
raise OptionArgumentError, '--autocorrect cannot be used with ' \
|
279
279
|
'--display-only-fail-level-offenses'
|
280
280
|
end
|
281
281
|
validate_auto_gen_config
|
@@ -329,8 +329,8 @@ module RuboCop
|
|
329
329
|
auto_gen_config: '-P/--parallel uses caching to speed up execution, ' \
|
330
330
|
'while --auto-gen-config needs a non-cached run, ' \
|
331
331
|
'so they cannot be combined.',
|
332
|
-
fail_fast: '-P/--parallel
|
333
|
-
auto_correct: '-P/--parallel
|
332
|
+
fail_fast: '-P/--parallel cannot be combined with -F/--fail-fast.',
|
333
|
+
auto_correct: '-P/--parallel cannot be combined with --auto-correct.'
|
334
334
|
}
|
335
335
|
|
336
336
|
combos.each do |key, msg|
|
@@ -373,7 +373,7 @@ module RuboCop
|
|
373
373
|
# This module contains help texts for command line options.
|
374
374
|
module OptionsHelp
|
375
375
|
MAX_EXCL = RuboCop::Options::DEFAULT_MAXIMUM_EXCLUSION_ITEMS.to_s
|
376
|
-
# rubocop:disable
|
376
|
+
# rubocop:disable Layout/LineLength
|
377
377
|
FORMATTER_OPTION_LIST = RuboCop::Formatter::FormatterSet::BUILTIN_FORMATTERS_FOR_KEYS.keys
|
378
378
|
|
379
379
|
TEXT = {
|
@@ -455,6 +455,6 @@ module RuboCop
|
|
455
455
|
'reports. This is useful for editor integration.'],
|
456
456
|
init: 'Generate a .rubocop.yml file in the current directory.'
|
457
457
|
}.freeze
|
458
|
-
# rubocop:enable
|
458
|
+
# rubocop:enable Layout/LineLength
|
459
459
|
end
|
460
460
|
end
|
@@ -163,7 +163,7 @@ module RuboCop
|
|
163
163
|
ast, comments, tokens = parser.tokenize(@buffer)
|
164
164
|
|
165
165
|
ast.respond_to?(:complete!) && ast.complete!
|
166
|
-
rescue Parser::SyntaxError # rubocop:disable Lint/
|
166
|
+
rescue Parser::SyntaxError # rubocop:disable Lint/SuppressedException
|
167
167
|
# All errors are in diagnostics. No need to handle exception.
|
168
168
|
end
|
169
169
|
|
data/lib/rubocop/rake_task.rb
CHANGED
data/lib/rubocop/result_cache.rb
CHANGED
@@ -77,12 +77,13 @@ module RuboCop
|
|
77
77
|
config_store.for('.').for_all_cops['AllowSymlinksInCacheRootDirectory']
|
78
78
|
end
|
79
79
|
|
80
|
-
def initialize(file, options, config_store, cache_root = nil)
|
80
|
+
def initialize(file, team, options, config_store, cache_root = nil)
|
81
81
|
cache_root ||= ResultCache.cache_root(config_store)
|
82
82
|
@allow_symlinks_in_cache_location =
|
83
83
|
ResultCache.allow_symlinks_in_cache_location?(config_store)
|
84
|
-
@path = File.join(cache_root,
|
85
|
-
|
84
|
+
@path = File.join(cache_root,
|
85
|
+
rubocop_checksum,
|
86
|
+
context_checksum(team, options),
|
86
87
|
file_checksum(file, config_store))
|
87
88
|
@cached_data = CachedData.new(file)
|
88
89
|
end
|
@@ -182,10 +183,25 @@ module RuboCop
|
|
182
183
|
# don't affect caching.
|
183
184
|
def relevant_options_digest(options)
|
184
185
|
options = options.reject { |key, _| NON_CHANGING.include?(key) }
|
185
|
-
options
|
186
|
-
|
187
|
-
|
188
|
-
|
186
|
+
options.to_s.gsub(/[^a-z]+/i, '_')
|
187
|
+
end
|
188
|
+
|
189
|
+
# The external dependency checksums are cached per RuboCop team so that
|
190
|
+
# the checksums don't need to be recomputed for each file.
|
191
|
+
def team_checksum(team)
|
192
|
+
@checksum_by_team ||= {}
|
193
|
+
@checksum_by_team[team.object_id] ||= team.external_dependency_checksum
|
194
|
+
end
|
195
|
+
|
196
|
+
# We combine team and options into a single "context" checksum to avoid
|
197
|
+
# making file names that are too long for some filesystems to handle.
|
198
|
+
# This context is for anything that's not (1) the RuboCop executable
|
199
|
+
# checksum or (2) the inspected file checksum.
|
200
|
+
def context_checksum(team, options)
|
201
|
+
Digest::SHA1.hexdigest([
|
202
|
+
team_checksum(team),
|
203
|
+
relevant_options_digest(options)
|
204
|
+
].join)
|
189
205
|
end
|
190
206
|
end
|
191
207
|
end
|
@@ -52,6 +52,7 @@ RSpec.shared_context 'config', :config do
|
|
52
52
|
cop_name = described_class.cop_name
|
53
53
|
hash[cop_name] = RuboCop::ConfigLoader
|
54
54
|
.default_configuration[cop_name]
|
55
|
+
.merge('Enabled' => true) # in case it is 'pending'
|
55
56
|
.merge(cop_config)
|
56
57
|
end
|
57
58
|
|
@@ -88,3 +89,7 @@ end
|
|
88
89
|
RSpec.shared_context 'ruby 2.6', :ruby26 do
|
89
90
|
let(:ruby_version) { 2.6 }
|
90
91
|
end
|
92
|
+
|
93
|
+
RSpec.shared_context 'ruby 2.7', :ruby27 do
|
94
|
+
let(:ruby_version) { 2.7 }
|
95
|
+
end
|
data/lib/rubocop/runner.rb
CHANGED
@@ -121,8 +121,14 @@ module RuboCop
|
|
121
121
|
end
|
122
122
|
end
|
123
123
|
|
124
|
+
def cached_result(file, team)
|
125
|
+
ResultCache.new(file, team, @options, @config_store)
|
126
|
+
end
|
127
|
+
|
124
128
|
def file_offense_cache(file)
|
125
|
-
|
129
|
+
config = @config_store.for(file)
|
130
|
+
cache = cached_result(file, standby_team(config)) if cached_run?
|
131
|
+
|
126
132
|
if cache&.valid?
|
127
133
|
offenses = cache.load
|
128
134
|
# If we're running --auto-correct and the cache says there are
|
@@ -208,7 +214,7 @@ module RuboCop
|
|
208
214
|
@config_store.for(Dir.pwd).for_all_cops['UseCache']) &&
|
209
215
|
# When running --auto-gen-config, there's some processing done in the
|
210
216
|
# cops related to calculating the Max parameters for Metrics cops. We
|
211
|
-
# need to do that processing and
|
217
|
+
# need to do that processing and cannot use caching.
|
212
218
|
!@options[:auto_gen_config] &&
|
213
219
|
# We can't cache results from code which is piped in to stdin
|
214
220
|
!@options[:stdin]
|
@@ -359,5 +365,15 @@ module RuboCop
|
|
359
365
|
ProcessedSource.from_file(file, ruby_version)
|
360
366
|
end
|
361
367
|
end
|
368
|
+
|
369
|
+
# A Cop::Team instance is stateful and may change when inspecting.
|
370
|
+
# The "standby" team for a given config is an initialized but
|
371
|
+
# otherwise dormant team that can be used for config- and option-
|
372
|
+
# level caching in ResultCache.
|
373
|
+
def standby_team(config)
|
374
|
+
@team_by_config ||= {}
|
375
|
+
@team_by_config[config.object_id] ||=
|
376
|
+
Cop::Team.new(mobilized_cop_classes(config), config, @options)
|
377
|
+
end
|
362
378
|
end
|
363
379
|
end
|