rubocop 0.86.0 → 0.87.1
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 +46 -4
- data/lib/rubocop.rb +8 -1
- data/lib/rubocop/cli.rb +0 -2
- data/lib/rubocop/cli/command/auto_genenerate_config.rb +40 -5
- data/lib/rubocop/cli/command/show_cops.rb +1 -1
- data/lib/rubocop/config_loader.rb +21 -62
- data/lib/rubocop/config_obsoletion.rb +0 -1
- data/lib/rubocop/cop/autocorrect_logic.rb +13 -23
- data/lib/rubocop/cop/base.rb +399 -0
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +10 -20
- data/lib/rubocop/cop/commissioner.rb +48 -50
- data/lib/rubocop/cop/cop.rb +85 -236
- data/lib/rubocop/cop/corrector.rb +38 -115
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +1 -1
- data/lib/rubocop/cop/generator.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +11 -14
- data/lib/rubocop/cop/layout/case_indentation.rb +18 -19
- data/lib/rubocop/cop/layout/class_structure.rb +2 -37
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +1 -8
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +4 -0
- data/lib/rubocop/cop/layout/hash_alignment.rb +1 -2
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +0 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +19 -25
- data/lib/rubocop/cop/legacy/corrections_proxy.rb +49 -0
- data/lib/rubocop/cop/legacy/corrector.rb +29 -0
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +4 -4
- data/lib/rubocop/cop/lint/interpolation_check.rb +13 -0
- data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +2 -2
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +8 -3
- data/lib/rubocop/cop/lint/rand_one.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +27 -23
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +2 -2
- data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +8 -0
- data/lib/rubocop/cop/lint/syntax.rb +11 -26
- data/lib/rubocop/cop/lint/unused_method_argument.rb +1 -1
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +1 -1
- data/lib/rubocop/cop/metrics/block_length.rb +22 -0
- data/lib/rubocop/cop/metrics/class_length.rb +25 -2
- data/lib/rubocop/cop/metrics/method_length.rb +23 -0
- data/lib/rubocop/cop/metrics/module_length.rb +25 -2
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +129 -0
- data/lib/rubocop/cop/mixin/allowed_methods.rb +19 -0
- data/lib/rubocop/cop/mixin/auto_corrector.rb +12 -0
- data/lib/rubocop/cop/mixin/code_length.rb +4 -0
- data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -1
- data/lib/rubocop/cop/mixin/enforce_superclass.rb +3 -1
- data/lib/rubocop/cop/mixin/nil_methods.rb +3 -5
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +6 -1
- data/lib/rubocop/cop/mixin/surrounding_space.rb +7 -2
- data/lib/rubocop/cop/mixin/too_many_lines.rb +3 -13
- data/lib/rubocop/cop/mixin/uncommunicative_name.rb +4 -2
- data/lib/rubocop/cop/mixin/visibility_help.rb +50 -0
- data/lib/rubocop/cop/naming/ascii_identifiers.rb +27 -4
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +2 -2
- data/lib/rubocop/cop/naming/method_name.rb +1 -1
- data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/predicate_name.rb +3 -5
- data/lib/rubocop/cop/naming/variable_name.rb +1 -1
- data/lib/rubocop/cop/naming/variable_number.rb +1 -1
- data/lib/rubocop/cop/offense.rb +16 -2
- data/lib/rubocop/cop/style/accessor_grouping.rb +140 -0
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +145 -0
- data/lib/rubocop/cop/style/class_vars.rb +21 -0
- data/lib/rubocop/cop/style/date_time.rb +1 -1
- data/lib/rubocop/cop/style/dir.rb +2 -2
- data/lib/rubocop/cop/style/empty_literal.rb +5 -5
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -2
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +12 -0
- data/lib/rubocop/cop/style/multiline_block_chain.rb +10 -1
- data/lib/rubocop/cop/style/mutable_constant.rb +4 -4
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +2 -5
- data/lib/rubocop/cop/style/proc.rb +1 -1
- data/lib/rubocop/cop/style/random_with_offset.rb +4 -10
- data/lib/rubocop/cop/style/redundant_assignment.rb +117 -0
- data/lib/rubocop/cop/style/redundant_exception.rb +14 -10
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +26 -7
- data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
- data/lib/rubocop/cop/style/redundant_parentheses.rb +7 -1
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +2 -1
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +2 -2
- data/lib/rubocop/cop/style/rescue_standard_error.rb +1 -1
- data/lib/rubocop/cop/style/signal_exception.rb +1 -1
- data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
- data/lib/rubocop/cop/style/struct_inheritance.rb +2 -2
- data/lib/rubocop/cop/style/symbol_proc.rb +1 -1
- data/lib/rubocop/cop/style/trivial_accessors.rb +8 -7
- data/lib/rubocop/cop/style/zero_length_predicate.rb +2 -2
- data/lib/rubocop/cop/team.rb +97 -81
- data/lib/rubocop/cop/utils/format_string.rb +1 -2
- data/lib/rubocop/formatter/disabled_config_formatter.rb +1 -1
- data/lib/rubocop/name_similarity.rb +1 -3
- data/lib/rubocop/options.rb +15 -8
- data/lib/rubocop/rake_task.rb +6 -9
- data/lib/rubocop/rspec/cop_helper.rb +4 -4
- data/lib/rubocop/rspec/expect_offense.rb +22 -17
- data/lib/rubocop/rspec/shared_contexts.rb +7 -7
- data/lib/rubocop/runner.rb +31 -29
- data/lib/rubocop/target_ruby.rb +1 -1
- data/lib/rubocop/version.rb +1 -1
- metadata +16 -7
- data/lib/rubocop/cop/mixin/classish_length.rb +0 -37
@@ -21,8 +21,8 @@ module RuboCop
|
|
21
21
|
"file's directory."
|
22
22
|
|
23
23
|
def_node_matcher :dir_replacement?, <<~PATTERN
|
24
|
-
{(send (const nil? :File) :expand_path (send (const nil? :File) :dirname #file_keyword?))
|
25
|
-
(send (const nil? :File) :dirname (send (const nil? :File) :realpath #file_keyword?))}
|
24
|
+
{(send (const {nil? cbase} :File) :expand_path (send (const {nil? cbase} :File) :dirname #file_keyword?))
|
25
|
+
(send (const {nil? cbase} :File) :dirname (send (const {nil? cbase} :File) :realpath #file_keyword?))}
|
26
26
|
PATTERN
|
27
27
|
|
28
28
|
def on_send(node)
|
@@ -25,13 +25,13 @@ module RuboCop
|
|
25
25
|
STR_MSG = 'Use string literal `%<prefer>s` instead of ' \
|
26
26
|
'`String.new`.'
|
27
27
|
|
28
|
-
def_node_matcher :array_node, '(send (const nil? :Array) :new)'
|
29
|
-
def_node_matcher :hash_node, '(send (const nil? :Hash) :new)'
|
30
|
-
def_node_matcher :str_node, '(send (const nil? :String) :new)'
|
28
|
+
def_node_matcher :array_node, '(send (const {nil? cbase} :Array) :new)'
|
29
|
+
def_node_matcher :hash_node, '(send (const {nil? cbase} :Hash) :new)'
|
30
|
+
def_node_matcher :str_node, '(send (const {nil? cbase} :String) :new)'
|
31
31
|
def_node_matcher :array_with_block,
|
32
|
-
'(block (send (const nil? :Array) :new) args _)'
|
32
|
+
'(block (send (const {nil? cbase} :Array) :new) args _)'
|
33
33
|
def_node_matcher :hash_with_block,
|
34
|
-
'(block (send (const nil? :Hash) :new) args _)'
|
34
|
+
'(block (send (const {nil? cbase} :Hash) :new) args _)'
|
35
35
|
|
36
36
|
def on_send(node)
|
37
37
|
add_offense(node, message: ARR_MSG) if offense_array_node?(node)
|
@@ -53,7 +53,7 @@ module RuboCop
|
|
53
53
|
|
54
54
|
def_node_matcher :file_expand_path, <<~PATTERN
|
55
55
|
(send
|
56
|
-
(const nil? :File) :expand_path
|
56
|
+
(const {nil? cbase} :File) :expand_path
|
57
57
|
$_
|
58
58
|
$_)
|
59
59
|
PATTERN
|
@@ -69,7 +69,7 @@ module RuboCop
|
|
69
69
|
(send
|
70
70
|
(send
|
71
71
|
(send
|
72
|
-
(const nil? :Pathname) :new
|
72
|
+
(const {nil? cbase} :Pathname) :new
|
73
73
|
$_) :parent) :expand_path)
|
74
74
|
PATTERN
|
75
75
|
|
@@ -33,6 +33,18 @@ module RuboCop
|
|
33
33
|
add_offense(node, location: :keyword,
|
34
34
|
message: format(MSG, keyword: node.keyword))
|
35
35
|
end
|
36
|
+
|
37
|
+
def autocorrect(node)
|
38
|
+
lambda do |corrector|
|
39
|
+
keyword = node.if? ? 'if' : 'unless'
|
40
|
+
|
41
|
+
corrector.replace(node, <<~RUBY.chop)
|
42
|
+
#{keyword} #{node.condition.source}
|
43
|
+
#{node.if_branch.source}
|
44
|
+
end
|
45
|
+
RUBY
|
46
|
+
end
|
47
|
+
end
|
36
48
|
end
|
37
49
|
end
|
38
50
|
end
|
@@ -8,11 +8,20 @@ module RuboCop
|
|
8
8
|
#
|
9
9
|
# @example
|
10
10
|
#
|
11
|
-
#
|
11
|
+
# # bad
|
12
|
+
# Thread.list.select do |t|
|
12
13
|
# t.alive?
|
13
14
|
# end.map do |t|
|
14
15
|
# t.object_id
|
15
16
|
# end
|
17
|
+
#
|
18
|
+
# # good
|
19
|
+
# alive_threads = Thread.list.select do |t|
|
20
|
+
# t.alive?
|
21
|
+
# end
|
22
|
+
# alive_threads.map do |t|
|
23
|
+
# t.object_id
|
24
|
+
# end
|
16
25
|
class MultilineBlockChain < Cop
|
17
26
|
include RangeHelp
|
18
27
|
|
@@ -150,14 +150,14 @@ module RuboCop
|
|
150
150
|
def_node_matcher :operation_produces_immutable_object?, <<~PATTERN
|
151
151
|
{
|
152
152
|
(const _ _)
|
153
|
-
(send (const nil? :Struct) :new ...)
|
154
|
-
(block (send (const nil? :Struct) :new ...) ...)
|
153
|
+
(send (const {nil? cbase} :Struct) :new ...)
|
154
|
+
(block (send (const {nil? cbase} :Struct) :new ...) ...)
|
155
155
|
(send _ :freeze)
|
156
156
|
(send {float int} {:+ :- :* :** :/ :% :<<} _)
|
157
157
|
(send _ {:+ :- :* :** :/ :%} {float int})
|
158
158
|
(send _ {:== :=== :!= :<= :>= :< :>} _)
|
159
|
-
(send (const nil? :ENV) :[] _)
|
160
|
-
(or (send (const nil? :ENV) :[] _) _)
|
159
|
+
(send (const {nil? cbase} :ENV) :[] _)
|
160
|
+
(or (send (const {nil? cbase} :ENV) :[] _) _)
|
161
161
|
(send _ {:count :length :size} ...)
|
162
162
|
(block (send _ {:count :length :size} ...) ...)
|
163
163
|
}
|
@@ -14,6 +14,7 @@ module RuboCop
|
|
14
14
|
# method1(method2 arg)
|
15
15
|
class NestedParenthesizedCalls < Cop
|
16
16
|
include RangeHelp
|
17
|
+
include AllowedMethods
|
17
18
|
|
18
19
|
MSG = 'Add parentheses to nested method call `%<source>s`.'
|
19
20
|
|
@@ -54,13 +55,9 @@ module RuboCop
|
|
54
55
|
|
55
56
|
def allowed?(send_node)
|
56
57
|
send_node.parent.arguments.one? &&
|
57
|
-
|
58
|
+
allowed_method?(send_node.method_name) &&
|
58
59
|
send_node.arguments.one?
|
59
60
|
end
|
60
|
-
|
61
|
-
def allowed_methods
|
62
|
-
cop_config['AllowedMethods'] || []
|
63
|
-
end
|
64
61
|
end
|
65
62
|
end
|
66
63
|
end
|
@@ -17,7 +17,7 @@ module RuboCop
|
|
17
17
|
MSG = 'Use `proc` instead of `Proc.new`.'
|
18
18
|
|
19
19
|
def_node_matcher :proc_new?,
|
20
|
-
'(block $(send (const nil? :Proc) :new) ...)'
|
20
|
+
'(block $(send (const {nil? cbase} :Proc) :new) ...)'
|
21
21
|
|
22
22
|
def on_block(node)
|
23
23
|
proc_new?(node) do |block_method|
|
@@ -31,7 +31,7 @@ module RuboCop
|
|
31
31
|
(send
|
32
32
|
int {:+ :-}
|
33
33
|
(send
|
34
|
-
{nil? (const nil? :Random) (const nil? :Kernel)}
|
34
|
+
{nil? (const {nil? cbase} :Random) (const {nil? cbase} :Kernel)}
|
35
35
|
:rand
|
36
36
|
{int irange erange}))
|
37
37
|
PATTERN
|
@@ -39,7 +39,7 @@ module RuboCop
|
|
39
39
|
def_node_matcher :rand_op_integer?, <<~PATTERN
|
40
40
|
(send
|
41
41
|
(send
|
42
|
-
{nil? (const nil? :Random) (const nil? :Kernel)}
|
42
|
+
{nil? (const {nil? cbase} :Random) (const {nil? cbase} :Kernel)}
|
43
43
|
:rand
|
44
44
|
{int irange erange})
|
45
45
|
{:+ :-}
|
@@ -49,7 +49,7 @@ module RuboCop
|
|
49
49
|
def_node_matcher :rand_modified?, <<~PATTERN
|
50
50
|
(send
|
51
51
|
(send
|
52
|
-
{nil? (const nil? :Random) (const nil? :Kernel)}
|
52
|
+
{nil? (const {nil? cbase} :Random) (const {nil? cbase} :Kernel)}
|
53
53
|
:rand
|
54
54
|
{int irange erange})
|
55
55
|
{:succ :pred :next})
|
@@ -128,14 +128,8 @@ module RuboCop
|
|
128
128
|
end
|
129
129
|
end
|
130
130
|
|
131
|
-
def_node_matcher :namespace, <<~PATTERN
|
132
|
-
{$nil? (const nil? $_)}
|
133
|
-
PATTERN
|
134
|
-
|
135
131
|
def prefix_from_prefix_node(node)
|
136
|
-
|
137
|
-
[namespace, 'rand'].compact.join('.')
|
138
|
-
end
|
132
|
+
[node&.source, 'rand'].compact.join('.')
|
139
133
|
end
|
140
134
|
|
141
135
|
def boundaries_from_random_node(random_node)
|
@@ -0,0 +1,117 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# This cop checks for redundant assignment before returning.
|
7
|
+
#
|
8
|
+
# @example
|
9
|
+
# # bad
|
10
|
+
# def test
|
11
|
+
# x = foo
|
12
|
+
# x
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# # bad
|
16
|
+
# def test
|
17
|
+
# if x
|
18
|
+
# z = foo
|
19
|
+
# z
|
20
|
+
# elsif y
|
21
|
+
# z = bar
|
22
|
+
# z
|
23
|
+
# end
|
24
|
+
# end
|
25
|
+
#
|
26
|
+
# # good
|
27
|
+
# def test
|
28
|
+
# foo
|
29
|
+
# end
|
30
|
+
#
|
31
|
+
# # good
|
32
|
+
# def test
|
33
|
+
# if x
|
34
|
+
# foo
|
35
|
+
# elsif y
|
36
|
+
# bar
|
37
|
+
# end
|
38
|
+
# end
|
39
|
+
#
|
40
|
+
class RedundantAssignment < Cop
|
41
|
+
MSG = 'Redundant assignment before returning detected.'
|
42
|
+
|
43
|
+
def_node_matcher :redundant_assignment?, <<~PATTERN
|
44
|
+
(... $(lvasgn _name _expression) (lvar _name))
|
45
|
+
PATTERN
|
46
|
+
|
47
|
+
def on_def(node)
|
48
|
+
check_branch(node.body)
|
49
|
+
end
|
50
|
+
alias on_defs on_def
|
51
|
+
|
52
|
+
def autocorrect(node)
|
53
|
+
lambda do |corrector|
|
54
|
+
expression = node.children[1]
|
55
|
+
corrector.replace(node, expression.source)
|
56
|
+
corrector.remove(right_sibling_of(node))
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
def check_branch(node)
|
63
|
+
return unless node
|
64
|
+
|
65
|
+
case node.type
|
66
|
+
when :case then check_case_node(node)
|
67
|
+
when :if then check_if_node(node)
|
68
|
+
when :rescue, :resbody
|
69
|
+
check_rescue_node(node)
|
70
|
+
when :ensure then check_ensure_node(node)
|
71
|
+
when :begin, :kwbegin
|
72
|
+
check_begin_node(node)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def check_case_node(node)
|
77
|
+
node.when_branches.each { |when_node| check_branch(when_node.body) }
|
78
|
+
check_branch(node.else_branch)
|
79
|
+
end
|
80
|
+
|
81
|
+
def check_if_node(node)
|
82
|
+
return if node.modifier_form? || node.ternary?
|
83
|
+
|
84
|
+
check_branch(node.if_branch)
|
85
|
+
check_branch(node.else_branch)
|
86
|
+
end
|
87
|
+
|
88
|
+
def check_rescue_node(node)
|
89
|
+
node.child_nodes.each do |child_node|
|
90
|
+
check_branch(child_node)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def check_ensure_node(node)
|
95
|
+
check_branch(node.body)
|
96
|
+
end
|
97
|
+
|
98
|
+
def check_begin_node(node)
|
99
|
+
if (assignment = redundant_assignment?(node))
|
100
|
+
add_offense(assignment)
|
101
|
+
else
|
102
|
+
last_expr = node.children.last
|
103
|
+
check_branch(last_expr)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def right_sibling_of(node)
|
108
|
+
siblings_of(node)[node.sibling_index + 1]
|
109
|
+
end
|
110
|
+
|
111
|
+
def siblings_of(node)
|
112
|
+
node.parent.children
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
@@ -16,21 +16,22 @@ module RuboCop
|
|
16
16
|
#
|
17
17
|
# # Good
|
18
18
|
# raise 'message'
|
19
|
-
class RedundantException <
|
19
|
+
class RedundantException < Base
|
20
|
+
extend AutoCorrector
|
21
|
+
|
20
22
|
MSG_1 = 'Redundant `RuntimeError` argument can be removed.'
|
21
23
|
MSG_2 = 'Redundant `RuntimeError.new` call can be replaced with ' \
|
22
24
|
'just the message.'
|
23
25
|
|
26
|
+
# Switch `raise RuntimeError, 'message'` to `raise 'message'`, and
|
27
|
+
# `raise RuntimeError.new('message')` to `raise 'message'`.
|
24
28
|
def on_send(node)
|
25
|
-
|
26
|
-
compact?(node) { add_offense(node, message: MSG_2) }
|
29
|
+
fix_exploded(node) || fix_compact(node)
|
27
30
|
end
|
28
31
|
|
29
|
-
|
30
|
-
# `raise RuntimeError.new('message')` to `raise 'message'`.
|
31
|
-
def autocorrect(node) # rubocop:disable Metrics/MethodLength
|
32
|
+
def fix_exploded(node)
|
32
33
|
exploded?(node) do |command, message|
|
33
|
-
|
34
|
+
add_offense(node, message: MSG_1) do |corrector|
|
34
35
|
if node.parenthesized?
|
35
36
|
corrector.replace(node,
|
36
37
|
"#{command}(#{message.source})")
|
@@ -40,19 +41,22 @@ module RuboCop
|
|
40
41
|
end
|
41
42
|
end
|
42
43
|
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def fix_compact(node)
|
43
47
|
compact?(node) do |new_call, message|
|
44
|
-
|
48
|
+
add_offense(node, message: MSG_2) do |corrector|
|
45
49
|
corrector.replace(new_call, message.source)
|
46
50
|
end
|
47
51
|
end
|
48
52
|
end
|
49
53
|
|
50
54
|
def_node_matcher :exploded?, <<~PATTERN
|
51
|
-
(send nil? ${:raise :fail} (const nil? :RuntimeError) $_)
|
55
|
+
(send nil? ${:raise :fail} (const {nil? cbase} :RuntimeError) $_)
|
52
56
|
PATTERN
|
53
57
|
|
54
58
|
def_node_matcher :compact?, <<~PATTERN
|
55
|
-
(send nil? {:raise :fail} $(send (const nil? :RuntimeError) :new $_))
|
59
|
+
(send nil? {:raise :fail} $(send (const {nil? cbase} :RuntimeError) :new $_))
|
56
60
|
PATTERN
|
57
61
|
end
|
58
62
|
end
|
@@ -41,13 +41,12 @@ module RuboCop
|
|
41
41
|
(block
|
42
42
|
$(send _ :fetch _)
|
43
43
|
(args)
|
44
|
-
${#basic_literal? const_type?})
|
44
|
+
${nil? #basic_literal? #const_type?})
|
45
45
|
PATTERN
|
46
46
|
|
47
47
|
def on_block(node)
|
48
48
|
redundant_fetch_block_candidate?(node) do |send, body|
|
49
|
-
return if
|
50
|
-
return if body.str_type? && !check_for_string?
|
49
|
+
return if should_not_check?(send, body)
|
51
50
|
|
52
51
|
range = fetch_range(send, node)
|
53
52
|
good = build_good_method(send, body)
|
@@ -65,7 +64,9 @@ module RuboCop
|
|
65
64
|
redundant_fetch_block_candidate?(node) do |send, body|
|
66
65
|
lambda do |corrector|
|
67
66
|
receiver, _, key = send.children
|
68
|
-
|
67
|
+
default_value = body ? body.source : 'nil'
|
68
|
+
|
69
|
+
corrector.replace(node, "#{receiver.source}.fetch(#{key.source}, #{default_value})")
|
69
70
|
end
|
70
71
|
end
|
71
72
|
end
|
@@ -73,21 +74,39 @@ module RuboCop
|
|
73
74
|
private
|
74
75
|
|
75
76
|
def basic_literal?(node)
|
76
|
-
node
|
77
|
+
node&.basic_literal?
|
78
|
+
end
|
79
|
+
|
80
|
+
def const_type?(node)
|
81
|
+
node&.const_type?
|
82
|
+
end
|
83
|
+
|
84
|
+
def should_not_check?(send, body)
|
85
|
+
(body&.const_type? && !check_for_constant?) ||
|
86
|
+
(body&.str_type? && !check_for_string?) ||
|
87
|
+
rails_cache?(send.receiver)
|
77
88
|
end
|
78
89
|
|
90
|
+
def_node_matcher :rails_cache?, <<~PATTERN
|
91
|
+
(send (const _ :Rails) :cache)
|
92
|
+
PATTERN
|
93
|
+
|
79
94
|
def fetch_range(send, node)
|
80
95
|
range_between(send.loc.selector.begin_pos, node.loc.end.end_pos)
|
81
96
|
end
|
82
97
|
|
83
98
|
def build_good_method(send, body)
|
84
99
|
key = send.children[2].source
|
85
|
-
|
100
|
+
default_value = body ? body.source : 'nil'
|
101
|
+
|
102
|
+
"fetch(#{key}, #{default_value})"
|
86
103
|
end
|
87
104
|
|
88
105
|
def build_bad_method(send, body)
|
89
106
|
key = send.children[2].source
|
90
|
-
"
|
107
|
+
block = body ? "{ #{body.source} }" : '{}'
|
108
|
+
|
109
|
+
"fetch(#{key}) #{block}"
|
91
110
|
end
|
92
111
|
|
93
112
|
def check_for_constant?
|
@@ -56,7 +56,7 @@ module RuboCop
|
|
56
56
|
(begin (send {float int} {:+ :- :* :** :/ :% :<<} _))
|
57
57
|
(begin (send !(str _) {:+ :- :* :** :/ :%} {float int}))
|
58
58
|
(begin (send _ {:== :=== :!= :<= :>= :< :>} _))
|
59
|
-
(send (const nil? :ENV) :[] _)
|
59
|
+
(send (const {nil? cbase} :ENV) :[] _)
|
60
60
|
(send _ {:count :length :size} ...)
|
61
61
|
(block (send _ {:count :length :size} ...) ...)
|
62
62
|
}
|
@@ -205,7 +205,9 @@ module RuboCop
|
|
205
205
|
end
|
206
206
|
|
207
207
|
def first_argument?(node)
|
208
|
-
first_send_argument?(node) ||
|
208
|
+
first_send_argument?(node) ||
|
209
|
+
first_super_argument?(node) ||
|
210
|
+
first_yield_argument?(node)
|
209
211
|
end
|
210
212
|
|
211
213
|
def_node_matcher :first_send_argument?, <<~PATTERN
|
@@ -216,6 +218,10 @@ module RuboCop
|
|
216
218
|
^(super equal?(%0) ...)
|
217
219
|
PATTERN
|
218
220
|
|
221
|
+
def_node_matcher :first_yield_argument?, <<~PATTERN
|
222
|
+
^(yield equal?(%0) ...)
|
223
|
+
PATTERN
|
224
|
+
|
219
225
|
def call_chain_starts_with_int?(begin_node, send_node)
|
220
226
|
recv = first_part_of_call_chain(send_node)
|
221
227
|
recv&.int_type? && (parent = begin_node.parent) &&
|