rubocop-rails 2.11.3 → 2.12.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/bin/console +11 -0
- data/config/default.yml +13 -1
- data/lib/rubocop/cop/rails/content_tag.rb +29 -26
- data/lib/rubocop/cop/rails/delegate.rb +1 -1
- data/lib/rubocop/cop/rails/dynamic_find_by.rb +1 -1
- data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +6 -2
- data/lib/rubocop/cop/rails/http_positional_arguments.rb +8 -1
- data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +23 -2
- data/lib/rubocop/cop/rails/link_to_blank.rb +2 -2
- data/lib/rubocop/cop/rails/output.rb +17 -3
- data/lib/rubocop/cop/rails/pluralization_grammar.rb +2 -2
- data/lib/rubocop/cop/rails/redundant_travel_back.rb +57 -0
- data/lib/rubocop/cop/rails/reversible_migration.rb +2 -2
- data/lib/rubocop/cop/rails/scope_args.rb +5 -1
- data/lib/rubocop/cop/rails_cops.rb +1 -0
- data/lib/rubocop/rails/version.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8fb49b448d769c9ff936129480584da1cfb68abc6f9697a845c94c7d345c7077
|
4
|
+
data.tar.gz: 9309aca423686c3df184c22a25320f90f9eae5b0c2c033447fff1dbbc7458518
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4d209b60d9c4cb2a1d1e0786936cb2ecac1d0debfc7fc83fc91e959a07a42a8f7ad8d5eba05c015b4c27cd79c342ce4e2f057399cbbd12af01218ff79f13d5b5
|
7
|
+
data.tar.gz: a18599aa1218bedcd1854db939fad42265d1de222b0d5fc633f30844dc3f4bc65b97fc943511dc902c5bd8588fcbb20c3424d4db3b6d9ad4e534691a2d4cfe89
|
data/bin/console
ADDED
data/config/default.yml
CHANGED
@@ -181,12 +181,14 @@ Rails/BulkChangeTable:
|
|
181
181
|
- db/migrate/*.rb
|
182
182
|
|
183
183
|
Rails/ContentTag:
|
184
|
-
Description: 'Use `tag` instead of `
|
184
|
+
Description: 'Use `tag.something` instead of `tag(:something)`.'
|
185
185
|
Reference:
|
186
|
+
- 'https://github.com/rubocop/rubocop-rails/issues/260'
|
186
187
|
- 'https://github.com/rails/rails/issues/25195'
|
187
188
|
- 'https://api.rubyonrails.org/classes/ActionView/Helpers/TagHelper.html#method-i-content_tag'
|
188
189
|
Enabled: true
|
189
190
|
VersionAdded: '2.6'
|
191
|
+
VersionChanged: '2.12'
|
190
192
|
|
191
193
|
Rails/CreateTableWithTimestamps:
|
192
194
|
Description: >-
|
@@ -499,6 +501,7 @@ Rails/OrderById:
|
|
499
501
|
Rails/Output:
|
500
502
|
Description: 'Checks for calls to puts, print, etc.'
|
501
503
|
Enabled: true
|
504
|
+
SafeAutoCorrect: false
|
502
505
|
VersionAdded: '0.15'
|
503
506
|
VersionChanged: '0.19'
|
504
507
|
Include:
|
@@ -607,6 +610,14 @@ Rails/RedundantReceiverInWithOptions:
|
|
607
610
|
Enabled: true
|
608
611
|
VersionAdded: '0.52'
|
609
612
|
|
613
|
+
Rails/RedundantTravelBack:
|
614
|
+
Description: This cop checks for redundant `travel_back` calls.
|
615
|
+
Enabled: pending
|
616
|
+
VersionAdded: '2.12'
|
617
|
+
Include:
|
618
|
+
- spec/**/*.rb
|
619
|
+
- test/**/*.rb
|
620
|
+
|
610
621
|
Rails/ReflectionClassName:
|
611
622
|
Description: 'Use a string for `class_name` option value in the definition of a reflection.'
|
612
623
|
Enabled: true
|
@@ -713,6 +724,7 @@ Rails/ScopeArgs:
|
|
713
724
|
Description: 'Checks the arguments of ActiveRecord scopes.'
|
714
725
|
Enabled: true
|
715
726
|
VersionAdded: '0.19'
|
727
|
+
VersionChanged: '2.12'
|
716
728
|
Include:
|
717
729
|
- app/models/**/*.rb
|
718
730
|
|
@@ -3,21 +3,21 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Rails
|
6
|
-
# This cop checks
|
7
|
-
# because `content_tag` is legacy syntax.
|
6
|
+
# This cop checks legacy syntax usage of `tag`
|
8
7
|
#
|
9
|
-
# NOTE: Allow `
|
10
|
-
#
|
8
|
+
# NOTE: Allow `tag` when the first argument is a variable because
|
9
|
+
# `tag(name)` is simpler rather than `tag.public_send(name)`.
|
10
|
+
# And this cop will be renamed to something like `LegacyTag` in the future. (e.g. RuboCop Rails 2.0)
|
11
11
|
#
|
12
12
|
# @example
|
13
13
|
# # bad
|
14
|
-
#
|
15
|
-
#
|
14
|
+
# tag(:p)
|
15
|
+
# tag(:br, class: 'classname')
|
16
16
|
#
|
17
17
|
# # good
|
18
|
-
# tag.p
|
19
|
-
# tag.br
|
20
|
-
#
|
18
|
+
# tag.p
|
19
|
+
# tag.br(class: 'classname')
|
20
|
+
# tag(name, class: 'classname')
|
21
21
|
class ContentTag < Base
|
22
22
|
include RangeHelp
|
23
23
|
extend AutoCorrector
|
@@ -25,8 +25,8 @@ module RuboCop
|
|
25
25
|
|
26
26
|
minimum_target_rails_version 5.1
|
27
27
|
|
28
|
-
MSG = 'Use `tag` instead of `
|
29
|
-
RESTRICT_ON_SEND = %i[
|
28
|
+
MSG = 'Use `tag.%<preferred_method>s` instead of `tag(%<current_argument>s)`.'
|
29
|
+
RESTRICT_ON_SEND = %i[tag].freeze
|
30
30
|
|
31
31
|
def on_new_investigation
|
32
32
|
@corrected_nodes = nil
|
@@ -38,8 +38,11 @@ module RuboCop
|
|
38
38
|
allowed_argument?(first_argument) ||
|
39
39
|
corrected_ancestor?(node)
|
40
40
|
|
41
|
-
|
42
|
-
|
41
|
+
preferred_method = node.first_argument.value.to_s.underscore
|
42
|
+
message = format(MSG, preferred_method: preferred_method, current_argument: first_argument.source)
|
43
|
+
|
44
|
+
add_offense(node, message: message) do |corrector|
|
45
|
+
autocorrect(corrector, node, preferred_method)
|
43
46
|
|
44
47
|
@corrected_nodes ||= Set.new.compare_by_identity
|
45
48
|
@corrected_nodes.add(node)
|
@@ -53,26 +56,26 @@ module RuboCop
|
|
53
56
|
end
|
54
57
|
|
55
58
|
def allowed_argument?(argument)
|
56
|
-
argument.variable? ||
|
59
|
+
argument.variable? ||
|
60
|
+
argument.send_type? ||
|
61
|
+
argument.const_type? ||
|
62
|
+
argument.splat_type? ||
|
63
|
+
allowed_name?(argument)
|
57
64
|
end
|
58
65
|
|
59
|
-
def autocorrect(corrector, node)
|
60
|
-
|
61
|
-
range = correction_range(node)
|
66
|
+
def autocorrect(corrector, node, preferred_method)
|
67
|
+
range = correction_range(node)
|
62
68
|
|
63
|
-
|
64
|
-
|
69
|
+
rest_args = node.arguments.drop(1)
|
70
|
+
replacement = "tag.#{preferred_method}(#{rest_args.map(&:source).join(', ')})"
|
65
71
|
|
66
|
-
|
67
|
-
else
|
68
|
-
corrector.replace(node.loc.selector, 'tag')
|
69
|
-
end
|
72
|
+
corrector.replace(range, replacement)
|
70
73
|
end
|
71
74
|
|
72
|
-
def
|
73
|
-
return false unless
|
75
|
+
def allowed_name?(argument)
|
76
|
+
return false unless argument.str_type? || argument.sym_type?
|
74
77
|
|
75
|
-
|
78
|
+
!/^[a-zA-Z\-][a-zA-Z\-0-9]*$/.match?(argument.value)
|
76
79
|
end
|
77
80
|
|
78
81
|
def correction_range(node)
|
@@ -100,7 +100,7 @@ module RuboCop
|
|
100
100
|
|
101
101
|
def method_name_matches?(method_name, body)
|
102
102
|
method_name == body.method_name ||
|
103
|
-
include_prefix_case? && method_name == prefixed_method_name(body)
|
103
|
+
(include_prefix_case? && method_name == prefixed_method_name(body))
|
104
104
|
end
|
105
105
|
|
106
106
|
def include_prefix_case?
|
@@ -40,7 +40,7 @@ module RuboCop
|
|
40
40
|
IGNORED_ARGUMENT_TYPES = %i[hash splat].freeze
|
41
41
|
|
42
42
|
def on_send(node)
|
43
|
-
return if node.receiver.nil? && !inherit_active_record_base?(node) || allowed_invocation?(node)
|
43
|
+
return if (node.receiver.nil? && !inherit_active_record_base?(node)) || allowed_invocation?(node)
|
44
44
|
|
45
45
|
method_name = node.method_name
|
46
46
|
static_name = static_method_name(method_name)
|
@@ -100,8 +100,8 @@ module RuboCop
|
|
100
100
|
end
|
101
101
|
|
102
102
|
def contain_valid_options_in_with_options_block?(node)
|
103
|
-
if with_options_block(node)
|
104
|
-
return true if valid_options?(
|
103
|
+
if (options = with_options_block(node))
|
104
|
+
return true if valid_options?(options)
|
105
105
|
|
106
106
|
return false unless node.parent
|
107
107
|
|
@@ -114,6 +114,10 @@ module RuboCop
|
|
114
114
|
end
|
115
115
|
|
116
116
|
def valid_options?(options)
|
117
|
+
return false if options.nil?
|
118
|
+
|
119
|
+
options = options.first.children.first.pairs if options.first.kwsplat_type?
|
120
|
+
|
117
121
|
return true unless options
|
118
122
|
return true if options.any? do |o|
|
119
123
|
dependent_option?(o) || present_option?(o)
|
@@ -27,6 +27,7 @@ module RuboCop
|
|
27
27
|
KEYWORD_ARGS = %i[
|
28
28
|
method params session body flash xhr as headers env to
|
29
29
|
].freeze
|
30
|
+
ROUTING_METHODS = %i[draw routes].freeze
|
30
31
|
RESTRICT_ON_SEND = %i[get post put patch delete head].freeze
|
31
32
|
|
32
33
|
minimum_target_rails_version 5.0
|
@@ -40,6 +41,8 @@ module RuboCop
|
|
40
41
|
PATTERN
|
41
42
|
|
42
43
|
def on_send(node)
|
44
|
+
return if in_routing_block?(node)
|
45
|
+
|
43
46
|
http_request?(node) do |data|
|
44
47
|
return unless needs_conversion?(data)
|
45
48
|
|
@@ -63,13 +66,17 @@ module RuboCop
|
|
63
66
|
|
64
67
|
private
|
65
68
|
|
69
|
+
def in_routing_block?(node)
|
70
|
+
!!node.each_ancestor(:block).detect { |block| ROUTING_METHODS.include?(block.send_node.method_name) }
|
71
|
+
end
|
72
|
+
|
66
73
|
def needs_conversion?(data)
|
67
74
|
return true unless data.hash_type?
|
68
75
|
return false if kwsplat_hash?(data)
|
69
76
|
|
70
77
|
data.each_pair.none? do |pair|
|
71
78
|
special_keyword_arg?(pair.key) ||
|
72
|
-
format_arg?(pair.key) && data.pairs.one?
|
79
|
+
(format_arg?(pair.key) && data.pairs.one?)
|
73
80
|
end
|
74
81
|
end
|
75
82
|
|
@@ -124,9 +124,10 @@ module RuboCop
|
|
124
124
|
block = parent.each_child_node(:begin).first
|
125
125
|
return unless block
|
126
126
|
|
127
|
-
|
127
|
+
defined_action_methods = defined_action_methods(block)
|
128
|
+
|
128
129
|
methods = array_values(methods_node).reject do |method|
|
129
|
-
|
130
|
+
defined_action_methods.include?(method)
|
130
131
|
end
|
131
132
|
|
132
133
|
message = message(methods, parent)
|
@@ -135,6 +136,26 @@ module RuboCop
|
|
135
136
|
|
136
137
|
private
|
137
138
|
|
139
|
+
def defined_action_methods(block)
|
140
|
+
defined_methods = block.each_child_node(:def).map(&:method_name)
|
141
|
+
|
142
|
+
defined_methods + aliased_action_methods(block, defined_methods)
|
143
|
+
end
|
144
|
+
|
145
|
+
def aliased_action_methods(node, defined_methods)
|
146
|
+
alias_methods = node.each_child_node(:send).select { |send_node| send_node.method?(:alias_method) }
|
147
|
+
|
148
|
+
hash_of_alias_methods = alias_methods.each_with_object({}) do |alias_method, result|
|
149
|
+
result[alias_method.last_argument.value] = alias_method.first_argument.value
|
150
|
+
end
|
151
|
+
|
152
|
+
defined_methods.each_with_object([]) do |defined_method, aliased_method|
|
153
|
+
if (new_method_name = hash_of_alias_methods[defined_method])
|
154
|
+
aliased_method << new_method_name
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
138
159
|
# @param node [RuboCop::AST::Node]
|
139
160
|
# @return [Array<Symbol>]
|
140
161
|
def array_values(node) # rubocop:disable Metrics/MethodLength
|
@@ -75,8 +75,8 @@ module RuboCop
|
|
75
75
|
corrector.replace(str_range, "#{existing_rel} noopener")
|
76
76
|
end
|
77
77
|
|
78
|
-
def add_rel(send_node,
|
79
|
-
opening_quote =
|
78
|
+
def add_rel(send_node, offense_node, corrector)
|
79
|
+
opening_quote = offense_node.children.last.source[0]
|
80
80
|
closing_quote = opening_quote == ':' ? '' : opening_quote
|
81
81
|
new_rel_exp = ", rel: #{opening_quote}noopener#{closing_quote}"
|
82
82
|
range = if (last_argument = send_node.last_argument).hash_type?
|
@@ -14,6 +14,9 @@ module RuboCop
|
|
14
14
|
# # good
|
15
15
|
# Rails.logger.debug 'A debug message'
|
16
16
|
class Output < Base
|
17
|
+
include RangeHelp
|
18
|
+
extend AutoCorrector
|
19
|
+
|
17
20
|
MSG = 'Do not write to stdout. ' \
|
18
21
|
"Use Rails's logger if you want to log."
|
19
22
|
RESTRICT_ON_SEND = %i[
|
@@ -35,10 +38,13 @@ module RuboCop
|
|
35
38
|
PATTERN
|
36
39
|
|
37
40
|
def on_send(node)
|
38
|
-
return unless (output?(node) || io_output?(node)) &&
|
39
|
-
|
41
|
+
return unless (output?(node) || io_output?(node)) && node.arguments?
|
42
|
+
|
43
|
+
range = offense_range(node)
|
40
44
|
|
41
|
-
add_offense(
|
45
|
+
add_offense(range) do |corrector|
|
46
|
+
corrector.replace(range, 'Rails.logger.debug')
|
47
|
+
end
|
42
48
|
end
|
43
49
|
|
44
50
|
private
|
@@ -46,6 +52,14 @@ module RuboCop
|
|
46
52
|
def match_gvar?(sym)
|
47
53
|
%i[$stdout $stderr].include?(sym)
|
48
54
|
end
|
55
|
+
|
56
|
+
def offense_range(node)
|
57
|
+
if node.receiver
|
58
|
+
range_between(node.loc.expression.begin_pos, node.loc.selector.end_pos)
|
59
|
+
else
|
60
|
+
node.loc.selector
|
61
|
+
end
|
62
|
+
end
|
49
63
|
end
|
50
64
|
end
|
51
65
|
end
|
@@ -61,8 +61,8 @@ module RuboCop
|
|
61
61
|
def offense?(node)
|
62
62
|
number, = *node.receiver
|
63
63
|
|
64
|
-
singular_receiver?(number) && plural_method?(node.method_name) ||
|
65
|
-
plural_receiver?(number) && singular_method?(node.method_name)
|
64
|
+
(singular_receiver?(number) && plural_method?(node.method_name)) ||
|
65
|
+
(plural_receiver?(number) && singular_method?(node.method_name))
|
66
66
|
end
|
67
67
|
|
68
68
|
def plural_method?(method_name)
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Rails
|
6
|
+
# This cop checks for redundant `travel_back` calls.
|
7
|
+
# Since Rails 5.2, `travel_back` is automatically called at the end of the test.
|
8
|
+
#
|
9
|
+
# @example
|
10
|
+
#
|
11
|
+
# # bad
|
12
|
+
# def teardown
|
13
|
+
# do_something
|
14
|
+
# travel_back
|
15
|
+
# end
|
16
|
+
#
|
17
|
+
# # good
|
18
|
+
# def teardown
|
19
|
+
# do_something
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# # bad
|
23
|
+
# after do
|
24
|
+
# do_something
|
25
|
+
# travel_back
|
26
|
+
# end
|
27
|
+
#
|
28
|
+
# # good
|
29
|
+
# after do
|
30
|
+
# do_something
|
31
|
+
# end
|
32
|
+
#
|
33
|
+
class RedundantTravelBack < Base
|
34
|
+
include RangeHelp
|
35
|
+
extend AutoCorrector
|
36
|
+
extend TargetRailsVersion
|
37
|
+
|
38
|
+
minimum_target_rails_version 5.2
|
39
|
+
|
40
|
+
MSG = 'Redundant `travel_back` detected.'
|
41
|
+
RESTRICT_ON_SEND = %i[travel_back].freeze
|
42
|
+
|
43
|
+
def on_send(node)
|
44
|
+
return unless node.each_ancestor(:def, :block).any? do |ancestor|
|
45
|
+
method_name = ancestor.def_type? ? :teardown : :after
|
46
|
+
|
47
|
+
ancestor.method?(method_name)
|
48
|
+
end
|
49
|
+
|
50
|
+
add_offense(node) do |corrector|
|
51
|
+
corrector.remove(range_by_whole_lines(node.source_range, include_final_newline: true))
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -343,8 +343,8 @@ module RuboCop
|
|
343
343
|
|
344
344
|
def within_reversible_or_up_only_block?(node)
|
345
345
|
node.each_ancestor(:block).any? do |ancestor|
|
346
|
-
ancestor.block_type? &&
|
347
|
-
ancestor.send_node.method?(:reversible) ||
|
346
|
+
(ancestor.block_type? &&
|
347
|
+
ancestor.send_node.method?(:reversible)) ||
|
348
348
|
ancestor.send_node.method?(:up_only)
|
349
349
|
end
|
350
350
|
end
|
@@ -14,6 +14,8 @@ module RuboCop
|
|
14
14
|
# # good
|
15
15
|
# scope :something, -> { where(something: true) }
|
16
16
|
class ScopeArgs < Base
|
17
|
+
extend AutoCorrector
|
18
|
+
|
17
19
|
MSG = 'Use `lambda`/`proc` instead of a plain method call.'
|
18
20
|
RESTRICT_ON_SEND = %i[scope].freeze
|
19
21
|
|
@@ -21,7 +23,9 @@ module RuboCop
|
|
21
23
|
|
22
24
|
def on_send(node)
|
23
25
|
scope?(node) do |second_arg|
|
24
|
-
add_offense(second_arg)
|
26
|
+
add_offense(second_arg) do |corrector|
|
27
|
+
corrector.replace(second_arg, "-> { #{second_arg.source} }")
|
28
|
+
end
|
25
29
|
end
|
26
30
|
end
|
27
31
|
end
|
@@ -72,6 +72,7 @@ require_relative 'rails/read_write_attribute'
|
|
72
72
|
require_relative 'rails/redundant_allow_nil'
|
73
73
|
require_relative 'rails/redundant_foreign_key'
|
74
74
|
require_relative 'rails/redundant_receiver_in_with_options'
|
75
|
+
require_relative 'rails/redundant_travel_back'
|
75
76
|
require_relative 'rails/reflection_class_name'
|
76
77
|
require_relative 'rails/refute_methods'
|
77
78
|
require_relative 'rails/relative_date_constant'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubocop-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.12.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bozhidar Batsov
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2021-
|
13
|
+
date: 2021-09-10 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activesupport
|
@@ -72,6 +72,7 @@ extra_rdoc_files:
|
|
72
72
|
files:
|
73
73
|
- LICENSE.txt
|
74
74
|
- README.md
|
75
|
+
- bin/console
|
75
76
|
- bin/setup
|
76
77
|
- config/default.yml
|
77
78
|
- config/obsoletion.yml
|
@@ -147,6 +148,7 @@ files:
|
|
147
148
|
- lib/rubocop/cop/rails/redundant_allow_nil.rb
|
148
149
|
- lib/rubocop/cop/rails/redundant_foreign_key.rb
|
149
150
|
- lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb
|
151
|
+
- lib/rubocop/cop/rails/redundant_travel_back.rb
|
150
152
|
- lib/rubocop/cop/rails/reflection_class_name.rb
|
151
153
|
- lib/rubocop/cop/rails/refute_methods.rb
|
152
154
|
- lib/rubocop/cop/rails/relative_date_constant.rb
|
@@ -186,7 +188,7 @@ metadata:
|
|
186
188
|
homepage_uri: https://docs.rubocop.org/rubocop-rails/
|
187
189
|
changelog_uri: https://github.com/rubocop/rubocop-rails/blob/master/CHANGELOG.md
|
188
190
|
source_code_uri: https://github.com/rubocop/rubocop-rails/
|
189
|
-
documentation_uri: https://docs.rubocop.org/rubocop-rails/2.
|
191
|
+
documentation_uri: https://docs.rubocop.org/rubocop-rails/2.12/
|
190
192
|
bug_tracker_uri: https://github.com/rubocop/rubocop-rails/issues
|
191
193
|
post_install_message:
|
192
194
|
rdoc_options: []
|