isimud 1.4.6 → 1.4.7
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
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/README.md +8 -1
- data/checksum/isimud-1.4.6.gem.sha512 +1 -0
- data/lib/isimud/event_listener.rb +6 -1
- data/lib/isimud/event_observer.rb +4 -15
- data/lib/isimud/test_client.rb +5 -4
- data/lib/isimud/version.rb +1 -1
- data/spec/internal/app/models/company.rb +10 -3
- data/spec/isimud/event_listener_spec.rb +9 -8
- data/spec/isimud/event_observer_spec.rb +9 -20
- metadata +3 -2
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d4207fca361f4d4e6c45f15c44fe366661d5894b
|
4
|
+
data.tar.gz: 5a0e5c2016441e4d23c98efe6fc5c84575c3b96b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f64c5e07ce74f71273c98647359d12a89985eef2a779b0a63f7cb94377316be78bce63fc2554c124df7be9508f8e77054539c22c3ffe1f7a3637e82bc99c2252
|
7
|
+
data.tar.gz: b0808273f6ad6c0364688652ccc7f9bcdcb6d80841629c6ebb1a0142878618c8ef28a5bc99537be095ae707ba057ec7b9fa22ecb31953b50a603e236bafd4e4b
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/README.md
CHANGED
@@ -86,7 +86,7 @@ for each instance.
|
|
86
86
|
2. Custom standalone queues. You may extend EventListener to declare individual queues not associated with a specific
|
87
87
|
object instance.
|
88
88
|
|
89
|
-
The EventListener process will automatically create queues on
|
89
|
+
The EventListener process will automatically create and bind queues on startup if they do not already exist. This allows
|
90
90
|
for cold startup on a new AMQP broker.
|
91
91
|
|
92
92
|
### Message Delivery Information and Metadata
|
@@ -120,6 +120,13 @@ the message is not re-queued.
|
|
120
120
|
|
121
121
|
# Changes
|
122
122
|
|
123
|
+
## 1.4.7
|
124
|
+
|
125
|
+
* Simplify the AMQP queue lifecycle for EventObserver instances when they are updated.
|
126
|
+
* Any previously existing queue for the instance is deleted on the broker.
|
127
|
+
* When an EventListener process receives the EventObserver update message, it always recreates and rebinds the
|
128
|
+
queue for the instance.
|
129
|
+
|
123
130
|
## 1.4.6
|
124
131
|
|
125
132
|
* When consuming messages, use the channel setting from the delivery_info
|
@@ -0,0 +1 @@
|
|
1
|
+
fe13f8a3d39cb69f6d3dea3520349d29dfd4ea05608b3b233797d32074007b2bb9b502c9bf4682defcd3ca8997a023157e58f9f957380ab0b68f6471d85594b0
|
@@ -121,6 +121,11 @@ module Isimud
|
|
121
121
|
@observers.has_key?(observer_key_for(observer.class, observer.id))
|
122
122
|
end
|
123
123
|
|
124
|
+
# @private
|
125
|
+
def find_observer(klass, id)
|
126
|
+
@observers[observer_key_for(klass, id)]
|
127
|
+
end
|
128
|
+
|
124
129
|
private
|
125
130
|
|
126
131
|
def test_env?
|
@@ -242,7 +247,7 @@ module Isimud
|
|
242
247
|
def register_observer(observer)
|
243
248
|
@observer_mutex.synchronize do
|
244
249
|
log "EventListener: registering observer #{observer.class} #{observer.id}"
|
245
|
-
@observers[observer_key_for(observer.class, observer.id)] = observer.observe_events(client
|
250
|
+
@observers[observer_key_for(observer.class, observer.id)] = observer.observe_events(client)
|
246
251
|
end
|
247
252
|
end
|
248
253
|
|
@@ -53,13 +53,12 @@ module Isimud
|
|
53
53
|
# Create or attach to a queue on the specified exchange. When an event message that matches the observer's routing keys
|
54
54
|
# is received, parse the event and call handle_event on same.
|
55
55
|
# @param [Isimud::Client] client client instance
|
56
|
-
# @param [Boolean] refresh_bindings when set, refresh bindings on queue (true)
|
57
56
|
# @return queue or consumer object
|
58
57
|
# @see BunnyClient#subscribe
|
59
58
|
# @see TestClient#subscribe
|
60
|
-
def observe_events(client
|
59
|
+
def observe_events(client)
|
61
60
|
return unless enable_listener?
|
62
|
-
queue =
|
61
|
+
queue = create_queue(client)
|
63
62
|
client.subscribe(queue) do |message|
|
64
63
|
event = Event.parse(message)
|
65
64
|
handle_event(event)
|
@@ -99,18 +98,8 @@ module Isimud
|
|
99
98
|
end
|
100
99
|
|
101
100
|
def update_queue
|
102
|
-
|
103
|
-
|
104
|
-
prev_keys = routing_key_changes.try(:[], 0) || []
|
105
|
-
current_keys = routing_key_changes.try(:[], 1) || exchange_routing_keys
|
106
|
-
queue = isimud_client.find_queue(event_queue_name)
|
107
|
-
exchange = observed_exchange || Isimud.events_exchange
|
108
|
-
(prev_keys - current_keys).each { |key| queue.unbind(exchange, routing_key: key) }
|
109
|
-
log "Isimud::EventObserver: binding queue #{event_queue_name} on exchange #{exchange} with bindings [#{current_keys.join(',')}]"
|
110
|
-
(current_keys).each { |key| queue.bind(exchange, routing_key: key) }
|
111
|
-
else
|
112
|
-
isimud_client.delete_queue(event_queue_name)
|
113
|
-
end
|
101
|
+
delete_queue
|
102
|
+
create_queue if enable_listener? && exchange_routing_keys.any?
|
114
103
|
end
|
115
104
|
|
116
105
|
def delete_queue(client = isimud_client)
|
data/lib/isimud/test_client.rb
CHANGED
@@ -28,7 +28,6 @@ module Isimud
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def cancel
|
31
|
-
@proc = nil
|
32
31
|
end
|
33
32
|
|
34
33
|
def delete(opts = {})
|
@@ -81,6 +80,7 @@ module Isimud
|
|
81
80
|
end
|
82
81
|
|
83
82
|
def delete_queue(queue_name)
|
83
|
+
log "Isimud::TestClient: deleting queue #{queue_name}"
|
84
84
|
queues.delete(queue_name)
|
85
85
|
end
|
86
86
|
|
@@ -89,13 +89,13 @@ module Isimud
|
|
89
89
|
subscribe(queue, &block)
|
90
90
|
end
|
91
91
|
|
92
|
-
def find_queue(queue_name,
|
92
|
+
def find_queue(queue_name, _options = {})
|
93
93
|
queues[queue_name] ||= Queue.new(self, queue_name)
|
94
94
|
end
|
95
95
|
|
96
96
|
def create_queue(queue_name, exchange_name, options = {})
|
97
97
|
keys = options[:routing_keys] || []
|
98
|
-
log "Isimud::TestClient: Binding queue #{queue_name} for keys #{keys.inspect}"
|
98
|
+
log "Isimud::TestClient: Binding queue #{queue_name} on exchange #{exchange_name} for keys #{keys.inspect}"
|
99
99
|
queue = find_queue(queue_name)
|
100
100
|
keys.each do |k|
|
101
101
|
queue.bind(exchange_name, routing_key: k)
|
@@ -103,7 +103,8 @@ module Isimud
|
|
103
103
|
queue
|
104
104
|
end
|
105
105
|
|
106
|
-
def subscribe(queue,
|
106
|
+
def subscribe(queue, _options = {}, &block)
|
107
|
+
log "Isimud::TestClient: subscribing to events on queue #{queue.name}"
|
107
108
|
queue.proc = block
|
108
109
|
queue
|
109
110
|
end
|
data/lib/isimud/version.rb
CHANGED
@@ -22,11 +22,18 @@ class Company < ActiveRecord::Base
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def handle_event(event)
|
25
|
+
Rails.logger.info "Company#handle_event: id=#{id} event=#{event.inspect}"
|
25
26
|
user = User.find(event.parameters[:id])
|
26
27
|
return unless user.company_id == id
|
27
|
-
|
28
|
-
|
29
|
-
|
28
|
+
case event.action
|
29
|
+
when :create
|
30
|
+
Rails.logger.info "recording new user for company #{id}"
|
31
|
+
self.user_count += 1
|
32
|
+
self.total_points += points_per_user
|
33
|
+
when :destroy
|
34
|
+
self.user_count -= 1
|
35
|
+
self.total_points -= points_per_user
|
36
|
+
end
|
30
37
|
save!
|
31
38
|
end
|
32
39
|
end
|
@@ -1,9 +1,14 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Isimud::EventListener do
|
4
|
-
|
4
|
+
before do
|
5
|
+
@company = Company.create(name: 'Google', active: true)
|
6
|
+
@listener = Isimud::EventListener.new(name: 'all_ears', error_limit: 5, exchange: 'test-listener')
|
7
|
+
end
|
8
|
+
|
9
|
+
let!(:company) { @company }
|
5
10
|
let!(:inactive_company) { Company.create(name: 'Radio Shack', active: false) }
|
6
|
-
let!(:listener) {
|
11
|
+
let!(:listener) { @listener }
|
7
12
|
|
8
13
|
after(:each) do
|
9
14
|
Isimud.client.reset
|
@@ -75,13 +80,9 @@ describe Isimud::EventListener do
|
|
75
80
|
|
76
81
|
context 'handling observer update messages' do
|
77
82
|
it 'reloads the observer and processes events accordingly' do
|
83
|
+
expect(listener).to receive(:unregister_observer).with('Company', company.id).and_call_original
|
84
|
+
expect(listener).to receive(:register_observer).with an_instance_of(Company)
|
78
85
|
company.update_attributes!(points_per_user: 2)
|
79
|
-
expect(listener).to have_observer(company)
|
80
|
-
expect {
|
81
|
-
User.create!(company: company, first_name: 'Larry', last_name: 'Page')
|
82
|
-
company.reload
|
83
|
-
}.to change(company, :user_count).by(1)
|
84
|
-
expect(company.total_points).to eql(company.user_count * 2)
|
85
86
|
end
|
86
87
|
end
|
87
88
|
|
@@ -57,14 +57,9 @@ describe Isimud::EventObserver do
|
|
57
57
|
end
|
58
58
|
|
59
59
|
it 'creates the queue' do
|
60
|
-
expect(@client).to receive(:
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
it 'binds the routing keys' do
|
65
|
-
@user.exchange_routing_keys.each do |k|
|
66
|
-
expect(@queue).to receive(:bind).with(@exchange, routing_key: k).and_call_original
|
67
|
-
end
|
60
|
+
expect(@client).to receive(:create_queue).with("combustion.user.#{@user.id}",
|
61
|
+
@exchange,
|
62
|
+
routing_keys: keys)
|
68
63
|
@user.update_attributes(deactivated: false)
|
69
64
|
end
|
70
65
|
end
|
@@ -75,23 +70,17 @@ describe Isimud::EventObserver do
|
|
75
70
|
@queue = @client.find_queue(@user.event_queue_name)
|
76
71
|
end
|
77
72
|
|
78
|
-
it '
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
73
|
+
it 'deletes and recreates the queue' do
|
74
|
+
new_keys = keys << 'some_other_value'
|
75
|
+
expect(@client).to receive(:delete_queue).with(@user.event_queue_name)
|
76
|
+
expect(@client).to receive(:create_queue).with("combustion.user.#{@user.id}",
|
77
|
+
@exchange,
|
78
|
+
routing_keys: new_keys)
|
83
79
|
@user.transaction do
|
84
80
|
@user.keys << 'some_other_value'
|
85
81
|
@user.save!
|
86
82
|
end
|
87
83
|
end
|
88
|
-
|
89
|
-
it 'removes old keys' do
|
90
|
-
expect(@queue).to receive(:unbind).with(@exchange, routing_key: 'a.b.c')
|
91
|
-
expect(@queue).not_to receive(:unbind).with(@exchange, routing_key: 'd.*.f')
|
92
|
-
@user.keys.delete('a.b.c')
|
93
|
-
@user.save!
|
94
|
-
end
|
95
84
|
end
|
96
85
|
end
|
97
86
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: isimud
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
4
|
+
version: 1.4.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- George Feil
|
@@ -31,7 +31,7 @@ cert_chain:
|
|
31
31
|
wSKk31gq6KY7rgi11mcLvVzwSuwZFqnonAmu/uin3cbXcOUkqNsyzZ0LQLXNKiwi
|
32
32
|
k0RgrsSNtQ8hcsVSQla0Ot+X3WpFI4ZuIfSLFA==
|
33
33
|
-----END CERTIFICATE-----
|
34
|
-
date:
|
34
|
+
date: 2017-03-10 00:00:00.000000000 Z
|
35
35
|
dependencies:
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: activerecord
|
@@ -120,6 +120,7 @@ files:
|
|
120
120
|
- checksum/isimud-1.4.3.gem.sha512
|
121
121
|
- checksum/isimud-1.4.4.gem.sha512
|
122
122
|
- checksum/isimud-1.4.5.gem.sha512
|
123
|
+
- checksum/isimud-1.4.6.gem.sha512
|
123
124
|
- config.ru
|
124
125
|
- config/tddium.yml
|
125
126
|
- doc/Isimud.html
|
metadata.gz.sig
CHANGED
Binary file
|