Ruby 4.0+ での log_regexp_timeout= 再定義警告を抑制

crmne/ruby_llm

Ruby 4.0 以降、require "ruby_llm" を実行すると log_regexp_timeout= の再定義に伴う警告が出力されます。本稿では、その警告を抑制するための実装変更と設計判断を解説します。

背景

Ruby 4.0+ では同名メソッドの再定義に対してデフォルトで警告が出力されるため、require "ruby_llm" 時に method redefined; discarding old log_regexp_timeout= が表示されていました。RubyLLM::Configurationoption メソッドは内部で attr_accessor を呼び出し、log_regexp_timeout= アクセサを自動生成します。その直後に同名のカスタム setter が手動で定義されているため、メソッドテーブルに二つの定義が重なり、Ruby 4.0+ で警告が顕在化しました。この警告は機能上の問題ではなく、利用者にとって不要なノイズとなります。

警告の抑制が求められた背景は、ライブラリ利用時の出力をクリーンに保ち、テスト結果への影響を防ぐことにあります

この課題は、既存 API の挙動を変えずに実装上の調整だけで解決できると判断されました

技術的な変更

PR #721 では remove_method を利用して自動生成されたアクセサを削除し、カスタム setter を再定義する手順が追加されました。この変更により Ruby が再定義を検知できず、警告が出力されなくなります。

@@ -81,6 +81,7 @@ def instance_variables
       super.reject { |ivar| ivar.to_s.match?(/(_id|_key|_secret|_token|_credential_provider)$/) }
     end

+    remove_method :log_regexp_timeout=
     def log_regexp_timeout=(value)
       if value && !Regexp.respond_to?(:timeout)
         RubyLLM.logger.warn("log_regexp_timeout is not supported on Ruby #{RUBY_VERSION}")

remove_method :log_regexp_timeout= が追加されたことで、option が生成した元のアクセサが明示的に除去され、続くカスタム実装が唯一の定義となります。その結果、Ruby の再定義警告ロジックはトリガーされません。

テストコードも同時に拡充され、require "ruby_llm" 時に警告が出力されないことを自動的に検証しています

describe 'method redefinition warnings' do
  it 'does not emit method redefined warning for log_regexp_timeout=' do
    warnings = `#{RbConfig.ruby} -W -e 'require "ruby_llm"' 2>&1`
    expect(warnings).not_to include('method redefined')
  end
end

変更は lib/ruby_llm/configuration.rb とテストファイルのみで完結し、他のロジックや公開 API には影響を与えません

設計判断

本修正は Ruby 標準機能である remove_method を用いた最小侵襲のアプローチですoption メソッド自体やアクセサ自動生成ロジックを改変せず、既存の設定キーや API をそのまま維持できました。

言語レベルのメソッド削除は安全に使用でき、追加の依存やラッパーコードを導入しない点が採用理由となります。これにより後方互換性が保証され、利用者への影響を最小限に抑えられました。

設計上の焦点は「警告抑制だけを実現し、既存の設定フローを変えないこと」でした。その結果、コードベースの複雑化を防ぎつつ、問題の根本を解決できました。

まとめ

PR #721 により、Ruby 4.0+ 環境で require "ruby_llm" 時に出ていた log_regexp_timeout= 再定義警告が完全に抑制されました。実装は remove_method の一行追加と回帰テストの追加だけで、ライブラリの公開 API や他の挙動には一切変更を加えていません。これにより利用者はクリーンな起動出力を得られ、同様の再定義警告が将来的に発生した場合の対策指針としても有用です。

記事メタデータ

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

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

品質レビュー結果

Review Status:
リトライ後承認
Review Count:
2回 (改善を経て承認)
Reviewed by:
gpt-oss-120b for DiffDaily

Review Criteria:

記事構成 ✓ PASS

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

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

カスタムMarkdown構文 ⚠ WARNING

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

コードブロックのファイル名付きハイライトは正しく使用されていますが、PR番号のリンクが `[PR #721](URL)` となっており、仕様の `[#721](URL)` 形式と異なります。

対象読者への適合性 ✓ PASS

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

対象はRubyエンジニアであり、専門用語中心の記述になっているため適合しています。

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

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

各セクションが総論・各論・結論の構成となっており、段落はトピックセンテンスで始まり1段落1トピック、長さも適切です。空行で区切られています。

Diff内容との照合 ✓ PASS

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

記事内のdiffブロックとspecテストコードはPRで提供されたDiffと完全に一致しており、正確に反映されています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

`remove_method`、`attr_accessor`、`setter` などの用語は正しく使用されています。

説明の技術的正確性 ✓ PASS

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

警告が発生する理由と `remove_method` で抑制する仕組みがPRの説明と一致しており、技術的に正確です。

事実の突合 ✓ PASS

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

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

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

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

PR番号 721 が正しく記載されています。数値や固有名詞の誤りはありません。

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

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

記事タイトルはPRタイトルの内容を正確に要約しています。

外部知識の正確性 ✓ PASS

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

LTSやリリース日程といった外部知識は含まれていません。

時間表現の正確性 ✓ PASS

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

時間表現の歪曲はありません。