RuboCopの導入
バージョン
rails 6.1.7.4
ruby 3.1.2
Rubocop のインストール
まず、RuboCopを使用するためには、Gemfileに以下の記述を追加します。
group :development do
gem 'rubocop', require: false
gem 'rubocop-performance', require: false
gem 'rubocop-rails', require: false
gem 'rubocop-rspec', require: false
end
bundle install
rubocop:
基本的な RuboCop gem で、Ruby のスタイルガイドに基づいてコードのスタイルチェックや、潜在的なエラーや不適切なコードの使用を指摘してくれます。
例: インデントの不整合、不要なスペース、変数の命名規則など
rubocop-performance:
Ruby のコードのパフォーマンスに関する問題を検出します。
例: select に続いて map を使用する代わりに pluck を使用することを提案する、ループの不適切な使用を指摘するなど
rubocop-rails:
Rails 特有のコーディング規約やベストプラクティスに従ったコードのチェックを行います。
例: マイグレーションでの add_index の使用忘れ、不要な all メソッドの使用、Time.now の代わりに Time.zone.now を使用することを提案するなど
rubocop-rspec:
RSpec のテストコードの品質やスタイルに関する指摘を行います。
例: expect の形式の一貫性、フックの使用(before, after)、let や subject の適切な使用など
導入
bundle exec rubocop --auto-gen-config
このコマンドを実行すると、rubocop_tobo.yml
と.rubocop.yml
が作成される
.rubocop_tubo.yml
bundle exec rubocop --auto-gen-configを実行すると自動的に作成されます
既存のコードを解析し、「違反しているものを一旦無視する」 ために、このファイルが生成されます。
.rubocop_todo.ymlはあくまで一時的なものであり、その中の違反を解消したら順次削除していく最終的にはこのファイルが空になることを目指します
Bundler/OrderedGems:
Exclude:
- 'Gemfile'
Layout/AccessModifierIndentation:
Exclude:
- 'app/controllers/admin/sessions_controller.rb'
- 'app/controllers/public/comments_controller.rb'
.rubocop.yml
inherit_from: .rubocop_todo.yml # .rubocop_todo.yml が空になったら、この行は削除する
## rubocop 関連の gem を require します。
require:
- rubocop-rails
- rubocop-rspec
- rubocop-performance
- rubocop-capybara
- rubocop-factory_bot
## 全体に適応する項目を定義します。ここで Exclude に設定したファイルは、チェック対象外になります。
AllCops:
TargetRubyVersion: 3.1
TargetRailsVersion: 6.1
Exclude:
- 'vendor/**/*'
- 'bin/**/*'
- 'db/**/*'
- 'tmp/**/*'
- 'node_modules/**/*'
- 'lib/tasks/auto_annotate_models.rake'
inherit_from: .rubocop_todo.yml
.rubocop_todo.yml からの設定を継承します。.rubocop_todo.yml は、現在のコードベースにおける既知の違反を一時的に許可するためのファイルです。
require:
追加のRuboCop関連のgemをロードします。これにより、標準のRuboCopのチェックに加えて、これらのgemで提供される追加のチェックを行うことができます。
AllCops:
RuboCopの全てのCops(チェック項目)に共通する設定を行います。
TargetRubyVersion: 3.1
対象とするRubyのバージョンを指定します。これにより、指定されたバージョンに適切なチェックが行われます。
TargetRailsVersion: 6.1
対象とするRailsのバージョンを指定します。これにより、指定されたバージョンに適切なチェックが行われます。
Exclude:
RuboCopのチェックから除外するファイルやディレクトリを指定します。例えば、vendor/やbin/など、標準的にチェックの対象外としたいディレクトリがリストアップされています。
テスト実行、自動修正
違反内容の出力コマンド
rubocop
RuboCopは、コード解析の結果をいくつかの異なる種類のオフェンス(違反)として報告します。これらのオフェンスには以下の4つの主要なカテゴリがあります。
Convention (C)
これはスタイル的な問題を指します。例えば、インデントが正しくない、不要なスペースが存在する、等です。コードの動作には影響しませんが、読みやすさや一貫性の観点から修正が推奨されるものです。
Warning (W)
警告は、潜在的な問題や不要なコードを示唆するものです。例えば、未使用の変数やメソッドが定義されている場合などに警告として報告されることが多いです。これらはコードの動作に直接的な問題を引き起こすものではないかもしれませんが、不要なコードの存在は混乱を招く可能性があるため、注意が必要です。
Error (E):
エラーは、コード上での明確な問題やバグを示します。例えば、未定義の変数を使用している、必須の引数が不足している、等の問題があります。このようなオフェンスはコードの正常な動作を妨げる可能性が高いため、修正が必要です。
Fatal (F)
致命的なエラーは、RuboCopが解析を続行することができないレベルの深刻な問題を示します。これは例えば、構文エラーによってコードが解析できない場合などに報告されます。これらの種類のエラーは、コードの動作に直接的な影響を及ぼすものであり、修正が絶対に必要です。
自動修正
エラーメッセージにoffense autocorrectableや [Correctable] と記載されていた場合使用できる。
自動修正コマンド
rubocop -a
RuboCopが自動的に修正できるオフェンスを修正するためのコマンドです。これにより、手動で一つ一つ修正する手間を大幅に減らすことができます。
自動で修正できる内容には以下のようなものが含まれます:
スペースやインデント
インデントが不適切な場所や、行の末尾に余計なスペースがある場合、これを修正します。
コードの書式
例えば、古いハッシュの書き方 (:symbol => value) を新しいスタイル (symbol: value) に修正することができます。
不要なコードの削除
未使用の変数、必要のないreturn、空のブロックなど、不要なコードを自動的に削除します。
メソッドやクラスの修正
例えば、attr_accessor を使用することでゲッターやセッターメソッドを簡潔に書くことができます。
シンタックスの簡略化
例えば、unlessの否定を避けるための修正や、三項演算子を使用してコードを簡潔にするなどの修正が可能です。
冗長なメソッドの使用を避ける
Array#select の後に Array#first を使用する代わりに Array#find を使用するといった修正が行われます。
処理の順序
map と compact のようなメソッドチェーンの順序を最適化することもあります。
... など、多くの自動修正が可能です。
ただし、注意点として、すべてのオフェンスが自動的に修正されるわけではありません。また、-a オプションを使用すると、RuboCopが安全でないと判断したオフェンスも自動修正されることがあります。そのため、自動修正後は必ずコードの動作を確認することが重要です。
参考