rabbit_feed 2.0.0 → 2.1.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 +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +20 -0
- data/example/non_rails_app/Gemfile.lock +1 -1
- data/example/rails_app/Gemfile.lock +1 -1
- data/lib/rabbit_feed/event_routing.rb +35 -8
- data/lib/rabbit_feed/version.rb +1 -1
- data/spec/lib/rabbit_feed/event_routing_spec.rb +46 -4
- 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: c8b4cfaedb7bc8c46cdd3e688e2e056433bd890f
|
4
|
+
data.tar.gz: 70f7da80ecb2066defee294ddd9268769306045d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 441226227941a4caf225cdf2ba70cae72d0dfbcbf0bf0460fc42920ab2384b79a94bf218e344d10eaa177260a9058f4f3e5896d617dcbcb757e72a1e6b41c31e
|
7
|
+
data.tar.gz: 310e32a94ebde5f1d6cac89841d677099e6f7705af33a11a7252ae74587d55d545448a320db546adabdfa0c897106e0e668b0c436f4d003accaf75f915ff3c85
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -308,6 +308,26 @@ When the consumer is started, it will create its queue named using this pattern:
|
|
308
308
|
|
309
309
|
_Note: The consumer queues will automatically expire (delete) after 7 days without any consumer connections. This is to prevent unused queues from hanging around once their associated consumer has been terminated._
|
310
310
|
|
311
|
+
### Wildcards
|
312
|
+
|
313
|
+
Applications that wish to handle events from any application or wish to handle any event can achieve this using the `:any` key.
|
314
|
+
|
315
|
+
For example, the following would consume any event published by RabbitFeed:
|
316
|
+
|
317
|
+
```ruby
|
318
|
+
EventRouting do
|
319
|
+
accept_from(:any) do
|
320
|
+
event(:any) do |event|
|
321
|
+
puts event.payload
|
322
|
+
end
|
323
|
+
end
|
324
|
+
end
|
325
|
+
```
|
326
|
+
|
327
|
+
In this example, the consumer queue will bind to the specified exchange on the following routing keys:
|
328
|
+
|
329
|
+
environment.*.*
|
330
|
+
|
311
331
|
## Delivery Semantics
|
312
332
|
|
313
333
|
RabbitFeed provides 'at least once' delivery semantics. There are two use-cases where an event may be delivered more than once:
|
@@ -33,39 +33,66 @@ module RabbitFeed
|
|
33
33
|
class Application
|
34
34
|
include ActiveModel::Validations
|
35
35
|
|
36
|
-
attr_reader :
|
36
|
+
attr_reader :named_events, :catch_all_event, :name
|
37
37
|
validates_presence_of :name
|
38
38
|
|
39
39
|
def initialize name
|
40
|
-
@name
|
41
|
-
@
|
40
|
+
@name = name
|
41
|
+
@named_events = {}
|
42
42
|
|
43
43
|
validate!
|
44
44
|
end
|
45
45
|
|
46
46
|
def event name, &block
|
47
|
-
|
48
|
-
|
47
|
+
if name == :any
|
48
|
+
accept_any_event &block
|
49
|
+
else
|
50
|
+
accept_named_event name, &block
|
51
|
+
end
|
49
52
|
end
|
50
53
|
|
51
54
|
def accepted_routes
|
52
|
-
|
55
|
+
all_events.map do |event|
|
53
56
|
"#{RabbitFeed.environment}.#{name}.#{event.name}"
|
54
57
|
end
|
55
58
|
end
|
56
59
|
|
57
60
|
def handle_event event
|
58
|
-
event_rule =
|
61
|
+
event_rule = find_event event
|
59
62
|
event_rule.handle_event event
|
60
63
|
end
|
61
64
|
|
62
65
|
def handles_event? event
|
63
|
-
|
66
|
+
(find_event event).present?
|
64
67
|
end
|
65
68
|
|
69
|
+
private
|
70
|
+
|
66
71
|
def validate!
|
67
72
|
raise ConfigurationError.new "Bad application specification for #{name}: #{errors.messages}" if invalid?
|
68
73
|
end
|
74
|
+
|
75
|
+
def accept_named_event name, &block
|
76
|
+
raise ConfigurationError.new "Routing has already been defined for the event with name: #{name} in application: #{self.name}" if (named_events.has_key? name)
|
77
|
+
event = (Event.new name, block)
|
78
|
+
named_events[event.name] = event
|
79
|
+
end
|
80
|
+
|
81
|
+
def accept_any_event &block
|
82
|
+
raise ConfigurationError.new "Routing has already been defined for the event catch-all: :any in application: #{name}" if catch_all_event.present?
|
83
|
+
event = (Event.new '*', block)
|
84
|
+
@catch_all_event = event
|
85
|
+
end
|
86
|
+
|
87
|
+
def find_event event
|
88
|
+
[named_events[event.name], catch_all_event].compact.first
|
89
|
+
end
|
90
|
+
|
91
|
+
def all_events
|
92
|
+
events = named_events.values
|
93
|
+
events << catch_all_event if catch_all_event.present?
|
94
|
+
events
|
95
|
+
end
|
69
96
|
end
|
70
97
|
|
71
98
|
attr_reader :named_applications, :catch_all_application
|
data/lib/rabbit_feed/version.rb
CHANGED
@@ -25,6 +25,11 @@ module RabbitFeed
|
|
25
25
|
event.payload
|
26
26
|
end
|
27
27
|
end
|
28
|
+
accept_from('dummy_3') do
|
29
|
+
event(:any) do |event|
|
30
|
+
event.payload
|
31
|
+
end
|
32
|
+
end
|
28
33
|
end
|
29
34
|
end
|
30
35
|
|
@@ -36,6 +41,7 @@ module RabbitFeed
|
|
36
41
|
test.dummy_2.event_3
|
37
42
|
test.*.event_3
|
38
43
|
test.*.event_4
|
44
|
+
test.dummy_3.*
|
39
45
|
}
|
40
46
|
end
|
41
47
|
|
@@ -46,6 +52,8 @@ module RabbitFeed
|
|
46
52
|
Event.new({application: 'dummy_1', name: 'event_4'}, {payload: 4}),
|
47
53
|
Event.new({application: 'dummy_2', name: 'event_3'}, {payload: 3}),
|
48
54
|
Event.new({application: 'none', name: 'event_4'}, {payload: 4}),
|
55
|
+
Event.new({application: 'dummy_3', name: 'event_1'}, {payload: 1}),
|
56
|
+
Event.new({application: 'dummy_3', name: 'event_2'}, {payload: 2}),
|
49
57
|
]
|
50
58
|
events.each do |event|
|
51
59
|
(RabbitFeed::Consumer.event_routing.handle_event event).should eq event.payload
|
@@ -112,7 +120,7 @@ module RabbitFeed
|
|
112
120
|
context 'testing cumulative routing definitions' do
|
113
121
|
before do
|
114
122
|
EventRouting do
|
115
|
-
accept_from('
|
123
|
+
accept_from('dummy_4') do
|
116
124
|
event('event_4') do |event|
|
117
125
|
event.payload
|
118
126
|
end
|
@@ -125,9 +133,10 @@ module RabbitFeed
|
|
125
133
|
test.dummy_1.event_1
|
126
134
|
test.dummy_1.event_2
|
127
135
|
test.dummy_2.event_3
|
128
|
-
test.
|
136
|
+
test.dummy_4.event_4
|
129
137
|
test.*.event_3
|
130
138
|
test.*.event_4
|
139
|
+
test.dummy_3.*
|
131
140
|
}
|
132
141
|
end
|
133
142
|
end
|
@@ -143,7 +152,7 @@ module RabbitFeed
|
|
143
152
|
end
|
144
153
|
end
|
145
154
|
end
|
146
|
-
end.to raise_error
|
155
|
+
end.to raise_error 'Routing has already been defined for the application with name: dummy_2'
|
147
156
|
end
|
148
157
|
|
149
158
|
it 'raises an exception for the catch-all application' do
|
@@ -155,7 +164,40 @@ module RabbitFeed
|
|
155
164
|
end
|
156
165
|
end
|
157
166
|
end
|
158
|
-
end.to raise_error
|
167
|
+
end.to raise_error 'Routing has already been defined for the application catch-all: :any'
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
context 'defining the same event twice' do
|
172
|
+
|
173
|
+
it 'raises an exception for a named event' do
|
174
|
+
expect do
|
175
|
+
EventRouting do
|
176
|
+
accept_from('dummy_5') do
|
177
|
+
event('event_3') do |event|
|
178
|
+
event.payload
|
179
|
+
end
|
180
|
+
event('event_3') do |event|
|
181
|
+
event.payload
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end.to raise_error 'Routing has already been defined for the event with name: event_3 in application: dummy_5'
|
186
|
+
end
|
187
|
+
|
188
|
+
it 'raises an exception for the catch-all event' do
|
189
|
+
expect do
|
190
|
+
EventRouting do
|
191
|
+
accept_from('dummy_5') do
|
192
|
+
event(:any) do |event|
|
193
|
+
event.payload
|
194
|
+
end
|
195
|
+
event(:any) do |event|
|
196
|
+
event.payload
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end.to raise_error 'Routing has already been defined for the event catch-all: :any in application: dummy_5'
|
159
201
|
end
|
160
202
|
end
|
161
203
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rabbit_feed
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Simply Business
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-03-
|
11
|
+
date: 2015-03-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bunny
|