inherit_from: .rubocop_todo.yml

require:
  - rubocop-minitest
  - rubocop-rake

AllCops:
  Exclude:
    - 'bin/**/*'
    - 'exe/**/*'
    - 'fixtures/**/*'
    - 'tmp/**/*'
    - 'vendor/**/*'
  DisplayCopNames: true


Layout/ArgumentAlignment:
  EnforcedStyle: with_fixed_indentation
  # IndentationWidth: 2

# It's ok to have more than one empty line to create a 'paragrapth'.
Layout/EmptyLines:
  Enabled: false

# Extra space is fine.
Layout/EmptyLinesAroundClassBody:
  Enabled: false

# Extra space is fine.
Layout/EmptyLinesAroundModuleBody:
  Enabled: false

# Normally one line in between, but two allowed for "paragraphs".
Layout/EmptyLineBetweenDefs:
  AllowAdjacentOneLineDefs: true
  NumberOfEmptyLines: [1, 2]

# Rely on Git to normalize end of lines.
Layout/EndOfLine:
  Enabled: false

# Add lines as needed.
Layout/EmptyLinesAroundBlockBody:
  Enabled: false

Layout/LineLength:
  Exclude:
    - features/step_definitions/**/*

Layout/ParameterAlignment:
  EnforcedStyle: with_fixed_indentation


Naming/RescuedExceptionsVariableName:
  PreferredName: error


Metrics/AbcSize:
  Enabled: false
  Exclude:
    - test/**/*

Metrics/ClassLength:
  Exclude:
    - test/**/*

# Too noisy.
Metrics/CyclomaticComplexity:
  Enabled: false

Metrics/MethodLength:
  Exclude:
    - test/**/*

# Too noisy.
Metrics/PerceivedComplexity:
  Enabled: false


# Nah, sometimes easier to read with accessors having separate grouping.
Style/AccessorGrouping:
  Enabled: false

# Prefer { ... } over do ... end except for control flow and
# method defintions. Unfortunatly, no cop configuration for this.
# https://github.com/chneukirchen/styleguide/blob/e60de37b478d3f892f6985a58d573016f33f0269/RUBY-STYLE#L63-L67
Style/BlockDelimiters:
  EnforcedStyle: semantic
  Enabled: false

# Generally prefer compact style to reduce indentation. But no hard rule.
Style/ClassAndModuleChildren:
  EnforcedStyle: compact
  Enabled: false

# This doesn't always read nicely.
Style/ConditionalAssignment:
  Enabled: false

# Nah, it's ok.
Style/CommentedKeyword:
  Enabled: false

# TODO(thomthom): Consider turning this back on.
Style/Documentation:
  Enabled: false

# Conflict too often with Metric/LineLength.
# https://github.com/bbatsov/rubocop/issues/1332#issuecomment-277503854
Style/GuardClause:
  Enabled: false

# In the context of the Thor DLS the rocket arrow => reads better.
Style/HashSyntax:
  Exclude:
    - app/commands/**/*

# Some times it reads clearer to not trail if/unless at the end.
Style/IfUnlessModifier:
  Enabled: false

Style/ModuleFunction:
  Enabled: false

# Excluding some files that copies the Thor implementation.
# TODO: Investigate if Thor changed their implementation.
Style/OptionalBooleanParameter:
  Exclude:
    - lib/skippy/cli.rb
    - lib/skippy/command.rb

# %w and %i etc isn't really intuitive unless you are really familiar with the
# syntax. %w seems used often enough. But [:symbol, :foo] reads clearer than
# %i(symbol foo).
Style/SymbolArray:
  Enabled: False

# Add trailing comma so it's easy to duplicate/add lines.
Style/TrailingCommaInArrayLiteral:
  EnforcedStyleForMultiline: consistent_comma

Style/TrailingCommaInHashLiteral:
  EnforcedStyleForMultiline: consistent_comma


# Not testing computed values, but serialized values.
# Ignoring floating point tolerance is fine (and wanted) in this case.
Minitest/AssertInDelta:
  Enabled: false

# Too many false positives.
Minitest/AssertWithExpectedArgument:
  Enabled: false

# No such thing as too many assertions.
Minitest/MultipleAssertions:
  Enabled: false


################################################################################
# Enabling new cops:

Gemspec/DateAssignment: # new in 1.10
  Enabled: true
Layout/LineEndStringConcatenationIndentation: # new in 1.18
  Enabled: true
Layout/SpaceBeforeBrackets: # new in 1.7
  Enabled: true
Lint/AmbiguousAssignment: # new in 1.7
  Enabled: true
Lint/AmbiguousOperatorPrecedence: # new in 1.21
  Enabled: true
Lint/AmbiguousRange: # new in 1.19
  Enabled: true
Lint/DeprecatedConstants: # new in 1.8
  Enabled: true
Lint/DuplicateBranch: # new in 1.3
  Enabled: true
Lint/DuplicateRegexpCharacterClassElement: # new in 1.1
  Enabled: true
Lint/EmptyBlock: # new in 1.1
  Enabled: true
Lint/EmptyClass: # new in 1.3
  Enabled: true
Lint/EmptyInPattern: # new in 1.16
  Enabled: true
Lint/IncompatibleIoSelectWithFiberScheduler: # new in 1.21
  Enabled: true
Lint/LambdaWithoutLiteralBlock: # new in 1.8
  Enabled: true
Lint/NoReturnInBeginEndBlocks: # new in 1.2
  Enabled: true
Lint/NumberedParameterAssignment: # new in 1.9
  Enabled: true
Lint/OrAssignmentToConstant: # new in 1.9
  Enabled: true
Lint/RedundantDirGlobSort: # new in 1.8
  Enabled: true
Lint/RequireRelativeSelfPath: # new in 1.22
  Enabled: true
Lint/SymbolConversion: # new in 1.9
  Enabled: true
Lint/ToEnumArguments: # new in 1.1
  Enabled: true
Lint/TripleQuotes: # new in 1.9
  Enabled: true
Lint/UnexpectedBlockArity: # new in 1.5
  Enabled: true
Lint/UnmodifiedReduceAccumulator: # new in 1.1
  Enabled: true
Security/IoMethods: # new in 1.22
  Enabled: true
Style/ArgumentsForwarding: # new in 1.1
  Enabled: true
Style/CollectionCompact: # new in 1.2
  Enabled: true
Style/DocumentDynamicEvalDefinition: # new in 1.1
  Enabled: true
Style/EndlessMethod: # new in 1.8
  Enabled: true
Style/HashConversion: # new in 1.10
  Enabled: true
Style/HashExcept: # new in 1.7
  Enabled: true
Style/IfWithBooleanLiteralBranches: # new in 1.9
  Enabled: true
Style/InPatternThen: # new in 1.16
  Enabled: true
Style/MultilineInPatternThen: # new in 1.16
  Enabled: true
Style/NegatedIfElseCondition: # new in 1.2
  Enabled: true
Style/NilLambda: # new in 1.3
  Enabled: true
Style/NumberedParameters: # new in 1.22
  Enabled: true
Style/NumberedParametersLimit: # new in 1.22
  Enabled: true
Style/QuotedSymbols: # new in 1.16
  Enabled: true
Style/RedundantArgument: # new in 1.4
  Enabled: true
Style/RedundantSelfAssignmentBranch: # new in 1.19
  Enabled: true
Style/SelectByRegexp: # new in 1.22
  Enabled: true
Style/StringChars: # new in 1.12
  Enabled: true
Style/SwapValues: # new in 1.1
  Enabled: true

Minitest/AssertionInLifecycleHook: # new in 0.10
  Enabled: true
Minitest/AssertKindOf: # new in 0.10
  Enabled: true
Minitest/AssertOutput: # new in 0.10
  Enabled: true
Minitest/AssertPathExists: # new in 0.10
  Enabled: true
Minitest/AssertSilent: # new in 0.10
  Enabled: true
Minitest/LiteralAsActualArgument: # new in 0.10
  Enabled: true
Minitest/RefuteInDelta: # new in 0.10
  Enabled: true
Minitest/RefuteKindOf: # new in 0.10
  Enabled: true
Minitest/RefutePathExists: # new in 0.10
  Enabled: true
Minitest/TestMethodName: # new in 0.10
  Enabled: true
Minitest/UnreachableAssertion: # new in 0.14
  Enabled: true
Minitest/UnspecifiedException: # new in 0.10
  Enabled: true