pipe_rpc 2.0.0 → 2.1.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
  SHA1:
3
- metadata.gz: eb0f50e52b37b279be08b1044701ff5dc9fdb53f
4
- data.tar.gz: 9aa8ac09ca6ad298acba5869c649a707c2d5bf4c
3
+ metadata.gz: 1991805b18e6be65590ca3b7467624b7c6fd804b
4
+ data.tar.gz: e61fcf89ca3cd3a8a8b0be4ecc195c2173cd8961
5
5
  SHA512:
6
- metadata.gz: 57dd76c93512192edbe0878d59887a09d9177d0db745243bc4549c226e0e9f908fcd72eb1a195dfa0bdc9009e26bd471745abdedceae9d49a84f04a776a8f640
7
- data.tar.gz: cc9327c2967955c7c82790f919acc1e7ed33f93eb596a91b88e7bc92b149d9f430e646dd15b674fe562b23454818b5c38ed244d4f83082179f777b3f57c2998d
6
+ metadata.gz: e48baa8052601b1ab367a6425225bb1a2df1b941bd5ef6127d1bc4569a6ee57d02a72381f63f45ebd1fb3cf194fbb39b741eca8218ef1b99416a82e8df37ed04
7
+ data.tar.gz: 4395b41a3b820e9e79e7727a47527878dd8d169801aa28398ad59dbea25d8e2ce64975fb024c38495781cc766302c7e699293120c3e762ffce131b3af1f15d18
@@ -0,0 +1,27 @@
1
+ module PipeRpc
2
+ class BasicInterface < BasicObject
3
+ wanted_methods = [:initialize, :__id__, :__send__, :respond_to?, :method_missing]
4
+
5
+ existing_methods = if ::Object.const_defined?(:MRUBY_VERSION)
6
+ [:initialize, :method_missing]
7
+ else
8
+ [:initialize, :__id__, :__send__, :instance_eval, :instance_exec, :method_missing,
9
+ :singleton_method_added, :singleton_method_removed, :singleton_method_undefined]
10
+ end
11
+
12
+ # Remove unwanted methods
13
+ unwanted_methods = existing_methods - wanted_methods
14
+ unwanted_methods.each { |m| undef_method m }
15
+
16
+ # Add non-existing methods by including sorted out Kernel module
17
+ to_be_added_methods = wanted_methods - existing_methods
18
+ kernel = ::Kernel.dup
19
+ kernel.class_eval do
20
+ (instance_methods - to_be_added_methods).each{ |m| remove_method m }
21
+ private_instance_methods.each{ |m| remove_method m } if respond_to? :private_instance_methods
22
+ end
23
+ include kernel
24
+
25
+ alias send __send__
26
+ end
27
+ end
@@ -1,27 +1,23 @@
1
1
  module PipeRpc
2
- class Client < BasicObject
3
- undef_method :instance_eval unless ::Object.const_defined?(:MRUBY_VERSION)
4
- undef_method :instance_exec unless ::Object.const_defined?(:MRUBY_VERSION)
5
-
6
- def initialize(server = :default, hub)
7
- @server = server.to_sym
2
+ class Client < BasicInterface
3
+ def initialize(server_id = :default, hub)
4
+ @__rpc_server_id__ = server_id.to_sym
8
5
  @hub = hub
9
6
  end
10
7
 
8
+ attr_reader :__rpc_server_id__
9
+
10
+ def respond_to?(method)
11
+ super or method_missing(:respond_to?, method)
12
+ end
13
+
11
14
  def method_missing(method, *args)
12
- request = Client::Request.new(server: @server, method: method, arguments: args)
15
+ request = Client::Request.new(@hub, server: @__rpc_server_id__, method: method, arguments: args)
13
16
  @hub.requests.evaluate(request)
14
17
  end
15
- alias __send__ method_missing
16
- alias send method_missing
17
- alias public_send method_missing
18
18
 
19
19
  def to_s
20
- "<Client:#{@server.to_s}>"
21
- end
22
-
23
- def is_a?(object)
24
- object == Client
20
+ "<Client:#{@__rpc_server_id__}>"
25
21
  end
26
22
  end
27
23
  end
@@ -2,15 +2,17 @@ class PipeRpc::Request; end
2
2
 
3
3
  module PipeRpc
4
4
  class Client::Request < Request
5
- def initialize(*args)
6
- super
5
+ def initialize(hub, request)
6
+ @hub = hub
7
+ request[:arguments] = arguments_to_server_ids(request[:arguments])
8
+ super request
7
9
  # discard first three entries mentioning Client::Request#initialize,
8
10
  # Client::Request.new and Client#method_missing in stacktrace
9
11
  @stacktrace = Kernel.respond_to?(:caller) ? Kernel.caller(3).to_a : []
10
12
  @result = Result.new(self)
11
13
  end
12
14
 
13
- attr_reader :stacktrace, :result
15
+ attr_reader :hub, :stacktrace, :result
14
16
 
15
17
  def id=(id)
16
18
  raise 'id already set' if @id
@@ -20,5 +22,26 @@ module PipeRpc
20
22
  def id
21
23
  @id or raise 'id not set'
22
24
  end
25
+
26
+ def arguments_to_server_ids(arguments)
27
+ deep_map(arguments) do |value|
28
+ if value.respond_to? :__rpc_server_id__ # is a client
29
+ value.__rpc_server_id__
30
+ elsif value.respond_to? :to_rpc_server_id # is a servable
31
+ @hub.servers.add(value)
32
+ value.to_rpc_server_id
33
+ else
34
+ value
35
+ end
36
+ end
37
+ end
38
+
39
+ def deep_map(object, &mapper)
40
+ case object
41
+ when Hash then object.map{ |k, v| [k, deep_map(v, &mapper)] }.to_h
42
+ when Array then object.map{ |item| deep_map(item, &mapper) }
43
+ else yield object
44
+ end
45
+ end
23
46
  end
24
47
  end
@@ -18,7 +18,9 @@ module PipeRpc
18
18
  @value.set_backtrace(@value.backtrace.to_a + @request.stacktrace) if @value.respond_to? :set_backtrace
19
19
  raise @value
20
20
  else
21
- @value
21
+ @request.deep_map(@value) do |value|
22
+ (@request.hub.servers.registered? value) ? @request.hub.servers[value] : value
23
+ end
22
24
  end
23
25
  end
24
26
  end
@@ -0,0 +1,19 @@
1
+ module PipeRpc
2
+ class Hub::Server < BasicInterface
3
+ kernel = ::Kernel.dup
4
+ kernel.class_eval do
5
+ alias_method :__rpc_server_class__, :class
6
+ (instance_methods - [:__rpc_server_class__]).each{ |m| remove_method m }
7
+ private_instance_methods.each{ |m| remove_method m } if respond_to? :private_instance_methods
8
+ end
9
+ include kernel
10
+
11
+ def self.const_missing(name)
12
+ ::Object.const_get(name)
13
+ end
14
+
15
+ def to_rpc_server_id
16
+ "#{self.__rpc_server_class__.to_s}##{__id__}".to_sym
17
+ end
18
+ end
19
+ end
@@ -4,20 +4,24 @@ module PipeRpc
4
4
  @servers = Hash.new{ |hash, key| raise NoServerError.new("no server #{key}") }
5
5
  end
6
6
 
7
- def add(servers)
8
- servers.each{ |name, server| @servers[name.to_sym] = server }
7
+ def add(*servers)
8
+ if servers.first.respond_to? :to_rpc_server_id
9
+ servers.each{ |server| @servers[server.to_rpc_server_id] = server }
10
+ else
11
+ servers.first.each{ |id, server| @servers[id.to_sym] = server }
12
+ end
9
13
  end
10
14
 
11
- def [](name)
12
- @servers[name.to_sym]
15
+ def [](id)
16
+ @servers[id.to_sym]
13
17
  end
14
18
 
15
- def remove(name)
16
- @servers.delete(name.to_sym)
19
+ def remove(id)
20
+ @servers.delete(id.to_sym)
17
21
  end
18
22
 
19
- def registered?(name)
20
- @servers.has_key?(name)
23
+ def registered?(id)
24
+ @servers.has_key?(id)
21
25
  end
22
26
  end
23
27
  end
@@ -1,3 +1,3 @@
1
1
  module PipeRpc
2
- VERSION = "2.0.0"
2
+ VERSION = "2.1.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pipe_rpc
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christopher Aue
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-07-26 00:00:00.000000000 Z
11
+ date: 2016-09-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: msgpack
@@ -98,6 +98,7 @@ files:
98
98
  - Rakefile
99
99
  - lib/msgpack_config.rb
100
100
  - lib/pipe_rpc.rb
101
+ - lib/pipe_rpc/basic_interface.rb
101
102
  - lib/pipe_rpc/client.rb
102
103
  - lib/pipe_rpc/client_request.rb
103
104
  - lib/pipe_rpc/client_request_error_response.rb
@@ -116,6 +117,7 @@ files:
116
117
  - lib/pipe_rpc/hub_request_error_result.rb
117
118
  - lib/pipe_rpc/hub_request_result.rb
118
119
  - lib/pipe_rpc/hub_requests.rb
120
+ - lib/pipe_rpc/hub_server.rb
119
121
  - lib/pipe_rpc/hub_servers.rb
120
122
  - lib/pipe_rpc/hub_socket.rb
121
123
  - lib/pipe_rpc/request.rb