philotic 0.5.0 → 0.6.0
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/README.md +2 -2
- data/examples/simple_instance.rb +1 -1
- data/examples/simple_singleton.rb +1 -1
- data/examples/subscribing/acks.rb +6 -6
- data/examples/subscribing/anonymous_queue.rb +1 -1
- data/examples/subscribing/multiple_named_queues.rb +2 -2
- data/examples/subscribing/named_queue.rb +1 -1
- data/lib/philotic/config.rb +6 -0
- data/lib/philotic/connection.rb +24 -4
- data/lib/philotic/event.rb +8 -1
- data/lib/philotic/publisher.rb +10 -3
- data/lib/philotic/subscriber.rb +3 -2
- data/lib/philotic/version.rb +1 -1
- data/spec/philotic/connection_spec.rb +10 -0
- data/spec/philotic/publisher_spec.rb +20 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3ed9395d1fe81863b4c38f92ab7caa95186d7731
|
4
|
+
data.tar.gz: d550b106f564a798635798e121dcd80d192d9e10
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 160ebead89967ffdcd676867166573334df6d8b7a01fe08fa061043a0cb7b23b31a8ac23d2ad9c6cff2876871b0b039ed10f4ab00dab48e8451ce4756a1a0d94
|
7
|
+
data.tar.gz: 8e40399b956a627bc93ccd1e7bca8e0408efe25e9cba930ba2833139c8a299d6e5fe95ec206bbbd2ca3f8867f125c19688aeeba06399ad8b5bd4887be6d29b81
|
data/README.md
CHANGED
@@ -19,7 +19,7 @@ Philotic.config.message_return_handler = lambda do |basic_return, metadata, mess
|
|
19
19
|
Philotic.logger.warn "Message returned. reply_text: #{basic_return.reply_text}"
|
20
20
|
end
|
21
21
|
|
22
|
-
Philotic.
|
22
|
+
Philotic.subscribe(header_key: 'header_1') do |metadata, message|
|
23
23
|
ap message[:attributes]
|
24
24
|
end
|
25
25
|
|
@@ -48,7 +48,7 @@ philotic.config.message_return_handler = lambda do |basic_return, metadata, mess
|
|
48
48
|
philotic.logger.warn "Message returned. reply_text: #{basic_return.reply_text}"
|
49
49
|
end
|
50
50
|
|
51
|
-
philotic.
|
51
|
+
philotic.subscribe(header_key: 'header_1') do |metadata, message|
|
52
52
|
ap message[:attributes]
|
53
53
|
end
|
54
54
|
|
data/examples/simple_instance.rb
CHANGED
@@ -12,7 +12,7 @@ philotic.config.message_return_handler = lambda do |basic_return, metadata, mess
|
|
12
12
|
philotic.logger.warn "Message returned. reply_text: #{basic_return.reply_text}"
|
13
13
|
end
|
14
14
|
|
15
|
-
philotic.
|
15
|
+
philotic.subscribe(header_key: 'header_1') do |metadata, message|
|
16
16
|
ap message[:attributes]
|
17
17
|
end
|
18
18
|
|
@@ -10,7 +10,7 @@ Philotic.config.message_return_handler = lambda do |basic_return, metadata, mess
|
|
10
10
|
Philotic.logger.warn "Message returned. reply_text: #{basic_return.reply_text}"
|
11
11
|
end
|
12
12
|
|
13
|
-
Philotic.
|
13
|
+
Philotic.subscribe(header_key: 'header_1') do |metadata, message|
|
14
14
|
ap message[:attributes]
|
15
15
|
end
|
16
16
|
|
@@ -6,20 +6,20 @@ require 'philotic'
|
|
6
6
|
require 'awesome_print'
|
7
7
|
|
8
8
|
# sometimes ack
|
9
|
-
Philotic.
|
9
|
+
Philotic.subscribe('flaky_queue', ack: true) do |metadata, message|
|
10
10
|
ap message[:attributes]
|
11
|
-
[true, false].sample ?
|
11
|
+
[true, false].sample ? acknowledge(message) : reject(message)
|
12
12
|
end
|
13
13
|
|
14
14
|
# always ack
|
15
|
-
Philotic.
|
15
|
+
Philotic.subscribe('flaky_queue', ack: true) do |metadata, message|
|
16
16
|
ap message[:attributes]
|
17
|
-
|
17
|
+
acknowledge(message, true)
|
18
18
|
end
|
19
19
|
|
20
20
|
# always reject
|
21
|
-
Philotic.
|
21
|
+
Philotic.subscribe('flaky_queue', ack: true) do |metadata, message|
|
22
22
|
ap message[:attributes]
|
23
|
-
|
23
|
+
reject message
|
24
24
|
end
|
25
25
|
Philotic.subscriber.endure
|
@@ -7,7 +7,7 @@ require 'awesome_print'
|
|
7
7
|
|
8
8
|
Philotic.config.load_file(File.join(File.dirname(__FILE__), '../../', 'Philotic.yml.example'))
|
9
9
|
|
10
|
-
Philotic.
|
10
|
+
Philotic.subscribe(philotic_firehose: true) do |metadata, message|
|
11
11
|
ap message[:attributes]
|
12
12
|
end
|
13
13
|
|
@@ -7,11 +7,11 @@ require 'awesome_print'
|
|
7
7
|
|
8
8
|
Philotic.config.load_file(File.join(File.dirname(__FILE__), '../../', 'Philotic.yml.example'))
|
9
9
|
|
10
|
-
Philotic.
|
10
|
+
Philotic.subscribe('female_queue') do |metadata, message|
|
11
11
|
ap message[:attributes]
|
12
12
|
end
|
13
13
|
|
14
|
-
Philotic.
|
14
|
+
Philotic.subscribe('male_queue') do |metadata, message|
|
15
15
|
ap message[:attributes]
|
16
16
|
end
|
17
17
|
|
data/lib/philotic/config.rb
CHANGED
@@ -39,6 +39,7 @@ module Philotic
|
|
39
39
|
DEFAULT_APP_ID = nil
|
40
40
|
DEFAULT_TIMESTAMP = nil
|
41
41
|
DEFAULT_EXPIRATION = nil
|
42
|
+
DEFAULT_CONNECTION_RETRIES = 2
|
42
43
|
|
43
44
|
attr_accessor :connection
|
44
45
|
|
@@ -77,6 +78,11 @@ module Philotic
|
|
77
78
|
def log_level
|
78
79
|
@log_level ||= defaults[:log_level].to_i
|
79
80
|
end
|
81
|
+
|
82
|
+
def connection_retries
|
83
|
+
@connection_retries ||= defaults[:connection_retries].to_i
|
84
|
+
end
|
85
|
+
|
80
86
|
attr_writer :connection_failed_handler, :connection_loss_handler, :message_return_handler
|
81
87
|
|
82
88
|
def connection_failed_handler
|
data/lib/philotic/connection.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'json'
|
2
2
|
require 'bunny'
|
3
3
|
require 'logger'
|
4
|
-
|
4
|
+
require 'bunny'
|
5
5
|
require 'philotic/constants'
|
6
6
|
require 'philotic/config'
|
7
7
|
require 'philotic/publisher'
|
@@ -9,13 +9,20 @@ require 'philotic/subscriber'
|
|
9
9
|
|
10
10
|
module Philotic
|
11
11
|
class Connection
|
12
|
+
|
13
|
+
class TCPConnectionFailed < Bunny::TCPConnectionFailed; end
|
14
|
+
|
12
15
|
extend Forwardable
|
13
16
|
|
14
|
-
attr_reader :connection
|
17
|
+
attr_reader :connection, :connection_attempts
|
15
18
|
attr_accessor :logger
|
16
19
|
|
17
20
|
attr_writer :publisher, :subscriber
|
18
21
|
|
22
|
+
def initialize
|
23
|
+
@connection_attempts = 0
|
24
|
+
end
|
25
|
+
|
19
26
|
def publisher
|
20
27
|
@publisher ||= Philotic::Publisher.new self
|
21
28
|
end
|
@@ -44,7 +51,20 @@ module Philotic
|
|
44
51
|
end
|
45
52
|
|
46
53
|
def start_connection!
|
47
|
-
|
54
|
+
begin
|
55
|
+
attempt_connection
|
56
|
+
rescue ::Bunny::TCPConnectionFailed => e
|
57
|
+
if connection_attempts <= config.connection_retries
|
58
|
+
retry
|
59
|
+
else
|
60
|
+
raise TCPConnectionFailed.new "Failed to connect after #{connection_attempts} attempts", config.rabbit_host, config.rabbit_port
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def attempt_connection
|
66
|
+
@connection_attempts += 1
|
67
|
+
@connection = Bunny.new(config.rabbit_url, connection_settings)
|
48
68
|
@connection.start
|
49
69
|
end
|
50
70
|
|
@@ -130,7 +150,7 @@ module Philotic
|
|
130
150
|
|
131
151
|
def logger
|
132
152
|
unless @logger
|
133
|
-
@logger
|
153
|
+
@logger = Logger.new(STDOUT)
|
134
154
|
@logger.level = config.log_level
|
135
155
|
end
|
136
156
|
@logger
|
data/lib/philotic/event.rb
CHANGED
@@ -6,7 +6,8 @@ module Philotic
|
|
6
6
|
class Event
|
7
7
|
include Philotic::Routable
|
8
8
|
|
9
|
-
attr_accessor :connection
|
9
|
+
attr_accessor :connection, :publish_error
|
10
|
+
attr_writer :published
|
10
11
|
|
11
12
|
def initialize(routables={}, payloads={}, connection=nil)
|
12
13
|
self.timestamp = Time.now.to_i
|
@@ -19,6 +20,8 @@ module Philotic
|
|
19
20
|
# over into the bus
|
20
21
|
_set_routables_or_payloads(:routable, routables)
|
21
22
|
_set_routables_or_payloads(:payload, payloads)
|
23
|
+
|
24
|
+
@published = false
|
22
25
|
end
|
23
26
|
|
24
27
|
def self.inherited(sub)
|
@@ -48,6 +51,10 @@ module Philotic
|
|
48
51
|
@connection ||= Philotic.connection
|
49
52
|
end
|
50
53
|
|
54
|
+
def published?
|
55
|
+
!!@published
|
56
|
+
end
|
57
|
+
|
51
58
|
def publish
|
52
59
|
connection.publish self
|
53
60
|
end
|
data/lib/philotic/publisher.rb
CHANGED
@@ -21,19 +21,25 @@ module Philotic
|
|
21
21
|
def publish(event)
|
22
22
|
message_metadata = {headers: event.headers}
|
23
23
|
message_metadata.merge!(event.message_metadata) if event.message_metadata
|
24
|
-
|
24
|
+
begin
|
25
|
+
event.published = _publish(event.payload, message_metadata)
|
26
|
+
rescue => e
|
27
|
+
event.publish_error = e
|
28
|
+
logger.error e.message
|
29
|
+
end
|
30
|
+
event
|
25
31
|
end
|
26
32
|
|
27
33
|
private
|
28
34
|
def _publish(payload, message_metadata = {})
|
29
35
|
if config.disable_publish
|
30
|
-
log_event_published(:warn,
|
36
|
+
log_event_published(:warn, message_metadata, payload, 'attempted to publish a message when publishing is disabled.')
|
31
37
|
return false
|
32
38
|
end
|
33
39
|
connection.connect!
|
34
40
|
unless connection.connected?
|
35
41
|
log_event_published(:error, message_metadata, payload, 'unable to publish event, not connected to RabbitMQ')
|
36
|
-
return
|
42
|
+
return false
|
37
43
|
end
|
38
44
|
message_metadata = merge_metadata(message_metadata)
|
39
45
|
|
@@ -41,6 +47,7 @@ module Philotic
|
|
41
47
|
|
42
48
|
connection.exchange.publish(payload.to_json, message_metadata)
|
43
49
|
log_event_published(:debug, message_metadata, payload, 'published event')
|
50
|
+
true
|
44
51
|
end
|
45
52
|
|
46
53
|
def normalize_payload_times(payload)
|
data/lib/philotic/subscriber.rb
CHANGED
@@ -20,7 +20,7 @@ module Philotic
|
|
20
20
|
connection.logger
|
21
21
|
end
|
22
22
|
|
23
|
-
def subscription_callback
|
23
|
+
def subscription_callback(&block)
|
24
24
|
lambda do |delivery_info, metadata, payload|
|
25
25
|
hash_payload = JSON.parse payload
|
26
26
|
|
@@ -30,7 +30,8 @@ module Philotic
|
|
30
30
|
delivery_info: delivery_info,
|
31
31
|
attributes: metadata[:headers] ? hash_payload.merge(metadata[:headers]) : hash_payload
|
32
32
|
}
|
33
|
-
|
33
|
+
|
34
|
+
instance_exec(Metadata.new(metadata), event, &block)
|
34
35
|
end
|
35
36
|
end
|
36
37
|
|
data/lib/philotic/version.rb
CHANGED
@@ -43,6 +43,7 @@ describe Philotic::Connection do
|
|
43
43
|
|
44
44
|
describe '#start_connection!' do
|
45
45
|
let(:connection) { double }
|
46
|
+
let(:connection_error) {Bunny::TCPConnectionFailed.new 'connection failed', 'localhost', '5672'}
|
46
47
|
subject { Philotic::Connection.new }
|
47
48
|
specify do
|
48
49
|
expect(Bunny).to receive(:new).with(subject.config.rabbit_url, subject.connection_settings).and_return(connection)
|
@@ -50,6 +51,15 @@ describe Philotic::Connection do
|
|
50
51
|
|
51
52
|
subject.start_connection!
|
52
53
|
end
|
54
|
+
|
55
|
+
it 'should retry connecting' do
|
56
|
+
expect(Bunny).to receive(:new) do
|
57
|
+
raise connection_error
|
58
|
+
end.exactly(subject.config.connection_retries + 1).times
|
59
|
+
|
60
|
+
expect { subject.start_connection! }.to raise_error(Philotic::Connection::TCPConnectionFailed)
|
61
|
+
end
|
62
|
+
|
53
63
|
end
|
54
64
|
|
55
65
|
describe '#close' do
|
@@ -17,6 +17,7 @@ describe Philotic::Publisher do
|
|
17
17
|
subject { publisher }
|
18
18
|
|
19
19
|
describe 'publish' do
|
20
|
+
let(:publish_error) {StandardError.new 'publish error'}
|
20
21
|
it 'should call _publish with the right values' do
|
21
22
|
Timecop.freeze
|
22
23
|
expect(subject).to receive(:_publish).with(
|
@@ -36,7 +37,22 @@ describe Philotic::Publisher do
|
|
36
37
|
timestamp: Time.now.to_i
|
37
38
|
}
|
38
39
|
)
|
40
|
+
expect(event).to_not be_published
|
39
41
|
subject.publish(event)
|
42
|
+
expect(event).to_not be_published # not connected
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'should fail gracefully' do
|
46
|
+
expect(subject).to receive(:_publish) do
|
47
|
+
raise publish_error
|
48
|
+
end
|
49
|
+
|
50
|
+
expect(subject.logger).to receive(:error).with(publish_error.message)
|
51
|
+
expect(event).to_not be_published
|
52
|
+
subject.publish(event)
|
53
|
+
expect(event).to_not be_published
|
54
|
+
expect(event.publish_error).to eq publish_error
|
55
|
+
|
40
56
|
end
|
41
57
|
|
42
58
|
end
|
@@ -83,7 +99,9 @@ describe Philotic::Publisher do
|
|
83
99
|
}.to_json,
|
84
100
|
metadata
|
85
101
|
)
|
102
|
+
expect(event).to_not be_published
|
86
103
|
subject.publish(event)
|
104
|
+
expect(event).to be_published
|
87
105
|
end
|
88
106
|
|
89
107
|
it 'should log an error when there is no connection' do
|
@@ -93,7 +111,9 @@ describe Philotic::Publisher do
|
|
93
111
|
expect(subject.connection).to receive(:connected?).once.and_return(false)
|
94
112
|
|
95
113
|
expect(subject.logger).to receive(:error)
|
114
|
+
expect(event).to_not be_published
|
96
115
|
subject.publish(event)
|
116
|
+
expect(event).to_not be_published
|
97
117
|
end
|
98
118
|
|
99
119
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: philotic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nathan Keyes
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2014-12-
|
12
|
+
date: 2014-12-24 00:00:00 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: codeclimate-test-reporter
|