pheme 3.2.0 → 3.3.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
  SHA256:
3
- metadata.gz: 5ead3f77e54732d0ec25696ec63984cca421f38a96f398c36c886f575ef05270
4
- data.tar.gz: 62af0c6807a8fcec1f00f8a1e2217b056bd3307d99a5a191f35512acac352afa
3
+ metadata.gz: 290bb6b78fadf5e1dbd173c9c8bc1a6cd2cbd31f5d9058714ce4f2f77085cec7
4
+ data.tar.gz: f176ebff0f18a9cf36fade1cf6c169ad2c606116719d9cf206089c4d86a0553a
5
5
  SHA512:
6
- metadata.gz: 2570dcdd9712acc03aa8ae0b25d6744e6aa2c2594aa2566cae59fb9e9b35c3143cf879a83fa4968026b1e47ee4d6a245f1122c673b354167e1421b928168a0d7
7
- data.tar.gz: 828eca04402d568ed88fe5deb4b89320feea9961089a6218f8efc8d0ac989bf82ab30b89cea2fb711919cf1ace55d9fe91b67aee43eabc3f9eab3272991b3413
6
+ metadata.gz: 9ae6f12316cf6a777935078f322829b163603a2423672d8ef6b18ce4c0c64575cd66b22e218fc442547b34c25a8d6f9e9e6bc1b36fa6d97e45b48f5c29a78d4a
7
+ data.tar.gz: 8e35c281558aa4e72a9cfaf96cfe35f7d33929ccb61cf98ee48c21befd27587c2c7d31416e65a92c900f3bac4221511d5f039fe53e1c5cfafccbf27d85967a16
@@ -7,40 +7,3 @@ inherit_gem:
7
7
  AllCops:
8
8
  # Specify your target Ruby version here (only major/minor versions):
9
9
  TargetRubyVersion: 2.4
10
- Exclude:
11
- - 'bin/**/*'
12
- - 'examples/**/*'
13
- - 'tmp/**/*'
14
- - 'vendor/**/*'
15
-
16
- # This configuration was generated by
17
- # `rubocop --auto-gen-config`
18
- # on 2019-02-14 09:34:30 -0500 using RuboCop version 0.64.0.
19
- # The point is for the user to remove these configuration records
20
- # one by one as the offenses are removed from the code base.
21
- # Note that changes in the inspected code, or installation of new
22
- # versions of RuboCop, may require this file to be generated again.
23
-
24
- # Offense count: 1
25
- Metrics/AbcSize:
26
- Max: 22
27
-
28
- # Offense count: 8
29
- # Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
30
- # URISchemes: http, https
31
- Metrics/LineLength:
32
- Max: 147
33
-
34
- # Offense count: 4
35
- # Configuration parameters: CountComments, ExcludedMethods.
36
- Metrics/MethodLength:
37
- Max: 22
38
-
39
- RSpec/FilePath:
40
- Enabled: false
41
-
42
- # Offense count: 1
43
- # Configuration parameters: MinBodyLength.
44
- Style/GuardClause:
45
- Exclude:
46
- - 'lib/pheme/queue_poller.rb'
@@ -1,20 +1,39 @@
1
1
  # This configuration was generated by
2
2
  # `rubocop --auto-gen-config`
3
- # on 2019-05-29 15:19:13 -0400 using RuboCop version 0.70.0.
3
+ # on 2019-07-09 13:48:32 -0400 using RuboCop version 0.72.0.
4
4
  # The point is for the user to remove these configuration records
5
5
  # one by one as the offenses are removed from the code base.
6
6
  # Note that changes in the inspected code, or installation of new
7
7
  # versions of RuboCop, may require this file to be generated again.
8
8
 
9
- # Offense count: 12
10
- # Configuration parameters: Prefixes.
11
- # Prefixes: when, with, without
12
- RSpec/ContextWording:
13
- Exclude:
14
- - 'spec/configuration_spec.rb'
15
- - 'spec/message_handler_spec.rb'
16
- - 'spec/queue_poller_spec.rb'
17
- - 'spec/topic_publisher_spec.rb'
9
+ # Offense count: 2
10
+ Metrics/AbcSize:
11
+ Max: 22
12
+
13
+ # Offense count: 1
14
+ # Configuration parameters: CountComments.
15
+ Metrics/ClassLength:
16
+ Max: 164
17
+
18
+ # Offense count: 1
19
+ Metrics/CyclomaticComplexity:
20
+ Max: 10
21
+
22
+ # Offense count: 17
23
+ # Cop supports --auto-correct.
24
+ # Configuration parameters: AutoCorrect, AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
25
+ # URISchemes: http, https
26
+ Metrics/LineLength:
27
+ Max: 147
28
+
29
+ # Offense count: 3
30
+ # Configuration parameters: CountComments, ExcludedMethods.
31
+ Metrics/MethodLength:
32
+ Max: 28
33
+
34
+ # Offense count: 1
35
+ Metrics/PerceivedComplexity:
36
+ Max: 11
18
37
 
19
38
  # Offense count: 5
20
39
  # Configuration parameters: CustomTransform, IgnoreMethods.
@@ -26,10 +45,10 @@ RSpec/FilePath:
26
45
  - 'spec/message_type/aws_event_spec.rb'
27
46
  - 'spec/message_type/sns_message_spec.rb'
28
47
  - 'spec/queue_poller_spec.rb'
29
- - 'spec/rollbar_spec.rb'
30
48
  - 'spec/topic_publisher_spec.rb'
49
+ - 'spec/rollbar_spec.rb'
31
50
  - 'spec/version_spec.rb'
32
-
51
+
33
52
  # Offense count: 14
34
53
  # Configuration parameters: EnforcedStyle.
35
54
  # SupportedStyles: have_received, receive
@@ -40,14 +59,14 @@ RSpec/MessageSpies:
40
59
  - 'spec/rollbar_spec.rb'
41
60
  - 'spec/topic_publisher_spec.rb'
42
61
 
43
- # Offense count: 39
44
- # Configuration parameters: IgnoreSharedExamples.
45
- RSpec/NamedSubject:
62
+ # Offense count: 2
63
+ # Configuration parameters: IgnoreNameless, IgnoreSymbolicNames.
64
+ RSpec/VerifiedDoubles:
46
65
  Exclude:
47
- - 'spec/configuration_spec.rb'
48
- - 'spec/logger_spec.rb'
49
- - 'spec/message_handler_spec.rb'
50
- - 'spec/message_type/sns_message_spec.rb'
51
66
  - 'spec/queue_poller_spec.rb'
52
- - 'spec/rollbar_spec.rb'
53
- - 'spec/topic_publisher_spec.rb'
67
+
68
+ # Offense count: 2
69
+ # Configuration parameters: MinBodyLength.
70
+ Style/GuardClause:
71
+ Exclude:
72
+ - 'lib/pheme/queue_poller.rb'
@@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file.
4
4
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5
5
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## 3.3.0 - 2019-07-09
8
+ ### Added
9
+ - Add more friendly options for initializing queue pollers by either:
10
+ - passing the message handler class; or
11
+ - providing a handler block
12
+
7
13
  ## 3.2.0 - 2019-05-29
8
14
  ### Added
9
15
  - Support for Pheme::TopicPublisher to publish to an explicit SNS client.
@@ -6,7 +6,15 @@ module Pheme
6
6
 
7
7
  attr_accessor :queue_url, :queue_poller, :connection_pool_block, :format, :max_messages, :poller_configuration
8
8
 
9
- def initialize(queue_url:, connection_pool_block: false, max_messages: nil, format: :json, poller_configuration: {}, sqs_client: nil)
9
+ def initialize(queue_url:,
10
+ connection_pool_block: false,
11
+ max_messages: nil,
12
+ format: :json,
13
+ poller_configuration: {},
14
+ sqs_client: nil,
15
+ idle_timeout: nil,
16
+ message_handler: nil,
17
+ &block_message_handler)
10
18
  raise ArgumentError, "must specify non-nil queue_url" if queue_url.blank?
11
19
 
12
20
  @queue_url = queue_url
@@ -22,6 +30,20 @@ module Pheme
22
30
  skip_delete: true, # manually delete messages
23
31
  }.merge(poller_configuration || {})
24
32
 
33
+ @poller_configuration[:idle_timeout] = idle_timeout unless idle_timeout.nil?
34
+
35
+ if message_handler
36
+ if message_handler.ancestors.include?(Pheme::MessageHandler)
37
+ @message_handler = message_handler
38
+ else
39
+ raise ArgumentError, 'Invalid message handler, must inherit from Pheme::MessageHandler'
40
+ end
41
+ end
42
+
43
+ @block_message_handler = block_message_handler
44
+
45
+ raise ArgumentError, 'only provide a message_handler or a block, not both' if @message_handler && @block_message_handler
46
+
25
47
  if max_messages
26
48
  queue_poller.before_request do |stats|
27
49
  throw :stop_polling if stats.received_message_count >= max_messages
@@ -103,8 +125,14 @@ module Pheme
103
125
  RecursiveOpenStruct.new({ wrapper: parsed_body }, recurse_over_arrays: true).wrapper
104
126
  end
105
127
 
106
- def handle(_message, _metadata)
107
- raise NotImplementedError
128
+ def handle(message, metadata)
129
+ if @message_handler
130
+ @message_handler.new(message: message, metadata: metadata).handle
131
+ elsif @block_message_handler
132
+ @block_message_handler.call(message, metadata)
133
+ else
134
+ raise NotImplementedError
135
+ end
108
136
  end
109
137
 
110
138
  private
@@ -1,3 +1,3 @@
1
1
  module Pheme
2
- VERSION = '3.2.0'.freeze
2
+ VERSION = '3.3.0'.freeze
3
3
  end
@@ -1,4 +1,5 @@
1
1
  describe Pheme::QueuePoller do
2
+ let(:valid_queue_poller) { ExampleQueuePoller.new(queue_url: queue_url) }
2
3
  let(:queue_url) { "https://sqs.us-east-1.amazonaws.com/whatever" }
3
4
  let(:timestamp) { '2018-04-17T21:45:05.915Z' }
4
5
 
@@ -10,10 +11,9 @@ describe Pheme::QueuePoller do
10
11
  end
11
12
  let(:message) { nil }
12
13
  let(:message_id) { SecureRandom.uuid }
13
- let(:poller) { ExampleQueuePoller.new(queue_url: queue_url, format: format) }
14
14
 
15
15
  context 'base poller' do
16
- subject { described_class.new(queue_url: 'https://sqs.aws.com').handle(nil, nil) }
16
+ subject { described_class.new(queue_url: queue_url).handle(nil, nil) }
17
17
 
18
18
  it 'does not implement handle' do
19
19
  expect { subject }.to raise_error(NotImplementedError)
@@ -23,7 +23,7 @@ describe Pheme::QueuePoller do
23
23
  describe ".new" do
24
24
  context "when initialized with valid params" do
25
25
  it "does not raise an error" do
26
- expect { ExampleQueuePoller.new(queue_url: "queue_url") }.not_to raise_error
26
+ expect { valid_queue_poller }.not_to raise_error
27
27
  end
28
28
  end
29
29
 
@@ -35,7 +35,7 @@ describe Pheme::QueuePoller do
35
35
 
36
36
  context "when initialized with max_messages" do
37
37
  it "sets max_messages" do
38
- expect(ExampleQueuePoller.new(queue_url: "queue_url", max_messages: 5).max_messages).to eq(5)
38
+ expect(ExampleQueuePoller.new(queue_url: queue_url, max_messages: 5).max_messages).to eq(5)
39
39
  end
40
40
  end
41
41
 
@@ -43,13 +43,13 @@ describe Pheme::QueuePoller do
43
43
  let(:sqs_client) { Object.new }
44
44
 
45
45
  it "sets custom sqs_client" do
46
- expect(Aws::SQS::QueuePoller).to receive(:new).with("queue_url", client: sqs_client)
47
- ExampleQueuePoller.new(queue_url: "queue_url", sqs_client: sqs_client)
46
+ expect(Aws::SQS::QueuePoller).to receive(:new).with(queue_url, client: sqs_client)
47
+ ExampleQueuePoller.new(queue_url: queue_url, sqs_client: sqs_client)
48
48
  end
49
49
  end
50
50
 
51
51
  context 'received too many messages' do
52
- subject { described_class.new(queue_url: 'http://sqs.aws.com', max_messages: max_messages) }
52
+ subject { described_class.new(queue_url: queue_url, max_messages: max_messages) }
53
53
 
54
54
  let(:aws_poller) { instance_double('Aws::SQS::QueuePoller') }
55
55
  let(:max_messages) { 50 }
@@ -63,11 +63,82 @@ describe Pheme::QueuePoller do
63
63
  expect { subject }.to raise_error(UncaughtThrowError, /stop_polling/)
64
64
  end
65
65
  end
66
+
67
+ context 'when given an idle_timeout' do
68
+ subject { ExampleQueuePoller.new(queue_url: queue_url, idle_timeout: idle_timeout).poller_configuration[:idle_timeout] }
69
+
70
+ context 'when given a number' do
71
+ let(:idle_timeout) { 5 }
72
+
73
+ it { is_expected.to eq(5) }
74
+ end
75
+
76
+ context 'when given nil' do
77
+ let(:idle_timeout) { nil }
78
+
79
+ it { is_expected.to eq(20) }
80
+ end
81
+
82
+ context 'when given false' do
83
+ let(:idle_timeout) { false }
84
+
85
+ it { is_expected.to be(false) }
86
+ end
87
+ end
88
+
89
+ context 'when handling messages' do
90
+ context 'when doing it the old way, via the handle function' do
91
+ it 'uses the handle function by default' do
92
+ expect { described_class.new(queue_url: queue_url).handle(nil, nil) }.to raise_error(NotImplementedError)
93
+ end
94
+ end
95
+
96
+ context 'when given a message_handler as parameter' do
97
+ it 'uses default when given nil' do
98
+ expect { described_class.new(queue_url: queue_url, message_handler: nil).handle(nil, nil) }.to raise_error(NotImplementedError)
99
+ end
100
+
101
+ it 'uses default when given invalid message_handler' do
102
+ expect { described_class.new(queue_url: queue_url, message_handler: Hash) }.to raise_error(ArgumentError)
103
+ end
104
+
105
+ it 'uses handler when given one' do
106
+ mock_handler = double('MessageHandler')
107
+ allow(mock_handler).to receive(:handle)
108
+ allow(ExampleMessageHandler).to receive(:new).with(message: 'message', metadata: 'metadata').and_return(mock_handler)
109
+
110
+ described_class.new(queue_url: queue_url, message_handler: ExampleMessageHandler).handle('message', 'metadata')
111
+ expect(mock_handler).to have_received(:handle).once
112
+ end
113
+ end
114
+
115
+ context 'when given a message_handler as block' do
116
+ it 'uses handler when given one' do
117
+ mock_handler = spy('MessageHandler')
118
+
119
+ poller = described_class.new(queue_url: queue_url) do |message, metadata|
120
+ mock_handler.process(message, metadata)
121
+ end
122
+ poller.handle('message', 'metadata')
123
+
124
+ expect(mock_handler).to have_received(:process).with('message', 'metadata').once
125
+ end
126
+
127
+ it 'fails on invalid handler' do
128
+ expect do
129
+ described_class.new(queue_url: queue_url, message_handler: ExampleMessageHandler) { raise Error('should never happen') }
130
+ end.to raise_error(ArgumentError, 'only provide a message_handler or a block, not both')
131
+ end
132
+ end
133
+ end
66
134
  end
67
135
 
68
136
  describe "#parse_body" do
69
137
  subject { poller.parse_body(queue_message) }
70
138
 
139
+ let(:format) { nil }
140
+ let(:poller) { described_class.new(queue_url: queue_url, format: format) }
141
+
71
142
  context "message is JSON string" do
72
143
  let(:format) { :json }
73
144
  let!(:message) { { test: 'test' }.to_json }
@@ -16,8 +16,6 @@ require 'pp'
16
16
 
17
17
  require './lib/pheme'
18
18
 
19
- Dir["./spec/support/**/*.rb"].each { |f| require f }
20
-
21
19
  RSpec.configure do |config|
22
20
  config.filter_run :focus
23
21
  config.run_all_when_everything_filtered = true
@@ -36,3 +34,5 @@ def use_default_configuration!
36
34
  config.logger = Logger.new(nil)
37
35
  end
38
36
  end
37
+
38
+ Dir["./spec/support/**/*.rb"].each { |f| require f }
@@ -0,0 +1,5 @@
1
+ Pheme::QueuePoller.new(queue_url: 'http://mock_url.test') do |message, metadata|
2
+ # handle the message
3
+ pp message
4
+ pp metadata
5
+ end
@@ -0,0 +1,3 @@
1
+ require_relative './example_message_handler'
2
+
3
+ Pheme::QueuePoller.new(queue_url: 'http://mock_url.test', message_handler: ExampleMessageHandler)
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: 3.2.0
4
+ version: 3.3.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: 2019-05-29 00:00:00.000000000 Z
11
+ date: 2019-07-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -264,6 +264,8 @@ files:
264
264
  - spec/support/example_message_handler.rb
265
265
  - spec/support/example_publisher.rb
266
266
  - spec/support/example_queue_poller.rb
267
+ - spec/support/example_queue_poller_with_inlined_handler.rb
268
+ - spec/support/example_queue_poller_with_message_handler.rb
267
269
  - spec/support/example_with_arn_publisher.rb
268
270
  - spec/topic_publisher_spec.rb
269
271
  - spec/version_spec.rb
@@ -286,8 +288,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
286
288
  - !ruby/object:Gem::Version
287
289
  version: '0'
288
290
  requirements: []
289
- rubyforge_project:
290
- rubygems_version: 2.7.6
291
+ rubygems_version: 3.0.3
291
292
  signing_key:
292
293
  specification_version: 4
293
294
  summary: Ruby SNS publisher + SQS poller & message handler
@@ -304,6 +305,8 @@ test_files:
304
305
  - spec/support/example_message_handler.rb
305
306
  - spec/support/example_publisher.rb
306
307
  - spec/support/example_queue_poller.rb
308
+ - spec/support/example_queue_poller_with_inlined_handler.rb
309
+ - spec/support/example_queue_poller_with_message_handler.rb
307
310
  - spec/support/example_with_arn_publisher.rb
308
311
  - spec/topic_publisher_spec.rb
309
312
  - spec/version_spec.rb