`on_booted`/`on_restart`/`on_stopped` の廃止をPuma v9へ延期

puma/puma

Puma v8で削除予定だった非推奨コールバック on_booted/on_restart/on_stopped の廃止をv9に延期し、警告メッセージの明確化とバージョンガードテストを追加しました。

背景

on_booted/on_restart/on_stopped の3つのコールバックはv8での削除が予定されていましたが、実際にはv8でも削除されずにリリースされてしまいました。今回のPR #3938 はこの事態を受けて、廃止予定バージョンをv9に改め、次回の削除漏れを防ぐための仕組みを導入しています。

技術的な変更

変更は lib/puma.rb の警告メッセージの修正と、test/test_events.rb へのバージョンガードテストの追加の2点です。

警告メッセージの修正として、deprecate_method_change メソッドが出力する文言が更新されました。「v8」という曖昧な表記から「Puma v9」という明示的な表記に変わり、どのソフトウェアのバージョンを指しているかが一目でわかるようになっています。

変更前:

warn "Use '#{method_new}', '#{method_caller}' is deprecated and will be removed in v8"

変更後:

warn "Use '#{method_new}', '#{method_caller}' is deprecated and will be removed in Puma v9"

バージョンガードテストの追加として、test/test_events.rbtest_deprecated_event_methods_are_removed_in_v9 が新設されました。このテストは Gem::Version を使って現在の PUMA_VERSION が9以上かどうかを検証し、v9に到達した時点でテストが失敗することで開発者に削除作業を促します。

def test_deprecated_event_methods_are_removed_in_v9
  refute_operator Gem::Version.new(Puma::Const::PUMA_VERSION), :>=, Gem::Version.new("9"),
    "Remove deprecated on_booted/on_restart/on_stopped from Puma::Events and their tests"
end

テストファイルの先頭には require 'puma/const' も追加され、PUMA_VERSION 定数への参照が正しく解決されます。

設計判断

バージョンガードテストによる「削除漏れ防止」 という手法が採用されました。

v8での削除漏れという過去の教訓を踏まえ、単にドキュメントやコメントを更新するだけでなく、CI上でバージョン到達時に自動的に失敗するテストを仕掛けることで、人的なチェックに頼らない仕組みが組み込まれています。refute_operatorGem::Version の比較を組み合わせることで、メジャーバージョンアップ時に必ずテストスイートが警告を発する設計です。

また、警告メッセージへの「Puma」という製品名の追記は、ユーザーがログ中に断片的なメッセージを見た際に文脈を失わないようにするための改善です。v8 という記述はどのライブラリのv8か判断できませんが、Puma v9 であれば出所が明確です。

まとめ

廃止時期の延期そのものは小さな変更ですが、バージョンガードテストの導入によって「次こそ削除し忘れない」という仕組みが自動化された点が本PRの本質的な価値です。非推奨機能の段階的廃止において、将来の作業をテストで強制するこのパターンは、長期メンテナンスにおける実践的な手法として参考になります。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
fb4fbb1a

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

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

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

リード文(総論)、背景・技術的変更・設計判断(各論)、まとめ(結論)という「総論→各論→結論」の構成が明確に適用されています。必須要素はすべて満たされており、理想的な記事構成です。

カスタムMarkdown構文 ✓ PASS

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

ファイル名付きシンタックスハイライト(```ruby:filepath)とGitHubのPRリンク記法([#3938](URL))が正しく使用されています。

対象読者への適合性 ✓ PASS

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

Pumaの非推奨APIの扱いと、バージョンガードテストという具体的なテスト手法について解説しており、専門知識を持つエンジニアという対象読者に完全に適合しています。

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

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

各セクションが総論→各論の構成になっており、各パラグラフもトピックセンテンスで始まるなど、パラグラフ・ライティングの原則が遵守されています。非常に読みやすい構成です。

Diff内容との照合 ✓ PASS

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

記事内で引用されている `lib/puma.rb` と `test/test_events.rb` のコードは、提供されたDiff情報と完全に一致しており、正確です。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「バージョンガードテスト」「コールバック」「非推奨」などの技術用語が、文脈に沿って正確かつ適切に使用されています。

説明の技術的正確性 ✓ PASS

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

バージョンガードテストが `refute_operator` を用いて将来のバージョンアップ時に失敗する仕組みであるという説明は、コードの動作を技術的に正しく解説しています。

事実の突合 ✓ PASS

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

記事の内容はすべてPRのTitle、Description、Diffから裏付けが取れます。廃止延期の背景、警告メッセージの変更、バージョンガードテストの導入など、すべての主張がPR情報と一致しています。

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

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

PR番号(#3938)やバージョン番号(v8, v9)などの数値・固有名詞はすべて正確に記載されています。

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

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

記事のタイトルはPR「Defer on_booted/on_restart/on_stopped removal to Puma v9」の内容を的確に反映しており、記事全体もその主題に沿っています。

外部知識の正確性 ✓ PASS

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

記事に含まれる情報はすべてPRで提供された情報に基づいており、LTSやリリース予定日といったPR外の知識の捏造はありません。

時間表現の正確性 ✓ PASS

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

「v8での削除が予定されていた」という過去の事実と、「v9に延期」という現在の決定を正確に区別して記述しており、時間表現に誤りはありません。