cztop-reactor 0.7.0 → 1.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7e017a75dd5e337e33e1340e765a2d9a25b4537c2d5ae9416c836e5f29f1f514
4
- data.tar.gz: 015bb511a4955accc92c03f4f94887ca6b3ea7427d3840138053a85e14934661
3
+ metadata.gz: 1ad7473bbe7845c9a821e047efe656f695b97162f3412fd6beaf1c847c238c3e
4
+ data.tar.gz: 794025b550553a5b4ea94bd1960464b23ac0eb73502a26dd1914df340c51a61b
5
5
  SHA512:
6
- metadata.gz: 3ed15bc7f31360a04d4a076af0dc711a2c6d3b42f4711af9eb131eca681d28d66e04e639b766fd95f5acac81a625c2f90e4465817f5b9ed8a5c8b5d18e0086a1
7
- data.tar.gz: ff7d4d53270b16dc0af808f41052557b1810606d60ccac53d8fff99568fd53ca971da6066cefdd7c467b1a0db169cf64be06ed16b23ac3f1b6391b3e929bcece
6
+ metadata.gz: a6bdadd7d02f5627962b77d1d070afeb716a9d92f92fe80e7d32beffb40b617f951a76fbc4a8e96aebbb5ca71b846464b0af687cc31652baecd9bad5efc491f3
7
+ data.tar.gz: d04503ba29996ee6e8fffdcee28aa605bf65bdce210a5757944d6e5c10cfee2096b4b8d7f6b3ccdf8fb44fcb5f0cfc2fe255a8cf00a517c247f3d4cb83240e0e
checksums.yaml.gz.sig CHANGED
Binary file
data/History.md CHANGED
@@ -1,3 +1,36 @@
1
+ # Release History for cztop-reactor
2
+
3
+ ---
4
+
5
+ ## v1.0.0 [2022-04-27] Mahlon E. Smith <mahlon@martini.nu>
6
+
7
+ - Bump cztop depdendency
8
+ - Use rake-deveiate instead of hoe for rake management
9
+
10
+
11
+ ## v0.9.0 [2019-07-10] Michael Granger <ged@FaerieMUD.org>
12
+
13
+ Improvements
14
+
15
+ - Fix a bug in signal handling
16
+ - Work around CZTop's mapping of EINTR in a poller_wait to an Interrupt
17
+
18
+
19
+ ## v0.8.0 [2019-05-22] Michael Granger <ged@FaerieMUD.org>
20
+
21
+ Bugfixes:
22
+
23
+ - Fix several issues with socket monitoring.
24
+ - Fix bug in signal-handler teardown
25
+ - Super from the socket monitoring mixin
26
+
27
+ Enhancements:
28
+
29
+ - Add a #sockets_description method to the Reactor.
30
+ - Turn on verbose on monitors if $VERBOSE is set
31
+ - Super to monitor event handler methods if possible
32
+
33
+
1
34
  ## v0.7.0 [2018-07-23] Michael Granger <ged@FaerieMUD.org>
2
35
 
3
36
  Enhancements:
data/Manifest.txt CHANGED
@@ -1,7 +1,6 @@
1
1
  .document
2
2
  .rdoc_options
3
3
  .simplecov
4
- ChangeLog
5
4
  History.md
6
5
  LICENSE.txt
7
6
  Manifest.txt
data/README.md CHANGED
@@ -1,10 +1,10 @@
1
1
  # CZTop-Reactor
2
2
 
3
3
  home
4
- : http://deveiate.org/projects/CZTop-Reactor
4
+ : https://hg.sr.ht/~ged/CZTop-Reactor
5
5
 
6
6
  code
7
- : http://bitbucket.org/ged/cztop-reactor
7
+ : https://hg.sr.ht/~ged/CZTop-Reactor/browse
8
8
 
9
9
  github
10
10
  : https://github.com/ged/cztop-reactor
@@ -44,7 +44,7 @@ this writing includes:
44
44
  * Rubinius (HEAD)
45
45
  * JRuby 9000 (HEAD)
46
46
 
47
- I am also using it (and CZTop) under MRI 2.4.
47
+ I am also using it (and CZTop) under MRI 2.6.
48
48
 
49
49
 
50
50
  ## Installation
@@ -69,7 +69,7 @@ distribute it as a gem for two reasons:
69
69
  ## Contributing
70
70
 
71
71
  You can check out the current development source with Mercurial via its
72
- {project page}[http://bitbucket.org/ged/cztop-reactor]. Or if you prefer Git,
72
+ {project page}[https://hg.sr.ht/~ged/CZTop-Reactor]. Or if you prefer Git,
73
73
  via {its Github mirror}[https://github.com/ged/cztop-reactor].
74
74
 
75
75
  After checking out the source, run:
@@ -104,7 +104,7 @@ License](http://opensource.org/licenses/ISC):
104
104
 
105
105
  Everything else is distributed under the same license but is:
106
106
 
107
- Copyright (c) 2017, Michael Granger
107
+ Copyright (c) 2017-2019, Michael Granger
108
108
 
109
109
 
110
110
  [POSA2]: http://www.cs.wustl.edu/~schmidt/POSA/POSA2/
data/Rakefile CHANGED
@@ -1,3 +1,14 @@
1
+ # -*- ruby -*-
2
+ # frozen_string_literal: true
3
+
4
+ require 'rake/deveiate'
5
+
6
+
7
+ Rake::DevEiate.setup( 'cztop-reactor' )
8
+
9
+
10
+ __END__
11
+
1
12
  #!/usr/bin/env rake
2
13
 
3
14
  begin
@@ -20,8 +31,8 @@ hoespec = Hoe.spec 'cztop-reactor' do |spec|
20
31
  self.history_file = 'History.md'
21
32
  self.extra_rdoc_files = FileList[ '*.rdoc', '*.md' ]
22
33
  self.urls = {
23
- home: 'http://deveiate.org/projects/cztop-reactor',
24
- code: 'http://bitbucket.org/ged/cztop-reactor',
34
+ home: 'https://hg.sr.ht/~ged/CZTop-Reactor',
35
+ code: 'https://hg.sr.ht/~ged/CZTop-Reactor/browse',
25
36
  docs: 'http://deveiate.org/code/cztop-reactor',
26
37
  github: 'http://github.com/ged/cztop-reactor',
27
38
  }
@@ -38,7 +49,7 @@ hoespec = Hoe.spec 'cztop-reactor' do |spec|
38
49
  spec.dependency 'simplecov', '~> 0.13', :developer
39
50
  spec.dependency 'rdoc-generator-fivefish', '~> 0.3', :developer
40
51
 
41
- spec.require_ruby_version( '>=2.2.4' )
52
+ spec.require_ruby_version( '>=2.4.0' )
42
53
  spec.hg_sign_tags = true if spec.respond_to?( :hg_sign_tags= )
43
54
  spec.check_history_on_release = true if spec.respond_to?( :check_history_on_release= )
44
55
 
@@ -64,7 +64,9 @@ module CZTop::Reactor::SignalHandling
64
64
  return yield
65
65
 
66
66
  ensure
67
+ self.log.debug "Going to reset signal traps..."
67
68
  self.reset_signal_traps( *signals )
69
+ self.log.debug "Going to clean up signal handler..."
68
70
  self.clean_up_signal_handling( reactor )
69
71
  end
70
72
 
@@ -99,19 +101,25 @@ module CZTop::Reactor::SignalHandling
99
101
 
100
102
  ### Tear down the data structures for signal handling
101
103
  def clean_up_signal_handling( reactor )
102
- reactor.unregister( @self_pipe[:reader] )
103
-
104
- @self_pipe[:writer].options.linger = 0
105
- @self_pipe[:writer].close
106
- @self_pipe[:reader].options.linger = 0
107
- @self_pipe[:reader].close
104
+ if @self_pipe
105
+ self.log.info "Cleaning up signal handler self-pipe."
106
+ reactor.unregister( @self_pipe[:reader] )
107
+
108
+ @self_pipe[:writer].options.linger = 0
109
+ @self_pipe[:writer].close
110
+ @self_pipe[:reader].options.linger = 0
111
+ @self_pipe[:reader].close
112
+ else
113
+ self.log.info "No self-pipe; skipping signal-handler cleanup."
114
+ end
108
115
 
109
116
  Thread.main[ SIGNAL_QUEUE_KEY ].clear
110
117
  end
111
118
 
112
119
 
113
120
  ### Look for any signals that arrived and handle them.
114
- def handle_queued_signals( _event )
121
+ def handle_queued_signals( event )
122
+ event.socket.wait
115
123
  while sig = Thread.main[ SIGNAL_QUEUE_KEY ].shift
116
124
  self.log.debug " got a queued signal: %p" % [ sig ]
117
125
  self.handle_signal( sig )
@@ -16,6 +16,7 @@ module CZTop::Reactor::SocketMonitoring
16
16
 
17
17
  ### Set up a monitor instance variable on object creation.
18
18
  def initialize( * ) # :notnew:
19
+ super if defined?( super )
19
20
  @monitor = nil
20
21
  end
21
22
 
@@ -26,7 +27,7 @@ module CZTop::Reactor::SocketMonitoring
26
27
 
27
28
  ### Run the block with monitoring for the specified +socket+.
28
29
  def with_socket_monitor( reactor, socket, *events )
29
- mon = self.set_up_socket_monitor( reactor, socket )
30
+ mon = self.set_up_socket_monitor( reactor, socket, *events )
30
31
 
31
32
  return yield
32
33
  ensure
@@ -43,6 +44,7 @@ module CZTop::Reactor::SocketMonitoring
43
44
  ### Tear down the monitor.
44
45
  def clean_up_socket_monitor( mon )
45
46
  mon.terminate if mon
47
+ self.log.debug "Monitor is: %p" % [ mon ]
46
48
  end
47
49
 
48
50
 
@@ -67,63 +69,109 @@ module CZTop::Reactor::SocketMonitoring
67
69
  protected
68
70
  #########
69
71
 
72
+
70
73
  ### Monitor event callback for socket connection events
71
74
  def on_connected( fd, endpoint )
72
75
  self.log.debug "Client socket on FD %d connected" % [ fd ]
76
+ super if defined?( super )
73
77
  end
74
78
 
75
79
 
76
80
  ### Monitor event callback for socket connection-delayed events
77
81
  def on_connect_delayed( fd, endpoint )
78
82
  self.log.debug "Client socket on FD %d connection delayed" % [ fd ]
83
+ super if defined?( super )
79
84
  end
80
85
 
81
86
 
82
87
  ### Monitor event callback for socket retry events
83
88
  def on_connect_retried( fd, endpoint )
84
89
  self.log.debug "Retrying connection for socket on FD %d" % [ fd ]
90
+ super if defined?( super )
91
+ end
92
+
93
+
94
+ ### Monitor event callback for listening events
95
+ def on_listening( fd, endpoint )
96
+ self.log.debug "Socket on FD %d is now listening for connections" % [ fd ]
97
+ super if defined?( super )
98
+ end
99
+
100
+
101
+ ### Monitor event callback for bind failure events
102
+ def on_bind_failed( fd, endpoint )
103
+ self.log.debug "Socket on FD %d could not be bound" % [ fd ]
104
+ super if defined?( super )
85
105
  end
86
106
 
87
107
 
88
108
  ### Monitor event callback for socket accepted events
89
109
  def on_accepted( fd, endpoint )
90
110
  self.log.debug "Client socket on FD %d accepted" % [ fd ]
111
+ super if defined?( super )
91
112
  end
92
113
 
93
114
 
94
- ### Monitor event callback for successful auth events.
95
- def on_handshake_succeeded( fd, endpoint )
96
- self.log.debug "Client socket on FD %d handshake succeeded" % [ fd ]
115
+ ### Monitor event callback for socket accept failed events
116
+ def on_accept_failed( fd, endpoint )
117
+ self.log.debug "Client socket on FD %d accept failed" % [ fd ]
118
+ super if defined?( super )
97
119
  end
98
120
 
99
121
 
100
- ### Monitor event callback for failed auth events.
101
- def on_handshake_failed( fd, endpoint )
102
- self.log.debug "Client socket on FD %d handshake failed" % [ fd ]
122
+ ### Monitor event callback for socket closed events
123
+ def on_closed( fd, endpoint )
124
+ self.log.debug "Client socket on FD %d closed" % [ fd ]
125
+ super if defined?( super )
126
+ end
127
+
128
+
129
+ ### Monitor event callback for socket close failed events
130
+ def on_close_failed( fd, endpoint )
131
+ self.log.debug "Close failed for socket on FD %d" % [ fd ]
132
+ super if defined?( super )
133
+ end
134
+
135
+
136
+ ### Monitor event callback for socket disconnection events
137
+ def on_disconnected( fd, endpoint )
138
+ self.log.debug "Client socket on FD %d disconnected" % [ fd ]
139
+ super if defined?( super )
140
+ end
141
+
142
+
143
+ ### Monitor event callback for monitor stopped events.
144
+ def on_monitor_stopped( fd, endpoint )
145
+ self.log.debug "Monitor for socket on FD %d stopped." % [ fd ]
146
+ super if defined?( super )
147
+ end
148
+
149
+
150
+ ### Monitor event callback for successful auth events.
151
+ def on_handshake_succeeded( fd, endpoint )
152
+ self.log.debug "Client socket on FD %d handshake succeeded" % [ fd ]
153
+ super if defined?( super )
103
154
  end
104
155
 
105
156
 
106
157
  ### Monitor event callback for failed handshake events.
107
158
  def on_handshake_failed_no_detail( fd, endpoint )
108
159
  self.log.debug "Client socket on FD %d handshake failed; no further details are known" % [ fd ]
160
+ super if defined?( super )
109
161
  end
110
162
 
111
163
 
112
164
  ### Monitor event callback for failed handshake events.
113
165
  def on_handshake_failed_protocol( fd, endpoint )
114
166
  self.log.debug "Client socket on FD %d handshake failed: protocol error" % [ fd ]
167
+ super if defined?( super )
115
168
  end
116
169
 
117
170
 
118
- ### Monitor event callback for socket closed events
119
- def on_closed( fd, endpoint )
120
- self.log.debug "Client socket on FD %d closed" % [ fd ]
121
- end
122
-
123
-
124
- ### Monitor event callback for socket disconnection events
125
- def on_disconnected( fd, endpoint )
126
- self.log.debug "Client socket on FD %d disconnected" % [ fd ]
171
+ ### Monitor event callback for failed auth events.
172
+ def on_handshake_failed_auth( fd, endpoint )
173
+ self.log.debug "Client socket on FD %d handshake failed: authentication failure" % [ fd ]
174
+ super if defined?( super )
127
175
  end
128
176
 
129
177
  end # module CZTop::Reactor::SocketMonitoring
data/lib/cztop/reactor.rb CHANGED
@@ -24,7 +24,7 @@ class CZTop::Reactor
24
24
  include MonitorMixin
25
25
 
26
26
  # The version of this library
27
- VERSION = '0.7.0'
27
+ VERSION = '1.0.0'
28
28
 
29
29
  # The maximum number of seconds to wait for events when there are no timers
30
30
  # registered.
@@ -36,6 +36,14 @@ class CZTop::Reactor
36
36
  write: CZTop::Poller::ZMQ::POLLOUT,
37
37
  }.freeze
38
38
 
39
+ # Errors encountered during the poll that should retry instead of raising
40
+ POLLER_RETRY_ERRORS = [
41
+ Errno::EINTR::Errno, # CZTop maps this to Interrupt, but it can be *any*
42
+ # signal, not just SIGINT
43
+ Errno::EAGAIN::Errno,
44
+ Errno::ETIMEDOUT::Errno,
45
+ ]
46
+
39
47
 
40
48
  autoload :Event, 'cztop/reactor/event'
41
49
 
@@ -282,16 +290,18 @@ class CZTop::Reactor
282
290
  ### registered with the reactor for the `:read` event with the specified +callback+,
283
291
  ### then returned.
284
292
  def register_monitor( socket, *events, &callback )
285
- if !events.empty? && !events.last.is_a?( String )
293
+ if !events.empty? && events.last.respond_to?( :handle_monitor_event )
286
294
  handler = events.pop
287
295
  callback = handler.method( :handle_monitor_event )
288
296
  end
289
297
 
298
+ events.map!( &:to_s )
290
299
  events.push( 'ALL' ) if events.empty?
291
300
 
292
301
  monitor = CZTop::Monitor.new( socket )
293
302
  monitor.listen( *events )
294
303
  monitor.start
304
+ monitor.verbose! if $VERBOSE
295
305
 
296
306
  self.register( monitor.actor, :read, &callback )
297
307
 
@@ -327,15 +337,19 @@ class CZTop::Reactor
327
337
 
328
338
  self.log.debug "Got event %p" % [ event ]
329
339
  if event
330
- # self.log.debug "Got event: %p" % [ event ]
331
- handler = self.sockets[ event.socket ][ :handler ]
332
- handler.call( event )
340
+ if event.socket
341
+ handler = self.sockets[ event.socket ][ :handler ]
342
+ handler.call( event )
343
+ else
344
+ self.log.warn "Got an event for an unregistered socket: racing to shut down?"
345
+ end
333
346
  else
334
347
  self.log.debug "Expired: firing timers."
335
348
  self.timers.fire
336
349
  end
337
350
 
338
- self.log.debug "%d sockets after polling: %p" % [ self.sockets.length, self.sockets ]
351
+ # self.log.debug "%d sockets after polling: %s" %
352
+ # [ self.sockets.length, self.sockets_description ]
339
353
  rescue Interrupt
340
354
  raise unless ignore_interrupts
341
355
  self.log.debug "Interrupted."
@@ -362,6 +376,21 @@ class CZTop::Reactor
362
376
  end
363
377
 
364
378
 
379
+ ### Return a description of the sockets registered with the reactor.
380
+ def sockets_description
381
+ return self.sockets.map do |sock, _|
382
+ case sock
383
+ when CZTop::Socket
384
+ "%s {%s}" % [ sock.class.name.sub(/.*::/, ''), sock.last_endpoint || 'not connected' ]
385
+ when CZTop::Actor
386
+ "Actor %#x" % [ sock.object_id * 2 ]
387
+ else
388
+ "??? %p ???" % [ sock.class ]
389
+ end
390
+ end.join( ', ' )
391
+ end
392
+
393
+
365
394
  #########
366
395
  protected
367
396
  #########
@@ -372,7 +401,10 @@ class CZTop::Reactor
372
401
  def wait( timeout=-1 )
373
402
  rc = CZTop::Poller::ZMQ.poller_wait( @poller_ptr, @event_ptr, timeout )
374
403
  if rc == -1
375
- if CZMQ::FFI::Errors.errno != Errno::ETIMEDOUT::Errno
404
+ case CZMQ::FFI::Errors.errno
405
+ when *POLLER_RETRY_ERRORS
406
+ # Retry if the error means we should
407
+ else
376
408
  CZTop::HasFFIDelegate.raise_zmq_err
377
409
  end
378
410
  return nil
@@ -7,8 +7,8 @@ require 'cztop/reactor/signal_handling'
7
7
 
8
8
  describe CZTop::Reactor::SignalHandling do
9
9
 
10
- it "can add a signal handler setup to a reactor for a block" do
11
- including_class = Class.new do
10
+ let( :including_class ) do
11
+ class_instance = Class.new do
12
12
 
13
13
  def initialize
14
14
  @signals = []
@@ -21,9 +21,12 @@ describe CZTop::Reactor::SignalHandling do
21
21
  end
22
22
 
23
23
  end
24
+ class_instance.include( described_class )
25
+ return class_instance
26
+ end
24
27
 
25
- including_class.include( described_class )
26
28
 
29
+ it "can add a signal handler setup to a reactor for a block" do
27
30
  obj = including_class.new
28
31
  reactor = CZTop::Reactor.new
29
32
 
@@ -38,10 +41,10 @@ describe CZTop::Reactor::SignalHandling do
38
41
 
39
42
 
40
43
  it "raises if the including class doesn't provide a #handle_signal method" do
41
- including_class = Class.new
42
- including_class.include( described_class )
44
+ test_class = Class.new
45
+ test_class.include( described_class )
43
46
 
44
- obj = including_class.new
47
+ obj = test_class.new
45
48
  reactor = CZTop::Reactor.new
46
49
 
47
50
  expect {
@@ -53,5 +56,23 @@ describe CZTop::Reactor::SignalHandling do
53
56
  }.to raise_error( NotImplementedError, /unhandled signal USR1/i )
54
57
  end
55
58
 
59
+
60
+ it "doesn't try to tear down signal handling if it didn't get set up" do
61
+ error_class = Class.new( StandardError )
62
+ allow( CZTop::Socket::PAIR ).to receive( :new ).
63
+ and_raise( error_class.new("something bad happened") )
64
+
65
+ obj = including_class.new
66
+ reactor = CZTop::Reactor.new
67
+
68
+ begin
69
+ obj.with_signal_handler( reactor, :USR1 ) do
70
+ fail "we shouldn't get here"
71
+ end
72
+ rescue error_class => err
73
+ expect( err.message ).to eq( "something bad happened" )
74
+ end
75
+ end
76
+
56
77
  end
57
78
 
@@ -29,7 +29,7 @@ describe CZTop::Reactor::SocketMonitoring do
29
29
  listener = CZTop::Socket::SERVER.new( '@tcp://127.0.0.1:*' )
30
30
  socket = CZTop::Socket::CLIENT.new
31
31
 
32
- obj.with_socket_monitor( reactor, socket, :CONNECTED ) do
32
+ obj.with_socket_monitor( reactor, socket ) do
33
33
  socket.connect( listener.last_endpoint )
34
34
  reactor.poll_once
35
35
  end
@@ -364,6 +364,16 @@ describe CZTop::Reactor do
364
364
  end
365
365
 
366
366
 
367
+ it "ignores EINTR by default" do
368
+ expect( CZTop::Poller::ZMQ ).to receive( :poller_wait ).
369
+ and_return( -1 )
370
+ expect( CZMQ::FFI::Errors ).to receive( :errno ).
371
+ and_return( Errno::EINTR::Errno )
372
+
373
+ expect( reactor.poll_once ).to be_nil
374
+ end
375
+
376
+
367
377
  it "has an option to propagate EGAIN/EWOULDBLOCK" do
368
378
  expect( CZTop::Poller::ZMQ ).to receive( :poller_wait ).
369
379
  and_raise( Errno::EAGAIN.new )
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,215 +1,139 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cztop-reactor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Granger
8
- autorequire:
8
+ - Mahlon E. Smith
9
+ autorequire:
9
10
  bindir: bin
10
11
  cert_chain:
11
12
  - |
12
13
  -----BEGIN CERTIFICATE-----
13
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
35
+ btEP+7EplFuoiMfd
37
36
  -----END CERTIFICATE-----
38
- date: 2018-07-24 00:00:00.000000000 Z
37
+ date: 2022-04-27 00:00:00.000000000 Z
39
38
  dependencies:
40
- - !ruby/object:Gem::Dependency
41
- name: loggability
42
- requirement: !ruby/object:Gem::Requirement
43
- requirements:
44
- - - "~>"
45
- - !ruby/object:Gem::Version
46
- version: '0.14'
47
- type: :runtime
48
- prerelease: false
49
- version_requirements: !ruby/object:Gem::Requirement
50
- requirements:
51
- - - "~>"
52
- - !ruby/object:Gem::Version
53
- version: '0.14'
54
39
  - !ruby/object:Gem::Dependency
55
40
  name: cztop
56
41
  requirement: !ruby/object:Gem::Requirement
57
42
  requirements:
58
43
  - - "~>"
59
44
  - !ruby/object:Gem::Version
60
- version: '0.13'
45
+ version: '1.0'
61
46
  type: :runtime
62
47
  prerelease: false
63
48
  version_requirements: !ruby/object:Gem::Requirement
64
49
  requirements:
65
50
  - - "~>"
66
51
  - !ruby/object:Gem::Version
67
- version: '0.13'
52
+ version: '1.0'
68
53
  - !ruby/object:Gem::Dependency
69
- name: timers
54
+ name: loggability
70
55
  requirement: !ruby/object:Gem::Requirement
71
56
  requirements:
72
57
  - - "~>"
73
58
  - !ruby/object:Gem::Version
74
- version: '4.1'
59
+ version: '0.18'
75
60
  type: :runtime
76
61
  prerelease: false
77
62
  version_requirements: !ruby/object:Gem::Requirement
78
63
  requirements:
79
64
  - - "~>"
80
65
  - !ruby/object:Gem::Version
81
- version: '4.1'
82
- - !ruby/object:Gem::Dependency
83
- name: hoe-mercurial
84
- requirement: !ruby/object:Gem::Requirement
85
- requirements:
86
- - - "~>"
87
- - !ruby/object:Gem::Version
88
- version: '1.4'
89
- type: :development
90
- prerelease: false
91
- version_requirements: !ruby/object:Gem::Requirement
92
- requirements:
93
- - - "~>"
94
- - !ruby/object:Gem::Version
95
- version: '1.4'
66
+ version: '0.18'
96
67
  - !ruby/object:Gem::Dependency
97
- name: hoe-deveiate
68
+ name: rdoc-generator-fivefish
98
69
  requirement: !ruby/object:Gem::Requirement
99
70
  requirements:
100
71
  - - "~>"
101
72
  - !ruby/object:Gem::Version
102
- version: '0.9'
103
- type: :development
73
+ version: '0.4'
74
+ type: :runtime
104
75
  prerelease: false
105
76
  version_requirements: !ruby/object:Gem::Requirement
106
77
  requirements:
107
78
  - - "~>"
108
79
  - !ruby/object:Gem::Version
109
- version: '0.9'
80
+ version: '0.4'
110
81
  - !ruby/object:Gem::Dependency
111
- name: hoe-highline
82
+ name: timers
112
83
  requirement: !ruby/object:Gem::Requirement
113
84
  requirements:
114
85
  - - "~>"
115
86
  - !ruby/object:Gem::Version
116
- version: '0.2'
117
- type: :development
87
+ version: '4.3'
88
+ type: :runtime
118
89
  prerelease: false
119
90
  version_requirements: !ruby/object:Gem::Requirement
120
91
  requirements:
121
92
  - - "~>"
122
93
  - !ruby/object:Gem::Version
123
- version: '0.2'
94
+ version: '4.3'
124
95
  - !ruby/object:Gem::Dependency
125
- name: simplecov
96
+ name: rake-deveiate
126
97
  requirement: !ruby/object:Gem::Requirement
127
98
  requirements:
128
99
  - - "~>"
129
100
  - !ruby/object:Gem::Version
130
- version: '0.13'
101
+ version: '0.19'
131
102
  type: :development
132
103
  prerelease: false
133
104
  version_requirements: !ruby/object:Gem::Requirement
134
105
  requirements:
135
106
  - - "~>"
136
107
  - !ruby/object:Gem::Version
137
- version: '0.13'
108
+ version: '0.19'
138
109
  - !ruby/object:Gem::Dependency
139
110
  name: rdoc-generator-fivefish
140
111
  requirement: !ruby/object:Gem::Requirement
141
112
  requirements:
142
113
  - - "~>"
143
114
  - !ruby/object:Gem::Version
144
- version: '0.3'
115
+ version: '0.4'
145
116
  type: :development
146
117
  prerelease: false
147
118
  version_requirements: !ruby/object:Gem::Requirement
148
119
  requirements:
149
120
  - - "~>"
150
121
  - !ruby/object:Gem::Version
151
- version: '0.3'
152
- - !ruby/object:Gem::Dependency
153
- name: rdoc
154
- requirement: !ruby/object:Gem::Requirement
155
- requirements:
156
- - - "~>"
157
- - !ruby/object:Gem::Version
158
- version: '4.0'
159
- type: :development
160
- prerelease: false
161
- version_requirements: !ruby/object:Gem::Requirement
162
- requirements:
163
- - - "~>"
164
- - !ruby/object:Gem::Version
165
- version: '4.0'
166
- - !ruby/object:Gem::Dependency
167
- name: hoe
168
- requirement: !ruby/object:Gem::Requirement
169
- requirements:
170
- - - "~>"
171
- - !ruby/object:Gem::Version
172
- version: '3.16'
173
- type: :development
174
- prerelease: false
175
- version_requirements: !ruby/object:Gem::Requirement
176
- requirements:
177
- - - "~>"
178
- - !ruby/object:Gem::Version
179
- version: '3.16'
180
- description: |-
181
- This is an implementation of the Reactor pattern described in [Pattern-Oriented
182
- Software Architecture (Volume 2)][POSA2]. It allows an asynchronous application
183
- to be described as one or more "reactions" to events, in this case either I/O
184
- conditions on a ZMQ socket or a timer expiring.
185
-
186
- A simple example:
187
-
188
- # Start a SERVER socket, and print out any messages sent to it
189
- reactor = CZTop::Reactor.new
190
- socket = CZTop::Socket::SERVER.new
191
- socket.bind( 'tcp://0.0.0.0:8' )
192
- reactor.register( socket, :read ) do |event|
193
- if event.readable?
194
- message = event.socket.receive
195
- puts "Read: %p" % [ message.to_a ]
196
- end
197
- end
198
- reactor.start_polling
122
+ version: '0.4'
123
+ description: This is an implementation of the Reactor pattern described in Pattern-Oriented
124
+ Software Architecture (Volume 2). It allows an asynchronous application to be described
125
+ as one or more “reactions” to events, in this case either I/O conditions on a ZMQ
126
+ socket or a timer expiring.
199
127
  email:
200
- - ged@FaerieMUD.org
128
+ - ged@faeriemud.org
129
+ - mahlon@martini.nu
201
130
  executables: []
202
131
  extensions: []
203
- extra_rdoc_files:
204
- - History.md
205
- - LICENSE.txt
206
- - Manifest.txt
207
- - README.md
132
+ extra_rdoc_files: []
208
133
  files:
209
134
  - ".document"
210
135
  - ".rdoc_options"
211
136
  - ".simplecov"
212
- - ChangeLog
213
137
  - History.md
214
138
  - LICENSE.txt
215
139
  - Manifest.txt
@@ -224,31 +148,33 @@ files:
224
148
  - spec/cztop/reactor/socket_monitoring_spec.rb
225
149
  - spec/cztop/reactor_spec.rb
226
150
  - spec/spec_helper.rb
227
- homepage: http://deveiate.org/projects/cztop-reactor
151
+ homepage: https://hg.sr.ht/~ged/CZTop-Reactor
228
152
  licenses:
229
- - ISC
230
- metadata: {}
231
- post_install_message:
232
- rdoc_options:
233
- - "--main"
234
- - README.md
153
+ - BSD-3-Clause
154
+ metadata:
155
+ homepage_uri: https://hg.sr.ht/~ged/CZTop-Reactor
156
+ documentation_uri: http://deveiate.org/code/cztop-reactor
157
+ changelog_uri: http://deveiate.org/code/cztop-reactor/History_md.html
158
+ source_uri: https://hg.sr.ht/~ged/CZTop-Reactor/browse
159
+ bug_tracker_uri: https://todo.sr.ht/~ged/CZTop-Reactor/browse
160
+ post_install_message:
161
+ rdoc_options: []
235
162
  require_paths:
236
163
  - lib
237
164
  required_ruby_version: !ruby/object:Gem::Requirement
238
165
  requirements:
239
166
  - - ">="
240
167
  - !ruby/object:Gem::Version
241
- version: 2.2.4
168
+ version: '0'
242
169
  required_rubygems_version: !ruby/object:Gem::Requirement
243
170
  requirements:
244
171
  - - ">="
245
172
  - !ruby/object:Gem::Version
246
173
  version: '0'
247
174
  requirements: []
248
- rubyforge_project:
249
- rubygems_version: 2.7.6
250
- signing_key:
175
+ rubygems_version: 3.1.6
176
+ signing_key:
251
177
  specification_version: 4
252
- summary: This is an implementation of the Reactor pattern described in [Pattern-Oriented
253
- Software Architecture (Volume 2)][POSA2]
178
+ summary: This is an implementation of the Reactor pattern described in Pattern-Oriented
179
+ Software Architecture (Volume 2).
254
180
  test_files: []
metadata.gz.sig CHANGED
Binary file
data/ChangeLog DELETED
@@ -1,223 +0,0 @@
1
- 2018-07-23 Michael Granger <ged@FaerieMUD.org>
2
-
3
- * lib/cztop/reactor/socket_monitoring.rb:
4
- Add socket monitoring methods for delayed and retried connections
5
- [418d608db892] [tip]
6
-
7
- * .hgtags:
8
- Added tag v0.6.0 for changeset f97428feb0e2
9
- [489876542fea]
10
-
11
- * .hgsigs:
12
- Added signature for changeset aea0b1dd1107
13
- [f97428feb0e2] [v0.6.0]
14
-
15
- * History.md, cztop-reactor.gemspec, lib/cztop/reactor.rb:
16
- Bump the minor version, update history.
17
- [aea0b1dd1107]
18
-
19
- * lib/cztop/reactor/socket_monitoring.rb,
20
- spec/cztop/reactor/socket_monitoring_spec.rb:
21
- Fix unfinished socket monitor spec
22
- [39358fbf9896]
23
-
24
- 2018-07-21 Michael Granger <ged@FaerieMUD.org>
25
-
26
- * Manifest.txt, lib/cztop/reactor/socket_monitoring.rb,
27
- spec/cztop/reactor/socket_monitoring_spec.rb:
28
- Add a socket monitor mixin
29
- [e65cdcbe5f89]
30
-
31
- 2018-07-11 Michael Granger <ged@FaerieMUD.org>
32
-
33
- * .hgtags:
34
- Added tag v0.5.0 for changeset c82d889b3d2e
35
- [0338a8ab0f8b] [github/master]
36
-
37
- * .hgsigs:
38
- Added signature for changeset c6276b15f479
39
- [c82d889b3d2e] [v0.5.0]
40
-
41
- * History.md, Rakefile, cztop-reactor.gemspec, lib/cztop/reactor.rb:
42
- Bump the minor version, cztop dep, and update History.
43
- [c6276b15f479]
44
-
45
- * cztop-reactor.gemspec, lib/cztop/reactor.rb,
46
- spec/cztop/reactor_spec.rb:
47
- Added methods to pause/resume all timers.
48
- [67cfabefffd2]
49
-
50
- 2018-06-27 Michael Granger <ged@FaerieMUD.org>
51
-
52
- * .hgtags:
53
- Added tag v0.4.0 for changeset 36b814356934
54
- [9e371cd81152]
55
-
56
- * .hgsigs:
57
- Added signature for changeset 4fa4ea9f2a91
58
- [36b814356934] [v0.4.0]
59
-
60
- * History.md, lib/cztop/reactor.rb:
61
- Bump the minor version, update history.
62
- [4fa4ea9f2a91]
63
-
64
- * .ruby-version, lib/cztop/reactor.rb:
65
- Make the reactor threadsafe
66
- [c0beb742a2a2]
67
-
68
- 2018-06-06 Michael Granger <ged@FaerieMUD.org>
69
-
70
- * Merged with 33bf1ec41017
71
- [9ca502f040d3]
72
-
73
- 2017-11-07 Michael Granger <ged@FaerieMUD.org>
74
-
75
- * .ruby-version:
76
- Update to Ruby 2.4
77
- [33bf1ec41017]
78
-
79
- 2018-06-06 Michael Granger <ged@FaerieMUD.org>
80
-
81
- * lib/cztop/reactor/signal_handling.rb:
82
- Fix docs and logging in signal handling mixin
83
- [0adc6861a172]
84
-
85
- * lib/cztop/reactor.rb:
86
- Guard against events with no sockets
87
- [749f5de1d5fe]
88
-
89
- * certs/ged.pem:
90
- Update my gem-signing cert
91
- [26089589e937]
92
-
93
- 2017-05-19 Michael Granger <ged@FaerieMUD.org>
94
-
95
- * Rakefile, cztop-reactor.gemspec:
96
- Fix the rules for the gemspec.
97
- [469956f9635b]
98
-
99
- 2017-05-16 Michael Granger <ged@FaerieMUD.org>
100
-
101
- * .hgtags:
102
- Added tag v0.3.0 for changeset 93726ed1d11c
103
- [4a5ff1ab5370]
104
-
105
- * .hgsigs:
106
- Added signature for changeset b27d8748d922
107
- [93726ed1d11c] [v0.3.0]
108
-
109
- * History.md, lib/cztop/reactor.rb:
110
- Bumped the minor version, updated history.
111
- [b27d8748d922]
112
-
113
- 2017-05-15 Michael Granger <ged@FaerieMUD.org>
114
-
115
- * .hgignore, Manifest.txt, lib/cztop/reactor/signal_handling.rb,
116
- spec/cztop/reactor/signal_handling_spec.rb:
117
- Add a mixin for signal handling.
118
- [970a2eb110fb]
119
-
120
- 2017-04-30 Michael Granger <ged@FaerieMUD.org>
121
-
122
- * .hgignore:
123
- Ignore pkg directory
124
- [1c8f915143cf]
125
-
126
- 2017-04-29 Michael Granger <ged@FaerieMUD.org>
127
-
128
- * .hgtags:
129
- Added tag v0.2.0 for changeset 05892f4b1e67
130
- [188620133448]
131
-
132
- * .hgsigs:
133
- Added signature for changeset 94faa8741253
134
- [05892f4b1e67] [v0.2.0]
135
-
136
- * History.md, lib/cztop/reactor.rb:
137
- Bump the minor version, update history.
138
- [94faa8741253]
139
-
140
- * lib/cztop/reactor.rb, spec/cztop/reactor_spec.rb:
141
- Allow timers to be resumed after they're removed.
142
- [2318715be614]
143
-
144
- 2017-04-19 Michael Granger <ged@FaerieMUD.org>
145
-
146
- * Rakefile, cztop-reactor.gemspec:
147
- Remove Rakefile guard against public release.
148
- [bb56a75ae424]
149
-
150
- 2017-04-12 Michael Granger <ged@FaerieMUD.org>
151
-
152
- * .hgtags:
153
- Added tag v0.1.0 for changeset 436507f28e4d
154
- [293cb9597072]
155
-
156
- * .hgsigs:
157
- Added signature for changeset 5f4e1c27760a
158
- [436507f28e4d] [v0.1.0]
159
-
160
- * History.md, lib/cztop/reactor.rb:
161
- Set the minor version, update history file.
162
- [5f4e1c27760a]
163
-
164
- 2017-03-27 Michael Granger <ged@FaerieMUD.org>
165
-
166
- * .hgsigs:
167
- Added signature for changeset 8616ee222428
168
- [10a0b983e907]
169
-
170
- * .hgtags:
171
- Added tag v0.1.0.pre20170323172345 for changeset 77db55f567df
172
- [8616ee222428]
173
-
174
- * cztop-reactor.gemspec, lib/cztop/reactor.rb,
175
- spec/cztop/reactor_spec.rb:
176
- Add options for ignoring interrupts and blocking errors
177
- [77db55f567df] [v0.1.0.pre20170323172345]
178
-
179
- * .gems:
180
- Fix fivefish gem name in gemset
181
- [27fcb613383f]
182
-
183
- 2017-03-22 Michael Granger <ged@FaerieMUD.org>
184
-
185
- * .hoerc, cztop-reactor.gemspec, lib/cztop/reactor.rb,
186
- spec/cztop/reactor_spec.rb:
187
- Allow a handler object instead of a block.
188
- [10904c471caa]
189
-
190
- 2017-03-16 Michael Granger <ged@FaerieMUD.org>
191
-
192
- * Rakefile, cztop-reactor.gemspec:
193
- Add missing dependency on timers.
194
- [962f88d917bf]
195
-
196
- * .hgignore:
197
- Ignore built gems
198
- [594168b03b71]
199
-
200
- * README.md:
201
- Fix link in the README
202
- [0391133d132d]
203
-
204
- * .hgignore:
205
- Ignore generated docs directory
206
- [ad4092564786]
207
-
208
- * README.md:
209
- Tabs -> spaces in the README
210
- [41ec0ff65005]
211
-
212
- * cztop-reactor.gemspec:
213
- Add generated gemspec
214
- [b3fcff597575]
215
-
216
- * .document, .editorconfig, .gems, .hgignore, .hoerc, .pryrc,
217
- .rdoc_options, .ruby-gemset, .ruby-version, .simplecov, Gemfile,
218
- History.md, LICENSE.txt, Manifest.txt, README.md, Rakefile,
219
- certs/ged.pem, lib/cztop/reactor.rb, lib/cztop/reactor/event.rb,
220
- spec/cztop/reactor/event_spec.rb, spec/cztop/reactor_spec.rb,
221
- spec/spec_helper.rb:
222
- Initial commit.
223
- [5e3f2358036b]