fastly_nsq 0.2.3 → 0.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 +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
|