rubocop 1.21.0 → 1.22.0
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 +43 -6
- data/lib/rubocop/config.rb +5 -0
- data/lib/rubocop/config_loader.rb +2 -0
- data/lib/rubocop/config_validator.rb +9 -1
- data/lib/rubocop/cop/base.rb +1 -1
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +34 -11
- data/lib/rubocop/cop/bundler/ordered_gems.rb +3 -12
- data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +11 -10
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +3 -12
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +1 -1
- data/lib/rubocop/cop/generator.rb +14 -8
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -1
- data/lib/rubocop/cop/layout/dot_position.rb +25 -2
- data/lib/rubocop/cop/layout/line_length.rb +7 -5
- data/lib/rubocop/cop/layout/redundant_line_break.rb +1 -0
- data/lib/rubocop/cop/layout/space_inside_parens.rb +74 -24
- data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +5 -1
- data/lib/rubocop/cop/lint/ambiguous_range.rb +7 -7
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +7 -5
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +18 -5
- data/lib/rubocop/cop/lint/boolean_symbol.rb +5 -0
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +4 -4
- data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +24 -1
- data/lib/rubocop/cop/lint/else_layout.rb +9 -5
- data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +12 -3
- data/lib/rubocop/cop/lint/interpolation_check.rb +5 -0
- data/lib/rubocop/cop/lint/loop.rb +4 -3
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +5 -1
- data/lib/rubocop/cop/lint/number_conversion.rb +5 -0
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +4 -2
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +17 -0
- data/lib/rubocop/cop/lint/percent_string_array.rb +10 -0
- data/lib/rubocop/cop/lint/raise_exception.rb +4 -0
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +5 -4
- data/lib/rubocop/cop/lint/require_relative_self_path.rb +49 -0
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +1 -1
- data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
- data/lib/rubocop/cop/lint/triple_quotes.rb +1 -1
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +8 -3
- data/lib/rubocop/cop/lint/useless_method_definition.rb +3 -2
- data/lib/rubocop/cop/lint/useless_setter_call.rb +7 -4
- data/lib/rubocop/cop/lint/useless_times.rb +3 -2
- data/lib/rubocop/cop/metrics/abc_size.rb +6 -0
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +5 -1
- data/lib/rubocop/cop/mixin/heredoc.rb +1 -3
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +9 -1
- data/lib/rubocop/cop/mixin/percent_array.rb +6 -1
- data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +5 -4
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +7 -0
- data/lib/rubocop/cop/security/io_methods.rb +49 -0
- data/lib/rubocop/cop/security/json_load.rb +8 -7
- data/lib/rubocop/cop/security/open.rb +4 -0
- data/lib/rubocop/cop/security/yaml_load.rb +4 -0
- data/lib/rubocop/cop/style/and_or.rb +4 -3
- data/lib/rubocop/cop/style/arguments_forwarding.rb +13 -2
- data/lib/rubocop/cop/style/array_coercion.rb +21 -3
- data/lib/rubocop/cop/style/case_like_if.rb +5 -0
- data/lib/rubocop/cop/style/class_and_module_children.rb +9 -0
- data/lib/rubocop/cop/style/collection_compact.rb +7 -5
- data/lib/rubocop/cop/style/collection_methods.rb +6 -5
- data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
- data/lib/rubocop/cop/style/commented_keyword.rb +4 -1
- data/lib/rubocop/cop/style/date_time.rb +5 -0
- data/lib/rubocop/cop/style/double_negation.rb +15 -5
- data/lib/rubocop/cop/style/float_division.rb +10 -2
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +6 -1
- data/lib/rubocop/cop/style/global_std_stream.rb +4 -0
- data/lib/rubocop/cop/style/hash_each_methods.rb +5 -0
- data/lib/rubocop/cop/style/hash_transform_keys.rb +4 -6
- data/lib/rubocop/cop/style/hash_transform_values.rb +4 -6
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +18 -16
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +15 -2
- data/lib/rubocop/cop/style/infinite_loop.rb +4 -3
- data/lib/rubocop/cop/style/inverse_methods.rb +9 -2
- data/lib/rubocop/cop/style/line_end_concatenation.rb +13 -0
- data/lib/rubocop/cop/style/module_function.rb +8 -9
- data/lib/rubocop/cop/style/mutable_constant.rb +12 -7
- data/lib/rubocop/cop/style/numbered_parameters.rb +46 -0
- data/lib/rubocop/cop/style/numbered_parameters_limit.rb +50 -0
- data/lib/rubocop/cop/style/numeric_literals.rb +7 -8
- data/lib/rubocop/cop/style/numeric_predicate.rb +5 -0
- data/lib/rubocop/cop/style/optional_arguments.rb +4 -0
- data/lib/rubocop/cop/style/optional_boolean_parameter.rb +14 -4
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +9 -4
- data/lib/rubocop/cop/style/redundant_argument.rb +14 -7
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +4 -0
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +12 -3
- data/lib/rubocop/cop/style/redundant_freeze.rb +0 -1
- data/lib/rubocop/cop/style/redundant_self.rb +10 -0
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +4 -3
- data/lib/rubocop/cop/style/redundant_sort.rb +47 -29
- data/lib/rubocop/cop/style/safe_navigation.rb +13 -2
- data/lib/rubocop/cop/style/select_by_regexp.rb +106 -0
- data/lib/rubocop/cop/style/single_argument_dig.rb +5 -0
- data/lib/rubocop/cop/style/slicing_with_range.rb +13 -0
- data/lib/rubocop/cop/style/special_global_vars.rb +4 -0
- data/lib/rubocop/cop/style/static_class.rb +4 -3
- data/lib/rubocop/cop/style/string_chars.rb +4 -2
- data/lib/rubocop/cop/style/string_concatenation.rb +4 -0
- data/lib/rubocop/cop/style/string_hash_keys.rb +4 -0
- data/lib/rubocop/cop/style/struct_inheritance.rb +3 -2
- data/lib/rubocop/cop/style/swap_values.rb +4 -2
- data/lib/rubocop/cop/style/symbol_proc.rb +26 -0
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +19 -0
- data/lib/rubocop/cop/style/yoda_condition.rb +20 -0
- data/lib/rubocop/cop/style/zero_length_predicate.rb +6 -0
- data/lib/rubocop/cop/util.rb +2 -2
- data/lib/rubocop/cops_documentation_generator.rb +17 -5
- data/lib/rubocop/options.rb +126 -112
- data/lib/rubocop/rspec/cop_helper.rb +1 -1
- data/lib/rubocop/rspec/expect_offense.rb +6 -2
- data/lib/rubocop/version.rb +1 -1
- data/lib/rubocop.rb +5 -0
- metadata +10 -5
@@ -33,6 +33,27 @@ module RuboCop
|
|
33
33
|
# g = ( a + 3 )
|
34
34
|
# y()
|
35
35
|
#
|
36
|
+
# @example EnforcedStyle: compact
|
37
|
+
# # The `compact` style enforces that parentheses have a space at the
|
38
|
+
# # beginning with the exception that successive parentheses are allowed.
|
39
|
+
# # Note: Empty parentheses should not have spaces.
|
40
|
+
#
|
41
|
+
# # bad
|
42
|
+
# f(3)
|
43
|
+
# g = (a + 3)
|
44
|
+
# y( )
|
45
|
+
# g( f( x ) )
|
46
|
+
# g( f( x( 3 ) ), 5 )
|
47
|
+
# g( ( ( 3 + 5 ) * f) ** x, 5 )
|
48
|
+
#
|
49
|
+
# # good
|
50
|
+
# f( 3 )
|
51
|
+
# g = ( a + 3 )
|
52
|
+
# y()
|
53
|
+
# g( f( x ))
|
54
|
+
# g( f( x( 3 )), 5 )
|
55
|
+
# g((( 3 + 5 ) * f ) ** x, 5 )
|
56
|
+
#
|
36
57
|
class SpaceInsideParens < Base
|
37
58
|
include SurroundingSpace
|
38
59
|
include RangeHelp
|
@@ -45,14 +66,13 @@ module RuboCop
|
|
45
66
|
def on_new_investigation
|
46
67
|
tokens = processed_source.sorted_tokens
|
47
68
|
|
48
|
-
|
69
|
+
case style
|
70
|
+
when :space
|
49
71
|
process_with_space_style(tokens)
|
72
|
+
when :compact
|
73
|
+
process_with_compact_style(tokens)
|
50
74
|
else
|
51
|
-
|
52
|
-
add_offense(range) do |corrector|
|
53
|
-
corrector.remove(range)
|
54
|
-
end
|
55
|
-
end
|
75
|
+
correct_extraneous_space(tokens)
|
56
76
|
end
|
57
77
|
end
|
58
78
|
|
@@ -60,20 +80,23 @@ module RuboCop
|
|
60
80
|
|
61
81
|
def process_with_space_style(tokens)
|
62
82
|
tokens.each_cons(2) do |token1, token2|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
83
|
+
correct_extraneous_space_in_empty_parens(token1, token2)
|
84
|
+
correct_missing_space(token1, token2)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def process_with_compact_style(tokens)
|
89
|
+
tokens.each_cons(2) do |token1, token2|
|
90
|
+
correct_extraneous_space_in_empty_parens(token1, token2)
|
91
|
+
if !left_parens?(token1, token2) && !right_parens?(token1, token2)
|
92
|
+
correct_missing_space(token1, token2)
|
93
|
+
else
|
94
|
+
correct_extaneus_space_between_consecutive_parens(token1, token2)
|
72
95
|
end
|
73
96
|
end
|
74
97
|
end
|
75
98
|
|
76
|
-
def
|
99
|
+
def correct_extraneous_space(tokens)
|
77
100
|
tokens.each_cons(2) do |token1, token2|
|
78
101
|
next unless parens?(token1, token2)
|
79
102
|
|
@@ -82,25 +105,44 @@ module RuboCop
|
|
82
105
|
next if token2.comment?
|
83
106
|
next unless same_line?(token1, token2) && token1.space_after?
|
84
107
|
|
85
|
-
|
108
|
+
range = range_between(token1.end_pos, token2.begin_pos)
|
109
|
+
add_offense(range) do |corrector|
|
110
|
+
corrector.remove(range)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def correct_extaneus_space_between_consecutive_parens(token1, token2)
|
116
|
+
return if range_between(token1.end_pos, token2.begin_pos).source != ' '
|
117
|
+
|
118
|
+
range = range_between(token1.end_pos, token2.begin_pos)
|
119
|
+
add_offense(range) do |corrector|
|
120
|
+
corrector.remove(range)
|
86
121
|
end
|
87
122
|
end
|
88
123
|
|
89
|
-
def
|
124
|
+
def correct_extraneous_space_in_empty_parens(token1, token2)
|
90
125
|
return unless token1.left_parens? && token2.right_parens?
|
91
126
|
|
92
127
|
return if range_between(token1.begin_pos, token2.end_pos).source == '()'
|
93
128
|
|
94
|
-
|
129
|
+
range = range_between(token1.end_pos, token2.begin_pos)
|
130
|
+
add_offense(range) do |corrector|
|
131
|
+
corrector.remove(range)
|
132
|
+
end
|
95
133
|
end
|
96
134
|
|
97
|
-
def
|
135
|
+
def correct_missing_space(token1, token2)
|
98
136
|
return if can_be_ignored?(token1, token2)
|
99
137
|
|
100
|
-
if token1.left_parens?
|
101
|
-
|
102
|
-
|
103
|
-
|
138
|
+
range = if token1.left_parens?
|
139
|
+
range_between(token2.begin_pos, token2.begin_pos + 1)
|
140
|
+
elsif token2.right_parens?
|
141
|
+
range_between(token2.begin_pos, token2.end_pos)
|
142
|
+
end
|
143
|
+
|
144
|
+
add_offense(range, message: MSG_SPACE) do |corrector|
|
145
|
+
corrector.insert_before(range, ' ')
|
104
146
|
end
|
105
147
|
end
|
106
148
|
|
@@ -112,6 +154,14 @@ module RuboCop
|
|
112
154
|
token1.left_parens? || token2.right_parens?
|
113
155
|
end
|
114
156
|
|
157
|
+
def left_parens?(token1, token2)
|
158
|
+
token1.left_parens? && token2.left_parens?
|
159
|
+
end
|
160
|
+
|
161
|
+
def right_parens?(token1, token2)
|
162
|
+
token1.right_parens? && token2.right_parens?
|
163
|
+
end
|
164
|
+
|
115
165
|
def can_be_ignored?(token1, token2)
|
116
166
|
return true unless parens?(token1, token2)
|
117
167
|
|
@@ -87,7 +87,11 @@ module RuboCop
|
|
87
87
|
end
|
88
88
|
|
89
89
|
def greater_precedence?(node1, node2)
|
90
|
-
|
90
|
+
node1_precedence = precedence(node1)
|
91
|
+
node2_precedence = precedence(node2)
|
92
|
+
return false unless node1_precedence && node2_precedence
|
93
|
+
|
94
|
+
node2_precedence > node1_precedence
|
91
95
|
end
|
92
96
|
|
93
97
|
def operator_name(node)
|
@@ -10,12 +10,6 @@ module RuboCop
|
|
10
10
|
# explicit by requiring parenthesis around complex range boundaries (anything
|
11
11
|
# that is not a basic literal: numerics, strings, symbols, etc.).
|
12
12
|
#
|
13
|
-
# NOTE: The cop auto-corrects by wrapping the entire boundary in parentheses, which
|
14
|
-
# makes the outcome more explicit but is possible to not be the intention of the
|
15
|
-
# programmer. For this reason, this cop's auto-correct is marked as unsafe (it
|
16
|
-
# will not change the behaviour of the code, but will not necessarily match the
|
17
|
-
# intent of the program).
|
18
|
-
#
|
19
13
|
# This cop can be configured with `RequireParenthesesForMethodChains` in order to
|
20
14
|
# specify whether method chains (including `self.foo`) should be wrapped in parens
|
21
15
|
# by this cop.
|
@@ -23,6 +17,13 @@ module RuboCop
|
|
23
17
|
# NOTE: Regardless of this configuration, if a method receiver is a basic literal
|
24
18
|
# value, it will be wrapped in order to prevent the ambiguity of `1..2.to_a`.
|
25
19
|
#
|
20
|
+
# @safety
|
21
|
+
# The cop auto-corrects by wrapping the entire boundary in parentheses, which
|
22
|
+
# makes the outcome more explicit but is possible to not be the intention of the
|
23
|
+
# programmer. For this reason, this cop's auto-correct is unsafe (it will not
|
24
|
+
# change the behaviour of the code, but will not necessarily match the
|
25
|
+
# intent of the program).
|
26
|
+
#
|
26
27
|
# @example
|
27
28
|
# # bad
|
28
29
|
# x || 1..2
|
@@ -55,7 +56,6 @@ module RuboCop
|
|
55
56
|
#
|
56
57
|
# # good
|
57
58
|
# (a.foo)..(b.bar)
|
58
|
-
#
|
59
59
|
class AmbiguousRange < Base
|
60
60
|
extend AutoCorrector
|
61
61
|
|
@@ -49,7 +49,7 @@ module RuboCop
|
|
49
49
|
def on_if(node)
|
50
50
|
return if node.condition.block_type?
|
51
51
|
|
52
|
-
traverse_node(node.condition
|
52
|
+
traverse_node(node.condition) do |asgn_node|
|
53
53
|
next :skip_children if skip_children?(asgn_node)
|
54
54
|
next if allowed_construct?(asgn_node)
|
55
55
|
|
@@ -83,13 +83,15 @@ module RuboCop
|
|
83
83
|
(safe_assignment_allowed? && safe_assignment?(asgn_node))
|
84
84
|
end
|
85
85
|
|
86
|
-
|
87
|
-
|
88
|
-
|
86
|
+
def traverse_node(node, &block)
|
87
|
+
# if the node is a block, any assignments are irrelevant
|
88
|
+
return if node.block_type?
|
89
|
+
|
90
|
+
result = yield node if ASGN_TYPES.include?(node.type)
|
89
91
|
|
90
92
|
return if result == :skip_children
|
91
93
|
|
92
|
-
node.each_child_node { |child| traverse_node(child,
|
94
|
+
node.each_child_node { |child| traverse_node(child, &block) }
|
93
95
|
end
|
94
96
|
end
|
95
97
|
end
|
@@ -5,15 +5,28 @@ module RuboCop
|
|
5
5
|
module Lint
|
6
6
|
# This cop checks for places where binary operator has identical operands.
|
7
7
|
#
|
8
|
-
# It covers arithmetic operators:
|
8
|
+
# It covers arithmetic operators: `-`, `/`, `%`;
|
9
9
|
# comparison operators: `==`, `===`, `=~`, `>`, `>=`, `<`, `<=`;
|
10
|
-
# bitwise operators: `|`, `^`,
|
10
|
+
# bitwise operators: `|`, `^`, `&`;
|
11
11
|
# boolean operators: `&&`, `||`
|
12
12
|
# and "spaceship" operator - `<=>`.
|
13
13
|
#
|
14
|
-
#
|
15
|
-
#
|
14
|
+
# Simple arithmetic operations are allowed by this cop: `+`, `*`, `**`, `<<` and `>>`.
|
15
|
+
# Although these can be rewritten in a different way, it should not be necessary to
|
16
|
+
# do so. This does not include operations such as `-` or `/` where the result will
|
17
|
+
# always be the same (`x - x` will always be 0; `x / x` will always be 1), and
|
18
|
+
# thus are legitimate offenses.
|
19
|
+
#
|
20
|
+
# @safety
|
21
|
+
# This cop is unsafe as it does not consider side effects when calling methods
|
22
|
+
# and thus can generate false positives, for example:
|
23
|
+
#
|
24
|
+
# [source,ruby]
|
25
|
+
# ----
|
16
26
|
# if wr.take_char == '\0' && wr.take_char == '\0'
|
27
|
+
# # ...
|
28
|
+
# end
|
29
|
+
# ----
|
17
30
|
#
|
18
31
|
# @example
|
19
32
|
# # bad
|
@@ -24,7 +37,7 @@ module RuboCop
|
|
24
37
|
# do_something
|
25
38
|
# end
|
26
39
|
#
|
27
|
-
# def
|
40
|
+
# def child?
|
28
41
|
# left_child || left_child
|
29
42
|
# end
|
30
43
|
#
|
@@ -6,6 +6,11 @@ module RuboCop
|
|
6
6
|
# This cop checks for `:true` and `:false` symbols.
|
7
7
|
# In most cases it would be a typo.
|
8
8
|
#
|
9
|
+
# @safety
|
10
|
+
# Autocorrection is unsafe for this cop because code relying
|
11
|
+
# on `:true` or `:false` symbols will break when those are
|
12
|
+
# changed to actual booleans.
|
13
|
+
#
|
9
14
|
# @example
|
10
15
|
#
|
11
16
|
# # bad
|
@@ -58,12 +58,12 @@ module RuboCop
|
|
58
58
|
end
|
59
59
|
|
60
60
|
def to_s
|
61
|
-
[class_constant, method].compact.join(
|
61
|
+
[class_constant, method].compact.join(delimiter)
|
62
62
|
end
|
63
63
|
|
64
64
|
private
|
65
65
|
|
66
|
-
def
|
66
|
+
def delimiter
|
67
67
|
CLASS_METHOD_DELIMETER
|
68
68
|
end
|
69
69
|
end
|
@@ -81,12 +81,12 @@ module RuboCop
|
|
81
81
|
end
|
82
82
|
|
83
83
|
def to_s
|
84
|
-
[class_constant, method].compact.join(
|
84
|
+
[class_constant, method].compact.join(delimiter)
|
85
85
|
end
|
86
86
|
|
87
87
|
private
|
88
88
|
|
89
|
-
def
|
89
|
+
def delimiter
|
90
90
|
instance_method? ? INSTANCE_METHOD_DELIMETER : CLASS_METHOD_DELIMETER
|
91
91
|
end
|
92
92
|
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Lint
|
6
|
-
# This cop checks constructors for disjunctive assignments that should
|
6
|
+
# This cop checks constructors for disjunctive assignments (`||=`) that should
|
7
7
|
# be plain assignments.
|
8
8
|
#
|
9
9
|
# So far, this cop is only concerned with disjunctive assignment of
|
@@ -12,6 +12,29 @@ module RuboCop
|
|
12
12
|
# In ruby, an instance variable is nil until a value is assigned, so the
|
13
13
|
# disjunction is unnecessary. A plain assignment has the same effect.
|
14
14
|
#
|
15
|
+
# @safety
|
16
|
+
# This cop is unsafe because it can register a false positive when a
|
17
|
+
# method is redefined in a subclass that calls super. For example:
|
18
|
+
#
|
19
|
+
# [source,ruby]
|
20
|
+
# ----
|
21
|
+
# class Base
|
22
|
+
# def initialize
|
23
|
+
# @config ||= 'base'
|
24
|
+
# end
|
25
|
+
# end
|
26
|
+
#
|
27
|
+
# class Derived < Base
|
28
|
+
# def initialize
|
29
|
+
# @config = 'derived'
|
30
|
+
# super
|
31
|
+
# end
|
32
|
+
# end
|
33
|
+
# ----
|
34
|
+
#
|
35
|
+
# Without the disjunctive assignment, `Derived` will be unable to override
|
36
|
+
# the value for `@config`.
|
37
|
+
#
|
15
38
|
# @example
|
16
39
|
# # bad
|
17
40
|
# def initialize
|
@@ -49,6 +49,9 @@ module RuboCop
|
|
49
49
|
def on_if(node)
|
50
50
|
return if node.ternary?
|
51
51
|
|
52
|
+
# If the if is on a single line, it'll be handled by `Style/OneLineConditional`
|
53
|
+
return if node.single_line?
|
54
|
+
|
52
55
|
check(node)
|
53
56
|
end
|
54
57
|
|
@@ -66,10 +69,7 @@ module RuboCop
|
|
66
69
|
|
67
70
|
def check_else(node)
|
68
71
|
else_branch = node.else_branch
|
69
|
-
|
70
|
-
return unless else_branch.begin_type?
|
71
|
-
|
72
|
-
first_else = else_branch.children.first
|
72
|
+
first_else = else_branch.begin_type? ? else_branch.children.first : else_branch
|
73
73
|
|
74
74
|
return unless first_else
|
75
75
|
return unless first_else.source_range.line == node.loc.else.line
|
@@ -81,9 +81,13 @@ module RuboCop
|
|
81
81
|
corrector.insert_after(node.loc.else, "\n")
|
82
82
|
|
83
83
|
blank_range = range_between(node.loc.else.end_pos, first_else.loc.expression.begin_pos)
|
84
|
-
indentation = indent(node
|
84
|
+
indentation = indent(node, offset: indentation_width)
|
85
85
|
corrector.replace(blank_range, indentation)
|
86
86
|
end
|
87
|
+
|
88
|
+
def indentation_width
|
89
|
+
@config.for_cop('Layout/IndentationWidth')['Width'] || 2
|
90
|
+
end
|
87
91
|
end
|
88
92
|
end
|
89
93
|
end
|
@@ -3,10 +3,19 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Lint
|
6
|
-
# Prefer using `Hash#compare_by_identity` than using `object_id`
|
6
|
+
# Prefer using `Hash#compare_by_identity` rather than using `object_id`
|
7
|
+
# for hash keys.
|
7
8
|
#
|
8
|
-
# This cop
|
9
|
-
#
|
9
|
+
# This cop looks for hashes being keyed by objects' `object_id`, using
|
10
|
+
# one of these methods: `key?`, `has_key?`, `fetch`, `[]` and `[]=`.
|
11
|
+
#
|
12
|
+
# @safety
|
13
|
+
# This cop is unsafe. Although unlikely, the hash could store both object
|
14
|
+
# ids and other values that need be compared by value, and thus
|
15
|
+
# could be a false positive.
|
16
|
+
#
|
17
|
+
# Furthermore, this cop cannot guarantee that the receiver of one of the
|
18
|
+
# methods (`key?`, etc.) is actually a hash.
|
10
19
|
#
|
11
20
|
# @example
|
12
21
|
# # bad
|
@@ -5,6 +5,11 @@ module RuboCop
|
|
5
5
|
module Lint
|
6
6
|
# This cop checks for interpolation in a single quoted string.
|
7
7
|
#
|
8
|
+
# @safety
|
9
|
+
# This cop is generally safe, but is marked as unsafe because
|
10
|
+
# it is possible to actually intentionally have text inside
|
11
|
+
# `#{...}` in a single quoted string.
|
12
|
+
#
|
8
13
|
# @example
|
9
14
|
#
|
10
15
|
# # bad
|
@@ -5,9 +5,10 @@ module RuboCop
|
|
5
5
|
module Lint
|
6
6
|
# This cop checks for uses of `begin...end while/until something`.
|
7
7
|
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
# loop body
|
8
|
+
# @safety
|
9
|
+
# The cop is unsafe because behaviour can change in some cases, including
|
10
|
+
# if a local variable inside the loop body is accessed outside of it, or if the
|
11
|
+
# loop body raises a `StopIteration` exception (which `Kernel#loop` rescues).
|
11
12
|
#
|
12
13
|
# @example
|
13
14
|
#
|
@@ -14,7 +14,11 @@ module RuboCop
|
|
14
14
|
# `Dir.glob` and `Dir[]` sort globbed results by default in Ruby 3.0.
|
15
15
|
# So all bad cases are acceptable when Ruby 3.0 or higher are used.
|
16
16
|
#
|
17
|
-
# This cop will be deprecated and removed when supporting only Ruby 3.0 and higher.
|
17
|
+
# NOTE: This cop will be deprecated and removed when supporting only Ruby 3.0 and higher.
|
18
|
+
#
|
19
|
+
# @safety
|
20
|
+
# This cop is unsafe in the case where sorting files changes existing
|
21
|
+
# expected behaviour.
|
18
22
|
#
|
19
23
|
# @example
|
20
24
|
#
|
@@ -18,6 +18,11 @@ module RuboCop
|
|
18
18
|
# cop by default). Similarly, Rails' duration methods do not work well
|
19
19
|
# with `Integer()` and can be ignored with `IgnoredMethods`.
|
20
20
|
#
|
21
|
+
# @safety
|
22
|
+
# Autocorrection is unsafe because it is not guaranteed that the
|
23
|
+
# replacement `Kernel` methods are able to properly handle the
|
24
|
+
# input if it is not a standard class.
|
25
|
+
#
|
21
26
|
# @example
|
22
27
|
#
|
23
28
|
# # bad
|
@@ -10,7 +10,7 @@ module RuboCop
|
|
10
10
|
# ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x86_64-darwin19]
|
11
11
|
# -e:1: warning: `_1' is reserved for numbered parameter; consider another name
|
12
12
|
#
|
13
|
-
#
|
13
|
+
# Assigning to a numbered parameter (from `_1` to `_9`) causes an error in Ruby 3.0.
|
14
14
|
#
|
15
15
|
# % ruby -ve '_1 = :value'
|
16
16
|
# ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-darwin19]
|
@@ -9,8 +9,10 @@ module RuboCop
|
|
9
9
|
# should always be the same. If constants are assigned in multiple
|
10
10
|
# locations, the result may vary depending on the order of `require`.
|
11
11
|
#
|
12
|
-
#
|
13
|
-
#
|
12
|
+
# @safety
|
13
|
+
# This cop is unsafe because code that is already conditionally
|
14
|
+
# assigning a constant may have its behaviour changed by
|
15
|
+
# auto-correction.
|
14
16
|
#
|
15
17
|
# @example
|
16
18
|
#
|
@@ -6,6 +6,23 @@ module RuboCop
|
|
6
6
|
# This cops looks for references of Regexp captures that are out of range
|
7
7
|
# and thus always returns nil.
|
8
8
|
#
|
9
|
+
# @safety
|
10
|
+
# This cop is unsafe because it is naive in how it determines what
|
11
|
+
# references are available based on the last encountered regexp, but
|
12
|
+
# it cannot handle some cases, such as conditional regexp matches, which
|
13
|
+
# leads to false positives, such as:
|
14
|
+
#
|
15
|
+
# [source,ruby]
|
16
|
+
# ----
|
17
|
+
# foo ? /(c)(b)/ =~ str : /(b)/ =~ str
|
18
|
+
# do_something if $2
|
19
|
+
# # $2 is defined for the first condition but not the second, however
|
20
|
+
# # the cop will mark this as an offense.
|
21
|
+
# ----
|
22
|
+
#
|
23
|
+
# This might be a good indication of code that should be refactored,
|
24
|
+
# however.
|
25
|
+
#
|
9
26
|
# @example
|
10
27
|
#
|
11
28
|
# /(foo)bar/ =~ 'foobar'
|
@@ -9,6 +9,16 @@ module RuboCop
|
|
9
9
|
# example, mistranslating an array of literals to percent string notation)
|
10
10
|
# rather than meant to be part of the resulting strings.
|
11
11
|
#
|
12
|
+
# @safety
|
13
|
+
# The cop is unsafe because the correction changes the values in the array
|
14
|
+
# and that might have been done purposely.
|
15
|
+
#
|
16
|
+
# [source,ruby]
|
17
|
+
# ----
|
18
|
+
# %w('foo', "bar") #=> ["'foo',", '"bar"']
|
19
|
+
# %w(foo bar) #=> ['foo', 'bar']
|
20
|
+
# ----
|
21
|
+
#
|
12
22
|
# @example
|
13
23
|
#
|
14
24
|
# # bad
|
@@ -13,6 +13,10 @@ module RuboCop
|
|
13
13
|
# `Exception`. Alternatively, make `Exception` a fully qualified class
|
14
14
|
# name with an explicit namespace.
|
15
15
|
#
|
16
|
+
# @safety
|
17
|
+
# This cop is unsafe because it will change the exception class being
|
18
|
+
# raised, which is a change in behaviour.
|
19
|
+
#
|
16
20
|
# @example
|
17
21
|
# # bad
|
18
22
|
# raise Exception, 'Error message here'
|
@@ -7,13 +7,14 @@ module RuboCop
|
|
7
7
|
# `instance_of?`, `kind_of?`, `is_a?`, `eql?`, `respond_to?`, and `equal?` methods
|
8
8
|
# are checked by default. These are customizable with `AllowedMethods` option.
|
9
9
|
#
|
10
|
-
# This cop is marked as unsafe, because auto-correction can change the
|
11
|
-
# return type of the expression. An offending expression that previously
|
12
|
-
# could return `nil` will be auto-corrected to never return `nil`.
|
13
|
-
#
|
14
10
|
# In the example below, the safe navigation operator (`&.`) is unnecessary
|
15
11
|
# because `NilClass` has methods like `respond_to?` and `is_a?`.
|
16
12
|
#
|
13
|
+
# @safety
|
14
|
+
# This cop is unsafe, because auto-correction can change the return type of
|
15
|
+
# the expression. An offending expression that previously could return `nil`
|
16
|
+
# will be auto-corrected to never return `nil`.
|
17
|
+
#
|
17
18
|
# @example
|
18
19
|
# # bad
|
19
20
|
# do_something if attrs&.respond_to?(:[])
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Lint
|
6
|
+
# Checks for uses a file requiring itself with `require_relative`.
|
7
|
+
#
|
8
|
+
# @example
|
9
|
+
#
|
10
|
+
# # bad
|
11
|
+
#
|
12
|
+
# # foo.rb
|
13
|
+
# require_relative 'foo'
|
14
|
+
# require_relative 'bar'
|
15
|
+
#
|
16
|
+
# # good
|
17
|
+
#
|
18
|
+
# # foo.rb
|
19
|
+
# require_relative 'bar'
|
20
|
+
#
|
21
|
+
class RequireRelativeSelfPath < Base
|
22
|
+
include RangeHelp
|
23
|
+
extend AutoCorrector
|
24
|
+
|
25
|
+
MSG = 'Remove the `require_relative` that requires itself.'
|
26
|
+
RESTRICT_ON_SEND = %i[require_relative].freeze
|
27
|
+
|
28
|
+
def on_send(node)
|
29
|
+
return unless (required_feature = node.first_argument)
|
30
|
+
return unless same_file?(processed_source.file_path, required_feature.value)
|
31
|
+
|
32
|
+
add_offense(node) do |corrector|
|
33
|
+
corrector.remove(range_by_whole_lines(node.source_range, include_final_newline: true))
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def same_file?(file_path, required_feature)
|
40
|
+
file_path == required_feature || remove_ext(file_path) == required_feature
|
41
|
+
end
|
42
|
+
|
43
|
+
def remove_ext(file_path)
|
44
|
+
File.basename(file_path, File.extname(file_path))
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -10,7 +10,7 @@ module RuboCop
|
|
10
10
|
#
|
11
11
|
# NOTE: Shadowing of variables in block passed to `Ractor.new` is allowed
|
12
12
|
# because `Ractor` should not access outer variables.
|
13
|
-
# eg. following
|
13
|
+
# eg. following style is encouraged:
|
14
14
|
#
|
15
15
|
# worker_id, pipe = env
|
16
16
|
# Ractor.new(worker_id, pipe) do |worker_id, pipe|
|
@@ -143,7 +143,7 @@ module RuboCop
|
|
143
143
|
# Although some operators can be converted to symbols normally
|
144
144
|
# (ie. `:==`), these are not accepted as hash keys and will
|
145
145
|
# raise a syntax error (eg. `{ ==: ... }`). Therefore, if the
|
146
|
-
# symbol does not start with an
|
146
|
+
# symbol does not start with an alphanumeric or underscore, it
|
147
147
|
# will be ignored.
|
148
148
|
return unless node.value.to_s.match?(/\A[a-z0-9_]/i)
|
149
149
|
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Lint
|
6
|
-
# This cop checks for "triple quotes" (strings
|
6
|
+
# This cop checks for "triple quotes" (strings delimited by any odd number
|
7
7
|
# of quotes greater than 1).
|
8
8
|
#
|
9
9
|
# Ruby allows multiple strings to be implicitly concatenated by just
|