isimud 1.4.6 → 1.4.7
Sign up to get free protection for your applications and to get access to all the features.
- 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
|