rubocop 1.80.2 → 1.81.7
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 +14 -2
- data/lib/rubocop/cli/command/auto_generate_config.rb +2 -2
- data/lib/rubocop/cli.rb +1 -2
- data/lib/rubocop/config_loader.rb +3 -1
- data/lib/rubocop/config_loader_resolver.rb +5 -4
- data/lib/rubocop/config_store.rb +5 -0
- data/lib/rubocop/cop/autocorrect_logic.rb +4 -4
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +3 -1
- data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +1 -1
- data/lib/rubocop/cop/layout/class_structure.rb +1 -1
- data/lib/rubocop/cop/layout/dot_position.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +30 -12
- data/lib/rubocop/cop/layout/hash_alignment.rb +2 -5
- data/lib/rubocop/cop/layout/line_length.rb +9 -1
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +6 -4
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +8 -0
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +1 -1
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +3 -2
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +13 -7
- data/lib/rubocop/cop/lint/debugger.rb +0 -2
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +4 -1
- data/lib/rubocop/cop/lint/empty_interpolation.rb +11 -0
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +16 -6
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -4
- data/lib/rubocop/cop/lint/self_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/shadowed_argument.rb +7 -7
- data/lib/rubocop/cop/lint/void.rb +7 -0
- data/lib/rubocop/cop/message_annotator.rb +1 -1
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +1 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -1
- data/lib/rubocop/cop/naming/method_name.rb +3 -1
- data/lib/rubocop/cop/naming/predicate_method.rb +16 -4
- data/lib/rubocop/cop/security/json_load.rb +33 -11
- data/lib/rubocop/cop/style/array_intersect.rb +2 -2
- data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +47 -0
- data/lib/rubocop/cop/style/conditional_assignment.rb +7 -3
- data/lib/rubocop/cop/style/constant_visibility.rb +14 -9
- data/lib/rubocop/cop/style/double_negation.rb +1 -1
- data/lib/rubocop/cop/style/endless_method.rb +15 -2
- data/lib/rubocop/cop/style/explicit_block_argument.rb +1 -1
- data/lib/rubocop/cop/style/float_division.rb +15 -1
- data/lib/rubocop/cop/style/hash_syntax.rb +1 -1
- data/lib/rubocop/cop/style/nil_comparison.rb +9 -7
- data/lib/rubocop/cop/style/one_line_conditional.rb +17 -9
- data/lib/rubocop/cop/style/redundant_exception.rb +1 -1
- data/lib/rubocop/cop/style/redundant_format.rb +26 -5
- data/lib/rubocop/cop/style/redundant_interpolation.rb +11 -2
- data/lib/rubocop/cop/style/redundant_parentheses.rb +1 -0
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +4 -0
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +8 -0
- data/lib/rubocop/cop/style/semicolon.rb +23 -7
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +8 -1
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +45 -0
- data/lib/rubocop/cop/style/unless_else.rb +10 -9
- data/lib/rubocop/cop/utils/format_string.rb +10 -0
- data/lib/rubocop/cops_documentation_generator.rb +4 -4
- data/lib/rubocop/lsp/diagnostic.rb +21 -20
- data/lib/rubocop/lsp/routes.rb +36 -9
- data/lib/rubocop/lsp/runtime.rb +2 -2
- data/lib/rubocop/lsp/server.rb +2 -2
- data/lib/rubocop/lsp/stdin_runner.rb +0 -16
- data/lib/rubocop/target_ruby.rb +10 -1
- data/lib/rubocop/version.rb +1 -1
- data/lib/rubocop.rb +1 -0
- data/lib/ruby_lsp/rubocop/addon.rb +23 -8
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +49 -15
- metadata +7 -6
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 8acfafa4ed4b94c367e6ef95c84d2d02f01222a1e8a813790948977476f34456
|
|
4
|
+
data.tar.gz: 0d2ad56c4a81da58046a098351606bfb8314f09f9e5f946ad1dd825aa70fe0f7
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ae4edea22ca7511df39ec99591df3d537bfd3fa8974d5bb461d2b1c674b48f15296f22c81b1cd9329719a68b0d3f8d36442eaa5742cbf8e0974c6e3e2e56e29c
|
|
7
|
+
data.tar.gz: ffce467cec50d2ed0ef7b312a15dd17e9b7fd1622b70528d12f0cfe16056ae3b5111f2d360b4e855ea5811befd092a306ff56ad091b89a6050f3354f3db205a4
|
data/README.md
CHANGED
|
@@ -51,7 +51,7 @@ To prevent an unwanted RuboCop update you might want to use a conservative versi
|
|
|
51
51
|
in your `Gemfile`:
|
|
52
52
|
|
|
53
53
|
```rb
|
|
54
|
-
gem 'rubocop', '~> 1.
|
|
54
|
+
gem 'rubocop', '~> 1.81', require: false
|
|
55
55
|
```
|
|
56
56
|
|
|
57
57
|
See [our versioning policy](https://docs.rubocop.org/rubocop/versioning.html) for further details.
|
data/config/default.yml
CHANGED
|
@@ -275,7 +275,7 @@ Gemspec/AddRuntimeDependency:
|
|
|
275
275
|
Description: 'Prefer `add_dependency` over `add_runtime_dependency`.'
|
|
276
276
|
StyleGuide: '#add_dependency_vs_add_runtime_dependency'
|
|
277
277
|
References:
|
|
278
|
-
- https://github.com/
|
|
278
|
+
- https://github.com/ruby/rubygems/issues/7799#issuecomment-2192720316
|
|
279
279
|
Enabled: pending
|
|
280
280
|
VersionAdded: '1.65'
|
|
281
281
|
Include:
|
|
@@ -3207,6 +3207,7 @@ Security/JSONLoad:
|
|
|
3207
3207
|
security issues. See reference for more information.
|
|
3208
3208
|
References:
|
|
3209
3209
|
- 'https://ruby-doc.org/stdlib-2.7.0/libdoc/json/rdoc/JSON.html#method-i-load'
|
|
3210
|
+
- 'https://bugs.ruby-lang.org/issues/19528'
|
|
3210
3211
|
Enabled: true
|
|
3211
3212
|
VersionAdded: '0.43'
|
|
3212
3213
|
VersionChanged: '1.22'
|
|
@@ -3341,6 +3342,12 @@ Style/ArrayIntersect:
|
|
|
3341
3342
|
Safe: false
|
|
3342
3343
|
VersionAdded: '1.40'
|
|
3343
3344
|
|
|
3345
|
+
Style/ArrayIntersectWithSingleElement:
|
|
3346
|
+
Description: 'Use `include?(element)` instead of `intersect?([element])`.'
|
|
3347
|
+
Enabled: 'pending'
|
|
3348
|
+
Safe: false
|
|
3349
|
+
VersionAdded: '1.81'
|
|
3350
|
+
|
|
3344
3351
|
Style/ArrayJoin:
|
|
3345
3352
|
Description: 'Use Array#join instead of Array#*.'
|
|
3346
3353
|
StyleGuide: '#array-join'
|
|
@@ -4546,8 +4553,9 @@ Style/LambdaCall:
|
|
|
4546
4553
|
Description: 'Use lambda.call(...) instead of lambda.(...).'
|
|
4547
4554
|
StyleGuide: '#proc-call'
|
|
4548
4555
|
Enabled: true
|
|
4556
|
+
AutoCorrect: contextual
|
|
4549
4557
|
VersionAdded: '0.13'
|
|
4550
|
-
VersionChanged: '
|
|
4558
|
+
VersionChanged: '1.81'
|
|
4551
4559
|
EnforcedStyle: call
|
|
4552
4560
|
SupportedStyles:
|
|
4553
4561
|
- call
|
|
@@ -5844,10 +5852,14 @@ Style/TrailingCommaInArguments:
|
|
|
5844
5852
|
# parenthesized method calls where each argument is on its own line.
|
|
5845
5853
|
# If `consistent_comma`, the cop requires a comma after the last argument,
|
|
5846
5854
|
# for all parenthesized method calls with arguments.
|
|
5855
|
+
# If `diff_comma`, the cop requires a comma after the last argument, but only
|
|
5856
|
+
# when that argument is followed by an immediate newline, even if
|
|
5857
|
+
# there is an inline comment.
|
|
5847
5858
|
EnforcedStyleForMultiline: no_comma
|
|
5848
5859
|
SupportedStylesForMultiline:
|
|
5849
5860
|
- comma
|
|
5850
5861
|
- consistent_comma
|
|
5862
|
+
- diff_comma
|
|
5851
5863
|
- no_comma
|
|
5852
5864
|
|
|
5853
5865
|
Style/TrailingCommaInArrayLiteral:
|
|
@@ -83,7 +83,7 @@ module RuboCop
|
|
|
83
83
|
execute_runner
|
|
84
84
|
@options.delete(:only)
|
|
85
85
|
@config_store = ConfigStore.new
|
|
86
|
-
@config_store.
|
|
86
|
+
@config_store.apply_options!(@options)
|
|
87
87
|
# Save the todo configuration of the LineLength cop.
|
|
88
88
|
File.read(AUTO_GENERATED_FILE).lines.drop_while { |line| line.start_with?('#') }.join
|
|
89
89
|
end
|
|
@@ -99,7 +99,7 @@ module RuboCop
|
|
|
99
99
|
|
|
100
100
|
def reset_config_and_auto_gen_file
|
|
101
101
|
@config_store = ConfigStore.new
|
|
102
|
-
@config_store.
|
|
102
|
+
@config_store.apply_options!(@options)
|
|
103
103
|
File.open(AUTO_GENERATED_FILE, 'w') {} # create or truncate if exists
|
|
104
104
|
add_inheritance_from_auto_generated_file(@options[:config])
|
|
105
105
|
end
|
data/lib/rubocop/cli.rb
CHANGED
|
@@ -164,8 +164,7 @@ module RuboCop
|
|
|
164
164
|
set_options_to_pending_cops_reporter
|
|
165
165
|
handle_editor_mode
|
|
166
166
|
|
|
167
|
-
@config_store.
|
|
168
|
-
@config_store.force_default_config! if @options[:force_default_config]
|
|
167
|
+
@config_store.apply_options!(@options)
|
|
169
168
|
|
|
170
169
|
handle_exiting_options
|
|
171
170
|
|
|
@@ -75,7 +75,9 @@ module RuboCop
|
|
|
75
75
|
|
|
76
76
|
puts "configuration from #{absolute_path}" if debug?
|
|
77
77
|
|
|
78
|
-
|
|
78
|
+
unless hash.is_a?(Hash)
|
|
79
|
+
raise(ValidationError, "Malformed configuration in #{absolute_path}")
|
|
80
|
+
end
|
|
79
81
|
|
|
80
82
|
hash
|
|
81
83
|
end
|
|
@@ -295,10 +295,11 @@ module RuboCop
|
|
|
295
295
|
begin
|
|
296
296
|
gem = Bundler.load.specs[gem_name].first
|
|
297
297
|
gem_path = gem.full_gem_path if gem
|
|
298
|
-
rescue
|
|
299
|
-
#
|
|
300
|
-
|
|
301
|
-
# The Gemfile exists but contains an uninstalled git source
|
|
298
|
+
rescue StandardError
|
|
299
|
+
# The Gemfile has a problem, which could be one of:
|
|
300
|
+
# - No Gemfile found. Bundler may be loaded manually
|
|
301
|
+
# - The Gemfile exists but contains an uninstalled git source
|
|
302
|
+
# - The Gemfile exists but cannot be loaded for some other reason
|
|
302
303
|
end
|
|
303
304
|
end
|
|
304
305
|
|
data/lib/rubocop/config_store.rb
CHANGED
|
@@ -25,6 +25,11 @@ module RuboCop
|
|
|
25
25
|
@validated = true
|
|
26
26
|
end
|
|
27
27
|
|
|
28
|
+
def apply_options!(options)
|
|
29
|
+
self.options_config = options[:config] if options[:config]
|
|
30
|
+
force_default_config! if options[:force_default_config]
|
|
31
|
+
end
|
|
32
|
+
|
|
28
33
|
def options_config=(options_config)
|
|
29
34
|
loaded_config = ConfigLoader.load_file(options_config)
|
|
30
35
|
@options_config = ConfigLoader.merge_with_default(loaded_config, options_config)
|
|
@@ -35,8 +35,8 @@ module RuboCop
|
|
|
35
35
|
# `false` is the same as `disabled` for backward compatibility.
|
|
36
36
|
return false if ['disabled', false].include?(cop_config['AutoCorrect'])
|
|
37
37
|
|
|
38
|
-
# When LSP is enabled, it is considered as editing
|
|
39
|
-
# and autocorrection with `AutoCorrect: contextual` will not be performed.
|
|
38
|
+
# When LSP is enabled or the `--editor-mode` option is on, it is considered as editing
|
|
39
|
+
# source code, and autocorrection with `AutoCorrect: contextual` will not be performed.
|
|
40
40
|
return false if contextual_autocorrect? && LSP.enabled?
|
|
41
41
|
|
|
42
42
|
# :safe_autocorrect is a derived option based on several command-line
|
|
@@ -94,7 +94,7 @@ module RuboCop
|
|
|
94
94
|
end
|
|
95
95
|
|
|
96
96
|
def surrounding_heredoc?(node)
|
|
97
|
-
node.
|
|
97
|
+
node.any_str_type? && node.heredoc?
|
|
98
98
|
end
|
|
99
99
|
|
|
100
100
|
def heredoc_range(node)
|
|
@@ -106,7 +106,7 @@ module RuboCop
|
|
|
106
106
|
end
|
|
107
107
|
|
|
108
108
|
def string_continuation?(node)
|
|
109
|
-
node.
|
|
109
|
+
node.any_str_type? && node.source.match?(/\\\s*$/)
|
|
110
110
|
end
|
|
111
111
|
|
|
112
112
|
def multiline_string?(node)
|
|
@@ -57,7 +57,7 @@ module RuboCop
|
|
|
57
57
|
def inside_string_ranges(node)
|
|
58
58
|
return [] unless node.is_a?(Parser::AST::Node)
|
|
59
59
|
|
|
60
|
-
node.each_node(:
|
|
60
|
+
node.each_node(:any_str).filter_map { |n| inside_string_range(n) }
|
|
61
61
|
end
|
|
62
62
|
|
|
63
63
|
def inside_string_range(node)
|
|
@@ -30,6 +30,8 @@ module RuboCop
|
|
|
30
30
|
any_block: %i[block numblock itblock],
|
|
31
31
|
any_def: %i[def defs],
|
|
32
32
|
any_match_pattern: %i[match_pattern match_pattern_p],
|
|
33
|
+
any_str: %i[str dstr xstr],
|
|
34
|
+
any_sym: %i[sym dsym],
|
|
33
35
|
argument: %i[arg optarg restarg kwarg kwoptarg kwrestarg blockarg forward_arg shadowarg],
|
|
34
36
|
boolean: %i[true false],
|
|
35
37
|
call: %i[send csend],
|
|
@@ -210,7 +212,7 @@ module RuboCop
|
|
|
210
212
|
# A heredoc can be a `dstr` without interpolation, but if there is interpolation
|
|
211
213
|
# there'll be a `begin` node, in which case, we cannot evaluate the pattern.
|
|
212
214
|
def acceptable_heredoc?(node)
|
|
213
|
-
node.
|
|
215
|
+
node.any_str_type? && node.heredoc? && node.each_child_node(:begin).none?
|
|
214
216
|
end
|
|
215
217
|
|
|
216
218
|
def process_pattern(pattern_node)
|
|
@@ -76,7 +76,7 @@ module RuboCop
|
|
|
76
76
|
end
|
|
77
77
|
|
|
78
78
|
def on_send(node) # rubocop:disable InternalAffairs/OnSendWithoutOnCSend
|
|
79
|
-
new_identifier = node.first_argument
|
|
79
|
+
return unless (new_identifier = node.first_argument)
|
|
80
80
|
return unless new_identifier.basic_literal?
|
|
81
81
|
|
|
82
82
|
new_identifier = new_identifier.value
|
|
@@ -76,28 +76,40 @@ module RuboCop
|
|
|
76
76
|
# # good
|
|
77
77
|
# class ErrorA < BaseError; end
|
|
78
78
|
# class ErrorB < BaseError; end
|
|
79
|
-
# class ErrorC < BaseError; end
|
|
80
79
|
#
|
|
81
80
|
# # good
|
|
82
81
|
# class ErrorA < BaseError; end
|
|
83
82
|
#
|
|
84
83
|
# class ErrorB < BaseError; end
|
|
85
84
|
#
|
|
86
|
-
#
|
|
85
|
+
# # good - DefLikeMacros: [memoize]
|
|
86
|
+
# memoize :attribute_a
|
|
87
|
+
# memoize :attribute_b
|
|
88
|
+
#
|
|
89
|
+
# # good
|
|
90
|
+
# memoize :attribute_a
|
|
91
|
+
#
|
|
92
|
+
# memoize :attribute_b
|
|
87
93
|
#
|
|
88
94
|
# @example AllowAdjacentOneLineDefs: false
|
|
89
95
|
#
|
|
90
96
|
# # bad
|
|
91
97
|
# class ErrorA < BaseError; end
|
|
92
98
|
# class ErrorB < BaseError; end
|
|
93
|
-
# class ErrorC < BaseError; end
|
|
94
99
|
#
|
|
95
100
|
# # good
|
|
96
101
|
# class ErrorA < BaseError; end
|
|
97
102
|
#
|
|
98
103
|
# class ErrorB < BaseError; end
|
|
99
104
|
#
|
|
100
|
-
#
|
|
105
|
+
# # bad - DefLikeMacros: [memoize]
|
|
106
|
+
# memoize :attribute_a
|
|
107
|
+
# memoize :attribute_b
|
|
108
|
+
#
|
|
109
|
+
# # good
|
|
110
|
+
# memoize :attribute_a
|
|
111
|
+
#
|
|
112
|
+
# memoize :attribute_b
|
|
101
113
|
#
|
|
102
114
|
class EmptyLineBetweenDefs < Base
|
|
103
115
|
include RangeHelp
|
|
@@ -158,6 +170,8 @@ module RuboCop
|
|
|
158
170
|
def def_location(correction_node)
|
|
159
171
|
if correction_node.any_block_type?
|
|
160
172
|
correction_node.source_range.join(correction_node.children.first.source_range)
|
|
173
|
+
elsif correction_node.send_type?
|
|
174
|
+
correction_node.source_range
|
|
161
175
|
else
|
|
162
176
|
correction_node.loc.keyword.join(correction_node.loc.name)
|
|
163
177
|
end
|
|
@@ -175,8 +189,14 @@ module RuboCop
|
|
|
175
189
|
end
|
|
176
190
|
|
|
177
191
|
def macro_candidate?(node)
|
|
178
|
-
|
|
179
|
-
|
|
192
|
+
macro_candidate = if node.any_block_type?
|
|
193
|
+
node.send_node
|
|
194
|
+
elsif node.send_type?
|
|
195
|
+
node
|
|
196
|
+
end
|
|
197
|
+
return false unless macro_candidate
|
|
198
|
+
|
|
199
|
+
macro_candidate.macro? && empty_line_between_macros.include?(macro_candidate.method_name)
|
|
180
200
|
end
|
|
181
201
|
|
|
182
202
|
def method_candidate?(node)
|
|
@@ -240,7 +260,9 @@ module RuboCop
|
|
|
240
260
|
end
|
|
241
261
|
|
|
242
262
|
def def_start(node)
|
|
243
|
-
|
|
263
|
+
node = node.send_node if node.any_block_type?
|
|
264
|
+
|
|
265
|
+
if node.send_type?
|
|
244
266
|
node.source_range.line
|
|
245
267
|
else
|
|
246
268
|
node.loc.keyword.line
|
|
@@ -252,11 +274,7 @@ module RuboCop
|
|
|
252
274
|
end
|
|
253
275
|
|
|
254
276
|
def end_loc(node)
|
|
255
|
-
|
|
256
|
-
node.source_range.end
|
|
257
|
-
else
|
|
258
|
-
node.loc.end
|
|
259
|
-
end
|
|
277
|
+
node.source_range.end
|
|
260
278
|
end
|
|
261
279
|
|
|
262
280
|
def autocorrect_remove_lines(corrector, newline_pos, count)
|
|
@@ -193,7 +193,6 @@ module RuboCop
|
|
|
193
193
|
SEPARATOR_ALIGNMENT_STYLES = %w[EnforcedColonStyle EnforcedHashRocketStyle].freeze
|
|
194
194
|
|
|
195
195
|
def on_send(node)
|
|
196
|
-
return if double_splat?(node)
|
|
197
196
|
return unless node.arguments?
|
|
198
197
|
|
|
199
198
|
last_argument = node.last_argument
|
|
@@ -233,6 +232,8 @@ module RuboCop
|
|
|
233
232
|
end
|
|
234
233
|
|
|
235
234
|
def argument_before_hash(hash_node)
|
|
235
|
+
return hash_node.children.first.children.first if hash_node.children.first.kwsplat_type?
|
|
236
|
+
|
|
236
237
|
hash_node.left_sibling.respond_to?(:loc) ? hash_node.left_sibling : nil
|
|
237
238
|
end
|
|
238
239
|
|
|
@@ -241,10 +242,6 @@ module RuboCop
|
|
|
241
242
|
self.column_deltas = Hash.new { |hash, key| hash[key] = {} }
|
|
242
243
|
end
|
|
243
244
|
|
|
244
|
-
def double_splat?(node)
|
|
245
|
-
node.children.last.is_a?(Symbol)
|
|
246
|
-
end
|
|
247
|
-
|
|
248
245
|
def check_pairs(node)
|
|
249
246
|
first_pair = node.pairs.first
|
|
250
247
|
reset!
|
|
@@ -134,6 +134,7 @@ module RuboCop
|
|
|
134
134
|
|
|
135
135
|
def check_for_breakable_block(block_node)
|
|
136
136
|
return unless block_node.single_line?
|
|
137
|
+
return if receiver_contains_heredoc?(block_node)
|
|
137
138
|
|
|
138
139
|
line_index = block_node.loc.line - 1
|
|
139
140
|
range = breakable_block_range(block_node)
|
|
@@ -321,7 +322,7 @@ module RuboCop
|
|
|
321
322
|
def extract_heredocs(ast)
|
|
322
323
|
return [] unless ast
|
|
323
324
|
|
|
324
|
-
ast.each_node(:
|
|
325
|
+
ast.each_node(:any_str).select(&:heredoc?).map do |node|
|
|
325
326
|
body = node.location.heredoc_body
|
|
326
327
|
delimiter = node.location.heredoc_end.source.strip
|
|
327
328
|
[body.first_line...body.last_line, delimiter]
|
|
@@ -341,6 +342,13 @@ module RuboCop
|
|
|
341
342
|
heredocs.any? { |range, _delimiter| range.cover?(line_number) }
|
|
342
343
|
end
|
|
343
344
|
|
|
345
|
+
def receiver_contains_heredoc?(node)
|
|
346
|
+
return false unless (receiver = node.receiver)
|
|
347
|
+
return true if receiver.any_str_type? && receiver.heredoc?
|
|
348
|
+
|
|
349
|
+
receiver.each_descendant(:any_str).any?(&:heredoc?)
|
|
350
|
+
end
|
|
351
|
+
|
|
344
352
|
def check_directive_line(line, line_index)
|
|
345
353
|
length_without_directive = line_length_without_directive(line)
|
|
346
354
|
return if length_without_directive <= max
|
|
@@ -102,10 +102,12 @@ module RuboCop
|
|
|
102
102
|
return true if begins_its_line?(assignment_rhs.source_range)
|
|
103
103
|
end
|
|
104
104
|
|
|
105
|
-
given_style == :aligned
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
105
|
+
return false unless given_style == :aligned
|
|
106
|
+
return true if kw_node_with_special_indentation(node) || assignment_node
|
|
107
|
+
|
|
108
|
+
node = argument_in_method_call(node, :with_or_without_parentheses)
|
|
109
|
+
|
|
110
|
+
node.respond_to?(:def_modifier?) && !node.def_modifier?
|
|
109
111
|
end
|
|
110
112
|
|
|
111
113
|
def message(node, lhs, rhs)
|
|
@@ -194,6 +194,14 @@ module RuboCop
|
|
|
194
194
|
def alignment_location(alignment_node)
|
|
195
195
|
if begin_end_alignment_style == 'start_of_line'
|
|
196
196
|
start_line_range(alignment_node)
|
|
197
|
+
elsif alignment_node.any_block_type?
|
|
198
|
+
# If the alignment node is a block, the `rescue`/`ensure` keyword should
|
|
199
|
+
# be aligned to the start of the block. It is possible that the block's
|
|
200
|
+
# `send_node` spans multiple lines, in which case it should align to the
|
|
201
|
+
# start of the last line.
|
|
202
|
+
send_node = alignment_node.send_node
|
|
203
|
+
range = processed_source.buffer.line_range(send_node.last_line)
|
|
204
|
+
range.adjust(begin_pos: range.source =~ /\S/)
|
|
197
205
|
else
|
|
198
206
|
alignment_node.source_range
|
|
199
207
|
end
|
|
@@ -31,7 +31,7 @@ module RuboCop
|
|
|
31
31
|
|
|
32
32
|
# @!method overwritten_constant(node)
|
|
33
33
|
def_node_matcher :overwritten_constant, <<~PATTERN
|
|
34
|
-
(resbody nil? (casgn
|
|
34
|
+
(resbody nil? $(casgn _ _) nil?)
|
|
35
35
|
PATTERN
|
|
36
36
|
|
|
37
37
|
def self.autocorrect_incompatible_with
|
|
@@ -41,7 +41,8 @@ module RuboCop
|
|
|
41
41
|
def on_resbody(node)
|
|
42
42
|
return unless (constant = overwritten_constant(node))
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
message = format(MSG, constant: constant.source)
|
|
45
|
+
add_offense(node.loc.assoc, message: message) do |corrector|
|
|
45
46
|
corrector.remove(range_between(node.loc.keyword.end_pos, node.loc.assoc.end_pos))
|
|
46
47
|
end
|
|
47
48
|
end
|
|
@@ -13,28 +13,34 @@ module RuboCop
|
|
|
13
13
|
# @example
|
|
14
14
|
# # bad
|
|
15
15
|
# # rubocop:disable Layout/LineLength Style/Encoding
|
|
16
|
-
#
|
|
16
|
+
#
|
|
17
|
+
# # good
|
|
18
|
+
# # rubocop:disable Layout/LineLength, Style/Encoding
|
|
17
19
|
#
|
|
18
20
|
# # bad
|
|
19
21
|
# # rubocop:disable
|
|
20
22
|
#
|
|
23
|
+
# # good
|
|
24
|
+
# # rubocop:disable all
|
|
25
|
+
#
|
|
21
26
|
# # bad
|
|
22
27
|
# # rubocop:disable Layout/LineLength # rubocop:disable Style/Encoding
|
|
23
28
|
#
|
|
29
|
+
# # good
|
|
30
|
+
# # rubocop:disable Layout/LineLength
|
|
31
|
+
# # rubocop:disable Style/Encoding
|
|
32
|
+
#
|
|
24
33
|
# # bad
|
|
25
34
|
# # rubocop:wrongmode Layout/LineLength
|
|
26
35
|
#
|
|
27
36
|
# # good
|
|
28
37
|
# # rubocop:disable Layout/LineLength
|
|
29
38
|
#
|
|
30
|
-
# #
|
|
31
|
-
# # rubocop:disable Layout/LineLength
|
|
32
|
-
#
|
|
33
|
-
# # good
|
|
34
|
-
# # rubocop:disable all
|
|
39
|
+
# # bad
|
|
40
|
+
# # rubocop:disable Layout/LineLength comment
|
|
35
41
|
#
|
|
36
42
|
# # good
|
|
37
|
-
# # rubocop:disable Layout/LineLength --
|
|
43
|
+
# # rubocop:disable Layout/LineLength -- comment
|
|
38
44
|
#
|
|
39
45
|
class CopDirectiveSyntax < Base
|
|
40
46
|
COMMON_MSG = 'Malformed directive comment detected.'
|
|
@@ -118,8 +118,11 @@ module RuboCop
|
|
|
118
118
|
|
|
119
119
|
def replacement_args(node)
|
|
120
120
|
algorithm_constant, = algorithm_const(node)
|
|
121
|
-
|
|
121
|
+
if algorithm_constant.source == 'OpenSSL::Cipher::Cipher'
|
|
122
|
+
return node.first_argument.source
|
|
123
|
+
end
|
|
122
124
|
|
|
125
|
+
algorithm_name = algorithm_name(algorithm_constant)
|
|
123
126
|
if openssl_class(algorithm_constant) == 'OpenSSL::Cipher'
|
|
124
127
|
build_cipher_arguments(node, algorithm_name, node.arguments.empty?)
|
|
125
128
|
else
|
|
@@ -19,12 +19,23 @@ module RuboCop
|
|
|
19
19
|
MSG = 'Empty interpolation detected.'
|
|
20
20
|
|
|
21
21
|
def on_interpolation(begin_node)
|
|
22
|
+
return if in_percent_literal_array?(begin_node)
|
|
23
|
+
|
|
22
24
|
node_children = begin_node.children.dup
|
|
23
25
|
node_children.delete_if { |e| e.nil_type? || (e.basic_literal? && e.str_content&.empty?) }
|
|
24
26
|
return unless node_children.empty?
|
|
25
27
|
|
|
26
28
|
add_offense(begin_node) { |corrector| corrector.remove(begin_node) }
|
|
27
29
|
end
|
|
30
|
+
|
|
31
|
+
private
|
|
32
|
+
|
|
33
|
+
def in_percent_literal_array?(begin_node)
|
|
34
|
+
array_node = begin_node.each_ancestor(:array).first
|
|
35
|
+
return false unless array_node
|
|
36
|
+
|
|
37
|
+
array_node.percent_literal?
|
|
38
|
+
end
|
|
28
39
|
end
|
|
29
40
|
end
|
|
30
41
|
end
|
|
@@ -9,9 +9,21 @@ module RuboCop
|
|
|
9
9
|
# cop disables on wide ranges of code, that latter contributors to
|
|
10
10
|
# a file wouldn't be aware of.
|
|
11
11
|
#
|
|
12
|
-
#
|
|
13
|
-
#
|
|
14
|
-
#
|
|
12
|
+
# You can set `MaximumRangeSize` to define the maximum number of
|
|
13
|
+
# consecutive lines a cop can be disabled for.
|
|
14
|
+
#
|
|
15
|
+
# - `.inf` any size (default)
|
|
16
|
+
# - `0` allows only single-line disables
|
|
17
|
+
# - `1` means the maximum allowed is as follows:
|
|
18
|
+
#
|
|
19
|
+
# [source,ruby]
|
|
20
|
+
# ----
|
|
21
|
+
# # rubocop:disable SomeCop
|
|
22
|
+
# a = 1
|
|
23
|
+
# # rubocop:enable SomeCop
|
|
24
|
+
# ----
|
|
25
|
+
#
|
|
26
|
+
# @example MaximumRangeSize: .inf (default)
|
|
15
27
|
#
|
|
16
28
|
# # good
|
|
17
29
|
# # rubocop:disable Layout/SpaceAroundOperators
|
|
@@ -25,9 +37,7 @@ module RuboCop
|
|
|
25
37
|
# x= 0
|
|
26
38
|
# # EOF
|
|
27
39
|
#
|
|
28
|
-
# @example
|
|
29
|
-
# # Lint/MissingCopEnableDirective:
|
|
30
|
-
# # MaximumRangeSize: 2
|
|
40
|
+
# @example MaximumRangeSize: 2
|
|
31
41
|
#
|
|
32
42
|
# # good
|
|
33
43
|
# # rubocop:disable Layout/SpaceAroundOperators
|
|
@@ -24,10 +24,7 @@ module RuboCop
|
|
|
24
24
|
MSG = 'Avoid rescuing the `Exception` class. Perhaps you meant to rescue `StandardError`?'
|
|
25
25
|
|
|
26
26
|
def on_resbody(node)
|
|
27
|
-
return unless node.
|
|
28
|
-
|
|
29
|
-
rescue_args = node.children.first.children
|
|
30
|
-
return unless rescue_args.any? { |a| targets_exception?(a) }
|
|
27
|
+
return unless node.exceptions.any? { |exception| targets_exception?(exception) }
|
|
31
28
|
|
|
32
29
|
add_offense(node)
|
|
33
30
|
end
|
|
@@ -108,7 +108,7 @@ module RuboCop
|
|
|
108
108
|
value_node = node.last_argument
|
|
109
109
|
node_arguments = node.arguments[0...-1]
|
|
110
110
|
|
|
111
|
-
if value_node.
|
|
111
|
+
if value_node.respond_to?(:method?) && value_node.method?(:[]) &&
|
|
112
112
|
node.receiver == value_node.receiver &&
|
|
113
113
|
node_arguments.none?(&:call_type?) &&
|
|
114
114
|
node_arguments == value_node.arguments
|
|
@@ -125,13 +125,13 @@ module RuboCop
|
|
|
125
125
|
next false if assignment_node.shorthand_asgn?
|
|
126
126
|
next false unless assignment_node.parent
|
|
127
127
|
|
|
128
|
-
|
|
129
|
-
|
|
128
|
+
conditional_assignment =
|
|
129
|
+
conditional_assignment?(assignment_node.parent, argument.scope.node)
|
|
130
130
|
|
|
131
131
|
unless uses_var?(assignment_node, argument.name)
|
|
132
132
|
# It's impossible to decide whether a branch or block is executed,
|
|
133
133
|
# so the precise reassignment location is undecidable.
|
|
134
|
-
next false if
|
|
134
|
+
next false if conditional_assignment
|
|
135
135
|
|
|
136
136
|
yield(assignment.node, location_known)
|
|
137
137
|
break
|
|
@@ -147,13 +147,13 @@ module RuboCop
|
|
|
147
147
|
node.source_range.begin_pos
|
|
148
148
|
end
|
|
149
149
|
|
|
150
|
-
# Check whether the given node is
|
|
150
|
+
# Check whether the given node is always executed or not
|
|
151
151
|
#
|
|
152
|
-
def
|
|
152
|
+
def conditional_assignment?(node, stop_search_node)
|
|
153
153
|
return false if node == stop_search_node
|
|
154
154
|
|
|
155
|
-
node.conditional? || node.
|
|
156
|
-
|
|
155
|
+
node.conditional? || node.type?(:block, :rescue) ||
|
|
156
|
+
conditional_assignment?(node.parent, stop_search_node)
|
|
157
157
|
end
|
|
158
158
|
|
|
159
159
|
# Get argument references without assignments' references
|