zmqmachine 0.5.0 → 0.5.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/History.txt CHANGED
@@ -1,3 +1,25 @@
1
+ == 0.5.2 / 2011-07-21
2
+ * Added PUSH and PULL socket types. Never needed them until now.
3
+ * Added a +context+ reader to the Reactor class.
4
+ * Changed default behavior for all sockets to use ZMQ:LINGER 1
5
+ as a socket option. By default, this prevents a call to
6
+ #close from hanging forever if there are unsent messages in
7
+ queue.
8
+ * Expose #logger accessor (read-only).
9
+ * Refactored Reactor#log so that most of the work is performed in
10
+ the LogClient (tell, don't ask!).
11
+ * Added LogClient#puts so that a logger instance can be passed to
12
+ other objects who expect an IO-like object that responds to #puts.
13
+
14
+ == 0.5.1 / 2011-05-03
15
+ * Added Reactor#oneshot_timer_at for scheduling a timer to fire at
16
+ an exact time.
17
+ * Changed Reactor#next_tick to use #shift instead of #pop for running
18
+ blocks. Originally it was running the blocks in the reverse order
19
+ that #next_tick was called. Blocks are now run in the *same* order
20
+ as they were created by a call to #next_tick.
21
+ * Added a timestamp to all messages created using Reactor#log.
22
+
1
23
  == 0.5.0 / 2011-03-3
2
24
  * Changed the constructor for the ZM::Reactor class. It now takes
3
25
  an optional third hash argument. One of the keys that it uses
data/lib/zm/log_client.rb CHANGED
@@ -71,10 +71,17 @@ module ZMQMachine
71
71
  # All messages passed here are guaranteed to be written in the *order they were
72
72
  # received*.
73
73
  #
74
- def write messages
75
- @message_queue << messages
74
+ def write level, message
75
+ now = Time.now
76
+ usec = sprintf "%06d", now.usec
77
+ timestamp = now.strftime "%Y%m%d-%H:%M:%S.#{usec} %Z"
78
+ @message_queue << [ZMQ::Message.new(level.to_s), ZMQ::Message.new(timestamp), ZMQ::Message.new(message.to_s)]
76
79
  write_queue_to_socket
77
80
  end
81
+
82
+ def puts string
83
+ write 'untagged', string
84
+ end
78
85
 
79
86
  # Prints each message when global debugging is enabled.
80
87
  #
data/lib/zm/reactor.rb CHANGED
@@ -37,7 +37,7 @@
37
37
  module ZMQMachine
38
38
 
39
39
  class Reactor
40
- attr_reader :name
40
+ attr_reader :name, :context, :logger
41
41
 
42
42
  # +name+ provides a name for this reactor instance. It's unused
43
43
  # at present but may be used in the future for allowing multiple
@@ -73,7 +73,14 @@ module ZMQMachine
73
73
  @proc_queue_mutex = Mutex.new
74
74
 
75
75
  # could raise if it fails
76
- @context = opts[:zeromq_context] || ZMQ::Context.new
76
+ @context = if opts[:zeromq_context]
77
+ @shared_context = true
78
+ opts[:zeromq_context]
79
+ else
80
+ @shared_context = false
81
+ ZMQ::Context.new
82
+ end
83
+
77
84
  @poller = ZMQ::Poller.new
78
85
  @sockets = []
79
86
  @raw_to_socket = {}
@@ -85,6 +92,10 @@ module ZMQMachine
85
92
  end
86
93
  end
87
94
 
95
+ def shared_context?
96
+ @shared_context
97
+ end
98
+
88
99
  # Returns true when the reactor is running OR while it is in the
89
100
  # midst of a shutdown request.
90
101
  #
@@ -115,16 +126,16 @@ module ZMQMachine
115
126
  end
116
127
 
117
128
  # Marks the reactor as eligible for termination. Then waits for the
118
- # reactor thread to exit via #join (no timeout).
129
+ # reactor thread to exit via #join (optional timeout).
119
130
  #
120
131
  # The reactor is not forcibly terminated if it is currently blocked
121
132
  # by some long-running operation. Use #kill to forcibly terminate
122
133
  # the reactor.
123
134
  #
124
- def stop
135
+ def stop delay = nil
125
136
  # wait until the thread loops around again and exits on its own
126
137
  @stopping = true
127
- join
138
+ join delay
128
139
  end
129
140
 
130
141
  # Join on the thread running this reactor instance. Default behavior
@@ -157,9 +168,9 @@ module ZMQMachine
157
168
  #
158
169
  def kill
159
170
  if running?
171
+ cleanup
160
172
  @stopping = true
161
173
  @thread.kill
162
- cleanup
163
174
  end
164
175
  end
165
176
 
@@ -307,6 +318,40 @@ module ZMQMachine
307
318
  sock
308
319
  end
309
320
 
321
+ # Creates a PUSH socket and attaches +handler_instance+ to the
322
+ # resulting socket. Usually paired with one or more
323
+ # #pull_socket in the same or different reactor context.
324
+ #
325
+ # +handler_instance+ must implement the #on_writable and
326
+ # #on_writable_error methods. The reactor will call those methods
327
+ # based upon new events. This socket type can *only* write; it
328
+ # can never recv messages.
329
+ #
330
+ # All handlers must implement the #on_attach method.
331
+ #
332
+ def push_socket handler_instance
333
+ sock = ZMQMachine::Socket::Push.new @context, handler_instance
334
+ save_socket sock
335
+ sock
336
+ end
337
+
338
+ # Creates a PULL socket and attaches +handler_instance+ to the
339
+ # resulting socket. Usually paired with one or more
340
+ # #push_socket in the same or different reactor context.
341
+ #
342
+ # +handler_instance+ must implement the #on_readable and
343
+ # #on_readable_error methods. The reactor will call those methods
344
+ # based upon new events. This socket type can *only* read; it
345
+ # can never write/send messages.
346
+ #
347
+ # All handlers must implement the #on_attach method.
348
+ #
349
+ def pull_socket handler_instance
350
+ sock = ZMQMachine::Socket::Pull.new @context, handler_instance
351
+ save_socket sock
352
+ sock
353
+ end
354
+
310
355
  # Registers the +sock+ for POLLOUT events that will cause the
311
356
  # reactor to call the handler's on_writable method.
312
357
  #
@@ -346,6 +391,16 @@ module ZMQMachine
346
391
  @timers.add_oneshot delay, blk
347
392
  end
348
393
 
394
+ # Creates a timer that will fire once at a specific
395
+ # time as returned by ZM::Timers.now_converted.
396
+ #
397
+ # +exact_time+ may be either a Time object or a Numeric.
398
+ #
399
+ def oneshot_timer_at exact_time, timer_proc = nil, &blk
400
+ blk ||= timer_proc
401
+ @timers.add_oneshot_at exact_time, blk
402
+ end
403
+
349
404
  # Creates a timer that will fire every +delay+ milliseconds until
350
405
  # it is explicitly cancelled. Expects either a +timer_proc+ proc
351
406
  # or a block, otherwise no timer is created.
@@ -405,9 +460,14 @@ module ZMQMachine
405
460
  # When no :log_transport was defined when creating the Reactor, all calls
406
461
  # just discard the messages.
407
462
  #
463
+ # reactor.log(:info, "some message")
464
+ #
465
+ # This produces output that looks like:
466
+ # info|20110526-10:23:47.768796 CDT|some message
467
+ #
408
468
  def log level, message
409
469
  if @logging_enabled
410
- @logger.write [ZMQ::Message.new(level.to_s), ZMQ::Message.new(message.to_s)]
470
+ @logger.write level, message
411
471
  end
412
472
  end
413
473
 
@@ -423,9 +483,11 @@ module ZMQMachine
423
483
  # Close each open socket and terminate the reactor context; this will
424
484
  # release the native memory backing each of these objects
425
485
  def cleanup
486
+ @proc_queue_mutex.synchronize { @proc_queue.clear }
487
+
426
488
  # work on a dup since #close_socket deletes from @sockets
427
489
  @sockets.dup.each { |sock| close_socket sock }
428
- @context.terminate
490
+ @context.terminate unless shared_context?
429
491
  @running = false
430
492
  end
431
493
 
@@ -443,7 +505,7 @@ module ZMQMachine
443
505
  end
444
506
 
445
507
  until work.empty? do
446
- work.pop.call
508
+ work.shift.call
447
509
  end
448
510
  end
449
511
 
@@ -454,7 +516,7 @@ module ZMQMachine
454
516
  # doing so spikes the CPU even though there is no work to do
455
517
  # take a short nap here (10ms by default) unless there are procs scheduled
456
518
  # to run (e.g. via next_tick)
457
- sleep(@poll_interval / 1000)
519
+ sleep(@poll_interval / 1000.0)
458
520
  else
459
521
  @poller.poll @poll_interval
460
522
  end
@@ -472,9 +534,11 @@ module ZMQMachine
472
534
  # Returns true when all steps succeed, false otherwise
473
535
  #
474
536
  def delete_socket sock
475
- @poller.delete(sock.raw_socket) and
476
- @sockets.delete(sock) and
477
- @raw_to_socket.delete(sock.raw_socket)
537
+ poll_deleted = @poller.delete(sock.raw_socket)
538
+ sockets_deleted = @sockets.delete(sock)
539
+ ffi_deleted = @raw_to_socket.delete(sock.raw_socket)
540
+
541
+ poll_deleted && sockets_deleted && ffi_deleted
478
542
  end
479
543
 
480
544
 
@@ -43,13 +43,16 @@ module ZMQMachine
43
43
  attr_reader :poll_options
44
44
 
45
45
  def initialize context, handler
46
- @state = :init
47
46
  @context = context
48
47
  @bindings = []
49
48
  @connections = []
50
49
 
51
50
  @handler = handler
52
51
  @raw_socket = allocate_socket @context
52
+
53
+ # default ZMQ::LINGER to 1 millisecond so closing a socket
54
+ # doesn't block forever
55
+ @raw_socket.setsockopt ZMQ::LINGER, 1
53
56
  attach @handler
54
57
  end
55
58
 
@@ -168,13 +171,13 @@ module ZMQMachine
168
171
 
169
172
  # loop and deliver all messages until the socket returns EAGAIN
170
173
  while 0 == rc
171
- messages = []
172
- rc = read_message_part messages
174
+ parts = []
175
+ rc = read_message_part parts
173
176
  #puts "resume_read: rc1 [#{rc}], more_parts? [#{@raw_socket.more_parts?}]"
174
177
 
175
178
  while 0 == rc && @raw_socket.more_parts?
176
179
  #puts "get next part"
177
- rc = read_message_part messages
180
+ rc = read_message_part parts
178
181
  #puts "resume_read: rc2 [#{rc}]"
179
182
  end
180
183
  #puts "no more parts, ready to deliver"
@@ -182,36 +185,31 @@ module ZMQMachine
182
185
  # only deliver the messages when rc is 0; otherwise, we
183
186
  # may have gotten EAGAIN and no message was read;
184
187
  # don't deliver empty messages
185
- deliver messages, rc if 0 == rc
188
+ deliver parts, rc if 0 == rc
186
189
  end
187
190
  end
188
191
 
189
192
  # Used by the reactor. Never called by user code.
190
193
  #
191
194
  def resume_write
192
- @state = :ready
193
195
  @handler.on_writable self
194
196
  end
195
197
 
196
198
  def inspect
197
- "kind [#{@kind}] poll options [#{@poll_options}] state [#{@state}]"
199
+ "kind [#{@kind}] poll options [#{@poll_options}]"
198
200
  end
199
201
 
200
202
 
201
203
  private
202
204
 
203
- def ready_state?
204
- :ready == @state
205
- end
206
-
207
- def read_message_part messages
205
+ def read_message_part parts
208
206
  message = ZMQ::Message.new
209
207
  begin
210
208
  rc = @raw_socket.recv message, ZMQ::NOBLOCK
211
209
 
212
210
  if rc
213
211
  rc = 0 # callers expect 0 for success, not true
214
- messages << message
212
+ parts << message
215
213
  else
216
214
  # got EAGAIN most likely
217
215
  message.close
@@ -227,11 +225,10 @@ module ZMQMachine
227
225
  rc
228
226
  end
229
227
 
230
- def deliver messages, rc
231
- #puts "deliver: rc [#{rc}], messages #{messages.inspect}"
228
+ def deliver parts, rc
229
+ #puts "deliver: rc [#{rc}], parts #{parts.inspect}"
232
230
  if 0 == rc
233
- @state = :ready
234
- @handler.on_readable self, messages
231
+ @handler.on_readable self, parts
235
232
  else
236
233
  # this branch is never called
237
234
  @handler.on_readable_error self, rc
@@ -0,0 +1,78 @@
1
+ #--
2
+ #
3
+ # Author:: Chuck Remes
4
+ # Homepage:: http://github.com/chuckremes/zmqmachine
5
+ # Date:: 20110721
6
+ #
7
+ #----------------------------------------------------------------------------
8
+ #
9
+ # Copyright (C) 2011 by Chuck Remes. All Rights Reserved.
10
+ # Email: cremes at mac dot com
11
+ #
12
+ # (The MIT License)
13
+ #
14
+ # Permission is hereby granted, free of charge, to any person obtaining
15
+ # a copy of this software and associated documentation files (the
16
+ # 'Software'), to deal in the Software without restriction, including
17
+ # without limitation the rights to use, copy, modify, merge, publish,
18
+ # distribute, sublicense, and/or sell copies of the Software, and to
19
+ # permit persons to whom the Software is furnished to do so, subject to
20
+ # the following conditions:
21
+ #
22
+ # The above copyright notice and this permission notice shall be
23
+ # included in all copies or substantial portions of the Software.
24
+ #
25
+ # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
26
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
28
+ # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
29
+ # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
30
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
31
+ # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32
+ #
33
+ #---------------------------------------------------------------------------
34
+ #
35
+ #
36
+
37
+ module ZMQMachine
38
+
39
+ module Socket
40
+
41
+ class Pull
42
+ include ZMQMachine::Socket::Base
43
+
44
+ def initialize context, handler
45
+ @poll_options = ZMQ::POLLIN
46
+ @kind = :pull
47
+
48
+ super
49
+ end
50
+
51
+ # Attach a handler to the PULL socket.
52
+ #
53
+ # A PULL socket may *only* receive messages.
54
+ #
55
+ # This socket expects its +handler+ to
56
+ # implement the #on_readable method.
57
+ # The #on_readable method will be called whenever a
58
+ # message may be dequeued without blocking.
59
+ #
60
+ # For error handling purposes, the handler must also
61
+ # implement #on_readable_error.
62
+ #
63
+ def on_attach handler
64
+ raise ArgumentError, "Handler must implement an #on_readable method" unless handler.respond_to? :on_readable
65
+ raise ArgumentError, "Handler must implement an #on_readable_error method" unless handler.respond_to? :on_readable_error
66
+ super
67
+ end
68
+
69
+ private
70
+
71
+ def allocate_socket context
72
+ ZMQ::Socket.new context.pointer, ZMQ::PULL
73
+ end
74
+ end # class Pull
75
+
76
+ end # module Socket
77
+
78
+ end # module ZMQMachine
@@ -0,0 +1,79 @@
1
+ #--
2
+ #
3
+ # Author:: Chuck Remes
4
+ # Homepage:: http://github.com/chuckremes/zmqmachine
5
+ # Date:: 20110721
6
+ #
7
+ #----------------------------------------------------------------------------
8
+ #
9
+ # Copyright (C) 2011 by Chuck Remes. All Rights Reserved.
10
+ # Email: cremes at mac dot com
11
+ #
12
+ # (The MIT License)
13
+ #
14
+ # Permission is hereby granted, free of charge, to any person obtaining
15
+ # a copy of this software and associated documentation files (the
16
+ # 'Software'), to deal in the Software without restriction, including
17
+ # without limitation the rights to use, copy, modify, merge, publish,
18
+ # distribute, sublicense, and/or sell copies of the Software, and to
19
+ # permit persons to whom the Software is furnished to do so, subject to
20
+ # the following conditions:
21
+ #
22
+ # The above copyright notice and this permission notice shall be
23
+ # included in all copies or substantial portions of the Software.
24
+ #
25
+ # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
26
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
28
+ # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
29
+ # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
30
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
31
+ # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32
+ #
33
+ #---------------------------------------------------------------------------
34
+ #
35
+ #
36
+
37
+ module ZMQMachine
38
+
39
+ module Socket
40
+
41
+ class Push
42
+ include ZMQMachine::Socket::Base
43
+
44
+ def initialize context, handler
45
+ @poll_options = ZMQ::POLLOUT
46
+ @kind = :push
47
+
48
+ super
49
+ end
50
+
51
+ # Attach a handler to the PUSH socket.
52
+ #
53
+ # A PUSH socket may *only* send messages.
54
+ #
55
+ # This socket expects its +handler+ to
56
+ # implement the #on_writable methods.
57
+ # The #on_writable method will be called whenever a
58
+ # message may be enqueued without blocking.
59
+ #
60
+ # For error handling purposes, the handler must also
61
+ # implement #on_writable_error.
62
+ #
63
+ def on_attach handler
64
+ raise ArgumentError, "Handler must implement an #on_writable method" unless handler.respond_to? :on_writable
65
+ raise ArgumentError, "Handler must implement an #on_writable_error method" unless handler.respond_to? :on_writable_error
66
+ super
67
+ end
68
+
69
+ private
70
+
71
+ def allocate_socket context
72
+ sock = ZMQ::Socket.new context.pointer, ZMQ::PUSH
73
+ sock
74
+ end
75
+ end # class Push
76
+
77
+ end # module Socket
78
+
79
+ end # module ZMQMachine
data/lib/zm/sockets.rb CHANGED
@@ -1,4 +1,4 @@
1
1
 
2
- %w( base req rep pair pub sub xreq xrep ).each do |rb_file|
2
+ %w( base req rep pair pub sub xreq xrep push pull ).each do |rb_file|
3
3
  require File.join(File.dirname(__FILE__), 'sockets', rb_file)
4
4
  end
data/lib/zm/timers.rb CHANGED
@@ -66,7 +66,19 @@ module ZMQMachine
66
66
  blk ||= timer_proc
67
67
  return nil unless blk
68
68
 
69
- timer = Timer.new self, delay, false, blk
69
+ timer = Timer.new :timers => self, :delay => delay, :periodical => false, :timer_proc => blk
70
+ add timer
71
+ timer
72
+ end
73
+
74
+ # Adds a non-periodical, one-shot timer to be fired at
75
+ # the specified time.
76
+ #
77
+ def add_oneshot_at exact_time, timer_proc = nil, &blk
78
+ blk ||= timer_proc
79
+ return nil unless blk
80
+
81
+ timer = Timer.new :timers => self, :exact_time => exact_time, :periodical => false, :timer_proc => blk
70
82
  add timer
71
83
  timer
72
84
  end
@@ -82,7 +94,7 @@ module ZMQMachine
82
94
  blk ||= timer_proc
83
95
  return nil unless blk
84
96
 
85
- timer = Timer.new self, delay, true, blk
97
+ timer = Timer.new :timers => self, :delay => delay, :periodical => true, :timer_proc => blk
86
98
  add timer
87
99
  timer
88
100
  end
@@ -249,11 +261,12 @@ module ZMQMachine
249
261
 
250
262
  # +delay+ is in milliseconds
251
263
  #
252
- def initialize timers, delay, periodical, timer_proc = nil, &blk
253
- @timers = timers
254
- @delay = delay.to_i
255
- @periodical = periodical
256
- @timer_proc = timer_proc || blk
264
+ def initialize opts
265
+ @timers = opts[:timers]
266
+ @delay = opts[:delay].to_i
267
+ @periodical = opts[:periodical]
268
+ @timer_proc = opts[:timer_proc]
269
+ @exact_time = opts[:exact_time]
257
270
  schedule_firing_time
258
271
  end
259
272
 
@@ -328,9 +341,13 @@ module ZMQMachine
328
341
  # next timer to fire at, 17 + delay 5 = 22
329
342
  # had it not been late, it would fire at 20
330
343
  def schedule_firing_time
331
- @initiated = Timers.now
344
+ if @exact_time
345
+ @fire_time = @exact_time.to_f * 1_000
346
+ else
347
+ @initiated = Timers.now
332
348
 
333
- @fire_time = @initiated + @delay
349
+ @fire_time = @initiated + @delay
350
+ end
334
351
  end
335
352
 
336
353
  end # class Timer
data/version.txt CHANGED
@@ -1 +1 @@
1
- 0.5.0
1
+ 0.5.2
data/zmqmachine.gemspec CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{zmqmachine}
5
- s.version = "0.5.0"
5
+ s.version = "0.5.2"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Chuck Remes"]
9
- s.date = %q{2010-12-22}
9
+ s.date = %q{2011-07-21}
10
10
  s.description = %q{ZMQMachine is another Ruby implementation of the reactor pattern but this
11
11
  time using 0mq sockets rather than POSIX sockets.
12
12
 
@@ -22,7 +22,7 @@ It is possible to extend the 0mq library to "poll" normal file
22
22
  descriptors. This isn't on my roadmap but patches are accepted.}
23
23
  s.email = %q{cremes@mac.com}
24
24
  s.extra_rdoc_files = ["History.txt", "README.rdoc", "version.txt"]
25
- s.files = [".bnsignore", "History.txt", "README.rdoc", "Rakefile", "examples/fake_ftp.rb", "examples/one_handed_ping_pong.rb", "examples/ping_pong.rb", "examples/pub_sub.rb", "examples/pubsub_forwarder.rb", "examples/throttled_ping_pong.rb", "lib/zm/address.rb", "lib/zm/deferrable.rb", "lib/zm/devices.rb", "lib/zm/devices/forwarder.rb", "lib/zm/devices/queue.rb", "lib/zm/exceptions.rb", "lib/zm/log_client.rb", "lib/zm/message.rb", "lib/zm/reactor.rb", "lib/zm/sockets.rb", "lib/zm/sockets/base.rb", "lib/zm/sockets/pair.rb", "lib/zm/sockets/pub.rb", "lib/zm/sockets/rep.rb", "lib/zm/sockets/req.rb", "lib/zm/sockets/sub.rb", "lib/zm/sockets/xrep.rb", "lib/zm/sockets/xreq.rb", "lib/zm/timers.rb", "lib/zmqmachine.rb", "spec/spec_helper.rb", "spec/reactor_spec.rb", "version.txt", "zmqmachine.gemspec"]
25
+ s.files = [".bnsignore", "History.txt", "README.rdoc", "Rakefile", "examples/fake_ftp.rb", "examples/one_handed_ping_pong.rb", "examples/ping_pong.rb", "examples/pub_sub.rb", "examples/pubsub_forwarder.rb", "examples/throttled_ping_pong.rb", "lib/zm/address.rb", "lib/zm/deferrable.rb", "lib/zm/devices.rb", "lib/zm/devices/forwarder.rb", "lib/zm/devices/queue.rb", "lib/zm/exceptions.rb", "lib/zm/log_client.rb", "lib/zm/message.rb", "lib/zm/reactor.rb", "lib/zm/sockets.rb", "lib/zm/sockets/base.rb", "lib/zm/sockets/pair.rb", "lib/zm/sockets/pub.rb", "lib/zm/sockets/rep.rb", "lib/zm/sockets/req.rb", "lib/zm/sockets/sub.rb", "lib/zm/sockets/xrep.rb", "lib/zm/sockets/xreq.rb", "lib/zm/sockets/push.rb", "lib/zm/sockets/pull.rb", "lib/zm/timers.rb", "lib/zmqmachine.rb", "spec/spec_helper.rb", "spec/reactor_spec.rb", "version.txt", "zmqmachine.gemspec"]
26
26
  s.homepage = %q{http://github.com/chuckremes/zmqmachine}
27
27
  s.rdoc_options = ["--main", "README.rdoc"]
28
28
  s.require_paths = ["lib"]
metadata CHANGED
@@ -1,55 +1,40 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zmqmachine
3
3
  version: !ruby/object:Gem::Version
4
- hash: 11
5
4
  prerelease:
6
- segments:
7
- - 0
8
- - 5
9
- - 0
10
- version: 0.5.0
5
+ version: 0.5.2
11
6
  platform: ruby
12
7
  authors:
13
- - Chuck Remes
8
+ - Chuck Remes
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
12
 
18
- date: 2010-12-22 00:00:00 -06:00
13
+ date: 2011-07-21 00:00:00 -05:00
19
14
  default_executable:
20
15
  dependencies:
21
- - !ruby/object:Gem::Dependency
22
- name: ffi-rzmq
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- hash: 3
30
- segments:
31
- - 0
32
- - 7
33
- - 0
34
- version: 0.7.0
35
- type: :runtime
36
- version_requirements: *id001
37
- - !ruby/object:Gem::Dependency
38
- name: bones
39
- prerelease: false
40
- requirement: &id002 !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
43
- - - ">="
44
- - !ruby/object:Gem::Version
45
- hash: 27
46
- segments:
47
- - 3
48
- - 5
49
- - 4
50
- version: 3.5.4
51
- type: :development
52
- version_requirements: *id002
16
+ - !ruby/object:Gem::Dependency
17
+ name: ffi-rzmq
18
+ prerelease: false
19
+ requirement: &id001 !ruby/object:Gem::Requirement
20
+ none: false
21
+ requirements:
22
+ - - ">="
23
+ - !ruby/object:Gem::Version
24
+ version: 0.7.0
25
+ type: :runtime
26
+ version_requirements: *id001
27
+ - !ruby/object:Gem::Dependency
28
+ name: bones
29
+ prerelease: false
30
+ requirement: &id002 !ruby/object:Gem::Requirement
31
+ none: false
32
+ requirements:
33
+ - - ">="
34
+ - !ruby/object:Gem::Version
35
+ version: 3.5.4
36
+ type: :development
37
+ version_requirements: *id002
53
38
  description: |-
54
39
  ZMQMachine is another Ruby implementation of the reactor pattern but this
55
40
  time using 0mq sockets rather than POSIX sockets.
@@ -70,76 +55,72 @@ executables: []
70
55
  extensions: []
71
56
 
72
57
  extra_rdoc_files:
73
- - History.txt
74
- - README.rdoc
75
- - version.txt
58
+ - History.txt
59
+ - README.rdoc
60
+ - version.txt
76
61
  files:
77
- - .bnsignore
78
- - History.txt
79
- - README.rdoc
80
- - Rakefile
81
- - examples/fake_ftp.rb
82
- - examples/one_handed_ping_pong.rb
83
- - examples/ping_pong.rb
84
- - examples/pub_sub.rb
85
- - examples/pubsub_forwarder.rb
86
- - examples/throttled_ping_pong.rb
87
- - lib/zm/address.rb
88
- - lib/zm/deferrable.rb
89
- - lib/zm/devices.rb
90
- - lib/zm/devices/forwarder.rb
91
- - lib/zm/devices/queue.rb
92
- - lib/zm/exceptions.rb
93
- - lib/zm/log_client.rb
94
- - lib/zm/message.rb
95
- - lib/zm/reactor.rb
96
- - lib/zm/sockets.rb
97
- - lib/zm/sockets/base.rb
98
- - lib/zm/sockets/pair.rb
99
- - lib/zm/sockets/pub.rb
100
- - lib/zm/sockets/rep.rb
101
- - lib/zm/sockets/req.rb
102
- - lib/zm/sockets/sub.rb
103
- - lib/zm/sockets/xrep.rb
104
- - lib/zm/sockets/xreq.rb
105
- - lib/zm/timers.rb
106
- - lib/zmqmachine.rb
107
- - spec/spec_helper.rb
108
- - spec/reactor_spec.rb
109
- - version.txt
110
- - zmqmachine.gemspec
62
+ - .bnsignore
63
+ - History.txt
64
+ - README.rdoc
65
+ - Rakefile
66
+ - examples/fake_ftp.rb
67
+ - examples/one_handed_ping_pong.rb
68
+ - examples/ping_pong.rb
69
+ - examples/pub_sub.rb
70
+ - examples/pubsub_forwarder.rb
71
+ - examples/throttled_ping_pong.rb
72
+ - lib/zm/address.rb
73
+ - lib/zm/deferrable.rb
74
+ - lib/zm/devices.rb
75
+ - lib/zm/devices/forwarder.rb
76
+ - lib/zm/devices/queue.rb
77
+ - lib/zm/exceptions.rb
78
+ - lib/zm/log_client.rb
79
+ - lib/zm/message.rb
80
+ - lib/zm/reactor.rb
81
+ - lib/zm/sockets.rb
82
+ - lib/zm/sockets/base.rb
83
+ - lib/zm/sockets/pair.rb
84
+ - lib/zm/sockets/pub.rb
85
+ - lib/zm/sockets/rep.rb
86
+ - lib/zm/sockets/req.rb
87
+ - lib/zm/sockets/sub.rb
88
+ - lib/zm/sockets/xrep.rb
89
+ - lib/zm/sockets/xreq.rb
90
+ - lib/zm/sockets/push.rb
91
+ - lib/zm/sockets/pull.rb
92
+ - lib/zm/timers.rb
93
+ - lib/zmqmachine.rb
94
+ - spec/spec_helper.rb
95
+ - spec/reactor_spec.rb
96
+ - version.txt
97
+ - zmqmachine.gemspec
111
98
  has_rdoc: true
112
99
  homepage: http://github.com/chuckremes/zmqmachine
113
100
  licenses: []
114
101
 
115
102
  post_install_message:
116
103
  rdoc_options:
117
- - --main
118
- - README.rdoc
104
+ - --main
105
+ - README.rdoc
119
106
  require_paths:
120
- - lib
107
+ - lib
121
108
  required_ruby_version: !ruby/object:Gem::Requirement
122
109
  none: false
123
110
  requirements:
124
- - - ">="
125
- - !ruby/object:Gem::Version
126
- hash: 3
127
- segments:
128
- - 0
129
- version: "0"
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: "0"
130
114
  required_rubygems_version: !ruby/object:Gem::Requirement
131
115
  none: false
132
116
  requirements:
133
- - - ">="
134
- - !ruby/object:Gem::Version
135
- hash: 3
136
- segments:
137
- - 0
138
- version: "0"
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ version: "0"
139
120
  requirements: []
140
121
 
141
122
  rubyforge_project: zmqmachine
142
- rubygems_version: 1.5.2
123
+ rubygems_version: 1.5.1
143
124
  signing_key:
144
125
  specification_version: 3
145
126
  summary: ZMQMachine is another Ruby implementation of the reactor pattern but this time using 0mq sockets rather than POSIX sockets.