summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/lint-ruby.yml2
-rw-r--r--.rubocop.yml254
-rw-r--r--.rubocop/custom.yml6
-rw-r--r--.rubocop/layout.yml6
-rw-r--r--.rubocop/metrics.yml23
-rw-r--r--.rubocop/naming.yml3
-rw-r--r--.rubocop/rails.yml27
-rw-r--r--.rubocop/rspec.yml17
-rw-r--r--.rubocop/rspec_rails.yml3
-rw-r--r--.rubocop/strict.yml19
-rw-r--r--.rubocop/style.yml47
-rwxr-xr-xbin/rubocop27
-rw-r--r--lint-staged.config.js3
13 files changed, 210 insertions, 227 deletions
diff --git a/.github/workflows/lint-ruby.yml b/.github/workflows/lint-ruby.yml
index 2e4de55725b..f4e81d508bf 100644
--- a/.github/workflows/lint-ruby.yml
+++ b/.github/workflows/lint-ruby.yml
@@ -43,7 +43,7 @@ jobs:
uses: r7kamura/rubocop-problem-matchers-action@v1
- name: Run rubocop
- run: bundle exec rubocop
+ run: bin/rubocop
- name: Run brakeman
if: always() # Run both checks, even if the first failed
diff --git a/.rubocop.yml b/.rubocop.yml
index 090b89b2556..cf4ee565e00 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -1,7 +1,34 @@
-# Can be removed once all rules are addressed or moved to this file as documented overrides
-inherit_from: .rubocop_todo.yml
+---
+AllCops:
+ CacheRootDirectory: tmp
+ DisplayCopNames: true
+ DisplayStyleGuide: true
+ Exclude:
+ - db/schema.rb
+ - bin/*
+ - node_modules/**/*
+ - Vagrantfile
+ - vendor/**/*
+ - config/initializers/json_ld*
+ - lib/mastodon/migration_helpers.rb
+ - lib/templates/**/*
+ ExtraDetails: true
+ NewCops: enable
+ TargetRubyVersion: 3.1 # Oldest supported ruby version
+ UseCache: true
+
+inherit_from:
+ - .rubocop/layout.yml
+ - .rubocop/metrics.yml
+ - .rubocop/naming.yml
+ - .rubocop/rails.yml
+ - .rubocop/rspec_rails.yml
+ - .rubocop/rspec.yml
+ - .rubocop/style.yml
+ - .rubocop/custom.yml
+ - .rubocop_todo.yml
+ - .rubocop/strict.yml
-# Used for merging with exclude lists with .rubocop_todo.yml
inherit_mode:
merge:
- Exclude
@@ -12,224 +39,3 @@ require:
- rubocop-rspec_rails
- rubocop-performance
- rubocop-capybara
- - ./lib/linter/rubocop_middle_dot
-
-AllCops:
- TargetRubyVersion: 3.1 # Set to minimum supported version of CI
- DisplayCopNames: true
- DisplayStyleGuide: true
- ExtraDetails: true
- UseCache: true
- CacheRootDirectory: tmp
- NewCops: enable # Opt-in to newly added rules
- Exclude:
- - db/schema.rb
- - 'bin/*'
- - 'node_modules/**/*'
- - 'Vagrantfile'
- - 'vendor/**/*'
- - 'config/initializers/json_ld*' # Generated files
- - 'lib/mastodon/migration_helpers.rb' # Vendored from GitLab
- - 'lib/templates/**/*'
-
-# Reason: Prefer Hashes without extreme indentation
-# https://docs.rubocop.org/rubocop/cops_layout.html#layoutfirsthashelementindentation
-Layout/FirstHashElementIndentation:
- EnforcedStyle: consistent
-
-# Reason: Currently disabled in .rubocop_todo.yml
-# https://docs.rubocop.org/rubocop/cops_layout.html#layoutlinelength
-Layout/LineLength:
- Max: 300 # Default of 120 causes a duplicate entry in generated todo file
-
-## Disable most Metrics/*Length cops
-# Reason: those are often triggered and force significant refactors when this happend
-# but the team feel they are not really improving the code quality.
-
-# https://docs.rubocop.org/rubocop/cops_metrics.html#metricsblocklength
-Metrics/BlockLength:
- Enabled: false
-
-# https://docs.rubocop.org/rubocop/cops_metrics.html#metricsclasslength
-Metrics/ClassLength:
- Enabled: false
-
-# https://docs.rubocop.org/rubocop/cops_metrics.html#metricsmethodlength
-Metrics/MethodLength:
- Enabled: false
-
-# https://docs.rubocop.org/rubocop/cops_metrics.html#metricsmodulelength
-Metrics/ModuleLength:
- Enabled: false
-
-## End Disable Metrics/*Length cops
-
-# Reason: Currently disabled in .rubocop_todo.yml
-# https://docs.rubocop.org/rubocop/cops_metrics.html#metricsabcsize
-Metrics/AbcSize:
- Exclude:
- - 'lib/mastodon/cli/*.rb'
-
-# Reason: Currently disabled in .rubocop_todo.yml
-# https://docs.rubocop.org/rubocop/cops_metrics.html#metricscyclomaticcomplexity
-Metrics/CyclomaticComplexity:
- Exclude:
- - lib/mastodon/cli/*.rb
-
-# Reason:
-# https://docs.rubocop.org/rubocop/cops_metrics.html#metricsparameterlists
-Metrics/ParameterLists:
- CountKeywordArgs: false
-
-# Reason: Prefer seeing a variable name
-# https://docs.rubocop.org/rubocop/cops_naming.html#namingblockforwarding
-Naming/BlockForwarding:
- EnforcedStyle: explicit
-
-# Reason: Prevailing style is argument file paths
-# https://docs.rubocop.org/rubocop-rails/cops_rails.html#railsfilepath
-Rails/FilePath:
- EnforcedStyle: arguments
-
-# Reason: Prevailing style uses numeric status codes, matches RSpec/Rails/HttpStatus
-# https://docs.rubocop.org/rubocop-rails/cops_rails.html#railshttpstatus
-Rails/HttpStatus:
- EnforcedStyle: numeric
-
-# Reason: Conflicts with `Lint/UselessMethodDefinition` for inherited controller actions
-# https://docs.rubocop.org/rubocop-rails/cops_rails.html#railslexicallyscopedactionfilter
-Rails/LexicallyScopedActionFilter:
- Exclude:
- - 'app/controllers/auth/*'
-
-# Reason: These tasks are doing local work which do not need full env loaded
-# https://docs.rubocop.org/rubocop-rails/cops_rails.html#railsrakeenvironment
-Rails/RakeEnvironment:
- Exclude:
- - 'lib/tasks/auto_annotate_models.rake'
- - 'lib/tasks/emojis.rake'
- - 'lib/tasks/mastodon.rake'
- - 'lib/tasks/repo.rake'
- - 'lib/tasks/statistics.rake'
-
-# Reason: There are appropriate times to use these features
-# https://docs.rubocop.org/rubocop-rails/cops_rails.html#railsskipsmodelvalidations
-Rails/SkipsModelValidations:
- Enabled: false
-
-# Reason: We want to preserve the ability to migrate from arbitrary old versions,
-# and cannot guarantee that every installation has run every migration as they upgrade.
-# https://docs.rubocop.org/rubocop-rails/cops_rails.html#railsunusedignoredcolumns
-Rails/UnusedIgnoredColumns:
- Enabled: false
-
-# Reason: Prevailing style choice
-# https://docs.rubocop.org/rubocop-rails/cops_rails.html#railsnegateinclude
-Rails/NegateInclude:
- Enabled: false
-
-# Reason: Enforce default limit, but allow some elements to span lines
-# https://docs.rubocop.org/rubocop-rspec/cops_rspec.html#rspecexamplelength
-RSpec/ExampleLength:
- CountAsOne: ['array', 'heredoc', 'method_call']
-
-# Reason:
-# https://docs.rubocop.org/rubocop-rspec/cops_rspec.html#rspecnamedsubject
-RSpec/NamedSubject:
- EnforcedStyle: named_only
-
-# Reason: Prevailing style choice
-# https://docs.rubocop.org/rubocop-rspec/cops_rspec.html#rspecnottonot
-RSpec/NotToNot:
- EnforcedStyle: to_not
-
-# Reason: Match overrides from Rspec/FilePath rule above
-# https://docs.rubocop.org/rubocop-rspec/cops_rspec.html#rspecspecfilepathformat
-RSpec/SpecFilePathFormat:
- CustomTransform:
- ActivityPub: activitypub
- DeepL: deepl
- FetchOEmbedService: fetch_oembed_service
- OEmbedController: oembed_controller
- OStatus: ostatus
-
-# Reason: Prevailing style uses numeric status codes, matches Rails/HttpStatus
-# https://docs.rubocop.org/rubocop-rspec/cops_rspec_rails.html#rspecrailshttpstatus
-RSpecRails/HttpStatus:
- EnforcedStyle: numeric
-
-# Reason:
-# https://docs.rubocop.org/rubocop/cops_style.html#styleclassandmodulechildren
-Style/ClassAndModuleChildren:
- Enabled: false
-
-# Reason: Classes mostly self-document with their names
-# https://docs.rubocop.org/rubocop/cops_style.html#styledocumentation
-Style/Documentation:
- Enabled: false
-
-# Reason: Route redirects are not token-formatted and must be skipped
-# https://docs.rubocop.org/rubocop/cops_style.html#styleformatstringtoken
-Style/FormatStringToken:
- inherit_mode:
- merge:
- - AllowedMethods # The rubocop-rails config adds `redirect`
- AllowedMethods:
- - redirect_with_vary
-
-# Reason: Prevailing style choice
-# https://docs.rubocop.org/rubocop/cops_style.html#stylehashaslastarrayitem
-Style/HashAsLastArrayItem:
- Enabled: false
-
-# Reason: Enforce modern Ruby style
-# https://docs.rubocop.org/rubocop/cops_style.html#stylehashsyntax
-Style/HashSyntax:
- EnforcedStyle: ruby19_no_mixed_keys
- EnforcedShorthandSyntax: either
-
-# Reason:
-# https://docs.rubocop.org/rubocop/cops_style.html#stylenumericliterals
-Style/NumericLiterals:
- AllowedPatterns:
- - \d{4}_\d{2}_\d{2}_\d{6} # For DB migration date version number readability
-
-# Reason:
-# https://docs.rubocop.org/rubocop/cops_style.html#stylepercentliteraldelimiters
-Style/PercentLiteralDelimiters:
- PreferredDelimiters:
- '%i': '()'
- '%w': '()'
-
-# Reason: Prefer less indentation in conditional assignments
-# https://docs.rubocop.org/rubocop/cops_style.html#styleredundantbegin
-Style/RedundantBegin:
- Enabled: false
-
-# Reason: Prevailing style choice
-# https://docs.rubocop.org/rubocop/cops_style.html#styleredundantfetchblock
-Style/RedundantFetchBlock:
- Enabled: false
-
-# Reason: Overridden to reduce implicit StandardError rescues
-# https://docs.rubocop.org/rubocop/cops_style.html#stylerescuestandarderror
-Style/RescueStandardError:
- EnforcedStyle: implicit
-
-# Reason: Originally disabled for CodeClimate, and no config consensus has been found
-# https://docs.rubocop.org/rubocop/cops_style.html#stylesymbolarray
-Style/SymbolArray:
- Enabled: false
-
-# Reason:
-# https://docs.rubocop.org/rubocop/cops_style.html#styletrailingcommainarrayliteral
-Style/TrailingCommaInArrayLiteral:
- EnforcedStyleForMultiline: 'comma'
-
-# Reason:
-# https://docs.rubocop.org/rubocop/cops_style.html#styletrailingcommainhashliteral
-Style/TrailingCommaInHashLiteral:
- EnforcedStyleForMultiline: 'comma'
-
-Style/MiddleDot:
- Enabled: true
diff --git a/.rubocop/custom.yml b/.rubocop/custom.yml
new file mode 100644
index 00000000000..63035837f86
--- /dev/null
+++ b/.rubocop/custom.yml
@@ -0,0 +1,6 @@
+---
+require:
+ - ../lib/linter/rubocop_middle_dot
+
+Style/MiddleDot:
+ Enabled: true
diff --git a/.rubocop/layout.yml b/.rubocop/layout.yml
new file mode 100644
index 00000000000..487879ca2c1
--- /dev/null
+++ b/.rubocop/layout.yml
@@ -0,0 +1,6 @@
+---
+Layout/FirstHashElementIndentation:
+ EnforcedStyle: consistent
+
+Layout/LineLength:
+ Max: 300 # Default of 120 causes a duplicate entry in generated todo file
diff --git a/.rubocop/metrics.yml b/.rubocop/metrics.yml
new file mode 100644
index 00000000000..89532af42ab
--- /dev/null
+++ b/.rubocop/metrics.yml
@@ -0,0 +1,23 @@
+---
+Metrics/AbcSize:
+ Exclude:
+ - lib/mastodon/cli/*.rb
+
+Metrics/BlockLength:
+ Enabled: false
+
+Metrics/ClassLength:
+ Enabled: false
+
+Metrics/CyclomaticComplexity:
+ Exclude:
+ - lib/mastodon/cli/*.rb
+
+Metrics/MethodLength:
+ Enabled: false
+
+Metrics/ModuleLength:
+ Enabled: false
+
+Metrics/ParameterLists:
+ CountKeywordArgs: false
diff --git a/.rubocop/naming.yml b/.rubocop/naming.yml
new file mode 100644
index 00000000000..da6ad4ac579
--- /dev/null
+++ b/.rubocop/naming.yml
@@ -0,0 +1,3 @@
+---
+Naming/BlockForwarding:
+ EnforcedStyle: explicit
diff --git a/.rubocop/rails.yml b/.rubocop/rails.yml
new file mode 100644
index 00000000000..b83928dee6b
--- /dev/null
+++ b/.rubocop/rails.yml
@@ -0,0 +1,27 @@
+---
+Rails/FilePath:
+ EnforcedStyle: arguments
+
+Rails/HttpStatus:
+ EnforcedStyle: numeric
+
+Rails/LexicallyScopedActionFilter:
+ Exclude:
+ - app/controllers/auth/* # Conflicts with `Lint/UselessMethodDefinition` for inherited controller actions
+
+Rails/NegateInclude:
+ Enabled: false
+
+Rails/RakeEnvironment:
+ Exclude: # Tasks are doing local work which do not need full env loaded
+ - lib/tasks/auto_annotate_models.rake
+ - lib/tasks/emojis.rake
+ - lib/tasks/mastodon.rake
+ - lib/tasks/repo.rake
+ - lib/tasks/statistics.rake
+
+Rails/SkipsModelValidations:
+ Enabled: false
+
+Rails/UnusedIgnoredColumns:
+ Enabled: false # Preserve ability to migrate from arbitrary old versions
diff --git a/.rubocop/rspec.yml b/.rubocop/rspec.yml
new file mode 100644
index 00000000000..a6f8a7aee0f
--- /dev/null
+++ b/.rubocop/rspec.yml
@@ -0,0 +1,17 @@
+---
+RSpec/ExampleLength:
+ CountAsOne: ['array', 'heredoc', 'method_call']
+
+RSpec/NamedSubject:
+ EnforcedStyle: named_only
+
+RSpec/NotToNot:
+ EnforcedStyle: to_not
+
+RSpec/SpecFilePathFormat:
+ CustomTransform:
+ ActivityPub: activitypub
+ DeepL: deepl
+ FetchOEmbedService: fetch_oembed_service
+ OEmbedController: oembed_controller
+ OStatus: ostatus
diff --git a/.rubocop/rspec_rails.yml b/.rubocop/rspec_rails.yml
new file mode 100644
index 00000000000..993a5689ad0
--- /dev/null
+++ b/.rubocop/rspec_rails.yml
@@ -0,0 +1,3 @@
+---
+RSpecRails/HttpStatus:
+ EnforcedStyle: numeric
diff --git a/.rubocop/strict.yml b/.rubocop/strict.yml
new file mode 100644
index 00000000000..2222c6d8b93
--- /dev/null
+++ b/.rubocop/strict.yml
@@ -0,0 +1,19 @@
+Lint/Debugger: # Remove any `binding.pry`
+ Enabled: true
+ Exclude: []
+
+RSpec/Focus: # Require full spec run on CI
+ Enabled: true
+ Exclude: []
+
+Rails/Output: # Remove any `puts` debugging
+ Enabled: true
+ Exclude: []
+
+Rails/FindEach: # Using `each` could impact performance, use `find_each`
+ Enabled: true
+ Exclude: []
+
+Rails/UniqBeforePluck: # Require `uniq.pluck` and not `pluck.uniq`
+ Enabled: true
+ Exclude: []
diff --git a/.rubocop/style.yml b/.rubocop/style.yml
new file mode 100644
index 00000000000..03e35a70ac4
--- /dev/null
+++ b/.rubocop/style.yml
@@ -0,0 +1,47 @@
+---
+Style/ClassAndModuleChildren:
+ Enabled: false
+
+Style/Documentation:
+ Enabled: false
+
+Style/FormatStringToken:
+ AllowedMethods:
+ - redirect_with_vary # Route redirects are not token-formatted
+ inherit_mode:
+ merge:
+ - AllowedMethods
+
+Style/HashAsLastArrayItem:
+ Enabled: false
+
+Style/HashSyntax:
+ EnforcedShorthandSyntax: either
+ EnforcedStyle: ruby19_no_mixed_keys
+
+Style/NumericLiterals:
+ AllowedPatterns:
+ - \d{4}_\d{2}_\d{2}_\d{6}
+
+Style/PercentLiteralDelimiters:
+ PreferredDelimiters:
+ '%i': ()
+ '%w': ()
+
+Style/RedundantBegin:
+ Enabled: false
+
+Style/RedundantFetchBlock:
+ Enabled: false
+
+Style/RescueStandardError:
+ EnforcedStyle: implicit
+
+Style/SymbolArray:
+ Enabled: false
+
+Style/TrailingCommaInArrayLiteral:
+ EnforcedStyleForMultiline: comma
+
+Style/TrailingCommaInHashLiteral:
+ EnforcedStyleForMultiline: comma
diff --git a/bin/rubocop b/bin/rubocop
new file mode 100755
index 00000000000..369a05bedb5
--- /dev/null
+++ b/bin/rubocop
@@ -0,0 +1,27 @@
+#!/usr/bin/env ruby
+# frozen_string_literal: true
+
+#
+# This file was generated by Bundler.
+#
+# The application 'rubocop' is installed as part of a gem, and
+# this file is here to facilitate running it.
+#
+
+ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__)
+
+bundle_binstub = File.expand_path("bundle", __dir__)
+
+if File.file?(bundle_binstub)
+ if File.read(bundle_binstub, 300).include?("This file was generated by Bundler")
+ load(bundle_binstub)
+ else
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
+Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
+ end
+end
+
+require "rubygems"
+require "bundler/setup"
+
+load Gem.bin_path("rubocop", "rubocop")
diff --git a/lint-staged.config.js b/lint-staged.config.js
index 06fe66d11e9..6740def512a 100644
--- a/lint-staged.config.js
+++ b/lint-staged.config.js
@@ -1,7 +1,6 @@
const config = {
'*': 'prettier --ignore-unknown --write',
- 'Capfile|Gemfile|*.{rb,ruby,ru,rake}':
- 'bundle exec rubocop --force-exclusion -a',
+ 'Capfile|Gemfile|*.{rb,ruby,ru,rake}': 'bin/rubocop --force-exclusion -a',
'*.{js,jsx,ts,tsx}': 'eslint --fix',
'*.{css,scss}': 'stylelint --fix',
'*.haml': 'bundle exec haml-lint -a',