rubocop 1.31.0 → 1.32.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 +23 -0
- data/lib/rubocop/cli.rb +1 -0
- data/lib/rubocop/config.rb +1 -1
- data/lib/rubocop/config_loader_resolver.rb +1 -1
- data/lib/rubocop/cop/base.rb +1 -1
- data/lib/rubocop/cop/generator.rb +4 -0
- data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +60 -0
- data/lib/rubocop/cop/internal_affairs.rb +1 -0
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +4 -3
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +3 -3
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +57 -13
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +10 -0
- data/lib/rubocop/cop/layout/line_length.rb +2 -0
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +4 -1
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +45 -0
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +7 -0
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +10 -4
- data/lib/rubocop/cop/lint/literal_as_condition.rb +5 -0
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +60 -24
- data/lib/rubocop/cop/lint/number_conversion.rb +7 -1
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +7 -0
- data/lib/rubocop/cop/lint/require_range_parentheses.rb +57 -0
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +35 -1
- data/lib/rubocop/cop/metrics/block_length.rb +1 -0
- data/lib/rubocop/cop/metrics/method_length.rb +1 -0
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +4 -0
- data/lib/rubocop/cop/mixin/def_node.rb +2 -7
- data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +12 -14
- data/lib/rubocop/cop/mixin/percent_array.rb +60 -1
- data/lib/rubocop/cop/naming/predicate_name.rb +8 -0
- data/lib/rubocop/cop/style/class_equality_comparison.rb +22 -0
- data/lib/rubocop/cop/style/empty_else.rb +37 -0
- data/lib/rubocop/cop/style/empty_heredoc.rb +59 -0
- data/lib/rubocop/cop/style/fetch_env_var.rb +10 -177
- data/lib/rubocop/cop/style/format_string_token.rb +6 -0
- data/lib/rubocop/cop/style/hash_except.rb +1 -1
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +2 -0
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +12 -0
- data/lib/rubocop/cop/style/module_function.rb +2 -2
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +9 -0
- data/lib/rubocop/cop/style/numeric_predicate.rb +20 -6
- data/lib/rubocop/cop/style/redundant_parentheses.rb +2 -1
- data/lib/rubocop/cop/style/semicolon.rb +27 -3
- data/lib/rubocop/cop/style/symbol_array.rb +2 -3
- data/lib/rubocop/cop/style/symbol_proc.rb +9 -1
- data/lib/rubocop/cop/style/trivial_accessors.rb +3 -0
- data/lib/rubocop/cop/style/word_array.rb +2 -3
- data/lib/rubocop/formatter/simple_text_formatter.rb +2 -0
- data/lib/rubocop/formatter.rb +21 -21
- data/lib/rubocop/options.rb +3 -6
- data/lib/rubocop/rake_task.rb +5 -1
- data/lib/rubocop/rspec/shared_contexts.rb +14 -14
- data/lib/rubocop/rspec/support.rb +14 -0
- data/lib/rubocop/runner.rb +4 -0
- data/lib/rubocop/server/client_command/base.rb +1 -1
- data/lib/rubocop/version.rb +1 -1
- data/lib/rubocop.rb +4 -1
- metadata +23 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 270faf06487f8a915ef6293944db136da6fb51ec09b5613be4b848a471c858bb
|
4
|
+
data.tar.gz: 1c61746959019453862c2e90b8d3250ce3f9815b1eae286f1fd5b73fb267a1cb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 86966e7ff42d0f514a447c8313cc9bdc13020ec1d375e584dba8ebae5bb535a1238380a57d55dfd697c735b3f9259f59939563f4b504f08570304e4ec1c2c7af
|
7
|
+
data.tar.gz: ce35c98b8b51b8b59c6c2aeac880a0618067a68f7080a2e44408a7e283471b2b57f84e57c127144632b61eaa8edf6e4369d4702c2baa222cb3b37fad38606bd5
|
data/README.md
CHANGED
@@ -53,7 +53,7 @@ To prevent an unwanted RuboCop update you might want to use a conservative versi
|
|
53
53
|
in your `Gemfile`:
|
54
54
|
|
55
55
|
```rb
|
56
|
-
gem 'rubocop', '~> 1.
|
56
|
+
gem 'rubocop', '~> 1.32', require: false
|
57
57
|
```
|
58
58
|
|
59
59
|
See [our versioning policy](https://docs.rubocop.org/rubocop/versioning.html) for further details.
|
data/config/default.yml
CHANGED
@@ -977,6 +977,11 @@ Layout/LineContinuationLeadingSpace:
|
|
977
977
|
AutoCorrect: false
|
978
978
|
SafeAutoCorrect: false
|
979
979
|
VersionAdded: '1.31'
|
980
|
+
VersionChanged: '1.32'
|
981
|
+
EnforcedStyle: trailing
|
982
|
+
SupportedStyles:
|
983
|
+
- leading
|
984
|
+
- trailing
|
980
985
|
|
981
986
|
Layout/LineContinuationSpacing:
|
982
987
|
Description: 'Checks the spacing in front of backslash in line continuations.'
|
@@ -1153,6 +1158,13 @@ Layout/MultilineMethodDefinitionBraceLayout:
|
|
1153
1158
|
- new_line
|
1154
1159
|
- same_line
|
1155
1160
|
|
1161
|
+
Layout/MultilineMethodParameterLineBreaks:
|
1162
|
+
Description: >-
|
1163
|
+
Checks that each parameter in a multi-line method definition
|
1164
|
+
starts on a separate line.
|
1165
|
+
Enabled: false
|
1166
|
+
VersionAdded: '1.32'
|
1167
|
+
|
1156
1168
|
Layout/MultilineOperationIndentation:
|
1157
1169
|
Description: >-
|
1158
1170
|
Checks indentation of binary operations that span more than
|
@@ -2128,6 +2140,11 @@ Lint/RequireParentheses:
|
|
2128
2140
|
Enabled: true
|
2129
2141
|
VersionAdded: '0.18'
|
2130
2142
|
|
2143
|
+
Lint/RequireRangeParentheses:
|
2144
|
+
Description: 'Checks that a range literal is enclosed in parentheses when the end of the range is at a line break.'
|
2145
|
+
Enabled: pending
|
2146
|
+
VersionAdded: '1.32'
|
2147
|
+
|
2131
2148
|
Lint/RequireRelativeSelfPath:
|
2132
2149
|
Description: 'Checks for uses a file requiring itself with `require_relative`.'
|
2133
2150
|
Enabled: pending
|
@@ -3495,6 +3512,12 @@ Style/EmptyElse:
|
|
3495
3512
|
- empty
|
3496
3513
|
- nil
|
3497
3514
|
- both
|
3515
|
+
AllowComments: false
|
3516
|
+
|
3517
|
+
Style/EmptyHeredoc:
|
3518
|
+
Description: 'Checks for using empty heredoc to reduce redundancy.'
|
3519
|
+
Enabled: pending
|
3520
|
+
VersionAdded: '1.32'
|
3498
3521
|
|
3499
3522
|
Style/EmptyLambdaParameter:
|
3500
3523
|
Description: 'Omit parens for empty lambda parameters.'
|
data/lib/rubocop/cli.rb
CHANGED
@@ -12,6 +12,7 @@ module RuboCop
|
|
12
12
|
color debug display_style_guide display_time display_only_fail_level_offenses
|
13
13
|
display_only_failed except extra_details fail_level fix_layout format
|
14
14
|
ignore_disable_comments lint only only_guide_cops require safe
|
15
|
+
autocorrect safe_autocorrect autocorrect_all
|
15
16
|
].freeze
|
16
17
|
|
17
18
|
class Finished < StandardError; end
|
data/lib/rubocop/config.rb
CHANGED
@@ -25,7 +25,7 @@ module RuboCop
|
|
25
25
|
@loaded_path = loaded_path
|
26
26
|
@for_cop = Hash.new do |h, cop|
|
27
27
|
qualified_cop_name = Cop::Registry.qualified_cop_name(cop, loaded_path)
|
28
|
-
cop_options = self[qualified_cop_name] || {}
|
28
|
+
cop_options = self[qualified_cop_name].dup || {}
|
29
29
|
cop_options['Enabled'] = enable_cop?(qualified_cop_name, cop_options)
|
30
30
|
h[cop] = cop_options
|
31
31
|
end
|
@@ -179,7 +179,7 @@ module RuboCop
|
|
179
179
|
|
180
180
|
def determine_inherit_mode(hash, key)
|
181
181
|
cop_cfg = hash[key]
|
182
|
-
local_inherit = cop_cfg
|
182
|
+
local_inherit = cop_cfg['inherit_mode'] if cop_cfg.is_a?(Hash)
|
183
183
|
local_inherit || hash['inherit_mode'] || {}
|
184
184
|
end
|
185
185
|
|
data/lib/rubocop/cop/base.rb
CHANGED
@@ -48,7 +48,7 @@ module RuboCop
|
|
48
48
|
InvestigationReport = Struct.new(:cop, :processed_source, :offenses, :corrector)
|
49
49
|
|
50
50
|
# List of methods names to restrict calls for `on_send` / `on_csend`
|
51
|
-
RESTRICT_ON_SEND = Set[].freeze
|
51
|
+
RESTRICT_ON_SEND = Set[].freeze # rubocop:disable InternalAffairs/UselessRestrictOnSend
|
52
52
|
|
53
53
|
# List of cops that should not try to autocorrect at the same
|
54
54
|
# time as this cop
|
@@ -62,6 +62,10 @@ module RuboCop
|
|
62
62
|
# For example
|
63
63
|
MSG = 'Use `#good_method` instead of `#bad_method`.'
|
64
64
|
|
65
|
+
# TODO: Don't call `on_send` unless the method name is in this list
|
66
|
+
# If you don't need `on_send` in the cop you created, remove it.
|
67
|
+
RESTRICT_ON_SEND = %%i[bad_method].freeze
|
68
|
+
|
65
69
|
# @!method bad_method?(node)
|
66
70
|
def_node_matcher :bad_method?, <<~PATTERN
|
67
71
|
(send nil? :bad_method ...)
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module InternalAffairs
|
6
|
+
# Check for useless `RESTRICT_ON_SEND`.
|
7
|
+
#
|
8
|
+
# @example
|
9
|
+
# # bad
|
10
|
+
# class FooCop
|
11
|
+
# RESTRICT_ON_SEND = %i[bad_method].freeze
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# # good
|
15
|
+
# class FooCop
|
16
|
+
# RESTRICT_ON_SEND = %i[bad_method].freeze
|
17
|
+
# def on_send(node)
|
18
|
+
# # ...
|
19
|
+
# end
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# # good
|
23
|
+
# class FooCop
|
24
|
+
# RESTRICT_ON_SEND = %i[bad_method].freeze
|
25
|
+
# def after_send(node)
|
26
|
+
# # ...
|
27
|
+
# end
|
28
|
+
# end
|
29
|
+
#
|
30
|
+
class UselessRestrictOnSend < Base
|
31
|
+
extend AutoCorrector
|
32
|
+
|
33
|
+
MSG = 'Useless `RESTRICT_ON_SEND` is defined.'
|
34
|
+
|
35
|
+
# @!method defined_send_callback?(node)
|
36
|
+
def_node_search :defined_send_callback?, <<~PATTERN
|
37
|
+
{
|
38
|
+
(def {:on_send :after_send} ...)
|
39
|
+
(alias (sym {:on_send :after_send}) _source ...)
|
40
|
+
(send nil? :alias_method {(sym {:on_send :after_send}) (str {"on_send" "after_send"})} _source ...)
|
41
|
+
}
|
42
|
+
PATTERN
|
43
|
+
|
44
|
+
def on_casgn(node)
|
45
|
+
return if !restrict_on_send?(node) || defined_send_callback?(node.parent)
|
46
|
+
|
47
|
+
add_offense(node) do |corrector|
|
48
|
+
corrector.remove(node)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def restrict_on_send?(node)
|
55
|
+
node.name == :RESTRICT_ON_SEND
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -20,3 +20,4 @@ require_relative 'internal_affairs/redundant_method_dispatch_node'
|
|
20
20
|
require_relative 'internal_affairs/style_detected_api_use'
|
21
21
|
require_relative 'internal_affairs/undefined_config'
|
22
22
|
require_relative 'internal_affairs/useless_message_assertion'
|
23
|
+
require_relative 'internal_affairs/useless_restrict_on_send'
|
@@ -120,14 +120,15 @@ module RuboCop
|
|
120
120
|
check_first(first_elem, left_bracket, left_parenthesis, 0)
|
121
121
|
end
|
122
122
|
|
123
|
-
check_right_bracket(array_node.loc.end, left_bracket, left_parenthesis)
|
123
|
+
check_right_bracket(array_node.loc.end, first_elem, left_bracket, left_parenthesis)
|
124
124
|
end
|
125
125
|
|
126
|
-
def check_right_bracket(right_bracket, left_bracket, left_parenthesis)
|
126
|
+
def check_right_bracket(right_bracket, first_elem, left_bracket, left_parenthesis)
|
127
127
|
# if the right bracket is on the same line as the last value, accept
|
128
128
|
return if /\S/.match?(right_bracket.source_line[0...right_bracket.column])
|
129
129
|
|
130
|
-
expected_column, indent_base_type = indent_base(left_bracket,
|
130
|
+
expected_column, indent_base_type = indent_base(left_bracket, first_elem,
|
131
|
+
left_parenthesis)
|
131
132
|
@column_delta = expected_column - right_bracket.column
|
132
133
|
return if @column_delta.zero?
|
133
134
|
|
@@ -158,14 +158,14 @@ module RuboCop
|
|
158
158
|
end
|
159
159
|
end
|
160
160
|
|
161
|
-
check_right_brace(hash_node.loc.end, left_brace, left_parenthesis)
|
161
|
+
check_right_brace(hash_node.loc.end, first_pair, left_brace, left_parenthesis)
|
162
162
|
end
|
163
163
|
|
164
|
-
def check_right_brace(right_brace, left_brace, left_parenthesis)
|
164
|
+
def check_right_brace(right_brace, first_pair, left_brace, left_parenthesis)
|
165
165
|
# if the right brace is on the same line as the last value, accept
|
166
166
|
return if /\S/.match?(right_brace.source_line[0...right_brace.column])
|
167
167
|
|
168
|
-
expected_column, indent_base_type = indent_base(left_brace, left_parenthesis)
|
168
|
+
expected_column, indent_base_type = indent_base(left_brace, first_pair, left_parenthesis)
|
169
169
|
@column_delta = expected_column - right_brace.column
|
170
170
|
return if @column_delta.zero?
|
171
171
|
|
@@ -4,9 +4,10 @@ module RuboCop
|
|
4
4
|
module Cop
|
5
5
|
module Layout
|
6
6
|
# Checks that strings broken over multiple lines (by a backslash) contain
|
7
|
-
# trailing spaces instead of leading spaces
|
7
|
+
# trailing spaces instead of leading spaces (default) or leading spaces
|
8
|
+
# instead of trailing spaces.
|
8
9
|
#
|
9
|
-
# @example
|
10
|
+
# @example EnforcedStyle: trailing (default)
|
10
11
|
# # bad
|
11
12
|
# 'this text contains a lot of' \
|
12
13
|
# ' spaces'
|
@@ -23,18 +24,38 @@ module RuboCop
|
|
23
24
|
# 'this text is too ' \
|
24
25
|
# 'long'
|
25
26
|
#
|
27
|
+
# @example EnforcedStyle: leading
|
28
|
+
# # bad
|
29
|
+
# 'this text contains a lot of ' \
|
30
|
+
# 'spaces'
|
31
|
+
#
|
32
|
+
# # good
|
33
|
+
# 'this text contains a lot of' \
|
34
|
+
# ' spaces'
|
35
|
+
#
|
36
|
+
# # bad
|
37
|
+
# 'this text is too ' \
|
38
|
+
# 'long'
|
39
|
+
#
|
40
|
+
# # good
|
41
|
+
# 'this text is too' \
|
42
|
+
# ' long'
|
26
43
|
class LineContinuationLeadingSpace < Base
|
27
44
|
include RangeHelp
|
28
45
|
|
29
|
-
MSG = 'Move leading spaces to the end of previous line.'
|
30
|
-
|
31
46
|
def on_dstr(node)
|
32
|
-
|
47
|
+
end_of_first_line = node.loc.expression.begin_pos - node.loc.expression.column
|
33
48
|
|
34
49
|
raw_lines(node).each_cons(2) do |raw_line_one, raw_line_two|
|
35
|
-
|
50
|
+
end_of_first_line += raw_line_one.length
|
36
51
|
|
37
|
-
|
52
|
+
next unless continuation?(raw_line_one)
|
53
|
+
|
54
|
+
if enforced_style_leading?
|
55
|
+
investigate_leading_style(raw_line_one, end_of_first_line)
|
56
|
+
else
|
57
|
+
investigate_trailing_style(raw_line_two, end_of_first_line)
|
58
|
+
end
|
38
59
|
end
|
39
60
|
end
|
40
61
|
|
@@ -44,24 +65,47 @@ module RuboCop
|
|
44
65
|
processed_source.raw_source.lines[node.first_line - 1, line_range(node).size]
|
45
66
|
end
|
46
67
|
|
47
|
-
def
|
48
|
-
|
68
|
+
def investigate_leading_style(first_line, end_of_first_line)
|
69
|
+
matches = first_line.match(/(?<trailing_spaces>\s+)(?<ending>['"]\s*\\\n)/)
|
70
|
+
return if matches.nil?
|
49
71
|
|
50
|
-
|
72
|
+
add_offense(leading_offense_range(end_of_first_line, matches))
|
73
|
+
end
|
74
|
+
|
75
|
+
def investigate_trailing_style(second_line, end_of_first_line)
|
76
|
+
matches = second_line.match(/\A(?<beginning>\s*['"])(?<leading_spaces>\s+)/)
|
51
77
|
return if matches.nil?
|
52
78
|
|
53
|
-
add_offense(
|
79
|
+
add_offense(trailing_offense_range(end_of_first_line, matches))
|
54
80
|
end
|
55
81
|
|
56
82
|
def continuation?(line)
|
57
83
|
line.end_with?("\\\n")
|
58
84
|
end
|
59
85
|
|
60
|
-
def
|
61
|
-
|
86
|
+
def leading_offense_range(end_of_first_line, matches)
|
87
|
+
end_pos = end_of_first_line - matches[:ending].length
|
88
|
+
begin_pos = end_pos - matches[:trailing_spaces].length
|
89
|
+
range_between(begin_pos, end_pos)
|
90
|
+
end
|
91
|
+
|
92
|
+
def trailing_offense_range(end_of_first_line, matches)
|
93
|
+
begin_pos = end_of_first_line + matches[:beginning].length
|
62
94
|
end_pos = begin_pos + matches[:leading_spaces].length
|
63
95
|
range_between(begin_pos, end_pos)
|
64
96
|
end
|
97
|
+
|
98
|
+
def message(_range)
|
99
|
+
if enforced_style_leading?
|
100
|
+
'Move trailing spaces to the start of next line.'
|
101
|
+
else
|
102
|
+
'Move leading spaces to the end of previous line.'
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def enforced_style_leading?
|
107
|
+
cop_config['EnforcedStyle'] == 'leading'
|
108
|
+
end
|
65
109
|
end
|
66
110
|
end
|
67
111
|
end
|
@@ -32,10 +32,14 @@ module RuboCop
|
|
32
32
|
extend AutoCorrector
|
33
33
|
|
34
34
|
def on_new_investigation
|
35
|
+
last_line = last_line(processed_source)
|
36
|
+
|
35
37
|
@ignored_ranges = string_literal_ranges(processed_source.ast) +
|
36
38
|
comment_ranges(processed_source.comments)
|
37
39
|
|
38
40
|
processed_source.raw_source.lines.each_with_index do |line, index|
|
41
|
+
break if index >= last_line
|
42
|
+
|
39
43
|
line_number = index + 1
|
40
44
|
investigate(line, line_number)
|
41
45
|
end
|
@@ -103,6 +107,12 @@ module RuboCop
|
|
103
107
|
comments.map(&:loc).map(&:expression)
|
104
108
|
end
|
105
109
|
|
110
|
+
def last_line(processed_source)
|
111
|
+
last_token = processed_source.tokens.last
|
112
|
+
|
113
|
+
last_token ? last_token.line : processed_source.lines.length
|
114
|
+
end
|
115
|
+
|
106
116
|
def ignore_range?(backtick_range)
|
107
117
|
@ignored_ranges.any? { |range| range.contains?(backtick_range) }
|
108
118
|
end
|
@@ -37,6 +37,7 @@ module RuboCop
|
|
37
37
|
# * MultilineHashBraceLayout
|
38
38
|
# * MultilineHashKeyLineBreaks
|
39
39
|
# * MultilineMethodArgumentLineBreaks
|
40
|
+
# * MultilineMethodParameterLineBreaks
|
40
41
|
# * ParameterAlignment
|
41
42
|
#
|
42
43
|
# Together, these cops will pretty print hashes, arrays,
|
@@ -79,6 +80,7 @@ module RuboCop
|
|
79
80
|
alias on_array on_potential_breakable_node
|
80
81
|
alias on_hash on_potential_breakable_node
|
81
82
|
alias on_send on_potential_breakable_node
|
83
|
+
alias on_def on_potential_breakable_node
|
82
84
|
|
83
85
|
def on_new_investigation
|
84
86
|
check_for_breakable_semicolons(processed_source)
|
@@ -6,7 +6,7 @@ module RuboCop
|
|
6
6
|
# Ensures that each argument in a multi-line method call
|
7
7
|
# starts on a separate line.
|
8
8
|
#
|
9
|
-
# NOTE:
|
9
|
+
# NOTE: This cop does not move the first argument, if you want that to
|
10
10
|
# be on a separate line, see `Layout/FirstMethodArgumentLineBreak`.
|
11
11
|
#
|
12
12
|
# @example
|
@@ -22,6 +22,9 @@ module RuboCop
|
|
22
22
|
# b,
|
23
23
|
# c
|
24
24
|
# )
|
25
|
+
#
|
26
|
+
# # good
|
27
|
+
# foo(a, b, c)
|
25
28
|
class MultilineMethodArgumentLineBreaks < Base
|
26
29
|
include MultilineElementLineBreaks
|
27
30
|
extend AutoCorrector
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Layout
|
6
|
+
# Ensures that each parameter in a multi-line method definition
|
7
|
+
# starts on a separate line.
|
8
|
+
#
|
9
|
+
# NOTE: This cop does not move the first argument, if you want that to
|
10
|
+
# be on a separate line, see `Layout/FirstMethodParameterLineBreak`.
|
11
|
+
#
|
12
|
+
# @example
|
13
|
+
#
|
14
|
+
# # bad
|
15
|
+
# def foo(a, b,
|
16
|
+
# c
|
17
|
+
# )
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
# # good
|
21
|
+
# def foo(
|
22
|
+
# a,
|
23
|
+
# b,
|
24
|
+
# c
|
25
|
+
# )
|
26
|
+
# end
|
27
|
+
#
|
28
|
+
# # good
|
29
|
+
# def foo(a, b, c)
|
30
|
+
# end
|
31
|
+
class MultilineMethodParameterLineBreaks < Base
|
32
|
+
include MultilineElementLineBreaks
|
33
|
+
extend AutoCorrector
|
34
|
+
|
35
|
+
MSG = 'Each parameter in a multi-line method definition must start on a separate line.'
|
36
|
+
|
37
|
+
def on_def(node)
|
38
|
+
return if node.arguments.empty?
|
39
|
+
|
40
|
+
check_line_breaks(node, node.arguments)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -7,6 +7,7 @@ module RuboCop
|
|
7
7
|
# when param passed without parentheses.
|
8
8
|
#
|
9
9
|
# This cop can customize ignored methods with `IgnoredMethods`.
|
10
|
+
# By default, there are no methods to ignored.
|
10
11
|
#
|
11
12
|
# @example
|
12
13
|
#
|
@@ -29,10 +30,16 @@ module RuboCop
|
|
29
30
|
# # Lambda arguments require no disambiguation
|
30
31
|
# foo = ->(bar) { bar.baz }
|
31
32
|
#
|
33
|
+
# @example IgnoredMethods: [] (default)
|
34
|
+
#
|
35
|
+
# # bad
|
36
|
+
# expect { do_something }.to change { object.attribute }
|
37
|
+
#
|
32
38
|
# @example IgnoredMethods: [change]
|
33
39
|
#
|
34
40
|
# # good
|
35
41
|
# expect { do_something }.to change { object.attribute }
|
42
|
+
#
|
36
43
|
class AmbiguousBlockAssociation < Base
|
37
44
|
include IgnoredMethods
|
38
45
|
|
@@ -8,22 +8,22 @@ module RuboCop
|
|
8
8
|
# @example
|
9
9
|
#
|
10
10
|
# # bad
|
11
|
-
#
|
12
11
|
# File.exists?(some_path)
|
13
12
|
# Dir.exists?(some_path)
|
14
13
|
# iterator?
|
15
14
|
# ENV.freeze # Calling `Env.freeze` raises `TypeError` since Ruby 2.7.
|
15
|
+
# ENV.clone
|
16
|
+
# ENV.dup # Calling `Env.dup` raises `TypeError` since Ruby 3.1.
|
16
17
|
# Socket.gethostbyname(host)
|
17
18
|
# Socket.gethostbyaddr(host)
|
18
19
|
#
|
19
|
-
# @example
|
20
|
-
#
|
21
20
|
# # good
|
22
|
-
#
|
23
21
|
# File.exist?(some_path)
|
24
22
|
# Dir.exist?(some_path)
|
25
23
|
# block_given?
|
26
24
|
# ENV # `ENV.freeze` cannot prohibit changes to environment variables.
|
25
|
+
# ENV.to_h
|
26
|
+
# ENV.to_h # `ENV.dup` cannot dup `ENV`, use `ENV.to_h` to get a copy of `ENV` as a hash.
|
27
27
|
# Addrinfo.getaddrinfo(nodename, service)
|
28
28
|
# Addrinfo.tcp(host, port).getnameinfo
|
29
29
|
class DeprecatedClassMethods < Base
|
@@ -111,6 +111,12 @@ module RuboCop
|
|
111
111
|
DeprecatedClassMethod.new(:freeze, class_constant: :ENV) =>
|
112
112
|
Replacement.new(nil, class_constant: :ENV),
|
113
113
|
|
114
|
+
DeprecatedClassMethod.new(:clone, class_constant: :ENV) =>
|
115
|
+
Replacement.new(:to_h, class_constant: :ENV),
|
116
|
+
|
117
|
+
DeprecatedClassMethod.new(:dup, class_constant: :ENV) =>
|
118
|
+
Replacement.new(:to_h, class_constant: :ENV),
|
119
|
+
|
114
120
|
DeprecatedClassMethod.new(:gethostbyaddr, class_constant: :Socket, correctable: false) =>
|
115
121
|
Replacement.new(:getnameinfo, class_constant: :Addrinfo, instance_method: true),
|
116
122
|
|
@@ -7,6 +7,9 @@ module RuboCop
|
|
7
7
|
# operands in and/or expressions serving as the conditions of
|
8
8
|
# if/while/until/case-when/case-in.
|
9
9
|
#
|
10
|
+
# NOTE: Literals in `case-in` condition where the match variable is used in
|
11
|
+
# `in` are accepted as a pattern matching.
|
12
|
+
#
|
10
13
|
# @example
|
11
14
|
#
|
12
15
|
# # bad
|
@@ -69,6 +72,8 @@ module RuboCop
|
|
69
72
|
|
70
73
|
def on_case_match(case_match_node)
|
71
74
|
if case_match_node.condition
|
75
|
+
return if case_match_node.descendants.any?(&:match_var_type?)
|
76
|
+
|
72
77
|
check_case(case_match_node)
|
73
78
|
else
|
74
79
|
case_match_node.each_in_pattern do |in_pattern_node|
|