[Rails] Ruby 4.1のstabby lambda構文変更に対応
背景
Ruby 4.1.0において、Proc#source_locationのstart_columnの挙動が変更されました。具体的には、stabby lambda(->)構文を含む完全な構文定義がソースに含まれるようになりました。この変更により、Railsのテストアサーション機能でラムダ式のソースコードを表示する際に、意図しない形式で出力される問題が発生していました。
この問題は、assert_changes、assert_no_changes、assert_differenceといったアサーションメソッドでラムダ式を使用した際に、エラーメッセージに@object.numのような読みやすい形式ではなく、#<Proc:0xXXXXXX ... (lambda)>のような冗長な形式が表示されるという形で現れていました。
技術的な変更内容
Ruby側の変更は意図的なものであるため、Rails側で対応が必要となりました。具体的には、ActiveSupport::Testing::Assertionsモジュールの_callable_to_source_stringメソッドに、stabby lambda構文を除去する処理を追加しています。
変更内容:
# Strip stabby lambda from Ruby 4.1+
source = source.sub(/^->\s*/, "")
この1行の追加により、ソース文字列の先頭から->とそれに続く空白文字を削除し、ラムダ式の本体のみを抽出できるようになりました。
影響範囲
この修正により、以下のようなテストケースが正常に動作するようになります:
修正前の出力例:
`#<Proc:0xXXXXXX /path/to/file.rb:381 (lambda)>` changed.
Expected: 0
Actual: 1
修正後の出力例:
`@object.num` changed.
Expected: 0
Actual: 1
まとめ
この変更は、Ruby 4.1.0の仕様変更に対するRails側の互換性対応です。stabby lambda構文を除去することで、テストのエラーメッセージがより読みやすく、開発者にとって有用な情報を提供できるようになりました。
関連するRuby側のissue: https://bugs.ruby-lang.org/issues/21816