metarpc 0.0.2.1 → 0.0.3

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
  SHA256:
3
- metadata.gz: 0c39e7104662301dc68561a54ace87f5f6826f17f94773890e0d07beeab31aa2
4
- data.tar.gz: d74160dd168e6064084094670e8e70db8615959e31dd7fdbfa395b517f97c00c
3
+ metadata.gz: 6fa5bd3e70fe9ed9b8f0c735f44beb2c6a4b4b3308ea283ef6c357364e84494f
4
+ data.tar.gz: 1758aae21035e1989f40941393edf4489a0560633d1ff2323242bc7be71fa3a4
5
5
  SHA512:
6
- metadata.gz: c8106b3e246dcad98ef390fc3ce0f2ea8ea3bb604611a6ac7a8e2b760a2ed557b3ad884392ab6d8c0022b9c7326eb4187b9f0b1f8d47a80e8555383fe603e80c
7
- data.tar.gz: 4d4833dc9484449c7f91295f6b033994791a1587316d10b95564133fcbcc368fb02cb890d220b803d0076b93e9efd408ea5f0bc58bc7af97b539538ec613b145
6
+ metadata.gz: 3da83b5c3c5efde19ef03cdee229cddb2dd57585f8bef7d211f7e06b45a2c8c1d0ae62e69b45a95ff3928a88510bece2a498f3d8a2acfa1f5ab06881d058f295
7
+ data.tar.gz: 3290917b8c704ea71b024a0bddf8eb3d416e4f52e882680d0f826081dba265d05bcf5ac4facbc24d303db2ed9ab9715a1ca1b9c223a3ab4ab9900b25f064ceb4
@@ -99,10 +99,11 @@ module MetaRPC
99
99
  define_method method_name do |*args, &block|
100
100
  case params_contract
101
101
  when nil
102
- raise json_rpc_error(:invalid_params) unless args.empty?
102
+ raise_json_rpc_error(:invalid_params) unless args.empty?
103
103
  when Array
104
104
  validate_item(args, params_contract)
105
105
  when Hash
106
+ raise_json_rpc_error(:invalid_params) unless args[0].is_a?(Hash)
106
107
  validate_item(args[0], params_contract)
107
108
  else
108
109
  raise_json_rpc_error(:internal_error)
@@ -0,0 +1,70 @@
1
+ module MetaRPC
2
+ class Client
3
+ attr_reader :metarpc_url, :metarpc_pending_batch, :metarpc_header_setter_func
4
+
5
+ def initialize(url, header_setter_func = nil)
6
+ @metarpc_url = URI.parse(url)
7
+ @metarpc_header_setter_func = header_setter_func
8
+ end
9
+
10
+ def respond_to_missing?(_sym)
11
+ true
12
+ end
13
+
14
+ def method_missing(sym, *args, &blk)
15
+ call = metarpc_build_method(sym, args)
16
+ return metarpc_pending_batch << { call: call, on_response: blk } if metarpc_pending_batch
17
+
18
+ metarpc_execute_request(call)
19
+ end
20
+
21
+ def rpc_batch(&blk)
22
+ @metarpc_pending_batch = []
23
+ instance_exec(&blk)
24
+ metarpc_execute_request(metarpc_pending_batch.map { |p| p[:call] })
25
+ @metarpc_pending_batch = nil
26
+ end
27
+
28
+ def metarpc_build_method(method, args)
29
+ {
30
+ jsonrpc: '2.0',
31
+ method: method,
32
+ params: args[0].is_a?(Hash) && args.count == 1 ? args[0] : args,
33
+ id: SecureRandom.uuid
34
+ }
35
+ end
36
+
37
+ def metarpc_execute_request(call)
38
+ body = call.to_json
39
+ headers = metarpc_header_setter_func.call(body) if metarpc_header_setter_func.present?
40
+ (headers ||= {})['Content-Type'] = 'text/json'
41
+
42
+ http = Net::HTTP.new(metarpc_url.host, metarpc_url.port)
43
+ request = Net::HTTP::Post.new(metarpc_url.request_uri, headers)
44
+ request.body = body
45
+
46
+ metarpc_parse_response(http.request(request).body)
47
+ end
48
+
49
+ def metarpc_parse_response(raw_response)
50
+ response = JSON.parse(raw_response)
51
+ return metarpc_handle_batch_response(response) if metarpc_pending_batch
52
+
53
+ response.deep_symbolize_keys!
54
+ raise RpcClientError.new(response[:error]), "#{response[:error][:code]} #{response[:error][:message]}" if response.key?(:error)
55
+
56
+ response[:result]
57
+ end
58
+
59
+ def metarpc_handle_batch_response(response)
60
+ response.each do |raw_call_response|
61
+ call_response = raw_call_response.deep_symbolize_keys
62
+ pending_batch = metarpc_pending_batch.find { |batch| batch[:call][:id] == call_response[:id] }
63
+ next unless pending_batch[:on_response].present?
64
+
65
+ response = ResponseWrapper.new(call_response)
66
+ pending_batch[:on_response].call(response)
67
+ end
68
+ end
69
+ end
70
+ end
@@ -90,7 +90,7 @@ module MetaRPC
90
90
  end
91
91
 
92
92
  def raise_error(code)
93
- raise RPCError.new(code), 'Error on interpreter'
93
+ raise RPCError.new(code), "Error on interpreter : #{code}"
94
94
  end
95
95
  end
96
96
  end
@@ -0,0 +1,20 @@
1
+ module MetaRPC
2
+ class ResponseWrapper
3
+ def initialize(response)
4
+ @response = response
5
+ end
6
+
7
+ def enforce_correct_value
8
+ raise RpcClientError.new(@response[:error]), "#{@response[:error][:code]} #{@response[:error][:message]}" if @response.key?(:error)
9
+ end
10
+
11
+ def value
12
+ enforce_correct_value
13
+ @response[:result]
14
+ end
15
+
16
+ def [](key)
17
+ value[key]
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,9 @@
1
+ module MetaRPC
2
+ class RpcClientError < StandardError
3
+ attr_reader :rpc_error
4
+
5
+ def initialize(rpc_error)
6
+ @rpc_error = rpc_error
7
+ end
8
+ end
9
+ end
@@ -1,7 +1,7 @@
1
1
  module MetaRPC
2
2
  # RPC possible errors
3
3
  class RPCError < StandardError
4
- attr_reader :code
4
+ attr_reader :code, :forced_code
5
5
 
6
6
  CODE_TO_MESSAGE = {
7
7
  parse_error: {
@@ -31,11 +31,15 @@ module MetaRPC
31
31
  }.freeze
32
32
 
33
33
  def initialize(code)
34
- @code = code
34
+ if code.is_a?(Symbol)
35
+ @code = code
36
+ else
37
+ @forced_code = code
38
+ end
35
39
  end
36
40
 
37
41
  def to_h
38
- CODE_TO_MESSAGE[code]
42
+ forced_code || CODE_TO_MESSAGE[code]
39
43
  end
40
44
  end
41
45
  end
data/lib/metarpc.rb CHANGED
@@ -1,6 +1,13 @@
1
+ require 'net/http'
2
+ require 'uri'
1
3
  require 'json'
4
+ require 'securerandom'
2
5
  require 'active_support/all'
3
6
 
7
+ require_relative 'metarpc/response_wrapper'
8
+ require_relative 'metarpc/rpc_client_error'
9
+ require_relative 'metarpc/client'
10
+
4
11
  require_relative 'metarpc/rpc_error'
5
12
  require_relative 'metarpc/callable'
6
13
  require_relative 'metarpc/interpreter'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: metarpc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2.1
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thesaurio Team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-01-27 00:00:00.000000000 Z
11
+ date: 2019-02-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -30,6 +30,20 @@ dependencies:
30
30
  - - "~>"
31
31
  - !ruby/object:Gem::Version
32
32
  version: '5'
33
+ - !ruby/object:Gem::Dependency
34
+ name: pry
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: 0.12.2
40
+ type: :development
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: 0.12.2
33
47
  - !ruby/object:Gem::Dependency
34
48
  name: rspec
35
49
  requirement: !ruby/object:Gem::Requirement
@@ -59,19 +73,59 @@ dependencies:
59
73
  - !ruby/object:Gem::Version
60
74
  version: 0.63.1
61
75
  - !ruby/object:Gem::Dependency
62
- name: pry
76
+ name: simplecov
63
77
  requirement: !ruby/object:Gem::Requirement
64
78
  requirements:
65
79
  - - "~>"
66
80
  - !ruby/object:Gem::Version
67
- version: 0.12.2
81
+ version: 0.16.1
68
82
  type: :development
69
83
  prerelease: false
70
84
  version_requirements: !ruby/object:Gem::Requirement
71
85
  requirements:
72
86
  - - "~>"
73
87
  - !ruby/object:Gem::Version
74
- version: 0.12.2
88
+ version: 0.16.1
89
+ - !ruby/object:Gem::Dependency
90
+ name: sinatra
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '2.0'
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ version: 2.0.5
99
+ type: :development
100
+ prerelease: false
101
+ version_requirements: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - "~>"
104
+ - !ruby/object:Gem::Version
105
+ version: '2.0'
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: 2.0.5
109
+ - !ruby/object:Gem::Dependency
110
+ name: webmock
111
+ requirement: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - "~>"
114
+ - !ruby/object:Gem::Version
115
+ version: '3.5'
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: 3.5.1
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - "~>"
124
+ - !ruby/object:Gem::Version
125
+ version: '3.5'
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: 3.5.1
75
129
  description: Build a RPC API with ease
76
130
  email: hello@thesaur.io
77
131
  executables: []
@@ -80,7 +134,10 @@ extra_rdoc_files: []
80
134
  files:
81
135
  - lib/metarpc.rb
82
136
  - lib/metarpc/callable.rb
137
+ - lib/metarpc/client.rb
83
138
  - lib/metarpc/interpreter.rb
139
+ - lib/metarpc/response_wrapper.rb
140
+ - lib/metarpc/rpc_client_error.rb
84
141
  - lib/metarpc/rpc_error.rb
85
142
  homepage: http://rubygems.org/gems/hola
86
143
  licenses: