rubocop:disableの集計ツールの作成を通してRustを勉強してみた
本記事は Rakuten Rakuma Advent Calendar 2022 20日目の記事です。 Rustを勉強しながらrubocop:disableで無効化されているRuboCopの規約ごとに無効化が記述されているファイル数を集計するツール rdgrep を作成しました。(ちょっとややこしい) 背景 勤務先では下記のRuboCop configを使っているのですが、開発メンバーが入れ替わったりしてメンテされなくなり手元のソースコードにrubocop:disableが増えてきてしまってきたので今一度設定を整理する必要が出てきました。 https://github.com/Fablic/fablicop 重要ではないルールで警告が出続けると本当に守るべきルールまで軽視されてlintが無視されたり、とりあえずでrubocop:disableで無効化するようになってしまうので、不要なルールはこのconfig内でどんどん無効化してしまおうと考えています。 とはいえ効果的にルールの改善を行いたいため、差し当たってまずは設定されている規約と実際のコードの乖離がどの程度あるのかを知ろうと思い、以下のことを行ってConfigと実際のコードの差異を測ろうと考えました。 RuboCop出力を規約でグループ化して集計 rubocop:disableで無効化されている規約を集計 find . -type f -name "*.rb" -print0 | xargs -0 sed -i -e "s/rubocop:disable//g"等で無効化のコメントを消してからRubocop出力を規約でグループ化して集計すれば良いのではと思いましたが、古いプロダクトだと古いバージョンのRubyの書き方が残っていて規約違反として検出されるなどノイズが多く、人の手で恣意的に無効化している規約の一覧が欲しいのであえて分けました。 前者は既につくられている方がいましたが、後者ができるツールがなかったので自分で書くことにしました。 なぜRustで書くのか Rustは以前から流行っていて興味はあったものの、プログラマ歴が短いのでまずは今使っているRubyの造詣を深めるのに集中するのが先だと思い触れてきませんでした。しかし、 2022年はRubyGems 3.3.11でRust拡張の対応が実験的に入ったり、Rust版YJITがマージされたりだったりとRubyの周りにRustが進出してきた年だった 取り組む内容がそんなに難しい内容ではないので、数週間でどこまで新しい言語を勉強してコードを書けるかを試してみたかった ということでRubyistにも身近な存在になってきた&チャレンジしてみたいという理由でRustで書きました。 時間があまりなかったのでThe Rust Programming Language 日本語版 を途中までざっくりやって、その後は公式ドキュメントを参照しながらツール作成しました。 やったこと 集計にあたってrubocop:disableで無効化されている規約の数をそのまま測るのではなく、規約が無効化されているファイル数を計測することにしました。 理由としては範囲指定で無効化していたり、特定の行で無効化していたりと無効化の仕方が違うためです。 例えば以下のコードではStyle/NumericPredicate, Style/NumericLiterals共に無効化のコメントが書かれているのは1箇所ですが、実際にはこの規約に違反している箇所はStyle/NumericPredicateは1箇所、Style/NumericLiteralsは2箇所あります。 def a foo == 0 # rubocop:disable Style/NumericPredicate end # rubocop:disable Style/NumericLiterals def b 10000 end def c 100000 end # rubocop:enable Style/NumericLiterals ファイル数で確認する事ができればこの差異を避ける事ができると考えこの実装にしました。...