rubocop 1.29.0 → 1.29.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/config/default.yml +15 -15
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +3 -0
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +4 -4
- data/lib/rubocop/cop/naming/inclusive_language.rb +3 -2
- data/lib/rubocop/cop/style/fetch_env_var.rb +3 -1
- data/lib/rubocop/cop/style/map_to_hash.rb +3 -0
- data/lib/rubocop/cop/style/raise_args.rb +3 -0
- data/lib/rubocop/cop/style/redundant_condition.rb +32 -5
- data/lib/rubocop/cop/style/slicing_with_range.rb +3 -0
- data/lib/rubocop/rspec/shared_contexts.rb +4 -0
- data/lib/rubocop/target_ruby.rb +1 -1
- data/lib/rubocop/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dc3f8c82f30de8d481011d509c430f07627740062258586008ada7a2e301935d
|
4
|
+
data.tar.gz: 4a41b97adf892a9acce8faec7325b822734c717b03a46ead788f154e0db27a41
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7222d77b9e5dcfe8908311c2d551da58959136fa9c560afd6aac17c53b0c9abcac9d9d241e31883e35e1276e5274d8b8a33cb5f5a7b917dff27602de1e3f10fb
|
7
|
+
data.tar.gz: 296507dfa80b4166a3e4960bc56c43262ca25cc32feb280d49824c335cae916c2d45bfc353ac592857c2c83aa39cd90ffe6ff568ba2d3ed2329361e0788f3b26
|
data/config/default.yml
CHANGED
@@ -895,7 +895,7 @@ Layout/HeredocArgumentClosingParenthesis:
|
|
895
895
|
VersionAdded: '0.68'
|
896
896
|
|
897
897
|
Layout/HeredocIndentation:
|
898
|
-
Description: '
|
898
|
+
Description: 'Checks the indentation of the here document bodies.'
|
899
899
|
StyleGuide: '#squiggly-heredocs'
|
900
900
|
Enabled: true
|
901
901
|
VersionAdded: '0.49'
|
@@ -1514,7 +1514,7 @@ Lint/BigDecimalNew:
|
|
1514
1514
|
VersionAdded: '0.53'
|
1515
1515
|
|
1516
1516
|
Lint/BinaryOperatorWithIdenticalOperands:
|
1517
|
-
Description: '
|
1517
|
+
Description: 'Checks for places where binary operator has identical operands.'
|
1518
1518
|
Enabled: true
|
1519
1519
|
Safe: false
|
1520
1520
|
VersionAdded: '0.89'
|
@@ -1696,7 +1696,7 @@ Lint/ElseLayout:
|
|
1696
1696
|
VersionChanged: '1.2'
|
1697
1697
|
|
1698
1698
|
Lint/EmptyBlock:
|
1699
|
-
Description: '
|
1699
|
+
Description: 'Checks for blocks without a body.'
|
1700
1700
|
Enabled: pending
|
1701
1701
|
VersionAdded: '1.1'
|
1702
1702
|
VersionChanged: '1.15'
|
@@ -1710,7 +1710,7 @@ Lint/EmptyClass:
|
|
1710
1710
|
AllowComments: false
|
1711
1711
|
|
1712
1712
|
Lint/EmptyConditionalBody:
|
1713
|
-
Description: '
|
1713
|
+
Description: 'Checks for the presence of `if`, `elsif` and `unless` branches without a body.'
|
1714
1714
|
Enabled: true
|
1715
1715
|
AllowComments: true
|
1716
1716
|
VersionAdded: '0.89'
|
@@ -1889,7 +1889,7 @@ Lint/MissingCopEnableDirective:
|
|
1889
1889
|
|
1890
1890
|
Lint/MissingSuper:
|
1891
1891
|
Description: >-
|
1892
|
-
|
1892
|
+
Checks for the presence of constructors and lifecycle callbacks
|
1893
1893
|
without calls to `super`.
|
1894
1894
|
Enabled: true
|
1895
1895
|
VersionAdded: '0.89'
|
@@ -2218,7 +2218,7 @@ Lint/Syntax:
|
|
2218
2218
|
VersionAdded: '0.9'
|
2219
2219
|
|
2220
2220
|
Lint/ToEnumArguments:
|
2221
|
-
Description: '
|
2221
|
+
Description: 'Ensures that `to_enum`/`enum_for`, called for the current method, has correct arguments.'
|
2222
2222
|
Enabled: pending
|
2223
2223
|
VersionAdded: '1.1'
|
2224
2224
|
|
@@ -2228,12 +2228,12 @@ Lint/ToJSON:
|
|
2228
2228
|
VersionAdded: '0.66'
|
2229
2229
|
|
2230
2230
|
Lint/TopLevelReturnWithArgument:
|
2231
|
-
Description: '
|
2231
|
+
Description: 'Detects top level return statements with argument.'
|
2232
2232
|
Enabled: true
|
2233
2233
|
VersionAdded: '0.89'
|
2234
2234
|
|
2235
2235
|
Lint/TrailingCommaInAttributeDeclaration:
|
2236
|
-
Description: '
|
2236
|
+
Description: 'Checks for trailing commas in attribute declarations.'
|
2237
2237
|
Enabled: true
|
2238
2238
|
VersionAdded: '0.90'
|
2239
2239
|
|
@@ -2282,7 +2282,7 @@ Lint/UnreachableCode:
|
|
2282
2282
|
VersionAdded: '0.9'
|
2283
2283
|
|
2284
2284
|
Lint/UnreachableLoop:
|
2285
|
-
Description: '
|
2285
|
+
Description: 'Checks for loops that will have at most one iteration.'
|
2286
2286
|
Enabled: true
|
2287
2287
|
VersionAdded: '0.89'
|
2288
2288
|
VersionChanged: '1.7'
|
@@ -3109,7 +3109,7 @@ Style/CaseEquality:
|
|
3109
3109
|
AllowOnConstant: false
|
3110
3110
|
|
3111
3111
|
Style/CaseLikeIf:
|
3112
|
-
Description: '
|
3112
|
+
Description: 'Identifies places where `if-elsif` constructions can be replaced with `case-when`.'
|
3113
3113
|
StyleGuide: '#case-vs-if-else'
|
3114
3114
|
Enabled: true
|
3115
3115
|
Safe: false
|
@@ -3549,7 +3549,7 @@ Style/ExponentialNotation:
|
|
3549
3549
|
|
3550
3550
|
Style/FetchEnvVar:
|
3551
3551
|
Description: >-
|
3552
|
-
|
3552
|
+
Suggests `ENV.fetch` for the replacement of `ENV[]`.
|
3553
3553
|
Reference:
|
3554
3554
|
- https://rubystyle.guide/#hash-fetch-defaults
|
3555
3555
|
Enabled: pending
|
@@ -4146,7 +4146,7 @@ Style/NegatedIf:
|
|
4146
4146
|
|
4147
4147
|
Style/NegatedIfElseCondition:
|
4148
4148
|
Description: >-
|
4149
|
-
|
4149
|
+
Checks for uses of `if-else` and ternary operators with a negated condition
|
4150
4150
|
which can be simplified by inverting condition and swapping branches.
|
4151
4151
|
Enabled: pending
|
4152
4152
|
VersionAdded: '1.2'
|
@@ -4703,7 +4703,7 @@ Style/ReturnNil:
|
|
4703
4703
|
|
4704
4704
|
Style/SafeNavigation:
|
4705
4705
|
Description: >-
|
4706
|
-
|
4706
|
+
Transforms usages of a method call safeguarded by
|
4707
4707
|
a check for the existence of the object to
|
4708
4708
|
safe navigation (`&.`).
|
4709
4709
|
Auto-correction is unsafe as it assumes the object will
|
@@ -4930,7 +4930,7 @@ Style/StructInheritance:
|
|
4930
4930
|
VersionChanged: '1.20'
|
4931
4931
|
|
4932
4932
|
Style/SwapValues:
|
4933
|
-
Description: '
|
4933
|
+
Description: 'Enforces the use of shorthand-style swapping of 2 variables.'
|
4934
4934
|
StyleGuide: '#values-swapping'
|
4935
4935
|
Enabled: pending
|
4936
4936
|
VersionAdded: '1.1'
|
@@ -4980,7 +4980,7 @@ Style/TernaryParentheses:
|
|
4980
4980
|
AllowSafeAssignment: true
|
4981
4981
|
|
4982
4982
|
Style/TopLevelMethodDefinition:
|
4983
|
-
Description: '
|
4983
|
+
Description: 'Looks for top-level method definitions.'
|
4984
4984
|
StyleGuide: '#top-level-methods'
|
4985
4985
|
Enabled: false
|
4986
4986
|
VersionAdded: '1.15'
|
@@ -143,19 +143,19 @@ module RuboCop
|
|
143
143
|
|
144
144
|
# @!method method_require?(node)
|
145
145
|
def_node_matcher :method_require?, <<~PATTERN
|
146
|
-
(block-pass (send nil? :method (sym :require)))
|
146
|
+
(block-pass (send nil? :method (sym {:require :require_relative})))
|
147
147
|
PATTERN
|
148
148
|
|
149
149
|
# @!method unsorted_dir_glob_pass?(node)
|
150
150
|
def_node_matcher :unsorted_dir_glob_pass?, <<~PATTERN
|
151
151
|
(send (const {nil? cbase} :Dir) :glob ...
|
152
|
-
(block-pass (send nil? :method (sym :require))))
|
152
|
+
(block-pass (send nil? :method (sym {:require :require_relative}))))
|
153
153
|
PATTERN
|
154
154
|
|
155
155
|
# @!method unsorted_dir_each_pass?(node)
|
156
156
|
def_node_matcher :unsorted_dir_each_pass?, <<~PATTERN
|
157
157
|
(send (send (const {nil? cbase} :Dir) {:[] :glob} ...) :each
|
158
|
-
(block-pass (send nil? :method (sym :require))))
|
158
|
+
(block-pass (send nil? :method (sym {:require :require_relative}))))
|
159
159
|
PATTERN
|
160
160
|
|
161
161
|
# @!method loop_variable(node)
|
@@ -165,7 +165,7 @@ module RuboCop
|
|
165
165
|
|
166
166
|
# @!method var_is_required?(node, name)
|
167
167
|
def_node_search :var_is_required?, <<~PATTERN
|
168
|
-
(send nil? :require (lvar %1))
|
168
|
+
(send nil? {:require :require_relative} (lvar %1))
|
169
169
|
PATTERN
|
170
170
|
end
|
171
171
|
end
|
@@ -214,13 +214,14 @@ module RuboCop
|
|
214
214
|
end
|
215
215
|
|
216
216
|
def mask_input(str)
|
217
|
-
return str if @allowed_regex.nil?
|
218
|
-
|
219
217
|
safe_str = if str.valid_encoding?
|
220
218
|
str
|
221
219
|
else
|
222
220
|
str.encode('UTF-8', invalid: :replace, undef: :replace)
|
223
221
|
end
|
222
|
+
|
223
|
+
return safe_str if @allowed_regex.nil?
|
224
|
+
|
224
225
|
safe_str.gsub(@allowed_regex) { |match| '*' * match.size }
|
225
226
|
end
|
226
227
|
|
@@ -97,7 +97,9 @@ module RuboCop
|
|
97
97
|
|
98
98
|
def used_as_flag?(node)
|
99
99
|
return false if node.root?
|
100
|
-
|
100
|
+
|
101
|
+
if_node = node.ancestors.find(&:if_type?)
|
102
|
+
return true if if_node&.condition == node
|
101
103
|
|
102
104
|
node.parent.send_type? && (node.parent.prefix_bang? || node.parent.comparison_method?)
|
103
105
|
end
|
@@ -29,8 +29,11 @@ module RuboCop
|
|
29
29
|
#
|
30
30
|
class MapToHash < Base
|
31
31
|
extend AutoCorrector
|
32
|
+
extend TargetRubyVersion
|
32
33
|
include RangeHelp
|
33
34
|
|
35
|
+
minimum_target_ruby_version 2.6
|
36
|
+
|
34
37
|
MSG = 'Pass a block to `to_h` instead of calling `%<method>s.to_h`.'
|
35
38
|
RESTRICT_ON_SEND = %i[to_h].freeze
|
36
39
|
|
@@ -91,6 +91,9 @@ module RuboCop
|
|
91
91
|
|
92
92
|
def check_compact(node)
|
93
93
|
if node.arguments.size > 1
|
94
|
+
exception = node.first_argument
|
95
|
+
return if exception.send_type? && exception.first_argument&.hash_type?
|
96
|
+
|
94
97
|
add_offense(node, message: format(COMPACT_MSG, method: node.method_name)) do |corrector|
|
95
98
|
replacement = correction_exploded_to_compact(node)
|
96
99
|
|
@@ -44,9 +44,9 @@ module RuboCop
|
|
44
44
|
message = message(node)
|
45
45
|
|
46
46
|
add_offense(range_of_offense(node), message: message) do |corrector|
|
47
|
-
if node.ternary?
|
47
|
+
if node.ternary? && !branches_have_method?(node)
|
48
48
|
correct_ternary(corrector, node)
|
49
|
-
elsif
|
49
|
+
elsif redudant_condition?(node)
|
50
50
|
corrector.replace(node, node.if_branch.source)
|
51
51
|
else
|
52
52
|
corrected = make_ternary_form(node)
|
@@ -59,7 +59,7 @@ module RuboCop
|
|
59
59
|
private
|
60
60
|
|
61
61
|
def message(node)
|
62
|
-
if
|
62
|
+
if redudant_condition?(node)
|
63
63
|
REDUNDANT_CONDITION
|
64
64
|
else
|
65
65
|
MSG
|
@@ -68,6 +68,7 @@ module RuboCop
|
|
68
68
|
|
69
69
|
def range_of_offense(node)
|
70
70
|
return node.loc.expression unless node.ternary?
|
71
|
+
return node.loc.expression if node.ternary? && branches_have_method?(node)
|
71
72
|
|
72
73
|
range_between(node.loc.question.begin_pos, node.loc.colon.end_pos)
|
73
74
|
end
|
@@ -81,6 +82,10 @@ module RuboCop
|
|
81
82
|
(node.ternary? || !else_branch.instance_of?(AST::Node) || else_branch.single_line?)
|
82
83
|
end
|
83
84
|
|
85
|
+
def redudant_condition?(node)
|
86
|
+
node.modifier_form? || !node.else_branch
|
87
|
+
end
|
88
|
+
|
84
89
|
def use_if_branch?(else_branch)
|
85
90
|
else_branch&.if_type?
|
86
91
|
end
|
@@ -89,6 +94,10 @@ module RuboCop
|
|
89
94
|
else_branch&.send_type? && else_branch&.method?(:[]=)
|
90
95
|
end
|
91
96
|
|
97
|
+
def use_hash_key_access?(node)
|
98
|
+
node.send_type? && node.method?(:[])
|
99
|
+
end
|
100
|
+
|
92
101
|
def synonymous_condition_and_branch?(node)
|
93
102
|
condition, if_branch, _else_branch = *node
|
94
103
|
# e.g.
|
@@ -113,7 +122,8 @@ module RuboCop
|
|
113
122
|
# else
|
114
123
|
# test.value = another_value?
|
115
124
|
# end
|
116
|
-
branches_have_method?(node) && condition == if_branch.first_argument
|
125
|
+
branches_have_method?(node) && condition == if_branch.first_argument &&
|
126
|
+
!use_hash_key_access?(if_branch)
|
117
127
|
end
|
118
128
|
|
119
129
|
def branches_have_assignment?(node)
|
@@ -140,6 +150,14 @@ module RuboCop
|
|
140
150
|
if_branch.method?(else_branch.method_name)
|
141
151
|
end
|
142
152
|
|
153
|
+
def if_source(if_branch)
|
154
|
+
if branches_have_method?(if_branch.parent) && if_branch.parenthesized?
|
155
|
+
if_branch.source.delete_suffix(')')
|
156
|
+
else
|
157
|
+
if_branch.source
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
143
161
|
def else_source(else_branch)
|
144
162
|
if branches_have_method?(else_branch.parent)
|
145
163
|
else_source_if_has_method(else_branch)
|
@@ -157,6 +175,8 @@ module RuboCop
|
|
157
175
|
def else_source_if_has_method(else_branch)
|
158
176
|
if require_parentheses?(else_branch.first_argument)
|
159
177
|
"(#{else_branch.first_argument.source})"
|
178
|
+
elsif require_braces?(else_branch.first_argument)
|
179
|
+
"{ #{else_branch.first_argument.source} }"
|
160
180
|
else
|
161
181
|
else_branch.first_argument.source
|
162
182
|
end
|
@@ -165,6 +185,8 @@ module RuboCop
|
|
165
185
|
def else_source_if_has_assignment(else_branch)
|
166
186
|
if require_parentheses?(else_branch.expression)
|
167
187
|
"(#{else_branch.expression.source})"
|
188
|
+
elsif require_braces?(else_branch.expression)
|
189
|
+
"{ #{else_branch.expression.source} }"
|
168
190
|
else
|
169
191
|
else_branch.expression.source
|
170
192
|
end
|
@@ -172,7 +194,8 @@ module RuboCop
|
|
172
194
|
|
173
195
|
def make_ternary_form(node)
|
174
196
|
_condition, if_branch, else_branch = *node
|
175
|
-
ternary_form = [if_branch
|
197
|
+
ternary_form = [if_source(if_branch), else_source(else_branch)].join(' || ')
|
198
|
+
ternary_form += ')' if branches_have_method?(node) && if_branch.parenthesized?
|
176
199
|
|
177
200
|
if node.parent&.send_type?
|
178
201
|
"(#{ternary_form})"
|
@@ -196,6 +219,10 @@ module RuboCop
|
|
196
219
|
(node.respond_to?(:semantic_operator?) && node.semantic_operator?)
|
197
220
|
end
|
198
221
|
|
222
|
+
def require_braces?(node)
|
223
|
+
node.hash_type? && !node.braces?
|
224
|
+
end
|
225
|
+
|
199
226
|
def without_argument_parentheses_method?(node)
|
200
227
|
node.send_type? && !node.arguments.empty? &&
|
201
228
|
!node.parenthesized? && !node.operator_method? && !node.assignment_method?
|
data/lib/rubocop/target_ruby.rb
CHANGED
@@ -4,7 +4,7 @@ module RuboCop
|
|
4
4
|
# The kind of Ruby that code inspected by RuboCop is written in.
|
5
5
|
# @api private
|
6
6
|
class TargetRuby
|
7
|
-
KNOWN_RUBIES = [2.6, 2.7, 3.0, 3.1, 3.2].freeze
|
7
|
+
KNOWN_RUBIES = [2.5, 2.6, 2.7, 3.0, 3.1, 3.2].freeze
|
8
8
|
DEFAULT_VERSION = KNOWN_RUBIES.first
|
9
9
|
|
10
10
|
OBSOLETE_RUBIES = {
|
data/lib/rubocop/version.rb
CHANGED
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.29.
|
4
|
+
version: 1.29.1
|
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: 2022-05-
|
13
|
+
date: 2022-05-12 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: parallel
|
@@ -945,7 +945,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
945
945
|
- !ruby/object:Gem::Version
|
946
946
|
version: '0'
|
947
947
|
requirements: []
|
948
|
-
rubygems_version: 3.2
|
948
|
+
rubygems_version: 3.1.2
|
949
949
|
signing_key:
|
950
950
|
specification_version: 4
|
951
951
|
summary: Automatic Ruby code style checking tool.
|