cool.io 1.2.1 → 1.2.2
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 +7 -0
- data/.travis.yml +2 -0
- data/CHANGES.md +6 -0
- data/README.md +1 -5
- data/ext/cool.io/cool.io.h +1 -0
- data/ext/cool.io/ev_wrap.h +4 -2
- data/ext/cool.io/extconf.rb +4 -0
- data/ext/cool.io/loop.c +35 -64
- data/ext/libev/ev.c +18 -4
- data/lib/cool.io/loop.rb +2 -2
- data/lib/cool.io/version.rb +1 -1
- data/spec/spec_helper.rb +7 -0
- data/spec/tcp_server_spec.rb +130 -0
- metadata +18 -30
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 8df378d986336f5aa0c79e3c5e31f80a1571ab0d
|
4
|
+
data.tar.gz: 2d9c5aa507a285b4ee129c5a8ccfca8c5f5d8586
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f6a74e7fa7dd6bd728835225ecb8481c2e44a44dad2887aaba7d041d835bdcb76ace90ea2fe4aab6bd5db322f3d9ea0c1e81e4eb68da4a3d75273fdcb6781d86
|
7
|
+
data.tar.gz: deaffe41d393672ffb44c81766460f8e0736a21294e96acabe998fe01ea36dbdd55ef6b1efadf1e675460ffc0be43376052f9a2f4e3344d36e7c8b37730a3bc5
|
data/.travis.yml
CHANGED
data/CHANGES.md
CHANGED
data/README.md
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
Cool.io
|
2
2
|
=======
|
3
3
|
|
4
|
-
###
|
5
|
-
### Please check out [Celluloid::IO](http://github.com/celluloid/celluloid-io) instead!
|
4
|
+
### If you are interested in Celluloid based IO framework, please check out [Celluloid::IO](http://github.com/celluloid/celluloid-io)
|
6
5
|
|
7
6
|
Cool.io is an event library for Ruby, built on the libev event library which
|
8
7
|
provides a cross-platform interface to high performance system calls . This
|
@@ -15,10 +14,8 @@ applications.
|
|
15
14
|
|
16
15
|
You can include Cool.io in your programs with:
|
17
16
|
|
18
|
-
require 'rubygems'
|
19
17
|
require 'cool.io'
|
20
18
|
|
21
|
-
Questions? Sign up for the mailing list by emailing: [cool.io@librelist.com](mailto:cool.io@librelist.com)
|
22
19
|
|
23
20
|
Anatomy
|
24
21
|
-------
|
@@ -97,7 +94,6 @@ Example Program
|
|
97
94
|
|
98
95
|
Cool.io provides a Sinatra-like DSL for authoring event-driven programs:
|
99
96
|
|
100
|
-
require 'rubygems'
|
101
97
|
require 'cool.io'
|
102
98
|
|
103
99
|
ADDR = '127.0.0.1'
|
data/ext/cool.io/cool.io.h
CHANGED
data/ext/cool.io/ev_wrap.h
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
#define EV_STANDALONE /* keeps ev from requiring config.h */
|
2
|
+
|
2
3
|
#ifdef _WIN32
|
3
|
-
#
|
4
|
-
#
|
4
|
+
#define EV_SELECT_IS_WINSOCKET 1 /* configure libev for windows select */
|
5
|
+
#define EV_USE_MONOTONIC 0
|
6
|
+
#define EV_USE_REALTIME 0
|
5
7
|
#endif
|
6
8
|
|
7
9
|
#include "../libev/ev.h"
|
data/ext/cool.io/extconf.rb
CHANGED
@@ -8,6 +8,10 @@ if have_func('rb_thread_blocking_region')
|
|
8
8
|
$defs << '-DHAVE_RB_THREAD_BLOCKING_REGION'
|
9
9
|
end
|
10
10
|
|
11
|
+
if have_func('rb_thread_call_without_gvl')
|
12
|
+
$defs << '-DHAVE_RB_THEREAD_CALL_WITHOUT_GVL'
|
13
|
+
end
|
14
|
+
|
11
15
|
if have_func('rb_thread_alone')
|
12
16
|
$defs << '-DHAVE_RB_THREAD_ALONE'
|
13
17
|
end
|
data/ext/cool.io/loop.c
CHANGED
@@ -11,14 +11,6 @@
|
|
11
11
|
|
12
12
|
#include "cool.io.h"
|
13
13
|
|
14
|
-
#if defined(HAVE_RB_THREAD_BLOCKING_REGION)
|
15
|
-
# define Coolio_Loop_may_block_safely() (1)
|
16
|
-
#elif defined(HAVE_RB_THREAD_ALONE)
|
17
|
-
# define Coolio_Loop_may_block_safely() (rb_thread_alone())
|
18
|
-
#else /* just in case Ruby changes: */
|
19
|
-
# define Coolio_Loop_may_block_safely() (0)
|
20
|
-
#endif
|
21
|
-
|
22
14
|
static VALUE mCoolio = Qnil;
|
23
15
|
static VALUE cCoolio_Loop = Qnil;
|
24
16
|
|
@@ -28,10 +20,10 @@ static void Coolio_Loop_free(struct Coolio_Loop *loop);
|
|
28
20
|
|
29
21
|
static VALUE Coolio_Loop_initialize(VALUE self);
|
30
22
|
static VALUE Coolio_Loop_ev_loop_new(VALUE self, VALUE flags);
|
31
|
-
static VALUE Coolio_Loop_run_once(VALUE self);
|
23
|
+
static VALUE Coolio_Loop_run_once(int argc, VALUE *argv, VALUE self);
|
32
24
|
static VALUE Coolio_Loop_run_nonblock(VALUE self);
|
33
25
|
|
34
|
-
static void
|
26
|
+
static void Coolio_Loop_timeout_callback(struct ev_loop *ev_loop, struct ev_timer *timer, int revents);
|
35
27
|
static void Coolio_Loop_dispatch_events(struct Coolio_Loop *loop_data);
|
36
28
|
|
37
29
|
#define DEFAULT_EVENTBUF_SIZE 32
|
@@ -54,7 +46,7 @@ void Init_coolio_loop()
|
|
54
46
|
|
55
47
|
rb_define_method(cCoolio_Loop, "initialize", Coolio_Loop_initialize, 0);
|
56
48
|
rb_define_private_method(cCoolio_Loop, "ev_loop_new", Coolio_Loop_ev_loop_new, 1);
|
57
|
-
rb_define_method(cCoolio_Loop, "run_once", Coolio_Loop_run_once,
|
49
|
+
rb_define_method(cCoolio_Loop, "run_once", Coolio_Loop_run_once, -1);
|
58
50
|
rb_define_method(cCoolio_Loop, "run_nonblock", Coolio_Loop_run_nonblock, 0);
|
59
51
|
}
|
60
52
|
|
@@ -63,6 +55,7 @@ static VALUE Coolio_Loop_allocate(VALUE klass)
|
|
63
55
|
struct Coolio_Loop *loop = (struct Coolio_Loop *)xmalloc(sizeof(struct Coolio_Loop));
|
64
56
|
|
65
57
|
loop->ev_loop = 0;
|
58
|
+
ev_init(&loop->timer, Coolio_Loop_timeout_callback);
|
66
59
|
loop->running = 0;
|
67
60
|
loop->events_received = 0;
|
68
61
|
loop->eventbuf_size = DEFAULT_EVENTBUF_SIZE;
|
@@ -174,79 +167,57 @@ void Coolio_Loop_process_event(VALUE watcher, int revents)
|
|
174
167
|
loop_data->events_received++;
|
175
168
|
}
|
176
169
|
|
170
|
+
/* Called whenever a timeout fires on the event loop */
|
171
|
+
static void Coolio_Loop_timeout_callback(struct ev_loop *ev_loop, struct ev_timer *timer, int revents)
|
172
|
+
{
|
173
|
+
/* We don't actually need to do anything here, the mere firing of the
|
174
|
+
timer is sufficient to interrupt the selector. However, libev still wants a callback */
|
175
|
+
}
|
176
|
+
|
177
177
|
/**
|
178
178
|
* call-seq:
|
179
179
|
* Coolio::Loop.run_once -> nil
|
180
180
|
*
|
181
181
|
* Run the Coolio::Loop once, blocking until events are received.
|
182
182
|
*/
|
183
|
-
static VALUE Coolio_Loop_run_once(VALUE self)
|
183
|
+
static VALUE Coolio_Loop_run_once(int argc, VALUE *argv, VALUE self)
|
184
184
|
{
|
185
|
+
VALUE timeout;
|
185
186
|
VALUE nevents;
|
187
|
+
struct Coolio_Loop *loop_data;
|
186
188
|
|
187
|
-
|
188
|
-
struct Coolio_Loop *loop_data;
|
189
|
-
|
190
|
-
Data_Get_Struct(self, struct Coolio_Loop, loop_data);
|
189
|
+
rb_scan_args(argc, argv, "01", &timeout);
|
191
190
|
|
192
|
-
|
191
|
+
if (timeout != Qnil && NUM2DBL(timeout) < 0) {
|
192
|
+
rb_raise(rb_eArgError, "time interval must be positive");
|
193
|
+
}
|
193
194
|
|
194
|
-
|
195
|
-
Coolio_Loop_dispatch_events(loop_data);
|
195
|
+
Data_Get_Struct(self, struct Coolio_Loop, loop_data);
|
196
196
|
|
197
|
-
|
198
|
-
loop_data->events_received = 0;
|
197
|
+
assert(loop_data->ev_loop && !loop_data->events_received);
|
199
198
|
|
199
|
+
/* Implement the optional timeout (if any) as a ev_timer */
|
200
|
+
/* Using the technique written at
|
201
|
+
http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod#code_ev_timer_code_relative_and_opti,
|
202
|
+
the timer is not stopped/started everytime when timeout is specified, instead,
|
203
|
+
the timer is stopped when timeout is not specified. */
|
204
|
+
if (timeout != Qnil) {
|
205
|
+
/* It seems libev is not a fan of timers being zero, so fudge a little */
|
206
|
+
loop_data->timer.repeat = NUM2DBL(timeout) + 0.0001;
|
207
|
+
ev_timer_again(loop_data->ev_loop, &loop_data->timer);
|
200
208
|
} else {
|
201
|
-
|
202
|
-
rb_thread_schedule();
|
209
|
+
ev_timer_stop(loop_data->ev_loop, &loop_data->timer);
|
203
210
|
}
|
204
211
|
|
205
|
-
|
206
|
-
}
|
207
|
-
|
208
|
-
#ifdef HAVE_RB_THREAD_BLOCKING_REGION
|
209
|
-
#define HAVE_EV_LOOP_ONESHOT
|
210
|
-
|
211
|
-
static void Coolio_Loop_ev_loop_oneshot(struct Coolio_Loop *loop_data)
|
212
|
-
{
|
212
|
+
/* libev is patched to release the GIL when it makes its system call */
|
213
213
|
RUN_LOOP(loop_data, EVLOOP_ONESHOT);
|
214
|
-
}
|
215
|
-
#endif
|
216
|
-
|
217
|
-
/* Ruby 1.8 requires us to periodically run the event loop then defer back to
|
218
|
-
* the green threads scheduler */
|
219
|
-
#ifndef HAVE_EV_LOOP_ONESHOT
|
220
|
-
#define BLOCKING_INTERVAL 0.01 /* Block for 10ms at a time */
|
221
|
-
|
222
|
-
/* Stub for scheduler's ev_timer callback */
|
223
|
-
static void timer_callback(struct ev_loop *ev_loop, struct ev_timer *timer, int revents)
|
224
|
-
{
|
225
|
-
ev_timer_again (ev_loop, timer);
|
226
|
-
}
|
227
|
-
|
228
|
-
/* Run the event loop, calling rb_thread_schedule every 10ms */
|
229
|
-
static void Coolio_Loop_ev_loop_oneshot(struct Coolio_Loop *loop_data)
|
230
|
-
{
|
231
|
-
struct ev_timer timer;
|
232
|
-
struct timeval tv;
|
233
214
|
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
/* Loop until we receive events */
|
239
|
-
while(!loop_data->events_received) {
|
240
|
-
TRAP_BEG;
|
241
|
-
RUN_LOOP(loop_data, EVLOOP_ONESHOT);
|
242
|
-
TRAP_END;
|
243
|
-
|
244
|
-
rb_thread_schedule();
|
245
|
-
}
|
215
|
+
Coolio_Loop_dispatch_events(loop_data);
|
216
|
+
nevents = INT2NUM(loop_data->events_received);
|
217
|
+
loop_data->events_received = 0;
|
246
218
|
|
247
|
-
|
219
|
+
return nevents;
|
248
220
|
}
|
249
|
-
#endif
|
250
221
|
|
251
222
|
/**
|
252
223
|
* call-seq:
|
data/ext/libev/ev.c
CHANGED
@@ -3242,7 +3242,7 @@ time_update (EV_P_ ev_tstamp max_block)
|
|
3242
3242
|
}
|
3243
3243
|
|
3244
3244
|
/* ########## COOLIO 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
|
static
|
3247
3247
|
VALUE ev_backend_poll(void **args)
|
3248
3248
|
{
|
@@ -3257,7 +3257,7 @@ int
|
|
3257
3257
|
ev_run (EV_P_ int flags)
|
3258
3258
|
{
|
3259
3259
|
/* ########## COOLIO PATCHERY HO! ########## */
|
3260
|
-
#if defined(HAVE_RB_THREAD_BLOCKING_REGION)
|
3260
|
+
#if defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)
|
3261
3261
|
void *poll_args[2];
|
3262
3262
|
#endif
|
3263
3263
|
/* ######################################## */
|
@@ -3415,10 +3415,24 @@ Let this be a lesson to the all: CALLBACKS FUCKING BLOW
|
|
3415
3415
|
#######################################################################
|
3416
3416
|
*/
|
3417
3417
|
|
3418
|
-
|
3418
|
+
/*
|
3419
|
+
simulate to rb_thread_call_without_gvl using rb_theread_blocking_region.
|
3420
|
+
https://github.com/brianmario/mysql2/blob/master/ext/mysql2/client.h#L8
|
3421
|
+
*/
|
3422
|
+
|
3423
|
+
#ifndef HAVE_RB_THREAD_CALL_WITHOUT_GVL
|
3424
|
+
#ifdef HAVE_RB_THREAD_BLOCKING_REGION
|
3425
|
+
|
3426
|
+
#define rb_thread_call_without_gvl(func, data1, ubf, data2) \
|
3427
|
+
rb_thread_blocking_region((rb_blocking_function_t *)func, data1, ubf, data2)
|
3428
|
+
|
3429
|
+
#endif
|
3430
|
+
#endif
|
3431
|
+
|
3432
|
+
#if defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)
|
3419
3433
|
poll_args[0] = (void *)loop;
|
3420
3434
|
poll_args[1] = (void *)&waittime;
|
3421
|
-
|
3435
|
+
rb_thread_call_without_gvl(ev_backend_poll, (void *)&poll_args, RUBY_UBF_IO, 0);
|
3422
3436
|
#else
|
3423
3437
|
backend_poll (EV_A_ waittime);
|
3424
3438
|
#endif
|
data/lib/cool.io/loop.rb
CHANGED
@@ -88,12 +88,12 @@ module Coolio
|
|
88
88
|
# event callbacks to watchers until all watchers associated with
|
89
89
|
# the loop have been disabled or detached. The loop may be
|
90
90
|
# explicitly stopped by calling the stop method on the loop object.
|
91
|
-
def run
|
91
|
+
def run(timeout = nil)
|
92
92
|
raise RuntimeError, "no watchers for this loop" if @watchers.empty?
|
93
93
|
|
94
94
|
@running = true
|
95
95
|
while @running and not @active_watchers.zero?
|
96
|
-
run_once
|
96
|
+
run_once(timeout)
|
97
97
|
end
|
98
98
|
@running = false
|
99
99
|
end
|
data/lib/cool.io/version.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -4,6 +4,13 @@ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
|
4
4
|
require 'rspec'
|
5
5
|
require 'cool.io'
|
6
6
|
|
7
|
+
def unused_port
|
8
|
+
s = TCPServer.open(0)
|
9
|
+
port = s.addr[1]
|
10
|
+
s.close
|
11
|
+
port
|
12
|
+
end
|
13
|
+
|
7
14
|
RSpec.configure do |c|
|
8
15
|
if RUBY_PLATFORM =~ /mingw|win32/
|
9
16
|
$stderr.puts "Skip some specs on Windows"
|
@@ -0,0 +1,130 @@
|
|
1
|
+
require File.expand_path('../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
TIMEOUT = 0.010
|
4
|
+
HOST = '127.0.0.1'
|
5
|
+
PORT = unused_port
|
6
|
+
|
7
|
+
def send_data(data)
|
8
|
+
io = TCPSocket.new('127.0.0.1', PORT)
|
9
|
+
begin
|
10
|
+
io.write data
|
11
|
+
ensure
|
12
|
+
io.close
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class MyConnection < Coolio::Socket
|
17
|
+
attr_accessor :data, :connected, :closed
|
18
|
+
|
19
|
+
def initialize(io, on_message)
|
20
|
+
super(io)
|
21
|
+
@on_message = on_message
|
22
|
+
end
|
23
|
+
|
24
|
+
def on_connect
|
25
|
+
@connected = true
|
26
|
+
end
|
27
|
+
|
28
|
+
def on_close
|
29
|
+
@closed = true
|
30
|
+
end
|
31
|
+
|
32
|
+
def on_read(data)
|
33
|
+
@on_message.call(data)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
@data = ""
|
38
|
+
def on_message(data)
|
39
|
+
@data = data
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_run(data = nil)
|
43
|
+
reactor = Coolio::Loop.new
|
44
|
+
server = Cool.io::TCPServer.new(HOST, PORT, MyConnection, method(:on_message))
|
45
|
+
reactor.attach(server)
|
46
|
+
thread = Thread.new { reactor.run }
|
47
|
+
send_data(data) if data
|
48
|
+
sleep TIMEOUT
|
49
|
+
reactor.stop
|
50
|
+
server.detach
|
51
|
+
send_data('') # to leave from blocking loop
|
52
|
+
thread.join
|
53
|
+
@data
|
54
|
+
ensure
|
55
|
+
server.close
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_run_once(data = nil)
|
59
|
+
reactor = Coolio::Loop.new
|
60
|
+
server = Cool.io::TCPServer.new(HOST, PORT, MyConnection, method(:on_message))
|
61
|
+
reactor.attach(server)
|
62
|
+
thread = Thread.new do
|
63
|
+
reactor.run_once # on_connect
|
64
|
+
reactor.run_once # on_read
|
65
|
+
end
|
66
|
+
send_data(data) if data
|
67
|
+
thread.join
|
68
|
+
server.detach
|
69
|
+
@data
|
70
|
+
ensure
|
71
|
+
server.close
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_run_once_timeout(timeout = TIMEOUT)
|
75
|
+
reactor = Coolio::Loop.new
|
76
|
+
server = Cool.io::TCPServer.new(HOST, PORT, MyConnection, method(:on_message))
|
77
|
+
reactor.attach(server)
|
78
|
+
running = true
|
79
|
+
thread = Thread.new { reactor.run_once(timeout) }
|
80
|
+
sleep timeout
|
81
|
+
server.detach
|
82
|
+
thread.join
|
83
|
+
@data
|
84
|
+
ensure
|
85
|
+
server.close
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_run_timeout(data = nil, timeout = TIMEOUT)
|
89
|
+
reactor = Coolio::Loop.new
|
90
|
+
server = Cool.io::TCPServer.new(HOST, PORT, MyConnection, method(:on_message))
|
91
|
+
reactor.attach(server)
|
92
|
+
running = true
|
93
|
+
thread = Thread.new do
|
94
|
+
while running and reactor.has_active_watchers?
|
95
|
+
reactor.run_once(timeout)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
send_data(data) if data
|
99
|
+
sleep timeout
|
100
|
+
server.detach
|
101
|
+
running = false # another send is not required
|
102
|
+
thread.join
|
103
|
+
@data
|
104
|
+
ensure
|
105
|
+
server.close
|
106
|
+
end
|
107
|
+
|
108
|
+
describe Coolio::TCPServer do
|
109
|
+
|
110
|
+
it '#run' do
|
111
|
+
test_run("hello").should == "hello"
|
112
|
+
end
|
113
|
+
|
114
|
+
it '#run_once' do
|
115
|
+
test_run_once("hello").should == "hello"
|
116
|
+
end
|
117
|
+
|
118
|
+
it '#run_once(timeout)' do
|
119
|
+
test_run_once_timeout # should not block
|
120
|
+
end
|
121
|
+
|
122
|
+
it '#run_once(-timeout)' do
|
123
|
+
expect { test_run_once_timeout(-0.1) }.to raise_error(ArgumentError)
|
124
|
+
end
|
125
|
+
|
126
|
+
it '#run(timeout)' do
|
127
|
+
test_run_timeout("hello").should == "hello"
|
128
|
+
end
|
129
|
+
|
130
|
+
end
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cool.io
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
5
|
-
prerelease:
|
4
|
+
version: 1.2.2
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Tony Arcieri
|
@@ -10,54 +9,48 @@ authors:
|
|
10
9
|
autorequire:
|
11
10
|
bindir: bin
|
12
11
|
cert_chain: []
|
13
|
-
date: 2014-
|
12
|
+
date: 2014-04-16 00:00:00.000000000 Z
|
14
13
|
dependencies:
|
15
14
|
- !ruby/object:Gem::Dependency
|
16
15
|
name: rake-compiler
|
17
16
|
requirement: !ruby/object:Gem::Requirement
|
18
|
-
none: false
|
19
17
|
requirements:
|
20
|
-
- - ~>
|
18
|
+
- - "~>"
|
21
19
|
- !ruby/object:Gem::Version
|
22
20
|
version: 0.8.3
|
23
21
|
type: :development
|
24
22
|
prerelease: false
|
25
23
|
version_requirements: !ruby/object:Gem::Requirement
|
26
|
-
none: false
|
27
24
|
requirements:
|
28
|
-
- - ~>
|
25
|
+
- - "~>"
|
29
26
|
- !ruby/object:Gem::Version
|
30
27
|
version: 0.8.3
|
31
28
|
- !ruby/object:Gem::Dependency
|
32
29
|
name: rspec
|
33
30
|
requirement: !ruby/object:Gem::Requirement
|
34
|
-
none: false
|
35
31
|
requirements:
|
36
|
-
- -
|
32
|
+
- - ">="
|
37
33
|
- !ruby/object:Gem::Version
|
38
34
|
version: 2.13.0
|
39
35
|
type: :development
|
40
36
|
prerelease: false
|
41
37
|
version_requirements: !ruby/object:Gem::Requirement
|
42
|
-
none: false
|
43
38
|
requirements:
|
44
|
-
- -
|
39
|
+
- - ">="
|
45
40
|
- !ruby/object:Gem::Version
|
46
41
|
version: 2.13.0
|
47
42
|
- !ruby/object:Gem::Dependency
|
48
43
|
name: rdoc
|
49
44
|
requirement: !ruby/object:Gem::Requirement
|
50
|
-
none: false
|
51
45
|
requirements:
|
52
|
-
- -
|
46
|
+
- - ">="
|
53
47
|
- !ruby/object:Gem::Version
|
54
48
|
version: 3.6.0
|
55
49
|
type: :development
|
56
50
|
prerelease: false
|
57
51
|
version_requirements: !ruby/object:Gem::Requirement
|
58
|
-
none: false
|
59
52
|
requirements:
|
60
|
-
- -
|
53
|
+
- - ">="
|
61
54
|
- !ruby/object:Gem::Version
|
62
55
|
version: 3.6.0
|
63
56
|
description: Cool.io provides a high performance event framework for Ruby which uses
|
@@ -72,9 +65,9 @@ extensions:
|
|
72
65
|
- ext/iobuffer/extconf.rb
|
73
66
|
extra_rdoc_files: []
|
74
67
|
files:
|
75
|
-
- .gitignore
|
76
|
-
- .rspec
|
77
|
-
- .travis.yml
|
68
|
+
- ".gitignore"
|
69
|
+
- ".rspec"
|
70
|
+
- ".travis.yml"
|
78
71
|
- CHANGES.md
|
79
72
|
- Gemfile
|
80
73
|
- LICENSE
|
@@ -148,44 +141,39 @@ files:
|
|
148
141
|
- spec/dns_spec.rb
|
149
142
|
- spec/spec_helper.rb
|
150
143
|
- spec/stat_watcher_spec.rb
|
144
|
+
- spec/tcp_server_spec.rb
|
151
145
|
- spec/timer_watcher_spec.rb
|
152
146
|
- spec/unix_listener_spec.rb
|
153
147
|
- spec/unix_server_spec.rb
|
154
148
|
homepage: http://coolio.github.com
|
155
149
|
licenses: []
|
150
|
+
metadata: {}
|
156
151
|
post_install_message:
|
157
152
|
rdoc_options: []
|
158
153
|
require_paths:
|
159
154
|
- lib
|
160
155
|
required_ruby_version: !ruby/object:Gem::Requirement
|
161
|
-
none: false
|
162
156
|
requirements:
|
163
|
-
- -
|
157
|
+
- - ">="
|
164
158
|
- !ruby/object:Gem::Version
|
165
159
|
version: '0'
|
166
|
-
segments:
|
167
|
-
- 0
|
168
|
-
hash: 2606014626052723115
|
169
160
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
170
|
-
none: false
|
171
161
|
requirements:
|
172
|
-
- -
|
162
|
+
- - ">="
|
173
163
|
- !ruby/object:Gem::Version
|
174
164
|
version: '0'
|
175
|
-
segments:
|
176
|
-
- 0
|
177
|
-
hash: 2606014626052723115
|
178
165
|
requirements: []
|
179
166
|
rubyforge_project:
|
180
|
-
rubygems_version:
|
167
|
+
rubygems_version: 2.2.2
|
181
168
|
signing_key:
|
182
|
-
specification_version:
|
169
|
+
specification_version: 4
|
183
170
|
summary: A cool framework for doing high performance I/O in Ruby
|
184
171
|
test_files:
|
185
172
|
- spec/async_watcher_spec.rb
|
186
173
|
- spec/dns_spec.rb
|
187
174
|
- spec/spec_helper.rb
|
188
175
|
- spec/stat_watcher_spec.rb
|
176
|
+
- spec/tcp_server_spec.rb
|
189
177
|
- spec/timer_watcher_spec.rb
|
190
178
|
- spec/unix_listener_spec.rb
|
191
179
|
- spec/unix_server_spec.rb
|