IO: timeout / timeout= / wait_priority と IO::TimeoutError を追加 (Ruby 3.2)#3311
IO: timeout / timeout= / wait_priority と IO::TimeoutError を追加 (Ruby 3.2)#3311Watson1978 wants to merge 2 commits into
Conversation
いずれも Ruby 3.2 で追加されたもの。実機で確認し版分岐した。 IO#timeout 設定されている入出力タイムアウトの取得 IO#timeout= 入出力タイムアウトの設定 IO#wait_priority 優先データの読み込み待ち IO::TimeoutError タイムアウト時に発生する例外 (< IOError) トラッカーでは IO#timeout= だけが未収録扱いだったが、getter の IO#timeout も 未収録だった (timeout ライブラリの Kernel#timeout と名前が衝突して収録済みと 誤検出されていた)。getter/setter の対として両方追加した。 IO::TimeoutError は IO.md が front matter に include を持つため同居できない (multiple entities in a file with front matter relations になる)。 IO__Buffer 系の例外と同じく IO__TimeoutError.md として独立ファイルにし、 版の出し分けは front matter の since: "3.2" で行った。 IO#timeout の既定値が nil、設定すると値を返すこと、タイムアウト時に IO::TimeoutError が発生することを実機で確認した。wait_priority の引数と 返り値 (真、またはタイムアウト時 nil) も実機と rdoc で確認済み。 bitclust のデータベース生成を 3.1 / 3.2 / 3.3 / 4.0 で実行してエラーが出ないこと、 登録される項目が 0 / 4 / 4 / 4 件と 3.2 追加どおりになること、および IO#wait_readable などの参照リンクが解決することを確認済み。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
レビューありがとうございます。実機(all-ruby, Ruby 3.1.6〜4.0.6)で確認しました。
1 点、
|
wait / wait_readable / wait_writable と定義場所を揃える。実機で確認したところ この 4 つは 3.0 / 3.1 では require "io/wait" が必要で、3.2 以降は require なしで 使える。wait_priority だけ _builtin/IO.md に #@SInCE 3.2 で置くと、兄弟と 定義場所が分かれ、since バッジも揃わない。 ただし io/wait.md は版で囲まれていないため、そのままだと 1.8.7〜2.7.0 の ページにも出てしまう。require "io/wait" しても 2.7.8 では wait_priority が 未定義で 3.0.7 から存在するので、このエントリだけ #@SInCE 3.0 で囲んだ。 返り値の説明も wait_readable と同じ 3 ケース (バッファにあれば true、 ブロック後に可能になれば self、タイムアウトで nil) に揃えた。 io_wait_priority が rb_io_read_pending なら Qtrue、そうでなければ io_wait_event(io, RUBY_IO_PRIORITY, timeout, 1) を返す実装と一致する。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
レビューありがとうございます。ご相談の点、おっしゃるとおりだと思うので移動しました。
|
| 版 | bitclust lookup --method='IO#wait_priority' |
|---|---|
| 2.7.0 | no such method |
| 3.0 / 3.2 / 4.0 | library: io/wait で登録 |
io/wait.md と _builtin/IO.md 由来の全エントリについて [m:...] / [c:...] を
DB と突き合わせ、2.7.0 / 3.0 / 3.2 / 4.0 のいずれも NG 0 件でした。
参考(本 PR 対象外): nread / ready? が 4.0 で無くなっています
確認の過程で気づいた別件です。io/wait.md は nread と ready? を版で囲まずに
載せていますが、4.0.6 では require "io/wait" してもどちらも未定義でした
(3.4.10 までは require で定義されます)。
3.4.10 require後: nread=true ready?=true
4.0.6 require後: nread=false ready?=false
#@until 4.0 が要るかもしれません。本 PR の範囲外なので手は付けていません。
🤖 Generated with Claude Code
|
3.0 / 3.2 / 4.0 で statichtml をビルドし、いずれも compileerror 0、 |
概要
Ruby 4.0 に存在するのにリファレンスに項目が無い [c:IO] の入出力タイムアウト関連の
API を追加しました。いずれも Ruby 3.2 で追加されたものです。
IO#timeout— 設定されている入出力タイムアウトの取得IO#timeout=— 入出力タイムアウトの設定IO#wait_priority— 優先データの読み込み待ちIO::TimeoutError— タイムアウト時に発生する例外 (< IOError)getter も未収録でした
未収録 API の洗い出しでは
IO#timeout=だけが挙がっていましたが、getter の
IO#timeoutも未収録でした。timeout ライブラリの[m:Kernel#timeout] と名前が衝突して収録済みと誤検出されていたためです。
getter/setter の対として両方追加しています。
IO::TimeoutError は独立ファイルにしました
[c:IO] の本体ファイル (
IO.md) は front matter にinclude(Enumerable,File::Constants) を持つため、同じファイルに例外クラスを同居させると
multiple entities in a file with front matter relationsでビルドに失敗します。IO::Buffer系の例外と同じくIO__TimeoutError.mdとして独立ファイルにし、版の出し分けは front matter の
since: "3.2"で行いました。登場バージョン
記述の根拠
IO#timeoutの既定値は nil で、設定すると値を返します。タイムアウトを設定したIO に対する読み込みで [c:IO::TimeoutError] が発生することを実機で確認しました。
wait_priorityは引数 timeout を取り、読み込み可能で真、タイムアウト時に nil を返すことを実機で確認しました。
検証
rake check_blank_lines/check_indent_in_samplecode/check_single_space_indentbitclust update --markdowntree=manual/apiを 3.1 / 3.2 / 3.3 / 4.0 で実行し、エラーが出ないこと、登録される項目が 0 / 4 / 4 / 4 件と 3.2 追加どおりに
なること、および
IO#wait_readableなどの参照リンクが解決することを確認しました。🤖 Generated with Claude Code