AllCops:
  TargetRubyVersion: 2.3
  Rails: true
  Exclude:
    - "bin/**/*"
    - "db/schema.rb"

# # Commonly used screens these days easily fit more than 80 characters.
# Metrics/LineLength:
#   Max: 120

# Too short methods lead to extraction of single-use methods, whih can make
# the code easier to read (by naming things), but can also clutter the class
Metrics/MethodLength: 
  Max: 20

# # The guiding principle of classes is SRP, SRP can't be accurately measured by LoC
# Metrics/ClassLength:
#   Max: 1500
# Metrics/ModuleLength:
#   Max: 1500
  
# # Raise AbcSize from 15 to 20
# Metrics/AbcSize:
#   Max: 20

# # No space makes the method definition shorter and differentiates
# # from a regular assignment.
# Style/SpaceAroundEqualsInParameterDefault:
#   EnforcedStyle: no_space

# # Single quotes being faster is hardly measurable and only affects parse time.
# # Enforcing double quotes reduces the times where you need to change them
# # when introducing an interpolation. Use single quotes only if their semantics
# # are needed.
# Style/StringLiterals:
#   EnforcedStyle: double_quotes

# # We do not need to support Ruby 1.9, so this is good to use.
# Style/SymbolArray:
#   Enabled: true

# # Most readable form.
# Style/AlignHash:
#   EnforcedHashRocketStyle: table
#   EnforcedColonStyle: table

# # Mixing the styles looks just silly.
# Style/HashSyntax:
#  EnforcedStyle: ruby19_no_mixed_keys

# # has_key? and has_value? are far more readable than key? and value?
# Style/DeprecatedHashMethods:
#   Enabled: false

# # String#% is by far the least verbose and only object oriented variant.
# Style/FormatString:
#   EnforcedStyle: percent

# Style/CollectionMethods:
#   Enabled: true
#   PreferredMethods:
#     # inject seems more common in the community.
#     reduce: "inject"


# # Either allow this style or don't. Marking it as safe with parenthesis
# # is silly. Let's try to live without them for now.
# Style/ParenthesesAroundCondition:
#   AllowSafeAssignment: false
# Lint/AssignmentInCondition:
#   AllowSafeAssignment: false

# # A specialized exception class will take one or more arguments and construct the message from it.
# # So both variants make sense. 
# Style/RaiseArgs:
#   Enabled: false

# # Indenting the chained dots beneath each other is not supported by this cop,
# # see https://github.com/bbatsov/rubocop/issues/1633
# Style/MultilineOperationIndentation:
#   Enabled: false

# # Fail is an alias of raise. Avoid aliases, it's more cognitive load for no gain.
# # The argument that fail should be used to abort the program is wrong too,
# # there's Kernel#abort for that.
# Style/SignalException:
#   EnforcedStyle: only_raise

# # Suppressing exceptions can be perfectly fine, and be it to avoid to
# # explicitly type nil into the rescue since that's what you want to return,
# # or suppressing LoadError for optional dependencies
# Lint/HandleExceptions:
#   Enabled: false

# Style/SpaceInsideBlockBraces:
#   # The space here provides no real gain in readability while consuming
#   # horizontal space that could be used for a better parameter name.
#   # Also {| differentiates better from a hash than { | does.
#   SpaceBeforeBlockParameters: false

# # No trailing space differentiates better from the block:
# # foo} means hash, foo } means block.
# Style/SpaceInsideHashLiteralBraces:
#   EnforcedStyle: no_space

# # { ... } for multi-line blocks is okay, follow Weirichs rule instead:
# # https://web.archive.org/web/20140221124509/http://onestepback.org/index.cgi/Tech/Ruby/BraceVsDoEnd.rdoc
# Style/BlockDelimiters:
#   Enabled: false

# # Enforcing -> would be nice, but not at the cost of enforcing lambda { } for
# # multiline lambdas.
# Style/Lambda:
#   Enabled: false

# # do / end blocks should be used for side effects,
# # methods that run a block for side effects and have
# # a useful return value are rare, assign the return
# # value to a local variable for those cases.
# Style/MethodCalledOnDoEndBlock:
#   Enabled: true

# # Enforcing the names of variables? To single letter ones? Just no.
# Style/SingleLineBlockParams:
#   Enabled: false

# # Shadowing outer local variables with block parameters is often useful
# # to not reinvent a new name for the same thing, it highlights the relation
# # between the outer variable and the parameter. The cases where it's actually
# # confusing are rare, and usually bad for other reasons already, for example
# # because the method is too long.
# Lint/ShadowingOuterLocalVariable:
#   Enabled: false

# # Check with yard instead.
# Style/Documentation:
#   Enabled: false 

# # This is just silly. Calling the argument `other` in all cases makes no sense.
# Style/OpMethod:
#   Enabled: false 

# # There are valid cases, for example debugging Cucumber steps,
# # also they'll fail CI anyway
# Lint/Debugger:
#   Enabled: false


# # Reset some HoundCI changes back to Rubocop defaults
# Style/DotPosition:
#   EnforcedStyle: leading