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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2769638fbc9d69ddf26502e1929baf2884a2e821
4
- data.tar.gz: 3f565c195f891af40a07e9c9f05bea6557c9519e
3
+ metadata.gz: d4207fca361f4d4e6c45f15c44fe366661d5894b
4
+ data.tar.gz: 5a0e5c2016441e4d23c98efe6fc5c84575c3b96b
5
5
  SHA512:
6
- metadata.gz: c3aac1635d4399cf011cb013b7d5930bfb9026f7da390ce2d78db1e451dc90b73d44d2d6e2759185b0392820f0fd6a1176dfa9a5db7b4520e117dfbee59b1690
7
- data.tar.gz: bb8de5051878f5a25e1552934c9a4c22b44691e45dfd59e30396c76e89de894a037b7617f5bde92cdf7b28fe1ac859560b63fb930e0ed1b7ed22347d2bdad485
6
+ metadata.gz: f64c5e07ce74f71273c98647359d12a89985eef2a779b0a63f7cb94377316be78bce63fc2554c124df7be9508f8e77054539c22c3ffe1f7a3637e82bc99c2252
7
+ data.tar.gz: b0808273f6ad6c0364688652ccc7f9bcdcb6d80841629c6ebb1a0142878618c8ef28a5bc99537be095ae707ba057ec7b9fa22ecb31953b50a603e236bafd4e4b
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 initial startup if they do not already exist. This allows
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, initializing?)
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, refresh_bindings = true)
59
+ def observe_events(client)
61
60
  return unless enable_listener?
62
- queue = (refresh_bindings || client.kind_of?(Isimud::TestClient)) ? create_queue(client) : client.find_queue(event_queue_name)
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
- if enable_listener?
103
- routing_key_changes = previous_changes[:exchange_routing_keys]
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)
@@ -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, options = {})
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, options = {}, &block)
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
@@ -1,3 +1,3 @@
1
1
  module Isimud
2
- VERSION = '1.4.6'
2
+ VERSION = '1.4.7'
3
3
  end
@@ -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
- raise "unexpected action: #{event.action}" unless ['create','destroy' ].include?(event.action.to_s)
28
- self.user_count = User.where(company: self).count
29
- self.total_points = user_count * points_per_user
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
- let!(:company) { Company.create(name: 'Google', active: true) }
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) { Isimud::EventListener.new(name: 'all_ears', error_limit: 5, exchange: 'test-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(:find_queue).with(@user.event_queue_name).and_call_original
61
- @user.update_attributes(deactivated: false)
62
- end
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 'binds new keys' do
79
- @user.exchange_routing_keys.each do |k|
80
- expect(@queue).to receive(:bind).with(@exchange, routing_key: k).and_call_original
81
- end
82
- expect(@queue).to receive(:bind).with(@exchange, routing_key: 'some_other_value').and_call_original
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.6
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: 2016-09-20 00:00:00.000000000 Z
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