【Rails】RuboCopの基本的な使用方法と出力の見方

## はじめに
RubyのLinterツールであるRuboCopについて以下内容をまとめました。

- インストール方法
- 基本的な使用方法
- 出力の見方
- 規定の設定（他記事へのリンク）

保守性が高く、キレイなコードを書けるようになっていきたいです:writing_hand:

## この記事が役に立つ方
- RuboCopを使ったことがない方

## この記事のメリット
- RuboCopが使えるようになる
- 最低限出力が読めるようになる

## 環境
- macOS Mojave バージョン10.14.6
- シェル：zsh
- Ruby 2.6.3
- Rails 6.0.1
- RuboCop 0.76.0

## RuboCopとは？
公式サイトはこちらです。
[Home - RuboCop: The Ruby Linter that Serves and Protects](https://rubocop.readthedocs.io/en/latest/)

<img width="681" alt="スクリーンショット 2019-11-19 0.17.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483292/59e6aa16-80fe-9ef2-e46d-5879426af333.png">

ロゴとマーフィーの名言がいいですね:fist:

規定のフォーマットから違反している部分を示してくれる機能に加え、`-a`オプションで「簡単な違反は自動で修正」までしてくれるツールです。

規定は任意に変更することが可能です。

## 【注意点】
RuboCop関連の記事を参照するときは**作成・最終更新日時**に注意したほうがいいと思われます。
理由は以下。

バージョン0.72以降のgemは細分化が行われています。（以下記事参照）
[RuboCop 本体から Rails Cops が外される - koicの日記](http://koic.hatenablog.com/entry/extract-rails-cops-from-rubocop-core)

- `rubocop`：生Rubyに関わる構文規則チェック
- `rubocop-rails`：Railsに関わる構文規則チェック
- `rubocop-performance`：パフォーマンスに関わる構文規則チェック

バージョン0.71以前では、**全部入り**だったため、RuboCop関連の記事を読むときは、**バージョン0.71以前**なのか、**0.72以降**のものなのかを注意して見ておかないと、「なぜかRailsの構文チェックしてくれない…」など動作に支障が出る可能性があります。

※バージョン0.72は**2019-06-25**にリリース。

## インストール方法
今回はRailsアプリに組み込むことを想定して、Gemfileに記述する方法をご紹介します。

```zsh
gem 'rubocop', require:false
gem 'rubocop-rails', require:false
```

RuboCopは開発者が必要に応じてターミナル等で使用するため、`require:false`をつけるようにします。
これにより、bundlerによってRailsアプリ側に自動で読み込みされないようになります。

この後、gemのインストールで完了です。

```zsh
$ bundle install
```


## 使用方法

```zsh
$ rubocop
```
非常にシンプル。これでチェックがスタートし、結果が表示されます。

---

```zsh
$ rubocop -a
```
自動的に修正してほしい時はこちら。

---

```zsh
$ rubocop --help
```
その他オプションはこれで確認が出来ます。

次に出力の見方を確認していきます。

## 出力の基本構文
1箇所の違反に対し、3行でワンセットになっています。

```zsh
問題のファイルの相対パス:行番号:列番号: 違反レベル: 違反種別: 違反メッセージ
ここに違反した部分が表示される
　　  ^^^　← ^で該当箇所を示してくれる
```

例えば、以下のような出力になります。

```zsh
Gemfile:44:25: C: Layout/SpaceAfterColon: Space missing after colon.
  gem 'rubocop', require:false
                        ^
```
↑恥ずかしながらGemfileに記述したとき、`:`の後にスペースを入れるのを忘れていました:sweat_smile:

ちなみに、このレベルであれば`rubocop -a`で自動修正してくれました。
他に`""`で囲っているのに式展開がなければ`''`にしてくれたり。

手数がかかるところは自動修正にお任せですね！

次に違反のレベルです。

## 違反のレベル
重要なものから順に記載します。
`W`以上は要修正です。

`F` Fatal
`E` Error
`W` Warning

↑ 修正すべき
--- 壁 ---
↓ 修正の余地あり

`C` Convention
`R` Refactor


`C`以下は緊急で修正する必要がないため、
以下コードで`W`以上に絞って違反を出力することも可能です。

```zsh
$ rubocop --fail-level W --display-only-fail-level-offenses
```
※以下記事参照
[RuboCopでWarning以上の項目のみ検出する方法 - Qiita](https://qiita.com/mh4gf/items/0f98e55e80fda9589309)

## 違反種別
公式リファレンスへのリンクをご用意しました。
[Cops - RuboCop: The Ruby Linter that Serves and Protects](https://rubocop.readthedocs.io/en/latest/cops/)

ただ、基本的には以下のような簡単な英語なのでそこまで見る必要はなさそうです。
`Layout/SpaceAfterColon: Space missing after colon.`
`Metrics/LineLength: Line is too long.`

## 規定の変更方法
Gemfileと同じ階層の`.rubocop.yml`と`rubocop_todo.yml`に記述すれば変更可能です。

詳細についてはこちらの記事が非常に分かりやすかったのでリンクを貼らせて頂きます。
[【初心者向け】Railsの品質を上げるRuboCopのインストールと使い方！ | キツネの惑星](https://kitsune.blog/rails-rubocop)

## おわりに
vimなどのエディタや、CircleCIとの連携も出来るようですね。
ガンガン使って保守性の高いコードを書いていこうと思います。

ロボコップって確か最後空を飛んでましたっけ？:point_up:

## 参考にさせて頂いたサイト（いつもありがとうございます）
[Home - RuboCop: The Ruby Linter that Serves and Protects](https://rubocop.readthedocs.io/en/latest/)
[RuboCop 本体から Rails Cops が外される - koicの日記](http://koic.hatenablog.com/entry/extract-rails-cops-from-rubocop-core)
[Railsでrubocopを使って構文チェックする方法 | 人と情報](https://www.tmp1024.com/articles/rails-rubocop-static-analysis)
[RuboCop | 警告の出力フォーマット指定 - Qiita](https://qiita.com/tbpgr/items/177932080f694d085582)
[【初心者向け】Railsの品質を上げるRuboCopのインストールと使い方！ | キツネの惑星](https://kitsune.blog/rails-rubocop)
[RuboCopでWarning以上の項目のみ検出する方法 - Qiita](https://qiita.com/mh4gf/items/0f98e55e80fda9589309)