pipe_rpc 2.1.0 → 2.2.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: 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