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