`ActiveSupport::Configurable` 廃止警告メッセージの改善
ActiveSupport::Configurable の廃止警告が、画一的な class_attribute への移行を推奨する内容から、要件に応じた複数の代替手段を示す内容へと更新されました。
背景
#53970 で ActiveSupport::Configurable が廃止対象となった際、廃止警告には class_attribute への移行を提案するメッセージが含まれていました。しかしこの一律の提案が、実際には誤解を招くケースが報告されています。
ActiveSupport::Configurable の用途は多岐にわたります。インスタンスレベルの単純な設定値には attr_accessor で十分なケースもあれば、クラス階層をまたいだ継承が必要な場合には class_attribute が適切であり、さらに複雑な継承オプションが必要な場合は class_attribute と InheritableOptions の組み合わせが必要です。画一的な class_attribute の提案により、単純な attr_accessor で事足りるケースでも class_attribute を採用するgemが見られるようになりました。
技術的な変更
変更は activesupport/lib/active_support/configurable.rb の廃止警告メッセージ1行のみです。
変更前:
ActiveSupport.deprecator.warn <<~MSG
ActiveSupport::Configurable is deprecated without replacement, and will be removed in Rails 8.2.
You can emulate the previous behavior with `class_attribute`.
MSG
変更後:
ActiveSupport.deprecator.warn <<~MSG
ActiveSupport::Configurable is deprecated without replacement, and will be removed in Rails 8.2.
The previous behavior can be emulated with `attr_accessor`s, `class_attribute`s, or combinations of `class_attribute` and `InheritableOptions` depending on requirements.
MSG
廃止対象であること・Rails 8.2 での削除予定という情報は変わらず、変更は移行ガイダンスの文言のみです。
設計判断
移行先を1つに絞らず、要件に応じた選択肢を列挙する アプローチが採用されました。
ActiveSupport::Configurable が提供していた機能は、継承の有無やクラスレベル・インスタンスレベルのアクセスの組み合わせによって、適切な代替手段が異なります。今回のメッセージは attr_accessor、class_attribute、class_attribute と InheritableOptions の組み合わせという3つの候補を示しつつ、「要件次第で選択する」という判断をユーザーに委ねています。
この設計は、廃止警告が過度にアーキテクチャ判断を誘導することへの反省から来ています。フレームワーク側が最適解を決定するのではなく、文脈に応じた判断をユーザーに促す姿勢といえます。
まとめ
1行の文言変更ながら、廃止警告がユーザーの設計判断に与える影響を丁寧に考慮した修正です。「代替手段は1つではなく、用途によって選ぶべき」というメッセージを明示することで、警告文そのものがドキュメントとしての役割を果たすようになっています。