proletariat 0.0.3 → 0.0.4
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/CHANGELOG.md +9 -0
- data/README.md +26 -27
- data/lib/proletariat/configuration.rb +2 -2
- data/lib/proletariat/subscriber.rb +1 -1
- data/lib/proletariat/testing/expectation_guarantor.rb +11 -5
- data/lib/proletariat/testing.rb +4 -3
- data/lib/proletariat/version.rb +1 -1
- data/lib/proletariat/worker.rb +2 -1
- data/lib/proletariat.rb +1 -1
- data/spec/lib/proletariat_spec.rb +2 -2
- data/spec/lib/testing/expectation_guarantor_spec.rb +3 -3
- data/spec/lib/worker_spec.rb +2 -2
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: f18e4d2458922ab3466f6913a079616c7ab3e5ab
|
|
4
|
+
data.tar.gz: 0ed0637283e0056fca8e260bbb4fe97dc26eca1e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f6e31240a83223f4d67f2f0e08ae194927f07b6671fa193b32e7ed6527d37e66de29ff7830047cbbeb23a300b19eb43b1ad5765546ac51f406bdabd0d83cecee
|
|
7
|
+
data.tar.gz: 431900e4e0b1f59427666ceeca3197297c3723441c0f472242ee40dda0e3afe148bbc63cde95d10818a65358130a3ea83e46006042696385d6f4d7bd6a07dd3a
|
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
## 0.0.4
|
|
2
|
+
|
|
3
|
+
Features:
|
|
4
|
+
|
|
5
|
+
- The routing key is now sent to #work along with the message
|
|
6
|
+
- Workers now log when they publish a message
|
|
7
|
+
- Test guarantors can be used without blocks
|
|
8
|
+
- Amount of worker/publisher threads can be set via env variables
|
|
9
|
+
|
|
1
10
|
## 0.0.3
|
|
2
11
|
|
|
3
12
|
Features:
|
data/README.md
CHANGED
|
@@ -26,7 +26,7 @@ And run:
|
|
|
26
26
|
|
|
27
27
|
If you aren't using default RabbitMQ connection settings, ensure the `RABBITMQ_URL` env variable is present. Here's how that might look in your `.env` if you use Foreman:
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
RABBITMQ_URL=amqp://someuser:somepass@127.0.0.1/another_vhost
|
|
30
30
|
|
|
31
31
|
### Setting up a Worker
|
|
32
32
|
|
|
@@ -38,60 +38,59 @@ The `#work` method should return `:ok` on success or `:drop` / `:requeue` on fai
|
|
|
38
38
|
|
|
39
39
|
Here's a complete example:
|
|
40
40
|
|
|
41
|
-
|
|
42
|
-
|
|
41
|
+
class SendUserIntroductoryEmail < Proletariat::Worker
|
|
42
|
+
listen_on 'user.created'
|
|
43
43
|
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
def work(message, key)
|
|
45
|
+
params = JSON.parse(message)
|
|
46
46
|
|
|
47
|
-
|
|
47
|
+
UserMailer.introductory_email(params).deliver!
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
publish 'email_sent.user.introductory', {id: params['id']}.to_json
|
|
50
50
|
|
|
51
|
-
|
|
51
|
+
:ok
|
|
52
|
+
end
|
|
52
53
|
end
|
|
53
|
-
end
|
|
54
54
|
|
|
55
|
-
###
|
|
55
|
+
### Running your Workers
|
|
56
56
|
|
|
57
|
-
|
|
57
|
+
Define the `WORKERS` env variable.
|
|
58
58
|
|
|
59
|
-
|
|
60
|
-
Proletariat.run!
|
|
59
|
+
WORKERS=SendUserIntroductoryEmail,SomeOtherWorker
|
|
61
60
|
|
|
62
|
-
|
|
61
|
+
Run the rake command.
|
|
63
62
|
|
|
64
|
-
|
|
63
|
+
bundle exec rake proletariat:run
|
|
65
64
|
|
|
66
65
|
### Deploying on Heroku
|
|
67
66
|
|
|
68
67
|
It's not recommended to run your background workers in the same process as your main web process. Heroku will shutdown idle `web` processes, killing your background workers in the process. Instead create a new process type for Proletariat by adding the following to your Procfile:
|
|
69
68
|
|
|
70
|
-
|
|
69
|
+
workers: bundle exec rake proletariat:run
|
|
71
70
|
|
|
72
71
|
And run:
|
|
73
72
|
|
|
74
|
-
|
|
73
|
+
heroku ps:scale workers=1
|
|
75
74
|
|
|
76
75
|
### Testing with Cucumber
|
|
77
76
|
|
|
78
77
|
Add the following to your `env.rb`:
|
|
79
78
|
|
|
80
|
-
|
|
79
|
+
require 'proletariat/cucumber'
|
|
81
80
|
|
|
82
81
|
Use the provided helpers in your step definitions to synchronize your test suite with your workers without sacrificing the ability to test in production-like environment:
|
|
83
82
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
83
|
+
When(/^I submit a valid 'register user' form$/) do
|
|
84
|
+
wait_for message.on_topic('email_sent.user.introductory') do
|
|
85
|
+
visit ...
|
|
86
|
+
fill_in ...
|
|
87
|
+
submit ...
|
|
88
|
+
end
|
|
89
89
|
end
|
|
90
|
-
end
|
|
91
90
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
91
|
+
Then(/^the user should receive an introductory email$/) do
|
|
92
|
+
expect(unread_emails_for(new_user_email).size).to eq 1
|
|
93
|
+
end
|
|
95
94
|
|
|
96
95
|
## FAQ
|
|
97
96
|
|
|
@@ -5,10 +5,10 @@ module Proletariat
|
|
|
5
5
|
DEFAULT_EXCHANGE_NAME = 'proletariat'
|
|
6
6
|
|
|
7
7
|
# Public: The default number of threads to use for publishers.
|
|
8
|
-
DEFAULT_PUBLISHER_THREADS = 2
|
|
8
|
+
DEFAULT_PUBLISHER_THREADS = (ENV['PUBLISHER_THREADS'] || 2).to_i
|
|
9
9
|
|
|
10
10
|
# Public: The default number of threads to use for each worker class.
|
|
11
|
-
DEFAULT_WORKER_THREADS = 3
|
|
11
|
+
DEFAULT_WORKER_THREADS = (ENV['WORKER_THREADS'] || 3).to_i
|
|
12
12
|
|
|
13
13
|
# Internal: Sets the RabbitMQ connection.
|
|
14
14
|
attr_writer :connection
|
|
@@ -117,7 +117,7 @@ module Proletariat
|
|
|
117
117
|
# Returns nil.
|
|
118
118
|
def start_consumer
|
|
119
119
|
@consumer = bunny_queue.subscribe ack: true do |info, properties, body|
|
|
120
|
-
future = listener.post?(body)
|
|
120
|
+
future = listener.post?(body, info.routing_key)
|
|
121
121
|
acknowledgers << Acknowledger.new(future, info.delivery_tag)
|
|
122
122
|
|
|
123
123
|
nil
|
|
@@ -30,6 +30,9 @@ module Proletariat
|
|
|
30
30
|
end
|
|
31
31
|
|
|
32
32
|
@block = block
|
|
33
|
+
@noop = true if expectations.length == 0
|
|
34
|
+
|
|
35
|
+
run_subscribers
|
|
33
36
|
end
|
|
34
37
|
|
|
35
38
|
# Public: Execute the blocks and waits for the expectations to be met.
|
|
@@ -37,10 +40,10 @@ module Proletariat
|
|
|
37
40
|
# Returns nil if expectations are met within timeout.
|
|
38
41
|
# Raises MessageTimeoutError if expectations are not met within timeout.
|
|
39
42
|
def guarantee
|
|
40
|
-
run_subscribers
|
|
41
|
-
|
|
42
43
|
block.call if block
|
|
43
44
|
|
|
45
|
+
return nil if noop
|
|
46
|
+
|
|
44
47
|
timer = 0.0
|
|
45
48
|
|
|
46
49
|
until passed?
|
|
@@ -49,9 +52,9 @@ module Proletariat
|
|
|
49
52
|
timer += MESSAGE_CHECK_INTERVAL
|
|
50
53
|
end
|
|
51
54
|
|
|
52
|
-
stop_subscribers
|
|
53
|
-
|
|
54
55
|
nil
|
|
56
|
+
ensure
|
|
57
|
+
stop_subscribers
|
|
55
58
|
end
|
|
56
59
|
|
|
57
60
|
private
|
|
@@ -63,6 +66,9 @@ module Proletariat
|
|
|
63
66
|
# Internal: Returns an array of MessageCounter instances.
|
|
64
67
|
attr_reader :counters
|
|
65
68
|
|
|
69
|
+
# Internal: Returns true if there aren't any expectations.
|
|
70
|
+
attr_reader :noop
|
|
71
|
+
|
|
66
72
|
# Internal: Returns an array of Subscriber instances.
|
|
67
73
|
attr_reader :subscribers
|
|
68
74
|
|
|
@@ -122,7 +128,7 @@ module Proletariat
|
|
|
122
128
|
# message - The contents of the message.
|
|
123
129
|
#
|
|
124
130
|
# Returns a future-like object holding an :ok Symbol.
|
|
125
|
-
def post?(message)
|
|
131
|
+
def post?(message, routing_key)
|
|
126
132
|
self.count = count + 1
|
|
127
133
|
|
|
128
134
|
Concurrent::Future.new { :ok }
|
data/lib/proletariat/testing.rb
CHANGED
|
@@ -31,11 +31,12 @@ module Proletariat
|
|
|
31
31
|
# # ... [Time passes]
|
|
32
32
|
# # => MessageTimeoutError
|
|
33
33
|
#
|
|
34
|
-
# Returns
|
|
34
|
+
# Returns ExpectationGuarantor.
|
|
35
35
|
def wait_for(*expectations, &block)
|
|
36
|
-
ExpectationGuarantor.new(expectations, &block)
|
|
36
|
+
guarantor = ExpectationGuarantor.new(expectations, &block)
|
|
37
|
+
guarantor.guarantee if block.present?
|
|
37
38
|
|
|
38
|
-
|
|
39
|
+
guarantor
|
|
39
40
|
end
|
|
40
41
|
end
|
|
41
42
|
end
|
data/lib/proletariat/version.rb
CHANGED
data/lib/proletariat/worker.rb
CHANGED
|
@@ -38,7 +38,7 @@ module Proletariat
|
|
|
38
38
|
# message - The incoming message.
|
|
39
39
|
#
|
|
40
40
|
# Raises NotImplementedError unless implemented in subclass.
|
|
41
|
-
def work(message)
|
|
41
|
+
def work(message, routing_key)
|
|
42
42
|
fail NotImplementedError
|
|
43
43
|
end
|
|
44
44
|
|
|
@@ -74,6 +74,7 @@ module Proletariat
|
|
|
74
74
|
#
|
|
75
75
|
# Returns nil.
|
|
76
76
|
def publish(to, message = '')
|
|
77
|
+
log "Publishing to: #{to}"
|
|
77
78
|
Proletariat.publish to, message
|
|
78
79
|
|
|
79
80
|
nil
|
data/lib/proletariat.rb
CHANGED
|
@@ -8,7 +8,7 @@ class PingWorker < Proletariat::Worker
|
|
|
8
8
|
attr_accessor :pinged
|
|
9
9
|
end
|
|
10
10
|
|
|
11
|
-
def work(message)
|
|
11
|
+
def work(message, routing_key)
|
|
12
12
|
self.class.pinged = true
|
|
13
13
|
|
|
14
14
|
log 'PING'
|
|
@@ -27,7 +27,7 @@ class PongWorker < Proletariat::Worker
|
|
|
27
27
|
attr_accessor :ponged
|
|
28
28
|
end
|
|
29
29
|
|
|
30
|
-
def work(message)
|
|
30
|
+
def work(message, routing_key)
|
|
31
31
|
self.class.ponged = true
|
|
32
32
|
|
|
33
33
|
log 'PONG'
|
|
@@ -34,19 +34,19 @@ module Proletariat
|
|
|
34
34
|
|
|
35
35
|
it 'should increment the count' do
|
|
36
36
|
counter = ExpectationGuarantor::MessageCounter.new(1)
|
|
37
|
-
counter.post?('message')
|
|
37
|
+
counter.post?('message', 'key')
|
|
38
38
|
expect(counter.expected_messages_received?).to be_truthy
|
|
39
39
|
end
|
|
40
40
|
|
|
41
41
|
it 'should return a future containing :ok' do
|
|
42
42
|
counter = ExpectationGuarantor::MessageCounter.new(1)
|
|
43
43
|
expect(Concurrent::Future).to receive(:new)
|
|
44
|
-
counter.post?('message')
|
|
44
|
+
counter.post?('message', 'key')
|
|
45
45
|
end
|
|
46
46
|
|
|
47
47
|
it 'should ensure the returned future contains :ok' do
|
|
48
48
|
counter = ExpectationGuarantor::MessageCounter.new(1)
|
|
49
|
-
future = counter.post?('message')
|
|
49
|
+
future = counter.post?('message', 'key')
|
|
50
50
|
expect(future.block.call).to eq :ok
|
|
51
51
|
end
|
|
52
52
|
end
|
data/spec/lib/worker_spec.rb
CHANGED
|
@@ -2,7 +2,7 @@ require 'proletariat/worker'
|
|
|
2
2
|
|
|
3
3
|
module Proletariat
|
|
4
4
|
describe Worker do
|
|
5
|
-
let(:logger) { double }
|
|
5
|
+
let(:logger) { double.as_null_object }
|
|
6
6
|
|
|
7
7
|
before do
|
|
8
8
|
allow(Proletariat).to receive(:logger).and_return(logger)
|
|
@@ -31,7 +31,7 @@ module Proletariat
|
|
|
31
31
|
|
|
32
32
|
describe '#work' do
|
|
33
33
|
it 'should raise NotImplementedError' do
|
|
34
|
-
expect { Worker.new.work('message') }.to \
|
|
34
|
+
expect { Worker.new.work('message', 'key') }.to \
|
|
35
35
|
raise_exception NotImplementedError
|
|
36
36
|
end
|
|
37
37
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: proletariat
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.4
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Sebastian Edwards
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2014-
|
|
11
|
+
date: 2014-02-17 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rspec
|