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 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