lolitra 0.0.3 → 0.0.4
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.
- data/.gitignore +1 -0
- data/lib/lolitra/{.version.rb.swp → .future.rb.swp} +0 -0
- data/lib/lolitra/.handler_base.rb.swp +0 -0
- data/lib/lolitra/future.rb +7 -0
- data/lib/lolitra/handler_base.rb +42 -53
- data/lib/lolitra/version.rb +1 -1
- data/lib/lolitra.rb +1 -0
- data/spec/.lolitra_spec.rb.swp +0 -0
- data/spec/lolitra_spec.rb +68 -22
- data/spec/spec_helper.rb +4 -0
- metadata +5 -4
data/.gitignore
CHANGED
Binary file
|
Binary file
|
data/lib/lolitra/handler_base.rb
CHANGED
@@ -62,20 +62,21 @@ module Lolitra
|
|
62
62
|
private
|
63
63
|
def message_handler(message_class, id = :id)
|
64
64
|
message_class.new.send(id) #check if id exists for this class
|
65
|
-
handlers.merge!(message_class.
|
65
|
+
handlers.merge!(message_class.message_key => [message_class, get_method_by_class(message_class), id])
|
66
66
|
end
|
67
67
|
|
68
|
-
def started_by(message_class)
|
69
|
-
starters << message_class.
|
68
|
+
def started_by(message_class, id = :id)
|
69
|
+
starters << message_class.message_key
|
70
|
+
message_handler(message_class, id)
|
70
71
|
end
|
71
72
|
|
72
73
|
def search(message)
|
73
|
-
id_method_name = handlers[message.class.
|
74
|
+
id_method_name = handlers[message.class.message_key][2]
|
74
75
|
send("find_by_#{id_method_name}", message.send(id_method_name))
|
75
76
|
end
|
76
77
|
|
77
78
|
def is_starter?(message)
|
78
|
-
starters.include? message.class.
|
79
|
+
starters.include? message.class.message_key
|
79
80
|
end
|
80
81
|
|
81
82
|
def get_handler(message)
|
@@ -104,7 +105,7 @@ module Lolitra
|
|
104
105
|
end
|
105
106
|
|
106
107
|
def handle(message)
|
107
|
-
handler_method = self.class.handlers[message.class.
|
108
|
+
handler_method = self.class.handlers[message.class.message_key][1]
|
108
109
|
raise "Can't handle message #{message.class}" unless handler_method
|
109
110
|
self.send(handler_method, message)
|
110
111
|
end
|
@@ -124,12 +125,24 @@ module Lolitra
|
|
124
125
|
instance.bus
|
125
126
|
end
|
126
127
|
|
127
|
-
def self.
|
128
|
-
instance.
|
128
|
+
def self.register_subscriber(handler_class)
|
129
|
+
instance.register_subscriber(handler_class)
|
129
130
|
end
|
130
131
|
|
131
|
-
def
|
132
|
-
|
132
|
+
def register_subscriber(handler_class)
|
133
|
+
handler_class.handle_messages.each do |message_class|
|
134
|
+
bus.subscribe(message_class, handler_class)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def self.register_pull_subscriber(handler_class)
|
139
|
+
instance.register_pull_subscriber(handler_class)
|
140
|
+
end
|
141
|
+
|
142
|
+
def register_pull_subscriber(handler_class)
|
143
|
+
handler_class.handle_messages.each do |message_class|
|
144
|
+
bus.pull_subscribe(message_class, handler_class)
|
145
|
+
end
|
133
146
|
end
|
134
147
|
|
135
148
|
def self.publish(message_instance)
|
@@ -139,17 +152,11 @@ module Lolitra
|
|
139
152
|
def publish(message_instance)
|
140
153
|
bus.publish(message_instance)
|
141
154
|
end
|
142
|
-
private
|
143
|
-
def register_message_handler(handler_class)
|
144
|
-
handler_class.handle_messages.each do |message_class|
|
145
|
-
bus.subscribe(message_class, handler_class)
|
146
|
-
end
|
147
|
-
end
|
148
155
|
end
|
149
156
|
|
150
|
-
module
|
157
|
+
module Message
|
151
158
|
|
152
|
-
module
|
159
|
+
module MessageClass
|
153
160
|
def self.extended(base)
|
154
161
|
class << base; attr_accessor :class_message_key; end
|
155
162
|
end
|
@@ -158,7 +165,7 @@ module Lolitra
|
|
158
165
|
if (key)
|
159
166
|
self.class_message_key = key
|
160
167
|
else
|
161
|
-
self.class_message_key
|
168
|
+
self.class_message_key || "#{MessageHandler::Helper.underscore(self.class.name)}"
|
162
169
|
end
|
163
170
|
end
|
164
171
|
|
@@ -170,7 +177,7 @@ module Lolitra
|
|
170
177
|
end
|
171
178
|
|
172
179
|
def self.included(base)
|
173
|
-
base.send :extend,
|
180
|
+
base.send :extend, MessageClass
|
174
181
|
end
|
175
182
|
|
176
183
|
def initialize(hash={})
|
@@ -184,32 +191,6 @@ module Lolitra
|
|
184
191
|
end
|
185
192
|
end
|
186
193
|
|
187
|
-
module AmqpMessageHandler
|
188
|
-
module AmqpMessageHandlerClass
|
189
|
-
|
190
|
-
def self.extended(base)
|
191
|
-
class << base
|
192
|
-
attr_accessor :message_class_by_key
|
193
|
-
alias_method :message_handler_without_class_by_key, :message_handler unless method_defined?(:message_handler_without_class_by_key)
|
194
|
-
alias_method :message_handler, :message_handler_with_class_by_key
|
195
|
-
end
|
196
|
-
base.message_class_by_key = {}
|
197
|
-
end
|
198
|
-
|
199
|
-
def message_handler_with_class_by_key(message_class, id = :id)
|
200
|
-
message_class_by_key.merge!({message_class.message_key => message_class})
|
201
|
-
message_handler_without_class_by_key(message_class, id)
|
202
|
-
end
|
203
|
-
|
204
|
-
end
|
205
|
-
|
206
|
-
def self.included(base)
|
207
|
-
base.send :include, MessageHandler
|
208
|
-
base.send :extend, AmqpMessageHandlerClass
|
209
|
-
end
|
210
|
-
|
211
|
-
end
|
212
|
-
|
213
194
|
class AmqpBus
|
214
195
|
attr_accessor :queue_prefix
|
215
196
|
attr_accessor :connection
|
@@ -228,18 +209,26 @@ module Lolitra
|
|
228
209
|
end
|
229
210
|
|
230
211
|
def subscribe(message_class, handler_class)
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
end
|
237
|
-
end
|
212
|
+
create_queue(message_class, handler_class, {:exclusive => true, :durable => false}, "")
|
213
|
+
end
|
214
|
+
|
215
|
+
def pull_subscribe(message_class, handler_class)
|
216
|
+
create_queue(message_class, handler_class, {:durable => true}, queue_prefix + MessageHandler::Helpers.underscore(handler_class.name))
|
238
217
|
end
|
239
218
|
|
240
219
|
def publish(message)
|
241
220
|
self.exchange.publish(message.marshall, :routing_key => message.class.message_key, :timestamp => Time.now.to_i)
|
242
221
|
end
|
243
222
|
|
223
|
+
private
|
224
|
+
def create_queue(message_class, handler_class, options, queue_name)
|
225
|
+
EM.next_tick do
|
226
|
+
channel = AMQP::Channel.new(self.connection)
|
227
|
+
channel.prefetch(1).queue(queue_name, options).bind(self.exchange, :routing_key => message_class.message_key).subscribe do |info, payload|
|
228
|
+
message_class_tmp = handler_class.handlers[info.routing_key][0]
|
229
|
+
handler_class.handle(message_class_tmp.unmarshall(payload))
|
230
|
+
end
|
231
|
+
end
|
232
|
+
end
|
244
233
|
end
|
245
234
|
end
|
data/lib/lolitra/version.rb
CHANGED
data/lib/lolitra.rb
CHANGED
data/spec/.lolitra_spec.rb.swp
CHANGED
Binary file
|
data/spec/lolitra_spec.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper.rb'
|
2
2
|
|
3
3
|
class TestMessage
|
4
|
-
include Lolitra::
|
4
|
+
include Lolitra::Message
|
5
5
|
|
6
6
|
message_key "test1"
|
7
7
|
|
@@ -11,7 +11,7 @@ class TestMessage
|
|
11
11
|
end
|
12
12
|
|
13
13
|
class TestMessage1
|
14
|
-
include Lolitra::
|
14
|
+
include Lolitra::Message
|
15
15
|
|
16
16
|
message_key "test2"
|
17
17
|
|
@@ -24,7 +24,6 @@ class TestMessageHandler
|
|
24
24
|
include Lolitra::MessageHandler
|
25
25
|
|
26
26
|
started_by TestMessage
|
27
|
-
message_handler TestMessage
|
28
27
|
stateful true
|
29
28
|
|
30
29
|
def self.find_by_id(id)
|
@@ -41,7 +40,6 @@ class TestMessageHandler1
|
|
41
40
|
|
42
41
|
started_by TestMessage1
|
43
42
|
message_handler TestMessage
|
44
|
-
message_handler TestMessage1
|
45
43
|
|
46
44
|
stateful true
|
47
45
|
|
@@ -59,19 +57,23 @@ class TestMessageHandler1
|
|
59
57
|
|
60
58
|
end
|
61
59
|
|
62
|
-
class
|
63
|
-
include Lolitra::
|
60
|
+
class TestMessageHandlerAmqp
|
61
|
+
include Lolitra::MessageHandler
|
64
62
|
|
65
63
|
message_handler TestMessage
|
66
64
|
message_handler TestMessage1
|
67
65
|
|
68
66
|
stateful false
|
69
67
|
|
70
|
-
def test_message(message)
|
71
|
-
EM.stop { exit }
|
72
|
-
end
|
73
68
|
end
|
74
69
|
|
70
|
+
class TestMessageHandlerAmqp1
|
71
|
+
include Lolitra::MessageHandler
|
72
|
+
|
73
|
+
message_handler TestMessage
|
74
|
+
|
75
|
+
stateful false
|
76
|
+
end
|
75
77
|
|
76
78
|
describe Lolitra::MessageHandler,'#create_handler' do
|
77
79
|
it "returns old instance of the handler for the same message id" do
|
@@ -115,7 +117,7 @@ describe Lolitra::MessageHandler, '#publish' do
|
|
115
117
|
message = TestMessage.new
|
116
118
|
bus = TestBus.new
|
117
119
|
Lolitra::MessageHandlerManager.bus = bus
|
118
|
-
Lolitra::MessageHandlerManager.
|
120
|
+
Lolitra::MessageHandlerManager.register_subscriber(TestMessageHandler)
|
119
121
|
|
120
122
|
|
121
123
|
TestMessageHandler.should_receive(:handle).with(message)
|
@@ -127,7 +129,7 @@ describe Lolitra::MessageHandlerManager, '#publish' do
|
|
127
129
|
it "can send message to the bus" do
|
128
130
|
bus = TestBus.new
|
129
131
|
Lolitra::MessageHandlerManager.bus = bus
|
130
|
-
Lolitra::MessageHandlerManager.
|
132
|
+
Lolitra::MessageHandlerManager.register_subscriber(TestMessageHandler)
|
131
133
|
|
132
134
|
message = TestMessage.new
|
133
135
|
|
@@ -144,8 +146,8 @@ describe Lolitra::MessageHandlerManager, '#handle_message' do
|
|
144
146
|
|
145
147
|
Lolitra::MessageHandlerManager.bus = bus
|
146
148
|
|
147
|
-
Lolitra::MessageHandlerManager.
|
148
|
-
Lolitra::MessageHandlerManager.
|
149
|
+
Lolitra::MessageHandlerManager.register_subscriber(TestMessageHandler)
|
150
|
+
Lolitra::MessageHandlerManager.register_subscriber(TestMessageHandler1)
|
149
151
|
|
150
152
|
message = TestMessage.new
|
151
153
|
message1 = TestMessage1.new
|
@@ -161,7 +163,7 @@ describe Lolitra::MessageHandlerManager, '#handle_message' do
|
|
161
163
|
end
|
162
164
|
end
|
163
165
|
|
164
|
-
describe Lolitra::
|
166
|
+
describe Lolitra::Message, '#message_key' do
|
165
167
|
it "message_key has constant key for a class" do
|
166
168
|
TestMessage.message_key.should eq "test1"
|
167
169
|
TestMessage1.message_key.should eq "test2"
|
@@ -169,24 +171,27 @@ describe Lolitra::AmqpMessage, '#message_key' do
|
|
169
171
|
end
|
170
172
|
end
|
171
173
|
|
172
|
-
describe Lolitra::
|
174
|
+
describe Lolitra::MessageHandler, '#message_class_by_key' do
|
173
175
|
it "should return the message_class that belongs to key" do
|
174
|
-
|
175
|
-
|
176
|
+
TestMessageHandler1.handlers[TestMessage.message_key][0].name.should eq "TestMessage"
|
177
|
+
TestMessageHandler1.handlers[TestMessage1.message_key][0].name.should eq "TestMessage1"
|
176
178
|
end
|
177
179
|
end
|
178
180
|
|
179
181
|
describe Lolitra::AmqpBus do
|
180
182
|
it "should recive message when publish a message" do
|
181
183
|
Lolitra::MessageHandlerManager.bus = Lolitra::AmqpBus.new(:host => "127.0.0.1", :exchange => "test_exchange")
|
182
|
-
Lolitra::MessageHandlerManager.
|
184
|
+
Lolitra::MessageHandlerManager.register_pull_subscriber(TestMessageHandlerAmqp)
|
185
|
+
Lolitra::MessageHandlerManager.register_pull_subscriber(TestMessageHandlerAmqp1)
|
183
186
|
|
184
|
-
|
187
|
+
TestMessageHandlerAmqp.should_receive(:handle) do |message|
|
185
188
|
message.should be_an_instance_of TestMessage
|
186
189
|
EM.stop { exit }
|
187
190
|
end
|
188
191
|
|
189
|
-
|
192
|
+
EM.add_timer(0.25) do
|
193
|
+
Lolitra::MessageHandlerManager.publish(TestMessage.new)
|
194
|
+
end
|
190
195
|
|
191
196
|
EM.next_tick{ EM.add_timer(60) { EM.stop { exit } }}
|
192
197
|
AMQP::Utilities::EventLoopHelper.eventmachine_thread.join
|
@@ -195,7 +200,48 @@ end
|
|
195
200
|
|
196
201
|
describe Lolitra::AmqpBus do
|
197
202
|
it "should return a unable to connect when specify a wrong amqp host" do
|
198
|
-
expect { Lolitra::AmqpBus.new(:host => "192.168.123.123") }.to raise_error(
|
199
|
-
|
203
|
+
expect { Lolitra::AmqpBus.new(:host => "192.168.123.123") }.to raise_error(Exception) #TODO
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
describe Lolitra::AmqpBus do
|
208
|
+
it "should send all messages to all subscribers in non pull mode" do
|
209
|
+
Lolitra::MessageHandlerManager.bus = Lolitra::AmqpBus.new(:host => "127.0.0.1", :exchange => "test_exchange")
|
210
|
+
Lolitra::MessageHandlerManager.register_subscriber(TestMessageHandlerAmqp)
|
211
|
+
Lolitra::MessageHandlerManager.register_subscriber(TestMessageHandlerAmqp1)
|
212
|
+
|
213
|
+
@handled_message_1 = false
|
214
|
+
@handled_message_2 = false
|
215
|
+
|
216
|
+
TestMessageHandlerAmqp.should_receive(:handle) do |message|
|
217
|
+
message.should be_an_instance_of TestMessage
|
218
|
+
@handled_message_1 = true
|
219
|
+
EM.stop { exit } if @handled_message_1 && @handled_message_2
|
220
|
+
end
|
221
|
+
|
222
|
+
TestMessageHandlerAmqp1.should_receive(:handle) do |message|
|
223
|
+
message.should be_an_instance_of TestMessage
|
224
|
+
@handled_message_2 = true
|
225
|
+
EM.stop { exit } if @handled_message_1 && @handled_message_2
|
226
|
+
end
|
227
|
+
|
228
|
+
EM.add_timer(0.25){
|
229
|
+
Lolitra::MessageHandlerManager.publish(TestMessage.new)
|
230
|
+
}
|
231
|
+
|
232
|
+
EM.next_tick{ EM.add_timer(60) { EM.stop { exit } }}
|
233
|
+
AMQP::Utilities::EventLoopHelper.eventmachine_thread.join
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
describe Lolitra::Future,"#wait_message" do
|
238
|
+
it "should return the message" do
|
239
|
+
Lolitra::MessageHandlerManager.bus = Lolitra::AmqpBus.new(:host => "127.0.0.1", :exchange => "test_exchange")
|
240
|
+
EM.next_tick{
|
241
|
+
Lolitra::MessageHandlerManager.publish(TestMessage.new)
|
242
|
+
}
|
243
|
+
future = Lolitra::Future.new
|
244
|
+
message = future.wait_for(TestMessage)
|
245
|
+
message.should be_an_instance_of TestMessage
|
200
246
|
end
|
201
247
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -21,6 +21,10 @@ class TestBus
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
+
def pull_subscribe(message_class, handler_class)
|
25
|
+
subscribe(message_class, handler_class)
|
26
|
+
end
|
27
|
+
|
24
28
|
def subscribe(message_class, handler_class)
|
25
29
|
@unmarshallers[message_class.message_key] = message_class
|
26
30
|
@handlers[message_class.name] ||= []
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 4
|
9
|
+
version: 0.0.4
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Hugo Freire
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2012-05-
|
17
|
+
date: 2012-05-28 00:00:00 +02:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -73,8 +73,9 @@ files:
|
|
73
73
|
- README.md
|
74
74
|
- Rakefile
|
75
75
|
- lib/lolitra.rb
|
76
|
+
- lib/lolitra/.future.rb.swp
|
76
77
|
- lib/lolitra/.handler_base.rb.swp
|
77
|
-
- lib/lolitra
|
78
|
+
- lib/lolitra/future.rb
|
78
79
|
- lib/lolitra/handler_base.rb
|
79
80
|
- lib/lolitra/version.rb
|
80
81
|
- lolitra.gemspec
|