cony 2.0.1 → 2.2.1
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 +25 -18
- data/VERSION +1 -1
- data/bin/cony-receive +3 -3
- data/cony.gemspec +2 -2
- data/lib/cony.rb +15 -1
- data/lib/cony/active_record.rb +13 -4
- data/lib/cony/amqp_connection_handler.rb +0 -2
- data/spec/cony/active_record_spec.rb +9 -11
- data/spec/cony/amqp_connection_handler_spec.rb +11 -13
- data/spec/spec_helper.rb +0 -1
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6480837c675265e2e4ac5cc86a154d359dec892e
|
4
|
+
data.tar.gz: 4734b66beb8e73e0eb557efe901582234f465d5a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 831f2e33dae98754cbbd6f60f2b20ba5d27cfb3cc74f65b9f1f61391022b1091d5eb615d6c75c4c2b6f93af42117060022d735d4c6fecc96a9e24d41a54548fb
|
7
|
+
data.tar.gz: f4bf13ad28799d1622d2048f3f6191b16ffce3e676f01c2328cece654660be777d7e4a87fdb83a553b065c4832b5f3764556424e4877fb62d6136a67954db61c
|
data/Gemfile.lock
CHANGED
@@ -1,35 +1,39 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
cony (2.
|
4
|
+
cony (2.2.0)
|
5
5
|
activesupport (>= 3)
|
6
6
|
bunny (~> 2.3)
|
7
7
|
|
8
8
|
GEM
|
9
9
|
remote: https://rubygems.org/
|
10
10
|
specs:
|
11
|
-
activesupport (
|
11
|
+
activesupport (5.0.0.1)
|
12
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
12
13
|
i18n (~> 0.7)
|
13
|
-
json (~> 1.7, >= 1.7.7)
|
14
14
|
minitest (~> 5.1)
|
15
|
-
thread_safe (~> 0.3, >= 0.3.4)
|
16
15
|
tzinfo (~> 1.1)
|
17
16
|
amq-protocol (2.0.1)
|
18
|
-
bunny (2.
|
17
|
+
bunny (2.5.1)
|
19
18
|
amq-protocol (>= 2.0.1)
|
19
|
+
concurrent-ruby (1.0.2)
|
20
20
|
diff-lcs (1.2.5)
|
21
21
|
i18n (0.7.0)
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
rspec-
|
27
|
-
rspec-
|
28
|
-
|
29
|
-
|
30
|
-
rspec-expectations (
|
31
|
-
diff-lcs (>= 1.
|
32
|
-
|
22
|
+
minitest (5.9.1)
|
23
|
+
rake (11.3.0)
|
24
|
+
rspec (3.5.0)
|
25
|
+
rspec-core (~> 3.5.0)
|
26
|
+
rspec-expectations (~> 3.5.0)
|
27
|
+
rspec-mocks (~> 3.5.0)
|
28
|
+
rspec-core (3.5.4)
|
29
|
+
rspec-support (~> 3.5.0)
|
30
|
+
rspec-expectations (3.5.0)
|
31
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
32
|
+
rspec-support (~> 3.5.0)
|
33
|
+
rspec-mocks (3.5.0)
|
34
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
35
|
+
rspec-support (~> 3.5.0)
|
36
|
+
rspec-support (3.5.0)
|
33
37
|
thread_safe (0.3.5)
|
34
38
|
tzinfo (1.2.2)
|
35
39
|
thread_safe (~> 0.1)
|
@@ -39,5 +43,8 @@ PLATFORMS
|
|
39
43
|
|
40
44
|
DEPENDENCIES
|
41
45
|
cony!
|
42
|
-
rake (~>
|
43
|
-
rspec (~>
|
46
|
+
rake (~> 11.0)
|
47
|
+
rspec (~> 3.0)
|
48
|
+
|
49
|
+
BUNDLED WITH
|
50
|
+
1.12.5
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.2.1
|
data/bin/cony-receive
CHANGED
@@ -6,11 +6,11 @@ EventMachine.run do
|
|
6
6
|
AMQP.connect do |connection|
|
7
7
|
channel = AMQP::Channel.new(connection)
|
8
8
|
# topic exchange name can be any string
|
9
|
-
exchange = channel.topic(
|
9
|
+
exchange = channel.topic('cony-test', durable: true)
|
10
10
|
|
11
11
|
# Subscribers.
|
12
|
-
channel.queue(
|
13
|
-
queue.bind(exchange, :
|
12
|
+
channel.queue('', exclusive: true) do |queue|
|
13
|
+
queue.bind(exchange, routing_key: '#').subscribe do |_headers, payload|
|
14
14
|
puts payload.inspect
|
15
15
|
end
|
16
16
|
end
|
data/cony.gemspec
CHANGED
@@ -19,8 +19,8 @@ Gem::Specification.new do |s|
|
|
19
19
|
|
20
20
|
s.required_ruby_version = '>= 2.0'
|
21
21
|
|
22
|
-
s.add_development_dependency 'rake', '~>
|
23
|
-
s.add_development_dependency 'rspec', '~>
|
22
|
+
s.add_development_dependency 'rake', '~> 11.0'
|
23
|
+
s.add_development_dependency 'rspec', '~> 3.0'
|
24
24
|
|
25
25
|
s.add_runtime_dependency 'activesupport', '>= 3'
|
26
26
|
s.add_runtime_dependency 'bunny', '~> 2.3'
|
data/lib/cony.rb
CHANGED
@@ -9,6 +9,21 @@ require 'active_support/configurable'
|
|
9
9
|
|
10
10
|
require 'cony/active_record'
|
11
11
|
|
12
|
+
##
|
13
|
+
# To configure Cony:
|
14
|
+
# <code>
|
15
|
+
# Cony.configure do |config|
|
16
|
+
# config.amqp = {
|
17
|
+
# host: 'localhost',
|
18
|
+
# exchange: 'organization.application',
|
19
|
+
# ssl: true,
|
20
|
+
# user: 'username',
|
21
|
+
# pass: 'secret',
|
22
|
+
# }
|
23
|
+
# config.test_mode = Rails.env.test?
|
24
|
+
# # config.durable = false
|
25
|
+
# end
|
26
|
+
# </code>
|
12
27
|
module Cony
|
13
28
|
include ActiveSupport::Configurable
|
14
29
|
|
@@ -18,5 +33,4 @@ module Cony
|
|
18
33
|
}
|
19
34
|
|
20
35
|
self.config.merge! defaults.deep_dup
|
21
|
-
|
22
36
|
end
|
data/lib/cony/active_record.rb
CHANGED
@@ -4,8 +4,16 @@ require 'cony'
|
|
4
4
|
require 'cony/amqp_connection_handler'
|
5
5
|
|
6
6
|
module Cony
|
7
|
+
##
|
8
|
+
# Usage:
|
9
|
+
# <code>
|
10
|
+
# class FooBar < ActiveRecord::Base
|
11
|
+
# include Cony::ActiveRecord
|
12
|
+
# # your things here
|
13
|
+
# end
|
14
|
+
# </code>
|
15
|
+
#
|
7
16
|
module ActiveRecord
|
8
|
-
|
9
17
|
extend ActiveSupport::Concern
|
10
18
|
|
11
19
|
included do
|
@@ -34,13 +42,14 @@ module Cony
|
|
34
42
|
end
|
35
43
|
|
36
44
|
private
|
45
|
+
|
37
46
|
def cony_amqp_connection
|
38
47
|
@cony_amqp_connection ||= Cony::AMQPConnectionHandler.new(Cony.config.amqp)
|
39
48
|
end
|
40
49
|
|
41
50
|
def cony_mapped_changes
|
42
51
|
changes.map do |name, change|
|
43
|
-
{name => {old: change.first, new: change.last}}
|
52
|
+
{ name => { old: change.first, new: change.last } }
|
44
53
|
end
|
45
54
|
end
|
46
55
|
|
@@ -54,12 +63,12 @@ module Cony
|
|
54
63
|
|
55
64
|
def cony_changes_destroyed
|
56
65
|
attributes.map do |name, value|
|
57
|
-
{name => {old: value, new: nil}}
|
66
|
+
{ name => { old: value, new: nil } }
|
58
67
|
end
|
59
68
|
end
|
60
69
|
|
61
70
|
def cony_notify_hash
|
62
|
-
{id: self.id, changes: @cony_notify[:changes], model: self.class.name, event: @cony_notify[:event]}
|
71
|
+
{ id: self.id, changes: @cony_notify[:changes], model: self.class.name, event: @cony_notify[:event] }
|
63
72
|
end
|
64
73
|
|
65
74
|
def cony_notify_routing_key
|
@@ -3,7 +3,6 @@ require 'json'
|
|
3
3
|
|
4
4
|
module Cony
|
5
5
|
class AMQPConnectionHandler
|
6
|
-
|
7
6
|
def initialize(config)
|
8
7
|
@config = config
|
9
8
|
end
|
@@ -23,6 +22,5 @@ module Cony
|
|
23
22
|
Airbrake.notify(error) if defined?(Airbrake)
|
24
23
|
Rails.logger.error("#{error.class}: #{error}") if defined?(Rails)
|
25
24
|
end
|
26
|
-
|
27
25
|
end
|
28
26
|
end
|
@@ -3,12 +3,11 @@ require 'spec_helper'
|
|
3
3
|
require 'cony/active_record'
|
4
4
|
|
5
5
|
describe Cony::ActiveRecord do
|
6
|
-
|
7
6
|
let(:amqp_connection) { double('Cony::AMQPConnectionHandler') }
|
8
7
|
let(:id) { 1337 }
|
9
|
-
let(:active_record_changes) { {name:
|
10
|
-
let(:active_record_attributes) { {name: 'value'} }
|
11
|
-
let(:cony_changes) { [{name: {old: 'old', new: 'new'}}] }
|
8
|
+
let(:active_record_changes) { { name: %w(old new) } }
|
9
|
+
let(:active_record_attributes) { { name: 'value' } }
|
10
|
+
let(:cony_changes) { [{ name: { old: 'old', new: 'new' } }] }
|
12
11
|
let(:expected_payload) do
|
13
12
|
{
|
14
13
|
id: id,
|
@@ -36,7 +35,7 @@ describe Cony::ActiveRecord do
|
|
36
35
|
end
|
37
36
|
|
38
37
|
before do
|
39
|
-
Cony::AMQPConnectionHandler.
|
38
|
+
allow(Cony::AMQPConnectionHandler).to receive(:new).and_return(amqp_connection)
|
40
39
|
end
|
41
40
|
|
42
41
|
subject { model.new }
|
@@ -44,7 +43,7 @@ describe Cony::ActiveRecord do
|
|
44
43
|
describe '#cony_send_create_notify' do
|
45
44
|
let(:event) { :created }
|
46
45
|
it 'uses the amqp connection to send the notify' do
|
47
|
-
amqp_connection.
|
46
|
+
expect(amqp_connection).to receive(:publish).with(expected_payload, 'anonymaus/klass.mutation.created')
|
48
47
|
subject.cony_save_create_notify_data
|
49
48
|
subject.cony_publish
|
50
49
|
end
|
@@ -53,7 +52,7 @@ describe Cony::ActiveRecord do
|
|
53
52
|
describe '#cony_send_update_notify' do
|
54
53
|
let(:event) { :updated }
|
55
54
|
it 'uses the amqp connection to send the notify' do
|
56
|
-
amqp_connection.
|
55
|
+
expect(amqp_connection).to receive(:publish).with(expected_payload, 'anonymaus/klass.mutation.updated')
|
57
56
|
subject.cony_save_update_notify_data
|
58
57
|
subject.cony_publish
|
59
58
|
end
|
@@ -61,9 +60,9 @@ describe Cony::ActiveRecord do
|
|
61
60
|
|
62
61
|
describe '#cony_send_destroy_notify' do
|
63
62
|
let(:event) { :destroyed }
|
64
|
-
let(:cony_changes) { [{name: {old: 'value', new: nil}}] }
|
63
|
+
let(:cony_changes) { [{ name: { old: 'value', new: nil } }] }
|
65
64
|
it 'uses the amqp connection to send the notify' do
|
66
|
-
amqp_connection.
|
65
|
+
expect(amqp_connection).to receive(:publish).with(expected_payload, 'anonymaus/klass.mutation.destroyed')
|
67
66
|
subject.cony_save_destroy_notify_data
|
68
67
|
subject.cony_publish
|
69
68
|
end
|
@@ -71,7 +70,7 @@ describe Cony::ActiveRecord do
|
|
71
70
|
|
72
71
|
context 'test mode enabled' do
|
73
72
|
before do
|
74
|
-
Cony.config.
|
73
|
+
allow(Cony.config).to receive(:test_mode).and_return(true)
|
75
74
|
end
|
76
75
|
it 'does not send the message' do
|
77
76
|
expect(Cony::AMQPConnectionHandler).to_not receive(:new)
|
@@ -79,5 +78,4 @@ describe Cony::ActiveRecord do
|
|
79
78
|
subject.cony_publish
|
80
79
|
end
|
81
80
|
end
|
82
|
-
|
83
81
|
end
|
@@ -4,40 +4,39 @@ require 'ostruct'
|
|
4
4
|
require 'cony/amqp_connection_handler'
|
5
5
|
|
6
6
|
describe Cony::AMQPConnectionHandler do
|
7
|
-
|
8
|
-
let(:config) { {exchange: 'bunny-tests'} }
|
7
|
+
let(:config) { { exchange: 'bunny-tests' } }
|
9
8
|
let(:handler) { Cony::AMQPConnectionHandler.new(config) }
|
10
9
|
let(:message) { 'Bunnies are connies' }
|
11
10
|
let(:routing_key) { 'bunny.info' }
|
12
11
|
let(:exchange_double) do
|
13
12
|
double('Exchange double').tap do |exc|
|
14
|
-
exc.
|
13
|
+
allow(exc).to receive(:publish)
|
15
14
|
end
|
16
15
|
end
|
17
16
|
let(:channel_double) do
|
18
17
|
double('Channel double').tap do |channel|
|
19
|
-
channel.
|
18
|
+
allow(channel).to receive(:topic).and_return(exchange_double)
|
20
19
|
end
|
21
20
|
end
|
22
21
|
let(:connection_double) do
|
23
22
|
double('Connection double').tap do |conn|
|
24
|
-
conn.
|
23
|
+
allow(conn).to receive(:create_channel).and_return(channel_double)
|
25
24
|
end
|
26
25
|
end
|
27
26
|
|
28
27
|
subject { handler }
|
29
28
|
|
30
29
|
before do
|
31
|
-
Bunny.
|
30
|
+
allow(Bunny).to receive(:run).and_yield(connection_double)
|
32
31
|
end
|
33
32
|
|
34
33
|
it 'uses bunny to publish a message' do
|
35
|
-
Bunny.
|
34
|
+
expect(Bunny).to receive(:run)
|
36
35
|
subject.publish(message, routing_key)
|
37
36
|
end
|
38
37
|
|
39
38
|
it 'configures the exchange correctly' do
|
40
|
-
channel_double.
|
39
|
+
expect(channel_double).to receive(:topic).with('bunny-tests', durable: false)
|
41
40
|
subject.publish(message, routing_key)
|
42
41
|
end
|
43
42
|
|
@@ -49,14 +48,14 @@ describe Cony::AMQPConnectionHandler do
|
|
49
48
|
persistent: false,
|
50
49
|
content_type: 'application/json',
|
51
50
|
}
|
52
|
-
exchange_double.
|
53
|
-
|
51
|
+
expect(exchange_double).to receive(:publish).
|
52
|
+
with('"Bunnies are connies"', publish_options)
|
54
53
|
subject.publish(message, routing_key)
|
55
54
|
end
|
56
55
|
|
57
56
|
describe 'error handling' do
|
58
57
|
before do
|
59
|
-
Bunny.
|
58
|
+
allow(Bunny).to receive(:run).and_raise('I failed so hard')
|
60
59
|
end
|
61
60
|
|
62
61
|
it 'does not raise an error' do
|
@@ -68,7 +67,7 @@ describe Cony::AMQPConnectionHandler do
|
|
68
67
|
stub_const('Rails', OpenStruct.new(logger: double('Railslogger')))
|
69
68
|
end
|
70
69
|
it 'logs an error' do
|
71
|
-
expect(Rails.logger).to receive(:error).with(
|
70
|
+
expect(Rails.logger).to receive(:error).with('RuntimeError: I failed so hard')
|
72
71
|
subject.publish(message, routing_key)
|
73
72
|
end
|
74
73
|
end
|
@@ -83,5 +82,4 @@ describe Cony::AMQPConnectionHandler do
|
|
83
82
|
end
|
84
83
|
end
|
85
84
|
end
|
86
|
-
|
87
85
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cony
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- nine.ch Development-Team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-10-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -16,28 +16,28 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '11.0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '11.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rspec
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '3.0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '3.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: activesupport
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -117,7 +117,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
117
117
|
version: '0'
|
118
118
|
requirements: []
|
119
119
|
rubyforge_project:
|
120
|
-
rubygems_version: 2.
|
120
|
+
rubygems_version: 2.5.1
|
121
121
|
signing_key:
|
122
122
|
specification_version: 4
|
123
123
|
summary: Automatically sends notifications via AMQP when a model has been changed.
|