rubocop 0.69.0 → 0.70.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 +17 -1
- data/lib/rubocop.rb +1 -0
- data/lib/rubocop/ast/builder.rb +37 -37
- data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +10 -0
- data/lib/rubocop/cached_data.rb +2 -2
- data/lib/rubocop/config.rb +9 -1
- data/lib/rubocop/config_loader.rb +2 -2
- data/lib/rubocop/config_loader_resolver.rb +3 -2
- data/lib/rubocop/cop/generator.rb +7 -1
- data/lib/rubocop/cop/layout/align_hash.rb +74 -31
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +6 -6
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +75 -4
- data/lib/rubocop/cop/layout/indentation_width.rb +1 -7
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +5 -5
- data/lib/rubocop/cop/lint/handle_exceptions.rb +47 -8
- data/lib/rubocop/cop/lint/number_conversion.rb +7 -0
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +3 -0
- data/lib/rubocop/cop/mixin/configurable_naming.rb +1 -1
- data/lib/rubocop/cop/mixin/configurable_numbering.rb +2 -2
- data/lib/rubocop/cop/mixin/ignored_method_patterns.rb +19 -0
- data/lib/rubocop/cop/rails/refute_methods.rb +13 -13
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +17 -3
- data/lib/rubocop/cop/variable_force/scope.rb +3 -3
- data/lib/rubocop/formatter/formatter_set.rb +13 -13
- data/lib/rubocop/formatter/html_formatter.rb +4 -4
- data/lib/rubocop/formatter/json_formatter.rb +16 -16
- data/lib/rubocop/formatter/simple_text_formatter.rb +4 -4
- data/lib/rubocop/options.rb +89 -83
- data/lib/rubocop/version.rb +1 -1
- metadata +4 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f98c70ae4897b3f4c793fa73cb716986f9d63815928c278accf6879a0190e97e
|
4
|
+
data.tar.gz: 89111e2312bdf926aab76ca58bfb90a414ff3b5f58ba48257e5d1949763d4776
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 83462908a6383ab72503c4af338d395a118e435d8f4f73e7cdda54b6d8d1cc05f40a5ebdb6a3197bf9a2734046665c7c2d6616e0bb0847f198d11b410ae4b7f8
|
7
|
+
data.tar.gz: 39c1a0fca5a9251e3a60f9ca3958d228d79f5797de21da608f69cb133611c683913673bbdc426a537c9578bc4394607a20617d394d1abc3454878373589a0fdd
|
data/README.md
CHANGED
@@ -53,7 +53,7 @@ haven't reached version 1.0 yet). To prevent an unwanted RuboCop update you
|
|
53
53
|
might want to use a conservative version lock in your `Gemfile`:
|
54
54
|
|
55
55
|
```rb
|
56
|
-
gem 'rubocop', '~> 0.
|
56
|
+
gem 'rubocop', '~> 0.70.0', require: false
|
57
57
|
```
|
58
58
|
|
59
59
|
## Quickstart
|
data/config/default.yml
CHANGED
@@ -260,6 +260,7 @@ Layout/AlignHash:
|
|
260
260
|
Align the elements of a hash literal if they span more than
|
261
261
|
one line.
|
262
262
|
Enabled: true
|
263
|
+
AllowMultipleStyles: true
|
263
264
|
VersionAdded: '0.49'
|
264
265
|
# Alignment of entries using hash rocket as separator. Valid values are:
|
265
266
|
#
|
@@ -508,6 +509,13 @@ Layout/EmptyLinesAroundAccessModifier:
|
|
508
509
|
StyleGuide: '#empty-lines-around-access-modifier'
|
509
510
|
Enabled: true
|
510
511
|
VersionAdded: '0.49'
|
512
|
+
EnforcedStyle: around
|
513
|
+
SupportedStyles:
|
514
|
+
- around
|
515
|
+
- only_before
|
516
|
+
Reference:
|
517
|
+
# A reference to `EnforcedStyle: only_before`.
|
518
|
+
- https://edgeguides.rubyonrails.org/contributing_to_ruby_on_rails.html#follow-the-coding-conventions
|
511
519
|
|
512
520
|
Layout/EmptyLinesAroundArguments:
|
513
521
|
Description: "Keeps track of empty lines around method arguments."
|
@@ -780,6 +788,9 @@ Layout/IndentationConsistency:
|
|
780
788
|
SupportedStyles:
|
781
789
|
- normal
|
782
790
|
- rails
|
791
|
+
Reference:
|
792
|
+
# A reference to `EnforcedStyle: rails`.
|
793
|
+
- https://edgeguides.rubyonrails.org/contributing_to_ruby_on_rails.html#follow-the-coding-conventions
|
783
794
|
|
784
795
|
Layout/IndentationWidth:
|
785
796
|
Description: 'Use 2 spaces for indentation.'
|
@@ -1359,7 +1370,9 @@ Lint/HandleExceptions:
|
|
1359
1370
|
Description: "Don't suppress exception."
|
1360
1371
|
StyleGuide: '#dont-hide-exceptions'
|
1361
1372
|
Enabled: true
|
1373
|
+
AllowComments: false
|
1362
1374
|
VersionAdded: '0.9'
|
1375
|
+
VersionChanged: '0.70'
|
1363
1376
|
|
1364
1377
|
Lint/HeredocMethodCallPosition:
|
1365
1378
|
Description: >-
|
@@ -1462,6 +1475,8 @@ Lint/NumberConversion:
|
|
1462
1475
|
Description: 'Checks unsafe usage of number conversion methods.'
|
1463
1476
|
Enabled: false
|
1464
1477
|
VersionAdded: '0.53'
|
1478
|
+
VersionChanged: '0.70'
|
1479
|
+
SafeAutoCorrect: false
|
1465
1480
|
|
1466
1481
|
Lint/OrderedMagicComments:
|
1467
1482
|
Description: 'Checks the proper ordering of magic comments and whether a magic comment is not placed before a shebang.'
|
@@ -3752,8 +3767,9 @@ Style/PreferredHashMethods:
|
|
3752
3767
|
Description: 'Checks use of `has_key?` and `has_value?` Hash methods.'
|
3753
3768
|
StyleGuide: '#hash-key'
|
3754
3769
|
Enabled: true
|
3770
|
+
Safe: false
|
3755
3771
|
VersionAdded: '0.41'
|
3756
|
-
VersionChanged: '0.
|
3772
|
+
VersionChanged: '0.70'
|
3757
3773
|
EnforcedStyle: short
|
3758
3774
|
SupportedStyles:
|
3759
3775
|
- short
|
data/lib/rubocop.rb
CHANGED
@@ -117,6 +117,7 @@ require_relative 'rubocop/cop/mixin/frozen_string_literal'
|
|
117
117
|
require_relative 'rubocop/cop/mixin/hash_alignment'
|
118
118
|
require_relative 'rubocop/cop/mixin/ignored_pattern'
|
119
119
|
require_relative 'rubocop/cop/mixin/ignored_methods'
|
120
|
+
require_relative 'rubocop/cop/mixin/ignored_method_patterns'
|
120
121
|
require_relative 'rubocop/cop/mixin/integer_node'
|
121
122
|
require_relative 'rubocop/cop/mixin/match_range'
|
122
123
|
require_relative 'rubocop/cop/mixin/method_complexity'
|
data/lib/rubocop/ast/builder.rb
CHANGED
@@ -15,45 +15,45 @@ module RuboCop
|
|
15
15
|
# root_node = parser.parse(buffer)
|
16
16
|
class Builder < Parser::Builders::Default
|
17
17
|
NODE_MAP = {
|
18
|
-
and:
|
19
|
-
alias:
|
20
|
-
args:
|
21
|
-
array:
|
22
|
-
block:
|
23
|
-
break:
|
24
|
-
case:
|
25
|
-
class:
|
26
|
-
def:
|
27
|
-
defined?:
|
28
|
-
defs:
|
29
|
-
ensure:
|
30
|
-
for:
|
31
|
-
hash:
|
32
|
-
if:
|
33
|
-
irange:
|
34
|
-
erange:
|
35
|
-
kwsplat:
|
36
|
-
module:
|
37
|
-
or:
|
38
|
-
pair:
|
39
|
-
regexp:
|
40
|
-
resbody:
|
41
|
-
retry:
|
42
|
-
csend:
|
43
|
-
send:
|
44
|
-
str:
|
45
|
-
dstr:
|
46
|
-
xstr:
|
47
|
-
sclass:
|
48
|
-
super:
|
49
|
-
zsuper:
|
50
|
-
sym:
|
51
|
-
until:
|
18
|
+
and: AndNode,
|
19
|
+
alias: AliasNode,
|
20
|
+
args: ArgsNode,
|
21
|
+
array: ArrayNode,
|
22
|
+
block: BlockNode,
|
23
|
+
break: BreakNode,
|
24
|
+
case: CaseNode,
|
25
|
+
class: ClassNode,
|
26
|
+
def: DefNode,
|
27
|
+
defined?: DefinedNode,
|
28
|
+
defs: DefNode,
|
29
|
+
ensure: EnsureNode,
|
30
|
+
for: ForNode,
|
31
|
+
hash: HashNode,
|
32
|
+
if: IfNode,
|
33
|
+
irange: RangeNode,
|
34
|
+
erange: RangeNode,
|
35
|
+
kwsplat: KeywordSplatNode,
|
36
|
+
module: ModuleNode,
|
37
|
+
or: OrNode,
|
38
|
+
pair: PairNode,
|
39
|
+
regexp: RegexpNode,
|
40
|
+
resbody: ResbodyNode,
|
41
|
+
retry: RetryNode,
|
42
|
+
csend: SendNode,
|
43
|
+
send: SendNode,
|
44
|
+
str: StrNode,
|
45
|
+
dstr: StrNode,
|
46
|
+
xstr: StrNode,
|
47
|
+
sclass: SelfClassNode,
|
48
|
+
super: SuperNode,
|
49
|
+
zsuper: SuperNode,
|
50
|
+
sym: SymbolNode,
|
51
|
+
until: UntilNode,
|
52
52
|
until_post: UntilNode,
|
53
|
-
when:
|
54
|
-
while:
|
53
|
+
when: WhenNode,
|
54
|
+
while: WhileNode,
|
55
55
|
while_post: WhileNode,
|
56
|
-
yield:
|
56
|
+
yield: YieldNode
|
57
57
|
}.freeze
|
58
58
|
|
59
59
|
# Generates {Node} from the given information.
|
@@ -9,6 +9,7 @@ module RuboCop
|
|
9
9
|
include MethodIdentifierPredicates
|
10
10
|
|
11
11
|
ARITHMETIC_OPERATORS = %i[+ - * / % **].freeze
|
12
|
+
SPECIAL_MODIFIERS = %w[private protected].freeze
|
12
13
|
|
13
14
|
# The receiving node of the method dispatch.
|
14
15
|
#
|
@@ -75,6 +76,15 @@ module RuboCop
|
|
75
76
|
macro? && non_bare_access_modifier_declaration?
|
76
77
|
end
|
77
78
|
|
79
|
+
# Checks whether the dispatched method is a bare `private` or `protected`
|
80
|
+
# access modifier that affects all methods defined after the macro.
|
81
|
+
#
|
82
|
+
# @return [Boolean] whether the dispatched method is a bare
|
83
|
+
# `private` or `protected` access modifier
|
84
|
+
def special_modifier?
|
85
|
+
bare_access_modifier? && SPECIAL_MODIFIERS.include?(source)
|
86
|
+
end
|
87
|
+
|
78
88
|
# Checks whether the name of the dispatched method matches the argument
|
79
89
|
# and has an implicit receiver.
|
80
90
|
#
|
data/lib/rubocop/cached_data.rb
CHANGED
@@ -29,9 +29,9 @@ module RuboCop
|
|
29
29
|
begin_pos: offense.location.begin_pos,
|
30
30
|
end_pos: offense.location.end_pos
|
31
31
|
},
|
32
|
-
message:
|
32
|
+
message: message(offense),
|
33
33
|
cop_name: offense.cop_name,
|
34
|
-
status:
|
34
|
+
status: :uncorrected
|
35
35
|
}
|
36
36
|
end
|
37
37
|
|
data/lib/rubocop/config.rb
CHANGED
@@ -543,8 +543,10 @@ module RuboCop
|
|
543
543
|
styles.each do |style_name, style|
|
544
544
|
supported_key = RuboCop::Cop::Util.to_supported_styles(style_name)
|
545
545
|
valid = ConfigLoader.default_configuration[name][supported_key]
|
546
|
+
|
546
547
|
next unless valid
|
547
548
|
next if valid.include?(style)
|
549
|
+
next if validate_support_and_has_list(name, style, valid)
|
548
550
|
|
549
551
|
msg = "invalid #{style_name} '#{style}' for #{name} found in " \
|
550
552
|
"#{smart_loaded_path}\n" \
|
@@ -554,6 +556,12 @@ module RuboCop
|
|
554
556
|
end
|
555
557
|
end
|
556
558
|
|
559
|
+
def validate_support_and_has_list(name, formats, valid)
|
560
|
+
ConfigLoader.default_configuration[name]['AllowMultipleStyles'] &&
|
561
|
+
formats.is_a?(Array) &&
|
562
|
+
formats.all? { |format| valid.include?(format) }
|
563
|
+
end
|
564
|
+
|
557
565
|
def reject_obsolete_cops_and_parameters
|
558
566
|
messages = [
|
559
567
|
obsolete_cops,
|
@@ -712,7 +720,7 @@ module RuboCop
|
|
712
720
|
end
|
713
721
|
end
|
714
722
|
|
715
|
-
cop_options.fetch('Enabled'
|
723
|
+
cop_options.fetch('Enabled') { !for_all_cops['DisabledByDefault'] }
|
716
724
|
end
|
717
725
|
|
718
726
|
def smart_loaded_path
|
@@ -120,8 +120,8 @@ module RuboCop
|
|
120
120
|
# If AllCops::EnabledByDefault is true, it changes the Enabled params
|
121
121
|
# so that only cops explicitly disabled in user configuration are
|
122
122
|
# disabled.
|
123
|
-
def merge_with_default(config, config_file)
|
124
|
-
resolver.merge_with_default(config, config_file)
|
123
|
+
def merge_with_default(config, config_file, unset_nil: true)
|
124
|
+
resolver.merge_with_default(config, config_file, unset_nil: unset_nil)
|
125
125
|
end
|
126
126
|
|
127
127
|
def add_inheritance_from_auto_generated_file
|
@@ -55,7 +55,7 @@ module RuboCop
|
|
55
55
|
# only cops from user configuration are enabled. If
|
56
56
|
# AllCops::EnabledByDefault is true, it changes the Enabled params so that
|
57
57
|
# only cops explicitly disabled in user configuration are disabled.
|
58
|
-
def merge_with_default(config, config_file)
|
58
|
+
def merge_with_default(config, config_file, unset_nil:)
|
59
59
|
default_configuration = ConfigLoader.default_configuration
|
60
60
|
|
61
61
|
disabled_by_default = config.for_all_cops['DisabledByDefault']
|
@@ -71,7 +71,8 @@ module RuboCop
|
|
71
71
|
config = handle_disabled_by_default(config, default_configuration)
|
72
72
|
end
|
73
73
|
|
74
|
-
opts = { inherit_mode: config['inherit_mode'] || {},
|
74
|
+
opts = { inherit_mode: config['inherit_mode'] || {},
|
75
|
+
unset_nil: unset_nil }
|
75
76
|
Config.new(merge(default_configuration, config, opts), config_file)
|
76
77
|
end
|
77
78
|
|
@@ -7,7 +7,13 @@ module RuboCop
|
|
7
7
|
# This generator will take a cop name and generate a source file
|
8
8
|
# and spec file when given a valid qualified cop name.
|
9
9
|
class Generator
|
10
|
-
|
10
|
+
# Note: RDoc 5.1.0 or lower has the following issue.
|
11
|
+
# https://github.com/rubocop-hq/rubocop/issues/7043
|
12
|
+
#
|
13
|
+
# The following `String#strip_indent` can be replaced with
|
14
|
+
# squiggly heredoc when RuboCop supports Ruby 2.5 or higher
|
15
|
+
# (RDoc 6.0 or higher).
|
16
|
+
SOURCE_TEMPLATE = <<-RUBY.strip_indent
|
11
17
|
# frozen_string_literal: true
|
12
18
|
|
13
19
|
# TODO: when finished, run `rake generate_cops_documentation` to update the docs
|
@@ -17,7 +17,9 @@ module RuboCop
|
|
17
17
|
# - always_inspect
|
18
18
|
# - always_ignore
|
19
19
|
# - ignore_implicit (without curly braces)
|
20
|
-
#
|
20
|
+
#
|
21
|
+
# Alternatively you can specify multiple allowed styles. That's done by
|
22
|
+
# passing a list of styles to EnforcedStyles.
|
21
23
|
#
|
22
24
|
# @example EnforcedHashRocketStyle: key (default)
|
23
25
|
# # bad
|
@@ -198,48 +200,65 @@ module RuboCop
|
|
198
200
|
return if ignored_node?(node)
|
199
201
|
return if node.pairs.empty? || node.single_line?
|
200
202
|
|
201
|
-
return unless alignment_for_hash_rockets
|
202
|
-
|
203
|
+
return unless alignment_for_hash_rockets
|
204
|
+
.any? { |a| a.checkable_layout?(node) } &&
|
205
|
+
alignment_for_colons
|
206
|
+
.any? { |a| a.checkable_layout?(node) }
|
203
207
|
|
204
208
|
check_pairs(node)
|
205
209
|
end
|
206
210
|
|
207
211
|
def autocorrect(node)
|
208
|
-
|
209
|
-
|
210
|
-
# last value of each. A local variable fixes the problem.
|
211
|
-
key_delta = column_deltas[:key] || 0
|
212
|
+
delta = column_deltas[alignment_for(node).first.class][node]
|
213
|
+
return if delta.nil?
|
212
214
|
|
213
|
-
|
214
|
-
correct_no_value(key_delta, node.source_range)
|
215
|
-
else
|
216
|
-
correct_key_value(key_delta, node.key.source_range,
|
217
|
-
node.value.source_range,
|
218
|
-
node.loc.operator)
|
219
|
-
end
|
215
|
+
correct_node(node, delta)
|
220
216
|
end
|
221
217
|
|
222
|
-
|
223
|
-
|
218
|
+
attr_accessor :offences_by
|
224
219
|
attr_accessor :column_deltas
|
225
220
|
|
221
|
+
private
|
222
|
+
|
226
223
|
def double_splat?(node)
|
227
224
|
node.children.last.is_a?(Symbol)
|
228
225
|
end
|
229
226
|
|
230
227
|
def check_pairs(node)
|
231
228
|
first_pair = node.pairs.first
|
232
|
-
self.
|
233
|
-
|
234
|
-
|
229
|
+
self.offences_by = {}
|
230
|
+
self.column_deltas = Hash.new { |hash, key| hash[key] = {} }
|
231
|
+
|
232
|
+
alignment_for(first_pair).each do |alignment|
|
233
|
+
delta = alignment.deltas_for_first_pair(first_pair, node)
|
234
|
+
check_delta delta, node: first_pair, alignment: alignment
|
235
|
+
end
|
235
236
|
|
236
237
|
node.children.each do |current|
|
237
|
-
|
238
|
-
|
239
|
-
|
238
|
+
alignment_for(current).each do |alignment|
|
239
|
+
delta = alignment.deltas(first_pair, current)
|
240
|
+
check_delta delta, node: current, alignment: alignment
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
add_offences
|
245
|
+
end
|
246
|
+
|
247
|
+
def add_offences
|
248
|
+
_format, offences = offences_by.min_by { |_, v| v.length }
|
249
|
+
(offences || []).each do |offence|
|
250
|
+
add_offense offence
|
240
251
|
end
|
241
252
|
end
|
242
253
|
|
254
|
+
def check_delta(delta, node:, alignment:)
|
255
|
+
offences_by[alignment.class] ||= []
|
256
|
+
return if good_alignment? delta
|
257
|
+
|
258
|
+
column_deltas[alignment.class][node] = delta
|
259
|
+
offences_by[alignment.class].push(node)
|
260
|
+
end
|
261
|
+
|
243
262
|
def ignore_hash_argument?(node)
|
244
263
|
case cop_config['EnforcedLastArgumentHashStyle']
|
245
264
|
when 'always_inspect' then false
|
@@ -267,16 +286,31 @@ module RuboCop
|
|
267
286
|
new_alignment('EnforcedColonStyle')
|
268
287
|
end
|
269
288
|
|
289
|
+
def correct_node(node, delta)
|
290
|
+
# We can't use the instance variable inside the lambda. That would
|
291
|
+
# just give each lambda the same reference and they would all get the
|
292
|
+
# last value of each. A local variable fixes the problem.
|
293
|
+
|
294
|
+
if !node.value
|
295
|
+
correct_no_value(delta[:key] || 0, node.source_range)
|
296
|
+
else
|
297
|
+
correct_key_value(delta, node.key.source_range,
|
298
|
+
node.value.source_range,
|
299
|
+
node.loc.operator)
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
270
303
|
def correct_no_value(key_delta, key)
|
271
304
|
->(corrector) { adjust(corrector, key_delta, key) }
|
272
305
|
end
|
273
306
|
|
274
|
-
def correct_key_value(
|
307
|
+
def correct_key_value(delta, key, value, separator)
|
275
308
|
# We can't use the instance variable inside the lambda. That would
|
276
309
|
# just give each lambda the same reference and they would all get the
|
277
310
|
# last value of each. Some local variables fix the problem.
|
278
|
-
separator_delta =
|
279
|
-
value_delta =
|
311
|
+
separator_delta = delta[:separator] || 0
|
312
|
+
value_delta = delta[:value] || 0
|
313
|
+
key_delta = delta[:key] || 0
|
280
314
|
|
281
315
|
key_column = key.column
|
282
316
|
key_delta = -key_column if key_delta < -key_column
|
@@ -289,11 +323,20 @@ module RuboCop
|
|
289
323
|
end
|
290
324
|
|
291
325
|
def new_alignment(key)
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
326
|
+
formats = cop_config[key]
|
327
|
+
formats = [formats] if formats.is_a? String
|
328
|
+
|
329
|
+
formats.uniq.map do |format|
|
330
|
+
case format
|
331
|
+
when 'key'
|
332
|
+
KeyAlignment.new
|
333
|
+
when 'table'
|
334
|
+
TableAlignment.new
|
335
|
+
when 'separator'
|
336
|
+
SeparatorAlignment.new
|
337
|
+
else
|
338
|
+
raise "Unknown #{key}: #{formats}"
|
339
|
+
end
|
297
340
|
end
|
298
341
|
end
|
299
342
|
|
@@ -306,7 +349,7 @@ module RuboCop
|
|
306
349
|
end
|
307
350
|
end
|
308
351
|
|
309
|
-
def good_alignment?
|
352
|
+
def good_alignment?(column_deltas)
|
310
353
|
column_deltas.values.all?(&:zero?)
|
311
354
|
end
|
312
355
|
end
|