em-zeromq 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.Rakefile.swo +0 -0
- data/lib/em-zeromq/.connection.rb.swp +0 -0
- data/lib/em-zeromq/.zeromq.rb.swp +0 -0
- data/lib/em-zeromq/connection.rb +39 -19
- data/lib/em-zeromq/zeromq.rb +0 -10
- data/spec/.spec_helper.rb.swp +0 -0
- data/spec/.xreq_xrep_spec.rb.swp +0 -0
- data/spec/pub_sub_spec.rb +1 -0
- data/spec/push_pull_spec.rb +6 -10
- data/spec/xreq_xrep_spec.rb +87 -0
- data/version.txt +1 -1
- metadata +18 -7
- data/.gitignore +0 -8
data/.Rakefile.swo
ADDED
Binary file
|
Binary file
|
Binary file
|
data/lib/em-zeromq/connection.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
module EventMachine
|
3
2
|
module ZeroMQ
|
4
3
|
class Connection < EventMachine::Connection
|
@@ -12,14 +11,24 @@ module EventMachine
|
|
12
11
|
@address = address
|
13
12
|
end
|
14
13
|
|
14
|
+
def readable?
|
15
|
+
(@socket.getsockopt(ZMQ::EVENTS) & ZMQ::POLLIN) == ZMQ::POLLIN
|
16
|
+
end
|
17
|
+
|
18
|
+
def writable?
|
19
|
+
(@socket.getsockopt(ZMQ::EVENTS) & ZMQ::POLLOUT) == ZMQ::POLLOUT
|
20
|
+
end
|
21
|
+
|
15
22
|
def notify_readable
|
16
|
-
|
17
|
-
#
|
23
|
+
# Not sure if this is actually necessary. I suppose it prevents us
|
24
|
+
# from having to to instantiate a ZMQ::Message unnecessarily.
|
25
|
+
# I'm leaving this is because its in the docs, but it could probably
|
26
|
+
# be taken out.
|
27
|
+
return unless readable?
|
18
28
|
|
19
|
-
msg_parts = []
|
20
|
-
|
21
29
|
loop do
|
22
|
-
|
30
|
+
msg_parts = []
|
31
|
+
msg = get_message
|
23
32
|
if msg
|
24
33
|
msg_parts << msg
|
25
34
|
while @socket.more_parts?
|
@@ -44,29 +53,40 @@ module EventMachine
|
|
44
53
|
msg_recvd ? msg : nil
|
45
54
|
end
|
46
55
|
|
56
|
+
def notify_writable
|
57
|
+
if writable?
|
58
|
+
@handler.on_writable(@socket)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# Stop triggering on_writable when socket is writable
|
47
63
|
def deregister_writable
|
48
64
|
self.notify_writable = false
|
49
65
|
end
|
50
|
-
|
66
|
+
|
67
|
+
# Make this socket available for reads
|
68
|
+
def register_readable
|
69
|
+
# Since ZMQ is event triggered I think this is necessary
|
70
|
+
if (@socket.getsockopt(ZMQ::EVENTS) & ZMQ::POLLIN) == ZMQ::POLLIN
|
71
|
+
notify_readable
|
72
|
+
end
|
73
|
+
self.notify_readable = true
|
74
|
+
end
|
75
|
+
|
76
|
+
# Trigger on_readable when socket is readable
|
51
77
|
def register_writable
|
78
|
+
# Since ZMQ is event triggered I think this is necessary
|
52
79
|
if (@socket.getsockopt(ZMQ::EVENTS) & ZMQ::POLLOUT) == ZMQ::POLLOUT
|
53
80
|
notify_writable
|
54
81
|
end
|
55
82
|
self.notify_writable = true
|
56
83
|
end
|
57
84
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
def read_capable?
|
65
|
-
@read_capable ||= EM::ZeroMQ::READABLE_TYPES.include? @socket_type
|
66
|
-
end
|
67
|
-
|
68
|
-
def write_capable?
|
69
|
-
@write_capable ||= EM::ZeroMQ::WRITABLE_TYPES.include? @socket_type
|
85
|
+
# Detaches the socket from the EM loop,
|
86
|
+
# then closes the socket
|
87
|
+
def detach_and_close
|
88
|
+
detach
|
89
|
+
@socket.close
|
70
90
|
end
|
71
91
|
end
|
72
92
|
end
|
data/lib/em-zeromq/zeromq.rb
CHANGED
@@ -1,8 +1,5 @@
|
|
1
1
|
module EventMachine
|
2
2
|
module ZeroMQ
|
3
|
-
READABLE_TYPES = [ZMQ::SUB, ZMQ::PULL, ZMQ::REQ, ZMQ::REP, ZMQ::XREQ, ZMQ::XREP, ZMQ::PAIR]
|
4
|
-
WRITABLE_TYPES = [ZMQ::PUB, ZMQ::PUSH, ZMQ::REQ, ZMQ::REP, ZMQ::XREQ, ZMQ::XREP, ZMQ::PAIR]
|
5
|
-
|
6
3
|
def self.create(context, socket_type, bind_or_connect, address, handler)
|
7
4
|
socket = context.socket socket_type
|
8
5
|
|
@@ -17,13 +14,6 @@ module EventMachine
|
|
17
14
|
end
|
18
15
|
|
19
16
|
conn = EM.watch(socket.getsockopt(ZMQ::FD), EventMachine::ZeroMQ::Connection, socket, socket_type, address, handler)
|
20
|
-
conn.notify_readable = true if EM::ZeroMQ::READABLE_TYPES.include? socket_type
|
21
|
-
|
22
|
-
#Given the nature of ZMQ this isn't that useful, and will generally
|
23
|
-
#cause perf problems as it repeatedly triggers. If people really want to
|
24
|
-
#use it, they should do so explicitly
|
25
|
-
conn.notify_writable = false
|
26
|
-
conn
|
27
17
|
end
|
28
18
|
|
29
19
|
end
|
Binary file
|
Binary file
|
data/spec/pub_sub_spec.rb
CHANGED
data/spec/push_pull_spec.rb
CHANGED
@@ -20,11 +20,13 @@ describe EventMachine::ZeroMQ do
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def make_pull(addr, b_or_c, handler=EMTestPullHandler.new)
|
23
|
-
EM::ZeroMQ.create SPEC_CTX, ZMQ::PULL, b_or_c, addr, handler
|
23
|
+
conn = EM::ZeroMQ.create SPEC_CTX, ZMQ::PULL, b_or_c, addr, handler
|
24
|
+
conn.register_readable
|
25
|
+
conn
|
24
26
|
end
|
25
27
|
|
26
28
|
def make_push(addr, b_or_c, handler=EMTestPushHandler.new)
|
27
|
-
EM::ZeroMQ.create SPEC_CTX, ZMQ::PUSH, b_or_c, addr, handler
|
29
|
+
conn = EM::ZeroMQ.create SPEC_CTX, ZMQ::PUSH, b_or_c, addr, handler
|
28
30
|
end
|
29
31
|
|
30
32
|
it "Should instantiate a connection given valid opts" do
|
@@ -57,15 +59,9 @@ describe EventMachine::ZeroMQ do
|
|
57
59
|
@results[:specs_ran].should be_true
|
58
60
|
end
|
59
61
|
|
60
|
-
it "should receive one message" do
|
61
|
-
@results[:pull_hndlr].received.length.should == 1
|
62
|
-
end
|
63
|
-
|
64
|
-
it "should receive the message as a ZMQ::Message" do
|
65
|
-
@results[:pull_hndlr].received.first.should be_a(ZMQ::Message)
|
66
|
-
end
|
67
|
-
|
68
62
|
it "should receive the message intact" do
|
63
|
+
@results[:pull_hndlr].received.should_not be_empty
|
64
|
+
@results[:pull_hndlr].received.first.should be_a(ZMQ::Message)
|
69
65
|
@results[:pull_hndlr].received.first.copy_out_string.should == @test_message
|
70
66
|
end
|
71
67
|
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), %w[spec_helper])
|
2
|
+
|
3
|
+
describe EventMachine::ZeroMQ do
|
4
|
+
class EMTestXREQHandler
|
5
|
+
attr_reader :received
|
6
|
+
def initialize
|
7
|
+
@received = []
|
8
|
+
end
|
9
|
+
def on_readable(socket, messages)
|
10
|
+
@received += messages
|
11
|
+
end
|
12
|
+
end
|
13
|
+
class EMTestXREPHandler
|
14
|
+
attr_reader :received
|
15
|
+
def initialize(&block)
|
16
|
+
@received = []
|
17
|
+
@on_writable_callback = block
|
18
|
+
end
|
19
|
+
def on_writable(socket)
|
20
|
+
@on_writable_callback.call(socket) if @on_writable_callback
|
21
|
+
end
|
22
|
+
def on_readable(socket, messages)
|
23
|
+
ident, delim, message = messages.map(&:copy_out_string)
|
24
|
+
@received += [ident, delim, message].map {|s| ZMQ::Message.new(s)}
|
25
|
+
socket.send_string ident, ZMQ::SNDMORE
|
26
|
+
socket.send_string delim, ZMQ::SNDMORE
|
27
|
+
socket.send_string message
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def make_xreq(addr, b_or_c, handler=EMTestXREQHandler.new)
|
32
|
+
conn = EM::ZeroMQ.create SPEC_CTX, ZMQ::XREQ, b_or_c, addr, handler
|
33
|
+
conn.register_readable
|
34
|
+
conn
|
35
|
+
end
|
36
|
+
|
37
|
+
def make_xrep(addr, b_or_c, handler=EMTestXREPHandler.new)
|
38
|
+
conn = EM::ZeroMQ.create SPEC_CTX, ZMQ::XREP, b_or_c, addr, handler
|
39
|
+
conn.register_readable
|
40
|
+
conn
|
41
|
+
end
|
42
|
+
|
43
|
+
it "Should instantiate a connection given valid opts" do
|
44
|
+
xreq_conn = nil
|
45
|
+
run_reactor(1) do
|
46
|
+
xreq_conn = make_xreq(rand_addr, :bind, EMTestXREQHandler.new)
|
47
|
+
end
|
48
|
+
xreq_conn.should be_a(EventMachine::ZeroMQ::Connection)
|
49
|
+
end
|
50
|
+
|
51
|
+
describe "sending/receiving a single message via Xreq/Xrep" do
|
52
|
+
before(:all) do
|
53
|
+
results = {}
|
54
|
+
@test_message = test_message = "TMsg#{rand(999)}"
|
55
|
+
|
56
|
+
run_reactor(1.5) do
|
57
|
+
results[:xrep_hndlr] = xrep_hndlr = EMTestXREPHandler.new
|
58
|
+
results[:xreq_hndlr] = xreq_hndlr = EMTestXREQHandler.new
|
59
|
+
xreq_conn = make_xreq rand_addr, :connect, xreq_hndlr
|
60
|
+
xrep_conn = make_xrep xreq_conn.address, :bind, xrep_hndlr
|
61
|
+
|
62
|
+
xreq_conn.socket.send_string '', ZMQ::SNDMORE #delim
|
63
|
+
xreq_conn.socket.send_string test_message
|
64
|
+
|
65
|
+
EM::Timer.new(0.1) { results[:specs_ran] = true }
|
66
|
+
end
|
67
|
+
|
68
|
+
@results = results
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should run completely" do
|
72
|
+
@results[:specs_ran].should be_true
|
73
|
+
end
|
74
|
+
|
75
|
+
it "should receive the message intact on the xrep" do
|
76
|
+
@results[:xrep_hndlr].received.should_not be_empty
|
77
|
+
@results[:xrep_hndlr].received.last.should be_a(ZMQ::Message)
|
78
|
+
@results[:xrep_hndlr].received.last.copy_out_string.should == @test_message
|
79
|
+
end
|
80
|
+
|
81
|
+
it "the xreq should be echoed its original message" do
|
82
|
+
@results[:xreq_hndlr].received.should_not be_empty
|
83
|
+
@results[:xreq_hndlr].received.last.should be_a(ZMQ::Message)
|
84
|
+
@results[:xreq_hndlr].received.last.copy_out_string.should == @test_message
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
data/version.txt
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.2
|
metadata
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: em-zeromq
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
hash: 31
|
4
5
|
prerelease: false
|
5
6
|
segments:
|
6
7
|
- 0
|
7
8
|
- 1
|
8
|
-
-
|
9
|
-
version: 0.1.
|
9
|
+
- 2
|
10
|
+
version: 0.1.2
|
10
11
|
platform: ruby
|
11
12
|
authors:
|
12
13
|
- Andrew Cholakian
|
@@ -14,7 +15,7 @@ autorequire:
|
|
14
15
|
bindir: bin
|
15
16
|
cert_chain: []
|
16
17
|
|
17
|
-
date: 2011-02-
|
18
|
+
date: 2011-02-02 00:00:00 -08:00
|
18
19
|
default_executable:
|
19
20
|
dependencies:
|
20
21
|
- !ruby/object:Gem::Dependency
|
@@ -25,11 +26,12 @@ dependencies:
|
|
25
26
|
requirements:
|
26
27
|
- - ">="
|
27
28
|
- !ruby/object:Gem::Version
|
29
|
+
hash: 27
|
28
30
|
segments:
|
29
31
|
- 3
|
30
|
-
-
|
31
|
-
-
|
32
|
-
version: 3.
|
32
|
+
- 5
|
33
|
+
- 4
|
34
|
+
version: 3.5.4
|
33
35
|
type: :development
|
34
36
|
version_requirements: *id001
|
35
37
|
description: Low level event machine support for ZeroMQ
|
@@ -41,10 +43,12 @@ extensions: []
|
|
41
43
|
extra_rdoc_files:
|
42
44
|
- History.txt
|
43
45
|
- bin/em-zeromq
|
46
|
+
- lib/em-zeromq/.connection.rb.swp
|
47
|
+
- lib/em-zeromq/.zeromq.rb.swp
|
48
|
+
- version.txt
|
44
49
|
files:
|
45
50
|
- .Rakefile.swo
|
46
51
|
- .bnsignore
|
47
|
-
- .gitignore
|
48
52
|
- History.txt
|
49
53
|
- README.md
|
50
54
|
- Rakefile
|
@@ -52,11 +56,16 @@ files:
|
|
52
56
|
- em-zeromq.gemspec
|
53
57
|
- example/simple.rb
|
54
58
|
- lib/em-zeromq.rb
|
59
|
+
- lib/em-zeromq/.connection.rb.swp
|
60
|
+
- lib/em-zeromq/.zeromq.rb.swp
|
55
61
|
- lib/em-zeromq/connection.rb
|
56
62
|
- lib/em-zeromq/zeromq.rb
|
63
|
+
- spec/.spec_helper.rb.swp
|
64
|
+
- spec/.xreq_xrep_spec.rb.swp
|
57
65
|
- spec/pub_sub_spec.rb
|
58
66
|
- spec/push_pull_spec.rb
|
59
67
|
- spec/spec_helper.rb
|
68
|
+
- spec/xreq_xrep_spec.rb
|
60
69
|
- test/test_em-zeromq.rb
|
61
70
|
- version.txt
|
62
71
|
has_rdoc: true
|
@@ -74,6 +83,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
74
83
|
requirements:
|
75
84
|
- - ">="
|
76
85
|
- !ruby/object:Gem::Version
|
86
|
+
hash: 3
|
77
87
|
segments:
|
78
88
|
- 0
|
79
89
|
version: "0"
|
@@ -82,6 +92,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
82
92
|
requirements:
|
83
93
|
- - ">="
|
84
94
|
- !ruby/object:Gem::Version
|
95
|
+
hash: 3
|
85
96
|
segments:
|
86
97
|
- 0
|
87
98
|
version: "0"
|