isimud 0.5.2 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 83a83137b7deb41a7c90543b1bc5e357f80f8b3d
4
- data.tar.gz: afa7acb7b71b8cd159a7a9cfd95ed461613566ff
3
+ metadata.gz: 4d99ac21afc822c85ea759b7b8f491c509ff4ff4
4
+ data.tar.gz: 2497cc27810dcaa21493b5a34171c045e18c04c3
5
5
  SHA512:
6
- metadata.gz: 205e376894ca96ada6eb0859d24a619e98630e5d757cb30df84ff3674f8a378226778d16c1447956954c9d784f7ae5166782970ee6dff6e1dfcd8f6044426f22
7
- data.tar.gz: 813394bb8976e04c1609a317d04c5e4054b868e6d85a83d53b5b67d6588dee2f4dc9b10c865c30b864e3f98ab12e17f4e9f828e287bdaa0586f186e3dbcf9ecf
6
+ metadata.gz: cb9fbfe6c72af9b21a40e01a706d4a1290fdeb076445ce1ce2fe87ade0e0dd8a7a3dacef53e8e94e616461484c633ba551c18ca6c41284b55e6cfbfb690b2264
7
+ data.tar.gz: 1f1a254579109ddc7428fafa0a2e2a3861d0cc8f494ec2d3f2950925506a3666d76c6be4350f187ea1d19879f814b4b19de6b901ba73ed9ee6bfa73a57798a14
Binary file
Binary file
@@ -1 +1 @@
1
- 2.2.3
1
+ 2.3.0
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- isimud (0.5.2)
4
+ isimud (0.6.0)
5
5
  activerecord (>= 3.2.17)
6
6
  activesupport (>= 3.2.17)
7
7
  bunny (>= 1.6.0)
data/README.md CHANGED
@@ -77,6 +77,12 @@ if they do not exist.
77
77
 
78
78
  ## Changes
79
79
 
80
+ ### 0.6.0
81
+
82
+ * Added Client#rebind to change the exchange and routing keys for a durable named queue.
83
+ * Changed BunnyClient#delete_queue to make it more reliable.
84
+ * EventListener now uses a shared, durable queue for monitoring events on modified EventObserver instances.
85
+
80
86
  ### 0.5.2
81
87
 
82
88
  * Fixed regexp bug in TestClient affecting message delivery
@@ -0,0 +1,21 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDeDCCAmCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBBMRQwEgYDVQQDDAtnZW9y
3
+ Z2UuZmVpbDEUMBIGCgmSJomT8ixkARkWBGtlYXMxEzARBgoJkiaJk/IsZAEZFgNj
4
+ b20wHhcNMTYwODA5MjEwNDU1WhcNMTcwODA5MjEwNDU1WjBBMRQwEgYDVQQDDAtn
5
+ ZW9yZ2UuZmVpbDEUMBIGCgmSJomT8ixkARkWBGtlYXMxEzARBgoJkiaJk/IsZAEZ
6
+ FgNjb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDDFBKCoLQgCUv1
7
+ 86ykJOCtnWhQ12Eymfnu5btV3DKMMLxjUDG18vy1Clhw04afp36Rc+oMvP1VxYeH
8
+ lRWdLtnWy2DAu2dxeFlWvacAegDcmQSw9vfyS7yD8zoLhJGeIflJ3eenTa+nRiQ2
9
+ DBPL1qRdfSrBNBXVlTYvs/PGE0SLJPtil8oRsifqk7ETPCUx5gRSxzzp0JykjrUd
10
+ cIu2u06Dv5GyDVwJu5/m4wLJSc2Bmore7rmOctBSNYtXTcMGVQOfskhncLNeE56V
11
+ R7byYxJ92HQt4svMjbK0hN+27asFpXaVU9ZeNQeEOOsgq8ecdypAWjwlOaH580K5
12
+ aH24zkstAgMBAAGjezB5MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQW
13
+ BBSXpvM46ec2Ds6ErCpZkXFZtsEh7TAfBgNVHREEGDAWgRRnZW9yZ2UuZmVpbEBr
14
+ ZWFzLmNvbTAfBgNVHRIEGDAWgRRnZW9yZ2UuZmVpbEBrZWFzLmNvbTANBgkqhkiG
15
+ 9w0BAQUFAAOCAQEAEXuMNAP35/nzBGj5aodPKIgH2Bvda9IF8OC4sDmQsRsUQzDw
16
+ wRi3rWoNzUU+QexdZqhLXSwGuPNgMgmPKaOu09LjpKKbem9VDicUEhNDL27CYMJZ
17
+ 1oO1kEqjbZW60HZcfDNrw8Q6ARBRhKXpPJsbYrR2QRzx1P0oVkFtmc9Qu4gvFy3c
18
+ hIevyUPfcaBRWNfXCQnyFXZcHqcTywEgNyXTJZ6zUNZSHIQPzLOyzqa+muVO8Ob/
19
+ wSKk31gq6KY7rgi11mcLvVzwSuwZFqnonAmu/uin3cbXcOUkqNsyzZ0LQLXNKiwi
20
+ k0RgrsSNtQ8hcsVSQla0Ot+X3WpFI4ZuIfSLFA==
21
+ -----END CERTIFICATE-----
@@ -4,14 +4,20 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'isimud/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
- spec.name = 'isimud'
8
- spec.version = Isimud::VERSION
9
- spec.authors = ['George Feil', 'Brian Jenkins']
10
- spec.email = %w{george.feil@keas.com bonkydog@bonkydog.com}
11
- spec.summary = %q{AMQP Messaging for Events and ActiveRecord changes}
12
- spec.description = %q{}
13
- spec.homepage = ''
14
- spec.license = "Copyright (C) 2014 Keas -- All rights reserved"
7
+ spec.name = 'isimud'
8
+ spec.version = Isimud::VERSION
9
+ spec.authors = ['George Feil', 'Brian Jenkins']
10
+ spec.email = %w{george.feil@keas.com bonkydog@bonkydog.com}
11
+ spec.summary = %q{AMQP Messaging and Event Processing}
12
+ spec.description = <<-EOT
13
+ Isimud is an AMQP message publishing and consumption gem intended for Rails applications. You can use it to define
14
+ message consumption queues for ActiveRecord instances, or synchronize model updates between processes. It also provides
15
+ an event listener background process for managing queues that consume messages.
16
+ EOT
17
+ spec.homepage = 'https://github.com/KeasInc/isimud'
18
+ spec.license = 'MITNFA'
19
+ spec.cert_chain = ['certs/gfeil.pem']
20
+ spec.signing_key = File.expand_path("~/.ssh/gem-private_key.pem") if $0 =~ /gem\z/
15
21
 
16
22
  spec.files = `git ls-files -z`.split("\x0")
17
23
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
@@ -26,8 +26,8 @@ module Isimud
26
26
  subscribe_options = options[:subscribe_options] || {}
27
27
  log "Isimud: create_queue #{queue_name}: queue_options=#{queue_options.inspect} routing_keys=#{routing_keys.join(',')} subscribe_options=#{subscribe_options.inspect}"
28
28
  current_channel = channel
29
- queue = current_channel.queue(queue_name, queue_options)
30
- routing_keys.each { |key| queue.bind(exchange_name, routing_key: key, nowait: false) }
29
+ queue = find_queue(queue_name, queue_options)
30
+ bind_routing_keys(queue, exchange_name, routing_keys)
31
31
  queue.subscribe(subscribe_options) do |delivery_info, properties, payload|
32
32
  begin
33
33
  log "Isimud: queue #{queue_name} received #{delivery_info.delivery_tag} routing_key: #{delivery_info.routing_key}"
@@ -46,8 +46,18 @@ module Isimud
46
46
  queue
47
47
  end
48
48
 
49
+ # replace all bindings on a queue
50
+ def rebind(queue_name, exchange_name, routing_keys)
51
+ log "Isimud: rebinding queue #{queue_name} exchange #{exchange_name} routing_keys #{routing_keys.inspect}"
52
+ queue = find_queue(queue_name)
53
+ queue.unbind(exchange_name)
54
+ bind_routing_keys(queue, exchange_name, routing_keys)
55
+ rescue => e
56
+ log "Isimud: error rebinding #{queue_name} from #{exchange_name}: #{e.message}", :error
57
+ end
58
+
49
59
  def delete_queue(queue_name)
50
- channel.queue(queue_name).delete
60
+ channel.queue_delete(queue_name)
51
61
  end
52
62
 
53
63
  def connection
@@ -83,13 +93,24 @@ module Isimud
83
93
  @connection = nil
84
94
  end
85
95
 
86
- def publish(exchange, routing_key, payload)
87
- channel.topic(exchange, durable: true).publish(payload, routing_key: routing_key, persistent: true)
96
+ def publish(exchange, routing_key, payload, options = {})
97
+ channel.topic(exchange, durable: true).publish(payload, options.merge(routing_key: routing_key, persistent: true))
88
98
  end
89
99
 
90
100
  def reconnect
91
101
  close
92
102
  connect
93
103
  end
104
+
105
+ private
106
+
107
+ def find_queue(queue_name, options = {durable: true})
108
+ channel.queue(queue_name, options)
109
+ end
110
+
111
+ def bind_routing_keys(queue, exchange_name, routing_keys)
112
+ routing_keys.each { |key| queue.bind(exchange_name, routing_key: key, nowait: false) }
113
+ end
114
+
94
115
  end
95
116
  end
@@ -33,12 +33,15 @@ module Isimud
33
33
  @exception_handler = block
34
34
  end
35
35
 
36
- def publish(exchange, routing_key, payload)
36
+ def publish(exchange, routing_key, payload, options = {})
37
37
  end
38
38
 
39
39
  def reconnect
40
40
  end
41
41
 
42
+ def rebind(queue_name, exchange_name, *keys)
43
+ end
44
+
42
45
  def reset
43
46
  end
44
47
  end
@@ -4,6 +4,7 @@ module Isimud
4
4
  class Event
5
5
  include Isimud::Logging
6
6
  attr_accessor :type, :action, :user_id, :occurred_at, :eventful_type, :eventful_id, :attributes, :parameters
7
+ attr_reader :timestamp
7
8
  attr_writer :exchange
8
9
 
9
10
  DEFAULT_TYPE = :model
@@ -37,6 +38,7 @@ module Isimud
37
38
  else
38
39
  Time.now.utc
39
40
  end
41
+ @timestamp = Time.now
40
42
 
41
43
  eventful_object = options.delete(:eventful)
42
44
 
@@ -67,6 +69,13 @@ module Isimud
67
69
  [type.to_s, eventful_type, eventful_id, action].compact.join('.')
68
70
  end
69
71
 
72
+ # Message ID, which is generated from the exchange, routing_key, user_id, and timestamp. This is practically
73
+ # guaranteed to be unique across all publishers.
74
+ def message_id
75
+ [exchange, routing_key, user_id, timestamp.to_i, timestamp.nsec].join(':')
76
+ end
77
+
78
+
70
79
  # Return hash of data to be serialized to JSON
71
80
  # @option options [Boolean] :omit_parameters when set, do not include attributes or parameters in data
72
81
  # @return [Hash] data to serialize
@@ -106,7 +115,7 @@ module Isimud
106
115
  def publish
107
116
  data = self.serialize
108
117
  log "Event#publish: #{self.inspect}"
109
- Isimud.client.publish(exchange, routing_key, data)
118
+ Isimud.client.publish(exchange, routing_key, data, message_id: message_id)
110
119
  end
111
120
  end
112
121
  end
@@ -140,13 +140,16 @@ module Isimud
140
140
 
141
141
  def handle_observer_event(payload)
142
142
  event = JSON.parse(payload).with_indifferent_access
143
- log "EventListener: received observer model message: #{payload.inspect}"
144
- if %w(update destroy).include?(event[:action])
145
- unregister_observer(event[:type], event[:id])
146
- end
147
- unless event[:action] == 'destroy'
148
- observer = event[:type].constantize.find(event[:id])
149
- register_observer(observer) if observer.enable_listener?
143
+ action = event[:action]
144
+ log "EventListener: received observer model message: #{event.inspect}"
145
+ observer = event[:type].constantize.find(event[:id]) unless action == 'destroy'
146
+ case
147
+ when action == 'create'
148
+ register_observer(observer) if observer.enable_listener?
149
+ when action == 'update' && observer.enable_listener?
150
+ rebind_observer(observer)
151
+ else
152
+ unregister_observer(event[:type], event[:id])
150
153
  end
151
154
  end
152
155
 
@@ -159,26 +162,25 @@ module Isimud
159
162
  end
160
163
  end
161
164
 
165
+ # Update the bindings for an observer.
166
+ def rebind_observer(observer)
167
+ log "EventListener: rebinding observer #{observer.class} #{observer.id}"
168
+ client.rebind(observer.event_queue_name, events_exchange, observer.routing_keys)
169
+ end
170
+
162
171
  # Delete a queue for an observer. This also purges all messages associated with it
163
172
  def unregister_observer(observer_class, observer_id)
164
173
  @observer_mutex.synchronize do
165
- if (observer = @observers.delete(observer_key_for(observer_class, observer_id)))
166
- begin
167
- log "EventListener: unregistering #{observer.class} #{observer.id}"
168
- queue_name = observer_class.constantize.event_queue_name(observer_id)
169
- client.delete_queue(queue_name)
170
- rescue => e
171
- log "EventListener: error unregistering #{observer_class} #{observer_id}: #{e.message}", :warn
172
- end
173
- end
174
+ log "EventListener: un-registering observer #{observer_class} #{observer_id}"
175
+ queue_name = observer_class.constantize.event_queue_name(observer_id)
176
+ client.delete_queue(queue_name)
177
+ @observers.delete(observer_key_for(observer_class, observer_id))
174
178
  end
175
179
  end
176
180
 
177
181
  # Create or return the observer queue which listens for ModelWatcher events
178
182
  def observer_queue
179
- @observer_queue ||= client.create_queue("#{name}.listener.#{Process.pid}", models_exchange,
180
- queue_options: {exclusive: true},
181
- subscribe_options: {manual_ack: true}, &method(:handle_observer_event))
183
+ @observer_queue ||= client.create_queue("#{name}.listener", models_exchange, &method(:handle_observer_event))
182
184
  end
183
185
 
184
186
  # Register the observer class watcher
@@ -41,12 +41,16 @@ module Isimud
41
41
  # Create or attach to a queue on the specified exchange. When an event message that matches the observer's routing keys
42
42
  # is received, parse the event and call handle_event on same.
43
43
  def observe_events(client, default_exchange)
44
- client.bind(self.class.event_queue_name(id), observed_exchange || default_exchange, *routing_keys) do |message|
44
+ client.bind(event_queue_name, observed_exchange || default_exchange, *routing_keys) do |message|
45
45
  event = Event.parse(message)
46
46
  handle_event(event)
47
47
  end
48
48
  end
49
49
 
50
+ def event_queue_name
51
+ self.class.event_queue_name(id)
52
+ end
53
+
50
54
  module ClassMethods
51
55
  # Method used to retrieve active observers. Override in your EventObserver class
52
56
  def find_active_observers
@@ -18,6 +18,10 @@ module Isimud
18
18
  @routing_keys << Regexp.new(key.gsub(/\./, "\\.").gsub(/\*/, ".*"))
19
19
  end
20
20
 
21
+ def unbind(exchange)
22
+ @routing_keys.clear
23
+ end
24
+
21
25
  def has_matching_key?(route)
22
26
  @routing_keys.any? { |k| route =~ k }
23
27
  end
@@ -59,6 +63,12 @@ module Isimud
59
63
  create_queue(queue_name, exchange_name, routing_keys: keys, &method)
60
64
  end
61
65
 
66
+ def rebind(queue_name, exchange_name, keys)
67
+ queue = queues[queue_name] || return
68
+ queue.unbind(exchange_name)
69
+ keys.each { |key| queue.bind(exchange_name, routing_key: key) }
70
+ end
71
+
62
72
  def create_queue(queue_name, exchange_name, options = {}, &method)
63
73
  keys = options[:routing_keys] || []
64
74
  log "Isimud::TestClient: Binding queue #{queue_name} for keys #{keys.inspect}"
@@ -69,7 +79,7 @@ module Isimud
69
79
  queue
70
80
  end
71
81
 
72
- def publish(exchange, routing_key, payload)
82
+ def publish(exchange, routing_key, payload, _options = {})
73
83
  log "Isimud::TestClient: Delivering message key: #{routing_key} payload: #{payload}"
74
84
  call_queues = queues.values.select { |queue| queue.has_matching_key?(routing_key) }
75
85
  call_queues.each do |queue|
@@ -1,3 +1,3 @@
1
1
  module Isimud
2
- VERSION = '0.5.2'
2
+ VERSION = '0.7.0'
3
3
  end
data/release ADDED
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'colored'
4
+ require 'digest/sha2'
5
+ require File.expand_path('lib/isimud/version.rb')
6
+
7
+ def run!(command)
8
+ puts "running #{command}".yellow
9
+ system(command) || abort("Command #{command} failed, terminating!")
10
+ end
11
+
12
+ gem_name = 'isimud'
13
+ gem_version = "#{gem_name}-#{Isimud::VERSION}.gem"
14
+ built_gem_path = "pkg/#{gem_version}"
15
+ puts "Building #{gem_name} version #{Isimud::VERSION}".cyan
16
+ run! "gem build #{gem_name}.gemspec"
17
+ run! "mv #{gem_version} #{built_gem_path}"
18
+
19
+ puts 'Adding and committing checksum'.cyan
20
+ checksum = Digest::SHA512.new.hexdigest(File.read(built_gem_path))
21
+ checksum_path = "checksum/#{gem_name}-#{Isimud::VERSION}.gem.sha512"
22
+ File.open(checksum_path, 'w') { |f| f.write(checksum) }
23
+ run! "git add #{checksum_path}"
24
+ run! "git commit -m 'added checksum for #{gem_version}' && git push origin"
25
+
26
+ puts 'Publishing to RubyGems'.cyan
27
+ run! "gem push #{built_gem_path}"
28
+
29
+ puts 'Testing install'.cyan
30
+ run! "gem install #{gem_name} -v #{Isimud::VERSION} -P MediumSecurity"
31
+ Contact GitHub API Training Shop Blog About
@@ -19,9 +19,14 @@ describe Isimud::BunnyClient do
19
19
  let(:channel) { client.channel }
20
20
  let(:proc) { Proc.new { puts('hello') } }
21
21
  let(:keys) { %w(foo.bar baz.*) }
22
+ let(:queue_name) { 'my_queue' }
22
23
  before do
23
24
  Isimud.logger = Logger.new(STDOUT)
24
25
  end
26
+ after do
27
+ client.delete_queue(queue_name)
28
+ end
29
+
25
30
 
26
31
  it 'creates a new queue' do
27
32
  queue = client.bind('my_queue', @exchange_name, keys, &proc)
@@ -39,11 +44,12 @@ describe Isimud::BunnyClient do
39
44
 
40
45
  it 'calls block when a message is received' do
41
46
  @block_called = Array.new
42
- queue_name = 'test queue'
47
+ queue_name = 'test_queue'
43
48
  client.bind("#{queue_name}", @exchange_name, 'my.test.key') do |payload|
44
49
  @block_called << payload
45
50
  end
46
51
  client.publish(@exchange_name, 'my.test.key', "Hi there")
52
+ sleep(1)
47
53
  expect(@block_called).to eq ['Hi there']
48
54
  end
49
55
  end
metadata CHANGED
@@ -1,15 +1,37 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: isimud
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.2
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - George Feil
8
8
  - Brian Jenkins
9
9
  autorequire:
10
10
  bindir: bin
11
- cert_chain: []
12
- date: 2016-08-09 00:00:00.000000000 Z
11
+ cert_chain:
12
+ - |
13
+ -----BEGIN CERTIFICATE-----
14
+ MIIDeDCCAmCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBBMRQwEgYDVQQDDAtnZW9y
15
+ Z2UuZmVpbDEUMBIGCgmSJomT8ixkARkWBGtlYXMxEzARBgoJkiaJk/IsZAEZFgNj
16
+ b20wHhcNMTYwODA5MjEwNDU1WhcNMTcwODA5MjEwNDU1WjBBMRQwEgYDVQQDDAtn
17
+ ZW9yZ2UuZmVpbDEUMBIGCgmSJomT8ixkARkWBGtlYXMxEzARBgoJkiaJk/IsZAEZ
18
+ FgNjb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDDFBKCoLQgCUv1
19
+ 86ykJOCtnWhQ12Eymfnu5btV3DKMMLxjUDG18vy1Clhw04afp36Rc+oMvP1VxYeH
20
+ lRWdLtnWy2DAu2dxeFlWvacAegDcmQSw9vfyS7yD8zoLhJGeIflJ3eenTa+nRiQ2
21
+ DBPL1qRdfSrBNBXVlTYvs/PGE0SLJPtil8oRsifqk7ETPCUx5gRSxzzp0JykjrUd
22
+ cIu2u06Dv5GyDVwJu5/m4wLJSc2Bmore7rmOctBSNYtXTcMGVQOfskhncLNeE56V
23
+ R7byYxJ92HQt4svMjbK0hN+27asFpXaVU9ZeNQeEOOsgq8ecdypAWjwlOaH580K5
24
+ aH24zkstAgMBAAGjezB5MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQW
25
+ BBSXpvM46ec2Ds6ErCpZkXFZtsEh7TAfBgNVHREEGDAWgRRnZW9yZ2UuZmVpbEBr
26
+ ZWFzLmNvbTAfBgNVHRIEGDAWgRRnZW9yZ2UuZmVpbEBrZWFzLmNvbTANBgkqhkiG
27
+ 9w0BAQUFAAOCAQEAEXuMNAP35/nzBGj5aodPKIgH2Bvda9IF8OC4sDmQsRsUQzDw
28
+ wRi3rWoNzUU+QexdZqhLXSwGuPNgMgmPKaOu09LjpKKbem9VDicUEhNDL27CYMJZ
29
+ 1oO1kEqjbZW60HZcfDNrw8Q6ARBRhKXpPJsbYrR2QRzx1P0oVkFtmc9Qu4gvFy3c
30
+ hIevyUPfcaBRWNfXCQnyFXZcHqcTywEgNyXTJZ6zUNZSHIQPzLOyzqa+muVO8Ob/
31
+ wSKk31gq6KY7rgi11mcLvVzwSuwZFqnonAmu/uin3cbXcOUkqNsyzZ0LQLXNKiwi
32
+ k0RgrsSNtQ8hcsVSQla0Ot+X3WpFI4ZuIfSLFA==
33
+ -----END CERTIFICATE-----
34
+ date: 2016-09-19 00:00:00.000000000 Z
13
35
  dependencies:
14
36
  - !ruby/object:Gem::Dependency
15
37
  name: activerecord
@@ -67,7 +89,10 @@ dependencies:
67
89
  - - ">="
68
90
  - !ruby/object:Gem::Version
69
91
  version: 0.10.6
70
- description: ''
92
+ description: |
93
+ Isimud is an AMQP message publishing and consumption gem intended for Rails applications. You can use it to define
94
+ message consumption queues for ActiveRecord instances, or synchronize model updates between processes. It also provides
95
+ an event listener background process for managing queues that consume messages.
71
96
  email:
72
97
  - george.feil@keas.com
73
98
  - bonkydog@bonkydog.com
@@ -86,6 +111,7 @@ files:
86
111
  - Gemfile.lock
87
112
  - README.md
88
113
  - Rakefile
114
+ - certs/gfeil.pem
89
115
  - config.ru
90
116
  - config/tddium.yml
91
117
  - doc/Isimud.html
@@ -135,6 +161,7 @@ files:
135
161
  - lib/rails/generators/isimud/initializer_generator.rb
136
162
  - lib/rails/generators/isimud/templates/initializer.rb
137
163
  - lib/rails/generators/isimud/templates/isimud.yml
164
+ - release
138
165
  - spec/internal/app/models/admin.rb
139
166
  - spec/internal/app/models/company.rb
140
167
  - spec/internal/app/models/user.rb
@@ -151,9 +178,9 @@ files:
151
178
  - spec/isimud/test_client_spec.rb
152
179
  - spec/isimud_spec.rb
153
180
  - spec/spec_helper.rb
154
- homepage: ''
181
+ homepage: https://github.com/KeasInc/isimud
155
182
  licenses:
156
- - Copyright (C) 2014 Keas -- All rights reserved
183
+ - MITNFA
157
184
  metadata: {}
158
185
  post_install_message:
159
186
  rdoc_options: []
@@ -171,10 +198,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
171
198
  version: '0'
172
199
  requirements: []
173
200
  rubyforge_project:
174
- rubygems_version: 2.4.5.1
201
+ rubygems_version: 2.5.1
175
202
  signing_key:
176
203
  specification_version: 4
177
- summary: AMQP Messaging for Events and ActiveRecord changes
204
+ summary: AMQP Messaging and Event Processing
178
205
  test_files:
179
206
  - spec/internal/app/models/admin.rb
180
207
  - spec/internal/app/models/company.rb
@@ -0,0 +1,2 @@
1
+ �ޖb��=�ҖN?1��Ԉ]�~����e_{�/;��ަg9�L�L�)��!�>=z�@�O��ōV��{�^�|#LOg<��in̻��pI~�9�e;��L�mVDWh�"��Ľ�;
2
+ B�(M�P�q�8i������ɲ�4���='(B���Y�E{Ez�xː de+*U֐!��D�i��Uu?��o�C�sX�1�UĂkW��x��f������E?gH�������i�h���wb�@