patorashのブログ

方向性はまだない

gem ransacker_translatorをRails7.0対応した

少し前ですが、Rails 7.0がリリースされましたね。弊社のプロダクトもRails 7.0系にアップグレードしていきたい…。しかし、そのためにはRailsに関連するgemのバージョンが対応していなければなりませんよね。はい、ということで、プロダクトで使っている自作gemもRails 7.0に対応していることを保証しなければなりません。やっていくぞ!

というわけで、とりあえず、ransacker_translatorをRails 7.0に対応させました。

rubygems.org

前に、随分放置していたからメンテを始めた、みたいな日記を書いてました。

patorash.hatenablog.com

これ以降も、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していたので、このやり方を採用しました。

simple_form/test_helper.rb at 0f20705fafaec3376d6030171774d1ce0509bfae · heartcombo/simple_form · GitHub

これで、ヘルパーメソッドのテストも簡単に行うことができました😀

また、コントローラー用のConcernを定義しているのですが、それのテストも追加しました。全部のメソッドのテストを書くことができたのでヨシ!👍 これもまたどうやったかの解説を後日書いておこうと思います。

まとめ

テストを追加したことで、リファクタリングすることができました。初回リリースは7年前なので、そもそも当時のRubyのバージョンが古かったので、今どきの書き方にして簡潔になりました。まぁそれだけの期間で私のRuby力も上がっておりますので、スッキリとしました。

あとやっぱりテストが速くなった気がしますし、依存gemがかなり減ったので、その分設定も減り、簡潔になりました。他の自作gemも、実はransacker_translatorから設定をコピーして作ったりしていたと思うので、今後は他のgemもリファクタリングしていこうと思います。