cztop-reactor 0.7.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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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
- ENcvWVZS4iUzi4dsYJGY6yEOsXh2CcF46+QevV8iE+UmbkU75V7Dy1JCaUOyizEt
20
- TH5UHsOtUU7k9TYARt/TgYZKuaoAMZZd5qyVqhF1vV+7/Qzmp89NGflXf2xYP26a
21
- 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
- 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
- +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
- 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
- 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
- BAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFHKN/nkRusdqCJEuq3lgB3fJvyTg
27
- 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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]