summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHiroshi SHIBATA <hsbt@ruby-lang.org>2021-11-11 18:12:18 +0900
committernagachika <nagachika@ruby-lang.org>2021-11-22 10:51:35 +0900
commitbfed3296ec81c2ca53e65dc3df5b0e8f1e6810ab (patch)
tree257ff71066a4fc01afb7c07527c8d03e7098f53f
parent4716a8e157044b3a3a490c96957eb6c9204d70f1 (diff)
Bump io-wait version to 0.2.0
-rw-r--r--ext/io/wait/io-wait.gemspec8
-rw-r--r--ext/io/wait/wait.c36
-rw-r--r--test/io/wait/test_io_wait_uncommon.rb33
3 files changed, 38 insertions, 39 deletions
diff --git a/ext/io/wait/io-wait.gemspec b/ext/io/wait/io-wait.gemspec
index 1c6c2d5705..ec23699def 100644
--- a/ext/io/wait/io-wait.gemspec
+++ b/ext/io/wait/io-wait.gemspec
@@ -1,6 +1,8 @@
+_VERSION = "0.2.0"
+
Gem::Specification.new do |spec|
spec.name = "io-wait"
- spec.version = "0.1.0"
+ spec.version = _VERSION
spec.authors = ["Nobu Nakada"]
spec.email = ["nobu@ruby-lang.org"]
@@ -8,7 +10,7 @@ Gem::Specification.new do |spec|
spec.description = %q{Waits until IO is readable or writable without blocking.}
spec.homepage = "https://github.com/ruby/io-wait"
spec.licenses = ["Ruby", "BSD-2-Clause"]
- spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
+ spec.required_ruby_version = Gem::Requirement.new(">= 3.0.0")
spec.metadata["homepage_uri"] = spec.homepage
spec.metadata["source_code_uri"] = spec.homepage
@@ -20,6 +22,6 @@ Gem::Specification.new do |spec|
end
spec.extensions = %w[ext/io/wait/extconf.rb]
spec.bindir = "exe"
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
+ spec.executables = []
spec.require_paths = ["lib"]
end
diff --git a/ext/io/wait/wait.c b/ext/io/wait/wait.c
index c5de8967cd..512e4f6a80 100644
--- a/ext/io/wait/wait.c
+++ b/ext/io/wait/wait.c
@@ -211,7 +211,7 @@ wait_mode_sym(VALUE mode)
/*
* call-seq:
* io.wait(events, timeout) -> event mask or false.
- * io.wait(timeout = nil, mode = :read) -> event mask or false (deprecated)
+ * io.wait(timeout = nil, mode = :read) -> event mask or false.
*
* Waits until the IO becomes ready for the specified events and returns the
* subset of events that become ready, or +false+ when times out.
@@ -222,34 +222,32 @@ wait_mode_sym(VALUE mode)
* Returns +true+ immediately when buffered data is available.
*
* Optional parameter +mode+ is one of +:read+, +:write+, or
- * +:read_write+ (deprecated).
+ * +:read_write+.
*/
static VALUE
io_wait(int argc, VALUE *argv, VALUE io)
{
- VALUE timeout = Qnil;
+ VALUE timeout = Qundef;
rb_io_event_t events = 0;
- if (argc < 2 || (argc >= 2 && RB_SYMBOL_P(argv[1]))) {
- if (argc > 0) {
- timeout = argv[0];
- }
-
- for (int i = 1; i < argc; i += 1) {
- events |= wait_mode_sym(argv[i]);
+ if (argc != 2 || (RB_SYMBOL_P(argv[0]) || RB_SYMBOL_P(argv[1]))) {
+ for (int i = 0; i < argc; i += 1) {
+ if (RB_SYMBOL_P(argv[i])) {
+ events |= wait_mode_sym(argv[i]);
+ }
+ else if (timeout == Qundef) {
+ rb_time_interval(timeout = argv[i]);
+ }
+ else {
+ rb_raise(rb_eArgError, "timeout given more than once");
+ }
}
+ if (timeout == Qundef) timeout = Qnil;
}
- else if (argc == 2) {
+ else /* argc == 2 */ {
events = RB_NUM2UINT(argv[0]);
-
- if (argv[1] != Qnil) {
- timeout = argv[1];
- }
- }
- else {
- // TODO error
- return Qnil;
+ timeout = argv[1];
}
if (events == 0) {
diff --git a/test/io/wait/test_io_wait_uncommon.rb b/test/io/wait/test_io_wait_uncommon.rb
index 28b4a0f8c4..b6f1c29bcd 100644
--- a/test/io/wait/test_io_wait_uncommon.rb
+++ b/test/io/wait/test_io_wait_uncommon.rb
@@ -6,15 +6,10 @@ require 'io/wait'
# We may optimize IO#wait_*able for non-Linux kernels in the future
class TestIOWaitUncommon < Test::Unit::TestCase
def test_tty_wait
- begin
- tty = File.open('/dev/tty', 'w+')
- rescue Errno::ENOENT, Errno::ENXIO => e
- skip "/dev/tty: #{e.message} (#{e.class})"
+ check_dev('/dev/tty', mode: 'w+') do |tty|
+ assert_include [ nil, tty ], tty.wait_readable(0)
+ assert_equal tty, tty.wait_writable(1), 'portability test'
end
- assert_include [ nil, tty ], tty.wait_readable(0)
- assert_equal tty, tty.wait_writable(1), 'portability test'
- ensure
- tty&.close
end
def test_fifo_wait
@@ -44,36 +39,40 @@ class TestIOWaitUncommon < Test::Unit::TestCase
# used to find portability problems because some ppoll implementations
# are incomplete and do not work for certain "file" types
- def check_dev(dev, m = :wait_readable)
+ def check_dev(dev, m = :wait_readable, mode: m == :wait_readable ? 'r' : 'w', &block)
begin
- fp = File.open("/dev/#{dev}", m == :wait_readable ? 'r' : 'w')
+ fp = File.open(dev, mode)
+ rescue Errno::ENOENT
+ return # Ignore silently
rescue SystemCallError => e
skip "#{dev} could not be opened #{e.message} (#{e.class})"
end
- assert_same fp, fp.__send__(m)
+ if block
+ yield fp
+ else
+ assert_same fp, fp.__send__(m)
+ end
ensure
fp&.close
end
def test_wait_readable_urandom
- check_dev 'urandom'
+ check_dev('/dev/urandom')
end
def test_wait_readable_random
- File.open('/dev/random') do |fp|
+ check_dev('/dev/random') do |fp|
assert_nothing_raised do
fp.wait_readable(0)
end
end
- rescue SystemCallError => e
- skip "/dev/random could not be opened #{e.message} (#{e.class})"
end
def test_wait_readable_zero
- check_dev 'zero'
+ check_dev('/dev/zero')
end
def test_wait_writable_null
- check_dev 'null', :wait_writable
+ check_dev(IO::NULL, :wait_writable)
end
end