Empty filter case of ParameterFilter#filter returns a duplicate

rails/rails

ActiveSupport::ParameterFilter の #filter がフィルターなしで呼び出されたとき、元のパラメータハッシュと等価だが同一オブジェクトではない dup を返すことを保証するテストが追加されました。

背景

このテストは ActiveSupport::ParameterFilter#filter が空フィルターの場合に速いパスで params.dup を返す実装を持つことは既にコード上にあるものの、実際の挙動を検証するテストが欠如していた点を補完します。従来は filter_param に対してのみ空フィルター時の動作がテストされており、#filter の同様のケースは未確認でした。

そのため、将来的なリファクタリングで速いパスが削除されたり動作が変わったりするリスクを低減する目的で、明示的なテストが導入されました。

技術的な変更

activesupport/test/parameter_filter_test.rb に以下のテストが新規追加されました。

  test "filter with empty filters returns a dup of the params" do
    parameter_filter = ActiveSupport::ParameterFilter.new
    original = { "foo" => "bar" }
    filtered = parameter_filter.filter(original)

    assert_equal original, filtered
    assert_not_same original, filtered
  end

テストは フィルターが無い ActiveSupport::ParameterFilter.new を生成し、単純なハッシュ { "foo" => "bar" }filter に渡します。その結果が内容的に同一(assert_equal)であることと、オブジェクトとしては別物(assert_not_same)であることを確認します。実装側では filter@no_filters ? params.dup : call(params) という条件式で速いパスを選択しており、この挙動がテストで裏付けられます。

この変更は本番コードに影響を与えず、テストスイートの網羅性を高めるだけです。

設計判断

#filter が dup を返す ことをテストで明文化することで、API が「引数を変更しない」ことを保証する設計方針が強化されます。将来的に内部実装が変わり、直接ハッシュを返すようになるとこのテストが失敗し、非意図的なミュータブル動作の導入を防止します。

このアプローチは、実装上の最適化(速いパス)と外部からの不変性保証という二つの観点を同時に満たす設計判断と言えるでしょう。

まとめ

テストのみの追加ですが、ActiveSupport::ParameterFilter#filter が空フィルター時に 新しいオブジェクト を返すことを明確に検証します。これにより、パラメータの不変性という重要な契約が保証され、将来の実装変更に対して安全性が向上します。

記事メタデータ

Generated by:
gpt-oss-120b for DiffDaily
LLM Trace:
41034932

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
gpt-oss-120b for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文、背景、技術的な変更、設計判断(任意)、まとめの5セクションが揃っており、総論→各論→結論の流れが明確です。

カスタムMarkdown構文 ✓ PASS

シンタックスハイライト・GitHubリンク記法の正確性

ファイル名付きシンタックスハイライトは正しい形式 ```ruby:activesupport/test/parameter_filter_test.rb``` で記述されています。GitHubリンクも #57556 を含む正しいリンク形式です。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

Rails の内部実装に関する記述で、専門エンジニア向けの深さが保たれており、初心者向けの過剰説明はありません。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションは総論パラグラフ、具体的事実・コード、結論パラグラフで構成され、段落はトピックセンテンスで始まり、1段落1トピック・6文以内に収まっています。空行で区切りも適切です。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事中のコードブロックはDiffに示された追加コードと完全に一致しており、ファイル名もDiffの対象ファイルと合致しています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

ActiveSupport::ParameterFilter、dup、assert_not_same などの用語はPRおよびRailsの文脈と一致しており、誤用はありません。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

空フィルター時に速いパスで params.dup が返ること、テストがその等価性とオブジェクト非同一性を検証することを正確に説明しています。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

全ての主張はPRのタイトル・説明・Diffで裏付けられており、推測や捏造はありません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号 #57556、コード中のハッシュリテラル { "foo" => "bar" } など、数値・固有名詞は正確です。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事タイトルはPRタイトルの内容を的確に要約しており、意味的に一致しています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

Rails のバージョン情報やリリーススケジュール等、PRに記載されていない外部知識は一切含まれていません。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

時間表現は使用されておらず、PRの記述と食い違う表現もありません。