Rails RuboCop

## はじめに
チーム開発ではコードの規約が大切になります。

規約がなかった場合、「僕はインデント幅2が好きだから2にしとくね」「僕はインデント幅100が好きだから100にしとくね」みたいな感じになってコードの可読性が落ちたり、思わぬエラーを引き起こしたりします。

そのような規約を暗黙の了解ではなく、自動的に適用させられたら嬉しいです。
そんな時に役立つのが```RuboCop```です。

## RuboCopとは
Rubyのリンターです。Javascriptだと```ESLint```が有名だと思います。
解析するだけでなく、フォーマッターの役割もしてくれます。

#### セットアップ
Railsに導入するものとします。```Gemfile```に以下のgemを追加します(rspecを使わない方は4行目は必要ありません)。
```
    gem 'rubocop', require: false
    gem "rubocop-performance", require: false
    gem "rubocop-rails", require: false
    gem "rubocop-rspec", require: false
```
RuboCopの設定ファイルを作ります。
```terminal
    touch .rubocop.yml
```
とりあえず、これで走らせることができるので走らせてみます。
```terminal
    rubocop
```
おそらく、かなりたくさんの警告が出ると思います。

#### RuboCopコマンド
自動でフォーマットして欲しい場合は下記のコマンドを実行します。
```terminal
    rubocop -a
```
警告が出ているものを一旦無視する形で退避する場合は以下のコマンドを実行します。
```
    rubocop --auto-gen-config
```
実行すると```.rubocop_todo.yml```が自動的に生成されます。
```.rubocop_todo.yml```では警告の対象になっているものをExcludeする形で退避しています。

ファイルが生成されるのと同時に```.rubocop.yml```には```inherit_from: .rubocop_todo.yml```が追加されています。
これによりrubocopの解析範囲は、```.rubocop_todo.yml```で退避されていないところかつ、```.rubocop.yml```に基づくところになります。

#### .rubocop.ymlファイルの設定
RuboCopのデフォルト設定は下記のファイルに定義されています。

https://github.com/rubocop/rubocop/blob/master/config/default.yml

```.rubocop.yml```でオーバーライドすることによって独自の解析ができるようになります。
現在の状態では、rubyの解析しかするようになっていないため下記のようにファイル内で```require```します。
```.rubocop.yml
    require:
      - rubocop-performance
      - rubocop-rspec
      - rubocop-rails
```


## 何ができるのか
できることが多すぎてよくわかりません。
とりあえず何が原因で警告が出ているのかをみるために、```rubocop --auto-gen-config```して、```.rubocop_todo.yml```を眺めるのがいいのかなと思います。

#### なんか良さげなやつ

- **Bundler/OrderedGems:**
=> Gemfileを自動でソートしてくれる

- **Layout/AccessModifierIndentation**
=> privateもしくはpublicメソッド宣言後に定義されたメソッドをインデントする

- **Layout/EmptyLines**
=> 不必要な改行を削除

- **Layout/EmptyLinesAroundBlockBody:**
=> ブロックの最初の不要な空行を削除

- **Layout/EmptyLinesAroundClassBody:**
=> クラス定義の最初と最後の不要な空行を削除

- **Layout/EmptyLinesAroundModuleBody:**
=> 上記のmoduleバージョン

- **Layout/ExtraSpacing:**
=> 不必要なスペースを削除

- **Layout/LeadingCommentSpace:**
=> コメントアウト時の```#```とコメントの間に半角スペースを入れる

- **Layout/SpaceAfterColon:**
=> 「:」の後に半角スペースを入れるようにする

- **Layout/SpaceAroundOperators:**
=> 「=」の前後に半角スペース

- **Layout/SpaceInsideArrayLiteralBrackets:**
=> ```[ :space ]```を```[:space]```のようにする(前後に半角スペースを入れない)

- **Layout/SpaceInsideHashLiteralBraces:**
=> ↑と逆で```{}```の場合、半角スペースを入れる

- **Layout/TrailingEmptyLines:**
=> 最終行に改行を入れる

- **Layout/TrailingWhitespace:**
=> コード内の不必要なスペースを削除

- **Style/ClassAndModuleChildren:**
=> ```User::SessionsController```みたいに定義しているところをうまくネストしてくれる

- **Style/StringLiterals:**
=> シングルクォートに統一

#### 不必要そうなもの(.rubocop.yml)
```.rubocop.yml
    require:
      - rubocop-performance
      - rubocop-rspec
      - rubocop-rails
    
    inherit_from: .rubocop_todo.yml
    
    # class, moduleの先頭の行に説明文を書く必要性
    Style/Documentation:
      Enabled: false
    
    # ↑がtrueで先頭の行に何もなかった場合、# frozen_string_literal: trueが先頭の行に追加される
    Style/FrozenStringLiteralComment:
      Enabled: false
    
    # １行の長さのリミット
    Layout/LineLength:
      Enabled: false
    
    # ガード節(条件を満たさない場合は即returnするようにする) => if文の可読性が落ちそう
    Style/GuardClause:
      Enabled: false
    
    # %i[mri mingw x64_mingw] <= シンボルの配列をこんな感じにしてくる(多分可読性落ちる)
    Style/SymbolArray:
      Enabled: false
    
    # trueの場合、最後の引数の後にコンマを入れないようにする
    Style/TrailingCommaInArguments:
      Enabled: false

    # インデント幅を変えたい時
    # Layout/IndentationWidth:
    #   Width: インデント幅
```

## 参考にしたサイト

https://qiita.com/tomohiii/items/1a17018b5a48b8284a8b

https://github.com/rubocop/rubocop

https://rubocop.org/