json gem を 2.20.0 に更新し allow_comments: true を有効化
この PR は、Rails がバンドルしている json gem を 2.20.0 にバンプし、コメント付き JSON のパースに必要な allow_comments: true オプションを、意図的にコメントを残す箇所へ追加しています。これにより、json 2.20.0 がデフォルトで非推奨とした JavaScript スタイルのコメントに対するデプリケーション警告が抑制され、nightly ビルドでのテスト失敗が解消されます。
背景
json 2.20.0 では、パーサがデフォルトで JavaScript コメント(// や /* */)を受け入れなくなり、代わりに allow_comments: true オプションを明示的に指定する必要があります。この変更は upstream のコミット 138b9a2c に記述されています。
Rails の一部コンポーネントは、テストや devcontainer 設定ファイルで意図的にコメント付き JSON を扱っています。具体的には、Active Support の JSON メッセージシリアライザのフォールバック実装と、Railties の devcontainer.json (JSONC 仕様) です。json 2.20.0 に更新しただけでは、これらの箇所で「Encountered comment in JSON」のデプリケーション警告が発生し、nightly ビルド #4483 のテストが失敗していました。
技術的な変更
Gemfile.lock のバンプ
json のバージョンを 2.15.2 から 2.20.0 に更新し、チェックサムも新しいものに置き換えました。
@@ -294,7 +294,7 @@ GEM
- json (2.15.2)
+ json (2.20.0)
Active Support のシリアライザ
ActiveSupport::JSON.decode 呼び出しに allow_comments: true を付与し、コメント付き JSON のデコードを許可しました。
@@ -88,7 +88,7 @@ def _load(dumped)
- ActiveSupport::JSON.decode(dumped)
+ ActiveSupport::JSON.decode(dumped, allow_comments: true)
Railties の devcontainer パーサ
JSON.parse に同様のオプションを渡すことで、devcontainer.json のコメントがパースエラーにならないようにしました。
@@ -183,7 +183,7 @@ def devcontainer_json
- @devcontainer_json ||= JSON.parse(File.read(devcontainer_json_path))
+ @devcontainer_json ||= JSON.parse(File.read(devcontainer_json_path), allow_comments: true)
テストヘルパーの修正
generators_test_helper.rb でも JSON.load にオプションを追加し、テスト実行時のパーサエラーを防止しています。
@@ -131,7 +131,7 @@ def assert_devcontainer_json_file
- yield JSON.load(content)
+ yield JSON.load(content, allow_comments: true)
これらの変更は、対象箇所のみ allow_comments: true を有効化することで、既存のコメント付き JSON の意図を保ちつつ、デフォルトの非推奨挙動による警告を排除します。
設計判断
Rails は コメント付き JSON が必要な箇所に限定してオプションを付与 する方針を取っています。代替案として、コメント自体を除去するか、設定キーを新規に追加する案も議論されましたが、後者は不要な設定肥大化を招き、前者はテストの意図や devcontainer の仕様を破壊するリスクがあります。
今回の実装は、既存のコードパスに最小限の条件分岐(allow_comments: true の付与)を加えるだけで済むため、後方互換性 を維持しつつ、デプリケーション警告の抑制という目的を達成しています。変更対象は明確で限定的であるため、他の JSON パースロジックへの影響はほとんどありません。
まとめ
json gem を 2.20.0 にバンプし、コメント付き JSON が意図的に使用されている箇所へ allow_comments: true を付与したことで、nightly ビルドのテスト失敗が解消されました。限定的なオプション付与により後方互換性を保ちつつ、アップストリームの非推奨方針に安全に適合しています。