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 +4 -4
- data/lib/metarpc/callable.rb +2 -1
- data/lib/metarpc/client.rb +70 -0
- data/lib/metarpc/interpreter.rb +1 -1
- data/lib/metarpc/response_wrapper.rb +20 -0
- data/lib/metarpc/rpc_client_error.rb +9 -0
- data/lib/metarpc/rpc_error.rb +7 -3
- data/lib/metarpc.rb +7 -0
- metadata +62 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6fa5bd3e70fe9ed9b8f0c735f44beb2c6a4b4b3308ea283ef6c357364e84494f
|
4
|
+
data.tar.gz: 1758aae21035e1989f40941393edf4489a0560633d1ff2323242bc7be71fa3a4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3da83b5c3c5efde19ef03cdee229cddb2dd57585f8bef7d211f7e06b45a2c8c1d0ae62e69b45a95ff3928a88510bece2a498f3d8a2acfa1f5ab06881d058f295
|
7
|
+
data.tar.gz: 3290917b8c704ea71b024a0bddf8eb3d416e4f52e882680d0f826081dba265d05bcf5ac4facbc24d303db2ed9ab9715a1ca1b9c223a3ab4ab9900b25f064ceb4
|
data/lib/metarpc/callable.rb
CHANGED
@@ -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
|
-
|
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
|
data/lib/metarpc/interpreter.rb
CHANGED
@@ -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
|
data/lib/metarpc/rpc_error.rb
CHANGED
@@ -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
|
-
|
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.
|
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-
|
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:
|
76
|
+
name: simplecov
|
63
77
|
requirement: !ruby/object:Gem::Requirement
|
64
78
|
requirements:
|
65
79
|
- - "~>"
|
66
80
|
- !ruby/object:Gem::Version
|
67
|
-
version: 0.
|
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.
|
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:
|