philotic 0.6.0 → 0.7.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/lib/philotic/config.rb +12 -6
- data/lib/philotic/connection.rb +23 -12
- data/lib/philotic/publisher.rb +10 -10
- data/lib/philotic/version.rb +1 -1
- data/spec/philotic/connection_spec.rb +1 -2
- data/spec/philotic/logging/logger_spec.rb +21 -0
- data/spec/philotic/publisher_spec.rb +41 -3
- 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: 0f73c756665ad98e8a1387acdda9141a8e84e95c
|
4
|
+
data.tar.gz: cc3615e57182313cbc80acc792be53cc7bfbdefb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2e1d40caf53520703dcb80ea912f1fb5c2ebbc1e70496aa2c938273e566fb9dece69a0c00cf0729c483140014fb70b848d56df6e2d98dd142478dbeea7c48853
|
7
|
+
data.tar.gz: 8b2ef1f4b04f2d4b6cbce4b8f14c4877504c19574af33da3ab006f9a0e8df7c041af78271efd235cf97c18da9095ad4c8ff433b9144c32c8ee7200132d14b01c
|
data/README.md
CHANGED
@@ -16,7 +16,7 @@ require 'awesome_print'
|
|
16
16
|
|
17
17
|
# override the message return handler
|
18
18
|
Philotic.config.message_return_handler = lambda do |basic_return, metadata, message|
|
19
|
-
Philotic.logger.warn "Message returned. reply_text: #{basic_return.reply_text}"
|
19
|
+
Philotic.logger.warn { "Message returned. reply_text: #{basic_return.reply_text}" }
|
20
20
|
end
|
21
21
|
|
22
22
|
Philotic.subscribe(header_key: 'header_1') do |metadata, message|
|
@@ -45,7 +45,7 @@ philotic = Philotic::Connection.new
|
|
45
45
|
|
46
46
|
# override the message return handler
|
47
47
|
philotic.config.message_return_handler = lambda do |basic_return, metadata, message|
|
48
|
-
philotic.logger.warn "Message returned. reply_text: #{basic_return.reply_text}"
|
48
|
+
philotic.logger.warn { "Message returned. reply_text: #{basic_return.reply_text}" }
|
49
49
|
end
|
50
50
|
|
51
51
|
philotic.subscribe(header_key: 'header_1') do |metadata, message|
|
data/examples/simple_instance.rb
CHANGED
@@ -9,7 +9,7 @@ philotic = Philotic::Connection.new
|
|
9
9
|
|
10
10
|
# override the message return handler
|
11
11
|
philotic.config.message_return_handler = lambda do |basic_return, metadata, message|
|
12
|
-
philotic.logger.warn "Message returned. reply_text: #{basic_return.reply_text}"
|
12
|
+
philotic.logger.warn { "Message returned. reply_text: #{basic_return.reply_text}" }
|
13
13
|
end
|
14
14
|
|
15
15
|
philotic.subscribe(header_key: 'header_1') do |metadata, message|
|
@@ -7,7 +7,7 @@ require 'awesome_print'
|
|
7
7
|
|
8
8
|
# override the message return handler
|
9
9
|
Philotic.config.message_return_handler = lambda do |basic_return, metadata, message|
|
10
|
-
Philotic.logger.warn "Message returned. reply_text: #{basic_return.reply_text}"
|
10
|
+
Philotic.logger.warn { "Message returned. reply_text: #{basic_return.reply_text}" }
|
11
11
|
end
|
12
12
|
|
13
13
|
Philotic.subscribe(header_key: 'header_1') do |metadata, message|
|
data/lib/philotic/config.rb
CHANGED
@@ -39,7 +39,7 @@ module Philotic
|
|
39
39
|
DEFAULT_APP_ID = nil
|
40
40
|
DEFAULT_TIMESTAMP = nil
|
41
41
|
DEFAULT_EXPIRATION = nil
|
42
|
-
|
42
|
+
DEFAULT_CONNECTION_ATTEMPTS = 3
|
43
43
|
|
44
44
|
attr_accessor :connection
|
45
45
|
|
@@ -79,27 +79,28 @@ module Philotic
|
|
79
79
|
@log_level ||= defaults[:log_level].to_i
|
80
80
|
end
|
81
81
|
|
82
|
-
def
|
83
|
-
@connection_retries ||= defaults[:
|
82
|
+
def connection_attempts
|
83
|
+
@connection_retries ||= defaults[:connection_attempts].to_i
|
84
84
|
end
|
85
85
|
|
86
86
|
attr_writer :connection_failed_handler, :connection_loss_handler, :message_return_handler
|
87
87
|
|
88
88
|
def connection_failed_handler
|
89
89
|
@connection_failed_handler ||= lambda do |settings|
|
90
|
-
logger.error "RabbitMQ connection failure; host:#{rabbit_host}"
|
90
|
+
logger.error { "RabbitMQ connection failure; host:#{rabbit_host}" }
|
91
91
|
end
|
92
92
|
end
|
93
93
|
|
94
94
|
def connection_loss_handler
|
95
95
|
@connection_loss_handler ||= lambda do |conn, settings|
|
96
|
-
logger.warn "RabbitMQ connection loss; host:#{rabbit_host}"
|
96
|
+
logger.warn { "RabbitMQ connection loss; host:#{rabbit_host}" }
|
97
|
+
conn.reconnect(false, 2)
|
97
98
|
end
|
98
99
|
end
|
99
100
|
|
100
101
|
def message_return_handler
|
101
102
|
@message_return_handler ||= lambda do |basic_return, metadata, payload|
|
102
|
-
logger.warn "Philotic message #{JSON.parse payload} was returned! reply_code = #{basic_return.reply_code}, reply_text = #{basic_return.reply_text} headers = #{metadata[:headers]}"
|
103
|
+
logger.warn { "Philotic message #{JSON.parse payload} was returned! reply_code = #{basic_return.reply_code}, reply_text = #{basic_return.reply_text} headers = #{metadata[:headers]}" }
|
103
104
|
end
|
104
105
|
end
|
105
106
|
|
@@ -124,6 +125,11 @@ module Philotic
|
|
124
125
|
"#{rabbit_scheme}://#{rabbit_user}:#{rabbit_password}@#{rabbit_host}:#{rabbit_port}/#{CGI.escape rabbit_vhost}"
|
125
126
|
end
|
126
127
|
|
128
|
+
def sanitized_rabbit_url
|
129
|
+
parse_rabbit_uri
|
130
|
+
rabbit_url.gsub("#{rabbit_user}:#{rabbit_password}", '[USER_REDACTED]:[PASSWORD_REDACTED]')
|
131
|
+
end
|
132
|
+
|
127
133
|
def load_config(config)
|
128
134
|
config.each do |k, v|
|
129
135
|
mutator = "#{k}="
|
data/lib/philotic/connection.rb
CHANGED
@@ -10,7 +10,13 @@ require 'philotic/subscriber'
|
|
10
10
|
module Philotic
|
11
11
|
class Connection
|
12
12
|
|
13
|
-
class TCPConnectionFailed <
|
13
|
+
class TCPConnectionFailed < StandardError
|
14
|
+
attr_reader :url
|
15
|
+
|
16
|
+
def initialize(message, url)
|
17
|
+
super("Could not establish TCP connection to #{url}: #{message}")
|
18
|
+
end
|
19
|
+
end
|
14
20
|
|
15
21
|
extend Forwardable
|
16
22
|
|
@@ -41,11 +47,11 @@ module Philotic
|
|
41
47
|
start_connection!
|
42
48
|
|
43
49
|
if connected?
|
44
|
-
logger.info "
|
50
|
+
logger.info { "Connected to RabbitMQ: #{config.sanitized_rabbit_url}" }
|
45
51
|
set_exchange_return_handler!
|
46
52
|
true
|
47
53
|
else
|
48
|
-
logger.error "
|
54
|
+
logger.error { "Failed to connect to RabbitMQ: #{config.sanitized_rabbit_url}" }
|
49
55
|
false
|
50
56
|
end
|
51
57
|
end
|
@@ -54,18 +60,23 @@ module Philotic
|
|
54
60
|
begin
|
55
61
|
attempt_connection
|
56
62
|
rescue ::Bunny::TCPConnectionFailed => e
|
57
|
-
if connection_attempts
|
63
|
+
if connection_attempts < config.connection_attempts
|
58
64
|
retry
|
59
65
|
else
|
60
|
-
|
66
|
+
attempts = connection_attempts
|
67
|
+
@connection_attempts = 0
|
68
|
+
raise TCPConnectionFailed.new "Failed to connect to RabbitMQ server after #{attempts} attempts", config.sanitized_rabbit_url
|
61
69
|
end
|
62
70
|
end
|
63
71
|
end
|
64
72
|
|
65
73
|
def attempt_connection
|
66
74
|
@connection_attempts += 1
|
67
|
-
|
75
|
+
logger.warn { "Connecting to RabbitMQ: #{config.sanitized_rabbit_url}. Attempt #{connection_attempts} of #{config.connection_attempts}" } if connection_attempts > 1
|
76
|
+
|
77
|
+
@connection = Bunny.new(config.rabbit_url, connection_settings)
|
68
78
|
@connection.start
|
79
|
+
@connection_attempts = 0
|
69
80
|
end
|
70
81
|
|
71
82
|
def connection_settings
|
@@ -77,7 +88,7 @@ module Philotic
|
|
77
88
|
end
|
78
89
|
|
79
90
|
def close
|
80
|
-
logger.
|
91
|
+
logger.warn { "closing connection to RabbitMQ: #{config.sanitized_rabbit_url}" }
|
81
92
|
connection.close if connected?
|
82
93
|
@channel = nil
|
83
94
|
@exchange = nil
|
@@ -112,7 +123,7 @@ module Philotic
|
|
112
123
|
|
113
124
|
if should_delete_queue
|
114
125
|
channel.queue(queue_name, passive: true).delete
|
115
|
-
logger.info "deleted old queue. queue: #{queue_name}"
|
126
|
+
logger.info { "deleted old queue. queue: #{queue_name}" }
|
116
127
|
end
|
117
128
|
|
118
129
|
if should_create_queue
|
@@ -120,7 +131,7 @@ module Philotic
|
|
120
131
|
queue = queue_from_config(queue_name, config)
|
121
132
|
bind_queue(queue, config)
|
122
133
|
else
|
123
|
-
logger.warn "Queue #{queue_name} not created; it already exists. self.config.delete_existing_queues must be true to override."
|
134
|
+
logger.warn { "Queue #{queue_name} not created; it already exists. self.config.delete_existing_queues must be true to override." }
|
124
135
|
end
|
125
136
|
end
|
126
137
|
|
@@ -129,10 +140,10 @@ module Philotic
|
|
129
140
|
bindings = config[:bindings]
|
130
141
|
bindings.each do |arguments|
|
131
142
|
queue.bind(queue_exchange, {arguments: arguments})
|
132
|
-
logger.info "Added binding to queue. queue: #{queue.name} binding: #{arguments}"
|
143
|
+
logger.info { "Added binding to queue. queue: #{queue.name} binding: #{arguments}" }
|
133
144
|
end
|
134
145
|
|
135
|
-
logger.info "Finished adding bindings to queue. queue: #{queue.name}"
|
146
|
+
logger.info { "Finished adding bindings to queue. queue: #{queue.name}" }
|
136
147
|
end
|
137
148
|
|
138
149
|
def exchange_from_config(config)
|
@@ -144,7 +155,7 @@ module Philotic
|
|
144
155
|
queue_options.merge!(config[:options] || {})
|
145
156
|
|
146
157
|
channel.queue(queue_name, queue_options).tap do
|
147
|
-
logger.info "Created queue. queue:#{queue_name}"
|
158
|
+
logger.info { "Created queue. queue:#{queue_name}" }
|
148
159
|
end
|
149
160
|
end
|
150
161
|
|
data/lib/philotic/publisher.rb
CHANGED
@@ -30,6 +30,16 @@ module Philotic
|
|
30
30
|
event
|
31
31
|
end
|
32
32
|
|
33
|
+
def normalize_payload_times(payload)
|
34
|
+
payload.each do |k, v|
|
35
|
+
if v.respond_to?(:utc)
|
36
|
+
payload[k] = v.utc
|
37
|
+
elsif v.respond_to?(:to_utc)
|
38
|
+
payload[k] = v.to_utc
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
33
43
|
private
|
34
44
|
def _publish(payload, message_metadata = {})
|
35
45
|
if config.disable_publish
|
@@ -50,16 +60,6 @@ module Philotic
|
|
50
60
|
true
|
51
61
|
end
|
52
62
|
|
53
|
-
def normalize_payload_times(payload)
|
54
|
-
payload.each do |k, v|
|
55
|
-
if v.respond_to?(:utc)
|
56
|
-
payload[k] = v.utc
|
57
|
-
elsif v.respond_to?(:to_utc)
|
58
|
-
payload[k] = v.to_utc
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
63
|
def merge_metadata(message_metadata)
|
64
64
|
publish_defaults = {}
|
65
65
|
Philotic::MESSAGE_OPTIONS.each do |key|
|
data/lib/philotic/version.rb
CHANGED
@@ -55,7 +55,7 @@ describe Philotic::Connection do
|
|
55
55
|
it 'should retry connecting' do
|
56
56
|
expect(Bunny).to receive(:new) do
|
57
57
|
raise connection_error
|
58
|
-
end.exactly(subject.config.
|
58
|
+
end.exactly(subject.config.connection_attempts).times
|
59
59
|
|
60
60
|
expect { subject.start_connection! }.to raise_error(Philotic::Connection::TCPConnectionFailed)
|
61
61
|
end
|
@@ -147,7 +147,6 @@ describe Philotic::Connection do
|
|
147
147
|
expect(queue).to receive(:delete)
|
148
148
|
expect(channel).to receive(:queue).with(queue_name, queue_options).and_return(queue)
|
149
149
|
expect(channel).to receive(:headers).with(config[:exchange], durable: true) { exchange }
|
150
|
-
expect(queue).to receive(:name).and_return(queue_name).exactly(2).times
|
151
150
|
|
152
151
|
config[:bindings].each do |arguments|
|
153
152
|
expect(queue).to receive(:bind).with(exchange, {arguments: arguments})
|
@@ -30,6 +30,19 @@ module Philotic
|
|
30
30
|
|
31
31
|
end
|
32
32
|
|
33
|
+
it 'should accept a block' do
|
34
|
+
expect(logger.connection).to receive(:publish) do |event|
|
35
|
+
expect(event.message).to eq message
|
36
|
+
expect(event.severity).to eq Logger::INFO
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
expect(device).to receive(:write) do |log_message|
|
41
|
+
expect(log_message).to match /#{message}/
|
42
|
+
end
|
43
|
+
logger.info { message }
|
44
|
+
end
|
45
|
+
|
33
46
|
it "should not die if it can't log to RabbitMQ" do
|
34
47
|
expect(logger.connection).to receive(:publish) do |event|
|
35
48
|
raise error_message
|
@@ -43,7 +56,15 @@ module Philotic
|
|
43
56
|
expect(log_message).to match /#{error_message}/
|
44
57
|
end
|
45
58
|
logger.info message
|
59
|
+
end
|
46
60
|
|
61
|
+
it 'should behave not log if the severity is too low' do
|
62
|
+
|
63
|
+
expect(logger.connection).not_to receive(:publish)
|
64
|
+
|
65
|
+
expect(device).not_to receive(:write)
|
66
|
+
logger.level = Logger::WARN
|
67
|
+
logger.info message
|
47
68
|
end
|
48
69
|
end
|
49
70
|
end
|
@@ -16,8 +16,8 @@ describe Philotic::Publisher do
|
|
16
16
|
let(:publisher) { Philotic::Connection.new.publisher }
|
17
17
|
subject { publisher }
|
18
18
|
|
19
|
-
describe 'publish' do
|
20
|
-
let(:publish_error) {StandardError.new 'publish error'}
|
19
|
+
describe '#publish' do
|
20
|
+
let(:publish_error) { StandardError.new 'publish error' }
|
21
21
|
it 'should call _publish with the right values' do
|
22
22
|
Timecop.freeze
|
23
23
|
expect(subject).to receive(:_publish).with(
|
@@ -55,9 +55,23 @@ describe Philotic::Publisher do
|
|
55
55
|
|
56
56
|
end
|
57
57
|
|
58
|
+
context 'when publishing is disabled' do
|
59
|
+
before do
|
60
|
+
subject.config.disable_publish = true
|
61
|
+
end
|
62
|
+
it 'should log a warning' do
|
63
|
+
expect(subject).to receive(:log_event_published)
|
64
|
+
|
65
|
+
expect(event).to_not be_published
|
66
|
+
subject.publish(event)
|
67
|
+
expect(event).to_not be_published
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
|
58
72
|
end
|
59
73
|
|
60
|
-
describe 'raw_publish' do
|
74
|
+
describe '#raw_publish' do
|
61
75
|
|
62
76
|
it 'should call exchange.publish with the right values' do
|
63
77
|
Timecop.freeze
|
@@ -117,4 +131,28 @@ describe Philotic::Publisher do
|
|
117
131
|
end
|
118
132
|
|
119
133
|
end
|
134
|
+
|
135
|
+
|
136
|
+
describe '#normalize_payload_times' do
|
137
|
+
let(:responds_to_utc) { double }
|
138
|
+
let(:responds_to_to_utc) { double }
|
139
|
+
let (:payload) { {utc: responds_to_utc, to_utc: responds_to_to_utc} }
|
140
|
+
let(:normalized_utc) { 1 }
|
141
|
+
let(:normalized_to_utc) { 2 }
|
142
|
+
let (:normalized_payload) { {utc: normalized_utc, to_utc: normalized_to_utc} }
|
143
|
+
it 'should call .utc on values that respond to it' do
|
144
|
+
expect(responds_to_utc).to receive(:respond_to?).with(:utc).and_return(true)
|
145
|
+
expect(responds_to_utc).to receive(:utc).and_return(normalized_utc)
|
146
|
+
|
147
|
+
expect(responds_to_to_utc).to receive(:respond_to?).with(:utc).and_return(false)
|
148
|
+
expect(responds_to_to_utc).to receive(:respond_to?).with(:to_utc).and_return(true)
|
149
|
+
expect(responds_to_to_utc).to receive(:to_utc).and_return(normalized_to_utc)
|
150
|
+
|
151
|
+
subject.normalize_payload_times payload
|
152
|
+
|
153
|
+
expect(payload).to eq normalized_payload
|
154
|
+
|
155
|
+
end
|
156
|
+
|
157
|
+
end
|
120
158
|
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.7.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-30 00:00:00 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: codeclimate-test-reporter
|