rubocop 0.63.1 → 0.64.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 +10 -1
- data/lib/rubocop.rb +1 -0
- data/lib/rubocop/cop/generator/configuration_injector.rb +5 -4
- data/lib/rubocop/cop/layout/align_parameters.rb +6 -1
- data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +0 -12
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +9 -7
- data/lib/rubocop/cop/layout/dot_position.rb +12 -5
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +1 -0
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -0
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +1 -0
- data/lib/rubocop/cop/layout/indent_array.rb +1 -0
- data/lib/rubocop/cop/layout/indent_hash.rb +1 -0
- data/lib/rubocop/cop/layout/indentation_width.rb +1 -0
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +1 -3
- data/lib/rubocop/cop/layout/space_before_first_arg.rb +1 -0
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -0
- data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +1 -1
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +4 -1
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +2 -1
- data/lib/rubocop/cop/lint/require_parentheses.rb +1 -0
- data/lib/rubocop/cop/mixin/check_assignment.rb +1 -1
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +3 -6
- data/lib/rubocop/cop/mixin/trailing_comma.rb +9 -3
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +10 -7
- data/lib/rubocop/cop/performance/chain_array_allocation.rb +3 -2
- data/lib/rubocop/cop/rails/active_record_aliases.rb +2 -0
- data/lib/rubocop/cop/rails/belongs_to.rb +1 -1
- data/lib/rubocop/cop/rails/date.rb +1 -0
- data/lib/rubocop/cop/rails/dynamic_find_by.rb +1 -0
- data/lib/rubocop/cop/rails/find_by.rb +2 -1
- data/lib/rubocop/cop/rails/link_to_blank.rb +3 -1
- data/lib/rubocop/cop/rails/reflection_class_name.rb +38 -0
- data/lib/rubocop/cop/rails/save_bang.rb +1 -0
- data/lib/rubocop/cop/rails/skips_model_validations.rb +1 -0
- data/lib/rubocop/cop/rails/validation.rb +9 -4
- data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +1 -0
- data/lib/rubocop/cop/style/commented_keyword.rb +3 -3
- data/lib/rubocop/cop/style/empty_literal.rb +8 -5
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +32 -6
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +1 -0
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +2 -1
- data/lib/rubocop/cop/style/one_line_conditional.rb +2 -0
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +1 -0
- data/lib/rubocop/cop/style/send.rb +2 -1
- data/lib/rubocop/cop/style/string_methods.rb +1 -0
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +1 -0
- data/lib/rubocop/cop/style/unneeded_condition.rb +3 -2
- data/lib/rubocop/cop/style/yoda_condition.rb +0 -5
- data/lib/rubocop/platform.rb +1 -1
- data/lib/rubocop/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6c744e17f8f6d38daae30955f4198b9d34856917a7f3ec60b143b2cec3047aff
|
4
|
+
data.tar.gz: 9eb2f51c58eda0558444895d38fa246d21b6a055aadc4d901a320dca2f4ce4eb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c2d2beac27d36a4ef480f55c4125ddab230e1b208b45c90f59b3435f83eaa87f969ef0228bd959a7c25c3a91763bb941a9a778da5f6c9c925f0c9c698a631ef6
|
7
|
+
data.tar.gz: 597c8b8c1454fd8e3734ed545a5d148353d1b8860232ac3eed9b633c15f17fb2399f12874c7ec13191bdcd57709ff12653877080982f900426ff2452c6421a41
|
data/README.md
CHANGED
@@ -53,7 +53,7 @@ haven't reached version 1.0 yet). To prevent an unwanted RuboCop update you
|
|
53
53
|
might want to use a conservative version locking in your `Gemfile`:
|
54
54
|
|
55
55
|
```rb
|
56
|
-
gem 'rubocop', '~> 0.
|
56
|
+
gem 'rubocop', '~> 0.64.0', require: false
|
57
57
|
```
|
58
58
|
|
59
59
|
## Quickstart
|
data/config/default.yml
CHANGED
@@ -2493,6 +2493,11 @@ Rails/RedundantReceiverInWithOptions:
|
|
2493
2493
|
Enabled: true
|
2494
2494
|
VersionAdded: '0.52'
|
2495
2495
|
|
2496
|
+
Rails/ReflectionClassName:
|
2497
|
+
Description: 'Use a string for `class_name` option value in the definition of a reflection.'
|
2498
|
+
Enabled: true
|
2499
|
+
VersionAdded: '0.64'
|
2500
|
+
|
2496
2501
|
Rails/RefuteMethods:
|
2497
2502
|
Description: 'Use `assert_not` methods instead of `refute` methods.'
|
2498
2503
|
Enabled: true
|
@@ -3374,7 +3379,9 @@ Style/LineEndConcatenation:
|
|
3374
3379
|
Use \ instead of + or << to concatenate two string literals at
|
3375
3380
|
line end.
|
3376
3381
|
Enabled: true
|
3382
|
+
SafeAutoCorrect: false
|
3377
3383
|
VersionAdded: '0.18'
|
3384
|
+
VersionChanged: '0.64'
|
3378
3385
|
|
3379
3386
|
Style/MethodCallWithArgsParentheses:
|
3380
3387
|
Description: 'Use parentheses for method calls with arguments.'
|
@@ -3386,6 +3393,7 @@ Style/MethodCallWithArgsParentheses:
|
|
3386
3393
|
IgnoredMethods: []
|
3387
3394
|
AllowParenthesesInMultilineCall: false
|
3388
3395
|
AllowParenthesesInChaining: false
|
3396
|
+
AllowParenthesesInCamelCaseMethod: false
|
3389
3397
|
EnforcedStyle: require_parentheses
|
3390
3398
|
SupportedStyles:
|
3391
3399
|
- require_parentheses
|
@@ -4088,8 +4096,9 @@ Style/SymbolLiteral:
|
|
4088
4096
|
Style/SymbolProc:
|
4089
4097
|
Description: 'Use symbols as procs instead of blocks when possible.'
|
4090
4098
|
Enabled: true
|
4099
|
+
SafeAutoCorrect: false
|
4091
4100
|
VersionAdded: '0.26'
|
4092
|
-
VersionChanged: '0.
|
4101
|
+
VersionChanged: '0.64'
|
4093
4102
|
# A list of method names to be ignored by the check.
|
4094
4103
|
# The names should be fairly unique, otherwise you'll end up ignoring lots of code.
|
4095
4104
|
IgnoredMethods:
|
data/lib/rubocop.rb
CHANGED
@@ -592,6 +592,7 @@ require_relative 'rubocop/cop/rails/presence'
|
|
592
592
|
require_relative 'rubocop/cop/rails/present'
|
593
593
|
require_relative 'rubocop/cop/rails/read_write_attribute'
|
594
594
|
require_relative 'rubocop/cop/rails/redundant_receiver_in_with_options'
|
595
|
+
require_relative 'rubocop/cop/rails/reflection_class_name'
|
595
596
|
require_relative 'rubocop/cop/rails/refute_methods'
|
596
597
|
require_relative 'rubocop/cop/rails/relative_date_constant'
|
597
598
|
require_relative 'rubocop/cop/rails/request_referer'
|
@@ -45,14 +45,15 @@ module RuboCop
|
|
45
45
|
|
46
46
|
def find_target_line
|
47
47
|
configuration_entries.find.with_index do |line, index|
|
48
|
-
next
|
48
|
+
next unless cop_name_line?(line)
|
49
49
|
|
50
|
-
|
50
|
+
return index if badge.to_s < line
|
51
51
|
end
|
52
|
+
configuration_entries.size - 1
|
52
53
|
end
|
53
54
|
|
54
|
-
def
|
55
|
-
yaml
|
55
|
+
def cop_name_line?(yaml)
|
56
|
+
yaml !~ /^[\s#]/
|
56
57
|
end
|
57
58
|
end
|
58
59
|
end
|
@@ -42,6 +42,7 @@ module RuboCop
|
|
42
42
|
|
43
43
|
check_alignment(node.arguments, base_column(node, node.arguments))
|
44
44
|
end
|
45
|
+
alias on_csend on_send
|
45
46
|
alias on_def on_send
|
46
47
|
alias on_defs on_send
|
47
48
|
|
@@ -52,7 +53,11 @@ module RuboCop
|
|
52
53
|
private
|
53
54
|
|
54
55
|
def message(node)
|
55
|
-
type = node && node.parent.send_type? ?
|
56
|
+
type = if node && (node.parent.send_type? || node.parent.csend_type?)
|
57
|
+
'call'
|
58
|
+
else
|
59
|
+
'definition'
|
60
|
+
end
|
56
61
|
msg = fixed_indentation? ? FIXED_INDENT_MSG : ALIGN_PARAMS_MSG
|
57
62
|
|
58
63
|
format(msg, type: type)
|
@@ -74,10 +74,6 @@ module RuboCop
|
|
74
74
|
indent_level(heredoc_opening(node))
|
75
75
|
end
|
76
76
|
|
77
|
-
def empty_heredoc?(node)
|
78
|
-
node.loc.heredoc_body.source.empty? || !contents_indentation(node)
|
79
|
-
end
|
80
|
-
|
81
77
|
def argument_indentation_correct?(node)
|
82
78
|
return unless node.argument? || node.chained?
|
83
79
|
|
@@ -86,14 +82,6 @@ module RuboCop
|
|
86
82
|
) == closing_indentation(node)
|
87
83
|
end
|
88
84
|
|
89
|
-
def contents_indentation(node)
|
90
|
-
source_lines = node.loc.heredoc_body.source.split("\n")
|
91
|
-
|
92
|
-
source_lines.reject(&:empty?).map do |line|
|
93
|
-
indent_level(line)
|
94
|
-
end.min
|
95
|
-
end
|
96
|
-
|
97
85
|
def closing_indentation(node)
|
98
86
|
indent_level(heredoc_closing(node))
|
99
87
|
end
|
@@ -78,6 +78,7 @@ module RuboCop
|
|
78
78
|
def on_send(node)
|
79
79
|
check(node, node.arguments)
|
80
80
|
end
|
81
|
+
alias on_csend on_send
|
81
82
|
|
82
83
|
def on_begin(node)
|
83
84
|
check(node, node.children)
|
@@ -142,15 +143,16 @@ module RuboCop
|
|
142
143
|
end
|
143
144
|
|
144
145
|
def expected_column(left_paren, elements)
|
145
|
-
if
|
146
|
-
all_elements_aligned?(elements)
|
147
|
-
left_paren.column
|
148
|
-
else
|
146
|
+
if line_break_after_left_paren?(left_paren, elements)
|
149
147
|
source_indent = processed_source
|
150
|
-
.line_indentation(
|
148
|
+
.line_indentation(first_argument_line(elements))
|
151
149
|
new_indent = source_indent - indentation_width
|
152
150
|
|
153
151
|
new_indent < 0 ? 0 : new_indent
|
152
|
+
elsif all_elements_aligned?(elements)
|
153
|
+
left_paren.column
|
154
|
+
else
|
155
|
+
processed_source.line_indentation(first_argument_line(elements))
|
154
156
|
end
|
155
157
|
end
|
156
158
|
|
@@ -161,9 +163,9 @@ module RuboCop
|
|
161
163
|
.count == 1
|
162
164
|
end
|
163
165
|
|
164
|
-
def
|
166
|
+
def first_argument_line(elements)
|
165
167
|
elements
|
166
|
-
.
|
168
|
+
.first
|
167
169
|
.loc
|
168
170
|
.first_line
|
169
171
|
end
|
@@ -26,7 +26,7 @@ module RuboCop
|
|
26
26
|
include ConfigurableEnforcedStyle
|
27
27
|
|
28
28
|
def on_send(node)
|
29
|
-
return unless node.dot?
|
29
|
+
return unless node.dot? || ampersand_dot?(node)
|
30
30
|
|
31
31
|
if proper_dot_position?(node)
|
32
32
|
correct_style_detected
|
@@ -34,23 +34,26 @@ module RuboCop
|
|
34
34
|
add_offense(node, location: :dot) { opposite_style_detected }
|
35
35
|
end
|
36
36
|
end
|
37
|
+
alias on_csend on_send
|
37
38
|
|
38
39
|
def autocorrect(node)
|
39
40
|
lambda do |corrector|
|
41
|
+
dot = node.loc.dot.source
|
40
42
|
corrector.remove(node.loc.dot)
|
41
43
|
case style
|
42
44
|
when :leading
|
43
|
-
corrector.insert_before(selector_range(node),
|
45
|
+
corrector.insert_before(selector_range(node), dot)
|
44
46
|
when :trailing
|
45
|
-
corrector.insert_after(node.receiver.source_range,
|
47
|
+
corrector.insert_after(node.receiver.source_range, dot)
|
46
48
|
end
|
47
49
|
end
|
48
50
|
end
|
49
51
|
|
50
52
|
private
|
51
53
|
|
52
|
-
def message(
|
53
|
-
|
54
|
+
def message(node)
|
55
|
+
dot = node.loc.dot.source
|
56
|
+
"Place the #{dot} on the " +
|
54
57
|
case style
|
55
58
|
when :leading
|
56
59
|
'next line, together with the method name.'
|
@@ -92,6 +95,10 @@ module RuboCop
|
|
92
95
|
# l.(1) has no selector, so we use the opening parenthesis instead
|
93
96
|
node.loc.selector || node.loc.begin
|
94
97
|
end
|
98
|
+
|
99
|
+
def ampersand_dot?(node)
|
100
|
+
node.loc.respond_to?(:dot) && node.loc.dot && node.loc.dot.is?('&.')
|
101
|
+
end
|
95
102
|
end
|
96
103
|
end
|
97
104
|
end
|
@@ -30,7 +30,6 @@ module RuboCop
|
|
30
30
|
ANCESTOR_TYPES = %i[kwbegin def defs class module].freeze
|
31
31
|
RUBY_2_5_ANCESTOR_TYPES = (ANCESTOR_TYPES + %i[block]).freeze
|
32
32
|
ANCESTOR_TYPES_WITH_ACCESS_MODIFIERS = %i[def defs].freeze
|
33
|
-
ASSIGNMENT_TYPES = %i[lvasgn].freeze
|
34
33
|
|
35
34
|
def on_resbody(node)
|
36
35
|
check(node) unless modifier?(node)
|
@@ -141,8 +140,7 @@ module RuboCop
|
|
141
140
|
def assignment_node(node)
|
142
141
|
assignment_node = node.ancestors.first
|
143
142
|
return nil unless
|
144
|
-
assignment_node &&
|
145
|
-
ASSIGNMENT_TYPES.include?(assignment_node.type)
|
143
|
+
assignment_node && assignment_node.assignment?
|
146
144
|
|
147
145
|
assignment_node
|
148
146
|
end
|
@@ -31,13 +31,13 @@ module RuboCop
|
|
31
31
|
|
32
32
|
private
|
33
33
|
|
34
|
+
# @param [DefNode] node a constructor definition
|
34
35
|
def check(node)
|
35
36
|
return unless node.method_name == :initialize
|
36
37
|
|
37
38
|
check_body(node.body)
|
38
39
|
end
|
39
40
|
|
40
|
-
# @param [DefNode] node a constructor definition
|
41
41
|
def check_body(body)
|
42
42
|
return if body.nil?
|
43
43
|
|
@@ -24,7 +24,9 @@ module RuboCop
|
|
24
24
|
class EachWithObjectArgument < Cop
|
25
25
|
MSG = 'The argument to each_with_object can not be immutable.'.freeze
|
26
26
|
|
27
|
-
def_node_matcher :each_with_object?,
|
27
|
+
def_node_matcher :each_with_object?, <<-PATTERN
|
28
|
+
({send csend} _ :each_with_object $_)
|
29
|
+
PATTERN
|
28
30
|
|
29
31
|
def on_send(node)
|
30
32
|
each_with_object?(node) do |arg|
|
@@ -33,6 +35,7 @@ module RuboCop
|
|
33
35
|
add_offense(node)
|
34
36
|
end
|
35
37
|
end
|
38
|
+
alias on_csend on_send
|
36
39
|
end
|
37
40
|
end
|
38
41
|
end
|
@@ -35,6 +35,7 @@ module RuboCop
|
|
35
35
|
|
36
36
|
add_offense(nil, location: range)
|
37
37
|
end
|
38
|
+
alias on_csend on_send
|
38
39
|
|
39
40
|
private
|
40
41
|
|
@@ -50,7 +51,7 @@ module RuboCop
|
|
50
51
|
# Escape question mark if any.
|
51
52
|
method_regexp = Regexp.escape(node.method_name)
|
52
53
|
|
53
|
-
match = without_receiver.match(/^\s
|
54
|
+
match = without_receiver.match(/^\s*&?\.?\s*#{method_regexp}(\s+)\(/)
|
54
55
|
match ? match.captures[0].length : 0
|
55
56
|
end
|
56
57
|
|
@@ -54,12 +54,9 @@ module RuboCop
|
|
54
54
|
end
|
55
55
|
|
56
56
|
def variable_alignment?(whole_expression, rhs, end_alignment_style)
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
when :start_of_line
|
61
|
-
true
|
62
|
-
end
|
57
|
+
return if end_alignment_style == :keyword
|
58
|
+
|
59
|
+
!line_break_before_keyword?(whole_expression, rhs)
|
63
60
|
end
|
64
61
|
|
65
62
|
def line_break_before_keyword?(whole_expression, rhs)
|
@@ -17,11 +17,13 @@ module RuboCop
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def check(node, items, kind, begin_pos, end_pos)
|
20
|
-
return if heredoc?(items.last)
|
21
|
-
|
22
20
|
after_last_item = range_between(begin_pos, end_pos)
|
23
21
|
|
24
|
-
|
22
|
+
# If there is any heredoc in items, then match the comma succeeding
|
23
|
+
# any whitespace (except newlines), otherwise allow for newlines
|
24
|
+
comma_regex = any_heredoc?(items) ? /\A[^\S\n]*,/ : /\A\s*,/
|
25
|
+
comma_offset = after_last_item.source =~ comma_regex &&
|
26
|
+
after_last_item.source.index(',')
|
25
27
|
|
26
28
|
if comma_offset && !inside_comment?(after_last_item, comma_offset)
|
27
29
|
check_comma(node, kind, after_last_item.begin_pos + comma_offset)
|
@@ -167,6 +169,10 @@ module RuboCop
|
|
167
169
|
false
|
168
170
|
end
|
169
171
|
|
172
|
+
def any_heredoc?(items)
|
173
|
+
items.any? { |item| heredoc?(item) }
|
174
|
+
end
|
175
|
+
|
170
176
|
def heredoc?(node)
|
171
177
|
return false unless node.is_a?(RuboCop::AST::Node)
|
172
178
|
return true if node.loc.respond_to?(:heredoc_body)
|
@@ -132,9 +132,7 @@ module RuboCop
|
|
132
132
|
variable = ivar_assign.children.first
|
133
133
|
variable_name = variable.to_s.sub('@', '')
|
134
134
|
|
135
|
-
|
136
|
-
|
137
|
-
variable_name.sub(/\A_/, '') == method_name.sub(/\A_/, '')
|
135
|
+
variable_name_candidates(method_name).include?(variable_name)
|
138
136
|
end
|
139
137
|
|
140
138
|
def message(variable)
|
@@ -152,14 +150,19 @@ module RuboCop
|
|
152
150
|
style == :required ? "_#{suggestion}" : suggestion
|
153
151
|
end
|
154
152
|
|
155
|
-
def
|
153
|
+
def variable_name_candidates(method_name)
|
154
|
+
no_underscore = method_name.sub(/\A_/, '')
|
155
|
+
with_underscore = "_#{method_name}"
|
156
156
|
case style
|
157
157
|
when :required
|
158
|
-
|
158
|
+
[with_underscore,
|
159
|
+
method_name.start_with?('_') ? method_name : nil].compact
|
159
160
|
when :disallowed
|
160
|
-
|
161
|
+
[method_name, no_underscore]
|
162
|
+
when :optional
|
163
|
+
[method_name, with_underscore, no_underscore]
|
161
164
|
else
|
162
|
-
|
165
|
+
raise 'Unreachable'
|
163
166
|
end
|
164
167
|
end
|
165
168
|
end
|
@@ -47,8 +47,9 @@ module RuboCop
|
|
47
47
|
HAS_MUTATION_ALTERNATIVE = ':collect :compact :flatten :map :reject '\
|
48
48
|
':reverse :rotate :select :shuffle :sort '\
|
49
49
|
':uniq '.freeze
|
50
|
-
MSG = 'Use `%<method>s
|
51
|
-
'
|
50
|
+
MSG = 'Use unchained `%<method>s!` and `%<second_method>s!` '\
|
51
|
+
'(followed by `return array` if required) instead of chaining '\
|
52
|
+
'`%<method>s...%<second_method>s`.'.freeze
|
52
53
|
|
53
54
|
def_node_matcher :flat_map_candidate?, <<-PATTERN
|
54
55
|
{
|
@@ -19,7 +19,7 @@ module RuboCop
|
|
19
19
|
# In the case that the developer is doing `required: false`, we
|
20
20
|
# definitely want to autocorrect to `optional: true`.
|
21
21
|
#
|
22
|
-
# However, without knowing whether they've set
|
22
|
+
# However, without knowing whether they've set overridden the default
|
23
23
|
# value of `config.active_record.belongs_to_required_by_default`, we
|
24
24
|
# can't say whether it's safe to remove `required: true` or whether we
|
25
25
|
# should replace it with `optional: false` (or, similarly, remove a
|
@@ -20,7 +20,7 @@ module RuboCop
|
|
20
20
|
TARGET_SELECTORS = %i[first take].freeze
|
21
21
|
|
22
22
|
def_node_matcher :where_first?, <<-PATTERN
|
23
|
-
(send (send _ :where ...) {:first :take})
|
23
|
+
(send ({send csend} _ :where ...) {:first :take})
|
24
24
|
PATTERN
|
25
25
|
|
26
26
|
def on_send(node)
|
@@ -32,6 +32,7 @@ module RuboCop
|
|
32
32
|
add_offense(node, location: range,
|
33
33
|
message: format(MSG, method: node.method_name))
|
34
34
|
end
|
35
|
+
alias on_csend on_send
|
35
36
|
|
36
37
|
def autocorrect(node)
|
37
38
|
# Don't autocorrect where(...).first, because it can return different
|
@@ -74,7 +74,9 @@ module RuboCop
|
|
74
74
|
def add_rel(send_node, offence_node, corrector)
|
75
75
|
quote_style = offence_node.children.last.source[0]
|
76
76
|
new_rel_exp = ", rel: #{quote_style}noopener#{quote_style}"
|
77
|
-
|
77
|
+
range = send_node.arguments.last.source_range
|
78
|
+
|
79
|
+
corrector.insert_after(range, new_rel_exp)
|
78
80
|
end
|
79
81
|
|
80
82
|
def contains_noopener?(str)
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Rails
|
6
|
+
# This cop checks if the value of the option `class_name`, in
|
7
|
+
# the definition of a reflection is a string.
|
8
|
+
#
|
9
|
+
# @example
|
10
|
+
# # bad
|
11
|
+
# has_many :accounts, class_name: Account
|
12
|
+
# has_many :accounts, class_name: Account.name
|
13
|
+
#
|
14
|
+
# # good
|
15
|
+
# has_many :accounts, class_name: 'Account'
|
16
|
+
class ReflectionClassName < Cop
|
17
|
+
MSG = 'Use a string has value for a class_name.'.freeze
|
18
|
+
|
19
|
+
def_node_matcher :association_with_options?, <<-PATTERN
|
20
|
+
(send nil? {:has_many :has_one :belongs_to} _ (hash $...))
|
21
|
+
PATTERN
|
22
|
+
|
23
|
+
def_node_search :reflection_class_name, <<-PATTERN
|
24
|
+
(pair (sym :class_name) !str)
|
25
|
+
PATTERN
|
26
|
+
|
27
|
+
def on_send(node)
|
28
|
+
return unless association_with_options?(node)
|
29
|
+
|
30
|
+
reflection_class_name = reflection_class_name(node).first
|
31
|
+
return unless reflection_class_name
|
32
|
+
|
33
|
+
add_offense(node, location: reflection_class_name.loc.expression)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -57,6 +57,9 @@ module RuboCop
|
|
57
57
|
end
|
58
58
|
|
59
59
|
def autocorrect(node)
|
60
|
+
last_argument = node.arguments.last
|
61
|
+
return if !last_argument.literal? && !last_argument.splat_type?
|
62
|
+
|
60
63
|
lambda do |corrector|
|
61
64
|
corrector.replace(node.loc.selector, 'validates')
|
62
65
|
correct_validate_type(corrector, node)
|
@@ -75,12 +78,14 @@ module RuboCop
|
|
75
78
|
end
|
76
79
|
|
77
80
|
def correct_validate_type(corrector, node)
|
78
|
-
|
81
|
+
last_argument = node.arguments.last
|
79
82
|
validate_type = node.method_name.to_s.split('_')[1]
|
80
83
|
|
81
|
-
if
|
82
|
-
corrector.replace(
|
83
|
-
|
84
|
+
if last_argument.hash_type?
|
85
|
+
corrector.replace(
|
86
|
+
last_argument.loc.expression,
|
87
|
+
"#{validate_type}: #{braced_options(last_argument)}"
|
88
|
+
)
|
84
89
|
else
|
85
90
|
corrector.insert_after(node.loc.expression,
|
86
91
|
", #{validate_type}: true")
|
@@ -6,8 +6,8 @@ module RuboCop
|
|
6
6
|
# This cop checks for comments put on the same line as some keywords.
|
7
7
|
# These keywords are: `begin`, `class`, `def`, `end`, `module`.
|
8
8
|
#
|
9
|
-
# Note that some comments (
|
10
|
-
# allowed.
|
9
|
+
# Note that some comments (`:nodoc:`, `:yields:, and `rubocop:disable`)
|
10
|
+
# are allowed.
|
11
11
|
#
|
12
12
|
# @example
|
13
13
|
# # bad
|
@@ -59,7 +59,7 @@ module RuboCop
|
|
59
59
|
private
|
60
60
|
|
61
61
|
KEYWORDS = %w[begin class def end module].freeze
|
62
|
-
ALLOWED_COMMENTS = %w[:nodoc: rubocop:disable].freeze
|
62
|
+
ALLOWED_COMMENTS = %w[:nodoc: :yields: rubocop:disable].freeze
|
63
63
|
|
64
64
|
def offensive?(line)
|
65
65
|
line = line.lstrip
|
@@ -67,10 +67,13 @@ module RuboCop
|
|
67
67
|
end
|
68
68
|
|
69
69
|
def first_argument_unparenthesized?(node)
|
70
|
-
|
70
|
+
parent = node.parent
|
71
|
+
unless parent && %i[send super zsuper].include?(parent.type)
|
72
|
+
return false
|
73
|
+
end
|
71
74
|
|
72
|
-
|
73
|
-
|
75
|
+
node.object_id == parent.arguments.first.object_id &&
|
76
|
+
!parentheses?(node.parent)
|
74
77
|
end
|
75
78
|
|
76
79
|
def replacement_range(node)
|
@@ -79,7 +82,7 @@ module RuboCop
|
|
79
82
|
# `some_method {}` is not same as `some_method Hash.new`
|
80
83
|
# because the braces are interpreted as a block. We will have
|
81
84
|
# to rewrite the arguments to wrap them in parenthesis.
|
82
|
-
|
85
|
+
args = node.parent.arguments
|
83
86
|
|
84
87
|
range_between(args[0].loc.expression.begin_pos - 1,
|
85
88
|
args[-1].loc.expression.end_pos)
|
@@ -107,7 +110,7 @@ module RuboCop
|
|
107
110
|
# `some_method {}` is not same as `some_method Hash.new`
|
108
111
|
# because the braces are interpreted as a block. We will have
|
109
112
|
# to rewrite the arguments to wrap them in parenthesis.
|
110
|
-
|
113
|
+
args = node.parent.arguments
|
111
114
|
"(#{args[1..-1].map(&:source).unshift('{}').join(', ')})"
|
112
115
|
else
|
113
116
|
'{}'
|
@@ -10,7 +10,7 @@ module RuboCop
|
|
10
10
|
# Additional methods can be added to the `IgnoredMethods` list. This
|
11
11
|
# option is valid only in the default style.
|
12
12
|
#
|
13
|
-
# In the alternative style (omit_parentheses), there are
|
13
|
+
# In the alternative style (omit_parentheses), there are three additional
|
14
14
|
# options.
|
15
15
|
#
|
16
16
|
# 1. `AllowParenthesesInChaining` is `false` by default. Setting it to
|
@@ -21,6 +21,12 @@ module RuboCop
|
|
21
21
|
# to `true` allows the presence of parentheses in multi-line method
|
22
22
|
# calls.
|
23
23
|
#
|
24
|
+
# 3. `AllowParenthesesInCamelCaseMethod` is `false` by default. This
|
25
|
+
# allows the presence of parentheses when calling a method whose name
|
26
|
+
# begins with a capital letter and which has no arguments. Setting it
|
27
|
+
# to `true` allows the presence of parentheses in such a method call
|
28
|
+
# even with arguments.
|
29
|
+
#
|
24
30
|
# @example EnforcedStyle: require_parentheses (default)
|
25
31
|
#
|
26
32
|
#
|
@@ -106,6 +112,22 @@ module RuboCop
|
|
106
112
|
#
|
107
113
|
# # good
|
108
114
|
# foo().bar 1
|
115
|
+
#
|
116
|
+
# # AllowParenthesesInCamelCaseMethod: false (default)
|
117
|
+
#
|
118
|
+
# # bad
|
119
|
+
# Array(1)
|
120
|
+
#
|
121
|
+
# # good
|
122
|
+
# Array 1
|
123
|
+
#
|
124
|
+
# # AllowParenthesesInCamelCaseMethod: true
|
125
|
+
#
|
126
|
+
# # good
|
127
|
+
# Array(1)
|
128
|
+
#
|
129
|
+
# # good
|
130
|
+
# Array 1
|
109
131
|
class MethodCallWithArgsParentheses < Cop
|
110
132
|
include ConfigurableEnforcedStyle
|
111
133
|
include IgnoredMethods
|
@@ -120,6 +142,7 @@ module RuboCop
|
|
120
142
|
add_offense_for_omit_parentheses(node)
|
121
143
|
end
|
122
144
|
end
|
145
|
+
alias on_csend on_send
|
123
146
|
alias on_super on_send
|
124
147
|
alias on_yield on_send
|
125
148
|
|
@@ -155,7 +178,7 @@ module RuboCop
|
|
155
178
|
return unless node.parenthesized?
|
156
179
|
return if node.implicit_call?
|
157
180
|
return if super_call_without_arguments?(node)
|
158
|
-
return if
|
181
|
+
return if allowed_camel_case_method_call?(node)
|
159
182
|
return if legitimate_call_with_parentheses?(node)
|
160
183
|
|
161
184
|
add_offense(node, location: node.loc.begin.join(node.loc.end))
|
@@ -221,8 +244,10 @@ module RuboCop
|
|
221
244
|
node.super_type? && node.arguments.none?
|
222
245
|
end
|
223
246
|
|
224
|
-
def
|
225
|
-
node.camel_case_method? &&
|
247
|
+
def allowed_camel_case_method_call?(node)
|
248
|
+
node.camel_case_method? &&
|
249
|
+
(node.arguments.none? ||
|
250
|
+
cop_config['AllowParenthesesInCamelCaseMethod'])
|
226
251
|
end
|
227
252
|
|
228
253
|
def legitimate_call_with_parentheses?(node)
|
@@ -264,13 +289,14 @@ module RuboCop
|
|
264
289
|
end
|
265
290
|
|
266
291
|
def call_with_braced_block?(node)
|
267
|
-
node.send_type?
|
292
|
+
(node.send_type? || node.super_type?) &&
|
293
|
+
node.block_node && node.block_node.braces?
|
268
294
|
end
|
269
295
|
|
270
296
|
def call_as_argument_or_chain?(node)
|
271
297
|
node.parent &&
|
272
298
|
(node.parent.send_type? && !assigned_before?(node.parent, node) ||
|
273
|
-
node.parent.csend_type?)
|
299
|
+
node.parent.csend_type? || node.parent.super_type?)
|
274
300
|
end
|
275
301
|
|
276
302
|
def hash_literal_in_arguments?(node)
|
@@ -20,7 +20,7 @@ module RuboCop
|
|
20
20
|
def on_send(node)
|
21
21
|
return unless node.parenthesized?
|
22
22
|
|
23
|
-
node.each_child_node(:send) do |nested|
|
23
|
+
node.each_child_node(:send, :csend) do |nested|
|
24
24
|
next if allowed_omission?(nested)
|
25
25
|
|
26
26
|
add_offense(nested,
|
@@ -28,6 +28,7 @@ module RuboCop
|
|
28
28
|
message: format(MSG, source: nested.source))
|
29
29
|
end
|
30
30
|
end
|
31
|
+
alias on_csend on_send
|
31
32
|
|
32
33
|
def autocorrect(nested)
|
33
34
|
first_arg = nested.first_argument.source_range
|
@@ -17,13 +17,14 @@ module RuboCop
|
|
17
17
|
MSG = 'Prefer `Object#__send__` or `Object#public_send` to ' \
|
18
18
|
'`send`.'.freeze
|
19
19
|
|
20
|
-
def_node_matcher :sending?, '(send _ :send ...)'
|
20
|
+
def_node_matcher :sending?, '({send csend} _ :send ...)'
|
21
21
|
|
22
22
|
def on_send(node)
|
23
23
|
return unless sending?(node) && node.arguments?
|
24
24
|
|
25
25
|
add_offense(node, location: :selector)
|
26
26
|
end
|
27
|
+
alias on_csend on_send
|
27
28
|
end
|
28
29
|
end
|
29
30
|
end
|
@@ -96,8 +96,9 @@ module RuboCop
|
|
96
96
|
end
|
97
97
|
|
98
98
|
def make_ternary_form(node)
|
99
|
-
|
100
|
-
|
99
|
+
_condition, if_branch, else_branch = *node
|
100
|
+
ternary_form = [if_branch.source,
|
101
|
+
else_source(else_branch)].join(' || ')
|
101
102
|
|
102
103
|
if node.parent && node.parent.send_type?
|
103
104
|
"(#{ternary_form})"
|
data/lib/rubocop/platform.rb
CHANGED
data/lib/rubocop/version.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
# This module holds the RuboCop version information.
|
5
5
|
module Version
|
6
|
-
STRING = '0.
|
6
|
+
STRING = '0.64.0'.freeze
|
7
7
|
|
8
8
|
MSG = '%<version>s (using Parser %<parser_version>s, running on ' \
|
9
9
|
'%<ruby_engine>s %<ruby_version>s %<ruby_platform>s)'.freeze
|
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: 0.
|
4
|
+
version: 0.64.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: 2019-
|
13
|
+
date: 2019-02-10 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: jaro_winkler
|
@@ -572,6 +572,7 @@ files:
|
|
572
572
|
- lib/rubocop/cop/rails/present.rb
|
573
573
|
- lib/rubocop/cop/rails/read_write_attribute.rb
|
574
574
|
- lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb
|
575
|
+
- lib/rubocop/cop/rails/reflection_class_name.rb
|
575
576
|
- lib/rubocop/cop/rails/refute_methods.rb
|
576
577
|
- lib/rubocop/cop/rails/relative_date_constant.rb
|
577
578
|
- lib/rubocop/cop/rails/request_referer.rb
|