artsy-eventservice 1.0.3 → 1.0.4

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: b2fc420aec74a16109d3473d71cb71bd2c1fbafd
4
- data.tar.gz: eda0bb72a66fe5cdc85887ea8d3c0aa325d5bae8
3
+ metadata.gz: 730a1c3e93fc39daa432c14e98e4d3e470bd21d5
4
+ data.tar.gz: b91155920aa1d4d24d9c1c96e1b13cb822a121ca
5
5
  SHA512:
6
- metadata.gz: 6bf09515e7ed36508e0f0de94fa652ed91842418b3c79411748c8bf9affc5abad0795d15e2a6aea6b65ee6780e959a586da34d14cad0c4eea486b60fd882ca91
7
- data.tar.gz: 96323a9511c6db2f81a1f2c5bde6a316b8e9740b43f1385f8698421a2079bbcce5eb73af576871baefcbc654dd534a092f3287be7471bf9e4b722d6e1ac90ce6
6
+ metadata.gz: 26960c9c97661ea5bba215c7863f78162713e975ea60917527d0d6a3ba8fb6809a94ce1d34c7f9f2e6770aa07e628a4f950aacffd7cd089f3e7364b61eddc726
7
+ data.tar.gz: e4a4eddb337a77cba72ed97d39c9f06225ea42c40ffa34e92ffd6dc0d417a60582e7135387b9e2a04633aee652241a30f5c578bd48388b3f2121dd2bb730f29e
data/Gemfile.lock CHANGED
@@ -1,18 +1,18 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- artsy-eventservice (1.0.3)
5
- bunny (~> 2.6.2)
4
+ artsy-eventservice (1.0.4)
5
+ bunny (~> 2.7.1)
6
6
 
7
7
  GEM
8
8
  remote: http://rubygems.org/
9
9
  specs:
10
- amq-protocol (2.0.1)
10
+ amq-protocol (2.2.0)
11
11
  ast (2.3.0)
12
12
  binding_of_caller (0.7.2)
13
13
  debug_inspector (>= 0.0.1)
14
- bunny (2.6.2)
15
- amq-protocol (>= 2.0.1)
14
+ bunny (2.7.1)
15
+ amq-protocol (>= 2.2.0)
16
16
  coderay (1.1.1)
17
17
  debug_inspector (0.0.2)
18
18
  diff-lcs (1.2.5)
@@ -76,4 +76,4 @@ RUBY VERSION
76
76
  ruby 2.3.0p0
77
77
 
78
78
  BUNDLED WITH
79
- 1.14.6
79
+ 1.15.4
@@ -15,5 +15,5 @@ Gem::Specification.new do |s|
15
15
  s.homepage = 'http://github.com/artsy/artsy-eventservice'
16
16
  s.licenses = ['MIT']
17
17
  s.summary = "Ruby Gem for producing events in Artsy's event stream"
18
- s.add_dependency 'bunny', '~> 2.6.2'
18
+ s.add_dependency 'bunny', '~> 2.7.1'
19
19
  end
@@ -2,16 +2,14 @@
2
2
  module Artsy
3
3
  module EventService
4
4
  class Publisher
5
- include RabbitMQConnection
6
-
7
5
  def self.publish(topic:, event:, routing_key: nil)
8
6
  new.post_event(topic: topic, event: event, routing_key: routing_key)
9
7
  end
10
8
 
11
9
  def post_event(topic:, event:, routing_key: nil)
12
10
  raise 'Event missing topic or verb.' if event.verb.to_s.empty? || topic.to_s.empty?
13
- connect_to_rabbit do |conn|
14
- channel = conn.create_channel
11
+ RabbitMQConnection.get_channel do |channel|
12
+ channel.confirm_select if config.confirms_enabled
15
13
  exchange = channel.topic(topic, durable: true)
16
14
  exchange.publish(
17
15
  event.json,
@@ -20,10 +18,11 @@ module Artsy
20
18
  content_type: 'application/json',
21
19
  app_id: config.app_name
22
20
  )
21
+ raise 'Publishing event failed' if config.confirms_enabled && !channel.wait_for_confirms
23
22
  end
24
23
  end
25
24
 
26
- def self.config
25
+ def config
27
26
  Artsy::EventService.config
28
27
  end
29
28
  end
@@ -3,43 +3,55 @@ require 'bunny'
3
3
 
4
4
  module Artsy
5
5
  module EventService
6
- module RabbitMQConnection
7
- # get a new RabbitMQ Client
8
- def create_conn
9
- Bunny.new(rabbitmq_url, **bunny_params)
10
- end
6
+ class RabbitMQConnection
7
+ @connection = nil
8
+ @mutex = Mutex.new
11
9
 
12
- # Connect, do something and close the connection
13
- def connect_to_rabbit
14
- conn = create_conn
10
+ # Build a new connection to RabbitMQ
11
+ def self.build_connection
12
+ conn = Bunny.new(self.rabbitmq_url, **self.bunny_params)
15
13
  conn.start
16
- yield(conn)
17
- conn.stop
14
+ conn
15
+ end
16
+
17
+ # Synchronized access to the connection
18
+ def self.get_connection
19
+ @mutex.synchronize do
20
+ @connection ||= self.build_connection
21
+ end
22
+ end
23
+
24
+ # Get a channel from the connection - synchronized access to create_channel is provided by Bunny
25
+ def self.get_channel
26
+ channel = self.get_connection.create_channel
27
+ yield channel if block_given?
28
+ ensure
29
+ channel.close if channel && channel.open?
18
30
  end
19
31
 
20
- def rabbitmq_url
21
- config.rabbitmq_url
32
+ def self.rabbitmq_url
33
+ self.config.rabbitmq_url
22
34
  end
23
35
 
24
- def bunny_params
25
- config.tls ? tls_params : no_tls_params
36
+ def self.bunny_params
37
+ self.config.tls ? self.tls_params : self.no_tls_params
26
38
  end
27
39
 
28
- def tls_params
40
+ def self.tls_params
29
41
  {
30
- tls: config.tls,
31
- tls_cert: config.tls_cert,
32
- tls_key: config.tls_key,
33
- tls_ca_certificates: [config.tls_ca_certificate],
34
- verify_peer: config.verify_peer
42
+ tls: self.config.tls,
43
+ tls_cert: self.config.tls_cert,
44
+ tls_key: self.config.tls_key,
45
+ tls_ca_certificates: [self.config.tls_ca_certificate],
46
+ verify_peer: self.config.verify_peer
35
47
  }
36
48
  end
37
49
 
38
- def no_tls_params
50
+ def self.no_tls_params
39
51
  {}
40
52
  end
41
53
 
42
- def config
54
+ def self.config
43
55
  Artsy::EventService.config
44
56
  end
45
57
  end
@@ -13,6 +13,7 @@ module Artsy
13
13
  attr_accessor :tls_cert
14
14
  attr_accessor :tls_key
15
15
  attr_accessor :verify_peer
16
+ attr_accessor :confirms_enabled
16
17
 
17
18
  def reset
18
19
  self.app_name = nil
@@ -23,6 +24,7 @@ module Artsy
23
24
  self.tls_cert = nil
24
25
  self.tls_key = nil
25
26
  self.verify_peer = nil
27
+ self.confirms_enabled = true
26
28
  end
27
29
 
28
30
  reset
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  module Artsy
3
3
  module EventService
4
- VERSION = '1.0.3'
4
+ VERSION = '1.0.4'
5
5
  end
6
6
  end
@@ -33,11 +33,13 @@ describe Artsy::EventService::Publisher do
33
33
  conn = double
34
34
  channel = double
35
35
  exchange = double
36
- allow(Bunny).to receive(:new).and_return(conn)
37
- expect(conn).to receive(:start).once
38
- expect(conn).to receive(:stop).once
36
+ allow(Artsy::EventService::RabbitMQConnection).to receive(:get_connection).with(no_args).and_return(conn)
39
37
  allow(conn).to receive(:create_channel).and_return(channel)
38
+ allow(channel).to receive(:open?).and_return(true)
40
39
  allow(channel).to receive(:topic).with('test', durable: true).and_return(exchange)
40
+ allow(channel).to receive(:confirm_select)
41
+ allow(channel).to receive(:wait_for_confirms).and_return(true)
42
+ allow(channel).to receive(:close)
41
43
 
42
44
  expect(exchange).to receive(:publish).with(
43
45
  JSON.generate(hello: true),
@@ -52,11 +54,13 @@ describe Artsy::EventService::Publisher do
52
54
  conn = double
53
55
  channel = double
54
56
  exchange = double
55
- allow(Bunny).to receive(:new).and_return(conn)
56
- expect(conn).to receive(:start).once
57
- expect(conn).to receive(:stop).once
57
+ allow(Artsy::EventService::RabbitMQConnection).to receive(:get_connection).with(no_args).and_return(conn)
58
58
  allow(conn).to receive(:create_channel).and_return(channel)
59
+ allow(channel).to receive(:open?).and_return(true)
59
60
  allow(channel).to receive(:topic).with('test', durable: true).and_return(exchange)
61
+ allow(channel).to receive(:confirm_select)
62
+ allow(channel).to receive(:wait_for_confirms).and_return(true)
63
+ allow(channel).to receive(:close)
60
64
 
61
65
  expect(exchange).to receive(:publish).with(
62
66
  JSON.generate(hello: true),
@@ -67,5 +71,28 @@ describe Artsy::EventService::Publisher do
67
71
  )
68
72
  Artsy::EventService::Publisher.publish(topic: 'test', event: event, routing_key: 'good.route')
69
73
  end
74
+ it 'raises an error if event publishing is unconfirmed' do
75
+ conn = double
76
+ channel = double
77
+ exchange = double
78
+ allow(Artsy::EventService::RabbitMQConnection).to receive(:get_connection).with(no_args).and_return(conn)
79
+ allow(conn).to receive(:create_channel).and_return(channel)
80
+ allow(channel).to receive(:open?).and_return(true)
81
+ allow(channel).to receive(:topic).with('test', durable: true).and_return(exchange)
82
+ allow(channel).to receive(:confirm_select)
83
+ allow(channel).to receive(:wait_for_confirms).and_return(false)
84
+ allow(channel).to receive(:close)
85
+
86
+ expect(exchange).to receive(:publish).with(
87
+ JSON.generate(hello: true),
88
+ routing_key: 'good.route',
89
+ persistent: true,
90
+ content_type: 'application/json',
91
+ app_id: 'artsy'
92
+ )
93
+ expect do
94
+ Artsy::EventService::Publisher.publish(topic: 'test', event: event, routing_key: 'good.route')
95
+ end.to raise_error 'Publishing event failed'
96
+ end
70
97
  end
71
98
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: artsy-eventservice
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ashkan Nasseri
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-07-25 00:00:00.000000000 Z
11
+ date: 2017-11-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bunny
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 2.6.2
19
+ version: 2.7.1
20
20
  type: :runtime
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: 2.6.2
26
+ version: 2.7.1
27
27
  description:
28
28
  email: ashkan.nasseri@gmail.com
29
29
  executables: []