nio4r 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f8caeb8b7d6d5b461cb97472c6c7a540808ad8e5
4
- data.tar.gz: 669ff217c7261624c5ba626723701397bfa785b2
3
+ metadata.gz: 47612304fa6cd2c81ad14e7bdb8af184ae90aea7
4
+ data.tar.gz: 81e44434ea267b78ffd498726fa27752a348ec99
5
5
  SHA512:
6
- metadata.gz: b23efa474808fcf2ed6432537547e4e10cc23b7e0b7f3f8bbc2eff1d39b4da33fc10e1b2bff2ed19e056c9feb82230a4f5179f71b537ac3e5371a92461a1b1f7
7
- data.tar.gz: df78f33b747ff374ded33c42fb705db55d11dbea978430baf89fca72912964e672447773ce6830c6a35e98960a823000e8a67b45f0c18c8800798c34a8efeb63
6
+ metadata.gz: 46832a57b9355a7ae7a52bb00fa8f6b545c4e0f40d1d9eaa5752628a7d6dccd06e577e57b41eaa2a7119474c64c51974aaa5503b24bf694a96a597eb20bbb2d8
7
+ data.tar.gz: 0acbe1b4cb4bee3fb3125f0ac5104c7e5221c8c8cae5c6d766d87c5675859efa788f04ff0ac027be19de06da4c7c45d0a671a050b3d60c96b7f41ab4136eee90
data/.rspec CHANGED
@@ -1,4 +1,5 @@
1
1
  --color
2
2
  --format documentation
3
3
  --backtrace
4
- --default_path spec
4
+ --order random
5
+ --warnings
data/.travis.yml CHANGED
@@ -1,17 +1,17 @@
1
1
  rvm:
2
2
  - 1.9.3
3
3
  - 2.0.0
4
- - 2.1.0
4
+ - 2.1.1
5
5
  - ruby-head
6
6
  - jruby
7
7
  - jruby-head
8
- - rbx
8
+ - rbx-2
9
9
 
10
10
  matrix:
11
11
  allow_failures:
12
12
  - rvm: ruby-head
13
13
  - rvm: jruby-head
14
- - rvm: rbx
14
+ - rvm: rbx-2
15
15
 
16
16
  notifications:
17
17
  irc: "irc.freenode.org#celluloid"
data/CHANGES.md CHANGED
@@ -1,3 +1,12 @@
1
+ 1.0.1 (2014-09-01)
2
+ ------------------
3
+ * Fix C compiler warnings
4
+ * Eliminate Ruby warnings about @lock_holder
5
+ * Windows improvements
6
+ * Better support for Ruby 2.1
7
+ * Automatically require 'set'
8
+ * Update to RSpec 3
9
+
1
10
  1.0.0 (2014-01-14)
2
11
  ------------------
3
12
  * Have Selector#register obtain the actual IO from a Monitor object
data/README.md CHANGED
@@ -137,13 +137,19 @@ if you aren't concerned with thread safety, or you're within a #select
137
137
  block:
138
138
 
139
139
  - ***#interests***: what this monitor is interested in (:r, :w, or :rw)
140
- - ***#readiness***: what the monitored IO object is ready for according to the last select operation
140
+ - ***#readiness***: what I/O operations the monitored object is ready for
141
141
  - ***#readable?***: was the IO readable last time it was selected?
142
142
  - ***#writable?***: was the IO writable last time it was selected?
143
143
 
144
144
  Monitors also support a ***#value*** and ***#value=*** method for storing a
145
145
  handle to an arbitrary object of your choice (e.g. a proc)
146
146
 
147
+ ### Flow Control
148
+
149
+ For information on how to compose nio4r selectors inside of event loops,
150
+ please read the [Flow Control Guide on the
151
+ Wiki](https://github.com/celluloid/nio4r/wiki/Basic-Flow-Control)
152
+
147
153
  Concurrency
148
154
  -----------
149
155
 
data/ext/libev/ev.c CHANGED
@@ -3242,7 +3242,7 @@ time_update (EV_P_ ev_tstamp max_block)
3242
3242
  }
3243
3243
 
3244
3244
  /* ########## NIO4R PATCHERY HO! ########## */
3245
- #if defined(HAVE_RB_THREAD_BLOCKING_REGION)
3245
+ #if defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)
3246
3246
  struct ev_poll_args {
3247
3247
  struct ev_loop *loop;
3248
3248
  ev_tstamp waittime;
@@ -3262,7 +3262,7 @@ int
3262
3262
  ev_run (EV_P_ int flags)
3263
3263
  {
3264
3264
  /* ########## NIO4R PATCHERY HO! ########## */
3265
- #if defined(HAVE_RB_THREAD_BLOCKING_REGION)
3265
+ #if defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)
3266
3266
  struct ev_poll_args poll_args;
3267
3267
  #endif
3268
3268
  /* ######################################## */
@@ -3425,10 +3425,24 @@ rb_thread_unsafe_dangerous_crazy_blocking_region_end(...);
3425
3425
  #######################################################################
3426
3426
  */
3427
3427
 
3428
- #if defined(HAVE_RB_THREAD_BLOCKING_REGION)
3428
+ /*
3429
+ simulate to rb_thread_call_without_gvl using rb_theread_blocking_region.
3430
+ https://github.com/brianmario/mysql2/blob/master/ext/mysql2/client.h#L8
3431
+ */
3432
+
3433
+ #ifndef HAVE_RB_THREAD_CALL_WITHOUT_GVL
3434
+ #ifdef HAVE_RB_THREAD_BLOCKING_REGION
3435
+
3436
+ #define rb_thread_call_without_gvl(func, data1, ubf, data2) \
3437
+ rb_thread_blocking_region((rb_blocking_function_t *)func, data1, ubf, data2)
3438
+
3439
+ #endif
3440
+ #endif
3441
+
3442
+ #if defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)
3429
3443
  poll_args.loop = loop;
3430
3444
  poll_args.waittime = waittime;
3431
- rb_thread_blocking_region(ev_backend_poll, (void *)&poll_args, RUBY_UBF_IO, 0);
3445
+ rb_thread_call_without_gvl(ev_backend_poll, (void *)&poll_args, RUBY_UBF_IO, 0);
3432
3446
  #else
3433
3447
  backend_poll (EV_A_ waittime);
3434
3448
  #endif
data/ext/nio4r/extconf.rb CHANGED
@@ -4,6 +4,10 @@ if have_func('rb_thread_blocking_region')
4
4
  $defs << '-DHAVE_RB_THREAD_BLOCKING_REGION'
5
5
  end
6
6
 
7
+ if have_func('rb_thread_call_without_gvl')
8
+ $defs << '-DHAVE_RB_THEREAD_CALL_WITHOUT_GVL'
9
+ end
10
+
7
11
  if have_header('sys/select.h')
8
12
  $defs << '-DEV_USE_SELECT'
9
13
  end
@@ -28,6 +32,10 @@ if have_header('sys/resource.h')
28
32
  $defs << '-DHAVE_SYS_RESOURCE_H'
29
33
  end
30
34
 
35
+ if RUBY_VERSION.to_f < 1.9
36
+ $defs << '-DHAVE_RUBYSIG_H'
37
+ end
38
+
31
39
  dir_config 'nio4r_ext'
32
40
  create_makefile 'nio4r_ext'
33
41
 
@@ -41,4 +49,4 @@ if RUBY_PLATFORM =~ /mingw|win32/
41
49
 
42
50
  makefile_contents.gsub! 'LIBS = $(LIBRUBYARG_SHARED)', 'LIBS = -lws2_32 $(LIBRUBYARG_SHARED)'
43
51
  File.open('Makefile', 'w') { |f| f.write makefile_contents }
44
- end
52
+ end
data/ext/nio4r/monitor.c CHANGED
@@ -26,9 +26,6 @@ static VALUE NIO_Monitor_value(VALUE self);
26
26
  static VALUE NIO_Monitor_set_value(VALUE self, VALUE obj);
27
27
  static VALUE NIO_Monitor_readiness(VALUE self);
28
28
 
29
- /* Internal functions */
30
- static void NIO_Monitor_callback(struct ev_loop *ev_loop, struct ev_io *io, int revents);
31
-
32
29
  #if HAVE_RB_IO_T
33
30
  rb_io_t *fptr;
34
31
  #else
@@ -214,4 +211,4 @@ static VALUE NIO_Monitor_is_writable(VALUE self)
214
211
  } else {
215
212
  return Qfalse;
216
213
  }
217
- }
214
+ }
data/ext/nio4r/nio4r.h CHANGED
@@ -7,7 +7,11 @@
7
7
  #define NIO4R_H
8
8
 
9
9
  #include "ruby.h"
10
- #include "rubyio.h"
10
+ #if HAVE_RUBY_IO_H
11
+ # include "ruby/io.h"
12
+ #else
13
+ # include "rubyio.h"
14
+ #endif
11
15
  #include "libev.h"
12
16
 
13
17
  struct NIO_Selector
data/ext/nio4r/selector.c CHANGED
@@ -4,7 +4,9 @@
4
4
  */
5
5
 
6
6
  #include "nio4r.h"
7
- #include "rubysig.h"
7
+ #ifdef HAVE_RUBYSIG_H
8
+ # include "rubysig.h"
9
+ #endif
8
10
  #include <unistd.h>
9
11
  #include <fcntl.h>
10
12
  #include <assert.h>
@@ -36,8 +38,8 @@ static VALUE NIO_Selector_unlock(VALUE lock);
36
38
  static VALUE NIO_Selector_register_synchronized(VALUE *args);
37
39
  static VALUE NIO_Selector_deregister_synchronized(VALUE *args);
38
40
  static VALUE NIO_Selector_select_synchronized(VALUE *args);
39
- static VALUE NIO_Selector_close_synchronized(VALUE self);
40
- static VALUE NIO_Selector_closed_synchronized(VALUE self);
41
+ static VALUE NIO_Selector_close_synchronized(VALUE *args);
42
+ static VALUE NIO_Selector_closed_synchronized(VALUE *args);
41
43
 
42
44
  static int NIO_Selector_run(struct NIO_Selector *selector, VALUE timeout);
43
45
  static void NIO_Selector_timeout_callback(struct ev_loop *ev_loop, struct ev_timer *timer, int revents);
@@ -146,9 +148,11 @@ static VALUE NIO_Selector_initialize(VALUE self)
146
148
  VALUE lock;
147
149
 
148
150
  rb_ivar_set(self, rb_intern("selectables"), rb_hash_new());
151
+ rb_ivar_set(self, rb_intern("lock_holder"), Qnil);
149
152
 
150
153
  lock = rb_class_new_instance(0, 0, rb_const_get(rb_cObject, rb_intern("Mutex")));
151
154
  rb_ivar_set(self, rb_intern("lock"), lock);
155
+ rb_ivar_set(self, rb_intern("lock_holder"), Qnil);
152
156
 
153
157
  return Qnil;
154
158
  }
@@ -161,10 +165,10 @@ static VALUE NIO_Selector_synchronize(VALUE self, VALUE (*func)(VALUE *args), VA
161
165
  current_thread = rb_thread_current();
162
166
  lock_holder = rb_ivar_get(self, rb_intern("lock_holder"));
163
167
 
164
- if(lock_holder != rb_thread_current()) {
168
+ if(lock_holder != current_thread) {
165
169
  lock = rb_ivar_get(self, rb_intern("lock"));
166
170
  rb_funcall(lock, rb_intern("lock"), 0, 0);
167
- rb_ivar_set(self, rb_intern("lock_holder"), rb_thread_current());
171
+ rb_ivar_set(self, rb_intern("lock_holder"), current_thread);
168
172
 
169
173
  /* We've acquired the lock, so ensure we unlock it */
170
174
  return rb_ensure(func, (VALUE)args, NIO_Selector_unlock, self);
@@ -237,8 +241,7 @@ static VALUE NIO_Selector_deregister(VALUE self, VALUE io)
237
241
  /* Internal implementation of register after acquiring mutex */
238
242
  static VALUE NIO_Selector_deregister_synchronized(VALUE *args)
239
243
  {
240
- VALUE self, io, interests, selectables, monitor;
241
- VALUE monitor_args[3];
244
+ VALUE self, io, selectables, monitor;
242
245
 
243
246
  self = args[0];
244
247
  io = args[1];
@@ -265,7 +268,7 @@ static VALUE NIO_Selector_is_registered(VALUE self, VALUE io)
265
268
  /* Select from all registered IO objects */
266
269
  static VALUE NIO_Selector_select(int argc, VALUE *argv, VALUE self)
267
270
  {
268
- VALUE timeout, array;
271
+ VALUE timeout;
269
272
  VALUE args[2];
270
273
 
271
274
  rb_scan_args(argc, argv, "01", &timeout);
@@ -283,7 +286,7 @@ static VALUE NIO_Selector_select(int argc, VALUE *argv, VALUE self)
283
286
  /* Internal implementation of select with the selector lock held */
284
287
  static VALUE NIO_Selector_select_synchronized(VALUE *args)
285
288
  {
286
- int i, ready;
289
+ int ready;
287
290
  VALUE ready_array;
288
291
  struct NIO_Selector *selector;
289
292
 
@@ -312,7 +315,7 @@ static int NIO_Selector_run(struct NIO_Selector *selector, VALUE timeout)
312
315
  int result;
313
316
  selector->selecting = 1;
314
317
 
315
- #if defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_ALONE)
318
+ #if defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL) || defined(HAVE_RB_THREAD_ALONE)
316
319
  /* Implement the optional timeout (if any) as a ev_timer */
317
320
  if(timeout != Qnil) {
318
321
  /* It seems libev is not a fan of timers being zero, so fudge a little */
@@ -326,7 +329,7 @@ static int NIO_Selector_run(struct NIO_Selector *selector, VALUE timeout)
326
329
  ev_tstamp started_at = ev_now(selector->ev_loop);
327
330
  #endif
328
331
 
329
- #if defined(HAVE_RB_THREAD_BLOCKING_REGION)
332
+ #if defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)
330
333
  /* libev is patched to release the GIL when it makes its system call */
331
334
  ev_loop(selector->ev_loop, EVLOOP_ONESHOT);
332
335
  #elif defined(HAVE_RB_THREAD_ALONE)
@@ -337,7 +340,7 @@ static int NIO_Selector_run(struct NIO_Selector *selector, VALUE timeout)
337
340
  if(0) {
338
341
  #endif /* defined(HAVE_RB_THREAD_BLOCKING_REGION) */
339
342
 
340
- #if !defined(HAVE_RB_THREAD_BLOCKING_REGION)
343
+ #if !defined(HAVE_RB_THREAD_BLOCKING_REGION) && !defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)
341
344
  TRAP_BEG;
342
345
  ev_loop(selector->ev_loop, EVLOOP_ONESHOT);
343
346
  TRAP_END;
@@ -388,12 +391,14 @@ static VALUE NIO_Selector_wakeup(VALUE self)
388
391
  /* Close the selector and free system resources */
389
392
  static VALUE NIO_Selector_close(VALUE self)
390
393
  {
391
- return NIO_Selector_synchronize(self, NIO_Selector_close_synchronized, self);
394
+ VALUE args[1] = {self};
395
+ return NIO_Selector_synchronize(self, NIO_Selector_close_synchronized, args);
392
396
  }
393
397
 
394
- static VALUE NIO_Selector_close_synchronized(VALUE self)
398
+ static VALUE NIO_Selector_close_synchronized(VALUE *args)
395
399
  {
396
400
  struct NIO_Selector *selector;
401
+ VALUE self = args[0];
397
402
  Data_Get_Struct(self, struct NIO_Selector, selector);
398
403
 
399
404
  NIO_Selector_shutdown(selector);
@@ -404,11 +409,14 @@ static VALUE NIO_Selector_close_synchronized(VALUE self)
404
409
  /* Is the selector closed? */
405
410
  static VALUE NIO_Selector_closed(VALUE self)
406
411
  {
407
- return NIO_Selector_synchronize(self, NIO_Selector_closed_synchronized, self);
412
+ VALUE args[1] = {self};
413
+ return NIO_Selector_synchronize(self, NIO_Selector_closed_synchronized, args);
408
414
  }
409
415
 
410
- static VALUE NIO_Selector_closed_synchronized(VALUE self)
411
- { struct NIO_Selector *selector;
416
+ static VALUE NIO_Selector_closed_synchronized(VALUE *args)
417
+ {
418
+ struct NIO_Selector *selector;
419
+ VALUE self = args[0];
412
420
  Data_Get_Struct(self, struct NIO_Selector, selector);
413
421
 
414
422
  return selector->closed ? Qtrue : Qfalse;
data/lib/nio.rb CHANGED
@@ -11,7 +11,7 @@ module NIO
11
11
  def self.engine; ENGINE end
12
12
  end
13
13
 
14
- if ENV["NIO4R_PURE"] || (ENV["OS"] =~ /Windows/i && !defined?(JRUBY_VERSION))
14
+ if ENV["NIO4R_PURE"] || (Gem.win_platform? && !defined?(JRUBY_VERSION))
15
15
  require 'nio/monitor'
16
16
  require 'nio/selector'
17
17
  NIO::ENGINE = 'select'
data/lib/nio/selector.rb CHANGED
@@ -1,3 +1,5 @@
1
+ require 'set'
2
+
1
3
  module NIO
2
4
  # Selectors monitor IO objects for events of interest
3
5
  class Selector
data/lib/nio/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module NIO
2
- VERSION = "1.0.0"
2
+ VERSION = "1.0.1"
3
3
  end
data/nio4r.gemspec CHANGED
@@ -7,6 +7,7 @@ Gem::Specification.new do |gem|
7
7
  gem.description = "New IO for Ruby"
8
8
  gem.summary = "NIO provides a high performance selector API for monitoring IO objects"
9
9
  gem.homepage = "https://github.com/celluloid/nio4r"
10
+ gem.license = "MIT"
10
11
 
11
12
  gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
12
13
  gem.files = `git ls-files`.split("\n")
@@ -24,5 +25,5 @@ Gem::Specification.new do |gem|
24
25
 
25
26
  gem.add_development_dependency "rake-compiler"
26
27
  gem.add_development_dependency "rake"
27
- gem.add_development_dependency "rspec"
28
+ gem.add_development_dependency "rspec", "~> 3.0.0"
28
29
  end
@@ -9,8 +9,8 @@ describe "NIO acceptables" do
9
9
  ready_monitor = selector.register(acceptable_subject, :r)
10
10
 
11
11
  ready_monitors = selector.select
12
- ready_monitors.should include ready_monitor
13
- ready_monitors.should_not include waiting_monitor
12
+ expect(ready_monitors).to include ready_monitor
13
+ expect(ready_monitors).not_to include waiting_monitor
14
14
  end
15
15
  end
16
16
 
@@ -11,21 +11,21 @@ describe NIO::Monitor do
11
11
  after { selector.close }
12
12
 
13
13
  it "knows its interests" do
14
- subject.interests.should == :r
15
- peer.interests.should == :rw
14
+ expect(subject.interests).to eq(:r)
15
+ expect(peer.interests).to eq(:rw)
16
16
  end
17
17
 
18
18
  it "knows its IO object" do
19
- subject.io.should == reader
19
+ expect(subject.io).to eq(reader)
20
20
  end
21
21
 
22
22
  it "knows its selector" do
23
- subject.selector.should == selector
23
+ expect(subject.selector).to eq(selector)
24
24
  end
25
25
 
26
26
  it "stores arbitrary values" do
27
27
  subject.value = 42
28
- subject.value.should == 42
28
+ expect(subject.value).to eq(42)
29
29
  end
30
30
 
31
31
  it "knows what operations IO objects are ready for" do
@@ -33,29 +33,29 @@ describe NIO::Monitor do
33
33
  reader_monitor, writer_monitor = subject, peer
34
34
 
35
35
  selected = selector.select(0)
36
- selected.should_not include(reader_monitor)
37
- selected.should include(writer_monitor)
36
+ expect(selected).not_to include(reader_monitor)
37
+ expect(selected).to include(writer_monitor)
38
38
 
39
- writer_monitor.readiness.should == :w
40
- writer_monitor.should_not be_readable
41
- writer_monitor.should be_writable
39
+ expect(writer_monitor.readiness).to eq(:w)
40
+ expect(writer_monitor).not_to be_readable
41
+ expect(writer_monitor).to be_writable
42
42
 
43
43
  writer << "loldata"
44
44
 
45
45
  selected = selector.select(0)
46
- selected.should include(reader_monitor)
46
+ expect(selected).to include(reader_monitor)
47
47
 
48
- reader_monitor.readiness.should == :r
49
- reader_monitor.should be_readable
50
- reader_monitor.should_not be_writable
48
+ expect(reader_monitor.readiness).to eq(:r)
49
+ expect(reader_monitor).to be_readable
50
+ expect(reader_monitor).not_to be_writable
51
51
  end
52
52
 
53
53
  it "closes" do
54
- subject.should_not be_closed
55
- selector.registered?(reader).should be_true
54
+ expect(subject).not_to be_closed
55
+ expect(selector.registered?(reader)).to be_truthy
56
56
 
57
57
  subject.close
58
- subject.should be_closed
59
- selector.registered?(reader).should be_false
58
+ expect(subject).to be_closed
59
+ expect(selector.registered?(reader)).to be_falsey
60
60
  end
61
61
  end
@@ -111,7 +111,7 @@ describe OpenSSL::SSL::SSLSocket, :if => RUBY_VERSION >= "1.9.0" do
111
111
  begin
112
112
  _, writers = select [], [ssl_client], [], 0
113
113
  count = ssl_client.write_nonblock "X" * 1024
114
- count.should_not == 0
114
+ expect(count).not_to eq(0)
115
115
  rescue IO::WaitReadable, IO::WaitWritable
116
116
  pending "SSL will report writable but not accept writes"
117
117
  raise if(writers.include? ssl_client)
@@ -80,9 +80,9 @@ describe TCPSocket do
80
80
  client.connect_nonblock Socket.sockaddr_in(tcp_port, '127.0.0.1')
81
81
  end.to raise_exception Errno::EINPROGRESS
82
82
 
83
- selector.select(0).should include monitor
83
+ expect(selector.select(0)).to include monitor
84
84
  result = client.getsockopt(::Socket::SOL_SOCKET, ::Socket::SO_ERROR)
85
- result.unpack('i').first.should be_zero
85
+ expect(result.unpack('i').first).to be_zero
86
86
  end
87
87
  end
88
88
  end
@@ -13,7 +13,7 @@ describe NIO::Selector do
13
13
  context "register" do
14
14
  it "registers IO objects" do
15
15
  monitor = subject.register(reader, :r)
16
- monitor.should_not be_closed
16
+ expect(monitor).not_to be_closed
17
17
  end
18
18
 
19
19
  it "raises TypeError if asked to register non-IO objects" do
@@ -28,24 +28,24 @@ describe NIO::Selector do
28
28
 
29
29
  it "knows which IO objects are registered" do
30
30
  subject.register(reader, :r)
31
- subject.should be_registered(reader)
32
- subject.should_not be_registered(writer)
31
+ expect(subject).to be_registered(reader)
32
+ expect(subject).not_to be_registered(writer)
33
33
  end
34
34
 
35
35
  it "deregisters IO objects" do
36
36
  subject.register(reader, :r)
37
37
 
38
38
  monitor = subject.deregister(reader)
39
- subject.should_not be_registered(reader)
40
- monitor.should be_closed
39
+ expect(subject).not_to be_registered(reader)
40
+ expect(monitor).to be_closed
41
41
  end
42
42
 
43
43
  it "reports if it is empty" do
44
- subject.should be_empty
44
+ expect(subject).to be_empty
45
45
 
46
46
  monitor = subject.register(reader, :r)
47
47
 
48
- subject.should_not be_empty
48
+ expect(subject).not_to be_empty
49
49
  end
50
50
 
51
51
  # This spec might seem a bit silly, but this actually something the
@@ -54,14 +54,14 @@ describe NIO::Selector do
54
54
  monitor = subject.register(reader, :r)
55
55
  writer << "ohai"
56
56
 
57
- subject.select.should include monitor
58
- reader.read(4).should == "ohai"
57
+ expect(subject.select).to include monitor
58
+ expect(reader.read(4)).to eq("ohai")
59
59
  subject.deregister(reader)
60
60
 
61
61
  new_monitor = subject.register(reader, :r)
62
62
  writer << "thar"
63
- subject.select.should include new_monitor
64
- reader.read(4).should == "thar"
63
+ expect(subject.select).to include new_monitor
64
+ expect(reader.read(4)).to eq("thar")
65
65
  end
66
66
 
67
67
  context "timeouts" do
@@ -73,13 +73,13 @@ describe NIO::Selector do
73
73
 
74
74
  timeout = 0.5
75
75
  started_at = Time.now
76
- subject.select(timeout).should include monitor
77
- (Time.now - started_at).should be_within(TIMEOUT_PRECISION).of(0)
76
+ expect(subject.select(timeout)).to include monitor
77
+ expect(Time.now - started_at).to be_within(TIMEOUT_PRECISION).of(0)
78
78
  reader.read_nonblock(payload.size)
79
79
 
80
80
  started_at = Time.now
81
- subject.select(timeout).should be_nil
82
- (Time.now - started_at).should be_within(TIMEOUT_PRECISION).of(timeout)
81
+ expect(subject.select(timeout)).to be_nil
82
+ expect(Time.now - started_at).to be_within(TIMEOUT_PRECISION).of(timeout)
83
83
  end
84
84
 
85
85
  it "raises ArgumentError if given a negative timeout" do
@@ -95,7 +95,7 @@ describe NIO::Selector do
95
95
 
96
96
  thread = Thread.new do
97
97
  started_at = Time.now
98
- subject.select.should be_nil
98
+ expect(subject.select).to be_nil
99
99
  Time.now - started_at
100
100
  end
101
101
 
@@ -103,12 +103,12 @@ describe NIO::Selector do
103
103
  sleep timeout
104
104
  subject.wakeup
105
105
 
106
- thread.value.should be_within(TIMEOUT_PRECISION).of(timeout)
106
+ expect(thread.value).to be_within(TIMEOUT_PRECISION).of(timeout)
107
107
  end
108
108
 
109
109
  it "raises IOError if asked to wake up a closed selector" do
110
110
  subject.close
111
- subject.should be_closed
111
+ expect(subject).to be_closed
112
112
 
113
113
  expect { subject.wakeup }.to raise_exception IOError
114
114
  end
@@ -123,21 +123,21 @@ describe NIO::Selector do
123
123
  unready_monitor = subject.register(unready, :r)
124
124
 
125
125
  selected = subject.select(0)
126
- selected.size.should == 1
127
- selected.should include reader_monitor
128
- selected.should_not include unready_monitor
126
+ expect(selected.size).to eq(1)
127
+ expect(selected).to include reader_monitor
128
+ expect(selected).not_to include unready_monitor
129
129
  end
130
130
 
131
131
  it "selects closed IO objects" do
132
132
  monitor = subject.register(reader, :r)
133
- subject.select(0).should be_nil
133
+ expect(subject.select(0)).to be_nil
134
134
 
135
135
  thread = Thread.new { subject.select }
136
136
  Thread.pass while thread.status && thread.status != "sleep"
137
137
 
138
138
  writer.close
139
139
  selected = thread.value
140
- selected.should include monitor
140
+ expect(selected).to include monitor
141
141
  end
142
142
 
143
143
  it "iterates across selected objects with a block" do
@@ -155,16 +155,16 @@ describe NIO::Selector do
155
155
 
156
156
  readables = []
157
157
  result = subject.select { |monitor| readables << monitor }
158
- result.should == 2
158
+ expect(result).to eq(2)
159
159
 
160
- readables.should include monitor1
161
- readables.should include monitor2
162
- readables.should_not include monitor3
160
+ expect(readables).to include monitor1
161
+ expect(readables).to include monitor2
162
+ expect(readables).not_to include monitor3
163
163
  end
164
164
  end
165
165
 
166
166
  it "closes" do
167
167
  subject.close
168
- subject.should be_closed
168
+ expect(subject).to be_closed
169
169
  end
170
170
  end
@@ -4,25 +4,25 @@ shared_context "an NIO selectable" do
4
4
  it "selects readable objects" do
5
5
  monitor = selector.register(readable_subject, :r)
6
6
  ready = selector.select(0)
7
- ready.should be_an Enumerable
8
- ready.should include monitor
7
+ expect(ready).to be_an Enumerable
8
+ expect(ready).to include monitor
9
9
  end
10
10
 
11
11
  it "does not select unreadable objects" do
12
12
  monitor = selector.register(unreadable_subject, :r)
13
- selector.select(0).should be_nil
13
+ expect(selector.select(0)).to be_nil
14
14
  end
15
15
 
16
16
  it "selects writable objects" do
17
17
  monitor = selector.register(writable_subject, :w)
18
18
  ready = selector.select(0)
19
- ready.should be_an Enumerable
20
- ready.should include monitor
19
+ expect(ready).to be_an Enumerable
20
+ expect(ready).to include monitor
21
21
  end
22
22
 
23
23
  it "does not select unwritable objects" do
24
24
  monitor = selector.register(unwritable_subject, :w)
25
- selector.select(0).should be_nil
25
+ expect(selector.select(0)).to be_nil
26
26
  end
27
27
  end
28
28
 
@@ -32,12 +32,15 @@ shared_context "an NIO selectable stream" do
32
32
  let(:peer) { pair.last }
33
33
 
34
34
  it "selects readable when the other end closes" do
35
+ # hax: this test is broken for OpenSSL sockets
36
+ skip 'broken for SSL ;_;' if peer.is_a? OpenSSL::SSL::SSLSocket
37
+
35
38
  monitor = selector.register(stream, :r)
36
- selector.select(0).should be_nil
39
+ expect(selector.select(0)).to be_nil
37
40
 
38
41
  peer.close
39
42
  #Wait and give the TCP session time to close
40
- selector.select(0.1).should include monitor
43
+ expect(selector.select(0.1)).to include monitor
41
44
  end
42
45
  end
43
46
 
@@ -49,7 +52,7 @@ shared_context "an NIO bidirectional stream" do
49
52
  it "selects readable and writable" do
50
53
  monitor = selector.register(readable_subject, :rw)
51
54
  selector.select(0) do |m|
52
- m.readiness.should == :rw
55
+ expect(m.readiness).to eq(:rw)
53
56
  end
54
57
  end
55
58
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nio4r
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tony Arcieri
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-15 00:00:00.000000000 Z
11
+ date: 2014-09-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake-compiler
@@ -42,16 +42,16 @@ dependencies:
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: 3.0.0
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: 3.0.0
55
55
  description: New IO for Ruby
56
56
  email:
57
57
  - tony.arcieri@gmail.com
@@ -109,7 +109,8 @@ files:
109
109
  - tasks/extension.rake
110
110
  - tasks/rspec.rake
111
111
  homepage: https://github.com/celluloid/nio4r
112
- licenses: []
112
+ licenses:
113
+ - MIT
113
114
  metadata: {}
114
115
  post_install_message:
115
116
  rdoc_options: []
@@ -127,7 +128,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
127
128
  version: '0'
128
129
  requirements: []
129
130
  rubyforge_project:
130
- rubygems_version: 2.2.0
131
+ rubygems_version: 2.2.2
131
132
  signing_key:
132
133
  specification_version: 4
133
134
  summary: NIO provides a high performance selector API for monitoring IO objects