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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5972c2f262d7efc2c0c341bca9e47764d3ced583
4
- data.tar.gz: 7acc27e6ac4b39f4f849d0f5c000624d04e7c179
3
+ metadata.gz: 5bb62b021efbad7c81eabfe53f32641b051ab355
4
+ data.tar.gz: b45731fc261b7b7f5505e906f1d720cb99cc7259
5
5
  SHA512:
6
- metadata.gz: 9ed79b1d9e576e8c0e4acff8c461e373479613b0c9a0b19220fb8c8260be7eb90701457c9ce51861af94a6b8df4e3d5f08d558c327bcec07cf01a86a5611a7dd
7
- data.tar.gz: 6fbe113b021e4c75da8ec1fbe0bbab017f1a6119b02b54c5259af601334bfda24906bd449c5b1796c2d4377797f98be7cf36dfa30c7545db5895bb99cec3b6af
6
+ metadata.gz: f3bbbff1509ad02bd38216a4748a7c74cf11deb751b394644aced095789e16e698768163f29d7adeab4577ddfcf1d9081d9b84b95917372dec51b6653862a6c6
7
+ data.tar.gz: f1f5e2765cea3ef16e838c191a37c5f224f05d926fcb4ee18565ecc91a994857cc31e2bb6a625f2882a524ad0118cb2ebc3371c39cac859f78eecc09a4dd506b
@@ -1,8 +1,8 @@
1
1
  module Pheme
2
2
  class MessageHandler
3
- attr_reader :message
3
+ attr_reader :message, :timestamp
4
4
 
5
- def initialize(message:)
5
+ def initialize(message:, metadata:)
6
6
  @message = message
7
7
  end
8
8
 
@@ -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
- handle(content)
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
 
@@ -1,3 +1,3 @@
1
1
  module Pheme
2
- VERSION = "0.0.11".freeze
2
+ VERSION = "1.0.0".freeze
3
3
  end
@@ -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
- subject { ExampleMessageHandler.new(message: message) }
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
@@ -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.11
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: 2017-11-28 00:00:00.000000000 Z
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.6.13
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