pheme 0.0.11 → 1.0.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/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
|