fastly_nsq 0.2.3 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/PULL_REQUEST_TEMPLATE.md +1 -1
- data/README.md +15 -10
- data/examples/Rakefile +78 -31
- data/lib/fastly_nsq/message_queue/listener.rb +3 -3
- data/lib/fastly_nsq/rake_task.rb +53 -14
- data/lib/fastly_nsq/sample_message_processor.rb +9 -8
- data/lib/fastly_nsq/version.rb +1 -1
- data/spec/lib/fastly_nsq/message_queue/listener_spec.rb +2 -1
- data/spec/lib/fastly_nsq/message_queue_spec.rb +8 -12
- data/spec/lib/fastly_nsq/rake_task_spec.rb +90 -35
- data/spec/lib/fastly_nsq/sample_message_processor_spec.rb +18 -25
- data/spec/spec_helper.rb +5 -3
- 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: 9f152c638769443e0a5a05d21222eeb4830d4873
|
4
|
+
data.tar.gz: d7bf933bf02602023f81c09480064745baf547cb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 987c9d1a7c2e654c8fcd540c6cd78f8d819a9b1723cabc74aee1a7ac27937d045c3c0ce2b80676dc171cb7b84e73d656d0b5b087618aff1dc67b4028f72847d2
|
7
|
+
data.tar.gz: e2e808a1f5daea8da64331e47b5097a1b33efd43376adbe7da14f906d3ac51f88d987b4c81a073f965a35f42b1b672fd37d15a90890dc05b3f78e83681a061d4
|
@@ -19,7 +19,7 @@ Checklist
|
|
19
19
|
_Put an `x` in the boxes that apply.
|
20
20
|
You can also fill these out after creating the PR._
|
21
21
|
|
22
|
-
- [ ] I have linked to all
|
22
|
+
- [ ] I have linked to all relevant reference issues or work requests
|
23
23
|
- [ ] I have added tests that prove my fix is effective or that my feature works
|
24
24
|
- [ ] I have added or updated necessary documentation (if appropriate)
|
25
25
|
- [ ] Any dependent changes have been merged and published in downstream
|
data/README.md
CHANGED
@@ -52,7 +52,6 @@ write messages onto the queue:
|
|
52
52
|
|
53
53
|
```ruby
|
54
54
|
message_data = {
|
55
|
-
"event_type" => "heartbeat",
|
56
55
|
"data" => {
|
57
56
|
"key" => "value"
|
58
57
|
}
|
@@ -65,7 +64,6 @@ producer = MessageQueue::Producer.new(
|
|
65
64
|
|
66
65
|
producer.write(message_data.to_json)
|
67
66
|
```
|
68
|
-
|
69
67
|
The mock/real strategy used
|
70
68
|
can be switched
|
71
69
|
by adding an environment variable
|
@@ -94,7 +92,7 @@ consumer = MessageQueue::Consumer.new(
|
|
94
92
|
|
95
93
|
consumer.size #=> 1
|
96
94
|
message = consumer.pop
|
97
|
-
message.body #=> "{ '
|
95
|
+
message.body #=> "{ 'data': { 'key': 'value' } }"
|
98
96
|
message.finish
|
99
97
|
consumer.size #=> 0
|
100
98
|
consumer.terminate
|
@@ -119,7 +117,7 @@ MessageQueue::Listener.new(topic: topic, channel: channel).process_next_message
|
|
119
117
|
This will pop the next message
|
120
118
|
off of the queue
|
121
119
|
and send the JSON text body
|
122
|
-
to `MessageProcessor.new(message_body).go`.
|
120
|
+
to `MessageProcessor.new(message_body: message_body, topic: topic).go`.
|
123
121
|
|
124
122
|
To initiate a blocking loop to process messages continuously:
|
125
123
|
|
@@ -141,15 +139,23 @@ there is a new message on the queue,
|
|
141
139
|
To help facilitate running the `MessageQueue::Listener` in a blocking fashion
|
142
140
|
outside your application, a simple `RakeTask` is provided.
|
143
141
|
|
144
|
-
|
142
|
+
NOTE: The rake task expects a
|
143
|
+
`MessageProcessor.topics` method,
|
144
|
+
which must return an array of strings
|
145
|
+
defining the topics to which
|
146
|
+
we would like to listen and process messages.
|
147
|
+
|
148
|
+
The task will listen
|
149
|
+
to all specified topics,
|
150
|
+
each in a separate thread.
|
151
|
+
|
152
|
+
This task can be added into your `Rakefile` in one of two ways:
|
145
153
|
|
146
154
|
Using a block:
|
147
155
|
```ruby
|
148
|
-
require 'fastly_nsq'
|
149
156
|
require 'fastly_nsq/rake_task'
|
150
157
|
|
151
158
|
MessageQueue::RakeTask.new(:listen_task) do |task|
|
152
|
-
task.topic = 'some_topic'
|
153
159
|
task.channel = 'some_channel'
|
154
160
|
end
|
155
161
|
|
@@ -159,13 +165,12 @@ end
|
|
159
165
|
|
160
166
|
or using passed in values:
|
161
167
|
```ruby
|
162
|
-
require 'fastly_nsq'
|
163
168
|
require 'fastly_nsq/rake_task'
|
164
169
|
|
165
|
-
MessageQueue::RakeTask.new(:listen_task, [:
|
170
|
+
MessageQueue::RakeTask.new(:listen_task, [:channel])
|
166
171
|
|
167
172
|
# usage:
|
168
|
-
`rake listen_task['
|
173
|
+
`rake listen_task['my_channel']`
|
169
174
|
```
|
170
175
|
|
171
176
|
Both methods can be used at the same time with the passed in values taking
|
data/examples/Rakefile
CHANGED
@@ -1,41 +1,88 @@
|
|
1
|
-
require 'fastly_nsq'
|
2
1
|
require 'fastly_nsq/rake_task'
|
3
2
|
|
4
|
-
|
5
|
-
#
|
6
|
-
# it is called.
|
7
|
-
#
|
8
|
-
# ex: `rake listen_task[my_topic,my_channel]`
|
9
|
-
# topic will be 'my_topic' and channel will be 'my_channel'
|
10
|
-
#
|
11
|
-
MessageQueue::RakeTask.new(:listen_task, [:topic, :channel])
|
3
|
+
#-------------------------------------------------------------------------------
|
4
|
+
# You are required to to set the topics in MessageProcessor.topics as an array:
|
12
5
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
6
|
+
class MessageProcessor
|
7
|
+
def self.topics
|
8
|
+
['customer_created', 'customer_deleted']
|
9
|
+
end
|
17
10
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
#
|
22
|
-
#
|
23
|
-
#
|
24
|
-
# topic will be 'some_topic' and channel will be 'some_channel'
|
11
|
+
# ...
|
12
|
+
end
|
13
|
+
|
14
|
+
# A channel will need to be passed in
|
15
|
+
# to the Rake task
|
16
|
+
# when it is called.
|
25
17
|
#
|
18
|
+
# The task looks like:
|
19
|
+
|
20
|
+
desc 'Listen to the messaging queue with the given channel.'
|
21
|
+
|
22
|
+
MessageQueue::RakeTask.new(:listen_task, [:channel])
|
23
|
+
|
24
|
+
# Call `rake listen_task[my_channel]`.
|
25
|
+
# The topics will be ['customer_created', 'customer_deleted']
|
26
|
+
# and channel will be 'my_channel'.
|
27
|
+
|
28
|
+
#-------------------------------------------------------------------------------
|
29
|
+
# In Rails, you can include the application environment. The task looks like:
|
30
|
+
|
31
|
+
desc 'Listen to the messaging queue with the given channel.'
|
32
|
+
|
33
|
+
MessageQueue::RakeTask.new(:listen_task, [:channel] => :environment)
|
34
|
+
|
35
|
+
# Call `rake listen_task[your_channel]`.
|
36
|
+
# The topics will be ['customer_created', 'customer_deleted']
|
37
|
+
# and channel will be 'your_channel'.
|
38
|
+
|
39
|
+
#-------------------------------------------------------------------------------
|
40
|
+
# The channel can also be preset in the task
|
41
|
+
# by passing a block and assigning the value. The task looks like:
|
42
|
+
|
43
|
+
desc 'Listen to the messaging queue with the given channel.'
|
44
|
+
|
26
45
|
MessageQueue::RakeTask.new(:listen_task) do |task|
|
27
|
-
task.topic = 'some_topic'
|
28
46
|
task.channel = 'some_channel'
|
29
47
|
end
|
30
48
|
|
31
|
-
|
32
|
-
#
|
33
|
-
#
|
34
|
-
|
35
|
-
|
36
|
-
#
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
49
|
+
# Call `rake listen_task`.
|
50
|
+
# The topics will be ['customer_created', 'customer_deleted']
|
51
|
+
# and channel will be 'some_channel'.
|
52
|
+
|
53
|
+
#-------------------------------------------------------------------------------
|
54
|
+
# Do the same thing and include the environment:
|
55
|
+
|
56
|
+
desc 'Listen to the messaging queue with the given channel.'
|
57
|
+
|
58
|
+
MessageQueue::RakeTask.new(:listen_task, [] => :environment) do |task|
|
59
|
+
task.channel = 'her_channel'
|
41
60
|
end
|
61
|
+
|
62
|
+
# Call `rake listen_task`.
|
63
|
+
# The topics will be ['customer_created', 'customer_deleted']
|
64
|
+
# and channel will be 'her_channel'.
|
65
|
+
|
66
|
+
#-------------------------------------------------------------------------------
|
67
|
+
# Both forms can be combined
|
68
|
+
# to provide defaults
|
69
|
+
# with the ability to override at time of Rake call:
|
70
|
+
|
71
|
+
MessageQueue::RakeTask.new(:listen_task, [:channel]) do |task|
|
72
|
+
task.channel = 'default_channel'
|
73
|
+
end
|
74
|
+
|
75
|
+
# Call `rake listen_task[overridden_channel]`.
|
76
|
+
# The topics will be ['customer_created', 'customer_deleted']
|
77
|
+
# and channel will be 'overridden_channel'.
|
78
|
+
|
79
|
+
#-------------------------------------------------------------------------------
|
80
|
+
# The same, but including the environment:
|
81
|
+
|
82
|
+
MessageQueue::RakeTask.new(:listen_task, [:channel] => :environment) do |task|
|
83
|
+
task.channel = 'default_channel'
|
84
|
+
end
|
85
|
+
|
86
|
+
# Call `rake listen_task[overridden_channel]`.
|
87
|
+
# The topics will be ['customer_created', 'customer_deleted']
|
88
|
+
# and channel will be 'overridden_channel'.
|
@@ -26,14 +26,14 @@ module MessageQueue
|
|
26
26
|
|
27
27
|
private
|
28
28
|
|
29
|
+
attr_reader :channel, :topic
|
30
|
+
|
29
31
|
def process_one_message
|
30
32
|
message = consumer.pop
|
31
|
-
MessageProcessor.new(message.body).go
|
33
|
+
MessageProcessor.new(message_body: message.body, topic: topic).go
|
32
34
|
message.finish
|
33
35
|
end
|
34
36
|
|
35
|
-
attr_reader :channel, :topic
|
36
|
-
|
37
37
|
def consumer
|
38
38
|
@consumer ||= MessageQueue::Consumer.new(consumer_params).connection
|
39
39
|
end
|
data/lib/fastly_nsq/rake_task.rb
CHANGED
@@ -3,38 +3,77 @@ require 'rake/tasklib'
|
|
3
3
|
|
4
4
|
module MessageQueue
|
5
5
|
class RakeTask < Rake::TaskLib
|
6
|
-
attr_accessor :name, :
|
6
|
+
attr_accessor :name, :channel
|
7
7
|
|
8
8
|
def initialize(*args, &task_block)
|
9
9
|
@name = args.shift || :begin_listening
|
10
10
|
|
11
|
-
|
11
|
+
unless ::Rake.application.last_comment
|
12
|
+
desc 'Listen to NSQ on topic using channel'
|
13
|
+
end
|
12
14
|
|
13
15
|
task(name, *args) do |_, task_args|
|
14
16
|
RakeFileUtils.send(:verbose, verbose) do
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
17
|
+
if block_given?
|
18
|
+
yield(*[self, task_args].slice(0, task_block.arity))
|
19
|
+
end
|
20
|
+
|
21
|
+
if task_args[:channel]
|
22
|
+
@channel = task_args[:channel]
|
23
|
+
end
|
24
|
+
|
25
|
+
guard_missing_channel
|
26
|
+
run_tasks
|
19
27
|
end
|
20
28
|
end
|
21
29
|
end
|
22
30
|
|
23
31
|
private
|
24
32
|
|
25
|
-
def
|
26
|
-
|
33
|
+
def run_tasks
|
34
|
+
topics.each do |topic|
|
35
|
+
Thread.new do
|
36
|
+
wrap_helpful_output(topic) do
|
37
|
+
MessageQueue::Listener.new(topic: topic, channel: channel).go
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
non_main_threads.map(&:join)
|
43
|
+
end
|
27
44
|
|
28
|
-
|
45
|
+
def non_main_threads
|
46
|
+
(Thread.list - [Thread.main])
|
47
|
+
end
|
29
48
|
|
30
|
-
|
49
|
+
def guard_missing_channel
|
50
|
+
unless channel
|
51
|
+
raise ArgumentError, "channel is required. Received channel: #{channel}"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def wrap_helpful_output(topic)
|
56
|
+
output "Listening to queue, topic:'#{topic}' and channel: '#{channel}'"
|
57
|
+
yield
|
58
|
+
output "... done listening on topic:'#{topic}' and channel: '#{channel}'."
|
59
|
+
end
|
60
|
+
|
61
|
+
def topics
|
62
|
+
MessageProcessor.topics
|
63
|
+
rescue NoMethodError => exception
|
64
|
+
if exception.message =~ /undefined method `topics'/
|
65
|
+
raise ArgumentError, 'MessageProcessor.topics is not defined.'
|
66
|
+
else
|
67
|
+
raise exception
|
68
|
+
end
|
69
|
+
end
|
31
70
|
|
32
|
-
|
71
|
+
def output(string)
|
72
|
+
logger.info(string)
|
33
73
|
end
|
34
74
|
|
35
|
-
|
36
|
-
|
37
|
-
puts str
|
75
|
+
def logger
|
76
|
+
MessageQueue.logger = Logger.new(STDOUT)
|
38
77
|
end
|
39
78
|
end
|
40
79
|
end
|
@@ -11,12 +11,17 @@ class UnknownMessageWorker
|
|
11
11
|
end
|
12
12
|
|
13
13
|
class SampleMessageProcessor
|
14
|
-
|
14
|
+
TOPIC_TO_WORKER_MAP = {
|
15
15
|
'heartbeat' => HeartbeatWorker,
|
16
16
|
}.freeze
|
17
17
|
|
18
|
-
def
|
18
|
+
def self.topics
|
19
|
+
TOPIC_TO_WORKER_MAP.keys
|
20
|
+
end
|
21
|
+
|
22
|
+
def initialize(message_body:, topic:)
|
19
23
|
@message_body = message_body
|
24
|
+
@topic = topic
|
20
25
|
end
|
21
26
|
|
22
27
|
def go
|
@@ -25,18 +30,14 @@ class SampleMessageProcessor
|
|
25
30
|
|
26
31
|
private
|
27
32
|
|
28
|
-
attr_reader :message_body
|
33
|
+
attr_reader :message_body, :topic
|
29
34
|
|
30
35
|
def process_message_body
|
31
36
|
message_processor.perform_async(message_data)
|
32
37
|
end
|
33
38
|
|
34
39
|
def message_processor
|
35
|
-
|
36
|
-
end
|
37
|
-
|
38
|
-
def event_type
|
39
|
-
parsed_message_body['event_type']
|
40
|
+
TOPIC_TO_WORKER_MAP.fetch(topic, UnknownMessageWorker)
|
40
41
|
end
|
41
42
|
|
42
43
|
def message_data
|
data/lib/fastly_nsq/version.rb
CHANGED
@@ -32,7 +32,8 @@ RSpec.describe MessageQueue::Listener do
|
|
32
32
|
MessageQueue::Listener.new(topic: topic, channel: channel).
|
33
33
|
process_next_message
|
34
34
|
|
35
|
-
expect(MessageProcessor).to have_received(:new).
|
35
|
+
expect(MessageProcessor).to have_received(:new).
|
36
|
+
with(topic: topic, message_body: message_body)
|
36
37
|
expect(process_message).to have_received(:go)
|
37
38
|
end
|
38
39
|
|
@@ -2,25 +2,21 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
RSpec.describe MessageQueue do
|
4
4
|
describe '.logger' do
|
5
|
-
describe 'when using the fake queue' do
|
5
|
+
describe 'when using the fake queue', fake_queue: true do
|
6
6
|
it 'allows the logger to be set and retrieved' do
|
7
|
-
|
8
|
-
|
9
|
-
MessageQueue.logger = logger
|
7
|
+
logger = Logger.new(STDOUT)
|
8
|
+
MessageQueue.logger = logger
|
10
9
|
|
11
|
-
|
12
|
-
end
|
10
|
+
expect(MessageQueue.logger).to eq logger
|
13
11
|
end
|
14
12
|
end
|
15
13
|
|
16
|
-
describe 'when using the real queue' do
|
14
|
+
describe 'when using the real queue, fake_queue: false' do
|
17
15
|
it 'allows the logger to be set and retrieved' do
|
18
|
-
|
19
|
-
|
20
|
-
MessageQueue.logger = logger
|
16
|
+
logger = Logger.new(STDOUT)
|
17
|
+
MessageQueue.logger = logger
|
21
18
|
|
22
|
-
|
23
|
-
end
|
19
|
+
expect(MessageQueue.logger).to eq logger
|
24
20
|
end
|
25
21
|
end
|
26
22
|
end
|
@@ -3,71 +3,126 @@ require 'fastly_nsq/rake_task'
|
|
3
3
|
|
4
4
|
RSpec.describe MessageQueue::RakeTask do
|
5
5
|
before(:each) do
|
6
|
-
Rake::Task
|
6
|
+
Rake::Task.clear
|
7
|
+
allow_any_instance_of(MessageQueue::RakeTask).to receive(:output) { nil }
|
7
8
|
end
|
8
9
|
|
9
10
|
describe 'when defining tasks' do
|
10
|
-
|
11
|
-
|
11
|
+
context 'when no task name is provided' do
|
12
|
+
it 'creates a task with the default name' do
|
13
|
+
default_task_name = 'begin_listening'
|
12
14
|
|
13
|
-
|
15
|
+
MessageQueue::RakeTask.new
|
16
|
+
defined_tasks = Rake::Task.tasks
|
17
|
+
first_task_name = defined_tasks.first.name
|
14
18
|
|
15
|
-
|
16
|
-
|
19
|
+
expect(first_task_name).to eq default_task_name
|
20
|
+
end
|
17
21
|
end
|
18
22
|
|
19
|
-
|
20
|
-
|
23
|
+
context 'when a task name is passed in' do
|
24
|
+
it 'creates a task with the provided name' do
|
25
|
+
task_name = 'test_name'
|
21
26
|
|
22
|
-
|
27
|
+
MessageQueue::RakeTask.new(task_name.to_sym)
|
28
|
+
defined_tasks = Rake::Task.tasks
|
29
|
+
first_task_name = defined_tasks.first.name
|
23
30
|
|
24
|
-
|
25
|
-
|
31
|
+
expect(first_task_name).to eq task_name
|
32
|
+
end
|
26
33
|
end
|
27
34
|
end
|
28
35
|
|
29
36
|
describe 'when running tasks' do
|
30
|
-
|
31
|
-
|
32
|
-
|
37
|
+
context 'when multiple topics are defined' do
|
38
|
+
it 'creates a listener for each' do
|
39
|
+
channel = 'clown_generating_service'
|
40
|
+
topics = ['customer_created', 'customer_now_awesome']
|
41
|
+
allow(SampleMessageProcessor).to receive(:topics).and_return(topics)
|
42
|
+
message_queue_listener = double('listener', go: nil)
|
43
|
+
allow(MessageQueue::Listener).to receive(:new).
|
44
|
+
and_return(message_queue_listener)
|
45
|
+
|
46
|
+
MessageQueue::RakeTask.new(:begin_listening, [:channel])
|
47
|
+
Rake::Task['begin_listening'].execute(channel: channel)
|
48
|
+
|
49
|
+
topics.each do |topic|
|
50
|
+
expect(MessageQueue::Listener).to have_received(:new).
|
51
|
+
with(topic: topic, channel: channel)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'listens to the command-line-provided channel' do
|
57
|
+
channel = 'salesforce'
|
58
|
+
topics = ['customer_created']
|
59
|
+
allow(SampleMessageProcessor).to receive(:topics).and_return(topics)
|
33
60
|
|
34
|
-
message_queue_listener = double('
|
61
|
+
message_queue_listener = double('listener', go: nil)
|
35
62
|
expect(MessageQueue::Listener).to receive(:new).
|
36
|
-
with(
|
63
|
+
with(topic: topics.first, channel: channel).
|
37
64
|
and_return(message_queue_listener)
|
38
65
|
|
39
|
-
|
40
|
-
Rake::Task['begin_listening'].execute(
|
66
|
+
MessageQueue::RakeTask.new(:begin_listening, [:channel])
|
67
|
+
Rake::Task['begin_listening'].execute(channel: channel)
|
41
68
|
end
|
42
69
|
|
43
|
-
it 'runs with specified
|
70
|
+
it 'runs with specified channel if a block is given' do
|
71
|
+
channel = 'send_new_customers_a_sticker_service'
|
72
|
+
topics = ['customer_created']
|
73
|
+
allow(SampleMessageProcessor).to receive(:topics).and_return(topics)
|
74
|
+
|
75
|
+
message_queue_listener = double('listener', go: nil)
|
76
|
+
expect(MessageQueue::Listener).to receive(:new).
|
77
|
+
with(topic: topics.first, channel: channel).
|
78
|
+
and_return(message_queue_listener)
|
79
|
+
|
44
80
|
MessageQueue::RakeTask.new do |task|
|
45
|
-
task.
|
46
|
-
task.channel = 'star'
|
81
|
+
task.channel = channel
|
47
82
|
end
|
83
|
+
Rake::Task['begin_listening'].execute(channel: channel)
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'prefers inline channel definition over block assignments' do
|
87
|
+
default_channel = 'throw_a_huge_pizza_party_service'
|
88
|
+
new_channel = 'send_balloons_to_customer_service'
|
89
|
+
topics = ['customer_created']
|
90
|
+
allow(SampleMessageProcessor).to receive(:topics).and_return(topics)
|
48
91
|
|
49
|
-
message_queue_listener = double('
|
92
|
+
message_queue_listener = double('listener', go: nil)
|
50
93
|
expect(MessageQueue::Listener).to receive(:new).
|
51
|
-
with(topic:
|
94
|
+
with(topic: topics.first, channel: new_channel).
|
52
95
|
and_return(message_queue_listener)
|
53
96
|
|
54
|
-
|
55
|
-
|
97
|
+
MessageQueue::RakeTask.new(:begin_listening, [:channel]) do |task|
|
98
|
+
task.channel = default_channel
|
99
|
+
end
|
100
|
+
Rake::Task['begin_listening'].execute(channel: new_channel)
|
56
101
|
end
|
57
102
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
103
|
+
context 'when no channel is provided' do
|
104
|
+
it 'raises an error' do
|
105
|
+
topics = ['customer_created']
|
106
|
+
allow(SampleMessageProcessor).to receive(:topics).and_return(topics)
|
107
|
+
|
108
|
+
expect {
|
109
|
+
MessageQueue::RakeTask.new(:begin_listening, [:channel])
|
110
|
+
Rake::Task['begin_listening'].execute
|
111
|
+
}.to raise_error(ArgumentError, /channel is required/)
|
62
112
|
end
|
113
|
+
end
|
63
114
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
115
|
+
context 'when MessageProcessor.topics is not defined' do
|
116
|
+
it 'raises an error' do
|
117
|
+
channel = 'best_server_number_1'
|
118
|
+
allow(SampleMessageProcessor).to receive(:topics).
|
119
|
+
and_raise(NoMethodError, "undefined method `topics'")
|
68
120
|
|
69
|
-
|
70
|
-
|
121
|
+
expect {
|
122
|
+
MessageQueue::RakeTask.new(:begin_listening, [:channel])
|
123
|
+
Rake::Task['begin_listening'].execute(channel: channel)
|
124
|
+
}.to raise_error(ArgumentError, /MessageProcessor.topics is not defined/)
|
125
|
+
end
|
71
126
|
end
|
72
127
|
end
|
73
128
|
end
|
@@ -1,42 +1,35 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
RSpec.describe SampleMessageProcessor do
|
4
|
-
describe '
|
5
|
-
it '
|
6
|
-
|
7
|
-
message_body = { 'event_type' => 'heartbeat', 'data' => data }.to_json
|
8
|
-
allow(HeartbeatWorker).to receive(:perform_async)
|
4
|
+
describe '.topics' do
|
5
|
+
it 'specifies the array of topics to listen to' do
|
6
|
+
topics = SampleMessageProcessor.topics
|
9
7
|
|
10
|
-
|
11
|
-
|
12
|
-
expect(HeartbeatWorker).to have_received(:perform_async).with(data)
|
8
|
+
expect(topics).to be_an Array
|
9
|
+
expect(topics.first).to be_a String
|
13
10
|
end
|
11
|
+
end
|
14
12
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
}.to_json
|
22
|
-
allow(UnknownMessageWorker).to receive(:perform_async)
|
13
|
+
describe '#go' do
|
14
|
+
it 'enqueues the appropriate message processor' do
|
15
|
+
data = { 'key' => 'value' }
|
16
|
+
message_body = { 'data' => data }.to_json
|
17
|
+
allow(HeartbeatWorker).to receive(:perform_async)
|
18
|
+
topic = 'heartbeat'
|
23
19
|
|
24
|
-
|
20
|
+
SampleMessageProcessor.new(message_body: message_body, topic: topic).go
|
25
21
|
|
26
|
-
|
27
|
-
end
|
22
|
+
expect(HeartbeatWorker).to have_received(:perform_async).with(data)
|
28
23
|
end
|
29
24
|
|
30
|
-
describe 'when the message
|
25
|
+
describe 'when the message topic is not known' do
|
31
26
|
it 'uses the null object processor' do
|
32
27
|
data = { 'sample_key' => 'sample value' }
|
33
|
-
message_body = {
|
34
|
-
'not_the_event_type_key' => 'unregistered_message_type',
|
35
|
-
'data' => data,
|
36
|
-
}.to_json
|
28
|
+
message_body = { 'data' => data }.to_json
|
37
29
|
allow(UnknownMessageWorker).to receive(:perform_async)
|
30
|
+
topic = 'unknown_topic'
|
38
31
|
|
39
|
-
SampleMessageProcessor.new(message_body).go
|
32
|
+
SampleMessageProcessor.new(message_body: message_body, topic: topic).go
|
40
33
|
|
41
34
|
expect(UnknownMessageWorker).to have_received(:perform_async).with(data)
|
42
35
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -5,8 +5,6 @@ require 'pry-byebug'
|
|
5
5
|
require_relative '../lib/fastly_nsq/sample_message_processor'
|
6
6
|
require_relative 'support/env_helpers'
|
7
7
|
|
8
|
-
MessageProcessor = SampleMessageProcessor
|
9
|
-
|
10
8
|
RSpec.configure do |config|
|
11
9
|
config.expect_with :rspec do |expectations|
|
12
10
|
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
@@ -21,7 +19,7 @@ RSpec.configure do |config|
|
|
21
19
|
config.example_status_persistence_file_path = 'spec/examples.txt'
|
22
20
|
config.filter_run :focus
|
23
21
|
config.order = :random
|
24
|
-
config.profile_examples =
|
22
|
+
config.profile_examples = 1
|
25
23
|
config.run_all_when_everything_filtered = true
|
26
24
|
Kernel.srand config.seed
|
27
25
|
|
@@ -29,6 +27,10 @@ RSpec.configure do |config|
|
|
29
27
|
config.default_formatter = 'doc'
|
30
28
|
end
|
31
29
|
|
30
|
+
config.before(:suite) do
|
31
|
+
MessageProcessor = SampleMessageProcessor
|
32
|
+
end
|
33
|
+
|
32
34
|
config.before(:each) do
|
33
35
|
load_sample_environment_variables
|
34
36
|
FakeMessageQueue.reset!
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastly_nsq
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tommy O'Neil
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-03-
|
12
|
+
date: 2016-03-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: awesome_print
|