AllCops:
  AutoCorrect: false
  TargetRubyVersion: 2.6
  NewCops: enable
  Exclude:
    - "node_modules/**/*"

# We prefer arrays of symbols to look like an array of symbols.
# For example: [:one, :two, :three] as opposed to %i[one two three]
Style/SymbolArray:
  EnforcedStyle: brackets

# There should always be empty lines inside a class. For example
#
#    class MyExample
#
#      def some_method
#      end
#
#    end
Layout/EmptyLinesAroundClassBody:
  EnforcedStyle: empty_lines

# We want to keep attr_* definitions separated on their own lines, rather than
# all of them collapsed into a single attr_* call. The collapsed/grouped variant
# is harder to read, and harder to see what's been changed in diffs.
Style/AccessorGrouping:
  Enabled: false

# Blocks are slightly different to classes, in these cases there should
# not be new lines around the contents of the block.
#
#    proc do
#      # Do something
#    end
Layout/EmptyLinesAroundBlockBody:
  EnforcedStyle: no_empty_lines

# Modules are the same as classes unless they're being used for namespacing
# purposes in which case there should not be new lines.
Layout/EmptyLinesAroundModuleBody:
  EnforcedStyle: empty_lines_except_namespace

# Space is required following -> when writing a lambda:
#
#    somethign = -> (var) { block }
Layout/SpaceInLambdaLiteral:
  EnforcedStyle: require_space

Layout/FirstHashElementIndentation:
  Enabled: false

# Don't allow anonymous block forwarding
#   # bad
#   def foo(&)
#     bar(&)
#   end

#   # good
#   def foo(&block)
#     bar(&block)
#   end
Naming/BlockForwarding:
  EnforcedStyle: explicit

# We don't mind setting assignments in conditions so this has been disabled to
# allow `if something = something_else` without worrying about brackets.
Lint/AssignmentInCondition:
  Enabled: false

# Top level documentation is quite rare...
Style/Documentation:
  Enabled: false

# We want to allow inner slashes in a regexp to be used when using /xxx/ form.
Style/RegexpLiteral:
  AllowInnerSlashes: true

# Blocks of if statements are perfectly fine and usually more readable than
# putting everything onto a single line just because we can.
Style/IfUnlessModifier:
  Enabled: false

# We prefer assignments to happen within the condition rather than setting a
# variable to the result of a condition.
Style/ConditionalAssignment:
  EnforcedStyle: assign_inside_condition
  IncludeTernaryExpressions: false

# Empty methods should not be compacted onto a single line
Style/EmptyMethod:
  EnforcedStyle: expanded

# Don't allow ruby 3.1 style hash shorthand syntax, eg:
#
#   foo = 'foo'
#   bar = 'bar'
#
#   # bad
#   method(foo:, bar:)
#
#   # good
#   method(foo: foo, bar: bar)
#
Style/HashSyntax:
  EnforcedShorthandSyntax: never

# We do not wish to auto correct unused method arguments because that can be a
# pain.  These should just be flagged for manual intervention.
Lint/UnusedMethodArgument:
  AutoCorrect: false

# As above, just flag them.
Lint/UnusedBlockArgument:
  AutoCorrect: false

# While we don't want to make heavy use of get_ or set_ methods we do often need
# to use these when we want to refer to actually getting or setting something
# (usually from another API).
Naming/AccessorMethodName:
  Enabled: false

# If we want a boolean called :true, we should be allowed that. These are likely
# not mistakes.
Lint/BooleanSymbol:
  Enabled: false

# Using block.map(&:upcase) is not always the neatest way to show something. For
# example if you have a block that just calls one thing, you don't want it
# collapsed.
#
#    action do |user|
#      user.delete
#    end
#
# This should be action(&:delete) because it is not clear what is actually
# happening without the context of knowing what the inner variable should be
# called.
Style/SymbolProc:
  Enabled: false

# Excluding specs from block lengths
Metrics/BlockLength:
  Exclude:
    - "spec/**/*_spec.rb"
    - "spec/support/**/*.rb"
    - "spec/specs/support/**/*.rb"

# Slightly increase tyhe default method length to be a bit more forgiving
Metrics/MethodLength:
  Max: 30

# Allow a maxmium of 5 arguments and don't include keyword arguments
Metrics/ParameterLists:
  Max: 5
  CountKeywordArgs: false

Style/MultilineBlockChain:
  Exclude:
    - "spec/**/*.rb"

Metrics/ClassLength:
  Max: 250
