rubocop-rails 2.14.2 → 2.15.2
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/config/default.yml +38 -6
- data/lib/rubocop/cop/rails/action_filter.rb +1 -1
- data/lib/rubocop/cop/rails/active_record_callbacks_order.rb +1 -1
- data/lib/rubocop/cop/rails/active_support_aliases.rb +1 -1
- data/lib/rubocop/cop/rails/add_column_index.rb +1 -1
- data/lib/rubocop/cop/rails/after_commit_override.rb +1 -1
- data/lib/rubocop/cop/rails/application_controller.rb +1 -1
- data/lib/rubocop/cop/rails/application_job.rb +1 -1
- data/lib/rubocop/cop/rails/application_mailer.rb +1 -1
- data/lib/rubocop/cop/rails/application_record.rb +1 -1
- data/lib/rubocop/cop/rails/arel_star.rb +1 -1
- data/lib/rubocop/cop/rails/attribute_default_block_value.rb +1 -1
- data/lib/rubocop/cop/rails/belongs_to.rb +1 -1
- data/lib/rubocop/cop/rails/blank.rb +4 -4
- data/lib/rubocop/cop/rails/bulk_change_table.rb +1 -1
- data/lib/rubocop/cop/rails/compact_blank.rb +1 -1
- data/lib/rubocop/cop/rails/content_tag.rb +1 -1
- data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +1 -1
- data/lib/rubocop/cop/rails/date.rb +8 -8
- data/lib/rubocop/cop/rails/default_scope.rb +1 -1
- data/lib/rubocop/cop/rails/delegate.rb +5 -10
- data/lib/rubocop/cop/rails/delegate_allow_blank.rb +1 -1
- data/lib/rubocop/cop/rails/deprecated_active_model_errors_methods.rb +58 -2
- data/lib/rubocop/cop/rails/dot_separated_keys.rb +71 -0
- data/lib/rubocop/cop/rails/duplicate_association.rb +2 -2
- data/lib/rubocop/cop/rails/duplicate_scope.rb +1 -1
- data/lib/rubocop/cop/rails/duration_arithmetic.rb +1 -1
- data/lib/rubocop/cop/rails/dynamic_find_by.rb +1 -1
- data/lib/rubocop/cop/rails/eager_evaluation_log_message.rb +1 -1
- data/lib/rubocop/cop/rails/enum_hash.rb +2 -3
- data/lib/rubocop/cop/rails/enum_uniqueness.rb +1 -1
- data/lib/rubocop/cop/rails/environment_comparison.rb +1 -1
- data/lib/rubocop/cop/rails/environment_variable_access.rb +1 -1
- data/lib/rubocop/cop/rails/exit.rb +1 -1
- data/lib/rubocop/cop/rails/expanded_date_range.rb +39 -23
- data/lib/rubocop/cop/rails/file_path.rb +12 -9
- data/lib/rubocop/cop/rails/find_by.rb +1 -1
- data/lib/rubocop/cop/rails/find_by_id.rb +1 -1
- data/lib/rubocop/cop/rails/find_each.rb +1 -1
- data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +1 -1
- data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +10 -2
- data/lib/rubocop/cop/rails/helper_instance_variable.rb +2 -2
- data/lib/rubocop/cop/rails/http_positional_arguments.rb +1 -1
- data/lib/rubocop/cop/rails/i18n_lazy_lookup.rb +1 -1
- data/lib/rubocop/cop/rails/i18n_locale_assignment.rb +1 -1
- data/lib/rubocop/cop/rails/ignored_skip_action_filter_option.rb +2 -2
- data/lib/rubocop/cop/rails/index_by.rb +1 -1
- data/lib/rubocop/cop/rails/index_with.rb +1 -1
- data/lib/rubocop/cop/rails/inquiry.rb +1 -1
- data/lib/rubocop/cop/rails/inverse_of.rb +1 -1
- data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +3 -3
- data/lib/rubocop/cop/rails/link_to_blank.rb +1 -1
- data/lib/rubocop/cop/rails/mailer_name.rb +1 -1
- data/lib/rubocop/cop/rails/match_route.rb +1 -1
- data/lib/rubocop/cop/rails/migration_class_name.rb +1 -1
- data/lib/rubocop/cop/rails/negate_include.rb +1 -1
- data/lib/rubocop/cop/rails/not_null_column.rb +1 -1
- data/lib/rubocop/cop/rails/order_by_id.rb +2 -3
- data/lib/rubocop/cop/rails/output.rb +1 -1
- data/lib/rubocop/cop/rails/output_safety.rb +1 -1
- data/lib/rubocop/cop/rails/pick.rb +1 -1
- data/lib/rubocop/cop/rails/pluck.rb +1 -1
- data/lib/rubocop/cop/rails/pluck_id.rb +1 -1
- data/lib/rubocop/cop/rails/pluck_in_where.rb +1 -1
- data/lib/rubocop/cop/rails/pluralization_grammar.rb +1 -1
- data/lib/rubocop/cop/rails/presence.rb +1 -1
- data/lib/rubocop/cop/rails/present.rb +2 -2
- data/lib/rubocop/cop/rails/rake_environment.rb +1 -1
- data/lib/rubocop/cop/rails/read_write_attribute.rb +1 -1
- data/lib/rubocop/cop/rails/redundant_foreign_key.rb +1 -1
- data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +1 -1
- data/lib/rubocop/cop/rails/redundant_travel_back.rb +1 -1
- data/lib/rubocop/cop/rails/reflection_class_name.rb +1 -1
- data/lib/rubocop/cop/rails/relative_date_constant.rb +1 -1
- data/lib/rubocop/cop/rails/render_inline.rb +1 -1
- data/lib/rubocop/cop/rails/render_plain_text.rb +1 -1
- data/lib/rubocop/cop/rails/request_referer.rb +1 -1
- data/lib/rubocop/cop/rails/require_dependency.rb +1 -1
- data/lib/rubocop/cop/rails/reversible_migration.rb +1 -1
- data/lib/rubocop/cop/rails/reversible_migration_method_definition.rb +4 -4
- data/lib/rubocop/cop/rails/root_public_path.rb +59 -0
- data/lib/rubocop/cop/rails/safe_navigation.rb +7 -12
- data/lib/rubocop/cop/rails/safe_navigation_with_blank.rb +1 -1
- data/lib/rubocop/cop/rails/save_bang.rb +2 -2
- data/lib/rubocop/cop/rails/schema_comment.rb +1 -1
- data/lib/rubocop/cop/rails/scope_args.rb +1 -1
- data/lib/rubocop/cop/rails/short_i18n.rb +1 -1
- data/lib/rubocop/cop/rails/skips_model_validations.rb +1 -1
- data/lib/rubocop/cop/rails/squished_sql_heredocs.rb +1 -1
- data/lib/rubocop/cop/rails/strip_heredoc.rb +56 -0
- data/lib/rubocop/cop/rails/table_name_assignment.rb +1 -1
- data/lib/rubocop/cop/rails/time_zone.rb +7 -7
- data/lib/rubocop/cop/rails/time_zone_assignment.rb +3 -3
- data/lib/rubocop/cop/rails/to_formatted_s.rb +46 -0
- data/lib/rubocop/cop/rails/transaction_exit_statement.rb +17 -10
- data/lib/rubocop/cop/rails/unique_validation_without_index.rb +2 -2
- data/lib/rubocop/cop/rails/unknown_env.rb +1 -1
- data/lib/rubocop/cop/rails/unused_ignored_columns.rb +1 -1
- data/lib/rubocop/cop/rails/validation.rb +1 -1
- data/lib/rubocop/cop/rails/where_equals.rb +1 -1
- data/lib/rubocop/cop/rails/where_exists.rb +2 -2
- data/lib/rubocop/cop/rails/where_not.rb +1 -1
- data/lib/rubocop/cop/rails_cops.rb +4 -0
- data/lib/rubocop/rails/schema_loader/schema.rb +8 -5
- data/lib/rubocop/rails/version.rb +1 -1
- data/lib/rubocop-rails.rb +8 -0
- metadata +9 -5
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Rails
|
|
6
|
-
#
|
|
6
|
+
# Checks for consistent uses of `request.referer` or
|
|
7
7
|
# `request.referrer`, depending on the cop's configuration.
|
|
8
8
|
#
|
|
9
9
|
# @example EnforcedStyle: referer (default)
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Rails
|
|
6
|
-
#
|
|
6
|
+
# Checks for the usage of `require_dependency`.
|
|
7
7
|
#
|
|
8
8
|
# `require_dependency` is an obsolete method for Rails applications running in Zeitwerk mode.
|
|
9
9
|
# In Zeitwerk mode, the semantics should match Ruby's and no need to be defensive with load order,
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Rails
|
|
6
|
-
#
|
|
6
|
+
# Checks whether the migration implements
|
|
7
7
|
# either a `change` method or both an `up` and a `down`
|
|
8
8
|
# method.
|
|
9
9
|
#
|
|
@@ -49,15 +49,15 @@ module RuboCop
|
|
|
49
49
|
'both an `up` and a `down` method.'
|
|
50
50
|
|
|
51
51
|
def_node_matcher :change_method?, <<~PATTERN
|
|
52
|
-
|
|
52
|
+
`(def :change (args) _)
|
|
53
53
|
PATTERN
|
|
54
54
|
|
|
55
55
|
def_node_matcher :up_and_down_methods?, <<~PATTERN
|
|
56
|
-
[
|
|
56
|
+
[`(def :up (args) _) `(def :down (args) _)]
|
|
57
57
|
PATTERN
|
|
58
58
|
|
|
59
59
|
def on_class(node)
|
|
60
|
-
return if change_method?(node) || up_and_down_methods?(node)
|
|
60
|
+
return if !migration_class?(node) || change_method?(node) || up_and_down_methods?(node)
|
|
61
61
|
|
|
62
62
|
add_offense(node)
|
|
63
63
|
end
|
|
@@ -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
|
-
#
|
|
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
|
|
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
|
-
#
|
|
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-
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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.
|
|
@@ -22,12 +22,12 @@ module RuboCop
|
|
|
22
22
|
MSG = 'Use `Time.use_zone` with block instead of `Time.zone=`.'
|
|
23
23
|
RESTRICT_ON_SEND = %i[zone=].freeze
|
|
24
24
|
|
|
25
|
-
def_node_matcher :
|
|
25
|
+
def_node_matcher :time_zone_assignment?, <<~PATTERN
|
|
26
26
|
(send (const nil? :Time) :zone= ...)
|
|
27
27
|
PATTERN
|
|
28
28
|
|
|
29
29
|
def on_send(node)
|
|
30
|
-
return unless
|
|
30
|
+
return unless time_zone_assignment?(node)
|
|
31
31
|
|
|
32
32
|
add_offense(node)
|
|
33
33
|
end
|
|
@@ -0,0 +1,46 @@
|
|
|
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
|
+
alias on_csend on_send
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Rails
|
|
6
|
-
#
|
|
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
|
+
# exited using these statements are being rollbacked rather than
|
|
10
10
|
# committed (pre ActiveRecord 7 behavior).
|
|
11
11
|
#
|
|
12
12
|
# As alternatives, it would be more intuitive to explicitly raise an
|
|
@@ -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
|
|
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
|
|
@@ -56,9 +56,9 @@ module RuboCop
|
|
|
56
56
|
|
|
57
57
|
def with_index?(klass, table, names)
|
|
58
58
|
# Compatibility for Rails 4.2.
|
|
59
|
-
|
|
59
|
+
add_indices = schema.add_indices_by(table_name: table_name(klass))
|
|
60
60
|
|
|
61
|
-
(table.indices +
|
|
61
|
+
(table.indices + add_indices).any? do |index|
|
|
62
62
|
index.unique &&
|
|
63
63
|
(index.columns.to_set == names ||
|
|
64
64
|
include_column_names_in_expression_index?(index, names))
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Rails
|
|
6
|
-
#
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
|
15
|
+
# This cop is unsafe for autocorrection because the behavior may change on the following case:
|
|
16
16
|
#
|
|
17
17
|
# [source,ruby]
|
|
18
18
|
# ----
|
|
@@ -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'
|