onedrb 0.1.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (6) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/lib/onedrb.rb +332 -7
  4. data.tar.gz.sig +0 -0
  5. metadata +52 -32
  6. metadata.gz.sig +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: eab24c21c8453a726e65959c8b47f6074d08bfee91d25860f23935b7c20831a0
4
- data.tar.gz: c40e0aa09c94232e478c826a36df32585b17dc221c1a9ca5d860ff245f8c24b1
3
+ metadata.gz: e484349df963bdb3ab1dafb85fa5697dc9460c330d1f863e8ed723ca941e8fcc
4
+ data.tar.gz: c58a17ce4eddc48d611115ae13d5dbd97fddd983c3e2ca537b478f4029f663d3
5
5
  SHA512:
6
- metadata.gz: 218e690d7e795f49fd2f09baa8fd86399bd0d6192cd14cce2db370657e5422066719fd18ea7cb0f1adfa7bfb5abaa4002c2b5b62be43ba3abc74cc07adb1ddbf
7
- data.tar.gz: 5146e2915e49b03dede0d04b0ea84d426b7a5150b01d719ff65a6da0b48b857221c6dfdbb9a007146e7ae5d963f8d03485e5004db26d709806712f0f3d542dd8
6
+ metadata.gz: 96d256270dbc280f69f0e9873787c608132f9ebf45cf20bd06be1a69a2845080e2bd2177d8b35fdce8ca344d6e0edb50c5bf5e3893c6941600c6ec1a3de1fe09
7
+ data.tar.gz: 4c119540720a72be369dec14c3156fa9f96c849b93df6c49229c14d838cb93846058496d53621a64242b72176ecf8ce800f657339f11c8221affa4f3fc0e373d
checksums.yaml.gz.sig CHANGED
Binary file
data/lib/onedrb.rb CHANGED
@@ -6,6 +6,60 @@
6
6
 
7
7
  require 'drb'
8
8
  require 'c32'
9
+ require 'app-mgr'
10
+
11
+
12
+ # Note: The Server object can also use a default ServiceMgr object.
13
+ # Which allows multiple services (user-defined objects) to be
14
+ # hosted dynamically.
15
+ # OneDrb recommended port: 57844 (as this port is recognised by the RSC gem)
16
+ #
17
+ class ServiceMgr < AppMgr
18
+
19
+ def initialize(rsf: nil, debug: false)
20
+ super(rsf: rsf, type: 'service', debug: debug)
21
+ @services = @app
22
+ end
23
+
24
+
25
+ def call(service, methodname, *a)
26
+
27
+ return @services[service.to_sym][:running] unless methodname
28
+ proc1 = @services[service.to_sym][:running].method(methodname.to_sym)
29
+ a.last.is_a?(Hash) ? proc1.call(*a[0..-2], **a.last) : proc1.call(*a)
30
+
31
+ end
32
+
33
+
34
+ # OneDRb version 2; Allows multiple user-defined objects to be
35
+ # served from 1 DRb service
36
+ #
37
+ # not used by any client, but may be in future
38
+ #
39
+ #def odrb2?()
40
+ # true
41
+ #end
42
+
43
+ def services()
44
+ @services.map do |key, object|
45
+ next unless object[:running]
46
+ [key, object[:running].public_methods - Object.public_methods]
47
+ end.compact
48
+ end
49
+
50
+ def stop(service)
51
+ super(service).sub('app', 'service')
52
+ end
53
+
54
+ def unload(service)
55
+ super(service).sub('app', 'service')
56
+ end
57
+
58
+ def method_missing(sym, *args)
59
+ #puts 'servicemgr sym: ' + sym.inspect
60
+ #puts 'args: ' + args.inspect
61
+ end
62
+ end
9
63
 
10
64
 
11
65
  class OneDrbError < Exception
@@ -17,21 +71,21 @@ module OneDrb
17
71
  class Server
18
72
  using ColouredText
19
73
 
20
- def initialize(host: '127.0.0.1', port: (49152..65535).to_a.sample.to_s,
74
+ def initialize(host: '127.0.0.1', port: (49152..65535).to_a.sample.to_s,
21
75
  obj: nil, log: nil)
22
76
 
23
77
  log.info self.class.to_s + '/initialize: active' if log
24
-
78
+
25
79
  @host, @port, @log = host, port, log
26
80
 
27
81
  if obj then
28
- @obj = obj
82
+ @obj = obj
29
83
  else
30
84
  msg = "No object supplied!".error
31
85
  puts msg
32
86
  raise OneDrbError, msg
33
87
  end
34
-
88
+
35
89
  log.info self.class.to_s +'/initialize: completed' if log
36
90
 
37
91
  end
@@ -50,7 +104,7 @@ module OneDrb
50
104
 
51
105
  class Client
52
106
  using ColouredText
53
-
107
+
54
108
  def initialize(host: '127.0.0.1', port: nil)
55
109
 
56
110
  DRb.start_service
@@ -59,13 +113,284 @@ module OneDrb
59
113
 
60
114
  puts ('client connecting to port ' + port).info
61
115
  @obj = DRbObject.new_with_uri("druby://#{host}:#{port}")
116
+ parent = self
117
+ @obj&.services.each do |name, methods|
118
+
119
+ make_class(name, methods)
120
+
121
+ end
122
+
123
+ end
124
+
125
+ # Makes a remote call in 1 line of code using a URI
126
+ # Only available when using the ServiceMgr as the server object;
127
+ #
128
+ # e.g. OneDrb::Client.call 'odrb://clara.home/fun/go?arg=James&age=49'
129
+ #
130
+ def self.call(s, port: nil)
131
+
132
+ r = s.match(/^odrb:\/\/([^\/]+)\/([^\/]+)\/([^\?]+)\??(.*)/).captures
133
+
134
+ rawhostname, service, methodname, rawargs = r
135
+ hostname, rawport = rawhostname.split(':',2)
136
+ port ||= rawport
137
+
138
+ rawargs2 = rawargs&.split('&').map {|x| x.split('=')}
139
+
140
+ a1, a2 = rawargs2.partition do |field, value|
141
+ field.downcase.to_sym == :arg
142
+ end
143
+
144
+ h = a2.map {|k,v| [k.to_sym, v]}.to_h
145
+ a = a1.map(&:last)
146
+
147
+ client = OneDrb::Client.new host: hostname, port: port
148
+
149
+ if h.any? then
150
+
151
+ if a.any? then
152
+ client.call service.to_sym, methodname.to_sym, *a, **h
153
+ else
154
+ client.call service.to_sym, methodname.to_sym, **h
155
+ end
156
+
157
+ elsif a.any?
158
+
159
+ client.call service.to_sym, methodname.to_sym, *a
160
+
161
+ else
162
+
163
+ client.call service.to_sym, methodname.to_sym
164
+
165
+ end
62
166
 
63
167
  end
64
168
 
169
+ def remote()
170
+ @obj
171
+ end
172
+
173
+ def restart(service)
174
+
175
+ return unless @obj.respond_to? :services
176
+
177
+ @obj.restart(service)
178
+ found = @obj.services.assoc(service)
179
+ make_class(*found) if found.any?
180
+ end
181
+
65
182
  def method_missing(sym, *args)
66
- @obj.send(sym, *args)
183
+
184
+ if args.last.is_a?(Hash) then
185
+ @obj.send(sym, *args[0..-2], **args.last)
186
+ else
187
+ @obj.send(sym, *args)
188
+ end
189
+
67
190
  end
68
191
 
69
- end
192
+ private
193
+
194
+ def make_class(name, methods)
195
+
196
+ class_name = name.capitalize
197
+ klass = Object.const_set(class_name,Class.new)
198
+
199
+ klass.class_eval do
200
+ methods.each do |method_name|
201
+ define_method method_name do |*args|
202
+ parent.call name, method_name, *args
203
+ end
204
+ end
205
+ end
206
+
207
+ define_singleton_method name do
208
+ klass.new
209
+ end
210
+
211
+ end
212
+
213
+ end
214
+
215
+ end
216
+
217
+
218
+
219
+ # Note: The Server object can also use a default ServiceMgr object.
220
+ # Which allows multiple services (user-defined objects) to be
221
+ # hosted dynamically.
222
+
223
+
224
+ class ServiceMgr
225
+
226
+ def initialize()
227
+ @services = {}
228
+ end
229
+
230
+
231
+ def call(service, methodname, *a)
232
+
233
+ proc1 = @services[service.to_sym].method(methodname.to_sym)
234
+ a.last.is_a?(Hash) ? proc1.call(*a[0..-2], **a.last) : proc1.call(*a)
235
+
236
+ end
237
+
238
+ def [](key)
239
+ @services[key]
240
+ end
241
+
242
+ def []=(key, value)
243
+ @services[key] = value
244
+
245
+ define_singleton_method key do
246
+ @services[key]
247
+ end
248
+ end
249
+
250
+ def services()
251
+ @services.map do |key, object|
252
+ [key, object.public_methods - Object.public_methods]
253
+ end
254
+ end
255
+
256
+ def method_missing(sym, *args)
257
+ puts 'servicemgr sym: ' + sym.inspect
258
+ puts 'args: ' + args.inspect
259
+ end
260
+ end
261
+
262
+
263
+ class OneDrbError < Exception
264
+ end
265
+
266
+
267
+ module OneDrb
268
+
269
+ class Server
270
+ using ColouredText
271
+
272
+ def initialize(host: '127.0.0.1', port: (49152..65535).to_a.sample.to_s,
273
+ obj: ServiceMgr.new, log: nil)
274
+
275
+ log.info self.class.to_s + '/initialize: active' if log
276
+
277
+ @host, @port, @log = host, port, log
278
+
279
+ if obj then
280
+ @obj = obj
281
+ else
282
+ msg = "No object supplied!".error
283
+ puts msg
284
+ raise OneDrbError, msg
285
+ end
286
+
287
+ log.info self.class.to_s +'/initialize: completed' if log
288
+
289
+ end
290
+
291
+ def start()
292
+
293
+ @log.info self.class.to_s +'/start: active' if @log
294
+ puts (self.class.to_s + " running on port " + @port).info
295
+ DRb.start_service "druby://#{@host}:#{@port}", @obj
296
+ DRb.thread.join
297
+
298
+ end
299
+
300
+ end
301
+
302
+
303
+ class Client
304
+ using ColouredText
305
+
306
+ def initialize(host: '127.0.0.1', port: nil)
307
+
308
+ DRb.start_service
309
+
310
+ puts 'no port supplied'.error unless port
311
+
312
+ puts ('client connecting to port ' + port).info
313
+ @obj = DRbObject.new_with_uri("druby://#{host}:#{port}")
314
+ parent = self
315
+ @obj&.services.each do |name, methods|
316
+
317
+ class_name = name.capitalize
318
+ klass = Object.const_set(class_name,Class.new)
319
+
320
+ klass.class_eval do
321
+ methods.each do |method_name|
322
+ define_method method_name do |*args|
323
+ parent.call name, method_name, *args
324
+ end
325
+ end
326
+ end
327
+
328
+ define_singleton_method name do
329
+ klass.new
330
+ end
331
+
332
+ end
333
+
334
+ end
335
+
336
+ # Makes a remote call in 1 line of code using a URI
337
+ # e.g. OneDrb::Client.call 'odrb://clara.home/fun/go?arg=James&age=49'
338
+ #
339
+ def self.call(s, port: nil)
340
+
341
+ r = s.match(/^odrb:\/\/([^\/]+)\/([^\/]+)\/([^\?]+)\??(.*)/).captures
342
+
343
+ rawhostname, service, methodname, rawargs = r
344
+ hostname, rawport = rawhostname.split(':',2)
345
+ port ||= rawport
346
+
347
+ rawargs2 = rawargs&.split('&').map {|x| x.split('=')}
348
+
349
+ a1, a2 = rawargs2.partition do |field, value|
350
+ field.downcase.to_sym == :arg
351
+ end
352
+
353
+ h = a2.map {|k,v| [k.to_sym, v]}.to_h
354
+ a = a1.map(&:last)
355
+
356
+ client = OneDrb::Client.new host: hostname, port: port
357
+
358
+ if h.any? then
359
+
360
+ if a.any? then
361
+ client.call service.to_sym, methodname.to_sym, *a, **h
362
+ else
363
+ client.call service.to_sym, methodname.to_sym, **h
364
+ end
365
+
366
+ elsif a.any?
367
+
368
+ client.call service.to_sym, methodname.to_sym, *a
369
+
370
+ else
371
+
372
+ client.call service.to_sym, methodname.to_sym
373
+
374
+ end
375
+
376
+ end
377
+
378
+ def remote()
379
+ @obj
380
+ end
381
+
382
+ def method_missing(sym, *args)
383
+
384
+ puts '@obj.class: ' + @obj.class.inspect
385
+
386
+ if args.last.is_a?(Hash) then
387
+ @obj.send(sym, *args[0..-2], **args.last)
388
+ else
389
+ @obj.send(sym, *args)
390
+ end
391
+
392
+ end
393
+
394
+ end
70
395
 
71
396
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: onedrb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Robertson
@@ -11,54 +11,74 @@ cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
13
  MIIEXjCCAsagAwIBAgIBATANBgkqhkiG9w0BAQsFADAsMSowKAYDVQQDDCFnZW1t
14
- YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMTkwODEzMTkwMTM0WhcN
15
- MjAwODEyMTkwMTM0WjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
- cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDwerdP
17
- aVKeP5RVh9q4v/9L1K61jr2S4/uirJ64zby8+phkUyRSUj5qDKv3revhEqaxFg5I
18
- ujs2zQNpwrVrNz5fl/adplygVNFF6Pa4KJq+IpnhafhRXCpCEBkmU7M+XzLVgipM
19
- 4AHbrRG3jCxevFK7bBSqEA+/snRhcBq9gPSnIv0opaVnugfH+KaCXc8S9CEkbqfW
20
- Xm9nf1eQ4Vr0hkL/LsXfxs3WlNL3k/m1PZ+v0wCnyPYQDJfudGGvoK3c5fF/UzEW
21
- hRjiby6zjBw4E2NutxAwvnCMcCQ2ASFoiu+TP9CVn9c7IxIQ4vo1R+HFeibG4qR6
22
- +eJ6Z3g5EazzjnrT8qfnuJJ/zP/JNppKZHAhDjYMzW65q+oePHLcRw/VgX0tSLpC
23
- pMYfcbi5UJGJR01wZ1RoE07ku+aG8Ke3oslkz/bCtNB69UISaascyxauSDuFIX8n
24
- Ft4fk8jo8Y/2bBjYgXiCVcPpA6orR342+H/WEs8T2lWoJewr5GGzn2/T280CAwEA
25
- AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUTQ8/qr6P
26
- uacX1pIgbur6QRY1HTUwJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
14
+ YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMjIwNDIyMTkyNjA4WhcN
15
+ MjMwNDIyMTkyNjA4WjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
+ cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDLwpuN
17
+ 87Qes2zJkZyL5GageArGWLwP+X6ZK1sgfpoQiL9XoKDod45sOuRdnX+UckRngmGs
18
+ 8/cCg1nlE7FzFefwi7SkTF1BdQkagiSAtwBja0ikad/LBICfcnX1QlvyK0B0knxI
19
+ 1igPSFeUXOKg2Jf3GIgVnjjIq2L9cVBqveRU3ffuCsM3sh+dESExqx53ZsSK3K9B
20
+ UiRujNSXrZpfF1IrPyXKjH5vZ5cP4Rhb4G+Ml19F0R5Wf5WLNsiTosAooFi+ywYv
21
+ NzjA+p2TgNFCEjKvImMdD8uSFC3UaSGuG5RDFfluGyI9ogofdGMn/gXa2wGa008w
22
+ KZqxqi9naZdwrIbLt2gDKyUtbL7/ceUBHkJqhk5neBZM7TkfaJBcKwtB4FsdZ7MK
23
+ mBBAp7GW7k+ruQKPdZwJofO6T4TAJABNxDhVOlfQG/OpO4qY7MBiPUfBkmA4vjKf
24
+ xoFvE05KcGuZb0hWrSiM9urFs29GGR100duy4HmJTTBNvhYCsd33ykNTAxkCAwEA
25
+ AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUrh/OL4DZ
26
+ 7kB+QntxOWXmDhPz/qgwJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
27
27
  c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1hc3RlckBqYW1lc3JvYmVydHNvbi5ldTAN
28
- BgkqhkiG9w0BAQsFAAOCAYEAnb2fmshYrAcUHgEUdqetowCWZJxJ9zzR8xslCAX4
29
- zeJKOgOVgGWcoUUgsDotW5hK2pafZj8fU749CbaCTj1QqT6d4D22gKtP0TNzQ4/e
30
- JLXwO40Ot4px4D4dSN318G8y6uoPv/4ArlbccXlIOlcddS2fYWSRfLQCqhWFMYj4
31
- 0wpw6Zjjmrb5PlF0hMDvm3Te2JgebdnAXG4I0IJkuMdMFIbDG+q65WpsMug4CpLu
32
- DZT2BYXoaz72J9wLcN7BqLsOP7uL6GnaswpM4BUaq9sZWXS/B47KNE0PAZy4IT20
33
- 0n3EApJpibKRBZJR/L4WsuxyekLleMmVgWXS1bqgJUsmSIbUcjB+atazO/mx1beT
34
- cu8vU4iTC0XJWbLmzTZt9FH9tbulje2nlE+Pt4MjVWAZivWRkXlRsfy8YFytzLZg
35
- FbeYaP5rMZ9xxTvO5hDjh3BEOwHK9GXxMPsakyl7b4sUHJKEw5wtyjkYsMwrJmj9
36
- XkF/ReqRKodw4HNu5DG4wj6O
28
+ BgkqhkiG9w0BAQsFAAOCAYEANcUl8rOFNRz6Pk3OarkDKv+0VAZtc+YR6rfFj7Ws
29
+ OH9f1eIEmyyDQBTN17VYXLvI3FlewJcbkr5u9DV62W80cbzkC27nSU6kicaAh7C3
30
+ cqgGd084jS7DF8+7RhVO5QBFKwmYCCr5yseUmIW5KtPcR0ey36X3PWHPQfHap1h5
31
+ vp6PdlpxEON8RhJ2UVUIPFFTr3Y8TYu0ya7Q0E7oPqor6tuJGtRsT3HMEGT5/KPd
32
+ ccHI65ygp/STtdROe5WVPmU+PafUoCRtGUHR6m5Petdsy7xDsPRW7HfGb95BFj6t
33
+ m/Wdnbmg9hmU6coqbogGGnS+4SvRuRlBRI6NeGB5/p6/zj7snat1hdAp9kPyakBm
34
+ jjhW5l95yuhsvvVMD684GS3sVVSbOTCtbZpvYDn9IoG0mutmqFU6Y2jMBHO/aZd9
35
+ lK7OtCGPauDHVuIWDW0EnHb+MMBt6F5SqC+PSy9iOzs4zAWkJMFp86MOEK2yrfnO
36
+ /ghrVtneK08DqmYOaive8I6P
37
37
  -----END CERTIFICATE-----
38
- date: 2019-08-13 00:00:00.000000000 Z
38
+ date: 2022-04-24 00:00:00.000000000 Z
39
39
  dependencies:
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: c32
42
42
  requirement: !ruby/object:Gem::Requirement
43
43
  requirements:
44
- - - ">="
45
- - !ruby/object:Gem::Version
46
- version: 0.2.0
47
44
  - - "~>"
48
45
  - !ruby/object:Gem::Version
49
- version: '0.2'
46
+ version: '0.3'
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: 0.3.0
50
50
  type: :runtime
51
51
  prerelease: false
52
52
  version_requirements: !ruby/object:Gem::Requirement
53
53
  requirements:
54
+ - - "~>"
55
+ - !ruby/object:Gem::Version
56
+ version: '0.3'
54
57
  - - ">="
55
58
  - !ruby/object:Gem::Version
56
- version: 0.2.0
59
+ version: 0.3.0
60
+ - !ruby/object:Gem::Dependency
61
+ name: app-mgr
62
+ requirement: !ruby/object:Gem::Requirement
63
+ requirements:
57
64
  - - "~>"
58
65
  - !ruby/object:Gem::Version
59
- version: '0.2'
66
+ version: '0.4'
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: 0.4.0
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: '0.4'
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: 0.4.0
60
80
  description:
61
- email: james@jamesrobertson.eu
81
+ email: digital.robertson@gmail.com
62
82
  executables: []
63
83
  extensions: []
64
84
  extra_rdoc_files: []
@@ -83,7 +103,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
83
103
  - !ruby/object:Gem::Version
84
104
  version: '0'
85
105
  requirements: []
86
- rubygems_version: 3.0.1
106
+ rubygems_version: 3.2.22
87
107
  signing_key:
88
108
  specification_version: 4
89
109
  summary: Makes it convenient to make an object remotely accessible.
metadata.gz.sig CHANGED
Binary file