require:
  - rubocop-performance
  - rubocop-rails

AllCops:
  Exclude:
    - "vendor/**/*"
    - "db/schema.rb"
    - "spec/**/*"
  NewCops: enable
  UseCache: false
  TargetRubyVersion: 2.6

##################### Style ####################################

Layout/AccessModifierIndentation:
  EnforcedStyle: indent

Layout/HashAlignment:
  EnforcedHashRocketStyle: key
  EnforcedColonStyle: key
  EnforcedLastArgumentHashStyle: ignore_implicit

Layout/ParameterAlignment:
  EnforcedStyle: with_first_parameter

Style/AndOr:
  EnforcedStyle: conditionals

Style/BarePercentLiterals:
  EnforcedStyle: bare_percent

Style/BlockDelimiters:
  EnforcedStyle: line_count_based

Layout/CaseIndentation:
  EnforcedStyle: case

Style/ClassAndModuleChildren:
  EnforcedStyle: nested

Style/ClassCheck:
  EnforcedStyle: is_a?

Style/CollectionMethods:
  PreferredMethods:
    collect: map
    collect!: map!
    detect: find
    find_all: select
    reduce: inject

Style/CommandLiteral:
  EnforcedStyle: backticks

Style/DocumentationMethod:
  RequireForNonPublicMethods: false

Layout/DotPosition:
  EnforcedStyle: leading

Style/EmptyElse:
  EnforcedStyle: both

Layout/EmptyLineBetweenDefs:
  AllowAdjacentOneLineDefs: false

Layout/EmptyLinesAroundBlockBody:
  EnforcedStyle: no_empty_lines

Layout/EmptyLinesAroundClassBody:
  EnforcedStyle: no_empty_lines

Layout/EmptyLinesAroundModuleBody:
  EnforcedStyle: no_empty_lines

Layout/ExtraSpacing:
  AllowForAlignment: true
  ForceEqualSignAlignment: false

Naming/FileName:
  Enabled: false
  Exclude: []

Layout/FirstArgumentIndentation:
  EnforcedStyle: consistent

Style/For:
  EnforcedStyle: each

Style/FormatString:
  EnforcedStyle: format

Style/FrozenStringLiteralComment:
  EnforcedStyle: always

Style/GuardClause:
  Enabled: false
  MinBodyLength: 1

Style/HashSyntax:
  EnforcedStyle: ruby19

Style/IfUnlessModifier:
  Enabled: true

Layout/IndentationConsistency:
  EnforcedStyle: normal

Layout/IndentationWidth:
  Width: 2

Layout/FirstArrayElementIndentation:
  EnforcedStyle: special_inside_parentheses

Layout/FirstHashElementIndentation:
  EnforcedStyle: special_inside_parentheses

Style/Next:
  EnforcedStyle: skip_modifier_ifs

Style/NonNilCheck:
  IncludeSemanticChanges: false

Style/MethodDefParentheses:
  EnforcedStyle: require_parentheses

Naming/MethodName:
  EnforcedStyle: snake_case

Layout/MultilineArrayBraceLayout:
  EnforcedStyle: symmetrical

Layout/MultilineAssignmentLayout:
  SupportedTypes:
    - block
    - case
    - class
    - if
    - kwbegin
    - module
  EnforcedStyle: new_line

Layout/MultilineHashBraceLayout:
  EnforcedStyle: symmetrical

Layout/MultilineMethodCallBraceLayout:
  EnforcedStyle: symmetrical

Layout/MultilineMethodCallIndentation:
  EnforcedStyle: aligned

Layout/MultilineMethodDefinitionBraceLayout:
  EnforcedStyle: symmetrical

Layout/MultilineOperationIndentation:
  EnforcedStyle: aligned

Style/NumericLiterals:
  Enabled: false

Style/NumericLiteralPrefix:
  EnforcedOctalStyle: zero_with_o

Style/OptionHash:
  SuspiciousParamNames:
    - options
    - opts
    - args
    - params
    - parameters

Style/ParenthesesAroundCondition:
  AllowSafeAssignment: true

Style/PercentLiteralDelimiters:
  PreferredDelimiters:
    "%": "()"
    "%i": "()"
    "%q": "()"
    "%Q": "()"
    "%r": "{}"
    "%s": "()"
    "%w": "()"
    "%W": "()"
    "%x": "()"

Style/PercentQLiterals:
  EnforcedStyle: lower_case_q

Naming/PredicateName:
  Description: Check the names of predicate methods.
  StyleGuide: https://github.com/bbatsov/ruby-style-guide#bool-methods-qmark
  Enabled: true
  NamePrefix:
  - is_
  - has_
  - have_
  ForbiddenPrefixes:
  - is_
  AllowedMethods:
    - is_a?
  Exclude:
  - spec/**/*

Style/RaiseArgs:
  Description: Checks the arguments passed to raise/fail.
  EnforcedStyle: exploded
  SupportedStyles:
  - compact
  - exploded

Style/RedundantReturn:
  AllowMultipleReturnValues: true

Style/RegexpLiteral:
  EnforcedStyle: slashes
  AllowInnerSlashes: false

Style/Semicolon:
  AllowAsExpressionSeparator: true

Style/SignalException:
  Enabled: true
  EnforcedStyle: only_raise

Style/SingleLineBlockParams:
  Enabled: false

Style/SingleLineMethods:
  Enabled: false

Layout/SpaceBeforeFirstArg:
  AllowForAlignment: true

Style/StringLiterals:
  Enabled: true
  EnforcedStyle: single_quotes
  ConsistentQuotesInMultiline: true

Style/StringLiteralsInInterpolation:
  EnforcedStyle: single_quotes

Style/StringMethods:
  PreferredMethods:
    intern: to_sym

Layout/SpaceAroundBlockParameters:
  EnforcedStyleInsidePipes: no_space

Layout/SpaceAroundEqualsInParameterDefault:
  EnforcedStyle: space

Layout/SpaceAroundOperators:
  AllowForAlignment: true

Layout/SpaceBeforeBlockBraces:
  EnforcedStyle: space

Layout/SpaceInsideBlockBraces:
  EnforcedStyle: space
  EnforcedStyleForEmptyBraces: no_space
  SpaceBeforeBlockParameters: true

Layout/SpaceInsideHashLiteralBraces:
  EnforcedStyle: space
  EnforcedStyleForEmptyBraces: no_space

Layout/SpaceInsideStringInterpolation:
  EnforcedStyle: no_space

Style/SymbolArray:
  EnforcedStyle: percent

Style/SymbolProc:
  AllowedMethods:
    - respond_to
    - define_method

Style/TernaryParentheses:
  EnforcedStyle: require_no_parentheses
  AllowSafeAssignment: true

Layout/TrailingEmptyLines:
  EnforcedStyle: final_newline

Style/TrailingCommaInArguments:
  EnforcedStyleForMultiline: no_comma

Style/TrailingCommaInArrayLiteral:
  EnforcedStyleForMultiline: no_comma

Style/TrailingCommaInHashLiteral:
  EnforcedStyleForMultiline: no_comma

Naming/VariableName:
  EnforcedStyle: snake_case

Naming/VariableNumber:
  EnforcedStyle: normalcase

Style/WordArray:
  EnforcedStyle: percent
  MinSize: 0

Style/InlineComment:
  Enabled: false

Naming/AccessorMethodName:
  Enabled: true

Style/Alias:
  Enabled: true

Style/Documentation:
  Enabled: false

Style/DoubleNegation:
  Enabled: true

Style/EachWithObject:
  Enabled: true

Style/EmptyLiteral:
  Enabled: true

Style/ModuleFunction:
  Enabled: true
  EnforcedStyle: module_function

Style/OneLineConditional:
  Enabled: true

Style/PerlBackrefs:
  Enabled: true

Style/Send:
  Enabled: true

Style/SpecialGlobalVars:
  Enabled: true

Style/VariableInterpolation:
  Enabled: true

Style/WhenThen:
  Enabled: true

##################### Metrics ##################################

Metrics/AbcSize:
  Enabled: false

Metrics/BlockLength:
  AllowedMethods: ['describe', 'context']

Metrics/ClassLength:
  Enabled: false

Metrics/ModuleLength:
  Enabled: false

Metrics/CyclomaticComplexity:
  Enabled: false

Metrics/MethodLength:
  Enabled: false

Metrics/ParameterLists:
  Enabled: false

Metrics/PerceivedComplexity:
  Enabled: false

##################### Layout ###################################

Layout/BlockAlignment:
  EnforcedStyleAlignWith: either

Layout/EndAlignment:
  EnforcedStyleAlignWith: keyword

Layout/DefEndAlignment:
  EnforcedStyleAlignWith: start_of_line

Layout/LineLength:
  Max: 120
  AllowHeredoc: true
  AllowURI: true
  URISchemes:
    - http
    - https

##################### Lint #####################################

Lint/AssignmentInCondition:
  AllowSafeAssignment: true

Lint/DuplicateMethods:
  Enabled: false

Lint/UnusedBlockArgument:
  IgnoreEmptyBlocks: true
  AllowUnusedKeywordArguments: false

Lint/UnusedMethodArgument:
  AllowUnusedKeywordArguments: false
  IgnoreEmptyMethods: true

Lint/EachWithObjectArgument:
  Enabled: true

Lint/SuppressedException:
  Enabled: false

Lint/LiteralAsCondition:
  Enabled: true

Lint/EmptyInterpolation:
  Enabled: false

Lint/LiteralInInterpolation:
  Enabled: true

##################### Rails ####################################

Rails/ActionFilter:
  EnforcedStyle: action
  Include:
    - app/controllers/**/*.rb

Rails/Date:
  EnforcedStyle: flexible

Rails/Exit:
  Include:
    - app/**/*.rb
    - config/**/*.rb
    - lib/**/*.rb
  Exclude:
    - lib/**/*.rake

Rails/FindBy:
  Include:
    - app/models/**/*.rb

Rails/FindEach:
  Include:
    - app/models/**/*.rb

Rails/HasAndBelongsToMany:
  Include:
    - app/models/**/*.rb

Rails/NotNullColumn:
  Include:
    - db/migrate/*.rb

Rails/Output:
  Include:
    - app/**/*.rb
    - config/**/*.rb
    - db/**/*.rb
    - lib/**/*.rb

Rails/ReadWriteAttribute:
  Include:
    - app/models/**/*.rb

Rails/RequestReferer:
  EnforcedStyle: referer

Rails/SafeNavigation:
  ConvertTry: false

Rails/ScopeArgs:
  Include:
    - app/models/**/*.rb

Rails/SkipsModelValidations:
  Exclude:
    - spec/**/*_spec.rb
    - spec/factories/*.rb

Rails/TimeZone:
  EnforcedStyle: flexible

Rails/UniqBeforePluck:
  EnforcedStyle: conservative

Rails/Validation:
  Include:
    - app/models/**/*.rb

##################### Performance ##############################

Performance/RedundantMerge:
  Enabled: true