Ruby on Railsプロジェクトのrubocop.ymlテンプレ

2023/02/15に公開

概要

  • 最近、rubocop-rspecというrubocopのrspec用プラグインを見つけました。
  • 数年前から存在しているようです。早速導入してみたところ、盛大に修正点を上げてくれて、ベストプラクティスを享受できたので感動しました。
  • このプラグインはあまり知られていないのかもしれないので記事にしておきます。

設定

私が育てたプロジェクトの rubocop.yml を置いておきます。

最近のrubocopはデフォルトではルールが厳しすぎるので、コードのみやすさやパフォーマンスに影響が少ないところは無効化しています。

  gem 'rubocop', require: false
  gem 'rubocop-performance', require: false
  gem 'rubocop-rails', require: false
  gem 'rubocop-rspec', require: false
inherit_from: .rubocop_todo.yml

## This configuration was generated by
## `rubocop --auto-gen-config`
## on 2017-11-25 11:44:56 +0000 using RuboCop version 0.51.0.
## The point is for the user to remove these configuration records
## one by one as the offenses are removed from the code base.
## Note that changes in the inspected code, or installation of new
## versions of RuboCop, may require this file to be generated again.

## Offense count: 15
## Cop supports --auto-correct.
## Configuration parameters: Include, TreatCommentsAsGroupSeparators.
## Include: **/Gemfile, **/gems.rb
require:
  - rubocop-rails
  - rubocop-performance
  - rubocop-rspec

AllCops:
  TargetRubyVersion: 3.1
  Exclude:
    - 'vendor/**/*'
    - 'db/**/*'
    - 'lib/tasks/**/*'
    - "db/schema.rb"
    - 'bin/*'
    - 'test/*'
    - 'node_modules/**/*'
    - 'config/initializers/**/*'
    - 'public/**/*'
    - 'storage/**/*'
    - 'log/**/*'
    - 'tmp/**/*'
    - 'terraform/**/*'
    - 'openapi/**/*'
  NewCops: enable

## sider's rubocop stops during this file
Rails/HttpStatus:
  Exclude:
    - 'app/controllers/application_controller.rb'

Rails/SkipsModelValidations:
  AllowedMethods:
    - 'touch'
    - 'upsert_all'

Layout/LineLength:
  Max: 200
  Exclude:
    - 'spec/**/*'
    - 'config/**/*'

Layout/ParameterAlignment:
  Enabled: false

Layout/EmptyLineBetweenDefs:
  Enabled: false

Layout/EmptyLines:
  Enabled: false

Layout/EmptyLinesAroundAccessModifier:
  Enabled: false

Layout/EmptyLinesAroundBlockBody:
  Enabled: false

Layout/EmptyLinesAroundClassBody:
  Enabled: false

Layout/EmptyLinesAroundMethodBody:
  Enabled: false

Layout/ExtraSpacing:
  Enabled: false

Layout/IndentationConsistency:
  Enabled: false

Layout/SpaceBeforeBlockBraces:
  Enabled: false

Layout/SpaceInsideHashLiteralBraces:
  Enabled: false

Layout/EmptyLinesAroundAttributeAccessor:
  Enabled: true

Layout/SpaceAroundMethodCallOperator:
  Enabled: true

Lint/DeprecatedOpenSSLConstant:
  Enabled: true

Lint/DuplicateElsifCondition:
  Enabled: true

Lint/MixedRegexpCaptureTypes:
  Enabled: true

Lint/RaiseException:
  Enabled: true

Lint/StructNewOverride:
  Enabled: true

Style/AsciiComments:
  Enabled: false

Style/ClassAndModuleChildren:
  Enabled: false

Style/Documentation:
  Enabled: false

Style/EmptyMethod:
  Enabled: false

Style/FrozenStringLiteralComment:
  Enabled: false

Style/GuardClause:
  Enabled: false

## Configuration parameters: Whitelist.
## Whitelist: be, be_a, be_an, be_between, be_falsey, be_kind_of, be_instance_of, be_truthy, be_within, eq, eql, end_with, include, match, raise_error, respond_to, start_with
Style/NumericPredicate:
  Enabled: false

## Readability is more important
Style/RedundantReturn:
  Enabled: false

Style/NumericLiterals:
  Enabled: false

Style/AccessorGrouping:
  Enabled: false

Style/ArrayCoercion:
  Enabled: true

Style/BisectedAttrAccessor:
  Enabled: true

Style/CaseLikeIf:
  Enabled: true

Style/ExponentialNotation:
  Enabled: true

Style/HashAsLastArrayItem:
  Enabled: false

Style/HashEachMethods:
  Enabled: true

Style/HashLikeCase:
  Enabled: true

Style/HashTransformKeys:
  Enabled: true

Style/HashTransformValues:
  Enabled: true

Style/RedundantAssignment:
  Enabled: true

Style/RedundantFetchBlock:
  Enabled: true

Style/RedundantFileExtensionInRequire:
  Enabled: true

Style/RedundantRegexpCharacterClass:
  Enabled: true

Style/RedundantRegexpEscape:
  Enabled: true

Style/SlicingWithRange:
  Enabled: true

Style/TrailingCommaInHashLiteral:
  Enabled: false

## Configuration parameters: EnforcedStyle, SupportedStyles.
## SupportedStyles: all_comparison_operators, equality_operators_only
Style/YodaCondition:
  # Readability is more important
  Enabled: false

Style/FormatStringToken:
  EnforcedStyle: template

Performance/TimesMap:
  Exclude:
    - 'spec/**/*'

Metrics/BlockLength:
  Exclude:
    - 'spec/**/*'
    - 'config/**/*'
    - 'app/views/api/v1/**/*'
    - 'app/models/order_product.rb' # aasm

Metrics/AbcSize:
  Enabled: false

Metrics/MethodLength:
  Enabled: false

Style/SymbolArray:
  Enabled: false

Style/RescueModifier:
  Enabled: false

Metrics/ClassLength:
  Enabled: false

Metrics/ParameterLists:
  Enabled: false

RSpec/NestedGroups:
  Enabled: false

Capybara/CurrentPathExpectation:
  Enabled: false

RSpec/MultipleMemoizedHelpers:
  Enabled: false

RSpec/ExampleLength:
  Enabled: false

RSpec/ContextWording:
  Enabled: false

RSpec/MultipleExpectations:
  Enabled: false

RSpec/LetSetup:
  Enabled: false

RSpec/Capybara/FeatureMethods:
  Enabled: false

RSpec/ChangeByZero:
  Enabled: false

Naming/VariableNumber:
  Enabled: false

最新版はこちらに置いておきます。
https://gist.github.com/matsubo/ec5b6cbf0a7207075e2b081f394863e6

CIでの実行おススメ

もちろんCI上でもrubocopを実行しているのですが、rubocopをオプション無しで実行するとフォーマットの準拠を1つでもしていないとfailします。

せっかくCIを回したのに、テストがfailしてしまうのはあまりよろしくないです。開発効率を上げるためにCIを入れているのに逆に悪くなってしまいます。

なので、プログラムの動作に影響しないようなstylingの準拠は無視するようにしています。そのためのオプションがこちら。

% rubocop --fail-level W

WARNIG以上の問題だったら終了コードに0以外を返却してCIをfailさせます。これによってわざわざコードのスタイルを準拠するためにcommitとpushを行わなくて良くなるので気が楽になります。

株式会社マインディア テックブログ

Discussion