rubocop-rails 2.14.2 → 2.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (107) hide show
  1. checksums.yaml +4 -4
  2. data/config/default.yml +36 -5
  3. data/lib/rubocop/cop/rails/action_filter.rb +1 -1
  4. data/lib/rubocop/cop/rails/active_record_callbacks_order.rb +1 -1
  5. data/lib/rubocop/cop/rails/active_support_aliases.rb +1 -1
  6. data/lib/rubocop/cop/rails/add_column_index.rb +1 -1
  7. data/lib/rubocop/cop/rails/after_commit_override.rb +1 -1
  8. data/lib/rubocop/cop/rails/application_controller.rb +1 -1
  9. data/lib/rubocop/cop/rails/application_job.rb +1 -1
  10. data/lib/rubocop/cop/rails/application_mailer.rb +1 -1
  11. data/lib/rubocop/cop/rails/application_record.rb +1 -1
  12. data/lib/rubocop/cop/rails/arel_star.rb +1 -1
  13. data/lib/rubocop/cop/rails/attribute_default_block_value.rb +1 -1
  14. data/lib/rubocop/cop/rails/belongs_to.rb +1 -1
  15. data/lib/rubocop/cop/rails/blank.rb +4 -4
  16. data/lib/rubocop/cop/rails/bulk_change_table.rb +1 -1
  17. data/lib/rubocop/cop/rails/compact_blank.rb +1 -1
  18. data/lib/rubocop/cop/rails/content_tag.rb +1 -1
  19. data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +1 -1
  20. data/lib/rubocop/cop/rails/date.rb +8 -8
  21. data/lib/rubocop/cop/rails/default_scope.rb +1 -1
  22. data/lib/rubocop/cop/rails/delegate.rb +1 -1
  23. data/lib/rubocop/cop/rails/delegate_allow_blank.rb +1 -1
  24. data/lib/rubocop/cop/rails/deprecated_active_model_errors_methods.rb +56 -2
  25. data/lib/rubocop/cop/rails/dot_separated_keys.rb +71 -0
  26. data/lib/rubocop/cop/rails/duplicate_association.rb +2 -2
  27. data/lib/rubocop/cop/rails/duplicate_scope.rb +1 -1
  28. data/lib/rubocop/cop/rails/duration_arithmetic.rb +1 -1
  29. data/lib/rubocop/cop/rails/dynamic_find_by.rb +1 -1
  30. data/lib/rubocop/cop/rails/eager_evaluation_log_message.rb +1 -1
  31. data/lib/rubocop/cop/rails/enum_hash.rb +1 -1
  32. data/lib/rubocop/cop/rails/enum_uniqueness.rb +1 -1
  33. data/lib/rubocop/cop/rails/environment_comparison.rb +1 -1
  34. data/lib/rubocop/cop/rails/environment_variable_access.rb +1 -1
  35. data/lib/rubocop/cop/rails/exit.rb +1 -1
  36. data/lib/rubocop/cop/rails/expanded_date_range.rb +1 -1
  37. data/lib/rubocop/cop/rails/file_path.rb +12 -9
  38. data/lib/rubocop/cop/rails/find_by.rb +1 -1
  39. data/lib/rubocop/cop/rails/find_by_id.rb +1 -1
  40. data/lib/rubocop/cop/rails/find_each.rb +1 -1
  41. data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +1 -1
  42. data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +10 -2
  43. data/lib/rubocop/cop/rails/helper_instance_variable.rb +2 -2
  44. data/lib/rubocop/cop/rails/http_positional_arguments.rb +1 -1
  45. data/lib/rubocop/cop/rails/i18n_lazy_lookup.rb +1 -1
  46. data/lib/rubocop/cop/rails/i18n_locale_assignment.rb +1 -1
  47. data/lib/rubocop/cop/rails/ignored_skip_action_filter_option.rb +2 -2
  48. data/lib/rubocop/cop/rails/index_by.rb +1 -1
  49. data/lib/rubocop/cop/rails/index_with.rb +1 -1
  50. data/lib/rubocop/cop/rails/inquiry.rb +1 -1
  51. data/lib/rubocop/cop/rails/inverse_of.rb +1 -1
  52. data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +3 -3
  53. data/lib/rubocop/cop/rails/link_to_blank.rb +1 -1
  54. data/lib/rubocop/cop/rails/mailer_name.rb +1 -1
  55. data/lib/rubocop/cop/rails/match_route.rb +1 -1
  56. data/lib/rubocop/cop/rails/migration_class_name.rb +1 -1
  57. data/lib/rubocop/cop/rails/negate_include.rb +1 -1
  58. data/lib/rubocop/cop/rails/not_null_column.rb +1 -1
  59. data/lib/rubocop/cop/rails/order_by_id.rb +1 -1
  60. data/lib/rubocop/cop/rails/output.rb +1 -1
  61. data/lib/rubocop/cop/rails/output_safety.rb +1 -1
  62. data/lib/rubocop/cop/rails/pick.rb +1 -1
  63. data/lib/rubocop/cop/rails/pluck.rb +1 -1
  64. data/lib/rubocop/cop/rails/pluck_id.rb +1 -1
  65. data/lib/rubocop/cop/rails/pluck_in_where.rb +1 -1
  66. data/lib/rubocop/cop/rails/pluralization_grammar.rb +1 -1
  67. data/lib/rubocop/cop/rails/presence.rb +1 -1
  68. data/lib/rubocop/cop/rails/present.rb +2 -2
  69. data/lib/rubocop/cop/rails/rake_environment.rb +1 -1
  70. data/lib/rubocop/cop/rails/read_write_attribute.rb +1 -1
  71. data/lib/rubocop/cop/rails/redundant_foreign_key.rb +1 -1
  72. data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +1 -1
  73. data/lib/rubocop/cop/rails/redundant_travel_back.rb +1 -1
  74. data/lib/rubocop/cop/rails/reflection_class_name.rb +1 -1
  75. data/lib/rubocop/cop/rails/relative_date_constant.rb +1 -1
  76. data/lib/rubocop/cop/rails/render_inline.rb +1 -1
  77. data/lib/rubocop/cop/rails/render_plain_text.rb +1 -1
  78. data/lib/rubocop/cop/rails/request_referer.rb +1 -1
  79. data/lib/rubocop/cop/rails/require_dependency.rb +1 -1
  80. data/lib/rubocop/cop/rails/reversible_migration.rb +1 -1
  81. data/lib/rubocop/cop/rails/reversible_migration_method_definition.rb +4 -4
  82. data/lib/rubocop/cop/rails/root_public_path.rb +59 -0
  83. data/lib/rubocop/cop/rails/safe_navigation.rb +7 -12
  84. data/lib/rubocop/cop/rails/safe_navigation_with_blank.rb +1 -1
  85. data/lib/rubocop/cop/rails/save_bang.rb +2 -2
  86. data/lib/rubocop/cop/rails/schema_comment.rb +1 -1
  87. data/lib/rubocop/cop/rails/scope_args.rb +1 -1
  88. data/lib/rubocop/cop/rails/short_i18n.rb +1 -1
  89. data/lib/rubocop/cop/rails/skips_model_validations.rb +1 -1
  90. data/lib/rubocop/cop/rails/squished_sql_heredocs.rb +1 -1
  91. data/lib/rubocop/cop/rails/strip_heredoc.rb +56 -0
  92. data/lib/rubocop/cop/rails/table_name_assignment.rb +1 -1
  93. data/lib/rubocop/cop/rails/time_zone.rb +7 -7
  94. data/lib/rubocop/cop/rails/time_zone_assignment.rb +1 -1
  95. data/lib/rubocop/cop/rails/to_formatted_s.rb +45 -0
  96. data/lib/rubocop/cop/rails/transaction_exit_statement.rb +16 -9
  97. data/lib/rubocop/cop/rails/unknown_env.rb +1 -1
  98. data/lib/rubocop/cop/rails/unused_ignored_columns.rb +1 -1
  99. data/lib/rubocop/cop/rails/validation.rb +1 -1
  100. data/lib/rubocop/cop/rails/where_equals.rb +1 -1
  101. data/lib/rubocop/cop/rails/where_exists.rb +2 -2
  102. data/lib/rubocop/cop/rails/where_not.rb +1 -1
  103. data/lib/rubocop/cop/rails_cops.rb +4 -0
  104. data/lib/rubocop/rails/schema_loader/schema.rb +3 -0
  105. data/lib/rubocop/rails/version.rb +1 -1
  106. data/lib/rubocop-rails.rb +8 -0
  107. metadata +9 -5
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Rails
6
+ # Favor `Rails.public_path` over `Rails.root` with `'public'`
7
+ #
8
+ # @example
9
+ # # bad
10
+ # Rails.root.join('public')
11
+ # Rails.root.join('public/file.pdf')
12
+ # Rails.root.join('public', 'file.pdf')
13
+ #
14
+ # # good
15
+ # Rails.public_path
16
+ # Rails.public_path.join('file.pdf')
17
+ # Rails.public_path.join('file.pdf')
18
+ #
19
+ class RootPublicPath < Base
20
+ extend AutoCorrector
21
+
22
+ MSG = 'Use `Rails.public_path`.'
23
+
24
+ RESTRICT_ON_SEND = %i[join].to_set.freeze
25
+
26
+ PATTERN = %r{\Apublic(/|\z)}.freeze
27
+
28
+ def_node_matcher :rails_root_public, <<~PATTERN
29
+ (send
30
+ (send
31
+ $(const {nil? cbase} :Rails) :root) :join
32
+ (str $#public_path?) $...)
33
+ PATTERN
34
+
35
+ def on_send(node)
36
+ return unless (rails, maybe_public_path, other_args = rails_root_public(node))
37
+
38
+ add_offense(node) do |corrector|
39
+ first_args = maybe_public_path.gsub(PATTERN, '')
40
+
41
+ args = other_args.map(&:source)
42
+ args.unshift("'#{first_args}'") unless first_args.empty?
43
+
44
+ replacement = "#{rails.source}.public_path"
45
+ replacement += ".join(#{args.join(', ')})" unless args.empty?
46
+
47
+ corrector.replace(node, replacement)
48
+ end
49
+ end
50
+
51
+ private
52
+
53
+ def public_path?(string)
54
+ PATTERN.match?(string)
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -3,8 +3,9 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Rails
6
- # This cop converts usages of `try!` to `&.`. It can also be configured
7
- # to convert `try`. It will convert code to use safe navigation.
6
+ # Converts usages of `try!` to `&.`. It can also be configured
7
+ # to convert `try`. It will convert code to use safe navigation
8
+ # if the target Ruby version is set to 2.3+
8
9
  #
9
10
  # @example ConvertTry: false (default)
10
11
  # # bad
@@ -39,6 +40,9 @@ module RuboCop
39
40
  class SafeNavigation < Base
40
41
  include RangeHelp
41
42
  extend AutoCorrector
43
+ extend TargetRubyVersion
44
+
45
+ minimum_target_ruby_version 2.3
42
46
 
43
47
  MSG = 'Use safe navigation (`&.`) instead of `%<try>s`.'
44
48
  RESTRICT_ON_SEND = %i[try try!].freeze
@@ -47,15 +51,6 @@ module RuboCop
47
51
  (send _ ${:try :try!} $_ ...)
48
52
  PATTERN
49
53
 
50
- # Monkey patching for `Style/RedundantSelf` of RuboCop core.
51
- # rubocop:disable Style/ClassAndModuleChildren
52
- class Style::RedundantSelf
53
- def self.autocorrect_incompatible_with
54
- [Rails::SafeNavigation]
55
- end
56
- end
57
- # rubocop:enable Style/ClassAndModuleChildren
58
-
59
54
  def self.autocorrect_incompatible_with
60
55
  [Style::RedundantSelf]
61
56
  end
@@ -75,7 +70,7 @@ module RuboCop
75
70
 
76
71
  def autocorrect(corrector, node)
77
72
  method_node, *params = *node.arguments
78
- method = method_node.source[1..-1]
73
+ method = method_node.source[1..]
79
74
 
80
75
  range = if node.receiver
81
76
  range_between(node.loc.dot.begin_pos, node.loc.expression.end_pos)
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Rails
6
- # This cop checks to make sure safe navigation isn't used with `blank?` in
6
+ # Checks to make sure safe navigation isn't used with `blank?` in
7
7
  # a conditional.
8
8
  #
9
9
  # @safety
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Rails
6
- # This cop identifies possible cases where Active Record save! or related
6
+ # Identifies possible cases where Active Record save! or related
7
7
  # should be used instead of save because the model might have failed to
8
8
  # save and an exception is better than unhandled failure.
9
9
  #
@@ -37,7 +37,7 @@ module RuboCop
37
37
  #
38
38
  # update_attributes
39
39
  #
40
- # # After running rubocop --safe-auto-correct
40
+ # # After running rubocop --safe-autocorrect
41
41
  # def update_attributes
42
42
  # end
43
43
  #
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Rails
6
- # This cop enforces the use of the `comment` option when adding a new table or column
6
+ # Enforces the use of the `comment` option when adding a new table or column
7
7
  # to the database during a migration.
8
8
  #
9
9
  # @example
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Rails
6
- # This cop checks for scope calls where it was passed
6
+ # Checks for scope calls where it was passed
7
7
  # a method (usually a scope) instead of a lambda/proc.
8
8
  #
9
9
  # @example
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Rails
6
- # This cop enforces that short forms of `I18n` methods are used:
6
+ # Enforces that short forms of `I18n` methods are used:
7
7
  # `t` instead of `translate` and `l` instead of `localize`.
8
8
  #
9
9
  # This cop has two different enforcement modes. When the EnforcedStyle
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Rails
6
- # This cop checks for the use of methods which skip
6
+ # Checks for the use of methods which skip
7
7
  # validations which are listed in
8
8
  # https://guides.rubyonrails.org/active_record_validations.html#skipping-validations
9
9
  #
@@ -8,7 +8,7 @@ module RuboCop
8
8
  #
9
9
  # @safety
10
10
  # Some SQL syntax (e.g. PostgreSQL comments and functions) requires newlines
11
- # to be preserved in order to work, thus auto-correction for this cop is not safe.
11
+ # to be preserved in order to work, thus autocorrection for this cop is not safe.
12
12
  #
13
13
  # @example
14
14
  # # bad
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Rails
6
+ # Enforces the use of squiggly heredoc over `strip_heredoc`.
7
+ #
8
+ # @example
9
+ #
10
+ # # bad
11
+ # <<EOS.strip_heredoc
12
+ # some text
13
+ # EOS
14
+ #
15
+ # # bad
16
+ # <<-EOS.strip_heredoc
17
+ # some text
18
+ # EOS
19
+ #
20
+ # # good
21
+ # <<~EOS
22
+ # some text
23
+ # EOS
24
+ #
25
+ class StripHeredoc < Base
26
+ extend AutoCorrector
27
+ extend TargetRubyVersion
28
+
29
+ MSG = 'Use squiggly heredoc (`<<~`) instead of `strip_heredoc`.'
30
+ RESTRICT_ON_SEND = %i[strip_heredoc].freeze
31
+
32
+ minimum_target_ruby_version 2.3
33
+
34
+ def on_send(node)
35
+ return unless (receiver = node.receiver)
36
+ return unless receiver.str_type? || receiver.dstr_type?
37
+ return unless receiver.respond_to?(:heredoc?) && receiver.heredoc?
38
+
39
+ register_offense(node, receiver)
40
+ end
41
+
42
+ private
43
+
44
+ def register_offense(node, heredoc)
45
+ add_offense(node) do |corrector|
46
+ squiggly_heredoc = heredoc.source.sub(/\A<<-?/, '<<~')
47
+
48
+ corrector.replace(heredoc, squiggly_heredoc)
49
+ corrector.remove(node.loc.dot)
50
+ corrector.remove(node.loc.selector)
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Rails
6
- # This cop enforces the absence of explicit table name assignment.
6
+ # Enforces the absence of explicit table name assignment.
7
7
  #
8
8
  # `self.table_name=` should only be used for very good reasons,
9
9
  # such as not having control over the database, or working
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Rails
6
- # This cop checks for the use of Time methods without zone.
6
+ # Checks for the use of Time methods without zone.
7
7
  #
8
8
  # Built on top of Ruby on Rails style guide (https://rails.rubystyle.guide#time)
9
9
  # and the article http://danilenko.org/2012/7/6/rails_timezones/
@@ -28,17 +28,17 @@ module RuboCop
28
28
  # Time.zone.parse('2015-03-02T19:05:37')
29
29
  # Time.zone.parse('2015-03-02T19:05:37Z') # Respect ISO 8601 format with timezone specifier.
30
30
  #
31
- # @example EnforcedStyle: strict
32
- # # `strict` means that `Time` should be used with `zone`.
33
- #
34
- # # bad
35
- # Time.at(timestamp).in_time_zone
36
- #
37
31
  # @example EnforcedStyle: flexible (default)
38
32
  # # `flexible` allows usage of `in_time_zone` instead of `zone`.
39
33
  #
40
34
  # # good
41
35
  # Time.at(timestamp).in_time_zone
36
+ #
37
+ # @example EnforcedStyle: strict
38
+ # # `strict` means that `Time` should be used with `zone`.
39
+ #
40
+ # # bad
41
+ # Time.at(timestamp).in_time_zone
42
42
  class TimeZone < Base
43
43
  include ConfigurableEnforcedStyle
44
44
  extend AutoCorrector
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Rails
6
- # This cop checks for the use of `Time.zone=` method.
6
+ # Checks for the use of `Time.zone=` method.
7
7
  #
8
8
  # The `zone` attribute persists for the rest of the Ruby runtime, potentially causing
9
9
  # unexpected behavior at a later time.
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Rails
6
+ # Checks for consistent uses of `to_fs` or `to_formatted_s`,
7
+ # depending on the cop's configuration.
8
+ #
9
+ # @example EnforcedStyle: to_fs (default)
10
+ #
11
+ # # bad
12
+ # time.to_formatted_s(:db)
13
+ #
14
+ # # good
15
+ # time.to_fs(:db)
16
+ #
17
+ # @example EnforcedStyle: to_formatted_s
18
+ #
19
+ # # bad
20
+ # time.to_fs(:db)
21
+ #
22
+ # # good
23
+ # time.to_formatted_s(:db)
24
+ #
25
+ class ToFormattedS < Base
26
+ include ConfigurableEnforcedStyle
27
+ extend AutoCorrector
28
+ extend TargetRailsVersion
29
+
30
+ minimum_target_rails_version 7.0
31
+
32
+ MSG = 'Use `%<prefer>s` instead.'
33
+ RESTRICT_ON_SEND = %i[to_formatted_s to_fs].freeze
34
+
35
+ def on_send(node)
36
+ return if node.method?(style)
37
+
38
+ add_offense(node.loc.selector, message: format(MSG, prefer: style)) do |corrector|
39
+ corrector.replace(node.loc.selector, style)
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Rails
6
- # This cop checks for the use of exit statements (namely `return`,
6
+ # Checks for the use of exit statements (namely `return`,
7
7
  # `break` and `throw`) in transactions. This is due to the eventual
8
8
  # unexpected behavior when using ActiveRecord >= 7, where transactions
9
9
  # exitted using these statements are being rollbacked rather than
@@ -29,6 +29,11 @@ module RuboCop
29
29
  # throw if user.active?
30
30
  # end
31
31
  #
32
+ # # bad, as `with_lock` implicitly opens a transaction too
33
+ # user.with_lock do
34
+ # throw if user.active?
35
+ # end
36
+ #
32
37
  # # good
33
38
  # ApplicationRecord.transaction do
34
39
  # # Rollback
@@ -47,18 +52,26 @@ module RuboCop
47
52
  Exit statement `%<statement>s` is not allowed. Use `raise` (rollback) or `next` (commit).
48
53
  MSG
49
54
 
50
- RESTRICT_ON_SEND = %i[transaction].freeze
55
+ RESTRICT_ON_SEND = %i[transaction with_lock].freeze
51
56
 
52
57
  def_node_search :exit_statements, <<~PATTERN
53
58
  ({return | break | send nil? :throw} ...)
54
59
  PATTERN
55
60
 
61
+ def_node_matcher :rescue_body_return_node?, <<~PATTERN
62
+ (:resbody ...
63
+ ...
64
+ ({return | break | send nil? :throw} ...)
65
+ ...
66
+ )
67
+ PATTERN
68
+
56
69
  def on_send(node)
57
70
  return unless (parent = node.parent)
58
71
  return unless parent.block_type? && parent.body
59
72
 
60
73
  exit_statements(parent.body).each do |statement_node|
61
- next if in_rescue?(statement_node) || nested_block?(statement_node)
74
+ next if statement_node.break_type? && nested_block?(statement_node)
62
75
 
63
76
  statement = statement(statement_node)
64
77
  message = format(MSG, statement: statement)
@@ -79,13 +92,7 @@ module RuboCop
79
92
  end
80
93
  end
81
94
 
82
- def in_rescue?(statement_node)
83
- statement_node.ancestors.find(&:rescue_type?)
84
- end
85
-
86
95
  def nested_block?(statement_node)
87
- return false unless statement_node.break_type?
88
-
89
96
  !statement_node.ancestors.find(&:block_type?).method?(:transaction)
90
97
  end
91
98
  end
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Rails
6
- # This cop checks that environments called with `Rails.env` predicates
6
+ # Checks that environments called with `Rails.env` predicates
7
7
  # exist.
8
8
  # By default the cop allows three environments which Rails ships with:
9
9
  # `development`, `test`, and `production`.
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Rails
6
- # This cop suggests you remove a column that does not exist in the schema from `ignored_columns`.
6
+ # Suggests you remove a column that does not exist in the schema from `ignored_columns`.
7
7
  # `ignored_columns` is necessary to drop a column from RDBMS, but you don't need it after the migration
8
8
  # to drop the column. You avoid forgetting to remove `ignored_columns` by this cop.
9
9
  #
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Rails
6
- # This cop checks for the use of old-style attribute validation macros.
6
+ # Checks for the use of old-style attribute validation macros.
7
7
  #
8
8
  # @example
9
9
  # # bad
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Rails
6
- # This cop identifies places where manually constructed SQL
6
+ # Identifies places where manually constructed SQL
7
7
  # in `where` can be replaced with `where(attribute: value)`.
8
8
  #
9
9
  # @safety
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Rails
6
- # This cop enforces consistent style when using `exists?`.
6
+ # Enforces consistent style when using `exists?`.
7
7
  #
8
8
  # Two styles are supported for this cop. When EnforcedStyle is 'exists'
9
9
  # then the cop enforces `exists?(...)` over `where(...).exists?`.
@@ -12,7 +12,7 @@ module RuboCop
12
12
  # `where(...).exists?` over `exists?(...)`.
13
13
  #
14
14
  # @safety
15
- # This cop is unsafe for auto-correction because the behavior may change on the following case:
15
+ # This cop is unsafe for autocorrection because the behavior may change on the following case:
16
16
  #
17
17
  # [source,ruby]
18
18
  # ----
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Rails
6
- # This cop identifies places where manually constructed SQL
6
+ # Identifies places where manually constructed SQL
7
7
  # in `where` can be replaced with `where.not(...)`.
8
8
  #
9
9
  # @example
@@ -34,6 +34,7 @@ require_relative 'rails/default_scope'
34
34
  require_relative 'rails/delegate'
35
35
  require_relative 'rails/delegate_allow_blank'
36
36
  require_relative 'rails/deprecated_active_model_errors_methods'
37
+ require_relative 'rails/dot_separated_keys'
37
38
  require_relative 'rails/duplicate_association'
38
39
  require_relative 'rails/duplicate_scope'
39
40
  require_relative 'rails/duration_arithmetic'
@@ -96,6 +97,7 @@ require_relative 'rails/require_dependency'
96
97
  require_relative 'rails/reversible_migration'
97
98
  require_relative 'rails/reversible_migration_method_definition'
98
99
  require_relative 'rails/root_join_chain'
100
+ require_relative 'rails/root_public_path'
99
101
  require_relative 'rails/safe_navigation'
100
102
  require_relative 'rails/safe_navigation_with_blank'
101
103
  require_relative 'rails/save_bang'
@@ -104,9 +106,11 @@ require_relative 'rails/scope_args'
104
106
  require_relative 'rails/short_i18n'
105
107
  require_relative 'rails/skips_model_validations'
106
108
  require_relative 'rails/squished_sql_heredocs'
109
+ require_relative 'rails/strip_heredoc'
107
110
  require_relative 'rails/table_name_assignment'
108
111
  require_relative 'rails/time_zone'
109
112
  require_relative 'rails/time_zone_assignment'
113
+ require_relative 'rails/to_formatted_s'
110
114
  require_relative 'rails/transaction_exit_statement'
111
115
  require_relative 'rails/uniq_before_pluck'
112
116
  require_relative 'rails/unique_validation_without_index'
@@ -32,6 +32,8 @@ module RuboCop
32
32
  raise "Unexpected type: #{ast.type}" unless ast.block_type?
33
33
 
34
34
  each_table(ast) do |table_def|
35
+ next unless table_def.method?(:create_table)
36
+
35
37
  @tables << Table.new(table_def)
36
38
  end
37
39
 
@@ -56,6 +58,7 @@ module RuboCop
56
58
 
57
59
  def each_add_index(ast)
58
60
  ast.body.children.each do |node|
61
+ next unless node.respond_to?(:send_type?)
59
62
  next if !node&.send_type? || !node.method?(:add_index)
60
63
 
61
64
  yield(node)
@@ -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.14.2'
7
+ STRING = '2.15.0'
8
8
 
9
9
  def self.document_version
10
10
  STRING.match('\d+\.\d+').to_s
data/lib/rubocop-rails.rb CHANGED
@@ -13,3 +13,11 @@ require_relative 'rubocop/rails/schema_loader/schema'
13
13
  RuboCop::Rails::Inject.defaults!
14
14
 
15
15
  require_relative 'rubocop/cop/rails_cops'
16
+
17
+ RuboCop::Cop::Style::RedundantSelf.singleton_class.prepend(
18
+ Module.new do
19
+ def autocorrect_incompatible_with
20
+ super.push(RuboCop::Cop::Rails::SafeNavigation)
21
+ end
22
+ end
23
+ )
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.14.2
4
+ version: 2.15.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: 2022-03-18 00:00:00.000000000 Z
13
+ date: 2022-06-14 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activesupport
@@ -110,6 +110,7 @@ files:
110
110
  - lib/rubocop/cop/rails/delegate.rb
111
111
  - lib/rubocop/cop/rails/delegate_allow_blank.rb
112
112
  - lib/rubocop/cop/rails/deprecated_active_model_errors_methods.rb
113
+ - lib/rubocop/cop/rails/dot_separated_keys.rb
113
114
  - lib/rubocop/cop/rails/duplicate_association.rb
114
115
  - lib/rubocop/cop/rails/duplicate_scope.rb
115
116
  - lib/rubocop/cop/rails/duration_arithmetic.rb
@@ -172,6 +173,7 @@ files:
172
173
  - lib/rubocop/cop/rails/reversible_migration.rb
173
174
  - lib/rubocop/cop/rails/reversible_migration_method_definition.rb
174
175
  - lib/rubocop/cop/rails/root_join_chain.rb
176
+ - lib/rubocop/cop/rails/root_public_path.rb
175
177
  - lib/rubocop/cop/rails/safe_navigation.rb
176
178
  - lib/rubocop/cop/rails/safe_navigation_with_blank.rb
177
179
  - lib/rubocop/cop/rails/save_bang.rb
@@ -180,9 +182,11 @@ files:
180
182
  - lib/rubocop/cop/rails/short_i18n.rb
181
183
  - lib/rubocop/cop/rails/skips_model_validations.rb
182
184
  - lib/rubocop/cop/rails/squished_sql_heredocs.rb
185
+ - lib/rubocop/cop/rails/strip_heredoc.rb
183
186
  - lib/rubocop/cop/rails/table_name_assignment.rb
184
187
  - lib/rubocop/cop/rails/time_zone.rb
185
188
  - lib/rubocop/cop/rails/time_zone_assignment.rb
189
+ - lib/rubocop/cop/rails/to_formatted_s.rb
186
190
  - lib/rubocop/cop/rails/transaction_exit_statement.rb
187
191
  - lib/rubocop/cop/rails/uniq_before_pluck.rb
188
192
  - lib/rubocop/cop/rails/unique_validation_without_index.rb
@@ -205,7 +209,7 @@ metadata:
205
209
  homepage_uri: https://docs.rubocop.org/rubocop-rails/
206
210
  changelog_uri: https://github.com/rubocop/rubocop-rails/blob/master/CHANGELOG.md
207
211
  source_code_uri: https://github.com/rubocop/rubocop-rails/
208
- documentation_uri: https://docs.rubocop.org/rubocop-rails/2.14/
212
+ documentation_uri: https://docs.rubocop.org/rubocop-rails/2.15/
209
213
  bug_tracker_uri: https://github.com/rubocop/rubocop-rails/issues
210
214
  rubygems_mfa_required: 'true'
211
215
  post_install_message:
@@ -216,14 +220,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
216
220
  requirements:
217
221
  - - ">="
218
222
  - !ruby/object:Gem::Version
219
- version: 2.5.0
223
+ version: 2.6.0
220
224
  required_rubygems_version: !ruby/object:Gem::Requirement
221
225
  requirements:
222
226
  - - ">="
223
227
  - !ruby/object:Gem::Version
224
228
  version: '0'
225
229
  requirements: []
226
- rubygems_version: 3.3.3
230
+ rubygems_version: 3.4.0.dev
227
231
  signing_key:
228
232
  specification_version: 4
229
233
  summary: Automatic Rails code style checking tool.