とんかつ時々あんどーなつ

〜たとえ低空でも飛行していられるように〜

RuboCop を使ってみる

目的

コーディングルールが浸透していない Rails アプリケーションに Lint ツールを導入する

RuboCop とは

github.com

  • RuboCop is a Ruby static code analyzer. というわけで平たくいうと Lint ツール
  • たくさんの設定項目があり、微調整できるとのこと

導入

導入の仕方は README の通り Gemfile に下記を追記する

gem 'rubocop', '~> 0.51.0', require: false
  • インストール確認は下記
$ bundle exec rubocop -v

使い方

// カレントディレクトリ配下のすべての Ruby ファイルをチェックする
$ bundle exec rubocop

// 指定したディレクトリ(今回は app/)配下の Ruby ファイルをチェックする
$ bundle exec rubocop app/
  • コマンドのオプションは下記にたくさんある

チェック項目

  • あくまで一例だが、下記の項目などがチェック対象になる
    • ハッシュの { の後ろと } の前にスペースがあるか?
    • 文字列補完が必要ないのにダブルクォートを使っていないか?
    • 一行あたりの文字数が 80 文字以内か?
    • メソッドの return が省略できる場合に省略しているか?
    • メソッドの処理がない時は一行で書いているか?
    • 代替メソッドの提案
      • 例えば xx == 0 の代わりに xx.zero? は使えないか?などをチェックしてくれる

独自ルールの適用

AllCops:
  TargetRubyVersion: 2.4

既存のアプリケーションに導入してみる

事前準備

  • 現在の状態をチェックする
$ bundle exec rubocop --display-cop-names
  • 現在の状態をチェックした上で todo ファイルを作る (.rubocop_todo.yml ファイルが作られる)
$ bundle exec rubocop --display-cop-names --auto-gen-config
  • RuboCop の設定ファイル .rubocop.yml を作る
// .rubocop_todo.yml を読み込むようにしておく
$ echo "inherit_from: .rubocop_todo.yml" >> .rubocop.yml
  • 上記の手順で設定ファイルを用意し、再度チェックを走らすと .rubocop_todo.yml に記載された問題が無視され、検出されない状態になる
  • .rubocop_todo.yml から 1 つの問題を削除する (例えば Style/StringLiteralsInInterpolation)
  • この状態で rubocop を走らせるとエラーが検知されるので対象ファイルを修正する
  • ちなみに Style/StringLiteralsInInterpolation は --auto-correct 対象なので、オプションを付ければ自動で修正される
$ bundle exec rubocop --display-cop-names --auto-correct