combi 0.0.7 → 0.0.8
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/combi/buses/http.rb +2 -0
- data/lib/combi/buses/in_process.rb +23 -20
- data/lib/combi/buses/web_socket.rb +1 -0
- data/lib/combi/version.rb +1 -1
- data/spec/integration/multi_bus_spec.rb +92 -24
- data/spec/shared_examples/standard_bus.rb +24 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bf7f73f8dc51e7b390cbdfd3d76bd26d74e95261
|
4
|
+
data.tar.gz: eed9f9840dd7e43cb8c72057bdb9688e49d94bf5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c5287c09cd3cceb88ca67b98ffe8641ae3f607d8d472a1048762d8318bbad8254a0d299555811a09d0e8ad998a45fa780b3449efed7a708a395f8f1d17f4ab18
|
7
|
+
data.tar.gz: 82a80a9e331d18d31ada7497e2a9ddde314a4b59874f1487baf95bb73d3ef77fd1766032f3569a692316e414c876cf81a088098ba9cf859f4305dcb8fd95e732
|
data/lib/combi/buses/http.rb
CHANGED
@@ -6,30 +6,33 @@ module Combi
|
|
6
6
|
def request(handler_name, kind, message, options = {})
|
7
7
|
options[:timeout] ||= RPC_DEFAULT_TIMEOUT
|
8
8
|
handler = memory_handlers[handler_name.to_s]
|
9
|
-
return if handler.nil?
|
10
|
-
service_instance = handler[:service_instance]
|
11
|
-
message = JSON.parse(message.to_json)
|
12
|
-
return unless service_instance.respond_to?(kind)
|
13
9
|
waiter = EventMachine::DefaultDeferrable.new
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
10
|
+
if handler.nil?
|
11
|
+
waiter.fail('error' => true, 'message' => 'unknown service')
|
12
|
+
else
|
13
|
+
service_instance = handler[:service_instance]
|
14
|
+
message = JSON.parse(message.to_json)
|
15
|
+
return unless service_instance.respond_to?(kind)
|
16
|
+
waiter.timeout(options[:timeout], RuntimeError.new(Timeout::Error))
|
17
|
+
begin
|
18
|
+
Timeout.timeout(options[:timeout]) do
|
19
|
+
response = service_instance.send(kind, message)
|
20
|
+
if response.respond_to? :succeed
|
21
|
+
response.callback do |service_response|
|
22
|
+
waiter.succeed service_response
|
23
|
+
end
|
24
|
+
else
|
25
|
+
waiter.succeed response
|
21
26
|
end
|
22
|
-
else
|
23
|
-
waiter.succeed response
|
24
27
|
end
|
28
|
+
rescue Timeout::Error => e
|
29
|
+
log "ERROR"
|
30
|
+
waiter.fail RuntimeError.new(Timeout::Error)
|
31
|
+
rescue Exception => e
|
32
|
+
log "other ERROR"
|
33
|
+
log e.inspect
|
34
|
+
waiter.fail({'error' => true, 'message' => e.message})
|
25
35
|
end
|
26
|
-
rescue Timeout::Error => e
|
27
|
-
log "ERROR"
|
28
|
-
waiter.fail RuntimeError.new(Timeout::Error)
|
29
|
-
rescue Exception => e
|
30
|
-
log "other ERROR"
|
31
|
-
log e.inspect
|
32
|
-
waiter.fail({'error' => true, 'message' => e.message})
|
33
36
|
end
|
34
37
|
waiter
|
35
38
|
end
|
data/lib/combi/version.rb
CHANGED
@@ -26,15 +26,35 @@ describe "in a multi bus environment" do
|
|
26
26
|
def do_it(params)
|
27
27
|
defer = EventMachine::DefaultDeferrable.new
|
28
28
|
EM.synchrony do
|
29
|
-
|
29
|
+
service_name = params ['service_name'] || :say_hello
|
30
|
+
req = @other_client.request(service_name, :do_it, params, timeout: 0.1)
|
30
31
|
service_result = EM::Synchrony.sync req
|
31
|
-
|
32
|
+
if service_result.is_a? RuntimeError
|
33
|
+
if @other_client.is_a?(Combi::Queue) && service_result.message == "Timeout::Error"
|
34
|
+
defer.succeed({'error' => true, 'message' => 'other service failed'})
|
35
|
+
else
|
36
|
+
defer.succeed({'error' => true, 'message' => 'unknown error'})
|
37
|
+
end
|
38
|
+
else
|
39
|
+
if service_result.respond_to?(:keys) && service_result['error'] == true
|
40
|
+
defer.succeed({'error' => true, 'message' => 'other service failed'})
|
41
|
+
else
|
42
|
+
defer.succeed(service_result*2)
|
43
|
+
end
|
44
|
+
end
|
32
45
|
end
|
33
46
|
defer
|
34
47
|
end
|
35
48
|
end
|
36
49
|
end
|
37
50
|
|
51
|
+
Given(:broken_service) do
|
52
|
+
Module.new do
|
53
|
+
def actions; [:say_hello_if_you_can]; end
|
54
|
+
def do_it(params); puts "raising error"; raise "I can't talk" ; end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
38
58
|
Given(:amqp_config) do
|
39
59
|
{
|
40
60
|
:host => "127.0.0.1",
|
@@ -68,10 +88,8 @@ describe "in a multi bus environment" do
|
|
68
88
|
RabbitmqServer.instance.stop! if ENV['CLEAN']
|
69
89
|
}
|
70
90
|
|
71
|
-
Given(:options) { {timeout:
|
91
|
+
Given(:options) { {timeout: 0.5} }
|
72
92
|
|
73
|
-
Given(:service_for_main_bus) { main_bus_provider.add_service composed_service_class.new(internal_bus_consumer) }
|
74
|
-
Given(:service_for_internal_bus) { internal_bus_provider.add_service boring_salutation_service }
|
75
93
|
When(:params) { { who: 'world' } }
|
76
94
|
When(:expected_result) { "Hello worldHello world" }
|
77
95
|
|
@@ -111,28 +129,78 @@ describe "in a multi bus environment" do
|
|
111
129
|
end
|
112
130
|
end
|
113
131
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
132
|
+
Given(:prepare) do
|
133
|
+
service_for_main_bus
|
134
|
+
start_internal = service_for_internal_bus
|
135
|
+
main_bus_provider.start!
|
136
|
+
internal_bus_provider.start! if start_internal
|
137
|
+
send("#{main}_server")
|
138
|
+
send("#{internal}_server")
|
139
|
+
main_bus_consumer.start!
|
140
|
+
internal_bus_consumer.start! if start_internal
|
141
|
+
end
|
142
|
+
|
143
|
+
Given(:finalize) do
|
144
|
+
main_bus_provider.stop!
|
145
|
+
internal_bus_provider.stop!
|
146
|
+
main_bus_consumer.stop!
|
147
|
+
internal_bus_consumer.stop!
|
148
|
+
end
|
149
|
+
|
150
|
+
context "both services are working ok" do
|
151
|
+
Given(:service_for_main_bus) { main_bus_provider.add_service composed_service_class.new(internal_bus_consumer); true }
|
152
|
+
Given(:service_for_internal_bus) { internal_bus_provider.add_service boring_salutation_service; true }
|
153
|
+
|
154
|
+
Then do
|
155
|
+
em do
|
156
|
+
prepare
|
157
|
+
EM.synchrony do
|
158
|
+
service_result = EM::Synchrony.sync main_bus_consumer.request(:repeat_with_me, :do_it, params, options)
|
159
|
+
service_result.should eq expected_result
|
160
|
+
done
|
161
|
+
finalize
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
context "the external service raise an error" do
|
168
|
+
Given(:service_for_main_bus) { main_bus_provider.add_service broken_service; true }
|
169
|
+
Given(:service_for_internal_bus) { false }
|
170
|
+
|
171
|
+
Then do
|
172
|
+
em do
|
173
|
+
prepare
|
174
|
+
EM.synchrony do
|
175
|
+
service_result = EM::Synchrony.sync main_bus_consumer.request(:say_hello_if_you_can, :do_it, params, options)
|
176
|
+
service_result['error'].should be_true
|
177
|
+
service_result['message'].should eq "I can't talk"
|
178
|
+
done
|
179
|
+
finalize
|
180
|
+
end
|
133
181
|
end
|
134
182
|
end
|
135
183
|
end
|
184
|
+
|
185
|
+
context "the internal service raise an error" do
|
186
|
+
Given(:service_for_main_bus) { main_bus_provider.add_service composed_service_class.new(internal_bus_consumer); true }
|
187
|
+
Given(:service_for_internal_bus) { main_bus_provider.add_service broken_service; true }
|
188
|
+
|
189
|
+
Then do
|
190
|
+
em do
|
191
|
+
prepare
|
192
|
+
EM.synchrony do
|
193
|
+
params.merge!('service_name' => 'say_hello_if_you_can')
|
194
|
+
service_result = EM::Synchrony.sync main_bus_consumer.request(:repeat_with_me, :do_it, params, options)
|
195
|
+
service_result['error'].should be_true
|
196
|
+
service_result['message'].should eq 'other service failed'
|
197
|
+
done
|
198
|
+
finalize
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
136
204
|
end
|
137
205
|
end
|
138
206
|
end
|
@@ -151,4 +151,28 @@ shared_examples_for "standard_bus" do
|
|
151
151
|
end
|
152
152
|
end
|
153
153
|
end
|
154
|
+
|
155
|
+
context 'return an error when requesting an unknown service' do
|
156
|
+
Given(:error_message) { 'unknown service' }
|
157
|
+
When(:service) { provider.add_service broken_service }
|
158
|
+
Then do
|
159
|
+
em do
|
160
|
+
prepare
|
161
|
+
EM.synchrony do
|
162
|
+
begin
|
163
|
+
service_result = EM::Synchrony.sync consumer.request(:some_not_service, :do_it, {}, { timeout: 0.1 })
|
164
|
+
if service_result.is_a? RuntimeError
|
165
|
+
consumer.class.should eq Combi::Queue
|
166
|
+
service_result.message.should eq "Timeout::Error"
|
167
|
+
else
|
168
|
+
service_result['error'].should be_true
|
169
|
+
service_result['message'].should eq error_message
|
170
|
+
end
|
171
|
+
done
|
172
|
+
finalize
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
154
178
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: combi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- German Del Zotto
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-05-
|
12
|
+
date: 2014-05-25 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: yajl-ruby
|