くりにっき

フルスタックキュアエンジニアです

rubocop_auto_correctorを作った

はじめに

これはアドベントカレンダーとは全く関係ないいつもの技術エントリです

github.com

モチベーション

僕は普段rubocopでauto correctする時はコミットの可読性の観点から下記のように各cop単位でauto correctしてコミットするようにしています。

sue445.hatenablog.com

このスクリプトは非常に便利なのですが、個人dotfilesにあるため他の人に使ってもらいにくいという難点がありました。

先日のOSSパッチ会 でrubocopコミッタの id:koic に「こういうスクリプトってrubocop本体にあるとどうっすかね?」みたいな感じで雑に相談したら、「本体よりも別のツールとしてあった方がよさそう」という返事をもらったのでgem化したのが今回の rubocop_auto_corrector になります

使い方

bundle exec rubocop_auto_corrector で実行するだけです

実行結果のサンプル

https://github.com/sue445/rubocop_auto_corrector/pull/3/commits

f:id:sue445:20181130235925p:plain

gem化するにあたって気をつけたこと

ユニット(?)テストの整備

gemの性質上実際にgit commitするところまでテストで検証する必要があったので、rspecの中で

  1. ダミーアプリをgit init
  2. rubocop_auto_correctorを動かして rubocop --auto-correct && git commit
  3. gitのコミットメッセージが意図通りか検証

のようなことを行っています

詳しくはこの辺のソースを読んでください

auto correctできないcopはスキップするようにした

今まではrubocopの実行結果に出てきたcop全部 rubocop --auto-correct してたので割と無駄が多かったのですが、それは無駄なので実際にauto correctできるcopのみrubocop --auto-correct するようにしました。

しかし「言うは易く行うは難し」というやつで、cop名からcopのクラス名とgem名(プラグインの場合)を取り出す方法が色々と面倒くさかったです。。。(特にrubocop-rspec

https://github.com/sue445/rubocop_auto_corrector/blob/v0.1.0/lib/rubocop_auto_corrector/cop_finder.rb#L41-L54