dripdrop 0.8.1 → 0.9.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.
- data/Rakefile +2 -2
- data/VERSION +1 -1
- data/dripdrop.gemspec +8 -8
- data/example/pushpull.rb +1 -1
- data/example/xreq_xrep.rb +1 -1
- data/lib/dripdrop/handlers/http.rb +0 -1
- data/lib/dripdrop/handlers/zeromq.rb +58 -73
- data/lib/dripdrop/message.rb +5 -4
- data/lib/dripdrop/node.rb +31 -28
- data/spec/node/routing_spec.rb +3 -4
- data/spec/node/zmq_pushpull_spec.rb +1 -0
- data/spec/node/zmq_xrepxreq_spec.rb +10 -10
- data/spec/node_spec.rb +1 -7
- data/spec/spec_helper.rb +0 -2
- metadata +7 -7
data/Rakefile
CHANGED
@@ -14,9 +14,9 @@ begin
|
|
14
14
|
gem.add_dependency('eventmachine')
|
15
15
|
gem.add_dependency('em-websocket')
|
16
16
|
gem.add_dependency('thin')
|
17
|
-
gem.add_dependency('
|
17
|
+
gem.add_dependency('em-zeromq')
|
18
18
|
gem.add_dependency('msgpack')
|
19
|
-
gem.add_dependency('
|
19
|
+
gem.add_dependency('yajl-ruby')
|
20
20
|
end
|
21
21
|
Jeweler::GemcutterTasks.new
|
22
22
|
rescue LoadError
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.9.2
|
data/dripdrop.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{dripdrop}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.9.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Andrew Cholakian"]
|
12
|
-
s.date = %q{2011-01
|
12
|
+
s.date = %q{2011-02-01}
|
13
13
|
s.description = %q{Evented framework for ZeroMQ and EventMachine Apps. }
|
14
14
|
s.email = %q{andrew@andrewvc.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -88,26 +88,26 @@ Gem::Specification.new do |s|
|
|
88
88
|
s.add_runtime_dependency(%q<eventmachine>, [">= 0"])
|
89
89
|
s.add_runtime_dependency(%q<em-websocket>, [">= 0"])
|
90
90
|
s.add_runtime_dependency(%q<thin>, [">= 0"])
|
91
|
-
s.add_runtime_dependency(%q<
|
91
|
+
s.add_runtime_dependency(%q<em-zeromq>, [">= 0"])
|
92
92
|
s.add_runtime_dependency(%q<msgpack>, [">= 0"])
|
93
|
-
s.add_runtime_dependency(%q<
|
93
|
+
s.add_runtime_dependency(%q<yajl-ruby>, [">= 0"])
|
94
94
|
else
|
95
95
|
s.add_dependency(%q<ffi-rzmq>, [">= 0"])
|
96
96
|
s.add_dependency(%q<eventmachine>, [">= 0"])
|
97
97
|
s.add_dependency(%q<em-websocket>, [">= 0"])
|
98
98
|
s.add_dependency(%q<thin>, [">= 0"])
|
99
|
-
s.add_dependency(%q<
|
99
|
+
s.add_dependency(%q<em-zeromq>, [">= 0"])
|
100
100
|
s.add_dependency(%q<msgpack>, [">= 0"])
|
101
|
-
s.add_dependency(%q<
|
101
|
+
s.add_dependency(%q<yajl-ruby>, [">= 0"])
|
102
102
|
end
|
103
103
|
else
|
104
104
|
s.add_dependency(%q<ffi-rzmq>, [">= 0"])
|
105
105
|
s.add_dependency(%q<eventmachine>, [">= 0"])
|
106
106
|
s.add_dependency(%q<em-websocket>, [">= 0"])
|
107
107
|
s.add_dependency(%q<thin>, [">= 0"])
|
108
|
-
s.add_dependency(%q<
|
108
|
+
s.add_dependency(%q<em-zeromq>, [">= 0"])
|
109
109
|
s.add_dependency(%q<msgpack>, [">= 0"])
|
110
|
-
s.add_dependency(%q<
|
110
|
+
s.add_dependency(%q<yajl-ruby>, [">= 0"])
|
111
111
|
end
|
112
112
|
end
|
113
113
|
|
data/example/pushpull.rb
CHANGED
data/example/xreq_xrep.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'ffi-rzmq'
|
2
|
+
require 'em-zeromq'
|
2
3
|
|
3
4
|
class DripDrop
|
5
|
+
|
4
6
|
#Setup the default message class handler first
|
5
7
|
class << self
|
6
8
|
attr_accessor :default_message_class
|
@@ -9,26 +11,12 @@ class DripDrop
|
|
9
11
|
end
|
10
12
|
|
11
13
|
class ZMQBaseHandler < BaseHandler
|
12
|
-
|
13
|
-
|
14
|
-
def initialize(zaddress,zm_reactor,socket_ctype,opts={})
|
15
|
-
@zaddress = zaddress
|
16
|
-
@address = @zaddress.to_s
|
17
|
-
@zm_reactor = zm_reactor
|
18
|
-
@socket_ctype = socket_ctype # :bind or :connect
|
19
|
-
@debug = opts[:debug] # TODO: Start actually using this
|
20
|
-
@opts = opts
|
21
|
-
end
|
14
|
+
attr_accessor :connection
|
22
15
|
|
23
|
-
def
|
24
|
-
@
|
25
|
-
|
26
|
-
|
27
|
-
elsif @socket_ctype == :connect
|
28
|
-
socket.connect(@zaddress)
|
29
|
-
else
|
30
|
-
EM.next_tick { raise "Unsupported socket ctype '#{@socket_ctype}'. Expected :bind or :connect" }
|
31
|
-
end
|
16
|
+
def initialize(opts={})
|
17
|
+
@opts = opts
|
18
|
+
@connection = nil
|
19
|
+
@msg_format = opts[:msg_format] || :dripdrop
|
32
20
|
end
|
33
21
|
|
34
22
|
def on_recv(msg_format=:dripdrop,&block)
|
@@ -36,6 +24,13 @@ class DripDrop
|
|
36
24
|
@recv_cbak = block
|
37
25
|
self
|
38
26
|
end
|
27
|
+
|
28
|
+
def address
|
29
|
+
self.connection.address
|
30
|
+
end
|
31
|
+
|
32
|
+
#Triggered after a handler is setup
|
33
|
+
def post_setup; end
|
39
34
|
end
|
40
35
|
|
41
36
|
module ZMQWritableHandler
|
@@ -51,20 +46,20 @@ class DripDrop
|
|
51
46
|
num_parts = message.length
|
52
47
|
message.each_with_index do |part,i|
|
53
48
|
# Set the multi-part flag unless this is the last message
|
54
|
-
multipart_flag = i + 1 < num_parts ?
|
49
|
+
multipart_flag = i + 1 < num_parts ? ZMQ::SNDMORE : 0
|
55
50
|
|
56
51
|
if part.class == ZMQ::Message
|
57
|
-
socket.
|
52
|
+
socket.send(part, multipart_flag)
|
58
53
|
else
|
59
54
|
if part.class == String
|
60
|
-
socket.
|
55
|
+
socket.send_string(part, multipart_flag)
|
61
56
|
else
|
62
57
|
$stderr.write "Can only send Strings, not #{part.class}: #{part}" if @debug
|
63
58
|
end
|
64
59
|
end
|
65
60
|
end
|
66
61
|
else
|
67
|
-
@
|
62
|
+
@connection.deregister_writable
|
68
63
|
end
|
69
64
|
end
|
70
65
|
|
@@ -81,7 +76,7 @@ class DripDrop
|
|
81
76
|
else
|
82
77
|
@send_queue.push([message])
|
83
78
|
end
|
84
|
-
@
|
79
|
+
@connection.register_writable
|
85
80
|
end
|
86
81
|
end
|
87
82
|
|
@@ -98,18 +93,16 @@ class DripDrop
|
|
98
93
|
end
|
99
94
|
|
100
95
|
def on_readable(socket, messages)
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
end
|
112
|
-
}
|
96
|
+
case @msg_format
|
97
|
+
when :raw
|
98
|
+
@recv_cbak.call(messages)
|
99
|
+
when :dripdrop
|
100
|
+
raise "Expected message in one part" if messages.length > 1
|
101
|
+
body = messages.shift.copy_out_string
|
102
|
+
@recv_cbak.call(decode_message(body))
|
103
|
+
else
|
104
|
+
raise "Unknown message format '#{@msg_format}'"
|
105
|
+
end
|
113
106
|
end
|
114
107
|
end
|
115
108
|
|
@@ -123,27 +116,23 @@ class DripDrop
|
|
123
116
|
self.topic_filter = @opts[:topic_filter]
|
124
117
|
end
|
125
118
|
|
126
|
-
def on_attach(socket)
|
127
|
-
super(socket)
|
128
|
-
socket.subscribe('')
|
129
|
-
end
|
130
|
-
|
131
119
|
def on_readable(socket, messages)
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
body = messages.shift.copy_out_string
|
141
|
-
@recv_cbak.call(decode_message(body))
|
142
|
-
end
|
143
|
-
else
|
144
|
-
super(socket,messages)
|
120
|
+
if @msg_format == :dripdrop
|
121
|
+
unless messages.length == 2
|
122
|
+
return false
|
123
|
+
end
|
124
|
+
topic = messages.shift.copy_out_string
|
125
|
+
if @topic_filter.nil? || topic.match(@topic_filter)
|
126
|
+
body = messages.shift.copy_out_string
|
127
|
+
@recv_cbak.call(decode_message(body))
|
145
128
|
end
|
146
|
-
|
129
|
+
else
|
130
|
+
super(socket,messages)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def post_setup
|
135
|
+
@connection.socket.setsockopt(ZMQ::SUBSCRIBE, '')
|
147
136
|
end
|
148
137
|
end
|
149
138
|
|
@@ -180,18 +169,16 @@ class DripDrop
|
|
180
169
|
end
|
181
170
|
|
182
171
|
def on_readable(socket,messages)
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
end
|
194
|
-
}
|
172
|
+
if @msg_format == :dripdrop
|
173
|
+
identities = messages[0..-2].map {|m| m.copy_out_string}
|
174
|
+
body = messages.last.copy_out_string
|
175
|
+
message = decode_message(body)
|
176
|
+
seq = message.head['_dripdrop/x_seq_counter']
|
177
|
+
response = ZMQXRepHandler::Response.new(self, identities,seq)
|
178
|
+
@recv_cbak.call(message,response)
|
179
|
+
else
|
180
|
+
super(socket,messages)
|
181
|
+
end
|
195
182
|
end
|
196
183
|
|
197
184
|
def send_message(message,identities,seq)
|
@@ -230,12 +217,10 @@ class DripDrop
|
|
230
217
|
@promises = {}
|
231
218
|
|
232
219
|
self.on_recv do |message|
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
promise.call(message) if promise
|
238
|
-
}
|
220
|
+
seq = message.head['_dripdrop/x_seq_counter']
|
221
|
+
raise "Missing Seq Counter" unless seq
|
222
|
+
promise = @promises.delete(seq)
|
223
|
+
promise.call(message) if promise
|
239
224
|
end
|
240
225
|
end
|
241
226
|
|
data/lib/dripdrop/message.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'msgpack'
|
3
|
-
require '
|
3
|
+
require 'yajl'
|
4
4
|
|
5
5
|
class DripDrop
|
6
6
|
# DripDrop::Message messages are exchanged between all tiers in the architecture
|
@@ -19,6 +19,7 @@ class DripDrop
|
|
19
19
|
# head should be used for metadata, body for the actual data.
|
20
20
|
# These definitions are intentionally loose, because protocols tend to be used loosely.
|
21
21
|
class Message
|
22
|
+
|
22
23
|
attr_accessor :name, :head, :body
|
23
24
|
|
24
25
|
# Creates a new message.
|
@@ -43,7 +44,7 @@ class DripDrop
|
|
43
44
|
|
44
45
|
# Encodes the hash represntation of the message to JSON
|
45
46
|
def json_encoded
|
46
|
-
self.to_hash
|
47
|
+
Yajl::Encoder.encode self.to_hash
|
47
48
|
end
|
48
49
|
# (Deprecated, use json_encoded)
|
49
50
|
def encode_json; json_encoded; end
|
@@ -94,8 +95,8 @@ class DripDrop
|
|
94
95
|
# Decodes a string containing a JSON representation of a message
|
95
96
|
def self.decode_json(str)
|
96
97
|
begin
|
97
|
-
json_hash =
|
98
|
-
rescue
|
98
|
+
json_hash = Yajl::Parser.parse(str)
|
99
|
+
rescue Yajl::ParserError => e
|
99
100
|
puts "Could not parse msg '#{str}': #{e.message}"
|
100
101
|
return nil
|
101
102
|
end
|
data/lib/dripdrop/node.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'ffi-rzmq'
|
3
|
-
require 'zmqmachine'
|
4
3
|
require 'eventmachine'
|
5
4
|
require 'uri'
|
6
5
|
require 'resolv'
|
@@ -15,11 +14,12 @@ require 'dripdrop/handlers/http'
|
|
15
14
|
|
16
15
|
class DripDrop
|
17
16
|
class Node
|
17
|
+
ZCTX = ZMQ::Context.new 1
|
18
|
+
|
18
19
|
attr_reader :zm_reactor, :routing, :nodelets
|
19
20
|
attr_accessor :debug
|
20
21
|
|
21
22
|
def initialize(opts={},&block)
|
22
|
-
@zm_reactor = nil # The instance of the zmq_machine reactor
|
23
23
|
@block = block
|
24
24
|
@thread = nil # Thread containing the reactors
|
25
25
|
@routing = {} # Routing table
|
@@ -27,6 +27,7 @@ class DripDrop
|
|
27
27
|
@recipients_for = {}
|
28
28
|
@handler_default_opts = {:debug => @debug}
|
29
29
|
@nodelets = {} # Cache of registered nodelets
|
30
|
+
@zctx = ZCTX
|
30
31
|
end
|
31
32
|
|
32
33
|
# Starts the reactors and runs the block passed to initialize.
|
@@ -35,15 +36,12 @@ class DripDrop
|
|
35
36
|
@thread = Thread.new do
|
36
37
|
EM.error_handler {|e| self.error_handler e}
|
37
38
|
EM.run do
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
else
|
45
|
-
raise "Could not start, no block or action specified"
|
46
|
-
end
|
39
|
+
if @block
|
40
|
+
self.instance_eval(&@block)
|
41
|
+
elsif self.respond_to?(:action)
|
42
|
+
self.action
|
43
|
+
else
|
44
|
+
raise "Could not start, no block or action specified"
|
47
45
|
end
|
48
46
|
end
|
49
47
|
end
|
@@ -68,7 +66,6 @@ class DripDrop
|
|
68
66
|
|
69
67
|
# Stops the reactors. If you were blocked on #join, that will unblock.
|
70
68
|
def stop
|
71
|
-
@zm_reactor.stop
|
72
69
|
EM.stop
|
73
70
|
end
|
74
71
|
|
@@ -153,22 +150,22 @@ class DripDrop
|
|
153
150
|
# zmq_subscribe sockets have a +topic_filter+ option, which restricts which
|
154
151
|
# messages they can receive. It takes a regexp as an option.
|
155
152
|
def zmq_subscribe(address,socket_ctype,opts={},&block)
|
156
|
-
zmq_handler(DripDrop::ZMQSubHandler
|
153
|
+
zmq_handler(DripDrop::ZMQSubHandler,ZMQ::SUB,address,socket_ctype,opts)
|
157
154
|
end
|
158
155
|
|
159
156
|
# Creates a ZMQ::PUB type socket, can only send messages via +send_message+
|
160
157
|
def zmq_publish(address,socket_ctype,opts={})
|
161
|
-
zmq_handler(DripDrop::ZMQPubHandler
|
158
|
+
zmq_handler(DripDrop::ZMQPubHandler,ZMQ::PUB,address,socket_ctype,opts)
|
162
159
|
end
|
163
160
|
|
164
161
|
# Creates a ZMQ::PULL type socket. Can only receive messages via +on_recv+
|
165
162
|
def zmq_pull(address,socket_ctype,opts={},&block)
|
166
|
-
zmq_handler(DripDrop::ZMQPullHandler
|
163
|
+
zmq_handler(DripDrop::ZMQPullHandler,ZMQ::PULL,address,socket_ctype,opts)
|
167
164
|
end
|
168
165
|
|
169
166
|
# Creates a ZMQ::PUSH type socket, can only send messages via +send_message+
|
170
167
|
def zmq_push(address,socket_ctype,opts={})
|
171
|
-
zmq_handler(DripDrop::ZMQPushHandler
|
168
|
+
zmq_handler(DripDrop::ZMQPushHandler,ZMQ::PUSH,address,socket_ctype,opts)
|
172
169
|
end
|
173
170
|
|
174
171
|
# Creates a ZMQ::XREP type socket, both sends and receivesc XREP sockets are extremely
|
@@ -184,12 +181,12 @@ class DripDrop
|
|
184
181
|
# end
|
185
182
|
#
|
186
183
|
def zmq_xrep(address,socket_ctype,opts={})
|
187
|
-
zmq_handler(DripDrop::ZMQXRepHandler
|
184
|
+
zmq_handler(DripDrop::ZMQXRepHandler,ZMQ::XREP,address,socket_ctype,opts)
|
188
185
|
end
|
189
186
|
|
190
187
|
# See the documentation for +zmq_xrep+ for more info
|
191
188
|
def zmq_xreq(address,socket_ctype,opts={})
|
192
|
-
zmq_handler(DripDrop::ZMQXReqHandler
|
189
|
+
zmq_handler(DripDrop::ZMQXReqHandler,ZMQ::XREQ,address,socket_ctype,opts)
|
193
190
|
end
|
194
191
|
|
195
192
|
# Binds an EM websocket connection to +address+. takes blocks for
|
@@ -275,18 +272,24 @@ class DripDrop
|
|
275
272
|
end
|
276
273
|
|
277
274
|
private
|
278
|
-
|
279
|
-
def zmq_handler(klass,
|
275
|
+
|
276
|
+
def zmq_handler(klass, sock_type, address, socket_ctype, opts={})
|
280
277
|
addr_uri = URI.parse(address)
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
278
|
+
|
279
|
+
if addr_uri.scheme == 'tcp'
|
280
|
+
host = Resolv.getaddresses(addr_uri.host).first
|
281
|
+
host_addr = Resolv.getaddresses('localhost').map {|a| IPAddr.new(a)}.find {|a| a.ipv4?}
|
282
|
+
host_str = host_addr.ipv6? ? "[#{host_addr.to_s}]" : host_addr.to_s
|
283
|
+
else
|
284
|
+
host_str = addr_uri.host
|
285
|
+
end
|
285
286
|
|
286
|
-
|
287
|
-
h_opts
|
288
|
-
|
289
|
-
|
287
|
+
z_addr = "#{addr_uri.scheme}://#{host_str}:#{addr_uri.port.to_i}"
|
288
|
+
h_opts = handler_opts_given(opts)
|
289
|
+
connection = EM::ZeroMQ.create @zctx, sock_type, socket_ctype, address, klass.new
|
290
|
+
handler = connection.handler
|
291
|
+
handler.connection = connection
|
292
|
+
handler.post_setup
|
290
293
|
handler
|
291
294
|
end
|
292
295
|
|
data/spec/node/routing_spec.rb
CHANGED
@@ -24,7 +24,6 @@ describe "routing" do
|
|
24
24
|
@expected_routing.each do |route_name,expected_props|
|
25
25
|
handler = @node.send(route_name)
|
26
26
|
handler.class.should == expected_props[:class]
|
27
|
-
handler.socket_ctype.should == expected_props[:socket_ctype]
|
28
27
|
end
|
29
28
|
end
|
30
29
|
end
|
@@ -32,9 +31,9 @@ describe "routing" do
|
|
32
31
|
context "with no groups" do
|
33
32
|
before(:all) do
|
34
33
|
@expected_routing = {
|
35
|
-
:distributor => {:class => DripDrop::ZMQPushHandler
|
36
|
-
:worker1 => {:class => DripDrop::ZMQPullHandler
|
37
|
-
:worker2 => {:class => DripDrop::ZMQPullHandler
|
34
|
+
:distributor => {:class => DripDrop::ZMQPushHandler},
|
35
|
+
:worker1 => {:class => DripDrop::ZMQPullHandler},
|
36
|
+
:worker2 => {:class => DripDrop::ZMQPullHandler}
|
38
37
|
}
|
39
38
|
@node = run_reactor do
|
40
39
|
route :distributor, :zmq_push, rand_addr, :bind
|
@@ -7,7 +7,7 @@ describe "zmq xreq/xrep" do
|
|
7
7
|
req = nil
|
8
8
|
rep = nil
|
9
9
|
|
10
|
-
@node = run_reactor do
|
10
|
+
@node = run_reactor(0.5) do
|
11
11
|
addr = rand_addr
|
12
12
|
|
13
13
|
rep = zmq_xrep(addr, :bind)
|
@@ -74,7 +74,7 @@ describe "zmq xreq/xrep" do
|
|
74
74
|
it "should send responses back to the proper xreq sender" do
|
75
75
|
received_count = 0
|
76
76
|
|
77
|
-
run_reactor(0.
|
77
|
+
run_reactor(0.5) do
|
78
78
|
addr = rand_addr
|
79
79
|
|
80
80
|
rep = zmq_xrep(addr, :bind)
|
@@ -89,14 +89,14 @@ describe "zmq xreq/xrep" do
|
|
89
89
|
r2_msg = DripDrop::Message.new("REQ2 Message")
|
90
90
|
|
91
91
|
10.times do
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
92
|
+
req1.send_message(r1_msg) do |message|
|
93
|
+
received_count += 1
|
94
|
+
message.name.should == r1_msg.name
|
95
|
+
end
|
96
|
+
req2.send_message(r2_msg) do |message|
|
97
|
+
received_count += 1
|
98
|
+
message.name.should == r2_msg.name
|
99
|
+
end
|
100
100
|
end
|
101
101
|
end
|
102
102
|
|
data/spec/node_spec.rb
CHANGED
@@ -56,9 +56,7 @@ describe DripDrop::Node do
|
|
56
56
|
|
57
57
|
describe "shutdown" do
|
58
58
|
before do
|
59
|
-
@ddn = DripDrop::Node.new {
|
60
|
-
zmq_subscribe(rand_addr,:bind) #Keeps ZMQMachine Happy
|
61
|
-
}
|
59
|
+
@ddn = DripDrop::Node.new {}
|
62
60
|
@ddn.start
|
63
61
|
sleep 0.1
|
64
62
|
@ddn.stop rescue nil
|
@@ -68,10 +66,6 @@ describe DripDrop::Node do
|
|
68
66
|
it "should stop EventMachine" do
|
69
67
|
EM.reactor_running?.should be_false
|
70
68
|
end
|
71
|
-
|
72
|
-
it "should stop ZMQMachine" do
|
73
|
-
@ddn.zm_reactor.running?.should be_false
|
74
|
-
end
|
75
69
|
end
|
76
70
|
|
77
71
|
describe "exceptions in EM reactor" do
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dripdrop
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 63
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 9
|
9
|
+
- 2
|
10
|
+
version: 0.9.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Andrew Cholakian
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-01
|
18
|
+
date: 2011-02-01 00:00:00 -08:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -75,7 +75,7 @@ dependencies:
|
|
75
75
|
type: :runtime
|
76
76
|
version_requirements: *id004
|
77
77
|
- !ruby/object:Gem::Dependency
|
78
|
-
name:
|
78
|
+
name: em-zeromq
|
79
79
|
prerelease: false
|
80
80
|
requirement: &id005 !ruby/object:Gem::Requirement
|
81
81
|
none: false
|
@@ -103,7 +103,7 @@ dependencies:
|
|
103
103
|
type: :runtime
|
104
104
|
version_requirements: *id006
|
105
105
|
- !ruby/object:Gem::Dependency
|
106
|
-
name:
|
106
|
+
name: yajl-ruby
|
107
107
|
prerelease: false
|
108
108
|
requirement: &id007 !ruby/object:Gem::Requirement
|
109
109
|
none: false
|