cool.io 1.0.0 → 1.1.0
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.
- data/.gitignore +26 -0
- data/.rspec +3 -0
- data/.travis.yml +4 -0
- data/{CHANGES → CHANGES.md} +43 -79
- data/Gemfile +4 -0
- data/Gemfile.lock +32 -0
- data/{README.markdown → README.md} +0 -4
- data/Rakefile +31 -67
- data/cool.io.gemspec +25 -133
- data/ext/cool.io/extconf.rb +3 -0
- data/ext/cool.io/stat_watcher.c +99 -23
- data/ext/libev/Changes +24 -0
- data/ext/libev/ev.c +78 -32
- data/ext/libev/ev.h +11 -8
- data/ext/libev/ev_epoll.c +39 -7
- data/ext/libev/ev_kqueue.c +5 -5
- data/ext/libev/ev_poll.c +5 -5
- data/ext/libev/ev_port.c +26 -11
- data/ext/libev/ev_select.c +11 -8
- data/ext/libev/ev_vars.h +10 -4
- data/ext/libev/ev_win32.c +6 -6
- data/ext/libev/ev_wrap.h +10 -0
- data/lib/cool.io.rb +3 -3
- data/lib/cool.io/async_watcher.rb +1 -1
- data/lib/cool.io/dns_resolver.rb +14 -12
- data/lib/cool.io/dsl.rb +26 -26
- data/lib/cool.io/eventmachine.rb +18 -18
- data/lib/cool.io/http_client.rb +29 -22
- data/lib/cool.io/io.rb +18 -18
- data/lib/cool.io/iowatcher.rb +1 -1
- data/lib/cool.io/listener.rb +2 -2
- data/lib/cool.io/loop.rb +12 -12
- data/lib/cool.io/meta.rb +4 -4
- data/lib/cool.io/server.rb +3 -3
- data/lib/cool.io/socket.rb +36 -28
- data/lib/cool.io/timer_watcher.rb +1 -1
- data/lib/cool.io/version.rb +5 -0
- data/lib/coolio.rb +1 -1
- data/spec/stat_watcher_spec.rb +77 -0
- metadata +47 -56
- data/VERSION +0 -1
- data/lib/rev.rb +0 -4
- data/spec/possible_tests/schedules_other_threads.rb +0 -48
- data/spec/possible_tests/test_on_resolve_failed.rb +0 -9
- data/spec/possible_tests/test_resolves.rb +0 -27
- data/spec/possible_tests/test_write_during_resolve.rb +0 -27
- data/spec/possible_tests/works_straight.rb +0 -71
data/lib/coolio.rb
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
# For those people who don't like the cool.io styling...
|
2
|
-
require 'cool.io'
|
2
|
+
require 'cool.io'
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require File.expand_path('../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
TEMP_FILE_PATH = "./test.txt"
|
4
|
+
|
5
|
+
INTERVAL = 0.010
|
6
|
+
|
7
|
+
class MyStatWatcher < Cool.io::StatWatcher
|
8
|
+
attr_accessor :accessed, :previous, :current
|
9
|
+
|
10
|
+
def initialize(path)
|
11
|
+
super path, INTERVAL
|
12
|
+
end
|
13
|
+
|
14
|
+
def on_change(previous, current)
|
15
|
+
self.accessed = true
|
16
|
+
self.previous = previous
|
17
|
+
self.current = current
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def run_with_file_change(path)
|
22
|
+
reactor = Cool.io::Loop.new
|
23
|
+
|
24
|
+
sw = MyStatWatcher.new(path)
|
25
|
+
sw.attach(reactor)
|
26
|
+
|
27
|
+
tw = Cool.io::TimerWatcher.new(INTERVAL, true)
|
28
|
+
tw.on_timer do
|
29
|
+
reactor.stop if sw.accessed
|
30
|
+
write_file(path)
|
31
|
+
end
|
32
|
+
tw.attach(reactor)
|
33
|
+
|
34
|
+
reactor.run
|
35
|
+
|
36
|
+
tw.detach
|
37
|
+
sw.detach
|
38
|
+
|
39
|
+
sw
|
40
|
+
end
|
41
|
+
|
42
|
+
def write_file(path)
|
43
|
+
File.open(path, "w+") { |f| f.write(rand.to_s) }
|
44
|
+
end
|
45
|
+
|
46
|
+
def delete_file(path)
|
47
|
+
File.delete(TEMP_FILE_PATH)
|
48
|
+
end
|
49
|
+
|
50
|
+
describe Cool.io::StatWatcher do
|
51
|
+
|
52
|
+
let :watcher do
|
53
|
+
run_with_file_change(TEMP_FILE_PATH)
|
54
|
+
end
|
55
|
+
|
56
|
+
before :each do
|
57
|
+
write_file(TEMP_FILE_PATH)
|
58
|
+
end
|
59
|
+
|
60
|
+
after :each do
|
61
|
+
delete_file(TEMP_FILE_PATH)
|
62
|
+
end
|
63
|
+
|
64
|
+
it "fire on_change when the file it is watching is modified" do
|
65
|
+
watcher.accessed.should eql(true)
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should pass previous and current file stat info given a stat watcher" do
|
69
|
+
watcher.previous.ino.should eql(watcher.current.ino)
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should raise when the handler does not take 2 parameters" do
|
73
|
+
class MyStatWatcher < Cool.io::StatWatcher; def on_change; end; end
|
74
|
+
lambda { watcher.accessed }.should raise_error(ArgumentError)
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cool.io
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
6
|
-
segments:
|
7
|
-
- 1
|
8
|
-
- 0
|
9
|
-
- 0
|
10
|
-
version: 1.0.0
|
4
|
+
prerelease:
|
5
|
+
version: 1.1.0
|
11
6
|
platform: ruby
|
12
7
|
authors:
|
13
8
|
- Tony Arcieri
|
@@ -15,7 +10,7 @@ autorequire:
|
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
12
|
|
18
|
-
date:
|
13
|
+
date: 2011-08-10 00:00:00 -07:00
|
19
14
|
default_executable:
|
20
15
|
dependencies:
|
21
16
|
- !ruby/object:Gem::Dependency
|
@@ -26,46 +21,62 @@ dependencies:
|
|
26
21
|
requirements:
|
27
22
|
- - ">="
|
28
23
|
- !ruby/object:Gem::Version
|
29
|
-
|
30
|
-
segments:
|
31
|
-
- 0
|
32
|
-
- 1
|
33
|
-
- 3
|
34
|
-
version: 0.1.3
|
24
|
+
version: 1.0.0
|
35
25
|
type: :runtime
|
36
26
|
version_requirements: *id001
|
37
27
|
- !ruby/object:Gem::Dependency
|
38
|
-
name:
|
28
|
+
name: rake-compiler
|
39
29
|
prerelease: false
|
40
30
|
requirement: &id002 !ruby/object:Gem::Requirement
|
41
31
|
none: false
|
42
32
|
requirements:
|
43
|
-
- -
|
33
|
+
- - ~>
|
44
34
|
- !ruby/object:Gem::Version
|
45
|
-
|
46
|
-
segments:
|
47
|
-
- 2
|
48
|
-
- 1
|
49
|
-
- 0
|
50
|
-
version: 2.1.0
|
35
|
+
version: 0.7.9
|
51
36
|
type: :development
|
52
37
|
version_requirements: *id002
|
53
|
-
|
54
|
-
|
38
|
+
- !ruby/object:Gem::Dependency
|
39
|
+
name: rspec
|
40
|
+
prerelease: false
|
41
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 2.6.0
|
47
|
+
type: :development
|
48
|
+
version_requirements: *id003
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
name: rdoc
|
51
|
+
prerelease: false
|
52
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: 3.6.0
|
58
|
+
type: :development
|
59
|
+
version_requirements: *id004
|
60
|
+
description: Cool.io provides a high performance event framework for Ruby which uses the libev C library
|
61
|
+
email:
|
62
|
+
- tony.arcieri@gmail.com
|
55
63
|
executables: []
|
56
64
|
|
57
65
|
extensions:
|
58
66
|
- ext/cool.io/extconf.rb
|
59
67
|
- ext/http11_client/extconf.rb
|
60
|
-
extra_rdoc_files:
|
61
|
-
|
62
|
-
- README.markdown
|
68
|
+
extra_rdoc_files: []
|
69
|
+
|
63
70
|
files:
|
64
|
-
-
|
71
|
+
- .gitignore
|
72
|
+
- .rspec
|
73
|
+
- .travis.yml
|
74
|
+
- CHANGES.md
|
75
|
+
- Gemfile
|
76
|
+
- Gemfile.lock
|
65
77
|
- LICENSE
|
66
|
-
- README.
|
78
|
+
- README.md
|
67
79
|
- Rakefile
|
68
|
-
- VERSION
|
69
80
|
- cool.io.gemspec
|
70
81
|
- examples/dslified_echo_client.rb
|
71
82
|
- examples/dslified_echo_server.rb
|
@@ -124,21 +135,17 @@ files:
|
|
124
135
|
- lib/cool.io/server.rb
|
125
136
|
- lib/cool.io/socket.rb
|
126
137
|
- lib/cool.io/timer_watcher.rb
|
138
|
+
- lib/cool.io/version.rb
|
127
139
|
- lib/coolio.rb
|
128
|
-
- lib/rev.rb
|
129
140
|
- spec/async_watcher_spec.rb
|
130
141
|
- spec/dns_spec.rb
|
131
|
-
- spec/possible_tests/schedules_other_threads.rb
|
132
|
-
- spec/possible_tests/test_on_resolve_failed.rb
|
133
|
-
- spec/possible_tests/test_resolves.rb
|
134
|
-
- spec/possible_tests/test_write_during_resolve.rb
|
135
|
-
- spec/possible_tests/works_straight.rb
|
136
142
|
- spec/spec_helper.rb
|
143
|
+
- spec/stat_watcher_spec.rb
|
137
144
|
- spec/timer_watcher_spec.rb
|
138
145
|
- spec/unix_listener_spec.rb
|
139
146
|
- spec/unix_server_spec.rb
|
140
147
|
has_rdoc: true
|
141
|
-
homepage: http://github.com
|
148
|
+
homepage: http://coolio.github.com
|
142
149
|
licenses: []
|
143
150
|
|
144
151
|
post_install_message:
|
@@ -151,41 +158,25 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
151
158
|
requirements:
|
152
159
|
- - ">="
|
153
160
|
- !ruby/object:Gem::Version
|
154
|
-
hash: 3
|
155
|
-
segments:
|
156
|
-
- 0
|
157
161
|
version: "0"
|
158
162
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
159
163
|
none: false
|
160
164
|
requirements:
|
161
165
|
- - ">="
|
162
166
|
- !ruby/object:Gem::Version
|
163
|
-
hash: 3
|
164
|
-
segments:
|
165
|
-
- 0
|
166
167
|
version: "0"
|
167
168
|
requirements: []
|
168
169
|
|
169
170
|
rubyforge_project:
|
170
|
-
rubygems_version: 1.
|
171
|
+
rubygems_version: 1.6.2
|
171
172
|
signing_key:
|
172
173
|
specification_version: 3
|
173
|
-
summary:
|
174
|
+
summary: A cool framework for doing high performance I/O in Ruby
|
174
175
|
test_files:
|
175
|
-
- examples/dslified_echo_client.rb
|
176
|
-
- examples/dslified_echo_server.rb
|
177
|
-
- examples/echo_client.rb
|
178
|
-
- examples/echo_server.rb
|
179
|
-
- examples/google.rb
|
180
|
-
- examples/httpclient.rb
|
181
176
|
- spec/async_watcher_spec.rb
|
182
177
|
- spec/dns_spec.rb
|
183
|
-
- spec/possible_tests/schedules_other_threads.rb
|
184
|
-
- spec/possible_tests/test_on_resolve_failed.rb
|
185
|
-
- spec/possible_tests/test_resolves.rb
|
186
|
-
- spec/possible_tests/test_write_during_resolve.rb
|
187
|
-
- spec/possible_tests/works_straight.rb
|
188
178
|
- spec/spec_helper.rb
|
179
|
+
- spec/stat_watcher_spec.rb
|
189
180
|
- spec/timer_watcher_spec.rb
|
190
181
|
- spec/unix_listener_spec.rb
|
191
182
|
- spec/unix_server_spec.rb
|
data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
1.0.0
|
data/lib/rev.rb
DELETED
@@ -1,48 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/../lib/rev'
|
2
|
-
def dbg
|
3
|
-
require 'rubygems'
|
4
|
-
require 'ruby-debug'
|
5
|
-
debugger
|
6
|
-
end
|
7
|
-
Thread.abort_on_exception=true
|
8
|
-
|
9
|
-
require 'socket'
|
10
|
-
|
11
|
-
describe Rev::TCPSocket do
|
12
|
-
HOST = '127.0.0.1'
|
13
|
-
PORT = 4321
|
14
|
-
before :each do
|
15
|
-
@server = Rev::TCPServer.new(HOST, PORT) do |c|
|
16
|
-
c.on_connect { puts "#{remote_addr}:#{remote_port} connected" }
|
17
|
-
c.on_close { puts "#{remote_addr}:#{remote_port} disconnected" }
|
18
|
-
#c.on_read { |data| write data }
|
19
|
-
end
|
20
|
-
|
21
|
-
end
|
22
|
-
|
23
|
-
after :each do
|
24
|
-
@server.close
|
25
|
-
end
|
26
|
-
|
27
|
-
def sleep_until(seconds = 1, interval = 0.1)
|
28
|
-
raise unless block_given?
|
29
|
-
start_time=Time.now
|
30
|
-
sleep interval until ((Time.now - start_time) > seconds) or yield
|
31
|
-
end
|
32
|
-
|
33
|
-
it "should stop" do
|
34
|
-
loop = Rev::Loop.default
|
35
|
-
stopped = false;
|
36
|
-
@server.attach(loop)
|
37
|
-
Thread.new {
|
38
|
-
loop.run
|
39
|
-
stopped = true
|
40
|
-
}
|
41
|
-
sleep 0
|
42
|
-
stopped.should == false
|
43
|
-
loop.stop
|
44
|
-
sleep_until(3) { stopped == true }
|
45
|
-
stopped.should == true
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
@@ -1,27 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/../rev'
|
2
|
-
|
3
|
-
ADDR = 'wilkboardonline.com'
|
4
|
-
PORT = 80
|
5
|
-
|
6
|
-
class ClientConnection < Rev::TCPSocket
|
7
|
-
def on_connect
|
8
|
-
puts "#{remote_addr}:#{remote_port} connected"
|
9
|
-
write ("GET / HTTP/1.1\r\nhost:wilkboardonline.com:80\r\nconnection:close\r\n\r\n")
|
10
|
-
end
|
11
|
-
|
12
|
-
def on_close
|
13
|
-
puts "#{remote_addr}:#{remote_port} disconnected"
|
14
|
-
end
|
15
|
-
|
16
|
-
def on_read(data)
|
17
|
-
print "got #{data}"
|
18
|
-
close
|
19
|
-
end
|
20
|
-
|
21
|
-
end
|
22
|
-
|
23
|
-
event_loop = Rev::Loop.default
|
24
|
-
client = ClientConnection.connect(ADDR, PORT)
|
25
|
-
client.attach(event_loop)
|
26
|
-
puts "Echo client started to #{ADDR}:#{PORT}"
|
27
|
-
event_loop.run
|
@@ -1,27 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/../rev'
|
2
|
-
|
3
|
-
ADDR = 'wilkboardonline.com'
|
4
|
-
PORT = 80
|
5
|
-
|
6
|
-
class ClientConnection < Rev::TCPSocket
|
7
|
-
def on_connect
|
8
|
-
puts "#{remote_addr}:#{remote_port} connected"
|
9
|
-
end
|
10
|
-
|
11
|
-
def on_close
|
12
|
-
puts "#{remote_addr}:#{remote_port} disconnected"
|
13
|
-
end
|
14
|
-
|
15
|
-
def on_read(data)
|
16
|
-
print "got #{data}"
|
17
|
-
close
|
18
|
-
end
|
19
|
-
|
20
|
-
end
|
21
|
-
|
22
|
-
event_loop = Rev::Loop.default
|
23
|
-
client = ClientConnection.connect(ADDR, PORT)
|
24
|
-
client.write ("GET / HTTP/1.1\r\nhost:wilkboardonline.com:80\r\nconnection:close\r\n\r\n")
|
25
|
-
client.attach(event_loop)
|
26
|
-
puts "Echo client started to #{ADDR}:#{PORT}"
|
27
|
-
event_loop.run
|
@@ -1,71 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/../lib/rev'
|
2
|
-
def dbg
|
3
|
-
require 'rubygems'
|
4
|
-
require 'ruby-debug'
|
5
|
-
debugger
|
6
|
-
end
|
7
|
-
Thread.abort_on_exception=true
|
8
|
-
|
9
|
-
require 'socket'
|
10
|
-
|
11
|
-
describe Rev::TCPSocket do
|
12
|
-
HOST = '127.0.0.1'
|
13
|
-
PORT = 4321
|
14
|
-
before :each do
|
15
|
-
@server = Rev::TCPServer.new(HOST, PORT) do |c|
|
16
|
-
c.on_connect { puts "#{remote_addr}:#{remote_port} connected" }
|
17
|
-
c.on_close { puts "#{remote_addr}:#{remote_port} disconnected" }
|
18
|
-
#c.on_read { |data| write data }
|
19
|
-
end
|
20
|
-
|
21
|
-
end
|
22
|
-
|
23
|
-
after :each do
|
24
|
-
@server.close
|
25
|
-
end
|
26
|
-
|
27
|
-
def sleep_until(seconds = 1, interval = 0.1)
|
28
|
-
raise unless block_given?
|
29
|
-
start_time=Time.now
|
30
|
-
sleep interval until ((Time.now - start_time) > seconds) or yield
|
31
|
-
end
|
32
|
-
|
33
|
-
it "should stop" do
|
34
|
-
loop = Rev::Loop.default
|
35
|
-
stopped = false;
|
36
|
-
@server.attach(loop)
|
37
|
-
Thread.new {
|
38
|
-
loop.run_nonblock_over_and_over_again
|
39
|
-
stopped = true
|
40
|
-
}
|
41
|
-
sleep 0
|
42
|
-
stopped.should == false
|
43
|
-
loop.stop
|
44
|
-
|
45
|
-
sleep_until { stopped == true }
|
46
|
-
stopped.should == true
|
47
|
-
end
|
48
|
-
|
49
|
-
it "should auto bind on 1.8.6" do
|
50
|
-
@server.close
|
51
|
-
loop = Rev::Loop.default
|
52
|
-
server = Rev::TCPServer.new(HOST, PORT) do |c|
|
53
|
-
#c.on_connect { puts "#{remote_addr}:#{remote_port} connected" }
|
54
|
-
#c.on_close { puts "#{remote_addr}:#{remote_port} disconnected" }
|
55
|
-
print "CREATING\n"
|
56
|
-
c.on_read { |conn, data| print "WITHIN MYINE"; conn.write data; conn.close; loop.stop }
|
57
|
-
end
|
58
|
-
|
59
|
-
server.attach(loop)
|
60
|
-
|
61
|
-
Thread.new { loop.run_nonblock_over_and_over_again }
|
62
|
-
puts "Echo server listening on #{HOST}:#{PORT}"
|
63
|
-
# now connect and write -- it should close
|
64
|
-
connector = TCPSocket.new HOST, PORT
|
65
|
-
connector.write "yup"
|
66
|
-
connector.read.should == 'yup'
|
67
|
-
sleep 0
|
68
|
-
loop.running?.should != true
|
69
|
-
connector.closed?.should == true # it should close me, too
|
70
|
-
end
|
71
|
-
end
|