rubocop-rails 2.11.3 → 2.12.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: afc20a9d5f0799fab1f02a5a05c3b297a47b1713f6b948a25511da46b2e5a332
4
- data.tar.gz: d71033e04f2cd0b1f7801d1ab80d99859af6e3d1bfba9551dec1d18a0e7b40dc
3
+ metadata.gz: 547615c004c88ace5079ff3c4c0da33bbc3a6187b963baaf82ba34ee9a068224
4
+ data.tar.gz: b7b09ff7ab96257ea329a393158c656f2d92fa3e3528916dc4bd3664f2341f90
5
5
  SHA512:
6
- metadata.gz: eab328cf38c0f4957b79c3722175edd1a259af69f6c7c4a4501bc72a245b70ef3d4290b4daf4ef6925bf643dcffb1370a50ccfc5e7e870e138c3df675598df54
7
- data.tar.gz: 7fb02325ab085ed0d716718dc02da92b39da5710b117b49a722f8f0d4de4d2e47648278a39aff455b81d2186b4914eed7f797fbdfd86d2ff4ee570dc20543309
6
+ metadata.gz: 97f42ef251a1f3bcb91d0e08e3b89fb480a6555aa8f13266c57d0bf6b8319e35b4d200b8c4d2f407c303b8b8bbf72dc354a259688e27f032e625516683f1aafc
7
+ data.tar.gz: c9b8d93ad9c39f1903c2424c0e0e284281e7effe0373fbcfe8e3138b2dd659122fb69cb658b9560f4af8a94cd332ad80066b3617339a21ae24de47cf2987f2c6
data/bin/console ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'bundler/setup'
5
+ require 'irb'
6
+ require 'rubocop'
7
+ require 'rubocop-rails'
8
+
9
+ ARGV.clear
10
+
11
+ IRB.start(__FILE__)
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 `content_tag`.'
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 that `tag` is used instead of `content_tag`
7
- # because `content_tag` is legacy syntax.
6
+ # This cop checks legacy syntax usage of `tag`
8
7
  #
9
- # NOTE: Allow `content_tag` when the first argument is a variable because
10
- # `content_tag(name)` is simpler rather than `tag.public_send(name)`.
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
- # content_tag(:p, 'Hello world!')
15
- # content_tag(:br)
14
+ # tag(:p)
15
+ # tag(:br, class: 'classname')
16
16
  #
17
17
  # # good
18
- # tag.p('Hello world!')
19
- # tag.br
20
- # content_tag(name, 'Hello world!')
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 `content_tag`.'
29
- RESTRICT_ON_SEND = %i[content_tag].freeze
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
- add_offense(node) do |corrector|
42
- autocorrect(corrector, node)
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? || argument.send_type? || argument.const_type? || argument.splat_type?
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
- if method_name?(node.first_argument)
61
- range = correction_range(node)
66
+ def autocorrect(corrector, node, preferred_method)
67
+ range = correction_range(node)
62
68
 
63
- rest_args = node.arguments.drop(1)
64
- replacement = "tag.#{node.first_argument.value.to_s.underscore}(#{rest_args.map(&:source).join(', ')})"
69
+ rest_args = node.arguments.drop(1)
70
+ replacement = "tag.#{preferred_method}(#{rest_args.map(&:source).join(', ')})"
65
71
 
66
- corrector.replace(range, replacement)
67
- else
68
- corrector.replace(node.loc.selector, 'tag')
69
- end
72
+ corrector.replace(range, replacement)
70
73
  end
71
74
 
72
- def method_name?(node)
73
- return false unless node.str_type? || node.sym_type?
75
+ def allowed_name?(argument)
76
+ return false unless argument.str_type? || argument.sym_type?
74
77
 
75
- /^[a-zA-Z_][a-zA-Z_\-0-9]*$/.match?(node.value)
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)
@@ -114,6 +114,8 @@ module RuboCop
114
114
  end
115
115
 
116
116
  def valid_options?(options)
117
+ options = options.first.children.first.pairs if options.first.kwsplat_type?
118
+
117
119
  return true unless options
118
120
  return true if options.any? do |o|
119
121
  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
- defined_methods = block.each_child_node(:def).map(&:method_name)
127
+ defined_action_methods = defined_action_methods(block)
128
+
128
129
  methods = array_values(methods_node).reject do |method|
129
- defined_methods.include?(method)
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, offence_node, corrector)
79
- opening_quote = offence_node.children.last.source[0]
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
- node.arguments?
41
+ return unless (output?(node) || io_output?(node)) && node.arguments?
42
+
43
+ range = offense_range(node)
40
44
 
41
- add_offense(node.loc.selector)
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'
@@ -4,7 +4,7 @@ module RuboCop
4
4
  module Rails
5
5
  # This module holds the RuboCop Rails version information.
6
6
  module Version
7
- STRING = '2.11.3'
7
+ STRING = '2.12.0'
8
8
 
9
9
  def self.document_version
10
10
  STRING.match('\d+\.\d+').to_s
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.11.3
4
+ version: 2.12.0
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-07-11 00:00:00.000000000 Z
13
+ date: 2021-09-09 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.11/
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: []