inherit_gem: gitlab-styles: - rubocop-default.yml require: - ./rubocop/rubocop - rubocop-rspec inherit_from: <% unless ENV['REVEAL_RUBOCOP_TODO'] == '1' %> <% Dir.glob('.rubocop_todo/**/*.yml').each do |rubocop_todo_yaml| %> - '<%= rubocop_todo_yaml %>' <% end %> - '.rubocop_todo.yml' <% end %> - ./rubocop/rubocop-migrations.yml - ./rubocop/rubocop-usage-data.yml - ./rubocop/rubocop-code_reuse.yml <% Dir.glob('jh/rubocop/**/*.yml').each do |jh_rubocop_yaml| %> - '<%= jh_rubocop_yaml %>' <% end %> inherit_mode: merge: - Include - Exclude AllCops: TargetRubyVersion: 2.7 TargetRailsVersion: 6.0 Exclude: - 'vendor/**/*' - 'node_modules/**/*' - 'db/fixtures/**/*' - 'db/schema.rb' - 'tmp/**/*' - 'bin/**/*' - 'generator_templates/**/*' - 'builds/**/*' - 'plugins/**/*' - 'file_hooks/**/*' - 'workhorse/**/*' - 'spec/support/*.git/**/*' # e.g. spec/support/gitlab-git-test.git - 'db/ci_migrate/*.rb' # since the `db/ci_migrate` is a symlinked to `db/migrate` # Use absolute path to avoid orphan directories with changed workspace root. CacheRootDirectory: <%= Dir.getwd %>/tmp MaxFilesInCache: 30000 Cop/AvoidKeywordArgumentsInSidekiqWorkers: Enabled: true Include: - 'app/workers/**/*' - 'ee/app/workers/**/*' Cop/StaticTranslationDefinition: Enabled: true Exclude: - 'spec/**/*' - 'ee/spec/**/*' InternalAffairs/DeprecateCopHelper: Enabled: true Include: - spec/rubocop/**/*.rb Lint/LastKeywordArgument: Enabled: true Safe: false # This cop checks whether some constant value isn't a # mutable literal (e.g. array or hash). Style/MutableConstant: Enabled: true Exclude: - 'db/migrate/**/*' - 'db/post_migrate/**/*' - 'ee/db/migrate/**/*' - 'ee/db/post_migrate/**/*' - 'ee/db/geo/migrate/**/*' # TODO: Move this to gitlab-styles Style/SafeNavigation: Enabled: false Style/AccessModifierDeclarations: AllowModifiersOnSymbols: true # Frozen String Literal Style/FrozenStringLiteralComment: Enabled: true EnforcedStyle: always_true RSpec/FilePath: Exclude: - 'qa/**/*' - 'spec/frontend/fixtures/*' - 'ee/spec/frontend/fixtures/*' - 'spec/requests/api/v3/*' - 'spec/fixtures/**/*' # Configuration parameters: AllowSubject. RSpec/MultipleMemoizedHelpers: Max: 25 AllowSubject: true Naming/FileName: ExpectMatchingDefinition: true CheckDefinitionPathHierarchy: false Exclude: - '**/*/*.builder' - 'ee/bin/*' - 'config.ru' - 'config/**/*' - 'ee/config/**/*' - 'jh/config/**/*' - 'db/**/*' - 'ee/db/**/*' - 'ee/elastic/migrate/*' - 'lib/tasks/**/*.rake' - 'ee/lib/tasks/**/*.rake' - 'lib/generators/**/*' - 'ee/lib/generators/**/*' - 'scripts/**/*' - 'spec/**/*' - 'tooling/bin/**/*' - 'ee/spec/**/*' - 'jh/spec/**/*' - 'qa/bin/*' - 'qa/spec/**/*' - 'qa/qa/specs/**/*' - 'qa/tasks/**/*.rake' - '**/*.ru' IgnoreExecutableScripts: true AllowedAcronyms: - EE - JSON - LDAP - SAML - SSO - IO - HMAC - QA - ENV - STL - PDF - SVG - CTE - DN - RSA - CI - CD - OAuth - CSP - CSV - SCA - SAN - CIDR - SPDX - MR - SSE - JWT - HLL - GPG - OTP - GID - AR - RSpec - ECDSA - ED25519 - GitLab - JavaScript - VSCode - JetBrains # default ones: - CLI - DSL - ACL - API - ASCII - CPU - CSS - DNS - EOF - GUID - HTML - HTTP - HTTPS - ID - IP - JSON - LHS - QPS - RAM - RHS - RPC - SLA - SMTP - SQL - SSH - TCP - TLS - TTL - UDP - UI - UID - UUID - URI - URL - UTF8 - VM - XML - XMPP - XSRF - XSS - GRPC Rails/ApplicationRecord: Enabled: true Exclude: # Models in database migrations should not subclass from ApplicationRecord # as they need to be as decoupled from application code as possible - db/**/*.rb - lib/gitlab/background_migration/**/*.rb - ee/lib/ee/gitlab/background_migration/**/*.rb - lib/gitlab/database/**/*.rb - spec/**/*.rb - ee/db/**/*.rb - ee/spec/**/*.rb Cop/DefaultScope: Enabled: true Rails/FindBy: Enabled: true Include: - 'ee/app/**/*.rb' - 'ee/lib/**/*.rb' - 'spec/**/*.rb' - 'ee/spec/**/*.rb' # This is currently exiting with a rubocop exception error and should be # resolved hopefully a future update # An error occurred while Rails/UniqueValidationWithoutIndex cop was inspecting # app/models/abuse_report.rb:15:2. # To see the complete backtrace run rubocop -d. Rails/UniqueValidationWithoutIndex: Enabled: false # GitLab ################################################################### Gitlab/ModuleWithInstanceVariables: Enable: true Exclude: # We ignore Rails helpers right now because it's hard to workaround it - app/helpers/**/*_helper.rb - ee/app/helpers/**/*_helper.rb # We ignore Rails mailers right now because it's hard to workaround it - app/mailers/emails/**/*.rb - ee/**/emails/**/*.rb # We ignore spec helpers because it usually doesn't matter - spec/support/**/*.rb - features/steps/**/*.rb Gitlab/ConstGetInheritFalse: Enabled: true Exclude: - 'qa/bin/*' Gitlab/ChangeTimezone: Enabled: true Exclude: - config/initializers/time_zone.rb Gitlab/HTTParty: Enabled: true Exclude: - 'spec/**/*' - 'ee/spec/**/*' Gitlab/Json: Enabled: true Exclude: - 'qa/**/*' - 'scripts/**/*' - 'tooling/rspec_flaky/**/*' - 'lib/quality/**/*' - 'tooling/danger/**/*' Gitlab/AvoidUploadedFileFromParams: Enabled: true Exclude: - 'lib/gitlab/middleware/multipart.rb' - 'spec/**/*' - 'ee/spec/**/*' Gitlab/EventStoreSubscriber: Enabled: true Exclude: - 'spec/**/*' - 'ee/spec/**/*' GitlabSecurity/PublicSend: Enabled: true Exclude: - 'config/**/*' - 'db/**/*' - 'features/**/*' - 'lib/**/*.rake' - 'qa/**/*' - 'spec/**/*' - 'ee/db/**/*' - 'ee/lib/**/*.rake' - 'ee/spec/**/*' Database/MultipleDatabases: Enabled: true Include: - 'app/**/*.rb' - 'ee/app/**/*.rb' - 'lib/**/*.rb' - 'ee/lib/**/*.rb' - 'spec/**/*.rb' - 'ee/spec/**/*.rb' Exclude: - 'ee/db/**/*.rb' - 'spec/migrations/**/*.rb' - 'lib/gitlab/background_migration/**/*.rb' - 'spec/lib/gitlab/background_migration/**/*.rb' - 'spec/lib/gitlab/database/**/*.rb' Gitlab/DuplicateSpecLocation: Enabled: true Gitlab/PolicyRuleBoolean: Enabled: true Include: - 'app/policies/**/*' - 'ee/app/policies/**/*' Cop/InjectEnterpriseEditionModule: Enabled: true Exclude: - 'spec/**/*' - 'ee/spec/**/*' Style/ReturnNil: Enabled: true # It isn't always safe to replace `=~` with `.match?`, especially when there are # nil values on the left hand side Performance/RegexpMatch: Enabled: false Cop/ActiveRecordAssociationReload: Enabled: true Exclude: - 'spec/**/*' - 'ee/spec/**/*' Cop/ActiveModelErrorsDirectManipulation: Enabled: true Gitlab/AvoidFeatureGet: Enabled: true RSpec/TimecopFreeze: Enabled: true AutoCorrect: true Include: - 'spec/**/*.rb' - 'ee/spec/**/*.rb' - 'qa/spec/**/*.rb' RSpec/TimecopTravel: Enabled: true AutoCorrect: true Include: - 'spec/**/*.rb' - 'ee/spec/**/*.rb' - 'qa/spec/**/*.rb' RSpec/WebMockEnable: Enabled: true Include: - 'spec/**/*.rb' - 'ee/spec/**/*.rb' Exclude: - 'spec/support/webmock.rb' Naming/PredicateName: Enabled: true Exclude: - 'spec/**/*' - 'ee/spec/**/*' RSpec/FactoriesInMigrationSpecs: Enabled: true Include: - 'spec/migrations/**/*.rb' - 'ee/spec/migrations/**/*.rb' - 'spec/lib/gitlab/background_migration/**/*.rb' - 'spec/lib/ee/gitlab/background_migration/**/*.rb' - 'ee/spec/lib/ee/gitlab/background_migration/**/*.rb' Cop/IncludeSidekiqWorker: Enabled: true Exclude: - 'spec/**/*' - 'ee/spec/**/*' Gitlab/Union: Enabled: true Exclude: - 'spec/**/*' - 'ee/spec/**/*' API/Base: Enabled: true Include: - 'lib/**/api/**/*.rb' - 'ee/**/api/**/*.rb' API/GrapeArrayMissingCoerce: Enabled: true Include: - 'lib/**/api/**/*.rb' - 'ee/**/api/**/*.rb' Cop/SidekiqOptionsQueue: Enabled: true Exclude: - 'spec/**/*.rb' - 'ee/spec/**/*.rb' Graphql/ResolverType: Enabled: true Exclude: - 'app/graphql/resolvers/base_resolver.rb' Include: - 'app/graphql/resolvers/**/*' - 'ee/app/graphql/resolvers/**/*' Graphql/AuthorizeTypes: Enabled: true Include: - 'app/graphql/types/**/*' - 'ee/app/graphql/types/**/*' Exclude: - 'spec/**/*.rb' - 'ee/spec/**/*.rb' Graphql/GIDExpectedType: Enabled: true Include: - 'app/graphql/**/*' - 'ee/app/graphql/**/*' Exclude: - 'spec/**/*.rb' - 'ee/spec/**/*.rb' Graphql/IDType: Enabled: true Include: - 'app/graphql/**/*' - 'ee/app/graphql/**/*' Graphql/JSONType: Enabled: true Include: - 'app/graphql/**/*' - 'ee/app/graphql/**/*' Exclude: - 'spec/**/*.rb' - 'ee/spec/**/*.rb' Graphql/OldTypes: Enabled: true Include: - 'app/graphql/**/*' - 'ee/app/graphql/**/*' - 'spec/graphql/**/*' - 'spec/requests/api/graphql/**/*' - 'ee/spec/graphql/**/*' - 'ee/spec/requests/api/graphql/**/*' RSpec/EnvAssignment: Enable: true Include: - 'spec/**/*.rb' - 'ee/spec/**/*.rb' Exclude: - 'spec/**/fast_spec_helper.rb' - 'ee/spec/**/fast_spec_helper.rb' - 'spec/**/spec_helper.rb' - 'ee/spec/**/spec_helper.rb' RSpec/BeSuccessMatcher: Enabled: true Include: - 'spec/controllers/**/*' - 'ee/spec/controllers/**/*' - 'spec/support/shared_examples/controllers/**/*' - 'ee/spec/support/shared_examples/controllers/**/*' - 'spec/support/controllers/**/*' - 'ee/spec/support/controllers/**/*' Scalability/FileUploads: Enabled: true Include: - 'lib/api/**/*.rb' - 'ee/lib/api/**/*.rb' Graphql/Descriptions: Enabled: true AutoCorrect: true Include: - 'app/graphql/**/*' - 'ee/app/graphql/**/*' # Cops for upgrade to gitlab-styles 3.1.0 RSpec/ImplicitSubject: Enabled: false RSpec/EmptyLineAfterHook: Enabled: false RSpec/HooksBeforeExamples: Enabled: false RSpec/EmptyLineAfterExample: Enabled: false RSpec/Be: Enabled: false RSpec/DescribedClass: Enabled: false RSpec/SharedExamples: Enabled: false RSpec/EmptyLineAfterExampleGroup: Enabled: false RSpec/ReceiveNever: Enabled: false RSpec/MissingExampleGroupArgument: Enabled: false RSpec/UnspecifiedException: Enabled: false RSpec/HaveGitlabHttpStatus: Enabled: true Exclude: - 'spec/support/matchers/have_gitlab_http_status.rb' Include: - 'spec/**/*' - 'ee/spec/**/*' Style/MultilineWhenThen: Enabled: false # We use EnforcedStyle of comparison here due to it being better # performing code as seen in https://gitlab.com/gitlab-org/gitlab/-/merge_requests/36221#note_375659681 Style/NumericPredicate: EnforcedStyle: comparison Style/FloatDivision: Enabled: false Cop/BanCatchThrow: Enabled: true Performance/ReadlinesEach: Enabled: true Performance/ChainArrayAllocation: Enabled: true Include: - 'lib/gitlab/import_export/**/*' - 'ee/lib/gitlab/import_export/**/*' - 'ee/lib/ee/gitlab/import_export/**/*' Rails/TimeZone: Enabled: true EnforcedStyle: 'flexible' Include: - 'app/controllers/**/*' - 'app/services/**/*' - 'lib/**/*' - 'spec/controllers/**/*' - 'spec/services/**/*' - 'spec/lib/**/*' - 'ee/app/controllers/**/*' - 'ee/app/services/**/*' - 'ee/spec/controllers/**/*' - 'ee/spec/services/**/*' - 'app/models/**/*' - 'spec/models/**/*' - 'ee/app/models/**/*' - 'ee/spec/models/**/*' - 'app/workers/**/*' - 'spec/workers/**/*' - 'ee/app/workers/**/*' - 'ee/spec/workers/**/*' - 'ee/lib/**/*' - 'ee/spec/lib/**/*' - 'spec/features/**/*' - 'ee/spec/features/**/*' # WIP: See https://gitlab.com/gitlab-org/gitlab/-/issues/220040 Rails/SaveBang: Enabled: true AllowImplicitReturn: false AllowedReceivers: ['ActionDispatch::TestRequest'] Include: - 'spec/**/*.rb' - 'ee/spec/**/*.rb' - 'qa/spec/**/*.rb' - 'qa/qa/specs/**/*.rb' Exclude: - spec/models/wiki_page/**/* - spec/models/wiki_page_spec.rb Cop/PutProjectRoutesUnderScope: Include: - 'config/routes/project.rb' - 'ee/config/routes/project.rb' Cop/PutGroupRoutesUnderScope: Include: - 'config/routes/group.rb' - 'ee/config/routes/group.rb' Migration/ComplexIndexesRequireName: Exclude: - !ruby/regexp /\Adb\/(post_)?migrate\/201.*\.rb\z/ - !ruby/regexp /\Adb\/(post_)?migrate\/20200[1-7].*\.rb\z/ Migration/ReferToIndexByName: Exclude: - !ruby/regexp /\Adb\/(post_)?migrate\/201.*\.rb\z/ - !ruby/regexp /\Adb\/(post_)?migrate\/20200[1-7].*\.rb\z/ - !ruby/regexp /\Aee\/db\/geo\/(post_)?migrate\/201.*\.rb\z/ Migration/CreateTableWithForeignKeys: # Disable this cop for all the existing migrations Exclude: - !ruby/regexp /\Adb\/(?:post_)?migrate\/(?:201[0-9]\d+|20200[0-8][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9])_.+\.rb\z/ Migration/PreventIndexCreation: Exclude: - !ruby/regexp /\Adb\/(post_)?migrate\/201.*\.rb\z/ - !ruby/regexp /\Adb\/(post_)?migrate\/2020.*\.rb\z/ - !ruby/regexp /\Adb\/(post_)?migrate\/20210[1-6].*\.rb\z/ Gitlab/RailsLogger: Exclude: - 'spec/**/*.rb' - 'ee/spec/**/*.rb' # WIP See https://gitlab.com/gitlab-org/gitlab/-/issues/267606 FactoryBot/InlineAssociation: Include: - 'spec/factories/**/*.rb' - 'ee/spec/factories/**/*.rb' # WIP: https://gitlab.com/gitlab-org/gitlab/-/issues/321982 Gitlab/NamespacedClass: Exclude: - 'config/**/*.rb' - 'db/**/*.rb' - 'ee/bin/**/*' - 'ee/db/**/*.rb' - 'ee/elastic/**/*.rb' - 'scripts/**/*' - 'spec/migrations/**/*.rb' - 'app/experiments/**/*_experiment.rb' Lint/HashCompareByIdentity: Enabled: true Lint/RedundantSafeNavigation: Enabled: true Style/ClassEqualityComparison: Enabled: true # WIP See https://gitlab.com/gitlab-org/gitlab/-/issues/207950 Cop/UserAdmin: Enabled: true Exclude: - 'app/controllers/admin/sessions_controller.rb' - 'app/controllers/concerns/enforces_admin_authentication.rb' - 'app/policies/base_policy.rb' - 'lib/gitlab/auth/current_user_mode.rb' - 'spec/**/*.rb' - 'ee/spec/**/*.rb' # See https://gitlab.com/gitlab-org/gitlab/-/issues/327495 Style/RegexpLiteral: Enabled: false Style/RegexpLiteralMixedPreserve: Enabled: true SupportedStyles: - slashes - percent_r - mixed - mixed_preserve EnforcedStyle: mixed_preserve RSpec/TopLevelDescribePath: Exclude: - 'spec/fixtures/**/*.rb' - 'ee/spec/fixtures/**/*.rb' QA/SelectorUsage: Enabled: true Include: - 'spec/**/*.rb' - 'ee/spec/**/*.rb' Exclude: - 'spec/rubocop/**/*_spec.rb' QA/DuplicateTestcaseLink: # this cop is executed in static-analysis.gitlab-ci.yml since it cannot be run in parallel Enabled: false Performance/ActiveRecordSubtransactions: Exclude: - 'spec/**/*.rb' - 'ee/spec/**/*.rb' Performance/ActiveRecordSubtransactionMethods: Exclude: - 'spec/**/*.rb' - 'ee/spec/**/*.rb'