pipe_rpc 2.1.0 → 2.2.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
  SHA1:
3
- metadata.gz: 1991805b18e6be65590ca3b7467624b7c6fd804b
4
- data.tar.gz: e61fcf89ca3cd3a8a8b0be4ecc195c2173cd8961
3
+ metadata.gz: 133a22837afd6032e1de590b632c2715f4e4913c
4
+ data.tar.gz: aa8338e1c9f4d3fad11f5a1ca2b3923c1704b023
5
5
  SHA512:
6
- metadata.gz: e48baa8052601b1ab367a6425225bb1a2df1b941bd5ef6127d1bc4569a6ee57d02a72381f63f45ebd1fb3cf194fbb39b741eca8218ef1b99416a82e8df37ed04
7
- data.tar.gz: 4395b41a3b820e9e79e7727a47527878dd8d169801aa28398ad59dbea25d8e2ce64975fb024c38495781cc766302c7e699293120c3e762ffce131b3af1f15d18
6
+ metadata.gz: 924584159e80cf3e6dfec8ccf288ba122985e0f9a29f6e3f8734b74cca608436e0b15f34aeeb409bd53990d5957f2b7688d84687eb06bd02e17ded15a13575d9
7
+ data.tar.gz: 997155d89f123a5da38e7190a9e6d1de9d1e46e479c84834c1a810b5f5279da6d757b71b4f49d7612780716e5a84544bcade5c942287837d2482659a4fbad9be
data/.rspec CHANGED
@@ -1,3 +1,2 @@
1
- --format documentation
2
1
  --color
3
2
  --require spec_helper.rb
@@ -1,6 +1,6 @@
1
1
  module PipeRpc
2
2
  class BasicInterface < BasicObject
3
- wanted_methods = [:initialize, :__id__, :__send__, :respond_to?, :method_missing]
3
+ wanted_methods = [:initialize, :__id__, :object_id, :__send__, :respond_to?, :method_missing]
4
4
 
5
5
  existing_methods = if ::Object.const_defined?(:MRUBY_VERSION)
6
6
  [:initialize, :method_missing]
@@ -15,9 +15,5 @@ module PipeRpc
15
15
  request = Client::Request.new(@hub, server: @__rpc_server_id__, method: method, arguments: args)
16
16
  @hub.requests.evaluate(request)
17
17
  end
18
-
19
- def to_s
20
- "<Client:#{@__rpc_server_id__}>"
21
- end
22
18
  end
23
19
  end
@@ -4,7 +4,7 @@ module PipeRpc
4
4
  class Client::Request < Request
5
5
  def initialize(hub, request)
6
6
  @hub = hub
7
- request[:arguments] = arguments_to_server_ids(request[:arguments])
7
+ request[:arguments] = DeepMapper.to_transport(request[:arguments], hub)
8
8
  super request
9
9
  # discard first three entries mentioning Client::Request#initialize,
10
10
  # Client::Request.new and Client#method_missing in stacktrace
@@ -22,26 +22,5 @@ module PipeRpc
22
22
  def id
23
23
  @id or raise 'id not set'
24
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
46
25
  end
47
26
  end
@@ -18,9 +18,7 @@ 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
- @request.deep_map(@value) do |value|
22
- (@request.hub.servers.registered? value) ? @request.hub.servers[value] : value
23
- end
21
+ DeepMapper.from_transport(@value, @request.hub)
24
22
  end
25
23
  end
26
24
  end
@@ -0,0 +1,36 @@
1
+ module PipeRpc
2
+ class DeepMapper
3
+ def self.map(object, &mapper)
4
+ case object
5
+ when Hash then object.map{ |k, v| [k, map(v, &mapper)] }.to_h
6
+ when Array then object.map{ |item| map(item, &mapper) }
7
+ else yield object
8
+ end
9
+ end
10
+
11
+ def self.to_transport(object, hub)
12
+ map(object) do |value|
13
+ if value.respond_to? :__rpc_server_id__
14
+ "__rpc_client__#{value.__rpc_server_id__}"
15
+ elsif value.respond_to? :to_rpc_server_id
16
+ hub.servers.add(value) unless hub.servers.registered? value.to_rpc_server_id
17
+ "__rpc_server__#{value.to_rpc_server_id}"
18
+ else
19
+ value
20
+ end
21
+ end
22
+ end
23
+
24
+ def self.from_transport(object, hub)
25
+ map(object) do |value|
26
+ if value.is_a?(String) and value.start_with?('__rpc_client__')
27
+ hub.servers[value.sub('__rpc_client__', '')]
28
+ elsif value.is_a?(String) and value.start_with?('__rpc_server__')
29
+ Client.new(value.sub('__rpc_server__', ''), hub)
30
+ else
31
+ value
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -2,6 +2,7 @@ module PipeRpc
2
2
  class Error < StandardError; end
3
3
  class ClosedError < Error; end
4
4
  class UnknownError < Error; end
5
+ class ServerRegistrationError < Error; end
5
6
 
6
7
  class MessageError < Error; end
7
8
  class MessageParseError < MessageError; end
@@ -7,13 +7,16 @@ module PipeRpc
7
7
  super body
8
8
  end
9
9
 
10
- CALL_FILE, CALL_LINENO = __FILE__, __LINE__+4
10
+ attr_reader :hub
11
+
11
12
  def handle
12
13
  evaluate_result do
13
14
  # the block is passed for asynchronous evaluation
14
- @hub.servers[server].__send__(method, *arguments, &evaluate_result_proc)
15
+ mapped_arguments = DeepMapper.from_transport(arguments, @hub)
16
+ @hub.servers[server].__send__(method, *mapped_arguments, &evaluate_result_proc)
15
17
  end
16
18
  end
19
+ CALL_FILE, CALL_LINENO = __FILE__, __LINE__-3
17
20
 
18
21
  def evaluate_result(result = nil, &block)
19
22
  result = Result.new(self, block_given? ? yield : result)
@@ -5,11 +5,11 @@ module PipeRpc
5
5
  end
6
6
 
7
7
  def value
8
- @result
8
+ DeepMapper.to_transport(@result, @request.hub)
9
9
  end
10
10
 
11
11
  def to_response
12
- ResultResponse.new(id: @request.id, result: @result)
12
+ ResultResponse.new(id: @request.id, result: value)
13
13
  end
14
14
  end
15
15
  end
@@ -3,17 +3,19 @@ module PipeRpc
3
3
  kernel = ::Kernel.dup
4
4
  kernel.class_eval do
5
5
  alias_method :__rpc_server_class__, :class
6
- (instance_methods - [:__rpc_server_class__]).each{ |m| remove_method m }
6
+ (instance_methods - [:__rpc_server_class__, :object_id]).each{ |m| remove_method m }
7
7
  private_instance_methods.each{ |m| remove_method m } if respond_to? :private_instance_methods
8
8
  end
9
9
  include kernel
10
10
 
11
+ SERVER_ID_GETTER = :__id__
12
+
11
13
  def self.const_missing(name)
12
14
  ::Object.const_get(name)
13
15
  end
14
16
 
15
17
  def to_rpc_server_id
16
- "#{self.__rpc_server_class__.to_s}##{__id__}".to_sym
18
+ "#{__rpc_server_class__.to_s}##{__send__(__rpc_server_class__::SERVER_ID_GETTER)}".to_sym
17
19
  end
18
20
  end
19
21
  end
@@ -4,11 +4,17 @@ 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
- if servers.first.respond_to? :to_rpc_server_id
9
- servers.each{ |server| @servers[server.to_rpc_server_id] = server }
7
+ def add(server)
8
+ id, server = if server.respond_to? :to_rpc_server_id
9
+ [server.to_rpc_server_id, server]
10
10
  else
11
- servers.first.each{ |id, server| @servers[id.to_sym] = server }
11
+ server.first
12
+ end
13
+
14
+ if registered? id
15
+ raise ServerRegistrationError.new("server id #{id.inspect} already used for another server")
16
+ else
17
+ @servers[id] = server
12
18
  end
13
19
  end
14
20
 
@@ -1,3 +1,3 @@
1
1
  module PipeRpc
2
- VERSION = "2.1.0"
2
+ VERSION = "2.2.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.1.0
4
+ version: 2.2.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-09-10 00:00:00.000000000 Z
11
+ date: 2016-09-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: msgpack
@@ -105,6 +105,7 @@ files:
105
105
  - lib/pipe_rpc/client_request_response.rb
106
106
  - lib/pipe_rpc/client_request_result.rb
107
107
  - lib/pipe_rpc/client_request_result_response.rb
108
+ - lib/pipe_rpc/deep_mapper.rb
108
109
  - lib/pipe_rpc/error.rb
109
110
  - lib/pipe_rpc/error_response.rb
110
111
  - lib/pipe_rpc/gateway.rb