Ruby 4.0のサポートを追加し、テスト互換性を改善
Solid Cacheが次期Ruby 4.0のサポートを追加し、同時にテストスイートの互換性を改善しました。
背景
Ruby 4.0のプレビュー版がリリースされ、OSSライブラリは次期バージョンへの対応を進める必要があります。また、Rails mainブランチとRuby 3.2の組み合わせでは互換性の問題が発生していたため、テストマトリクスの調整も必要でした。
技術的な変更
CI設定の更新
GitHub ActionsのテストマトリクスにRuby 4.0を追加し、同時に互換性のない組み合わせを除外するようにしました:
matrix:
ruby-version: ["3.2", "3.3", "3.4", "4.0"]
gemfile: [ rails_7_2, rails_8_0, rails_8_1, rails_main ]
database: [sqlite, postgres, mysql]
exclude:
- ruby-version: "3.2"
gemfile: rails_main
この変更により、Ruby 3.2とRails mainの組み合わせでのテスト実行が除外され、互換性の問題を回避しています。
Minitestバージョンの固定
Ruby 4.0では標準ライブラリのMinitest 6が使用される可能性があるため、Solid Cacheでは明示的にMinitest 5系を指定するようにしました:
gem "minitest", "~> 5.0"
spec.add_development_dependency "minitest", "< 6"
これにより、すべてのRubyバージョンで一貫したテスト環境を維持できます。
テストコードの簡素化
Railsバージョンによる条件分岐を削除し、テストコードをより保守しやすくしました:
変更前:
if Rails.version >= "7.1"
assert_equal({ context: {}, handled: false, level: :error, source: "application.active_support" }, error_subscriber.errors.first[1])
else
assert_equal({ context: {}, handled: false, level: :error, source: nil }, error_subscriber.errors.first[1])
end
変更後:
assert_equal :error, error_subscriber.errors.first[1][:level]
assert_equal false, error_subscriber.errors.first[1][:handled]
Railsバージョン間で変化する可能性のあるsourceフィールドの検証を削除し、重要なlevelとhandledフィールドのみを検証するようにしました。
設計判断
このPRでは、Ruby 4.0のような新しいバージョンへの対応と、後方互換性のバランスを取るアプローチが取られています。Minitest 5系を固定することで、Ruby 4.0でも既存のテストが安定して動作することを保証しつつ、テストマトリクスの除外設定により、サポートされない組み合わせでのCI失敗を防いでいます。