rubocop-rails 2.7.1 → 2.10.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/LICENSE.txt +1 -1
- data/README.md +18 -2
- data/config/default.yml +144 -6
- data/config/obsoletion.yml +7 -0
- data/lib/rubocop/cop/mixin/active_record_helper.rb +16 -3
- data/lib/rubocop/cop/mixin/enforce_superclass.rb +40 -0
- data/lib/rubocop/cop/mixin/index_method.rb +25 -11
- data/lib/rubocop/cop/rails/action_filter.rb +10 -14
- data/lib/rubocop/cop/rails/active_record_aliases.rb +13 -17
- data/lib/rubocop/cop/rails/active_record_callbacks_order.rb +19 -16
- data/lib/rubocop/cop/rails/active_record_override.rb +1 -1
- data/lib/rubocop/cop/rails/active_support_aliases.rb +12 -21
- data/lib/rubocop/cop/rails/after_commit_override.rb +91 -0
- data/lib/rubocop/cop/rails/application_controller.rb +3 -7
- data/lib/rubocop/cop/rails/application_job.rb +2 -1
- data/lib/rubocop/cop/rails/application_mailer.rb +2 -7
- data/lib/rubocop/cop/rails/application_record.rb +2 -7
- data/lib/rubocop/cop/rails/arel_star.rb +41 -0
- data/lib/rubocop/cop/rails/assert_not.rb +8 -10
- data/lib/rubocop/cop/rails/attribute_default_block_value.rb +90 -0
- data/lib/rubocop/cop/rails/belongs_to.rb +10 -19
- data/lib/rubocop/cop/rails/blank.rb +31 -27
- data/lib/rubocop/cop/rails/bulk_change_table.rb +1 -1
- data/lib/rubocop/cop/rails/content_tag.rb +34 -19
- data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +2 -1
- data/lib/rubocop/cop/rails/date.rb +10 -11
- data/lib/rubocop/cop/rails/default_scope.rb +11 -4
- data/lib/rubocop/cop/rails/delegate.rb +9 -9
- data/lib/rubocop/cop/rails/delegate_allow_blank.rb +7 -8
- data/lib/rubocop/cop/rails/dynamic_find_by.rb +15 -12
- data/lib/rubocop/cop/rails/enum_hash.rb +11 -10
- data/lib/rubocop/cop/rails/enum_uniqueness.rb +2 -1
- data/lib/rubocop/cop/rails/environment_comparison.rb +18 -14
- data/lib/rubocop/cop/rails/environment_variable_access.rb +67 -0
- data/lib/rubocop/cop/rails/exit.rb +4 -10
- data/lib/rubocop/cop/rails/file_path.rb +7 -8
- data/lib/rubocop/cop/rails/find_by.rb +13 -13
- data/lib/rubocop/cop/rails/find_by_id.rb +12 -21
- data/lib/rubocop/cop/rails/find_each.rb +19 -18
- data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +3 -2
- data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +37 -10
- data/lib/rubocop/cop/rails/helper_instance_variable.rb +30 -2
- data/lib/rubocop/cop/rails/http_positional_arguments.rb +32 -21
- data/lib/rubocop/cop/rails/http_status.rb +7 -9
- data/lib/rubocop/cop/rails/ignored_skip_action_filter_option.rb +8 -6
- data/lib/rubocop/cop/rails/index_by.rb +11 -2
- data/lib/rubocop/cop/rails/index_with.rb +11 -2
- data/lib/rubocop/cop/rails/inquiry.rb +7 -2
- data/lib/rubocop/cop/rails/inverse_of.rb +3 -2
- data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +17 -15
- data/lib/rubocop/cop/rails/link_to_blank.rb +25 -23
- data/lib/rubocop/cop/rails/mailer_name.rb +19 -13
- data/lib/rubocop/cop/rails/match_route.rb +14 -13
- data/lib/rubocop/cop/rails/negate_include.rb +10 -8
- data/lib/rubocop/cop/rails/not_null_column.rb +2 -1
- data/lib/rubocop/cop/rails/order_by_id.rb +52 -0
- data/lib/rubocop/cop/rails/output.rb +5 -2
- data/lib/rubocop/cop/rails/output_safety.rb +3 -2
- data/lib/rubocop/cop/rails/pick.rb +14 -12
- data/lib/rubocop/cop/rails/pluck.rb +6 -9
- data/lib/rubocop/cop/rails/pluck_id.rb +4 -6
- data/lib/rubocop/cop/rails/pluck_in_where.rb +39 -5
- data/lib/rubocop/cop/rails/pluralization_grammar.rb +10 -14
- data/lib/rubocop/cop/rails/presence.rb +12 -13
- data/lib/rubocop/cop/rails/present.rb +30 -24
- data/lib/rubocop/cop/rails/rake_environment.rb +8 -10
- data/lib/rubocop/cop/rails/read_write_attribute.rb +12 -11
- data/lib/rubocop/cop/rails/redundant_allow_nil.rb +29 -31
- data/lib/rubocop/cop/rails/redundant_foreign_key.rb +9 -12
- data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +11 -10
- data/lib/rubocop/cop/rails/reflection_class_name.rb +18 -4
- data/lib/rubocop/cop/rails/refute_methods.rb +9 -10
- data/lib/rubocop/cop/rails/relative_date_constant.rb +34 -22
- data/lib/rubocop/cop/rails/render_inline.rb +2 -1
- data/lib/rubocop/cop/rails/render_plain_text.rb +9 -14
- data/lib/rubocop/cop/rails/request_referer.rb +7 -7
- data/lib/rubocop/cop/rails/require_dependency.rb +38 -0
- data/lib/rubocop/cop/rails/reversible_migration.rb +83 -8
- data/lib/rubocop/cop/rails/reversible_migration_method_definition.rb +75 -0
- data/lib/rubocop/cop/rails/safe_navigation.rb +30 -11
- data/lib/rubocop/cop/rails/safe_navigation_with_blank.rb +5 -10
- data/lib/rubocop/cop/rails/save_bang.rb +19 -22
- data/lib/rubocop/cop/rails/scope_args.rb +2 -1
- data/lib/rubocop/cop/rails/short_i18n.rb +7 -9
- data/lib/rubocop/cop/rails/skips_model_validations.rb +4 -4
- data/lib/rubocop/cop/rails/squished_sql_heredocs.rb +82 -0
- data/lib/rubocop/cop/rails/time_zone.rb +35 -25
- data/lib/rubocop/cop/rails/time_zone_assignment.rb +37 -0
- data/lib/rubocop/cop/rails/uniq_before_pluck.rb +6 -6
- data/lib/rubocop/cop/rails/unique_validation_without_index.rb +18 -8
- data/lib/rubocop/cop/rails/unknown_env.rb +3 -3
- data/lib/rubocop/cop/rails/validation.rb +15 -14
- data/lib/rubocop/cop/rails/where_equals.rb +98 -0
- data/lib/rubocop/cop/rails/where_exists.rb +85 -16
- data/lib/rubocop/cop/rails/where_not.rb +101 -0
- data/lib/rubocop/cop/rails_cops.rb +12 -0
- data/lib/rubocop/rails.rb +2 -0
- data/lib/rubocop/rails/schema_loader.rb +4 -4
- data/lib/rubocop/rails/schema_loader/schema.rb +4 -8
- data/lib/rubocop/rails/version.rb +5 -1
- metadata +33 -14
@@ -4,10 +4,18 @@ module RuboCop
|
|
4
4
|
module Cop
|
5
5
|
# Common functionality for Rails/IndexBy and Rails/IndexWith
|
6
6
|
module IndexMethod # rubocop:disable Metrics/ModuleLength
|
7
|
+
RESTRICT_ON_SEND = %i[each_with_object to_h map collect []].freeze
|
8
|
+
|
7
9
|
def on_block(node)
|
8
10
|
on_bad_each_with_object(node) do |*match|
|
9
11
|
handle_possible_offense(node, match, 'each_with_object')
|
10
12
|
end
|
13
|
+
|
14
|
+
return if target_ruby_version < 2.6
|
15
|
+
|
16
|
+
on_bad_to_h(node) do |*match|
|
17
|
+
handle_possible_offense(node, match, 'to_h { ... }')
|
18
|
+
end
|
11
19
|
end
|
12
20
|
|
13
21
|
def on_send(node)
|
@@ -26,13 +34,6 @@ module RuboCop
|
|
26
34
|
end
|
27
35
|
end
|
28
36
|
|
29
|
-
def autocorrect(node)
|
30
|
-
lambda do |corrector|
|
31
|
-
correction = prepare_correction(node)
|
32
|
-
execute_correction(corrector, node, correction)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
37
|
private
|
37
38
|
|
38
39
|
# @abstract Implemented with `def_node_matcher`
|
@@ -40,6 +41,11 @@ module RuboCop
|
|
40
41
|
raise NotImplementedError
|
41
42
|
end
|
42
43
|
|
44
|
+
# @abstract Implemented with `def_node_matcher`
|
45
|
+
def on_bad_to_h(_node)
|
46
|
+
raise NotImplementedError
|
47
|
+
end
|
48
|
+
|
43
49
|
# @abstract Implemented with `def_node_matcher`
|
44
50
|
def on_bad_map_to_h(_node)
|
45
51
|
raise NotImplementedError
|
@@ -56,9 +62,11 @@ module RuboCop
|
|
56
62
|
return if captures.noop_transformation?
|
57
63
|
|
58
64
|
add_offense(
|
59
|
-
node,
|
60
|
-
|
61
|
-
|
65
|
+
node, message: "Prefer `#{new_method_name}` over `#{match_desc}`."
|
66
|
+
) do |corrector|
|
67
|
+
correction = prepare_correction(node)
|
68
|
+
execute_correction(corrector, node, correction)
|
69
|
+
end
|
62
70
|
end
|
63
71
|
|
64
72
|
def extract_captures(match)
|
@@ -73,6 +81,8 @@ module RuboCop
|
|
73
81
|
def prepare_correction(node)
|
74
82
|
if (match = on_bad_each_with_object(node))
|
75
83
|
Autocorrection.from_each_with_object(node, match)
|
84
|
+
elsif (match = on_bad_to_h(node))
|
85
|
+
Autocorrection.from_to_h(node, match)
|
76
86
|
elsif (match = on_bad_map_to_h(node))
|
77
87
|
Autocorrection.from_map_to_h(node, match)
|
78
88
|
elsif (match = on_bad_hash_brackets_map(node))
|
@@ -106,11 +116,15 @@ module RuboCop
|
|
106
116
|
end
|
107
117
|
|
108
118
|
# Internal helper class to hold autocorrect data
|
109
|
-
Autocorrection = Struct.new(:match, :block_node, :leading, :trailing) do
|
119
|
+
Autocorrection = Struct.new(:match, :block_node, :leading, :trailing) do
|
110
120
|
def self.from_each_with_object(node, match)
|
111
121
|
new(match, node, 0, 0)
|
112
122
|
end
|
113
123
|
|
124
|
+
def self.from_to_h(node, match)
|
125
|
+
new(match, node, 0, 0)
|
126
|
+
end
|
127
|
+
|
114
128
|
def self.from_map_to_h(node, match)
|
115
129
|
strip_trailing_chars = 0
|
116
130
|
|
@@ -29,8 +29,9 @@ module RuboCop
|
|
29
29
|
# after_filter :do_stuff
|
30
30
|
# append_around_filter :do_stuff
|
31
31
|
# skip_after_filter :do_stuff
|
32
|
-
class ActionFilter <
|
32
|
+
class ActionFilter < Base
|
33
33
|
include ConfigurableEnforcedStyle
|
34
|
+
extend AutoCorrector
|
34
35
|
|
35
36
|
MSG = 'Prefer `%<prefer>s` over `%<current>s`.'
|
36
37
|
|
@@ -66,6 +67,8 @@ module RuboCop
|
|
66
67
|
skip_action_callback
|
67
68
|
].freeze
|
68
69
|
|
70
|
+
RESTRICT_ON_SEND = FILTER_METHODS + ACTION_METHODS
|
71
|
+
|
69
72
|
def on_block(node)
|
70
73
|
check_method_node(node.send_node)
|
71
74
|
end
|
@@ -74,24 +77,17 @@ module RuboCop
|
|
74
77
|
check_method_node(node) unless node.receiver
|
75
78
|
end
|
76
79
|
|
77
|
-
def autocorrect(node)
|
78
|
-
lambda do |corrector|
|
79
|
-
corrector.replace(node.loc.selector,
|
80
|
-
preferred_method(node.loc.selector.source).to_s)
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
80
|
private
|
85
81
|
|
86
82
|
def check_method_node(node)
|
87
|
-
|
83
|
+
method_name = node.method_name
|
84
|
+
return unless bad_methods.include?(method_name)
|
88
85
|
|
89
|
-
|
90
|
-
end
|
86
|
+
message = format(MSG, prefer: preferred_method(method_name), current: method_name)
|
91
87
|
|
92
|
-
|
93
|
-
|
94
|
-
|
88
|
+
add_offense(node.loc.selector, message: message) do |corrector|
|
89
|
+
corrector.replace(node.loc.selector, preferred_method(node.loc.selector.source))
|
90
|
+
end
|
95
91
|
end
|
96
92
|
|
97
93
|
def bad_methods
|
@@ -12,7 +12,9 @@ module RuboCop
|
|
12
12
|
#
|
13
13
|
# #good
|
14
14
|
# Book.update!(author: 'Alice')
|
15
|
-
class ActiveRecordAliases <
|
15
|
+
class ActiveRecordAliases < Base
|
16
|
+
extend AutoCorrector
|
17
|
+
|
16
18
|
MSG = 'Use `%<prefer>s` instead of `%<current>s`.'
|
17
19
|
|
18
20
|
ALIASES = {
|
@@ -20,28 +22,22 @@ module RuboCop
|
|
20
22
|
update_attributes!: :update!
|
21
23
|
}.freeze
|
22
24
|
|
25
|
+
RESTRICT_ON_SEND = ALIASES.keys.freeze
|
26
|
+
|
23
27
|
def on_send(node)
|
24
|
-
|
25
|
-
|
28
|
+
method_name = node.method_name
|
29
|
+
alias_method = ALIASES[method_name]
|
26
30
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
31
|
+
add_offense(
|
32
|
+
node.loc.selector,
|
33
|
+
message: format(MSG, prefer: alias_method, current: method_name),
|
34
|
+
severity: :warning
|
35
|
+
) do |corrector|
|
36
|
+
corrector.replace(node.loc.selector, alias_method)
|
32
37
|
end
|
33
38
|
end
|
34
39
|
|
35
40
|
alias on_csend on_send
|
36
|
-
|
37
|
-
def autocorrect(node)
|
38
|
-
lambda do |corrector|
|
39
|
-
corrector.replace(
|
40
|
-
node.loc.selector,
|
41
|
-
ALIASES[node.method_name].to_s
|
42
|
-
)
|
43
|
-
end
|
44
|
-
end
|
45
41
|
end
|
46
42
|
end
|
47
43
|
end
|
@@ -19,7 +19,9 @@ module RuboCop
|
|
19
19
|
# after_commit :after_commit_callback
|
20
20
|
# end
|
21
21
|
#
|
22
|
-
class ActiveRecordCallbacksOrder <
|
22
|
+
class ActiveRecordCallbacksOrder < Base
|
23
|
+
extend AutoCorrector
|
24
|
+
|
23
25
|
MSG = '`%<current>s` is supposed to appear before `%<previous>s`.'
|
24
26
|
|
25
27
|
CALLBACKS_IN_ORDER = %i[
|
@@ -44,9 +46,7 @@ module RuboCop
|
|
44
46
|
after_touch
|
45
47
|
].freeze
|
46
48
|
|
47
|
-
CALLBACKS_ORDER_MAP =
|
48
|
-
CALLBACKS_IN_ORDER.map.with_index { |name, index| [name, index] }
|
49
|
-
].freeze
|
49
|
+
CALLBACKS_ORDER_MAP = CALLBACKS_IN_ORDER.each_with_index.to_h.freeze
|
50
50
|
|
51
51
|
def on_class(class_node)
|
52
52
|
previous_index = -1
|
@@ -57,32 +57,31 @@ module RuboCop
|
|
57
57
|
index = CALLBACKS_ORDER_MAP[callback]
|
58
58
|
|
59
59
|
if index < previous_index
|
60
|
-
message = format(MSG, current: callback,
|
61
|
-
|
62
|
-
|
60
|
+
message = format(MSG, current: callback, previous: previous_callback)
|
61
|
+
add_offense(node, message: message) do |corrector|
|
62
|
+
autocorrect(corrector, node)
|
63
|
+
end
|
63
64
|
end
|
64
65
|
previous_index = index
|
65
66
|
previous_callback = callback
|
66
67
|
end
|
67
68
|
end
|
68
69
|
|
70
|
+
private
|
71
|
+
|
69
72
|
# Autocorrect by swapping between two nodes autocorrecting them
|
70
|
-
def autocorrect(node)
|
71
|
-
previous = left_siblings_of(node).find do |sibling|
|
73
|
+
def autocorrect(corrector, node)
|
74
|
+
previous = left_siblings_of(node).reverse_each.find do |sibling|
|
72
75
|
callback?(sibling)
|
73
76
|
end
|
74
77
|
|
75
78
|
current_range = source_range_with_comment(node)
|
76
79
|
previous_range = source_range_with_comment(previous)
|
77
80
|
|
78
|
-
|
79
|
-
|
80
|
-
corrector.remove(current_range)
|
81
|
-
end
|
81
|
+
corrector.insert_before(previous_range, current_range.source)
|
82
|
+
corrector.remove(current_range)
|
82
83
|
end
|
83
84
|
|
84
|
-
private
|
85
|
-
|
86
85
|
def defined_callbacks(class_node)
|
87
86
|
class_def = class_node.body
|
88
87
|
|
@@ -123,7 +122,7 @@ module RuboCop
|
|
123
122
|
|
124
123
|
processed_source.comments_before_line(annotation_line)
|
125
124
|
.reverse_each do |comment|
|
126
|
-
if comment.location.line == annotation_line
|
125
|
+
if comment.location.line == annotation_line && !inline_comment?(comment)
|
127
126
|
first_comment = comment
|
128
127
|
annotation_line -= 1
|
129
128
|
end
|
@@ -132,6 +131,10 @@ module RuboCop
|
|
132
131
|
start_line_position(first_comment || node)
|
133
132
|
end
|
134
133
|
|
134
|
+
def inline_comment?(comment)
|
135
|
+
!comment_line?(comment.loc.expression.source_line)
|
136
|
+
end
|
137
|
+
|
135
138
|
def start_line_position(node)
|
136
139
|
buffer.line_range(node.loc.line).begin_pos - 1
|
137
140
|
end
|
@@ -19,8 +19,11 @@ module RuboCop
|
|
19
19
|
# [1, 2, 'a'].append('b')
|
20
20
|
# [1, 2, 'a'].prepend('b')
|
21
21
|
#
|
22
|
-
class ActiveSupportAliases <
|
22
|
+
class ActiveSupportAliases < Base
|
23
|
+
extend AutoCorrector
|
24
|
+
|
23
25
|
MSG = 'Use `%<prefer>s` instead of `%<current>s`.'
|
26
|
+
RESTRICT_ON_SEND = %i[starts_with? ends_with? append prepend].freeze
|
24
27
|
|
25
28
|
ALIASES = {
|
26
29
|
starts_with?: {
|
@@ -39,29 +42,17 @@ module RuboCop
|
|
39
42
|
|
40
43
|
def on_send(node)
|
41
44
|
ALIASES.each_key do |aliased_method|
|
42
|
-
|
43
|
-
public_send(aliased_method, node)
|
44
|
-
end
|
45
|
-
end
|
45
|
+
next unless public_send(aliased_method, node)
|
46
46
|
|
47
|
-
|
48
|
-
|
47
|
+
preferred_method = ALIASES[aliased_method][:original]
|
48
|
+
message = format(MSG, prefer: preferred_method, current: aliased_method)
|
49
49
|
|
50
|
-
|
51
|
-
|
52
|
-
replacement = ALIASES[method_name.to_sym][:original]
|
53
|
-
corrector.replace(node.loc.selector, replacement.to_s)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
private
|
50
|
+
add_offense(node, message: message) do |corrector|
|
51
|
+
next if append(node)
|
58
52
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
message: format(MSG, prefer: ALIASES[method_name][:original],
|
63
|
-
current: method_name)
|
64
|
-
)
|
53
|
+
corrector.replace(node.loc.selector, preferred_method)
|
54
|
+
end
|
55
|
+
end
|
65
56
|
end
|
66
57
|
end
|
67
58
|
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Rails
|
6
|
+
# This cop enforces that there is only one call to `after_commit`
|
7
|
+
# (and its aliases - `after_create_commit`, `after_update_commit`,
|
8
|
+
# and `after_destroy_commit`) with the same callback name per model.
|
9
|
+
#
|
10
|
+
# @example
|
11
|
+
# # bad
|
12
|
+
# # This won't be triggered.
|
13
|
+
# after_create_commit :log_action
|
14
|
+
#
|
15
|
+
# # This will override the callback added by
|
16
|
+
# # after_create_commit.
|
17
|
+
# after_update_commit :log_action
|
18
|
+
#
|
19
|
+
# # bad
|
20
|
+
# # This won't be triggered.
|
21
|
+
# after_commit :log_action, on: :create
|
22
|
+
# # This won't be triggered.
|
23
|
+
# after_update_commit :log_action
|
24
|
+
# # This will override both previous callbacks.
|
25
|
+
# after_commit :log_action, on: :destroy
|
26
|
+
#
|
27
|
+
# # good
|
28
|
+
# after_save_commit :log_action
|
29
|
+
#
|
30
|
+
# # good
|
31
|
+
# after_create_commit :log_create_action
|
32
|
+
# after_update_commit :log_update_action
|
33
|
+
#
|
34
|
+
class AfterCommitOverride < Base
|
35
|
+
MSG = 'There can only be one `after_*_commit :%<name>s` hook defined for a model.'
|
36
|
+
|
37
|
+
AFTER_COMMIT_CALLBACKS = %i[
|
38
|
+
after_commit
|
39
|
+
after_create_commit
|
40
|
+
after_update_commit
|
41
|
+
after_save_commit
|
42
|
+
after_destroy_commit
|
43
|
+
].freeze
|
44
|
+
|
45
|
+
def on_class(class_node)
|
46
|
+
seen_callback_names = {}
|
47
|
+
|
48
|
+
each_after_commit_callback(class_node) do |node|
|
49
|
+
callback_name = node.arguments[0].value
|
50
|
+
if seen_callback_names.key?(callback_name)
|
51
|
+
add_offense(node, message: format(MSG, name: callback_name))
|
52
|
+
else
|
53
|
+
seen_callback_names[callback_name] = true
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def each_after_commit_callback(class_node)
|
61
|
+
class_send_nodes(class_node).each do |node|
|
62
|
+
yield node if after_commit_callback?(node) && named_callback?(node)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def class_send_nodes(class_node)
|
67
|
+
class_def = class_node.body
|
68
|
+
|
69
|
+
return [] unless class_def
|
70
|
+
|
71
|
+
if class_def.send_type?
|
72
|
+
[class_def]
|
73
|
+
else
|
74
|
+
class_def.each_child_node(:send).to_a
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def after_commit_callback?(node)
|
79
|
+
AFTER_COMMIT_CALLBACKS.include?(node.method_name)
|
80
|
+
end
|
81
|
+
|
82
|
+
def named_callback?(node)
|
83
|
+
name = node.first_argument
|
84
|
+
return false unless name
|
85
|
+
|
86
|
+
name.sym_type?
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -16,7 +16,9 @@ module RuboCop
|
|
16
16
|
# class MyController < ActionController::Base
|
17
17
|
# # ...
|
18
18
|
# end
|
19
|
-
class ApplicationController <
|
19
|
+
class ApplicationController < Base
|
20
|
+
extend AutoCorrector
|
21
|
+
|
20
22
|
MSG = 'Controllers should subclass `ApplicationController`.'
|
21
23
|
SUPERCLASS = 'ApplicationController'
|
22
24
|
BASE_PATTERN = '(const (const nil? :ActionController) :Base)'
|
@@ -24,12 +26,6 @@ module RuboCop
|
|
24
26
|
# rubocop:disable Layout/ClassStructure
|
25
27
|
include RuboCop::Cop::EnforceSuperclass
|
26
28
|
# rubocop:enable Layout/ClassStructure
|
27
|
-
|
28
|
-
def autocorrect(node)
|
29
|
-
lambda do |corrector|
|
30
|
-
corrector.replace(node.source_range, self.class::SUPERCLASS)
|
31
|
-
end
|
32
|
-
end
|
33
29
|
end
|
34
30
|
end
|
35
31
|
end
|