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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: afc20a9d5f0799fab1f02a5a05c3b297a47b1713f6b948a25511da46b2e5a332
4
- data.tar.gz: d71033e04f2cd0b1f7801d1ab80d99859af6e3d1bfba9551dec1d18a0e7b40dc
3
+ metadata.gz: 8fb49b448d769c9ff936129480584da1cfb68abc6f9697a845c94c7d345c7077
4
+ data.tar.gz: 9309aca423686c3df184c22a25320f90f9eae5b0c2c033447fff1dbbc7458518
5
5
  SHA512:
6
- metadata.gz: eab328cf38c0f4957b79c3722175edd1a259af69f6c7c4a4501bc72a245b70ef3d4290b4daf4ef6925bf643dcffb1370a50ccfc5e7e870e138c3df675598df54
7
- data.tar.gz: 7fb02325ab085ed0d716718dc02da92b39da5710b117b49a722f8f0d4de4d2e47648278a39aff455b81d2186b4914eed7f797fbdfd86d2ff4ee570dc20543309
6
+ metadata.gz: 4d209b60d9c4cb2a1d1e0786936cb2ecac1d0debfc7fc83fc91e959a07a42a8f7ad8d5eba05c015b4c27cd79c342ce4e2f057399cbbd12af01218ff79f13d5b5
7
+ data.tar.gz: a18599aa1218bedcd1854db939fad42265d1de222b0d5fc633f30844dc3f4bc65b97fc943511dc902c5bd8588fcbb20c3424d4db3b6d9ad4e534691a2d4cfe89
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)
@@ -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?(with_options_block(node))
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
- 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.1'
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.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-07-11 00:00:00.000000000 Z
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.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: []