pwwka 0.11.0 → 0.12.0.RC1
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/Gemfile.lock +7 -7
- data/README.md +8 -6
- data/lib/pwwka/queue_resque_job_handler.rb +12 -2
- data/lib/pwwka/version.rb +1 -1
- data/spec/integration/send_and_receive_spec.rb +39 -6
- data/spec/spec_helper.rb +1 -2
- data/spec/unit/queue_resque_job_handler_spec.rb +31 -5
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 74547cd8f8b4313cb47333486277bc22aad36e76
|
4
|
+
data.tar.gz: e14256ef72ea644b30f1c7af7305a5047dfdd6f3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5d000df76add8d1449072d15e75c0f3ec05aab8a5a4e07b5251fa9d041e4ca8a784d57c94fa77c3eebef2283d5eb1e69f0bed9d5d9c5525ec5d728dd91a4908a
|
7
|
+
data.tar.gz: 164001e94240f3d154a605a808fafe196686a5006340cae84d9a8b03dd0c6deb29450b542dc5d0c937d1b1477006fb3475b50d0d62c5ade28650e34975234081
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
pwwka (0.
|
4
|
+
pwwka (0.12.0.RC1)
|
5
5
|
activemodel
|
6
6
|
activesupport
|
7
7
|
bunny
|
@@ -10,9 +10,9 @@ PATH
|
|
10
10
|
GEM
|
11
11
|
remote: https://www.rubygems.org/
|
12
12
|
specs:
|
13
|
-
activemodel (5.1.
|
14
|
-
activesupport (= 5.1.
|
15
|
-
activesupport (5.1.
|
13
|
+
activemodel (5.1.3)
|
14
|
+
activesupport (= 5.1.3)
|
15
|
+
activesupport (5.1.3)
|
16
16
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
17
17
|
i18n (~> 0.7)
|
18
18
|
minitest (~> 5.1)
|
@@ -25,9 +25,9 @@ GEM
|
|
25
25
|
docile (1.1.5)
|
26
26
|
et-orbi (1.0.4)
|
27
27
|
tzinfo
|
28
|
-
i18n (0.8.
|
28
|
+
i18n (0.8.6)
|
29
29
|
json (2.1.0)
|
30
|
-
minitest (5.10.
|
30
|
+
minitest (5.10.3)
|
31
31
|
mono_logger (1.1.0)
|
32
32
|
multi_json (1.12.1)
|
33
33
|
mustermann (1.0.0)
|
@@ -102,4 +102,4 @@ DEPENDENCIES
|
|
102
102
|
simplecov
|
103
103
|
|
104
104
|
BUNDLED WITH
|
105
|
-
1.
|
105
|
+
1.15.4
|
data/README.md
CHANGED
@@ -301,7 +301,7 @@ If you use [Resque][resque], and you wish to handle messages in a resque job, yo
|
|
301
301
|
2. Now, configure your handler. For a `Procfile` setup:
|
302
302
|
|
303
303
|
```
|
304
|
-
my_handler: rake message_handler:receive HANDLER_KLASS=Pwwka::QueueResqueJobHandler JOB_KLASS=MyResqueJob QUEUE_NAME=my_queue ROUTING_KEY="my.key.completed"
|
304
|
+
my_handler: rake message_handler:receive HANDLER_KLASS=Pwwka::QueueResqueJobHandler JOB_KLASS=MyResqueJob PWWKA_QUEUE_EXTENDED_INFO=true QUEUE_NAME=my_queue ROUTING_KEY="my.key.completed"
|
305
305
|
```
|
306
306
|
|
307
307
|
Note the use of the environment variable `JOB_KLASS`. This tells `QueueResqueJobHandler` which class to queue.
|
@@ -311,16 +311,18 @@ If you use [Resque][resque], and you wish to handle messages in a resque job, yo
|
|
311
311
|
class MyResqueJob
|
312
312
|
@queue = :my_resque_queue
|
313
313
|
|
314
|
-
def self.
|
315
|
-
|
314
|
+
def self.perform(payload, # the payload
|
315
|
+
routing_key, # routing key as a string
|
316
|
+
message_properties) # properties as a hash with _String_ keys
|
317
|
+
user = User.find(payload.fetch("user_id")) # or whatever
|
316
318
|
user.frobnosticate!
|
317
319
|
end
|
318
320
|
end
|
319
321
|
```
|
320
322
|
|
321
|
-
Note that you must provide `@queue` in your job. `QueueResqueJobHandler` doesn't support setting a custom queue
|
322
|
-
|
323
|
-
|
323
|
+
Note that you must provide `@queue` in your job. `QueueResqueJobHandler` doesn't support setting a custom queue at enqueue-time (PRs welcome :).
|
324
|
+
|
325
|
+
Note that if you were using this library before version 0.12.0, your job would only be given the payload. This is why `PWWKA_QUEUE_EXTENDED_INFO` must be set. Without it, your job only gets the payload to avoid breaking legacy consumers. You should always set this so you have access to the entire message.
|
324
326
|
3. Profit!
|
325
327
|
|
326
328
|
[resque]: https://github.com/resque/resque/tree/1-x-stable
|
@@ -4,16 +4,26 @@ require 'resque'
|
|
4
4
|
module Pwwka
|
5
5
|
# A handler that simply queues the payload into a Resque job. This is useful
|
6
6
|
# if the code that should respond to a message needs to be managed by Resque, e.g.
|
7
|
-
# for the purposes of retry or better failure management.
|
7
|
+
# for the purposes of retry or better failure management. You can ask for the routing key and properties
|
8
|
+
# by setting `PWWKA_QUEUE_EXTENDED_INFO` to `true` in your environment.
|
8
9
|
#
|
9
10
|
# You should be able to use this directly from your handler configuration, e.g. for a Heroku-style `Procfile`:
|
10
11
|
#
|
11
12
|
# my_handler: rake message_handler:receive HANDLER_KLASS=Pwwka::QueueResqueJobHandler JOB_KLASS=MyResqueJob QUEUE_NAME=my_queue ROUTING_KEY="my.key.completed"
|
13
|
+
# my_handler_that_wants_more_info: rake message_handler:receive HANDLER_KLASS=Pwwka::QueueResqueJobHandler JOB_KLASS=MyOthgerResqueJob PWWKA_QUEUE_EXTENDED_INFO=true QUEUE_NAME=my_queue ROUTING_KEY="my.key.#"
|
12
14
|
#
|
13
15
|
# Note that this will not check the routing key, so you should be sure to specify the most precise ROUTING_KEY you can for handling the message.
|
14
16
|
class QueueResqueJobHandler
|
15
17
|
def self.handle!(delivery_info,properties,payload)
|
16
|
-
|
18
|
+
args = [
|
19
|
+
ENV["JOB_KLASS"].constantize,
|
20
|
+
payload
|
21
|
+
]
|
22
|
+
if ENV["PWWKA_QUEUE_EXTENDED_INFO"] == 'true'
|
23
|
+
args << delivery_info.routing_key
|
24
|
+
args << properties.to_hash
|
25
|
+
end
|
26
|
+
Resque.enqueue(*args)
|
17
27
|
end
|
18
28
|
end
|
19
29
|
end
|
data/lib/pwwka/version.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
require 'spec_helper.rb'
|
2
2
|
require 'resqutils/spec/resque_helpers'
|
3
|
+
require 'resqutils/spec/resque_matchers'
|
4
|
+
require 'pwwka/queue_resque_job_handler'
|
3
5
|
|
4
6
|
require_relative "support/integration_test_setup"
|
5
7
|
require_relative "support/logging_receiver"
|
@@ -10,25 +12,30 @@ describe "sending and receiving messages", :integration do
|
|
10
12
|
include Resqutils::Spec::ResqueHelpers
|
11
13
|
|
12
14
|
before do
|
15
|
+
ENV["JOB_KLASS"] = MyTestJob.name
|
16
|
+
ENV["PWWKA_QUEUE_EXTENDED_INFO"] = "true"
|
13
17
|
@testing_setup = IntegrationTestSetup.new
|
14
18
|
[
|
15
|
-
|
16
|
-
[
|
17
|
-
[
|
19
|
+
|
20
|
+
[AllReceiver , "all_receiver_pwwkatesting" , "#"] ,
|
21
|
+
[FooReceiver , "foo_receiver_pwwkatesting" , "pwwka.testing.foo"] ,
|
22
|
+
[OtherFooReceiver , "other_foo_receiver_pwwkatesting" , "pwwka.testing.foo"] ,
|
23
|
+
[Pwwka::QueueResqueJobHandler , "queue_resque_job_handler_pwwkatesting" , "#" ] ,
|
24
|
+
|
18
25
|
].each do |(klass, queue_name, routing_key)|
|
19
26
|
@testing_setup.make_queue_and_setup_receiver(klass,queue_name,routing_key)
|
20
27
|
end
|
21
|
-
end
|
22
|
-
|
23
|
-
before :each do
|
24
28
|
AllReceiver.reset!
|
25
29
|
FooReceiver.reset!
|
26
30
|
OtherFooReceiver.reset!
|
27
31
|
clear_queue(:delayed)
|
32
|
+
clear_queue(MyTestJob)
|
28
33
|
end
|
29
34
|
|
30
35
|
after do
|
31
36
|
@testing_setup.kill_threads_and_clear_queues
|
37
|
+
ENV.delete("JOB_KLASS")
|
38
|
+
ENV.delete("PWWKA_QUEUE_EXTENDED_INFO")
|
32
39
|
end
|
33
40
|
|
34
41
|
context "routing" do
|
@@ -201,6 +208,32 @@ describe "sending and receiving messages", :integration do
|
|
201
208
|
expect(OtherFooReceiver.messages_received.size).to eq(1)
|
202
209
|
end
|
203
210
|
|
211
|
+
it "can receive a message on a handler that just queues background jobs" do
|
212
|
+
payload = { sample: "payload", has: { deeply: true, nested: 4 }}
|
213
|
+
Pwwka::Transmitter.send_message!(payload, "foo.bar")
|
214
|
+
|
215
|
+
allow_receivers_to_process_queues
|
216
|
+
|
217
|
+
job = Resque.pop(:test_queue)
|
218
|
+
aggregate_failures "job paylod" do
|
219
|
+
expect(job["class"]).to eq(MyTestJob.name)
|
220
|
+
expect(job["args"][0]).to eq({ "sample" => "payload", "has" => { "deeply" => true, "nested" => 4 }})
|
221
|
+
expect(job["args"][1]).to eq("foo.bar")
|
222
|
+
|
223
|
+
# Expect a few things from the metadata for sanity
|
224
|
+
expect(job["args"][2].keys).to include("content_type")
|
225
|
+
expect(job["args"][2].keys).to include("message_id")
|
226
|
+
expect(job["args"][2].keys).to include("timestamp")
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
class MyTestJob
|
231
|
+
@queue = "test_queue"
|
232
|
+
|
233
|
+
def self.perform(payload,routing_key,properties)
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
204
237
|
|
205
238
|
class AllReceiver < LoggingReceiver
|
206
239
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -8,8 +8,16 @@ describe Pwwka::QueueResqueJobHandler do
|
|
8
8
|
|
9
9
|
describe "::handle!" do
|
10
10
|
let(:job_class) { MyTestJob }
|
11
|
-
let(:
|
12
|
-
let(:
|
11
|
+
let(:routing_key) { "foo.bar.blah" }
|
12
|
+
let(:delivery_info) { double("delivery info", routing_key: routing_key) }
|
13
|
+
let(:properties_hash) {
|
14
|
+
{
|
15
|
+
"app_id" => "myapp",
|
16
|
+
"timestamp" => "2015-12-12 13:22:99",
|
17
|
+
"message_id" => "66",
|
18
|
+
}
|
19
|
+
}
|
20
|
+
let(:properties) { Bunny::MessageProperties.new(properties_hash) }
|
13
21
|
let(:payload) {
|
14
22
|
{
|
15
23
|
"this" => "is",
|
@@ -21,16 +29,34 @@ describe Pwwka::QueueResqueJobHandler do
|
|
21
29
|
before do
|
22
30
|
allow(Resque).to receive(:enqueue)
|
23
31
|
ENV["JOB_KLASS"] = MyTestJob.name
|
32
|
+
end
|
33
|
+
|
34
|
+
context "when not asking for more information explicitly" do
|
35
|
+
it "should queue a resque job using JOB_KLASS and the payload" do
|
36
|
+
described_class.handle!(delivery_info,properties,payload)
|
37
|
+
expect(Resque).to have_received(:enqueue).with(MyTestJob,payload)
|
38
|
+
end
|
39
|
+
end
|
24
40
|
|
25
|
-
|
41
|
+
context "when asking to NOT receive more information explicitly" do
|
42
|
+
it "should queue a resque job using JOB_KLASS and the payload" do
|
43
|
+
ENV["PWWKA_QUEUE_EXTENDED_INFO"] = 'false'
|
44
|
+
described_class.handle!(delivery_info,properties,payload)
|
45
|
+
expect(Resque).to have_received(:enqueue).with(MyTestJob,payload)
|
46
|
+
end
|
26
47
|
end
|
27
48
|
|
28
|
-
|
29
|
-
|
49
|
+
context "when asking for more information via PWWKA_QUEUE_EXTENDED_INFO" do
|
50
|
+
it "should queue a resque job using JOB_KLASS, payload, routing key, and properties as a hash" do
|
51
|
+
ENV["PWWKA_QUEUE_EXTENDED_INFO"] = 'true'
|
52
|
+
described_class.handle!(delivery_info,properties,payload)
|
53
|
+
expect(Resque).to have_received(:enqueue).with(MyTestJob,payload,routing_key,properties_hash)
|
54
|
+
end
|
30
55
|
end
|
31
56
|
|
32
57
|
after do
|
33
58
|
ENV.delete("JOB_KLASS")
|
59
|
+
ENV.delete("PWWKA_QUEUE_EXTENDED_INFO")
|
34
60
|
end
|
35
61
|
end
|
36
62
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pwwka
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.12.0.RC1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stitch Fix Engineering
|
@@ -15,7 +15,7 @@ authors:
|
|
15
15
|
autorequire:
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
|
-
date: 2017-
|
18
|
+
date: 2017-08-29 00:00:00.000000000 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: bunny
|
@@ -254,12 +254,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
254
254
|
version: '0'
|
255
255
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
256
256
|
requirements:
|
257
|
-
- - "
|
257
|
+
- - ">"
|
258
258
|
- !ruby/object:Gem::Version
|
259
|
-
version:
|
259
|
+
version: 1.3.1
|
260
260
|
requirements: []
|
261
261
|
rubyforge_project:
|
262
|
-
rubygems_version: 2.6.
|
262
|
+
rubygems_version: 2.6.13
|
263
263
|
signing_key:
|
264
264
|
specification_version: 4
|
265
265
|
summary: Send and receive messages via RabbitMQ
|