RuboCop使ってみた

#はじめに

RuboCopを初めて触ってみたので、備忘のために導入から使用方法まで大まかに記載します。
これから本格的に使っていくので、もし間違いなどがあれば教えていただけると幸いです。

#RuboCopとは
**コーディング規約に沿って、コーディングできているかを確認できる「静的コード解析ツール」。**

つまり、自分のコードが規約に沿って書かれているかをチェックするためのツール。

複数人開発の際にはもちろん、個人開発の場合でも綺麗なコードを書き、品質を維持することに越したことはないので、使ってみて損はない。

#インストール

RuboCopはgemを使って簡単にインストールできる。
Gemfileに以下を記載。

```ruby:Gemfile

gem 'rubocop', require: false
gem 'rubocop-rails'
```
そしてお決まりの下記コマンド。

```bash
$bundle install
```
これでOK。

#使い方
ターミナルでrubocopコマンドを実行するだけ。

```bash

$ rubocop
Inspecting 58 files
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC

.
.

58 files inspected, 199 offenses detected
```

その結果出た警告を修正してまたrubocopコマンドを実行するような流れ。

ただデフォルトの設定だとRuboCopのコーディング規約は厳しいので、相当な数の警告がでる。
そこで、RuboCopのルールを自分なり（もしくはチームなり）に作成することで、実際は使う。

まずは以下のコマンドを用いて、
.rubocop.yml
.rubocop_todo.yml
を作成する。

```bash
$ rubocop --auto-gen-config
```

このコマンドによって作成された上記の2つのファイルの役割は、

.rubocop.yml ・・・　自分なり（チームなり）のコーディングルールを定めるファイル
.rubocop_todo.yml　・・・無視するルールを定めるファイル

である。

.rubocop.ymlを巷で見つけた以下の設定に変更。
併せて.rubocop_todo.ymlも空にしておく。

```ruby:.rubocop.yml
inherit_from: .rubocop_todo.yml

# 追加した規約ファイル読込
require:
  - rubocop-rails

AllCops:
  # Rubyバージョン指定
  TargetRubyVersion: 2.6
  # 除外
  Exclude:
    - "config.ru"
    - "bin/**"
    - "lib/**"
    - "db/**/*"
    - "config/**/*"
    - "script/**/*"
    - !ruby/regexp /old_and_unused\.rb$/

# 日本語でのコメントを許可
AsciiComments:
  Enabled: false

# クラスのコメント必須を無視
Documentation:
  Enabled: false

# モジュール名::クラス名の定義を許可
ClassAndModuleChildren:
  Enabled: false

# 文字リテラルのイミュータブル宣言を無視（freezeになるのはRuby3以降）
Style/FrozenStringLiteralComment:
  Enabled: false

```


この上でrubocopコマンドを実行すると、先程よりだいぶ数が減っているはずである。


##$rubocop --auto-correct

ただ俄然数は多いので、そういった場合には$rubocop --auto-correctのコマンドで、rubocopが自動修正をしてくれる。

```bash
$ rubocop --auto-correct
Inspecting 19 files
CC..............C.C

Offenses:

spec/spec_helper.rb:93:1: C: [Corrected] Layout/CommentIndentation: Incorrect indentation detected (column 0 instead of 2).
#   Kernel.srand config.seed
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.
.

56 files inspected, 30 offenses detected, 15 offenses corrected
```
ここで、[corrected]と出ているところが、自動修正してくれたところである。
今回のケースで言えば、15箇所の自動修正をしてくれたということである。

あとは、残っているcopを確認し、修正するか、もしくは無視するかを決め、対応を行う。
そして再度rubocopコマンドを実行する。といったような流れである。

ある箇所のみ警告を無視するか、もしくは警告自体を出ないようにするか対応を取ることができる。

##警告を無視する

こちらでまとめていただいているのが少し古いが参考になった。
[RuboCopの警告をコメントで無効化する方法](https://qiita.com/tbpgr/items/a9000c5c6fa92a46c206)


##警告自体を出ないようにする
例えば、以下のような警告が出た場合を考える。

```bash

script/rails:4:53: C: Layout/ExtraSpacing: Unnecessary spacing detected.
APP_PATH = File.expand_path('../config/application',  __dir__)
```
余分なスペースが入っているという警告であるが、面倒であるので、無視しようという方針になれば、それを.rubocop.ymlに記載する。

```ruby:.rubocop.yml
Layout/ExtraSpacing:
  Enabled: false
```
そうすると、以後これに関する警告は出なくなる。


# $rubocop -D --only cop名

このコマンドにより、該当のcop名のみの警告を抽出できる。


##ついでに
rubocopを実行するとたくさん出てくるCとかWとかは何だろうと思い調べてみると、警告の重さであることがわかった。
軽い順に、Refactor, Convention, Warning, Error, Fatalがあり、その頭文字が記載されている。

こういうこともなんとなくではなく、1つ1つ意味を理解しながら学習していきたい。

これから本格的にRuboCopと触れ合うと思うので、より便利な手法を学び、実務で活かしていきたい。




##参考にさせていただいたもの
[RuboCop公式](https://docs.rubocop.org/en/stable/)
[Rubocopを使ってRailsコードをチェックしてみる](https://sakanasoft.net/rubocop/#RailsHasManyOrHasOneDependent)
[RuboCopの警告をコメントで無効化する方法](https://qiita.com/tbpgr/items/a9000c5c6fa92a46c206)