https://github.com/rails/jbuilder
v2.15.0で発生したリグレッションを修正するPRです。`json.partial! @post, highlighted: true` のようにActiveModelオブジェクトと追加ローカル変数を組み合わせた呼び出しで、ローカル変数がサイレントにドロップされていた問題を1行の変更(`args.one?` チェックの復元)で解消しています。
Jbuilderのインラインパーシャルでオブジェクトをレンダリングするとカスタムローカル変数が無視されるバグを修正。`_set_inline_partial`が`options[:locals]`を早期に上書きしていた問題を解消するため、ローカル変数の組み立て責務を`_render_partial_with_options`に一元化し、中間メソッド`_render_partial`も削除された。
`_map_collection` の実装を配列減算(`- [BLANK]`)から破壊的な `Array#delete` に変更し、中間オブジェクトのアロケーション数を3から1に削減。ベンチマーク上でスループット約1.14倍の向上とメモリアロケーション半減を確認。`filter_map` 案が逆に1.61倍遅いという結果も示されており、Ruby配列操作のコスト特性を再確認できる変更です。
Rack v3.1.0 で HTTP 422 のシンボルが `:unprocessable_entity` から `:unprocessable_content` に変更されたことを受け、jbuilder のスキャフォールドジェネレーターが実行時に Rack バージョンを検出して適切なシンボルを動的に選択するようになりました。actionpack への依存を追加せず、`Rack::Utils::SYMBOL_TO_STATUS_CODE.key(422)` のリバースルックアップで Rack 自身の定義を参照する方式が採用されています。
`set!` と `array!` の内部実装を最適化し、メモリ割り当て削減とスループット向上を実現。スプラットの二重発生を防ぐプライベートメソッドの導入、`BasicObject` 環境での `::Kernel.block_given?` をブロック直接参照に置き換え、誤ったセマンティクスを持つ `args.one?` ガードの削除という3点の改善を組み合わせています。
`alias_method` がアクセス修飾子を無視するRubyの仕様により、Jbuilderの `method_missing` が意図せず公開メソッドになっていた問題を修正しました。`alias_method :method_missing, :set!` の直後に `private :method_missing` を明示的に追加することで正しい可視性が保証され、`method_missing` をキーとして使う DSL 呼び出しが正しく機能するようになります。
JbuilderのCIからRuby 3.2とRails mainブランチの組み合わせを除外。Rails本体が#56511でRuby 3.2サポートを終了したことに伴う調整で、テストマトリクスの除外リストに追加されました。
JbuilderのKeyFormatterにcheck-lock-checkパターンを導入し、キャッシュヒット時のミューテックスロックを回避。format()メソッドが2.33倍高速化され、実際のjson.set!呼び出しでも1.29倍の改善を達成。