nio4r 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
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