require:
  - rubocop-rails
  - rubocop-rspec
  - rubocop-performance

AllCops:
  TargetRubyVersion: 2.7
  DisplayCopNames: true
  DisplayStyleGuide: true
  ExtraDetails: true
  UseCache: true
  CacheRootDirectory: tmp
  NewCops: enable
  Exclude:
    - db/schema.rb
    - 'app/views/**/*'
    - 'config/**/*'
    - 'bin/*'
    - 'Rakefile'
    - 'node_modules/**/*'
    - 'Vagrantfile'
    - 'vendor/**/*'
    - 'lib/json_ld/*'
    - 'lib/templates/**/*'

Bundler/OrderedGems:
  Enabled: false

Layout/AccessModifierIndentation:
  EnforcedStyle: indent

Layout/EmptyLineAfterMagicComment:
  Enabled: false

Layout/EmptyLineAfterGuardClause:
  Enabled: false

Layout/EmptyLineBetweenDefs:
  AllowAdjacentOneLineDefs: true

Layout/EmptyLinesAroundAttributeAccessor:
  Enabled: true

Layout/FirstHashElementIndentation:
  EnforcedStyle: consistent

Layout/HashAlignment:
  Enabled: false

Layout/SpaceAroundMethodCallOperator:
  Enabled: true

Layout/SpaceInsideHashLiteralBraces:
  EnforcedStyle: space

Lint/DeprecatedOpenSSLConstant:
  Enabled: true

Lint/DuplicateElsifCondition:
  Enabled: true

Lint/MixedRegexpCaptureTypes:
  Enabled: true

Lint/RaiseException:
  Enabled: true

Lint/StructNewOverride:
  Enabled: true

Lint/UselessAccessModifier:
  ContextCreatingMethods:
    - class_methods

Metrics/AbcSize:
  Max: 34 # RuboCop default 17
  Exclude:
    - 'lib/**/*cli*.rb'
    - db/*migrate/**/*
    - lib/paperclip/color_extractor.rb
    - app/workers/scheduler/follow_recommendations_scheduler.rb
    - app/services/activitypub/fetch*_service.rb
    - lib/paperclip/**/*
  CountRepeatedAttributes: false
  AllowedMethods:
    - update_media_attachments!
    - account_link_to
    - attempt_oembed
    - build_crutches
    - calculate_scores
    - cc
    - dump_actor!
    - filter_from_home?
    - hydrate
    - import_bookmarks!
    - import_relationships!
    - initialize
    - link_to_mention
    - log_target
    - matches_time_window?
    - parse_metadata
    - perform_statuses_search!
    - privatize_media_attachments!
    - process_update
    - publish_media_attachments!
    - remotable_attachment
    - render_initial_state
    - render_with_cache
    - searchable_by
    - self.cached_filters_for
    - set_fetchable_attributes!
    - signed_request_actor
    - statuses_to_delete
    - update_poll!

Metrics/BlockLength:
  Max: 55
  Exclude:
    - 'lib/mastodon/*_cli.rb'
  CountComments: false
  CountAsOne: [array, heredoc]
  AllowedMethods:
    - task
    - namespace
    - class_methods
    - included

Metrics/BlockNesting:
  Max: 3
  Exclude:
    - 'lib/mastodon/*_cli.rb'

Metrics/ClassLength:
  CountComments: false
  Max: 500
  CountAsOne: [array, heredoc]
  Exclude:
    - 'lib/mastodon/*_cli.rb'

Metrics/CyclomaticComplexity:
  Max: 12
  Exclude:
    - lib/mastodon/*cli*.rb
    - db/*migrate/**/*
  AllowedMethods:
    - attempt_oembed
    - blocked?
    - build_crutches
    - calculate_scores
    - cc
    - discover_endpoint!
    - filter_from_home?
    - hydrate
    - klass
    - link_to_mention
    - log_target
    - matches_time_window?
    - patch_for_forwarding!
    - preprocess_attributes!
    - process_update
    - remotable_attachment
    - scan_text!
    - self.cached_filters_for
    - set_fetchable_attributes!
    - setup_redis_env_url
    - update_media_attachments!

Layout/LineLength:
  Max: 140 # RuboCop default 120
  AllowHeredoc: true
  AllowURI: true
  IgnoreCopDirectives: true
  AllowedPatterns:
    # Allow comments to be long lines
    - !ruby/regexp / \# .*$/
    - !ruby/regexp /^\# .*$/
  Exclude:
    - lib/**/*cli*.rb
    - db/*migrate/**/*
    - db/seeds/**/*

Metrics/MethodLength:
  CountComments: false
  CountAsOne: [array, heredoc]
  Max: 25 # RuboCop default 10
  Exclude:
    - 'lib/mastodon/*_cli.rb'
  AllowedMethods:
    - account_link_to
    - attempt_oembed
    - body_with_limit
    - build_crutches
    - cached_filters_for
    - calculate_scores
    - check_webfinger!
    - clean_feeds!
    - collection_items
    - collection_presenter
    - copy_account_notes!
    - deduplicate_accounts!
    - deduplicate_conversations!
    - deduplicate_local_accounts!
    - deduplicate_statuses!
    - deduplicate_tags!
    - deduplicate_users!
    - discover_endpoint!
    - extract_extra_uris_with_indices
    - extract_hashtags_with_indices
    - extract_mentions_or_lists_with_indices
    - filter_from_home?
    - from_elasticsearch
    - handle_explicit_update!
    - handle_mark_as_sensitive!
    - hsl_to_rgb
    - import_bookmarks!
    - import_domain_blocks!
    - import_relationships!
    - ldap_options
    - matches_time_window?
    - outbox_presenter
    - pam_get_user
    - parallelize_with_progress
    - parse_and_transform
    - patch_for_forwarding!
    - populate_home
    - post_process_style
    - preload_cache_collection_target_statuses
    - privatize_media_attachments!
    - provides_callback_for
    - publish_media_attachments!
    - relevant_account_timestamp
    - remotable_attachment
    - rgb_to_hsl
    - rss_status_content_format
    - set_fetchable_attributes!
    - setup_redis_env_url
    - signed_request_actor
    - to_preview_card_attributes
    - upgrade_storage_filesystem
    - upgrade_storage_s3
    - user_settings_params
    - hydrate
    - cc
    - self_destruct

Metrics/ModuleLength:
  CountComments: false
  Max: 200
  CountAsOne: [array, heredoc]

Metrics/ParameterLists:
  Max: 5 # RuboCop default 5
  CountKeywordArgs: true # RuboCop default true
  MaxOptionalParameters: 3 # RuboCop default 3
  Exclude:
    - app/models/concerns/account_interactions.rb
    - app/services/activitypub/fetch_remote_account_service.rb
    - app/services/activitypub/fetch_remote_actor_service.rb

Metrics/PerceivedComplexity:
  Max: 16 # RuboCop default 8
  AllowedMethods:
    - attempt_oembed
    - build_crutches
    - calculate_scores
    - deduplicate_users!
    - discover_endpoint!
    - filter_from_home?
    - hydrate
    - patch_for_forwarding!
    - process_update
    - remove_orphans
    - update_media_attachments!

Naming/MemoizedInstanceVariableName:
  Enabled: false

Naming/MethodParameterName:
  Enabled: true

Rails:
  Enabled: true

Rails/ApplicationController:
  Enabled: false
  Exclude:
    - 'app/controllers/well_known/**/*.rb'

Rails/BelongsTo:
  Enabled: false

Rails/ContentTag:
  Enabled: false

Rails/EnumHash:
  Enabled: false

Rails/Exit:
  Exclude:
    - 'lib/mastodon/*'
    - 'lib/cli.rb'

Rails/FilePath:
  Enabled: false

Rails/HasAndBelongsToMany:
  Enabled: false

Rails/HasManyOrHasOneDependent:
  Enabled: false

Rails/HelperInstanceVariable:
  Enabled: false

Rails/HttpStatus:
  Enabled: false

Rails/IndexBy:
  Enabled: false

Rails/InverseOf:
  Enabled: false

Rails/LexicallyScopedActionFilter:
  Enabled: false

Rails/OutputSafety:
  Enabled: true

Rails/RakeEnvironment:
  Enabled: false

Rails/RedundantForeignKey:
  Enabled: false

Rails/SkipsModelValidations:
  Enabled: false

Rails/UniqueValidationWithoutIndex:
  Enabled: false

Style/AccessorGrouping:
  Enabled: true

Style/AccessModifierDeclarations:
  Enabled: false

Style/ArrayCoercion:
  Enabled: true

Style/BisectedAttrAccessor:
  Enabled: true

Style/CaseLikeIf:
  Enabled: false

Style/ClassAndModuleChildren:
  Enabled: false

Style/CollectionMethods:
  Enabled: true
  PreferredMethods:
    find_all: 'select'

Style/Documentation:
  Enabled: false

Style/DoubleNegation:
  Enabled: true

Style/ExpandPathArguments:
  Enabled: false

Style/ExponentialNotation:
  Enabled: true

Style/FormatString:
  Enabled: false

Style/FormatStringToken:
  Enabled: false

Style/FrozenStringLiteralComment:
  Enabled: true

Style/GuardClause:
  Enabled: false

Style/HashAsLastArrayItem:
  Enabled: false

Style/HashEachMethods:
  Enabled: true

Style/HashLikeCase:
  Enabled: true

Style/HashTransformKeys:
  Enabled: true

Style/HashTransformValues:
  Enabled: false

Style/HashSyntax:
  Enabled: true
  EnforcedStyle: ruby19_no_mixed_keys

Style/IfUnlessModifier:
  Enabled: false

Style/InverseMethods:
  Enabled: false

Style/Lambda:
  Enabled: false

Style/MutableConstant:
  Enabled: false

Style/PercentLiteralDelimiters:
  PreferredDelimiters:
    '%i': '()'
    '%w': '()'

Style/PerlBackrefs:
  AutoCorrect: false

Style/RedundantFetchBlock:
  Enabled: true

Style/RedundantFileExtensionInRequire:
  Enabled: true

Style/RedundantRegexpCharacterClass:
  Enabled: false

Style/RedundantRegexpEscape:
  Enabled: false

Style/RedundantReturn:
  Enabled: true

Style/RedundantBegin:
  Enabled: false

Style/RegexpLiteral:
  Enabled: false

Style/RescueStandardError:
  Enabled: true

Style/SignalException:
  Enabled: false

Style/SlicingWithRange:
  Enabled: true

Style/SymbolArray:
  Enabled: false

Style/TrailingCommaInArrayLiteral:
  EnforcedStyleForMultiline: 'comma'

Style/TrailingCommaInHashLiteral:
  EnforcedStyleForMultiline: 'comma'

Style/UnpackFirst:
  Enabled: false

RSpec/ScatteredSetup:
  Enabled: false
RSpec/ImplicitExpect:
  Enabled: false
RSpec/NamedSubject:
  Enabled: false
RSpec/DescribeClass:
  Enabled: false
RSpec/LetSetup:
  Enabled: false