Railsのコードを綺麗にしたくてRuboCopを導入したのでメモメモ

どうもこんにちは。

RSpecテストのことをメモしてたら、RuboCopのことも書きたくなったのでメモします。

# RuboCopとは？

RuboCopとは、Rubyのコードをチェックして、そのコードがRubyの良い書き方かどうかを確認するツールです。簡単に言うと、Rubyの「 **文法チェッカー＆アドバイザー** 」のようなものです。

# RuboCopを導入するメリット

- 導入が簡単
- 開発チーム全体でコードスタイルを統一することができる
- バグを防ぐことができる
- 良いコードスタイルを学ぶことができる

# デメリット

特にない。。。

# RoboCopとRSpec何が違うの？

一言で言うと、「 **静的チェックか動的チェックか** 」です。

RuboCopはコードの外見を見ます。（スタイルなど）

それに対して、RSpecはコードの内面を見ます。（動作、行動）

https://qiita.com/PDC-Kurashinak/items/a3ec3d693a70540aa4da

# 導入方法

ここでは、最低限のRailsアプリケーションが構築されている前提で説明を進めます。

## 1. Gemを追加

Gemfileに以下のコードを記述します。

```gemfile
group :development do
  gem 'rubocop', require: false
  gem 'rubocop-performance', require: false
  gem 'rubocop-rails', require: false
  gem 'rubocop-rspec', require: false
end
```

- rubocop・・・コードチェックに最低限必要なgemです。
- rubocop-performance・・・コードのパフォーマンスに関係する問題を指摘してくれます。
- rubocop-rails・・・Rails用のコーディング規約に沿ってコードチェックをしてくれます。
- rubocop-rspec・・・RSpecテストコードについてチェックをしてくれます。

RSpecテストを導入していない場合には、`rubocop-rspec`を導入する必要はありません。

## 2. bundle installの実行

ターミナルで`bundle install`を実行します。

## 3. 設定ファイルの追加

ターミナルで`rubocop --init`を実行します。

これによって、`.rubocop.yml`という設定用ファイルが自動生成されます。

## 4. 拡張Gemの設定追加

`.rubocop.yml`に以下のコードを記述します。

```yml
require:
  - rubocop-rails
  - rubocop-performance
  - rubocop-rspec
```

## 5. テスト実行

ターミナルで以下のコマンドを実行します。

```
# 修正箇所の洗い出し
bundle exec rubocop

# 修正箇所を自動修正（弱）
bundle exec rubocop -a

# 修正箇所を自動修正（強）
bundle exec rubocop -A
```

自分が最低限使用するのは上記3つです。

しかし、この設定のままだと、かなりルールが厳しいです。なので個別にルールを設定します。

自分が設定しているルールです。参考までに。。。

```yml
require:
  - rubocop-performance
  - rubocop-rails
  - rubocop-rspec

AllCops:
  Exclude:
    - 'bin/**/*'
    - 'config/**/*'
    - 'coverage/**/*'
    - 'db/**/*'
    - 'docker/**/*'
    - 'log/**/*'
    - 'node_modules/**/*'
    - 'public/**/*'
    - 'storage/**/*'
    - 'test/**/*'
    - 'tmp/**/*'
    - 'vendor/**/*'
  TargetRubyVersion: 3.0.6

Layout/LineLength:
  Max: 150

Metrics/MethodLength:
  Max: 200

Metrics/AbcSize:
  Enabled: false

Metrics/PerceivedComplexity:
  Enabled: false

Metrics/CyclomaticComplexity:
  Enabled: false

Metrics/BlockLength:
  Enabled: 150

Metrics/BlockNesting:
  Max: 5

Metrics/ClassLength:
  Enabled: false

Naming/VariableNumber:
  Enabled: false

Style/Documentation:
  Enabled: false

Naming/AccessorMethodName:
  Enabled: false

Style/AsciiComments:
  Enabled: false

Style/Documentation:
  Enabled: false

Style/FrozenStringLiteralComment:
  Enabled: false

Style/RescueModifier:
  Enabled: false

Style/SymbolProc:
  Enabled: false

Style/ClassAndModuleChildren:
  Enabled: false

# 以下、Rails用

Rails/InverseOf:
  Enabled: false

# 以下、RSpec用

RSpec/MultipleMemoizedHelpers:
  Enabled: false

RSpec/LetSetup:
  Enabled: false

RSpec/ContextWording:
  Enabled: false

RSpec/NamedSubject:
  Enabled: false

RSpec/AnyInstance:
  Enabled: false

RSpec/NestedGroups:
  Max: 4

RSpec/RepeatedExampleGroupBody:
  Enabled: false
```

# ちょいめも

自分の感想ですが、`bundle exec rubocop`を実行した時に、結果が見づらいなぁという印象を受けました。

なので、自分の場合は実行結果をHTML形式で表示するようにしています。

## 設定方法

### 1. 結果出力ファイルを作成する

`code_check/rubocop_output.html`というディレクトリとファイルを作成します。

### 2. HTMLを指定してRuboCopを実行

ターミナルで`bundle exec rubocop -f html -o code_check/rubocop_output.html`を実行します。

これだけで以下のような結果画面が閲覧できるようになります。

![スクリーンショット 2023-09-15 18.27.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711491/f8abbac0-36b2-5711-b888-f4aab329455d.png)

# まとめ

今回はRuboCopについてメモしてみました。

書いている最中に見つけましたが、以下の記事でもかなりわかりやすく説明がされていましたので御紹介させていただきます。

https://qiita.com/mirimu/items/fe82c1224ba814d43256

RuboCopは導入難易度がかなり低いと思いますので、初学者の方にはぜひ導入してほしいライブラリです。

以上