opf/openproject

View on GitHub
.rubocop.yml

Summary

Maintainability
Test Coverage
require:
  - rubocop-rails
  - rubocop-rspec
  - ./lib_static/rubocop/cop/open_project/add_preview_for_view_component.rb
  - ./lib_static/rubocop/cop/open_project/no_do_end_block_with_rspec_capybara_matcher_in_expect.rb
  - ./lib_static/rubocop/cop/open_project/use_service_result_factory_methods.rb
  - rubocop-capybara
  - rubocop-factory_bot
  - rubocop-performance
  - rubocop-inflector
  - ./config/initializers/inflections.rb

<% if File.exist?('.rubocop-local.yml') %>
inherit_from:
  - .rubocop-local.yml
<% end %>

inherit_mode:
  merge:
    # adding files to Exclude should merge with inherited instead of replacing
    - Exclude

AllCops:
  TargetRubyVersion: 3.2
  # Enable any new cops in new versions by default
  NewCops: enable
  Exclude:
    - '**/node_modules/**/*'

FactoryBot/ConsistentParenthesesStyle:
  Enabled: false

FactoryBot/SyntaxMethods:
  Enabled: true

Gemspec/RequiredRubyVersion:
  Exclude:
    - modules/**/*.gemspec


Layout/ConditionPosition:
  Enabled: false

Layout/DotPosition:
    EnforcedStyle: leading

Layout/LineLength:
  Max: 130

Layout/MultilineMethodCallIndentation:
  Enabled: false

# Rubymine doesn't support the same indentation style
# and will auto-format against it with our editorconfig
Layout/MultilineOperationIndentation:
  Enabled: false

Lint/AmbiguousOperator:
  Enabled: false

Lint/AmbiguousRegexpLiteral:
  Enabled: false

Lint/AssignmentInCondition:
  Enabled: false

Lint/DeprecatedClassMethods:
  Enabled: false

Lint/ElseLayout:
  Enabled: false

Lint/FlipFlop:
  Enabled: false

Lint/LiteralInInterpolation:
  Enabled: false

Lint/Loop:
  Enabled: false

Lint/ParenthesesAsGroupedExpression:
  Enabled: false

Lint/RequireParentheses:
  Enabled: false

Lint/SuppressedException:
  Enabled: false

Lint/UnderscorePrefixedVariableName:
  Enabled: false

Lint/Void:
  Enabled: false

Lint/AmbiguousBlockAssociation:
  AllowedMethods: [change]

Metrics/ClassLength:
  Enabled: false

Metrics/CyclomaticComplexity:
  Enabled: false

Metrics/BlockLength:
  Enabled: false

Metrics/BlockNesting:
  Enabled: false

Metrics/MethodLength:
  Enabled: false

Metrics/ModuleLength:
  Enabled: false

Metrics/ParameterLists:
  Enabled: false

Metrics/AbcSize:
  Enabled: true
  Exclude:
    - 'spec/**/*.rb'
    - 'modules/*/spec/**/*.rb'

Naming/AccessorMethodName:
  Enabled: false

Naming/AsciiIdentifiers:
  Enabled: false

Naming/ClassAndModuleCamelCase:
  AllowedNames:
    - V2_1

Naming/FileName:
  Enabled: false

Naming/PredicateName:
  ForbiddenPrefixes:
    - is_

Naming/VariableNumber:
  AllowedPatterns:
    - '\w_20\d\d' # allow dates like christmas_2022 or date_2034_04_12
    - '\w\d++(_\d++)+' # allow hierarchical data like child1_2_5 (second + in regex is possessive qualifier)

# There are valid cases in which to use methods like:
# * update_all
# * touch_all
Rails/SkipsModelValidations:
  Enabled: false

# Don't force us to use tag instead of content_tag
# as this breaks angular elements
Rails/ContentTag:
  Enabled: false

# Disable I18n.locale = in specs, where it is reset
# by us explicitly
Rails/I18nLocaleAssignment:
  Enabled: true
  Exclude:
    - 'spec/**/*.rb'

# Do not bother if `let` statements use an index in their name
RSpec/IndexedLet:
  Enabled: false

# The http verbs in Rack::Test do not accept named parameters (params: params)
Rails/HttpPositionalArguments:
  Exclude:
    - 'spec/requests/api/v3/**/*.rb'

# require_dependency is an obsolete method for Rails applications running in Zeitwerk mode.
Rails/RequireDependency:
  Enabled: true

# For feature specs, we tend to have longer specs that cover a larger part of the functionality.
# This is done for multiple reasons:
# * performance, as setting up integration tests is costly
# * following a scenario that is closer to how a user interacts
RSpec/ExampleLength:
  Max: 25
  Enabled: true
  Exclude:
    - 'spec/features/**/*.rb'
    - 'modules/*/spec/features/**/*.rb'

# We have specs that have no expect(..) syntax,
# but only helper classes that expect themselves
RSpec/NoExpectationExample:
  Enabled: false

RSpec/DescribeClass:
  Enabled: true
  Exclude:
    - 'spec/features/**/*.rb'
    - 'modules/*/spec/features/**/*.rb'

# dynamic finders cop clashes with capybara ID cop
Rails/DynamicFindBy:
  Enabled: true
  Exclude:
    - 'spec/features/**/*.rb'
    - 'spec/support/**/*.rb'
    - 'modules/*/spec/features/**/*.rb'

# We have config.active_record.belongs_to_required_by_default = false ,
# which means, we do have to declare presence validators on belongs_to relations.
Rails/RedundantPresenceValidationOnBelongsTo:
  Enabled: false

# See RSpec/ExampleLength for why feature specs are excluded
RSpec/MultipleExpectations:
  Max: 15
  Enabled: true
  Exclude:
    - 'spec/features/**/*.rb'
    - 'modules/*/spec/features/**/*.rb'

RSpec/MultipleMemoizedHelpers:
  Enabled: false

RSpec/NestedGroups:
  Enabled: false

# Don't force the second argument of describe
# to be .class_method or #instance_method
RSpec/DescribeMethod:
  Enabled: false

# Don't force the second argument of describe
# to match the exact file name
RSpec/SpecFilePathFormat:
  IgnoreMethods: true

# Prevent  "fit" or similar to be committed
RSpec/Focus:
  Enabled: true

# We use let!() to ensure dependencies are created
# instead of let() and referencing them explicitly
RSpec/LetSetup:
  Enabled: false

RSpec/LeadingSubject:
  Enabled: false

RSpec/NamedSubject:
  Enabled: false

RSpec/ContextWording:
  Prefixes:
    - and
    - as
    - even
    - for
    - having
    - if
    - 'on'
    - to
    - unless
    - via
    - when
    - with
    - within
    - without

Style/Alias:
  Enabled: false

Style/AndOr:
  Enabled: false

Style/ArrayJoin:
  Enabled: false

Style/AsciiComments:
  Enabled: false

Style/Attr:
  Enabled: false

Style/CaseEquality:
  Enabled: false

Style/CharacterLiteral:
  Enabled: false

Style/ClassAndModuleChildren:
  Enabled: false

Style/ClassVars:
  Enabled: false

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

Style/ColonMethodCall:
  Enabled: false

Style/CommentAnnotation:
  Enabled: false

Style/PreferredHashMethods:
  Enabled: false

Style/Documentation:
  Enabled: false

Style/DoubleNegation:
  Enabled: false

Style/EachWithObject:
  Enabled: false

Style/EmptyLiteral:
  Enabled: false

Style/EvenOdd:
  Enabled: false

Style/FormatString:
  Enabled: false

Style/FormatStringToken:
  AllowedMethods: [redirect]

Style/GlobalVars:
  Enabled: false

Style/GuardClause:
  Enabled: false

Style/IfUnlessModifier:
  Enabled: false

Style/IfWithSemicolon:
  Enabled: false

Style/InlineComment:
  Enabled: false

Style/Lambda:
  Enabled: false

Style/LambdaCall:
  Enabled: false

Style/LineEndConcatenation:
  Enabled: false

Style/ModuleFunction:
  Enabled: false

Style/NegatedIf:
  Enabled: false

Style/NegatedWhile:
  Enabled: false

Style/Next:
  Enabled: false

Style/NilComparison:
  Enabled: false

Style/Not:
  Enabled: false

Style/OneLineConditional:
  Enabled: false

Style/PercentLiteralDelimiters:
  Enabled: false

Style/PerlBackrefs:
  Enabled: false

Style/Proc:
  Enabled: false

Style/RaiseArgs:
  Enabled: false

Style/RegexpLiteral:
  Enabled: false

Style/SelfAssignment:
  Enabled: false

Style/SingleLineBlockParams:
  Enabled: false

Style/SingleLineMethods:
  Enabled: false

Style/SignalException:
  Enabled: false

Style/SpecialGlobalVars:
  Enabled: false

# Forcing single quotes doesn't give any reasonable advantages. To the contrary:
# it forces you to change the quotes every time you want to add interpolation,
# newlines or other escape sequences (\n), or quotes (') to a string. Rubbish.
# Don't even think about performance. That never was a valid argument to begin with.
#
#   For the record: using single quotes does NOT have any performance advantages.
#   Even if it did, this would be a silly argument.
#
# Quote away.
Style/StringLiterals:
  EnforcedStyle: double_quotes

Style/TrivialAccessors:
  Enabled: false

Style/VariableInterpolation:
  Enabled: false

Style/WhenThen:
  Enabled: false

Style/WhileUntilModifier:
  Enabled: false

Style/WordArray:
  Enabled: false

Style/FrozenStringLiteralComment:
  Enabled: false

Style/NumericLiterals:
  Enabled: false

# Avoid enforcing "positive?"
Style/NumericPredicate:
  Enabled: false

Style/HashEachMethods:
  Enabled: true

Style/HashTransformKeys:
  Enabled: true

Style/HashTransformValues:
  Enabled: true

Performance/Casecmp:
  Enabled: false