pheme 0.0.11 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/pheme/message_handler.rb +2 -2
- data/lib/pheme/queue_poller.rb +10 -4
- data/lib/pheme/version.rb +1 -1
- data/spec/message_handler_spec.rb +2 -1
- data/spec/queue_poller_spec.rb +15 -3
- data/spec/support/example_queue_poller.rb +2 -2
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5bb62b021efbad7c81eabfe53f32641b051ab355
|
4
|
+
data.tar.gz: b45731fc261b7b7f5505e906f1d720cb99cc7259
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f3bbbff1509ad02bd38216a4748a7c74cf11deb751b394644aced095789e16e698768163f29d7adeab4577ddfcf1d9081d9b84b95917372dec51b6653862a6c6
|
7
|
+
data.tar.gz: f1f5e2765cea3ef16e838c191a37c5f224f05d926fcb4ee18565ecc91a994857cc31e2bb6a625f2882a524ad0118cb2ebc3371c39cac859f78eecc09a4dd506b
|
data/lib/pheme/queue_poller.rb
CHANGED
@@ -2,10 +2,10 @@ module Pheme
|
|
2
2
|
class QueuePoller
|
3
3
|
attr_accessor :queue_url, :queue_poller, :connection_pool_block, :format, :max_messages, :poller_configuration
|
4
4
|
|
5
|
-
def initialize(queue_url:, connection_pool_block: false, max_messages: nil, format: :json, poller_configuration: {})
|
5
|
+
def initialize(queue_url:, connection_pool_block: false, max_messages: nil, format: :json, poller_configuration: {}, sqs_client: nil)
|
6
6
|
raise ArgumentError, "must specify non-nil queue_url" unless queue_url.present?
|
7
7
|
@queue_url = queue_url
|
8
|
-
@queue_poller = Aws::SQS::QueuePoller.new(queue_url)
|
8
|
+
@queue_poller = Aws::SQS::QueuePoller.new(queue_url, client: sqs_client)
|
9
9
|
@connection_pool_block = connection_pool_block
|
10
10
|
@messages_processed = 0
|
11
11
|
@messages_received = 0
|
@@ -32,7 +32,8 @@ module Pheme
|
|
32
32
|
Pheme.logger.tagged(queue_message.message_id) do
|
33
33
|
begin
|
34
34
|
content = parse_body(queue_message)
|
35
|
-
|
35
|
+
metadata = parse_metadata(queue_message)
|
36
|
+
handle(content, metadata)
|
36
37
|
queue_poller.delete_message(queue_message)
|
37
38
|
log_delete(queue_message)
|
38
39
|
@messages_processed += 1
|
@@ -73,6 +74,11 @@ module Pheme
|
|
73
74
|
parsed_content
|
74
75
|
end
|
75
76
|
|
77
|
+
def parse_metadata(queue_message)
|
78
|
+
message_body = JSON.parse(queue_message.body)
|
79
|
+
{ timestamp: message_body['Timestamp'] }
|
80
|
+
end
|
81
|
+
|
76
82
|
def get_metadata(message_body)
|
77
83
|
message_body.except('Message', 'Records')
|
78
84
|
end
|
@@ -91,7 +97,7 @@ module Pheme
|
|
91
97
|
RecursiveOpenStruct.new({ wrapper: parsed_body }, recurse_over_arrays: true).wrapper
|
92
98
|
end
|
93
99
|
|
94
|
-
def handle(_message)
|
100
|
+
def handle(_message, _metadata)
|
95
101
|
raise NotImplementedError
|
96
102
|
end
|
97
103
|
|
data/lib/pheme/version.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
describe Pheme::MessageHandler do
|
2
2
|
before(:each) { use_default_configuration! }
|
3
3
|
let(:message) { RecursiveOpenStruct.new(status: "complete") }
|
4
|
-
|
4
|
+
let(:timestamp) { '2018-04-17T21:45:05.915Z' }
|
5
|
+
subject { ExampleMessageHandler.new(message: message, metadata: { timestamp: timestamp }) }
|
5
6
|
|
6
7
|
describe "#handle" do
|
7
8
|
it "handles the message correctly" do
|
data/spec/queue_poller_spec.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
describe Pheme::QueuePoller do
|
2
2
|
let(:queue_url) { "https://sqs.us-east-1.amazonaws.com/whatever" }
|
3
|
+
let(:timestamp) { '2018-04-17T21:45:05.915Z' }
|
3
4
|
|
4
5
|
describe ".new" do
|
5
6
|
context "when initialized with valid params" do
|
@@ -19,6 +20,15 @@ describe Pheme::QueuePoller do
|
|
19
20
|
expect(ExampleQueuePoller.new(queue_url: "queue_url", max_messages: 5).max_messages).to eq(5)
|
20
21
|
end
|
21
22
|
end
|
23
|
+
|
24
|
+
context "when initialized with sqs_client" do
|
25
|
+
let(:sqs_client) { Object.new }
|
26
|
+
|
27
|
+
it "should set custom sqs_client" do
|
28
|
+
expect(Aws::SQS::QueuePoller).to receive(:new).with("queue_url", client: sqs_client)
|
29
|
+
ExampleQueuePoller.new(queue_url: "queue_url", sqs_client: sqs_client)
|
30
|
+
end
|
31
|
+
end
|
22
32
|
end
|
23
33
|
|
24
34
|
let(:poller) { ExampleQueuePoller.new(queue_url: queue_url, format: format) }
|
@@ -95,7 +105,7 @@ describe Pheme::QueuePoller do
|
|
95
105
|
let(:mock_connection_pool) { double }
|
96
106
|
subject { ExampleQueuePoller.new(queue_url: queue_url, connection_pool_block: true) }
|
97
107
|
let(:message) { { status: 'complete' } }
|
98
|
-
let(:notification) { { 'MessageId' => SecureRandom.uuid, 'Message' => message.to_json, 'Type' => 'Notification' } }
|
108
|
+
let(:notification) { { 'MessageId' => SecureRandom.uuid, 'Message' => message.to_json, 'Type' => 'Notification', 'Timestamp' => timestamp, } }
|
99
109
|
let!(:queue_message) do
|
100
110
|
OpenStruct.new(
|
101
111
|
body: notification.to_json,
|
@@ -119,7 +129,7 @@ describe Pheme::QueuePoller do
|
|
119
129
|
context "without connection pool block" do
|
120
130
|
subject { ExampleQueuePoller.new(queue_url: queue_url) }
|
121
131
|
let(:message) { { status: 'complete' } }
|
122
|
-
let(:notification) { { 'MessageId' => SecureRandom.uuid, 'Message' => message.to_json, 'Type' => 'Notification' } }
|
132
|
+
let(:notification) { { 'MessageId' => SecureRandom.uuid, 'Message' => message.to_json, 'Type' => 'Notification', 'Timestamp' => timestamp, } }
|
123
133
|
let!(:queue_message) do
|
124
134
|
OpenStruct.new(
|
125
135
|
body: notification.to_json,
|
@@ -146,6 +156,7 @@ describe Pheme::QueuePoller do
|
|
146
156
|
'MessageId' => SecureRandom.uuid,
|
147
157
|
'Message' => message.to_json,
|
148
158
|
'Type' => 'Notification',
|
159
|
+
'Timestamp' => timestamp,
|
149
160
|
}
|
150
161
|
end
|
151
162
|
let!(:queue_message) do
|
@@ -161,7 +172,7 @@ describe Pheme::QueuePoller do
|
|
161
172
|
end
|
162
173
|
|
163
174
|
it "handles the message" do
|
164
|
-
expect(ExampleMessageHandler).to receive(:new).with(message: RecursiveOpenStruct.new(message))
|
175
|
+
expect(ExampleMessageHandler).to receive(:new).with(message: RecursiveOpenStruct.new(message), metadata: { timestamp: timestamp })
|
165
176
|
subject.poll
|
166
177
|
end
|
167
178
|
|
@@ -179,6 +190,7 @@ describe Pheme::QueuePoller do
|
|
179
190
|
'MessageId' => SecureRandom.uuid,
|
180
191
|
'Message' => message.to_json,
|
181
192
|
'Type' => 'Notification',
|
193
|
+
'Timestamp' => timestamp,
|
182
194
|
}
|
183
195
|
end
|
184
196
|
let!(:queue_message) do
|
@@ -3,10 +3,10 @@ class ExampleQueuePoller < Pheme::QueuePoller
|
|
3
3
|
super(queue_url: queue_url, **kwargs)
|
4
4
|
end
|
5
5
|
|
6
|
-
def handle(message)
|
6
|
+
def handle(message, metadata)
|
7
7
|
case message.status
|
8
8
|
when 'complete', 'rejected'
|
9
|
-
ExampleMessageHandler.new(message: message).handle
|
9
|
+
ExampleMessageHandler.new(message: message, metadata: metadata).handle
|
10
10
|
else
|
11
11
|
raise ArgumentError, "Unknown message status: #{message.status}"
|
12
12
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pheme
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Graham
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-04-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -199,7 +199,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
199
199
|
version: '0'
|
200
200
|
requirements: []
|
201
201
|
rubyforge_project:
|
202
|
-
rubygems_version: 2.
|
202
|
+
rubygems_version: 2.5.1
|
203
203
|
signing_key:
|
204
204
|
specification_version: 4
|
205
205
|
summary: Ruby SNS publisher + SQS poller & message handler
|