rubocop 1.15.0 → 1.16.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 +35 -3
- data/lib/rubocop.rb +5 -0
- data/lib/rubocop/cop/layout/argument_alignment.rb +3 -2
- data/lib/rubocop/cop/layout/case_indentation.rb +57 -9
- data/lib/rubocop/cop/layout/hash_alignment.rb +18 -3
- data/lib/rubocop/cop/layout/space_around_keyword.rb +16 -0
- data/lib/rubocop/cop/lint/empty_in_pattern.rb +62 -0
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +11 -8
- data/lib/rubocop/cop/lint/symbol_conversion.rb +2 -12
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +14 -3
- data/lib/rubocop/cop/mixin/string_literals_help.rb +2 -4
- data/lib/rubocop/cop/mixin/symbol_help.rb +13 -0
- data/lib/rubocop/cop/style/hash_each_methods.rb +18 -1
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +29 -8
- data/lib/rubocop/cop/style/in_pattern_then.rb +56 -0
- data/lib/rubocop/cop/style/multiline_in_pattern_then.rb +62 -0
- data/lib/rubocop/cop/style/quoted_symbols.rb +105 -0
- data/lib/rubocop/cop/style/string_literals.rb +1 -0
- data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +1 -0
- data/lib/rubocop/cop/style/top_level_method_definition.rb +10 -2
- data/lib/rubocop/cop/style/when_then.rb +6 -2
- data/lib/rubocop/directive_comment.rb +5 -1
- data/lib/rubocop/version.rb +1 -1
- metadata +10 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 87761564ea69f6968eb595204b979c7accaee729c8c27005d8f4d22fe7d7c588
|
4
|
+
data.tar.gz: f1b08e98a6bfed772381c159a5bc1c22e697b965acb48154c7fb4b2c58566077
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '0709e83e22cd4b7ffd86e2144ce9da499a8aa6ded608337c6e88f0418feb313c9d46d2c0a46245297a8e2ff5e072b45af7c7797d30f0a172fb0ab0e377c70264'
|
7
|
+
data.tar.gz: 19bf9b1b665b3421665f29196702aaedcedd7599b7ba22c547ac2b4871241ddcab1103c017aa8c447d2a4b882a09a835a3ac8e101f8db06f91cd8957fad077c0
|
data/README.md
CHANGED
@@ -54,7 +54,7 @@ To prevent an unwanted RuboCop update you might want to use a conservative versi
|
|
54
54
|
in your `Gemfile`:
|
55
55
|
|
56
56
|
```rb
|
57
|
-
gem 'rubocop', '~> 1.
|
57
|
+
gem 'rubocop', '~> 1.16', require: false
|
58
58
|
```
|
59
59
|
|
60
60
|
See [our versioning policy](https://docs.rubocop.org/rubocop/versioning.html) for further details.
|
data/config/default.yml
CHANGED
@@ -377,10 +377,11 @@ Layout/BlockEndNewline:
|
|
377
377
|
VersionAdded: '0.49'
|
378
378
|
|
379
379
|
Layout/CaseIndentation:
|
380
|
-
Description: 'Indentation of when in a case/when/[else/]end.'
|
380
|
+
Description: 'Indentation of when in a case/(when|in)/[else/]end.'
|
381
381
|
StyleGuide: '#indent-when-to-case'
|
382
382
|
Enabled: true
|
383
383
|
VersionAdded: '0.49'
|
384
|
+
VersionChanged: '1.16'
|
384
385
|
EnforcedStyle: case
|
385
386
|
SupportedStyles:
|
386
387
|
- case
|
@@ -771,7 +772,7 @@ Layout/HashAlignment:
|
|
771
772
|
Enabled: true
|
772
773
|
AllowMultipleStyles: true
|
773
774
|
VersionAdded: '0.49'
|
774
|
-
VersionChanged: '
|
775
|
+
VersionChanged: '1.16'
|
775
776
|
# Alignment of entries using hash rocket as separator. Valid values are:
|
776
777
|
#
|
777
778
|
# key - left alignment of keys
|
@@ -1645,6 +1646,11 @@ Lint/EmptyFile:
|
|
1645
1646
|
AllowComments: true
|
1646
1647
|
VersionAdded: '0.90'
|
1647
1648
|
|
1649
|
+
Lint/EmptyInPattern:
|
1650
|
+
Description: 'Checks for the presence of `in` pattern branches without a body.'
|
1651
|
+
Enabled: pending
|
1652
|
+
VersionAdded: '1.16'
|
1653
|
+
|
1648
1654
|
Lint/EmptyInterpolation:
|
1649
1655
|
Description: 'Checks for empty string interpolation.'
|
1650
1656
|
Enabled: true
|
@@ -2092,6 +2098,7 @@ Lint/SymbolConversion:
|
|
2092
2098
|
Description: 'Checks for unnecessary symbol conversions.'
|
2093
2099
|
Enabled: pending
|
2094
2100
|
VersionAdded: '1.9'
|
2101
|
+
VersionChanged: '1.16'
|
2095
2102
|
EnforcedStyle: strict
|
2096
2103
|
SupportedStyles:
|
2097
2104
|
- strict
|
@@ -3490,8 +3497,10 @@ Style/HashEachMethods:
|
|
3490
3497
|
Description: 'Use Hash#each_key and Hash#each_value.'
|
3491
3498
|
StyleGuide: '#hash-each'
|
3492
3499
|
Enabled: true
|
3493
|
-
VersionAdded: '0.80'
|
3494
3500
|
Safe: false
|
3501
|
+
VersionAdded: '0.80'
|
3502
|
+
VersionChanged: '1.16'
|
3503
|
+
AllowedReceivers: []
|
3495
3504
|
|
3496
3505
|
Style/HashExcept:
|
3497
3506
|
Description: >-
|
@@ -3554,6 +3563,7 @@ Style/IdenticalConditionalBranches:
|
|
3554
3563
|
out of the conditional.
|
3555
3564
|
Enabled: true
|
3556
3565
|
VersionAdded: '0.36'
|
3566
|
+
VersionChanged: '1.16'
|
3557
3567
|
|
3558
3568
|
Style/IfInsideElse:
|
3559
3569
|
Description: 'Finds if nodes inside else, which can be converted to elsif.'
|
@@ -3600,6 +3610,12 @@ Style/ImplicitRuntimeError:
|
|
3600
3610
|
Enabled: false
|
3601
3611
|
VersionAdded: '0.41'
|
3602
3612
|
|
3613
|
+
Style/InPatternThen:
|
3614
|
+
Description: 'Checks for `in;` uses in `case` expressions.'
|
3615
|
+
StyleGuide: '#no-in-pattern-semicolons'
|
3616
|
+
Enabled: pending
|
3617
|
+
VersionAdded: '1.16'
|
3618
|
+
|
3603
3619
|
Style/InfiniteLoop:
|
3604
3620
|
Description: >-
|
3605
3621
|
Use Kernel#loop for infinite loops.
|
@@ -3828,6 +3844,12 @@ Style/MultilineIfThen:
|
|
3828
3844
|
VersionAdded: '0.9'
|
3829
3845
|
VersionChanged: '0.26'
|
3830
3846
|
|
3847
|
+
Style/MultilineInPatternThen:
|
3848
|
+
Description: 'Do not use `then` for multi-line `in` statement.'
|
3849
|
+
StyleGuide: '#no-then'
|
3850
|
+
Enabled: pending
|
3851
|
+
VersionAdded: '1.16'
|
3852
|
+
|
3831
3853
|
Style/MultilineMemoization:
|
3832
3854
|
Description: 'Wrap multiline memoizations in a `begin` and `end` block.'
|
3833
3855
|
Enabled: true
|
@@ -4186,6 +4208,16 @@ Style/Proc:
|
|
4186
4208
|
VersionAdded: '0.9'
|
4187
4209
|
VersionChanged: '0.18'
|
4188
4210
|
|
4211
|
+
Style/QuotedSymbols:
|
4212
|
+
Description: 'Use a consistent style for quoted symbols.'
|
4213
|
+
Enabled: pending
|
4214
|
+
VersionAdded: '1.16'
|
4215
|
+
EnforcedStyle: same_as_string_literals
|
4216
|
+
SupportedStyles:
|
4217
|
+
- same_as_string_literals
|
4218
|
+
- single_quotes
|
4219
|
+
- double_quotes
|
4220
|
+
|
4189
4221
|
Style/RaiseArgs:
|
4190
4222
|
Description: 'Checks the arguments passed to raise/fail.'
|
4191
4223
|
StyleGuide: '#exception-class-messages'
|
data/lib/rubocop.rb
CHANGED
@@ -119,6 +119,7 @@ require_relative 'rubocop/cop/mixin/surrounding_space'
|
|
119
119
|
require_relative 'rubocop/cop/mixin/statement_modifier'
|
120
120
|
require_relative 'rubocop/cop/mixin/string_help'
|
121
121
|
require_relative 'rubocop/cop/mixin/string_literals_help'
|
122
|
+
require_relative 'rubocop/cop/mixin/symbol_help'
|
122
123
|
require_relative 'rubocop/cop/mixin/target_ruby_version'
|
123
124
|
require_relative 'rubocop/cop/mixin/trailing_body'
|
124
125
|
require_relative 'rubocop/cop/mixin/trailing_comma'
|
@@ -287,6 +288,7 @@ require_relative 'rubocop/cop/lint/empty_conditional_body'
|
|
287
288
|
require_relative 'rubocop/cop/lint/empty_ensure'
|
288
289
|
require_relative 'rubocop/cop/lint/empty_expression'
|
289
290
|
require_relative 'rubocop/cop/lint/empty_file'
|
291
|
+
require_relative 'rubocop/cop/lint/empty_in_pattern'
|
290
292
|
require_relative 'rubocop/cop/lint/empty_interpolation'
|
291
293
|
require_relative 'rubocop/cop/lint/empty_when'
|
292
294
|
require_relative 'rubocop/cop/lint/ensure_return'
|
@@ -490,6 +492,7 @@ require_relative 'rubocop/cop/style/if_unless_modifier_of_if_unless'
|
|
490
492
|
require_relative 'rubocop/cop/style/if_with_boolean_literal_branches'
|
491
493
|
require_relative 'rubocop/cop/style/if_with_semicolon'
|
492
494
|
require_relative 'rubocop/cop/style/implicit_runtime_error'
|
495
|
+
require_relative 'rubocop/cop/style/in_pattern_then'
|
493
496
|
require_relative 'rubocop/cop/style/infinite_loop'
|
494
497
|
require_relative 'rubocop/cop/style/inverse_methods'
|
495
498
|
require_relative 'rubocop/cop/style/inline_comment'
|
@@ -500,6 +503,7 @@ require_relative 'rubocop/cop/style/lambda_call'
|
|
500
503
|
require_relative 'rubocop/cop/style/line_end_concatenation'
|
501
504
|
require_relative 'rubocop/cop/style/method_call_without_args_parentheses'
|
502
505
|
require_relative 'rubocop/cop/style/method_call_with_args_parentheses'
|
506
|
+
require_relative 'rubocop/cop/style/multiline_in_pattern_then'
|
503
507
|
require_relative 'rubocop/cop/style/redundant_assignment'
|
504
508
|
require_relative 'rubocop/cop/style/redundant_fetch_block'
|
505
509
|
require_relative 'rubocop/cop/style/redundant_file_extension_in_require'
|
@@ -550,6 +554,7 @@ require_relative 'rubocop/cop/style/percent_q_literals'
|
|
550
554
|
require_relative 'rubocop/cop/style/perl_backrefs'
|
551
555
|
require_relative 'rubocop/cop/style/preferred_hash_methods'
|
552
556
|
require_relative 'rubocop/cop/style/proc'
|
557
|
+
require_relative 'rubocop/cop/style/quoted_symbols'
|
553
558
|
require_relative 'rubocop/cop/style/raise_args'
|
554
559
|
require_relative 'rubocop/cop/style/random_with_offset'
|
555
560
|
require_relative 'rubocop/cop/style/redundant_argument'
|
@@ -56,8 +56,9 @@ module RuboCop
|
|
56
56
|
first_arg = node.first_argument
|
57
57
|
return if !multiple_arguments?(node, first_arg) || node.send_type? && node.method?(:[]=)
|
58
58
|
|
59
|
-
if first_arg.hash_type?
|
60
|
-
|
59
|
+
if first_arg.hash_type? && !first_arg.braces?
|
60
|
+
pairs = first_arg.pairs
|
61
|
+
check_alignment(pairs, base_column(node, pairs.first))
|
61
62
|
else
|
62
63
|
check_alignment(node.arguments, base_column(node, first_arg))
|
63
64
|
end
|
@@ -3,10 +3,10 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Layout
|
6
|
-
# This cop checks how the
|
6
|
+
# This cop checks how the `when` and `in`s of a `case` expression
|
7
7
|
# are indented in relation to its `case` or `end` keyword.
|
8
8
|
#
|
9
|
-
# It will register a separate offense for each misaligned `when`.
|
9
|
+
# It will register a separate offense for each misaligned `when` and `in`.
|
10
10
|
#
|
11
11
|
# @example
|
12
12
|
# # If Layout/EndAlignment is set to keyword style (default)
|
@@ -22,6 +22,13 @@ module RuboCop
|
|
22
22
|
# y / 3
|
23
23
|
# end
|
24
24
|
#
|
25
|
+
# case n
|
26
|
+
# in pattern
|
27
|
+
# x * 2
|
28
|
+
# else
|
29
|
+
# y / 3
|
30
|
+
# end
|
31
|
+
#
|
25
32
|
# # good for all styles
|
26
33
|
# case n
|
27
34
|
# when 0
|
@@ -30,6 +37,13 @@ module RuboCop
|
|
30
37
|
# y / 3
|
31
38
|
# end
|
32
39
|
#
|
40
|
+
# case n
|
41
|
+
# in pattern
|
42
|
+
# x * 2
|
43
|
+
# else
|
44
|
+
# y / 3
|
45
|
+
# end
|
46
|
+
#
|
33
47
|
# @example EnforcedStyle: case (default)
|
34
48
|
# # if EndAlignment is set to other style such as
|
35
49
|
# # start_of_line (as shown below), then *when* alignment
|
@@ -43,6 +57,13 @@ module RuboCop
|
|
43
57
|
# y / 3
|
44
58
|
# end
|
45
59
|
#
|
60
|
+
# a = case n
|
61
|
+
# in pattern
|
62
|
+
# x * 2
|
63
|
+
# else
|
64
|
+
# y / 3
|
65
|
+
# end
|
66
|
+
#
|
46
67
|
# # good
|
47
68
|
# a = case n
|
48
69
|
# when 0
|
@@ -51,6 +72,13 @@ module RuboCop
|
|
51
72
|
# y / 3
|
52
73
|
# end
|
53
74
|
#
|
75
|
+
# a = case n
|
76
|
+
# in pattern
|
77
|
+
# x * 2
|
78
|
+
# else
|
79
|
+
# y / 3
|
80
|
+
# end
|
81
|
+
#
|
54
82
|
# @example EnforcedStyle: end
|
55
83
|
# # bad
|
56
84
|
# a = case n
|
@@ -60,6 +88,13 @@ module RuboCop
|
|
60
88
|
# y / 3
|
61
89
|
# end
|
62
90
|
#
|
91
|
+
# a = case n
|
92
|
+
# in pattern
|
93
|
+
# x * 2
|
94
|
+
# else
|
95
|
+
# y / 3
|
96
|
+
# end
|
97
|
+
#
|
63
98
|
# # good
|
64
99
|
# a = case n
|
65
100
|
# when 0
|
@@ -67,30 +102,43 @@ module RuboCop
|
|
67
102
|
# else
|
68
103
|
# y / 3
|
69
104
|
# end
|
105
|
+
#
|
106
|
+
# a = case n
|
107
|
+
# in pattern
|
108
|
+
# x * 2
|
109
|
+
# else
|
110
|
+
# y / 3
|
111
|
+
# end
|
70
112
|
class CaseIndentation < Base
|
71
113
|
include Alignment
|
72
114
|
include ConfigurableEnforcedStyle
|
73
115
|
include RangeHelp
|
74
116
|
extend AutoCorrector
|
75
117
|
|
76
|
-
MSG = 'Indent `
|
118
|
+
MSG = 'Indent `%<branch_type>s` %<depth>s `%<base>s`.'
|
77
119
|
|
78
120
|
def on_case(case_node)
|
79
121
|
return if case_node.single_line?
|
80
122
|
|
81
|
-
case_node.each_when { |when_node| check_when(when_node) }
|
123
|
+
case_node.each_when { |when_node| check_when(when_node, 'when') }
|
124
|
+
end
|
125
|
+
|
126
|
+
def on_case_match(case_match_node)
|
127
|
+
return if case_match_node.single_line?
|
128
|
+
|
129
|
+
case_match_node.each_in_pattern { |in_pattern_node| check_when(in_pattern_node, 'in') }
|
82
130
|
end
|
83
131
|
|
84
132
|
private
|
85
133
|
|
86
|
-
def check_when(when_node)
|
134
|
+
def check_when(when_node, branch_type)
|
87
135
|
when_column = when_node.loc.keyword.column
|
88
136
|
base_column = base_column(when_node.parent, style)
|
89
137
|
|
90
138
|
if when_column == base_column + indentation_width
|
91
139
|
correct_style_detected
|
92
140
|
else
|
93
|
-
incorrect_style(when_node)
|
141
|
+
incorrect_style(when_node, branch_type)
|
94
142
|
end
|
95
143
|
end
|
96
144
|
|
@@ -102,9 +150,9 @@ module RuboCop
|
|
102
150
|
indent_one_step? ? configured_indentation_width : 0
|
103
151
|
end
|
104
152
|
|
105
|
-
def incorrect_style(when_node)
|
153
|
+
def incorrect_style(when_node, branch_type)
|
106
154
|
depth = indent_one_step? ? 'one step more than' : 'as deep as'
|
107
|
-
message = format(MSG, depth: depth, base: style)
|
155
|
+
message = format(MSG, branch_type: branch_type, depth: depth, base: style)
|
108
156
|
|
109
157
|
add_offense(when_node.loc.keyword, message: message) do |corrector|
|
110
158
|
detect_incorrect_style(when_node)
|
@@ -141,7 +189,7 @@ module RuboCop
|
|
141
189
|
end
|
142
190
|
|
143
191
|
def replacement(node)
|
144
|
-
case_node = node.each_ancestor(:case).first
|
192
|
+
case_node = node.each_ancestor(:case, :case_match).first
|
145
193
|
base_type = cop_config[style_parameter_name] == 'end' ? :end : :case
|
146
194
|
|
147
195
|
column = base_column(case_node, base_type)
|
@@ -185,7 +185,9 @@ module RuboCop
|
|
185
185
|
SeparatorAlignment => 'Align the separators of a hash ' \
|
186
186
|
'literal if they span more than one line.',
|
187
187
|
TableAlignment => 'Align the keys and values of a hash ' \
|
188
|
-
'literal if they span more than one line.'
|
188
|
+
'literal if they span more than one line.',
|
189
|
+
KeywordSplatAlignment => 'Align keyword splats with the ' \
|
190
|
+
'rest of the hash if it spans more than one line.' }.freeze
|
189
191
|
|
190
192
|
def on_send(node)
|
191
193
|
return if double_splat?(node)
|
@@ -201,7 +203,7 @@ module RuboCop
|
|
201
203
|
alias on_yield on_send
|
202
204
|
|
203
205
|
def on_hash(node)
|
204
|
-
return if
|
206
|
+
return if autocorrect_incompatible_with_other_cops?(node) || ignored_node?(node) ||
|
205
207
|
node.pairs.empty? || node.single_line?
|
206
208
|
|
207
209
|
proc = ->(a) { a.checkable_layout?(node) }
|
@@ -214,6 +216,10 @@ module RuboCop
|
|
214
216
|
|
215
217
|
private
|
216
218
|
|
219
|
+
def autocorrect_incompatible_with_other_cops?(node)
|
220
|
+
enforce_first_argument_with_fixed_indentation? && !node.braces? && node.parent&.call_type?
|
221
|
+
end
|
222
|
+
|
217
223
|
def reset!
|
218
224
|
self.offences_by = {}
|
219
225
|
self.column_deltas = Hash.new { |hash, key| hash[key] = {} }
|
@@ -243,7 +249,14 @@ module RuboCop
|
|
243
249
|
end
|
244
250
|
|
245
251
|
def add_offences
|
252
|
+
kwsplat_offences = offences_by.delete(KeywordSplatAlignment)
|
253
|
+
register_offences_with_format(kwsplat_offences, KeywordSplatAlignment)
|
254
|
+
|
246
255
|
format, offences = offences_by.min_by { |_, v| v.length }
|
256
|
+
register_offences_with_format(offences, format)
|
257
|
+
end
|
258
|
+
|
259
|
+
def register_offences_with_format(offences, format)
|
247
260
|
(offences || []).each do |offence|
|
248
261
|
add_offense(offence, message: MESSAGES[format]) do |corrector|
|
249
262
|
delta = column_deltas[alignment_for(offence).first.class][offence]
|
@@ -271,7 +284,9 @@ module RuboCop
|
|
271
284
|
end
|
272
285
|
|
273
286
|
def alignment_for(pair)
|
274
|
-
if pair.
|
287
|
+
if pair.kwsplat_type?
|
288
|
+
[KeywordSplatAlignment.new]
|
289
|
+
elsif pair.hash_rocket?
|
275
290
|
alignment_for_hash_rockets
|
276
291
|
else
|
277
292
|
alignment_for_colons
|
@@ -53,6 +53,10 @@ module RuboCop
|
|
53
53
|
check(node, %i[keyword else].freeze)
|
54
54
|
end
|
55
55
|
|
56
|
+
def on_case_match(node)
|
57
|
+
check(node, %i[keyword else].freeze)
|
58
|
+
end
|
59
|
+
|
56
60
|
def on_ensure(node)
|
57
61
|
check(node, [:keyword].freeze)
|
58
62
|
end
|
@@ -65,6 +69,14 @@ module RuboCop
|
|
65
69
|
check(node, %i[keyword else begin end].freeze, 'then')
|
66
70
|
end
|
67
71
|
|
72
|
+
def on_if_guard(node)
|
73
|
+
check(node, [:keyword].freeze)
|
74
|
+
end
|
75
|
+
|
76
|
+
def on_in_pattern(node)
|
77
|
+
check(node, [:keyword].freeze)
|
78
|
+
end
|
79
|
+
|
68
80
|
def on_kwbegin(node)
|
69
81
|
check(node, %i[begin end].freeze, nil)
|
70
82
|
end
|
@@ -109,6 +121,10 @@ module RuboCop
|
|
109
121
|
check(node, [:keyword].freeze)
|
110
122
|
end
|
111
123
|
|
124
|
+
def on_unless_guard(node)
|
125
|
+
check(node, [:keyword].freeze)
|
126
|
+
end
|
127
|
+
|
112
128
|
def on_until(node)
|
113
129
|
check(node, %i[begin end keyword].freeze)
|
114
130
|
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Lint
|
6
|
+
# This cop checks for the presence of `in` pattern branches without a body.
|
7
|
+
#
|
8
|
+
# @example
|
9
|
+
#
|
10
|
+
# # bad
|
11
|
+
# case condition
|
12
|
+
# in [a]
|
13
|
+
# do_something
|
14
|
+
# in [a, b]
|
15
|
+
# end
|
16
|
+
#
|
17
|
+
# # good
|
18
|
+
# case condition
|
19
|
+
# in [a]
|
20
|
+
# do_something
|
21
|
+
# in [a, b]
|
22
|
+
# nil
|
23
|
+
# end
|
24
|
+
#
|
25
|
+
# @example AllowComments: true (default)
|
26
|
+
#
|
27
|
+
# # good
|
28
|
+
# case condition
|
29
|
+
# in [a]
|
30
|
+
# do_something
|
31
|
+
# in [a, b]
|
32
|
+
# # noop
|
33
|
+
# end
|
34
|
+
#
|
35
|
+
# @example AllowComments: false
|
36
|
+
#
|
37
|
+
# # bad
|
38
|
+
# case condition
|
39
|
+
# in [a]
|
40
|
+
# do_something
|
41
|
+
# in [a, b]
|
42
|
+
# # noop
|
43
|
+
# end
|
44
|
+
#
|
45
|
+
class EmptyInPattern < Base
|
46
|
+
extend TargetRubyVersion
|
47
|
+
|
48
|
+
MSG = 'Avoid `in` branches without a body.'
|
49
|
+
|
50
|
+
minimum_target_ruby_version 2.7
|
51
|
+
|
52
|
+
def on_case_match(node)
|
53
|
+
node.in_pattern_branches.each do |branch|
|
54
|
+
next if branch.body || cop_config['AllowComments'] && comment_lines?(node)
|
55
|
+
|
56
|
+
add_offense(branch)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -60,16 +60,19 @@ module RuboCop
|
|
60
60
|
processed_source.buffer.source_line(range.line - 1).blank?
|
61
61
|
end
|
62
62
|
|
63
|
-
def comment_range_with_surrounding_space(
|
64
|
-
if previous_line_blank?(
|
65
|
-
processed_source.comment_config.comment_only_line?(
|
63
|
+
def comment_range_with_surrounding_space(directive_comment_range, line_comment_range)
|
64
|
+
if previous_line_blank?(directive_comment_range) &&
|
65
|
+
processed_source.comment_config.comment_only_line?(directive_comment_range.line) &&
|
66
|
+
directive_comment_range.begin_pos == line_comment_range.begin_pos
|
66
67
|
# When the previous line is blank, it should be retained
|
67
|
-
range_with_surrounding_space(range:
|
68
|
+
range_with_surrounding_space(range: directive_comment_range, side: :right)
|
68
69
|
else
|
69
70
|
# Eat the entire comment, the preceding space, and the preceding
|
70
71
|
# newline if there is one.
|
71
|
-
original_begin =
|
72
|
-
range = range_with_surrounding_space(
|
72
|
+
original_begin = directive_comment_range.begin_pos
|
73
|
+
range = range_with_surrounding_space(
|
74
|
+
range: directive_comment_range, side: :left, newlines: true
|
75
|
+
)
|
73
76
|
|
74
77
|
range_with_surrounding_space(range: range,
|
75
78
|
side: :right,
|
@@ -179,14 +182,14 @@ module RuboCop
|
|
179
182
|
end
|
180
183
|
|
181
184
|
def add_offense_for_entire_comment(comment, cops)
|
182
|
-
location = comment.
|
185
|
+
location = DirectiveComment.new(comment).range
|
183
186
|
cop_list = cops.sort.map { |c| describe(c) }
|
184
187
|
|
185
188
|
add_offense(
|
186
189
|
location,
|
187
190
|
message: "Unnecessary disabling of #{cop_list.join(', ')}."
|
188
191
|
) do |corrector|
|
189
|
-
range = comment_range_with_surrounding_space(location)
|
192
|
+
range = comment_range_with_surrounding_space(location, comment.loc.expression)
|
190
193
|
corrector.remove(range)
|
191
194
|
end
|
192
195
|
end
|
@@ -66,6 +66,7 @@ module RuboCop
|
|
66
66
|
class SymbolConversion < Base
|
67
67
|
extend AutoCorrector
|
68
68
|
include ConfigurableEnforcedStyle
|
69
|
+
include SymbolHelp
|
69
70
|
|
70
71
|
MSG = 'Unnecessary symbol conversion; use `%<correction>s` instead.'
|
71
72
|
MSG_CONSISTENCY = 'Symbol hash key should be quoted for consistency; ' \
|
@@ -138,10 +139,6 @@ module RuboCop
|
|
138
139
|
node.parent&.array_type? && node.parent&.percent_literal?
|
139
140
|
end
|
140
141
|
|
141
|
-
def hash_key?(node)
|
142
|
-
node.parent&.pair_type? && node == node.parent.child_nodes.first
|
143
|
-
end
|
144
|
-
|
145
142
|
def correct_hash_key(node)
|
146
143
|
# Although some operators can be converted to symbols normally
|
147
144
|
# (ie. `:==`), these are not accepted as hash keys and will
|
@@ -167,7 +164,7 @@ module RuboCop
|
|
167
164
|
next if requires_quotes?(key)
|
168
165
|
next if properly_quoted?(key.source, %("#{key.value}"))
|
169
166
|
|
170
|
-
correction = "#{
|
167
|
+
correction = %("#{key.value}")
|
171
168
|
register_offense(
|
172
169
|
key,
|
173
170
|
correction: correction,
|
@@ -175,13 +172,6 @@ module RuboCop
|
|
175
172
|
)
|
176
173
|
end
|
177
174
|
end
|
178
|
-
|
179
|
-
def quote_type
|
180
|
-
# Use the `Style/StringLiterals` configuration for quoting symbols
|
181
|
-
return '"' unless config.for_cop('Style/StringLiterals')['Enabled']
|
182
|
-
|
183
|
-
config.for_cop('Style/StringLiterals')['EnforcedStyle'] == 'single_quotes' ? "'" : '"'
|
184
|
-
end
|
185
175
|
end
|
186
176
|
end
|
187
177
|
end
|
@@ -43,7 +43,7 @@ module RuboCop
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def value_delta(pair)
|
46
|
-
return 0 if pair.
|
46
|
+
return 0 if pair.value_on_new_line?
|
47
47
|
|
48
48
|
correct_value_column = pair.loc.operator.end.column + 1
|
49
49
|
actual_value_column = pair.value.loc.column
|
@@ -108,8 +108,6 @@ module RuboCop
|
|
108
108
|
end
|
109
109
|
|
110
110
|
def value_delta(first_pair, current_pair)
|
111
|
-
return 0 if current_pair.kwsplat_type?
|
112
|
-
|
113
111
|
correct_value_column = first_pair.key.loc.column +
|
114
112
|
current_pair.delimiter(true).length +
|
115
113
|
max_key_width
|
@@ -139,6 +137,19 @@ module RuboCop
|
|
139
137
|
first_pair.value_delta(current_pair)
|
140
138
|
end
|
141
139
|
end
|
140
|
+
|
141
|
+
# Handles calculation of deltas for `kwsplat` nodes.
|
142
|
+
# This is a special case that just ensures the kwsplat is aligned with the rest of the hash
|
143
|
+
# since a `kwsplat` does not have a key, separator or value.
|
144
|
+
class KeywordSplatAlignment
|
145
|
+
def deltas(first_pair, current_pair)
|
146
|
+
if Util.begins_its_line?(current_pair.source_range)
|
147
|
+
{ key: first_pair.key_delta(current_pair) }
|
148
|
+
else
|
149
|
+
{}
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
142
153
|
end
|
143
154
|
end
|
144
155
|
end
|
@@ -4,12 +4,10 @@ module RuboCop
|
|
4
4
|
module Cop
|
5
5
|
# Common functionality for cops checking single/double quotes.
|
6
6
|
module StringLiteralsHelp
|
7
|
-
include StringHelp
|
8
|
-
|
9
7
|
private
|
10
8
|
|
11
|
-
def wrong_quotes?(
|
12
|
-
src =
|
9
|
+
def wrong_quotes?(src_or_node)
|
10
|
+
src = src_or_node.is_a?(RuboCop::AST::Node) ? src_or_node.source : src_or_node
|
13
11
|
return false if src.start_with?('%', '?')
|
14
12
|
|
15
13
|
if style == :single_quotes
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
# Classes that include this module just implement functions for working
|
6
|
+
# with symbol nodes.
|
7
|
+
module SymbolHelp
|
8
|
+
def hash_key?(node)
|
9
|
+
node.parent&.pair_type? && node == node.parent.child_nodes.first
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -17,6 +17,11 @@ module RuboCop
|
|
17
17
|
# # good
|
18
18
|
# hash.each_key { |k| p k }
|
19
19
|
# hash.each_value { |v| p v }
|
20
|
+
#
|
21
|
+
# @example AllowedReceivers: ['execute']
|
22
|
+
# # good
|
23
|
+
# execute(sql).keys.each { |v| p v }
|
24
|
+
# execute(sql).values.each { |v| p v }
|
20
25
|
class HashEachMethods < Base
|
21
26
|
include Lint::UnusedArgument
|
22
27
|
extend AutoCorrector
|
@@ -36,7 +41,9 @@ module RuboCop
|
|
36
41
|
|
37
42
|
def register_kv_offense(node)
|
38
43
|
kv_each(node) do |target, method|
|
39
|
-
|
44
|
+
parent_receiver = target.receiver.receiver
|
45
|
+
return unless parent_receiver
|
46
|
+
return if allowed_receiver?(parent_receiver)
|
40
47
|
|
41
48
|
msg = format(message, prefer: "each_#{method[0..-2]}", current: "#{method}.each")
|
42
49
|
|
@@ -80,6 +87,16 @@ module RuboCop
|
|
80
87
|
def kv_range(outer_node)
|
81
88
|
outer_node.receiver.loc.selector.join(outer_node.loc.selector)
|
82
89
|
end
|
90
|
+
|
91
|
+
def allowed_receiver?(receiver)
|
92
|
+
receiver_name = receiver.send_type? ? receiver.method_name.to_s : receiver.source
|
93
|
+
|
94
|
+
allowed_receivers.include?(receiver_name)
|
95
|
+
end
|
96
|
+
|
97
|
+
def allowed_receivers
|
98
|
+
cop_config.fetch('AllowedReceivers', [])
|
99
|
+
end
|
83
100
|
end
|
84
101
|
end
|
85
102
|
end
|
@@ -68,39 +68,60 @@ module RuboCop
|
|
68
68
|
# do_z
|
69
69
|
# end
|
70
70
|
class IdenticalConditionalBranches < Base
|
71
|
+
include RangeHelp
|
72
|
+
extend AutoCorrector
|
73
|
+
|
71
74
|
MSG = 'Move `%<source>s` out of the conditional.'
|
72
75
|
|
73
76
|
def on_if(node)
|
74
77
|
return if node.elsif?
|
75
78
|
|
76
79
|
branches = expand_elses(node.else_branch).unshift(node.if_branch)
|
77
|
-
check_branches(branches)
|
80
|
+
check_branches(node, branches)
|
78
81
|
end
|
79
82
|
|
80
83
|
def on_case(node)
|
81
84
|
return unless node.else? && node.else_branch
|
82
85
|
|
83
86
|
branches = node.when_branches.map(&:body).push(node.else_branch)
|
84
|
-
check_branches(branches)
|
87
|
+
check_branches(node, branches)
|
85
88
|
end
|
86
89
|
|
87
90
|
private
|
88
91
|
|
89
|
-
def check_branches(branches)
|
92
|
+
def check_branches(node, branches)
|
90
93
|
# return if any branch is empty. An empty branch can be an `if`
|
91
94
|
# without an `else` or a branch that contains only comments.
|
92
95
|
return if branches.any?(&:nil?)
|
93
96
|
|
94
97
|
tails = branches.map { |branch| tail(branch) }
|
95
|
-
check_expressions(tails) if
|
98
|
+
check_expressions(node, tails, :after_condition) if duplicated_expressions?(tails)
|
99
|
+
|
96
100
|
heads = branches.map { |branch| head(branch) }
|
97
|
-
check_expressions(heads) if
|
101
|
+
check_expressions(node, heads, :before_condition) if duplicated_expressions?(heads)
|
102
|
+
end
|
103
|
+
|
104
|
+
def duplicated_expressions?(expressions)
|
105
|
+
expressions.size > 1 && expressions.uniq.one?
|
98
106
|
end
|
99
107
|
|
100
|
-
def check_expressions(expressions)
|
101
|
-
|
108
|
+
def check_expressions(node, expressions, insert_position)
|
109
|
+
inserted_expression = false
|
110
|
+
|
111
|
+
expressions.each do |expression|
|
112
|
+
add_offense(expression) do |corrector|
|
113
|
+
range = range_by_whole_lines(expression.source_range, include_final_newline: true)
|
114
|
+
corrector.remove(range)
|
115
|
+
next if inserted_expression
|
102
116
|
|
103
|
-
|
117
|
+
if insert_position == :after_condition
|
118
|
+
corrector.insert_after(node, "\n#{expression.source}")
|
119
|
+
else
|
120
|
+
corrector.insert_before(node, "#{expression.source}\n")
|
121
|
+
end
|
122
|
+
inserted_expression = true
|
123
|
+
end
|
124
|
+
end
|
104
125
|
end
|
105
126
|
|
106
127
|
def message(node)
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# This cop checks for `in;` uses in `case` expressions.
|
7
|
+
#
|
8
|
+
# @example
|
9
|
+
# # bad
|
10
|
+
# case expression
|
11
|
+
# in pattern_a; foo
|
12
|
+
# in pattern_b; bar
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# # good
|
16
|
+
# case expression
|
17
|
+
# in pattern_a then foo
|
18
|
+
# in pattern_b then bar
|
19
|
+
# end
|
20
|
+
#
|
21
|
+
class InPatternThen < Base
|
22
|
+
extend AutoCorrector
|
23
|
+
extend TargetRubyVersion
|
24
|
+
|
25
|
+
minimum_target_ruby_version 2.7
|
26
|
+
|
27
|
+
MSG = 'Do not use `in %<pattern>s;`. Use `in %<pattern>s then` instead.'
|
28
|
+
|
29
|
+
def on_in_pattern(node)
|
30
|
+
return if node.multiline? || node.then? || !node.body
|
31
|
+
|
32
|
+
pattern = node.pattern
|
33
|
+
pattern_source = if pattern.match_alt_type?
|
34
|
+
alternative_pattern_source(pattern)
|
35
|
+
else
|
36
|
+
pattern.source
|
37
|
+
end
|
38
|
+
|
39
|
+
add_offense(node.loc.begin, message: format(MSG, pattern: pattern_source)) do |corrector|
|
40
|
+
corrector.replace(node.loc.begin, ' then')
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def alternative_pattern_source(pattern)
|
47
|
+
return pattern.children.map(&:source) unless pattern.children.first.match_alt_type?
|
48
|
+
|
49
|
+
pattern_sources = alternative_pattern_source(pattern.children.first)
|
50
|
+
|
51
|
+
(pattern_sources << pattern.children[1].source).join(' | ')
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# This cop checks uses of the `then` keyword in multi-line `in` statement.
|
7
|
+
#
|
8
|
+
# @example
|
9
|
+
# # bad
|
10
|
+
# case expression
|
11
|
+
# in pattern then
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# # good
|
15
|
+
# case expression
|
16
|
+
# in pattern
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
# # good
|
20
|
+
# case expression
|
21
|
+
# in pattern then do_something
|
22
|
+
# end
|
23
|
+
#
|
24
|
+
# # good
|
25
|
+
# case expression
|
26
|
+
# in pattern then do_something(arg1,
|
27
|
+
# arg2)
|
28
|
+
# end
|
29
|
+
#
|
30
|
+
class MultilineInPatternThen < Base
|
31
|
+
include RangeHelp
|
32
|
+
extend AutoCorrector
|
33
|
+
extend TargetRubyVersion
|
34
|
+
|
35
|
+
minimum_target_ruby_version 2.7
|
36
|
+
|
37
|
+
MSG = 'Do not use `then` for multiline `in` statement.'
|
38
|
+
|
39
|
+
def on_in_pattern(node)
|
40
|
+
return if !node.then? || require_then?(node)
|
41
|
+
|
42
|
+
range = node.loc.begin
|
43
|
+
add_offense(range) do |corrector|
|
44
|
+
corrector.remove(
|
45
|
+
range_with_surrounding_space(range: range, side: :left, newlines: false)
|
46
|
+
)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
# Requires `then` for write `in` and its body on the same line.
|
53
|
+
def require_then?(in_pattern_node)
|
54
|
+
return true if in_pattern_node.pattern.first_line != in_pattern_node.pattern.last_line
|
55
|
+
return false unless in_pattern_node.body
|
56
|
+
|
57
|
+
in_pattern_node.loc.line == in_pattern_node.body.loc.line
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# Checks if the quotes used for quoted symbols match the configured defaults.
|
7
|
+
# By default uses the same configuration as `Style/StringLiterals`.
|
8
|
+
#
|
9
|
+
# String interpolation is always kept in double quotes.
|
10
|
+
#
|
11
|
+
# Note: `Lint/SymbolConversion` can be used in parallel to ensure that symbols
|
12
|
+
# are not quoted that don't need to be. This cop is for configuring the quoting
|
13
|
+
# style to use for symbols that require quotes.
|
14
|
+
#
|
15
|
+
# @example EnforcedStyle: same_as_string_literals (default) / single_quotes
|
16
|
+
# # bad
|
17
|
+
# :"abc-def"
|
18
|
+
#
|
19
|
+
# # good
|
20
|
+
# :'abc-def'
|
21
|
+
# :"#{str}"
|
22
|
+
# :"a\'b"
|
23
|
+
#
|
24
|
+
# @example EnforcedStyle: double_quotes
|
25
|
+
# # bad
|
26
|
+
# :'abc-def'
|
27
|
+
#
|
28
|
+
# # good
|
29
|
+
# :"abc-def"
|
30
|
+
# :"#{str}"
|
31
|
+
# :"a\'b"
|
32
|
+
class QuotedSymbols < Base
|
33
|
+
include ConfigurableEnforcedStyle
|
34
|
+
include SymbolHelp
|
35
|
+
include StringLiteralsHelp
|
36
|
+
extend AutoCorrector
|
37
|
+
|
38
|
+
MSG_SINGLE = "Prefer single-quoted symbols when you don't need string interpolation " \
|
39
|
+
'or special symbols.'
|
40
|
+
MSG_DOUBLE = 'Prefer double-quoted symbols unless you need single quotes to ' \
|
41
|
+
'avoid extra backslashes for escaping.'
|
42
|
+
|
43
|
+
def on_sym(node)
|
44
|
+
return unless quoted?(node)
|
45
|
+
|
46
|
+
message = style == :single_quotes ? MSG_SINGLE : MSG_DOUBLE
|
47
|
+
|
48
|
+
if wrong_quotes?(node)
|
49
|
+
add_offense(node, message: message) do |corrector|
|
50
|
+
opposite_style_detected
|
51
|
+
autocorrect(corrector, node)
|
52
|
+
end
|
53
|
+
else
|
54
|
+
correct_style_detected
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def autocorrect(corrector, node)
|
61
|
+
str = if hash_key?(node)
|
62
|
+
# strip quotes
|
63
|
+
correct_quotes(node.source[1..-2])
|
64
|
+
else
|
65
|
+
# strip leading `:` and quotes
|
66
|
+
":#{correct_quotes(node.source[2..-2])}"
|
67
|
+
end
|
68
|
+
|
69
|
+
corrector.replace(node, str)
|
70
|
+
end
|
71
|
+
|
72
|
+
def correct_quotes(str)
|
73
|
+
if style == :single_quotes
|
74
|
+
to_string_literal(str)
|
75
|
+
else
|
76
|
+
str.inspect
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def style
|
81
|
+
return super unless super == :same_as_string_literals
|
82
|
+
|
83
|
+
string_literals_config = config.for_cop('Style/StringLiterals')
|
84
|
+
return :single_quotes unless string_literals_config['Enabled']
|
85
|
+
|
86
|
+
string_literals_config['EnforcedStyle'].to_sym
|
87
|
+
end
|
88
|
+
|
89
|
+
def alternative_style
|
90
|
+
(supported_styles - [style, :same_as_string_literals]).first
|
91
|
+
end
|
92
|
+
|
93
|
+
def quoted?(sym_node)
|
94
|
+
sym_node.source.match?(/\A:?(['"]).*?\1\z/m)
|
95
|
+
end
|
96
|
+
|
97
|
+
def wrong_quotes?(node)
|
98
|
+
return super if hash_key?(node)
|
99
|
+
|
100
|
+
super(node.source[1..-1])
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -50,7 +50,7 @@ module RuboCop
|
|
50
50
|
RESTRICT_ON_SEND = %i[define_method].freeze
|
51
51
|
|
52
52
|
def on_def(node)
|
53
|
-
return unless node
|
53
|
+
return unless top_level_method_definition?(node)
|
54
54
|
|
55
55
|
add_offense(node)
|
56
56
|
end
|
@@ -58,13 +58,21 @@ module RuboCop
|
|
58
58
|
alias on_send on_def
|
59
59
|
|
60
60
|
def on_block(node)
|
61
|
-
return unless define_method_block?(node) && node
|
61
|
+
return unless define_method_block?(node) && top_level_method_definition?(node)
|
62
62
|
|
63
63
|
add_offense(node)
|
64
64
|
end
|
65
65
|
|
66
66
|
private
|
67
67
|
|
68
|
+
def top_level_method_definition?(node)
|
69
|
+
if node.parent&.begin_type?
|
70
|
+
node.parent.root?
|
71
|
+
else
|
72
|
+
node.root?
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
68
76
|
# @!method define_method_block?(node)
|
69
77
|
def_node_matcher :define_method_block?, <<~PATTERN
|
70
78
|
(block (send _ {:define_method} _) ...)
|
@@ -20,12 +20,16 @@ module RuboCop
|
|
20
20
|
class WhenThen < Base
|
21
21
|
extend AutoCorrector
|
22
22
|
|
23
|
-
MSG = 'Do not use `when
|
23
|
+
MSG = 'Do not use `when %<expression>s;`. Use `when %<expression>s then` instead.'
|
24
24
|
|
25
25
|
def on_when(node)
|
26
26
|
return if node.multiline? || node.then? || !node.body
|
27
27
|
|
28
|
-
|
28
|
+
message = format(MSG, expression: node.conditions.map(&:source).join(', '))
|
29
|
+
|
30
|
+
add_offense(node.loc.begin, message: message) do |corrector|
|
31
|
+
corrector.replace(node.loc.begin, ' then')
|
32
|
+
end
|
29
33
|
end
|
30
34
|
end
|
31
35
|
end
|
@@ -41,7 +41,11 @@ module RuboCop
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def range
|
44
|
-
comment.
|
44
|
+
match = comment.text.match(DIRECTIVE_COMMENT_REGEXP)
|
45
|
+
begin_pos = comment.loc.expression.begin_pos
|
46
|
+
Parser::Source::Range.new(
|
47
|
+
comment.loc.expression.source_buffer, begin_pos + match.begin(0), begin_pos + match.end(0)
|
48
|
+
)
|
45
49
|
end
|
46
50
|
|
47
51
|
# Returns match captures to directive comment pattern
|
data/lib/rubocop/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubocop
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.16.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bozhidar Batsov
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: exe
|
12
12
|
cert_chain: []
|
13
|
-
date: 2021-
|
13
|
+
date: 2021-06-01 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: parallel
|
@@ -100,7 +100,7 @@ dependencies:
|
|
100
100
|
requirements:
|
101
101
|
- - ">="
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: 1.
|
103
|
+
version: 1.7.0
|
104
104
|
- - "<"
|
105
105
|
- !ruby/object:Gem::Version
|
106
106
|
version: '2.0'
|
@@ -110,7 +110,7 @@ dependencies:
|
|
110
110
|
requirements:
|
111
111
|
- - ">="
|
112
112
|
- !ruby/object:Gem::Version
|
113
|
-
version: 1.
|
113
|
+
version: 1.7.0
|
114
114
|
- - "<"
|
115
115
|
- !ruby/object:Gem::Version
|
116
116
|
version: '2.0'
|
@@ -397,6 +397,7 @@ files:
|
|
397
397
|
- lib/rubocop/cop/lint/empty_ensure.rb
|
398
398
|
- lib/rubocop/cop/lint/empty_expression.rb
|
399
399
|
- lib/rubocop/cop/lint/empty_file.rb
|
400
|
+
- lib/rubocop/cop/lint/empty_in_pattern.rb
|
400
401
|
- lib/rubocop/cop/lint/empty_interpolation.rb
|
401
402
|
- lib/rubocop/cop/lint/empty_when.rb
|
402
403
|
- lib/rubocop/cop/lint/ensure_return.rb
|
@@ -562,6 +563,7 @@ files:
|
|
562
563
|
- lib/rubocop/cop/mixin/string_help.rb
|
563
564
|
- lib/rubocop/cop/mixin/string_literals_help.rb
|
564
565
|
- lib/rubocop/cop/mixin/surrounding_space.rb
|
566
|
+
- lib/rubocop/cop/mixin/symbol_help.rb
|
565
567
|
- lib/rubocop/cop/mixin/target_ruby_version.rb
|
566
568
|
- lib/rubocop/cop/mixin/trailing_body.rb
|
567
569
|
- lib/rubocop/cop/mixin/trailing_comma.rb
|
@@ -676,6 +678,7 @@ files:
|
|
676
678
|
- lib/rubocop/cop/style/if_with_boolean_literal_branches.rb
|
677
679
|
- lib/rubocop/cop/style/if_with_semicolon.rb
|
678
680
|
- lib/rubocop/cop/style/implicit_runtime_error.rb
|
681
|
+
- lib/rubocop/cop/style/in_pattern_then.rb
|
679
682
|
- lib/rubocop/cop/style/infinite_loop.rb
|
680
683
|
- lib/rubocop/cop/style/inline_comment.rb
|
681
684
|
- lib/rubocop/cop/style/inverse_methods.rb
|
@@ -699,6 +702,7 @@ files:
|
|
699
702
|
- lib/rubocop/cop/style/multiline_block_chain.rb
|
700
703
|
- lib/rubocop/cop/style/multiline_if_modifier.rb
|
701
704
|
- lib/rubocop/cop/style/multiline_if_then.rb
|
705
|
+
- lib/rubocop/cop/style/multiline_in_pattern_then.rb
|
702
706
|
- lib/rubocop/cop/style/multiline_memoization.rb
|
703
707
|
- lib/rubocop/cop/style/multiline_method_signature.rb
|
704
708
|
- lib/rubocop/cop/style/multiline_ternary_operator.rb
|
@@ -732,6 +736,7 @@ files:
|
|
732
736
|
- lib/rubocop/cop/style/perl_backrefs.rb
|
733
737
|
- lib/rubocop/cop/style/preferred_hash_methods.rb
|
734
738
|
- lib/rubocop/cop/style/proc.rb
|
739
|
+
- lib/rubocop/cop/style/quoted_symbols.rb
|
735
740
|
- lib/rubocop/cop/style/raise_args.rb
|
736
741
|
- lib/rubocop/cop/style/random_with_offset.rb
|
737
742
|
- lib/rubocop/cop/style/redundant_argument.rb
|
@@ -876,7 +881,7 @@ metadata:
|
|
876
881
|
homepage_uri: https://rubocop.org/
|
877
882
|
changelog_uri: https://github.com/rubocop/rubocop/blob/master/CHANGELOG.md
|
878
883
|
source_code_uri: https://github.com/rubocop/rubocop/
|
879
|
-
documentation_uri: https://docs.rubocop.org/rubocop/1.
|
884
|
+
documentation_uri: https://docs.rubocop.org/rubocop/1.16/
|
880
885
|
bug_tracker_uri: https://github.com/rubocop/rubocop/issues
|
881
886
|
post_install_message:
|
882
887
|
rdoc_options: []
|