リリースノート
https://github.com/tomykaira/rspec-parameterized/blob/master/CHANGELOG.md#v100-2022-12-31
主な変更点
rspec-parameterizedの実装を
- https://github.com/rspec-parameterized/rspec-parameterized-core(
RSpec::Parameterized::TableSyntax
以外) - https://github.com/rspec-parameterized/rspec-parameterized-table_syntax (
RSpec::Parameterized::TableSyntax
のみ)
の2つに分割しました。
普通にバージョンアップするだけで良ければ bundle update
するだけでよくて、 RSpec::Parameterized::TableSyntax
を利用していなければ Gemfile
の記述を rspec-parameterized-core
に差し替えることでnative extensionへの依存をなくすことができます。
詳しいことは https://github.com/tomykaira/rspec-parameterized/blob/master/UPGRADING.md を見てください
あとついでにRuby 2.6未満のサポートも完全に切りました。
bundle gem
した時に spec.required_ruby_version = ">= 2.6.0"
がついてきたのを消すかどうかちょっと迷ったんですが、メジャーバージョンアップする時くらいしか古いバージョンのサポートやめることができない *1 のでこの機会にRuby 2.6以上必須にしました。(Ruby 2.5のEOLは1年以上前なのでもうさすがにいいよね...)
コンテキスト
rspec-parameterizedのRuby 3.2対応を行った時に id:joker1007 から「TableSyntaxはオプショナルな機能なのでなるべく利用者にnative extensionをコンパイルさせたくない」というコメントがありました。*2
その後railsやrspecみたいにgemを分割するのはどうか?という方針に関してPR上で合意を得られました。
Ruby 3.2 リリースパーティー presented by アンドパッド - connpass でjoker1007さんに会った時に直接話して、自分が作業することに関する合意を得られたのでgemを分割するようにしました。
頑張ったこと:可能な限り全てのコミットを移行した
素朴にやるならgemの中で使ってるclassやmoduleをそのままコピペするのが一番ラクなのですが、それだと新しいリポジトリで歴史も失われてしまいます。
そのためコミットもなるべく移行しました。
別リポジトリからcherry-pickする方法は特に凝ったことはしておらず、 bundle gem
で新しいgemのスケルトンを作った後に
git remote add v0-origin git@github.com:tomykaira/rspec-parameterized.git
で一時的にremoteを追加して必要なコミットを1つずつcherry-pickしています。
以前 id:koic がrubocop-railsやrubocop-performanceで似たようなことをやってた気がするのでその時の移行スクリプトやコマンドを見つけることができればよかったのですが、見つからなかったので必要なコミットを全て手でcherry-pickしてまわりました。
幸いなことにrspec-parameterizedは200コミットくらいしかなかったので気合でなんとかしました。(もう少しスマートなやり方があればよかったんですが別リポジトリにcherry-pickした時のコンフリクトの解消が結構多くて完全に自動化するのは難しそうだった...)
頑張ってcherry-pickしたおかげで新しく作ったリポジトリでもContributorsが引き継がれています。
それでは良いお年を!
*1:この辺はメンテナの好みによるんですが、僕は「古いバージョンのサポートをやめる = BREAKING CHANGE」と考えてる派なので古いバージョンのサポートをやめる時はだいたいメジャーバージョンを上げてます
*2:https://github.com/tomykaira/rspec-parameterized/pull/81#discussion_r1050584335