amatsukixブログ

【Rubocop】警告を参考にコード修正してみる

Rubocop とは

Rubocopはコード規約をチェックしてくれるライブラリです。
いい感じにコードを統一させてくれるやつです。

さっそくbundlerでインストール

下記がgithubにあるページで、インストールする方法も載っています。
今回はRailsのアプリの想定でインストールします。

インストールはすぐに終わります。

github.com

Gemfileに下記を追記。

gem 'rubocop', require: false

そして、Railsアプリのディレクトリに移動した後、ターミナルで

$bundle install

これで終わりです。

ターミナルで $rubocop とするだけでコードをチェックしてくれます。

VSCodeでrubocopをの警告を表示してほしい!ってときは下記の記事を見てね。

amatsukixprog.hatenablog.jp

Rubocopで警告が出た時の対処法を書き留める

Google翻訳も載せます。

Use nested module/class definitions instead of compact style.

コンパクトなスタイルではなく、ネストされたモジュール/クラス定義を使用します。

こちらの記事に詳しく載っていました。

qiita.com

既存のコードでコンパクトなスタイルのクラスがあり、
あまり修正したくなかったので無視することにしました。

Missing top-level class documentation comment.

最上位クラスのドキュメントコメントがありません。

class の前にコメントを記述しておかないと警告されます。

Prefer single-quoted strings when you don't need string interpolation or special symbols.

文字列の補間や特別な記号が必要ない場合は、単一引用符で囲まれた文字列を優先します。

優先して シングルクォーテーションを使用してくださいという警告です。
rubocopを気にせずコードを書いていると、だいたいこれに引っかかると思います。 無効化している記事をよく見かけます。

Put empty method definitions on a single line.

空のメソッド定義を1行に配置します。

空のメソッドの場合は1行にまとめないといけないようです。

www.rubydoc.info

Final newline missing.

最終改行がありません。

ファイルの最終行に改行を入れます。

assumes too much for instance variable '@roadmap_header'

インスタンス変数 '@roadmap_header'が多すぎると想定

わけわかりませんでしたが、下記を見ると納得。
インスタンス変数はクラス内のみで考えて、 値が入れられているはずとか適当に設計してはいけないということですね。

この警告はrubocopと関係ない気がしましたが、紛れ込ませます。。。

github.com

Extra empty line detected at class body beginning.

クラス本体の先頭で余分な空行が検出されました。

classとdefの間にあった空行を削除で解決

Extra empty line detected at class body end.

クラス本体の終わりに余分な空行が検出されました。

空行を削除で解決

Add an empty line after magic comments.

マジックコメントの後に空の行を追加します。

コメントの後に空行を追加しておきました。

Align the elements of a hash literal if they span more than one line.

ハッシュリテラルの要素が複数行にわたる場合、それらの要素を整列します。

下記のように汚かったものを、

patch roadmap_edit_path(@roadmap_header), params: { roadmap_header: {
                                            title:  "title is title",
                                            roadmap_detail_attributes: {
                                              sub_title: "sub_title",
                                              content: "context",
                                              time_required: ""
                                            } } }

下記のように修正しました。

    patch roadmap_edit_path(@roadmap_header),
          params: {
            roadmap_header: {
              title: "title is title",
              roadmap_detail_attributes: {
                sub_title: "sub_title",
                content: "context",
                time_required: ""
              }
            }
          }

Use 2 spaces for indentation in a hash, relative to the start of the line where the left curly brace is.

ハッシュ内のインデントには、左中括弧がある行の開始点に対して2つのスペースを使用します。

if文等と同じようなインデントでかけということですね。
上の警告の際に一緒に表示された警告でした。

Trailing whitespace detected.

末尾の空白が検出されました。

不要な空白は削除します。
VSCodeだと拡張機能を入れるとわかりやすくなって便利です。

marketplace.visualstudio.com

Do not use space inside array brackets.

配列括弧内にスペースを使用しないでください。

不要なスペースがあったので削除します。

[ :request_id ]
[:request_id]

Extra empty line detected at module body beginning.

モジュール本体の先頭で余分な空行が検出されました。

余分な空行は削除します。

Use %i or %I for an array of symbols.

シンボルの配列には%iまたは%Iを使用します。

シンボルの配列は%記法を用いて記述します。
あまり%記法は好きではなかったので無効化しました。

%記法にすると配列の種類も細かく分けることができて、
grepするときに便利なのかなと思いました。

必要だと感じたら有効化して修正しようと思います。

Space missing after colon.

コロンの後にスペースがありません。

ハッシュの配列のところで警告されたのでスペースを追加しました。

あまり書かれていない Rubocop の豆知識

C: Style/StringLiterals: Prefer single-quoted strings when you don't need string interpolation or special symbols.

と警告があったときに Style/StringLiterals の部分を .rubocop.yml ファイル内で下記のようにしてあげると警告自体を無視できるようです。

Style/StringLiterals:
  Enabled: false

覚えておくとパッと.rubocop.ymlに記述して無効化できるので便利そう。
(Enabled 以外にもオプションはありそうなので気になったら要チェック)

色々記事見てたけど気づかなかった。。。

Rails Copsについて

Rails用の規約チェックが以前はできたのですが、
別のgemに分けられたようです。

koic.hatenablog.com

rubocop-rails gemはこちら

github.com

今回作成した.rubocop.yml

最終的な.rubocop.ymlファイルです。
参考にどうぞ

require:
  - rubocop-rails

AllCops:
  # 除外するディレクトリ(自動生成されたファイル)
  # デフォルト設定にある"vendor/**/*"が無効化されないように記述
  Exclude:
    - bin/*
    - db/schema.rb
    - db/migrate/*
    - vendor/**/*
    - node_modules/**/* # node_modules配下のフォルダを除外
    - tmp/**/*
    - public/**/*
    - Gemfile

  TargetRubyVersion: 2.6.4

# classのドキュメントコメントを無効
Style/Documentation:
  Enabled: false

# ダブルクォーテーション、シングルクォーテーションの制限無効
Style/StringLiterals:
  Enabled: false

# コードの長さの制限無効
Metrics/LineLength:
  Enabled: false

# 日本語のコメントを許可する
Style/AsciiComments:
  Enabled: false

# !! のイディオムは積極的に使う
Style/DoubleNegation:
  Enabled: false

# 明示的に else で nil を返すのは分かりやすいので許可する
Style/EmptyElse:
  EnforcedStyle: empty

# 条件式の方を意識させたい場合には後置の if/unless を使わない方が分かりやすい
Style/IfUnlessModifier:
  Enabled: false

# 1_000_000 と区切り文字が 2 個以上必要になる場合のみ _ 区切りを必須にする
Style/NumericLiterals:
  MinDigits: 7

# * 式展開したい場合に書き換えるのが面倒
# * 文章ではダブルクォートよりもシングルクォートの方が頻出する
# ことから EnforcedStyle: double_quotes 推奨
# Style/StringLiterals:
#   EnforcedStyle: double_quotes

# 20 行超えるのは migration ファイル以外滅多に無い
Metrics/MethodLength:
  Max: 20
  Exclude:
    - "db/migrate/*.rb"

# クラスの行数が多すぎる
ClassLength:
  Enabled: false

# メソッドの行数が多すぎる
MethodLength:
  Enabled: false

# Frozenのコメント
Style/FrozenStringLiteralComment:
  Enabled: false

# ネストなスタイルとコンパクトなスタイルのクラス両方を許可
# (既存のコードをあまり触りたくない)
Style/ClassAndModuleChildren:
  Enabled: false

# シンボルの配列は%記法を用いなくてもよい
Style/SymbolArray:
  Enabled: false

終わりに

開発初期からrubocop入れておけばよかったと後悔。。。