rdkit 0.1.4 → 0.1.5

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
  SHA1:
3
- metadata.gz: 10a0bd157c17b8098e43a87046384ebc7e9ae534
4
- data.tar.gz: 7ad179971146d74db65ffbc8a6999b1b9b8bb034
3
+ metadata.gz: 88ca08b9ed9e2a240465d7d1a7c6c94bbe16e0cd
4
+ data.tar.gz: 700e931ec7471e9c9dee5f28e91a4510642df5bf
5
5
  SHA512:
6
- metadata.gz: f8fd1464e00be7ce386d4eefb1132984cbfb7632ff498eb7df6ddd97fd07127122f27b8828c1722ad22b515b606a686286fc5a5e550adc964c00409e7950aa62
7
- data.tar.gz: 2d71bef8dfac46a9b7d4274ab755e83a3f944a05a401def43b1bda6932d69c1a2cef181a229a015faf5299d73d22361778502e9653c4e52df61d251572e304a6
6
+ metadata.gz: d764b39f08556c73f39aa34f9a479a55945953bd8eba366ec299560246b0b80a2b0e836c780c14d43bbc2d2a3f2cf9495f9212c214b8617a8ff2cb92a83dfd55
7
+ data.tar.gz: f308794848e69d7f80cb1af00fbb9dd57ec1ee98f0925a948c65758f6b3a45fab4271f07497d1bd48a34ffea72533390ed34d596a8d69e4ebad343651cdc0bd6
data/README.md CHANGED
@@ -417,6 +417,12 @@ $ redis-benchmark -p 3721 -n 10 nonblock
417
417
 
418
418
  See the difference between blocking and non-blocking commands?
419
419
 
420
+ #### Implementing blocked commands
421
+
422
+ Since RDKit version 0.1.5, it allows injection of additional IO handlers into the main loop.
423
+
424
+ For examples, please refer to `examples/ioinject` for an injected UDP echo server.
425
+
420
426
  ### Implemented Redis Commands
421
427
 
422
428
  | command | support | note |
@@ -0,0 +1,10 @@
1
+ require 'rdkit'
2
+
3
+ require_relative 'ioinject/version'
4
+ require_relative 'ioinject/core'
5
+ require_relative 'ioinject/resp_responder'
6
+ require_relative 'ioinject/server'
7
+
8
+ server = IOInject::Server.new
9
+
10
+ server.start
@@ -0,0 +1,41 @@
1
+ require 'socket'
2
+
3
+ module IOInject
4
+ class Core < RDKit::Core
5
+ def initialize(server)
6
+ ############ injection starts here ############
7
+ @injection_called = 0
8
+
9
+ udp_socket = UDPSocket.new
10
+ host, port = 'localhost', 8080
11
+ udp_socket.bind(host, port)
12
+
13
+ puts "UDP echo server injection code running at #{host}:#{port}"
14
+
15
+ server.inject_io_handler(udp_socket) do
16
+ begin
17
+ msg, sender_addrinfo, _, *controls = udp_socket.recvmsg_nonblock
18
+
19
+ p [msg, sender_addrinfo, _, *controls]
20
+
21
+ # echo back
22
+ udp_socket.send(msg, 0, sender_addrinfo)
23
+
24
+ @injection_called += 1
25
+ rescue IO::WaitReadable
26
+ # simply pass
27
+ end
28
+ end
29
+ ############ injection ends here ############
30
+ end
31
+
32
+ def tick!; end
33
+
34
+ def introspection
35
+ {
36
+ ioinject_version: IOInject::VERSION,
37
+ injection_called: @injection_called
38
+ }
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,6 @@
1
+ module IOInject
2
+ class RESPResponder < RDKit::RESPResponder
3
+ def initialize
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,17 @@
1
+ module IOInject
2
+ class Server < RDKit::Server
3
+ def initialize
4
+ super('0.0.0.0', 3721)
5
+
6
+ # @core is required by RDKit
7
+ @core = Core.new(self)
8
+
9
+ # @responder is also required by RDKit
10
+ @responder = RESPResponder.new
11
+ end
12
+
13
+ def introspection
14
+ super.merge(ioinject: @core.introspection)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,3 @@
1
+ module IOInject
2
+ VERSION = '0.0.1'
3
+ end
@@ -51,6 +51,12 @@ module RDKit
51
51
  reader, writer = create_pipe
52
52
  @selfpipe = { :reader => reader, :writer => writer }
53
53
  @signal_queue = []
54
+
55
+ @additional_io_handlers = {}
56
+ end
57
+
58
+ def inject_io_handler(another_io, &block)
59
+ @additional_io_handlers[another_io] = block
54
60
  end
55
61
 
56
62
  def start
@@ -313,7 +319,7 @@ module RDKit
313
319
  end
314
320
 
315
321
  def process_clients
316
- readable, _ = IO.select([@server_socket, @selfpipe[:reader], @clients.keys].flatten, nil, nil, 1.0 / HZ)
322
+ readable, _ = IO.select([@server_socket, @selfpipe[:reader], @clients.keys, @additional_io_handlers.keys].flatten, nil, nil, 1.0 / HZ)
317
323
 
318
324
  if readable
319
325
  readable.each do |socket|
@@ -321,6 +327,8 @@ module RDKit
321
327
  add_client
322
328
  elsif socket == @selfpipe[:reader]
323
329
  handle_signals
330
+ elsif block = @additional_io_handlers[socket]
331
+ block.call
324
332
  else
325
333
  process(socket)
326
334
  end
@@ -1,3 +1,3 @@
1
1
  module RDKit
2
- VERSION = '0.1.4'
2
+ VERSION = '0.1.5'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rdkit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Forrest Ye
@@ -200,6 +200,11 @@ files:
200
200
  - example/http/core.rb
201
201
  - example/http/responder.rb
202
202
  - example/http/server.rb
203
+ - example/ioinject.rb
204
+ - example/ioinject/core.rb
205
+ - example/ioinject/resp_responder.rb
206
+ - example/ioinject/server.rb
207
+ - example/ioinject/version.rb
203
208
  - lib/rdkit.rb
204
209
  - lib/rdkit/callbacks.rb
205
210
  - lib/rdkit/client.rb