少し前ですが、Rails 7.0がリリースされましたね。弊社のプロダクトもRails 7.0系にアップグレードしていきたい…。しかし、そのためにはRailsに関連するgemのバージョンが対応していなければなりませんよね。はい、ということで、プロダクトで使っている自作gemもRails 7.0に対応していることを保証しなければなりません。やっていくぞ!
というわけで、とりあえず、ransacker_translatorをRails 7.0に対応させました。
前に、随分放置していたからメンテを始めた、みたいな日記を書いてました。
これ以降も、Ruby 3.0で動くことはCIで検証していたりしましたが、如何せん適当な対応でした。今回は、しっかり対応できたと思います。まぁ新機能とかはないんですけど。
課題だったこと
色々と課題がありました。
- gem
rails
に依存していたこと - CIにCircleCIを使っていたこと
- テストが不十分だったこと
- rspecを使っていたこと
取り組んだこと
依存gemを精査した
railsに依存しているっていうのはあまりに範囲が広すぎるので、依存gemを精査しました。
また、バージョン指定が雑だったので、< 7.1.0
, >= 5.0.0
というふうに明確にしました。
CircleCIからGitHub Actionsに移行した
CircleCIでもよかったのですが、GitHub Actionsを使う機会がなかったので試しにやってみたところ、めちゃくちゃ簡単だったのでGitHub Actionsに移行しました。GitHub Actionsを導入するためのyamlファイルが準備されているので、後はそれをカスタマイズするだけでした。
すごくいいなと思ったのが、matrixで、いろんな組み合わせでテストができることですね。CircleCIでもできるんですけど、それより簡潔に感じました。 これを使い、Ruby 2.6~3.1までと、Rails 5.0, 5.1, 5,2, 6.0, 6.1, 7.0でテストをするようにしました。
masterブランチでテストが通ったらgemをリリースする設定にしました。これはまた後日、別の記事にでもしようかと思います。
RSpecからMiniTestに移行した
gemのテストをするんだったら、Ruby標準のMiniTestを使うほうがいいかなと常々思っていました。また、gemで作ったヘルパーメソッドのテストの仕方がイマイチわからなかったので、ActionView::TestCase
を使えるMiniTestのほうがやりやすいのでは?と考えたりもしていました。他のgemがMiniTestを使ってどうやってテストしているかを調べました。参考にしたのはよく使っているgem simple_form
です。
test_helper.rbを読んでいたら、ActionView::TestCase
をオープンして該当ヘルパーをincludeしていたので、このやり方を採用しました。
これで、ヘルパーメソッドのテストも簡単に行うことができました😀
また、コントローラー用のConcernを定義しているのですが、それのテストも追加しました。全部のメソッドのテストを書くことができたのでヨシ!👍 これもまたどうやったかの解説を後日書いておこうと思います。
まとめ
テストを追加したことで、リファクタリングすることができました。初回リリースは7年前なので、そもそも当時のRubyのバージョンが古かったので、今どきの書き方にして簡潔になりました。まぁそれだけの期間で私のRuby力も上がっておりますので、スッキリとしました。
あとやっぱりテストが速くなった気がしますし、依存gemがかなり減ったので、その分設定も減り、簡潔になりました。他の自作gemも、実はransacker_translatorから設定をコピーして作ったりしていたと思うので、今後は他のgemもリファクタリングしていこうと思います。