# Common configuration.

inherit_mode:
  merge:
    - Exclude

AllCops:
  Exclude:
    - bin/*
    # Exclude db/schema.rb and db/[CONFIGURATION_NAMESPACE]_schema.rb by default.
    # See: https://guides.rubyonrails.org/active_record_multiple_databases.html#setting-up-your-application
    - db/*schema.rb
  # What version of Rails is the inspected code using?  If a value is specified
  # for TargetRailsVersion then it is used.  Acceptable values are specified
  # as a float (i.e. 5.1); the patch version of Rails should not be included.
  # If TargetRailsVersion is not set, RuboCop will parse the Gemfile.lock or
  # gems.locked file to find the version of Rails that has been bound to the
  # application.  If neither of those files exist, RuboCop will use Rails 5.0
  # as the default.
  TargetRailsVersion: ~

Lint/NumberConversion:
  # Add Rails' duration methods to the ignore list for `Lint/NumberConversion`
  # so that calling `to_i` on one of these does not register an offense.
  # See: https://github.com/rubocop/rubocop/issues/8950
  IgnoredMethods:
    - ago
    - from_now
    - second
    - seconds
    - minute
    - minutes
    - hour
    - hours
    - day
    - days
    - week
    - weeks
    - fortnight
    - fortnights
    - in_milliseconds

Rails/ActionControllerTestCase:
  Description: 'Use `ActionDispatch::IntegrationTest` instead of `ActionController::TestCase`.'
  StyleGuide: 'https://rails.rubystyle.guide/#integration-testing'
  Reference: 'https://api.rubyonrails.org/classes/ActionController/TestCase.html'
  Enabled: 'pending'
  SafeAutocorrect: false
  VersionAdded: '2.14'
  Include:
    - '**/test/**/*.rb'

Rails/ActionFilter:
  Description: 'Enforces consistent use of action filter methods.'
  Enabled: true
  VersionAdded: '0.19'
  EnforcedStyle: action
  SupportedStyles:
    - action
    - filter
  Include:
    - app/controllers/**/*.rb
    - app/mailers/**/*.rb

Rails/ActiveRecordAliases:
  Description: >-
                  Avoid Active Record aliases:
                  Use `update` instead of `update_attributes`.
                  Use `update!` instead of `update_attributes!`.
  Enabled: true
  VersionAdded: '0.53'
  SafeAutoCorrect: false

Rails/ActiveRecordCallbacksOrder:
  Description: 'Order callback declarations in the order in which they will be executed.'
  StyleGuide: 'https://rails.rubystyle.guide/#callbacks-order'
  Enabled: 'pending'
  VersionAdded: '2.7'
  Include:
    - app/models/**/*.rb

Rails/ActiveRecordOverride:
  Description: >-
                  Check for overriding Active Record methods instead of using
                  callbacks.
  Enabled: true
  VersionAdded: '0.67'
  Include:
    - app/models/**/*.rb

Rails/ActiveSupportAliases:
  Description: >-
                  Avoid ActiveSupport aliases of standard ruby methods:
                  `String#starts_with?`, `String#ends_with?`,
                  `Array#append`, `Array#prepend`.
  Enabled: true
  VersionAdded: '0.48'

Rails/AddColumnIndex:
  Description: >-
    Rails migrations don't make use of a given `index` key, but also
    doesn't given an error when it's used, so it makes it seem like an
    index might be used.
  Enabled: pending
  VersionAdded: '2.11'
  Include:
    - db/migrate/*.rb

Rails/AfterCommitOverride:
  Description: >-
                  Enforces that there is only one call to `after_commit`
                  (and its aliases - `after_create_commit`, `after_update_commit`,
                  and `after_destroy_commit`) with the same callback name per model.
  Enabled: 'pending'
  VersionAdded: '2.8'

Rails/ApplicationController:
  Description: 'Check that controllers subclass ApplicationController.'
  Enabled: true
  SafeAutoCorrect: false
  VersionAdded: '2.4'
  VersionChanged: '2.5'

Rails/ApplicationJob:
  Description: 'Check that jobs subclass ApplicationJob.'
  Enabled: true
  SafeAutoCorrect: false
  VersionAdded: '0.49'
  VersionChanged: '2.5'

Rails/ApplicationMailer:
  Description: 'Check that mailers subclass ApplicationMailer.'
  Enabled: true
  SafeAutoCorrect: false
  VersionAdded: '2.4'
  VersionChanged: '2.5'

Rails/ApplicationRecord:
  Description: 'Check that models subclass ApplicationRecord.'
  Enabled: true
  SafeAutoCorrect: false
  VersionAdded: '0.49'
  VersionChanged: '2.5'

Rails/ArelStar:
  Description: 'Enforces `Arel.star` instead of `"*"` for expanded columns.'
  Enabled: true
  SafeAutoCorrect: false
  VersionAdded: '2.9'

Rails/AssertNot:
  Description: 'Use `assert_not` instead of `assert !`.'
  Enabled: true
  VersionAdded: '0.56'
  Include:
    - '**/test/**/*'

Rails/AttributeDefaultBlockValue:
  Description: 'Pass method call in block for attribute option `default`.'
  Enabled: pending
  VersionAdded: '2.9'
  Include:
    - 'app/models/**/*'

Rails/BelongsTo:
  Description: >-
                  Use `optional: true` instead of `required: false` for
                  `belongs_to` relations.
  Enabled: true
  VersionAdded: '0.62'

Rails/Blank:
  Description: 'Enforces use of `blank?`.'
  Enabled: true
  SafeAutoCorrect: false
  VersionAdded: '0.48'
  VersionChanged: '2.10'
  # Convert usages of `nil? || empty?` to `blank?`
  NilOrEmpty: true
  # Convert usages of `!present?` to `blank?`
  NotPresent: true
  # Convert usages of `unless present?` to `if blank?`
  UnlessPresent: true

Rails/BulkChangeTable:
  Description: 'Check whether alter queries are combinable.'
  Enabled: true
  VersionAdded: '0.57'
  Database: null
  SupportedDatabases:
    - mysql
    - postgresql
  Include:
    - db/migrate/*.rb

Rails/CompactBlank:
  Description: 'Checks if collection can be blank-compacted with `compact_blank`.'
  Enabled: pending
  Safe: false
  VersionAdded: '2.13'

Rails/ContentTag:
  Description: 'Use `tag.something` instead of `tag(:something)`.'
  Reference:
    - 'https://github.com/rubocop/rubocop-rails/issues/260'
    - 'https://github.com/rails/rails/issues/25195'
    - 'https://api.rubyonrails.org/classes/ActionView/Helpers/TagHelper.html#method-i-content_tag'
  Enabled: true
  VersionAdded: '2.6'
  VersionChanged: '2.12'
  # This `Exclude` config prevents false positives for `tag` calls to `has_one: tag` and Puma configuration:
  # https://puma.io/puma/Puma/DSL.html#tag-instance_method
  # No helpers are used in normal models and configs.
  Exclude:
    - app/models/**/*.rb
    - config/**/*.rb

Rails/CreateTableWithTimestamps:
  Description: >-
                  Checks the migration for which timestamps are not included
                  when creating a new table.
  Enabled: true
  VersionAdded: '0.52'
  Include:
    - db/migrate/*.rb
  Exclude:
    # Respect the `active_storage_variant_records` table of `*_create_active_storage_tables.active_storage.rb`
    # auto-generated by `bin/rails active_storage:install` even if `created_at` is not specified.
    - db/migrate/*_create_active_storage_tables.active_storage.rb

Rails/Date:
  Description: >-
                  Checks the correct usage of date aware methods,
                  such as Date.today, Date.current etc.
  Enabled: true
  VersionAdded: '0.30'
  VersionChanged: '2.11'
  # The value `strict` disallows usage of `Date.today`, `Date.current`,
  # `Date#to_time` etc.
  # The value `flexible` allows usage of `Date.current`, `Date.yesterday`, etc
  # (but not `Date.today`) which are overridden by ActiveSupport to handle current
  # time zone.
  EnforcedStyle: flexible
  SupportedStyles:
    - strict
    - flexible
  AllowToTime: true

Rails/DefaultScope:
  Description: 'Avoid use of `default_scope`.'
  StyleGuide: 'https://rails.rubystyle.guide#avoid-default-scope'
  Enabled: false
  VersionAdded: '2.7'

Rails/Delegate:
  Description: 'Prefer delegate method for delegations.'
  Enabled: true
  VersionAdded: '0.21'
  VersionChanged: '0.50'
  # When set to true, using the target object as a prefix of the
  # method name without using the `delegate` method will be a
  # violation. When set to false, this case is legal.
  EnforceForPrefixed: true

Rails/DelegateAllowBlank:
  Description: 'Do not use allow_blank as an option to delegate.'
  Enabled: true
  VersionAdded: '0.44'

Rails/DeprecatedActiveModelErrorsMethods:
  Description: 'Avoid manipulating ActiveModel errors hash directly.'
  Enabled: pending
  Safe: false
  VersionAdded: '2.14'
  VersionChanged: '2.15'

Rails/DotSeparatedKeys:
  Description: 'Enforces the use of dot-separated keys instead of `:scope` options in `I18n` translation methods.'
  StyleGuide: 'https://rails.rubystyle.guide/#dot-separated-keys'
  Enabled: pending
  VersionAdded: '2.15'

Rails/DuplicateAssociation:
  Description: "Don't repeat associations in a model."
  Enabled: pending
  VersionAdded: '2.14'

Rails/DuplicateScope:
  Description: 'Multiple scopes share this same where clause.'
  Enabled: pending
  VersionAdded: '2.14'

Rails/DurationArithmetic:
  Description: 'Do not use duration as arithmetic operand with `Time.current`.'
  StyleGuide: 'https://rails.rubystyle.guide#duration-arithmetic'
  Enabled: pending
  VersionAdded: '2.13'

Rails/DynamicFindBy:
  Description: 'Use `find_by` instead of dynamic `find_by_*`.'
  StyleGuide: 'https://rails.rubystyle.guide#find_by'
  Enabled: true
  Safe: false
  VersionAdded: '0.44'
  VersionChanged: '2.10'
  # The `Whitelist` has been deprecated, Please use `AllowedMethods` instead.
  Whitelist:
    - find_by_sql
  AllowedMethods:
    - find_by_sql
  AllowedReceivers:
    - Gem::Specification

Rails/EagerEvaluationLogMessage:
  Description: 'Checks that blocks are used for interpolated strings passed to `Rails.logger.debug`.'
  Reference: 'https://guides.rubyonrails.org/debugging_rails_applications.html#impact-of-logs-on-performance'
  Enabled: pending
  VersionAdded: '2.11'

Rails/EnumHash:
  Description: 'Prefer hash syntax over array syntax when defining enums.'
  StyleGuide: 'https://rails.rubystyle.guide#enums'
  Enabled: true
  VersionAdded: '2.3'
  Include:
    - app/models/**/*.rb

Rails/EnumUniqueness:
  Description: 'Avoid duplicate integers in hash-syntax `enum` declaration.'
  Enabled: true
  VersionAdded: '0.46'
  Include:
    - app/models/**/*.rb

Rails/EnvironmentComparison:
  Description: "Favor `Rails.env.production?` over `Rails.env == 'production'`."
  Enabled: true
  VersionAdded: '0.52'

Rails/EnvironmentVariableAccess:
  Description: 'Do not access `ENV` directly after initialization.'
  # TODO: Set to `pending` status in RuboCop Rails 2 series when migration doc will be written.
  Enabled: false
  VersionAdded: '2.10'
  VersionChanged: '2.11'
  Include:
    - app/**/*.rb
    - lib/**/*.rb
  Exclude:
    - lib/**/*.rake
  AllowReads: false
  AllowWrites: false

Rails/Exit:
  Description: >-
                  Favor `fail`, `break`, `return`, etc. over `exit` in
                  application or library code outside of Rake files to avoid
                  exits during unit testing or running in production.
  Enabled: true
  VersionAdded: '0.41'
  Include:
    - app/**/*.rb
    - config/**/*.rb
    - lib/**/*.rb
  Exclude:
    - lib/**/*.rake

Rails/ExpandedDateRange:
  Description: 'Checks for expanded date range.'
  StyleGuide: 'https://rails.rubystyle.guide/#date-time-range'
  Enabled: pending
  VersionAdded: '2.11'

Rails/FilePath:
  Description: 'Use `Rails.root.join` for file path joining.'
  Enabled: true
  VersionAdded: '0.47'
  VersionChanged: '2.4'
  EnforcedStyle: slashes
  SupportedStyles:
    - slashes
    - arguments

Rails/FindBy:
  Description: 'Prefer find_by over where.first.'
  StyleGuide: 'https://rails.rubystyle.guide#find_by'
  Enabled: true
  VersionAdded: '0.30'
  VersionChanged: '2.11'
  IgnoreWhereFirst: true
  Include:
    - app/models/**/*.rb

Rails/FindById:
  Description: >-
                Favor the use of `find` over `where.take!`, `find_by!`, and `find_by_id!` when you
                need to retrieve a single record by primary key when you expect it to be found.
  StyleGuide: 'https://rails.rubystyle.guide/#find'
  Enabled: 'pending'
  VersionAdded: '2.7'

Rails/FindEach:
  Description: 'Prefer all.find_each over all.find.'
  StyleGuide: 'https://rails.rubystyle.guide#find-each'
  Enabled: true
  VersionAdded: '0.30'
  VersionChanged: '2.9'
  Include:
    - app/models/**/*.rb
  IgnoredMethods:
    # Methods that don't work well with `find_each`.
    - order
    - limit
    - select
    - lock

Rails/HasAndBelongsToMany:
  Description: 'Prefer has_many :through to has_and_belongs_to_many.'
  StyleGuide: 'https://rails.rubystyle.guide#has-many-through'
  Enabled: true
  VersionAdded: '0.12'
  Include:
    - app/models/**/*.rb

Rails/HasManyOrHasOneDependent:
  Description: 'Define the dependent option to the has_many and has_one associations.'
  StyleGuide: 'https://rails.rubystyle.guide#has_many-has_one-dependent-option'
  Enabled: true
  VersionAdded: '0.50'
  Include:
    - app/models/**/*.rb

Rails/HelperInstanceVariable:
  Description: 'Do not use instance variables in helpers.'
  Enabled: true
  VersionAdded: '2.0'
  Include:
    - app/helpers/**/*.rb

Rails/HttpPositionalArguments:
  Description: 'Use keyword arguments instead of positional arguments in http method calls.'
  Enabled: true
  VersionAdded: '0.44'
  Include:
    - 'spec/**/*'
    - 'test/**/*'

Rails/HttpStatus:
  Description: 'Enforces use of symbolic or numeric value to define HTTP status.'
  Enabled: true
  VersionAdded: '0.54'
  VersionChanged: '2.11'
  EnforcedStyle: symbolic
  SupportedStyles:
    - numeric
    - symbolic

Rails/I18nLazyLookup:
  Description: 'Checks for places where I18n "lazy" lookup can be used.'
  StyleGuide: 'https://rails.rubystyle.guide/#lazy-lookup'
  Reference: 'https://guides.rubyonrails.org/i18n.html#lazy-lookup'
  Enabled: pending
  VersionAdded: '2.14'
  Include:
    - 'controllers/**/*'

Rails/I18nLocaleAssignment:
  Description: 'Prefer the usage of `I18n.with_locale` instead of manually updating `I18n.locale` value.'
  Enabled: 'pending'
  VersionAdded: '2.11'
  Include:
    - spec/**/*.rb
    - test/**/*.rb

Rails/I18nLocaleTexts:
  Description: 'Enforces use of I18n and locale files instead of locale specific strings.'
  StyleGuide: 'https://rails.rubystyle.guide/#locale-texts'
  Enabled: pending
  VersionAdded: '2.14'

Rails/IgnoredSkipActionFilterOption:
  Description: 'Checks that `if` and `only` (or `except`) are not used together as options of `skip_*` action filter.'
  Reference: 'https://api.rubyonrails.org/classes/AbstractController/Callbacks/ClassMethods.html#method-i-_normalize_callback_options'
  Enabled: true
  VersionAdded: '0.63'
  Include:
    - app/controllers/**/*.rb
    - app/mailers/**/*.rb

Rails/IndexBy:
  Description: 'Prefer `index_by` over `each_with_object`, `to_h`, or `map`.'
  Enabled: true
  VersionAdded: '2.5'
  VersionChanged: '2.8'

Rails/IndexWith:
  Description: 'Prefer `index_with` over `each_with_object`, `to_h`, or `map`.'
  Enabled: true
  VersionAdded: '2.5'
  VersionChanged: '2.8'

Rails/Inquiry:
  Description: "Prefer Ruby's comparison operators over Active Support's `Array#inquiry` and `String#inquiry`."
  StyleGuide: 'https://rails.rubystyle.guide/#inquiry'
  Enabled: 'pending'
  VersionAdded: '2.7'

Rails/InverseOf:
  Description: 'Checks for associations where the inverse cannot be determined automatically.'
  Enabled: true
  VersionAdded: '0.52'
  IgnoreScopes: false
  Include:
    - app/models/**/*.rb

Rails/LexicallyScopedActionFilter:
  Description: "Checks that methods specified in the filter's `only` or `except` options are explicitly defined in the class."
  StyleGuide: 'https://rails.rubystyle.guide#lexically-scoped-action-filter'
  Enabled: true
  Safe: false
  VersionAdded: '0.52'
  Include:
    - app/controllers/**/*.rb
    - app/mailers/**/*.rb

Rails/LinkToBlank:
  Description: 'Checks that `link_to` with a `target: "_blank"` have a `rel: "noopener"` option passed to them.'
  Reference:
    - https://mathiasbynens.github.io/rel-noopener/
    - https://html.spec.whatwg.org/multipage/links.html#link-type-noopener
    - https://html.spec.whatwg.org/multipage/links.html#link-type-noreferrer
  Enabled: true
  VersionAdded: '0.62'

Rails/MailerName:
  Description: 'Mailer should end with `Mailer` suffix.'
  StyleGuide: 'https://rails.rubystyle.guide/#mailer-name'
  Enabled: 'pending'
  SafeAutoCorrect: false
  VersionAdded: '2.7'
  Include:
    - app/mailers/**/*.rb

Rails/MatchRoute:
  Description: >-
                  Don't use `match` to define any routes unless there is a need to map multiple request types
                  among [:get, :post, :patch, :put, :delete] to a single action using the `:via` option.
  StyleGuide: 'https://rails.rubystyle.guide/#no-match-routes'
  Enabled: 'pending'
  VersionAdded: '2.7'
  Include:
    - config/routes.rb
    - config/routes/**/*.rb

Rails/MigrationClassName:
  Description: 'The class name of the migration should match its file name.'
  Enabled: pending
  VersionAdded: '2.14'
  Include:
    - db/migrate/*.rb

Rails/NegateInclude:
  Description: 'Prefer `collection.exclude?(obj)` over `!collection.include?(obj)`.'
  StyleGuide: 'https://rails.rubystyle.guide#exclude'
  Enabled: 'pending'
  Safe: false
  VersionAdded: '2.7'
  VersionChanged: '2.9'

Rails/NotNullColumn:
  Description: 'Do not add a NOT NULL column without a default value.'
  Enabled: true
  VersionAdded: '0.43'
  Include:
    - db/migrate/*.rb

Rails/OrderById:
  Description: >-
                  Do not use the `id` column for ordering.
                  Use a timestamp column to order chronologically.
  StyleGuide: 'https://rails.rubystyle.guide/#order-by-id'
  Enabled: false
  VersionAdded: '2.8'

Rails/Output:
  Description: 'Checks for calls to puts, print, etc.'
  Enabled: true
  SafeAutoCorrect: false
  VersionAdded: '0.15'
  VersionChanged: '0.19'
  Include:
    - app/**/*.rb
    - config/**/*.rb
    - db/**/*.rb
    - lib/**/*.rb

Rails/OutputSafety:
  Description: 'The use of `html_safe` or `raw` may be a security risk.'
  Enabled: true
  VersionAdded: '0.41'

Rails/Pick:
  Description: 'Prefer `pick` over `pluck(...).first`.'
  StyleGuide: 'https://rails.rubystyle.guide#pick'
  Enabled: true
  Safe: false
  VersionAdded: '2.6'

Rails/Pluck:
  Description: 'Prefer `pluck` over `map { ... }`.'
  StyleGuide: 'https://rails.rubystyle.guide#pluck'
  Enabled: 'pending'
  VersionAdded: '2.7'

Rails/PluckId:
  Description: 'Use `ids` instead of `pluck(:id)` or `pluck(primary_key)`.'
  StyleGuide: 'https://rails.rubystyle.guide/#ids'
  Enabled: false
  Safe: false
  VersionAdded: '2.7'

Rails/PluckInWhere:
  Description: 'Use `select` instead of `pluck` in `where` query methods.'
  Enabled: 'pending'
  Safe: false
  VersionAdded: '2.7'
  VersionChanged: '2.8'
  EnforcedStyle: conservative
  SupportedStyles:
    - conservative
    - aggressive

Rails/PluralizationGrammar:
  Description: 'Checks for incorrect grammar when using methods like `3.day.ago`.'
  Enabled: true
  VersionAdded: '0.35'

Rails/Presence:
  Description: 'Checks code that can be written more easily using `Object#presence` defined by Active Support.'
  Enabled: true
  VersionAdded: '0.52'

Rails/Present:
  Description: 'Enforces use of `present?`.'
  Enabled: true
  VersionAdded: '0.48'
  VersionChanged: '0.67'
  # Convert usages of `!nil? && !empty?` to `present?`
  NotNilAndNotEmpty: true
  # Convert usages of `!blank?` to `present?`
  NotBlank: true
  # Convert usages of `unless blank?` to `if present?`
  UnlessBlank: true

Rails/RakeEnvironment:
  Description: 'Include `:environment` as a dependency for all Rake tasks.'
  Enabled: true
  Safe: false
  VersionAdded: '2.4'
  VersionChanged: '2.6'
  Include:
    - '**/Rakefile'
    - '**/*.rake'
  Exclude:
    - 'lib/capistrano/tasks/**/*.rake'

Rails/ReadWriteAttribute:
  Description: >-
                 Checks for read_attribute(:attr) and
                 write_attribute(:attr, val).
  StyleGuide: 'https://rails.rubystyle.guide#read-attribute'
  Enabled: true
  VersionAdded: '0.20'
  VersionChanged: '0.29'
  Include:
    - app/models/**/*.rb

Rails/RedundantAllowNil:
  Description: >-
                 Finds redundant use of `allow_nil` when `allow_blank` is set to
                 certain values in model validations.
  Enabled: true
  VersionAdded: '0.67'
  Include:
    - app/models/**/*.rb

Rails/RedundantForeignKey:
  Description: 'Checks for associations where the `:foreign_key` option is redundant.'
  Enabled: true
  VersionAdded: '2.6'

Rails/RedundantPresenceValidationOnBelongsTo:
  Description: 'Checks for redundant presence validation on belongs_to association.'
  Enabled: pending
  SafeAutoCorrect: false
  VersionAdded: '2.13'

Rails/RedundantReceiverInWithOptions:
  Description: 'Checks for redundant receiver in `with_options`.'
  Enabled: true
  VersionAdded: '0.52'

Rails/RedundantTravelBack:
  Description: Checks for redundant `travel_back` calls.
  Enabled: pending
  VersionAdded: '2.12'
  Include:
    - spec/**/*.rb
    - test/**/*.rb

Rails/ReflectionClassName:
  Description: 'Use a string for `class_name` option value in the definition of a reflection.'
  Enabled: true
  Safe: false
  VersionAdded: '0.64'
  VersionChanged: '2.10'

Rails/RefuteMethods:
  Description: 'Use `assert_not` methods instead of `refute` methods.'
  Enabled: true
  VersionAdded: '0.56'
  EnforcedStyle: assert_not
  SupportedStyles:
    - assert_not
    - refute
  Include:
    - '**/test/**/*'

Rails/RelativeDateConstant:
  Description: 'Do not assign relative date to constants.'
  Enabled: true
  SafeAutoCorrect: false
  VersionAdded: '0.48'
  VersionChanged: '2.13'

Rails/RenderInline:
  Description: 'Prefer using a template over inline rendering.'
  StyleGuide: 'https://rails.rubystyle.guide/#inline-rendering'
  Enabled: 'pending'
  VersionAdded: '2.7'

Rails/RenderPlainText:
  Description: 'Prefer `render plain:` over `render text:`.'
  StyleGuide: 'https://rails.rubystyle.guide/#plain-text-rendering'
  Enabled: 'pending'
  VersionAdded: '2.7'
  # Convert only when `content_type` is explicitly set to `text/plain`.
  ContentTypeCompatibility: true

Rails/RequestReferer:
  Description: 'Use consistent syntax for request.referer.'
  Enabled: true
  VersionAdded: '0.41'
  EnforcedStyle: referer
  SupportedStyles:
    - referer
    - referrer

Rails/RequireDependency:
  Description: 'Do not use `require_dependency` when running in Zeitwerk mode. `require_dependency` is for autoloading in classic mode.'
  Reference: 'https://guides.rubyonrails.org/autoloading_and_reloading_constants.html'
  Enabled: false
  VersionAdded: '2.10'

Rails/ReversibleMigration:
  Description: 'Checks whether the change method of the migration file is reversible.'
  StyleGuide: 'https://rails.rubystyle.guide#reversible-migration'
  Reference: 'https://api.rubyonrails.org/classes/ActiveRecord/Migration/CommandRecorder.html'
  Enabled: true
  VersionAdded: '0.47'
  VersionChanged: '2.13'
  Include:
    - db/**/*.rb

Rails/ReversibleMigrationMethodDefinition:
  Description: 'Checks whether the migration implements either a `change` method or both an `up` and a `down` method.'
  Enabled: false
  VersionAdded: '2.10'
  VersionChanged: '2.13'
  Include:
    - db/**/*.rb

Rails/RootJoinChain:
  Description: 'Use a single `#join` instead of chaining on `Rails.root` or `Rails.public_path`.'
  Enabled: pending
  VersionAdded: '2.13'

Rails/RootPublicPath:
  Description: "Favor `Rails.public_path` over `Rails.root` with `'public'`."
  Enabled: pending
  VersionAdded: '2.15'

Rails/SafeNavigation:
  Description: "Use Ruby's safe navigation operator (`&.`) instead of `try!`."
  Enabled: true
  VersionAdded: '0.43'
  # This will convert usages of `try` to use safe navigation as well as `try!`.
  # `try` and `try!` work slightly differently. `try!` and safe navigation will
  # both raise a `NoMethodError` if the receiver of the method call does not
  # implement the intended method. `try` will not raise an exception for this.
  ConvertTry: false

Rails/SafeNavigationWithBlank:
  Description: 'Avoid `foo&.blank?` in conditionals.'
  Enabled: true
  VersionAdded: '2.4'
  # While the safe navigation operator is generally a good idea, when
  # checking `foo&.blank?` in a conditional, `foo` being `nil` will actually
  # do the opposite of what the author intends.
  #
  # foo&.blank? #=> nil
  # foo.blank? #=> true
  SafeAutoCorrect: false

Rails/SaveBang:
  Description: 'Identifies possible cases where Active Record save! or related should be used.'
  StyleGuide: 'https://rails.rubystyle.guide#save-bang'
  Enabled: false
  VersionAdded: '0.42'
  VersionChanged: '0.59'
  AllowImplicitReturn: true
  AllowedReceivers: []
  SafeAutoCorrect: false

Rails/SchemaComment:
  Description: >-
    Enforces the use of the `comment` option when adding a new table or column
    to the database during a migration.
  Enabled: false
  VersionAdded: '2.13'

Rails/ScopeArgs:
  Description: 'Checks the arguments of ActiveRecord scopes.'
  Enabled: true
  VersionAdded: '0.19'
  VersionChanged: '2.12'
  Include:
    - app/models/**/*.rb

Rails/ShortI18n:
  Description: 'Use the short form of the I18n methods: `t` instead of `translate` and `l` instead of `localize`.'
  StyleGuide: 'https://rails.rubystyle.guide/#short-i18n'
  Enabled: 'pending'
  VersionAdded: '2.7'
  EnforcedStyle: conservative
  SupportedStyles:
    - conservative
    - aggressive

Rails/SkipsModelValidations:
  Description: >-
                 Use methods that skips model validations with caution.
                 See reference for more information.
  Reference: 'https://guides.rubyonrails.org/active_record_validations.html#skipping-validations'
  Enabled: true
  VersionAdded: '0.47'
  VersionChanged: '2.7'
  ForbiddenMethods:
    - decrement!
    - decrement_counter
    - increment!
    - increment_counter
    - insert
    - insert!
    - insert_all
    - insert_all!
    - toggle!
    - touch
    - touch_all
    - update_all
    - update_attribute
    - update_column
    - update_columns
    - update_counters
    - upsert
    - upsert_all
  AllowedMethods: []

Rails/SquishedSQLHeredocs:
  Description: 'Checks SQL heredocs to use `.squish`.'
  StyleGuide: 'https://rails.rubystyle.guide/#squished-heredocs'
  Enabled: 'pending'
  VersionAdded: '2.8'
  VersionChanged: '2.9'
  # Some SQL syntax (e.g. PostgreSQL comments and functions) requires newlines
  # to be preserved in order to work, thus autocorrection is not safe.
  SafeAutoCorrect: false

Rails/StripHeredoc:
  Description: 'Enforces the use of squiggly heredoc over `strip_heredoc`.'
  StyleGuide: 'https://rails.rubystyle.guide/#prefer-squiggly-heredoc'
  Enabled: pending
  VersionAdded: '2.15'

Rails/TableNameAssignment:
  Description: >-
    Do not use `self.table_name =`. Use Inflections or `table_name_prefix` instead.
  StyleGuide: 'https://rails.rubystyle.guide/#keep-ar-defaults'
  Enabled: false
  VersionAdded: '2.14'
  Include:
    - app/models/**/*.rb

Rails/TimeZone:
  Description: 'Checks the correct usage of time zone aware methods.'
  StyleGuide: 'https://rails.rubystyle.guide#time'
  Reference: 'http://danilenko.org/2012/7/6/rails_timezones'
  Enabled: true
  SafeAutoCorrect: false
  VersionAdded: '0.30'
  VersionChanged: '2.13'
  # The value `strict` means that `Time` should be used with `zone`.
  # The value `flexible` allows usage of `in_time_zone` instead of `zone`.
  EnforcedStyle: flexible
  SupportedStyles:
    - strict
    - flexible
  Exclude:
    - '**/*.gemspec'

Rails/TimeZoneAssignment:
  Description: 'Prefer the usage of `Time.use_zone` instead of manually updating `Time.zone` value.'
  Reference: 'https://thoughtbot.com/blog/its-about-time-zones'
  Enabled: 'pending'
  VersionAdded: '2.10'
  Include:
    - spec/**/*.rb
    - test/**/*.rb

Rails/ToFormattedS:
  Description: 'Checks for consistent uses of `to_fs` or `to_formatted_s`.'
  StyleGuide: 'https://rails.rubystyle.guide/#prefer-to-fs'
  Enabled: pending
  EnforcedStyle: to_fs
  SupportedStyles:
    - to_fs
    - to_formatted_s
  VersionAdded: '2.15'

Rails/TransactionExitStatement:
  Description: 'Avoid the usage of `return`, `break` and `throw` in transaction blocks.'
  Enabled: pending
  VersionAdded: '2.14'

Rails/UniqBeforePluck:
  Description: 'Prefer the use of uniq or distinct before pluck.'
  Enabled: true
  VersionAdded: '0.40'
  VersionChanged: '2.13'
  EnforcedStyle: conservative
  SupportedStyles:
    - conservative
    - aggressive
  SafeAutoCorrect: false

Rails/UniqueValidationWithoutIndex:
  Description: 'Uniqueness validation should have a unique index on the database column.'
  Enabled: true
  VersionAdded: '2.5'
  Include:
    - app/models/**/*.rb

Rails/UnknownEnv:
  Description: 'Use correct environment name.'
  Enabled: true
  VersionAdded: '0.51'
  Environments:
    - development
    - test
    - production

Rails/UnusedIgnoredColumns:
  Description: 'Remove a column that does not exist from `ignored_columns`.'
  Enabled: pending
  VersionAdded: '2.11'
  Include:
    - app/models/**/*.rb

Rails/Validation:
  Description: 'Use validates :attribute, hash of validations.'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.41'
  Include:
    - app/models/**/*.rb

Rails/WhereEquals:
  Description: 'Pass conditions to `where` as a hash instead of manually constructing SQL.'
  StyleGuide: 'https://rails.rubystyle.guide/#hash-conditions'
  Enabled: 'pending'
  SafeAutoCorrect: false
  VersionAdded: '2.9'
  VersionChanged: '2.10'

Rails/WhereExists:
  Description: 'Prefer `exists?(...)` over `where(...).exists?`.'
  Enabled: 'pending'
  SafeAutoCorrect: false
  EnforcedStyle: exists
  SupportedStyles:
    - exists
    - where
  VersionAdded: '2.7'
  VersionChanged: '2.10'

Rails/WhereNot:
  Description: 'Use `where.not(...)` instead of manually constructing negated SQL in `where`.'
  StyleGuide: 'https://rails.rubystyle.guide/#hash-conditions'
  Enabled: 'pending'
  VersionAdded: '2.8'

# Accept `redirect_to(...) and return` and similar cases.
Style/AndOr:
  EnforcedStyle: conditionals
