shoryuken 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7391a170e4f76601238417e61b88861951bc6c73
4
- data.tar.gz: 8983d19ef10bea4723533a12b23b74ca55562baf
3
+ metadata.gz: 3afa1e42164a3fc885caf45222d317ac77692c3b
4
+ data.tar.gz: 9abfa8e2c9ed9b4540bbb422fba35a3f00591364
5
5
  SHA512:
6
- metadata.gz: 87a30b0002f3eaf8a62fd9f76e938fb57a5fcecc829c6a3cf8fdb7c4d1ab3388001fc460b92d59d3ae2762b441f447141bc92c136dbf6fb8730820c101df2dc0
7
- data.tar.gz: 79f4d02f0dac764f23d07f8d27711c70b0cb97543cd410c2436300ff3e633a625de290caedf3746366b77d6c9b737c0c0138d000e2d610dab715267a40e74bb3
6
+ metadata.gz: 35934726404b3d5454b1bc97875d3ba8934d2ef4efa4a354dbff97af95959c647757259ffc6fefc53a8ffaab5c1cfeffad73d79aff50a3575f5e65d39cbbb553
7
+ data.tar.gz: 6cafc6fbfd06fff62541acc41169877440454eba4afb1688728bbd69330ed53fa9a62d1c28b2b9a057de853952cff26d537d013747a8cc5b6c47a8b637f3c1f2
data/README.md CHANGED
@@ -10,7 +10,7 @@ Shoryuken _sho-ryu-ken_ is a super efficient [AWS SQS](https://aws.amazon.com/sq
10
10
 
11
11
  ### Load balancing
12
12
 
13
- Yeah, Shoryuken load balances the messages consumption, for example:
13
+ Yeah, Shoryuken load balances the messages consumption!
14
14
 
15
15
  Given this configuration:
16
16
 
@@ -18,19 +18,21 @@ Given this configuration:
18
18
  concurrency: 25,
19
19
  delay: 25,
20
20
  queues:
21
- - [shoryuken, 6]
22
- - [uppercut, 2]
23
- - [sidekiq, 1]
21
+ - [high_priority, 6]
22
+ - [default, 2]
23
+ - [low_priority, 1]
24
24
  ```
25
25
 
26
- And supposing all the queues are full of messages, the configuration above will make Shoryuken to process "shoryuken" 3 times more than "uppercut" and 6 times more than "sidekiq",
27
- splitting the work among the 25 available processors.
26
+ And supposing all the queues are full of messages, the configuration above will make Shoryuken to process `high_priority` 3 times more than `default` and 6 times more than `low_priority`,
27
+ splitting the work among the `concurrency: 25` available processors.
28
28
 
29
- If the "shoryuken" queue gets empty, Shoryuken will keep using the 25 processors, but only to process "uppercut" (2 times more than "sidekiq") and "sidekiq".
29
+ If `high_priority` gets empty, Shoryuken will keep using the 25 processors, but only to process `default` (2 times more than `low_priority`) and `low_priority`.
30
30
 
31
- If the "shoryuken" queue gets a new message, Shoryuken will smoothly increase back the "shoryuken" weight one by one until it reaches the weight of 5 again.
31
+ If `high_priority` receives a new message, Shoryuken will smoothly increase back the `high_priority` weight one by one until it reaches the weight of 6 again, which is the maximum configured for `high_priority`.
32
32
 
33
- If all queues get empty, all processors will be changed to the waiting state and the queues will be checked every `delay: 25`. If any queue gets a new message, Shoryuken will bring back the processors one by one to the ready state.
33
+ If all queues get empty, all processors will be changed to the waiting state and the queues will be checked every `delay: 25`. If any queue receives a new message, Shoryuken will start processing again.
34
+
35
+ *You can set `delay: 0` to continuously check the queues without pausing even if they are empty.*
34
36
 
35
37
  ### Fetch in batches
36
38
 
@@ -42,6 +44,10 @@ Add this line to your application's Gemfile:
42
44
 
43
45
  gem 'shoryuken'
44
46
 
47
+ **Require Shoryuken from GitHub to get the latest updates:**
48
+
49
+ gem 'shoryuken', github: 'phstc/shoryuken', branch: 'master'
50
+
45
51
  And then execute:
46
52
 
47
53
  $ bundle
@@ -55,24 +61,51 @@ Or install it yourself as:
55
61
  ### Worker class
56
62
 
57
63
  ```ruby
58
- class HelloWorker
64
+ class MyWorker
59
65
  include Shoryuken::Worker
60
66
 
61
- shoryuken_options queue: 'hello', delete: true
62
- # shoryuken_options queue: ->{ "#{ENV['environment']_hello" }, delete: true
67
+ shoryuken_options queue: 'default', delete: true
68
+ # shoryuken_options queue: ->{ "#{ENV['environment']_default" }
69
+
70
+ # shoryuken_options body_parser: :json
71
+ # shoryuken_options body_parser: ->(sqs_msg){ REXML::Document.new(sqs_msg.body) }
72
+ # shoryuken_options body_parser: JSON
63
73
 
64
- def perform(sqs_msg)
65
- puts "Hello #{sqs_msg.body}"
74
+ def perform(sqs_msg, body)
75
+ puts body
66
76
  end
67
77
  end
68
78
  ```
69
79
 
80
+ [Check the Worker options documention](https://github.com/phstc/shoryuken/wiki/Worker-options).
81
+
70
82
  ### Sending a message
71
83
 
72
84
  ```ruby
73
- Shoryuken::Client.queues('hello').send_message('Pablo')
85
+ MyWorker.perform_async('Pablo')
86
+ # or
87
+ Shoryuken::Client.queues('default').send_message('Pablo')
88
+
89
+ # delaying a message
90
+ MyWorker.perform_async('Pablo', delay_seconds: 60)
91
+ # or
92
+ Shoryuken::Client.queues('default').send_message('Pablo', delay_seconds: 60)
93
+ ```
94
+
95
+ ### Midleware
96
+
97
+ ```ruby
98
+ class MyMiddleware
99
+ def call(worker_instance, queue, sqs_msg, body)
100
+ puts 'Before work'
101
+ yield
102
+ puts 'After work'
103
+ end
104
+ end
74
105
  ```
75
106
 
107
+ [Check the Middleware documentation](https://github.com/phstc/shoryuken/wiki/Middleware).
108
+
76
109
  ### Configuration
77
110
 
78
111
  Sample configuration file `shoryuken.yml`.
@@ -90,9 +123,9 @@ aws:
90
123
  concurrency: 25, # The number of allocated threads to process messages. Default 25
91
124
  delay: 25, # The delay in seconds to pause a queue when it's empty. Default 0
92
125
  queues:
93
- - [shoryuken, 6]
94
- - [uppercut, 2]
95
- - [sidekiq, 1]
126
+ - [high_priority, 6]
127
+ - [default, 2]
128
+ - [low_priority, 1]
96
129
  ```
97
130
 
98
131
  ### Start Shoryuken
@@ -120,24 +153,6 @@ shoryuken [options]
120
153
  ...
121
154
  ```
122
155
 
123
- ### Middleware
124
-
125
- ```ruby
126
- class MyServerHook
127
- def call(worker_instance, queue, sqs_msg)
128
- puts 'Before work'
129
- yield
130
- puts 'After work'
131
- end
132
- end
133
-
134
- Shoryuken.configure_server do |config|
135
- config.server_middleware do |chain|
136
- chain.add MyServerHook
137
- # chain.remove MyServerHook
138
- end
139
- end
140
- ```
141
156
 
142
157
  ## More Information
143
158
 
data/Rakefile CHANGED
@@ -22,7 +22,7 @@ task :console do
22
22
  Pry.start
23
23
  end
24
24
 
25
- desc 'Push test messages to shoryuken, uppercut and sidekiq'
25
+ desc 'Push test messages to high_priority, default and low_priority'
26
26
  task :push_test, :size do |t, args|
27
27
  require 'yaml'
28
28
  require 'shoryuken'
@@ -31,13 +31,17 @@ task :push_test, :size do |t, args|
31
31
 
32
32
  AWS.config(config['aws'])
33
33
 
34
+ Shoryuken::Client.sqs.queues.create('default')
35
+ Shoryuken::Client.sqs.queues.create('high_priority')
36
+ Shoryuken::Client.sqs.queues.create('low_priority')
37
+
34
38
  (args[:size] || 1).to_i.times.map do |i|
35
39
  Thread.new do
36
- Shoryuken::Client.queues('shoryuken').send_message("shoryuken #{i}")
37
- Shoryuken::Client.queues('uppercut').send_message("uppercut #{i}")
38
- Shoryuken::Client.queues('sidekiq').send_message("sidekiq #{i}")
40
+ puts "Pushing test ##{i}"
39
41
 
40
- puts "Push test ##{i + 1}"
42
+ Shoryuken::Client.queues('high_priority').send_message("test #{i}")
43
+ Shoryuken::Client.queues('default').send_message("test #{i}")
44
+ Shoryuken::Client.queues('low_priority').send_message("test #{i}")
41
45
  end
42
46
  end.each &:join
43
47
  end
data/examples/all.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  $stdout.sync = true
2
2
 
3
- require_relative 'shoryuken_worker'
4
- require_relative 'uppercut_worker'
5
- require_relative 'sidekiq_worker'
3
+ require_relative 'high_priority_worker'
4
+ require_relative 'default_worker'
5
+ require_relative 'low_priority_worker'
@@ -0,0 +1,9 @@
1
+ class DefaultWorker
2
+ include Shoryuken::Worker
3
+
4
+ shoryuken_options queue: 'default', delete: true, body_parser: ->(sqs_msg){ "new body: #{sqs_msg.body}" }
5
+
6
+ def perform(sqs_msg, body)
7
+ puts "DefaultWorker: '#{body}'"
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ class HighPriorityWorker
2
+ include Shoryuken::Worker
3
+
4
+ shoryuken_options queue: 'high_priority', delete: true
5
+
6
+ def perform(sqs_msg, body)
7
+ puts "HighPriorityWorker: '#{body}'"
8
+ end
9
+ end
@@ -0,0 +1,11 @@
1
+ class LowPriorityWorker
2
+ include Shoryuken::Worker
3
+
4
+ shoryuken_options queue: 'low_priority', delete: true, batch: true
5
+
6
+ def perform(sqs_msgs, bodies)
7
+ bodies.each_with_index do |body, index|
8
+ puts "LowPriorityWorker (#{index}): '#{body}'"
9
+ end
10
+ end
11
+ end
data/lib/shoryuken.rb CHANGED
@@ -9,8 +9,8 @@ require 'shoryuken/client'
9
9
  require 'shoryuken/worker'
10
10
  require 'shoryuken/logging'
11
11
  require 'shoryuken/middleware/chain'
12
- require 'shoryuken/middleware/server/delete'
13
- require 'shoryuken/middleware/server/logging'
12
+ require 'shoryuken/middleware/server/auto_delete'
13
+ require 'shoryuken/middleware/server/timing'
14
14
 
15
15
  module Shoryuken
16
16
  DEFAULTS = {
@@ -64,8 +64,8 @@ module Shoryuken
64
64
 
65
65
  def self.default_server_middleware
66
66
  Middleware::Chain.new do |m|
67
- m.add Middleware::Server::Logging
68
- m.add Middleware::Server::Delete
67
+ m.add Middleware::Server::Timing
68
+ m.add Middleware::Server::AutoDelete
69
69
  # TODO m.add Middleware::Server::RetryJobs
70
70
  end
71
71
  end
data/lib/shoryuken/cli.rb CHANGED
@@ -16,7 +16,7 @@ module Shoryuken
16
16
  def run(args)
17
17
  self_read, self_write = IO.pipe
18
18
 
19
- %w(INT TERM USR1 USR2 TTIN).each do |sig|
19
+ %w[INT TERM USR1 USR2 TTIN].each do |sig|
20
20
  trap sig do
21
21
  self_write.puts(sig)
22
22
  end
@@ -24,11 +24,12 @@ module Shoryuken
24
24
 
25
25
  setup_options(args)
26
26
  initialize_logger
27
+ require_workers
27
28
  validate!
29
+ patch_deprecated_workers!
28
30
  daemonize
29
31
  write_pid
30
32
  load_celluloid
31
- require_workers
32
33
 
33
34
  require 'shoryuken/launcher'
34
35
  @launcher = Shoryuken::Launcher.new
@@ -144,7 +145,7 @@ module Shoryuken
144
145
 
145
146
  @parser.banner = 'shoryuken [options]'
146
147
  @parser.on_tail '-h', '--help', 'Show help' do
147
- Shoryuken.logger.info @parser
148
+ logger.info @parser
148
149
  exit 1
149
150
  end
150
151
  @parser.parse!(argv)
@@ -152,22 +153,22 @@ module Shoryuken
152
153
  end
153
154
 
154
155
  def handle_signal(sig)
155
- Shoryuken.logger.info "Got #{sig} signal"
156
+ logger.info "Got #{sig} signal"
156
157
 
157
158
  case sig
158
159
  when 'USR1'
159
- Shoryuken.logger.info "Received USR1, will soft shutdown down"
160
+ logger.info "Received USR1, will soft shutdown down"
160
161
 
161
162
  launcher.stop
162
163
 
163
164
  exit 0
164
165
  when 'TTIN'
165
166
  Thread.list.each do |thread|
166
- Shoryuken.logger.info "Thread TID-#{thread.object_id.to_s(36)} #{thread['label']}"
167
+ logger.info "Thread TID-#{thread.object_id.to_s(36)} #{thread['label']}"
167
168
  if thread.backtrace
168
- Shoryuken.logger.info thread.backtrace.join("\n")
169
+ logger.info thread.backtrace.join("\n")
169
170
  else
170
- Shoryuken.logger.info "<no backtrace available>"
171
+ logger.info "<no backtrace available>"
171
172
  end
172
173
  end
173
174
 
@@ -175,9 +176,9 @@ module Shoryuken
175
176
  busy = launcher.manager.instance_variable_get(:@busy).size
176
177
  queues = launcher.manager.instance_variable_get(:@queues)
177
178
 
178
- Shoryuken.logger.info "Ready: #{ready}, Busy: #{busy}, Active Queues: #{unparse_queues(queues)}"
179
+ logger.info "Ready: #{ready}, Busy: #{busy}, Active Queues: #{unparse_queues(queues)}"
179
180
  else
180
- Shoryuken.logger.info "Received #{sig}, will shutdown down"
181
+ logger.info "Received #{sig}, will shutdown down"
181
182
 
182
183
  raise Interrupt
183
184
  end
@@ -210,13 +211,18 @@ module Shoryuken
210
211
  end
211
212
 
212
213
  def validate!
214
+ raise ArgumentError, 'No queues supplied' if Shoryuken.queues.empty?
215
+
216
+ if queue_without_worker = Shoryuken.queues.find { |queue| Shoryuken.workers[queue].nil? }
217
+ raise ArgumentError, "No worker supplied for #{queue_without_worker}"
218
+ end
219
+
213
220
  if Shoryuken.options[:aws][:access_key_id].nil? && Shoryuken.options[:aws][:secret_access_key].nil?
214
221
  if ENV['AWS_ACCESS_KEY_ID'].nil? && ENV['AWS_SECRET_ACCESS_KEY'].nil?
215
222
  raise ArgumentError, 'No AWS credentials supplied'
216
223
  end
217
224
  end
218
225
 
219
-
220
226
  initialize_aws
221
227
 
222
228
  Shoryuken.queues.uniq.each do |queue|
@@ -229,8 +235,6 @@ module Shoryuken
229
235
  raise
230
236
  end
231
237
  end
232
-
233
- raise ArgumentError, 'No queues supplied' if Shoryuken.queues.empty?
234
238
  end
235
239
 
236
240
  def initialize_aws
@@ -250,5 +254,21 @@ module Shoryuken
250
254
  def parse_queue(queue, weight = nil)
251
255
  [weight.to_i, 1].max.times { Shoryuken.queues << queue }
252
256
  end
257
+
258
+ def patch_deprecated_workers!
259
+ Shoryuken.workers.each do |queue, worker_class|
260
+ if worker_class.instance_method(:perform).arity == 1
261
+ logger.warn "[DEPRECATION] #{worker_class.name}#perform(sqs_msg) is deprecated. Please use #{worker_class.name}#perform(sqs_msg, body)"
262
+
263
+ worker_class.class_eval do
264
+ alias_method :deprecated_perform, :perform
265
+
266
+ def perform(sqs_msg, body = nil)
267
+ deprecated_perform(sqs_msg)
268
+ end
269
+ end
270
+ end
271
+ end
272
+ end
253
273
  end
254
274
  end
@@ -16,6 +16,10 @@ module Shoryuken
16
16
  queues(queue).receive_message(Hash(options))
17
17
  end
18
18
 
19
+ def send_message(queue, body, options = {})
20
+ queues(queue).send_message(body, options)
21
+ end
22
+
19
23
  def sqs
20
24
  @sqs ||= AWS::SQS.new
21
25
  end
@@ -34,7 +34,7 @@ module Shoryuken
34
34
 
35
35
  def actor_died(actor, reason)
36
36
  return if @done
37
- Shoryuken.logger.warn 'Shoryuken died due to the following error, cannot recover, process exiting'
37
+ logger.warn 'Shoryuken died due to the following error, cannot recover, process exiting'
38
38
  exit 1
39
39
  end
40
40
  end
@@ -101,11 +101,29 @@ module Shoryuken
101
101
  def initialize(klass, *args)
102
102
  @klass = klass
103
103
  @args = args
104
+
105
+ patch_deprecated_middleware!(klass)
104
106
  end
105
107
 
106
108
  def make_new
107
109
  @klass.new(*@args)
108
110
  end
111
+
112
+ private
113
+
114
+ def patch_deprecated_middleware!(klass)
115
+ if klass.instance_method(:call).arity == 3
116
+ Shoryuken.logger.warn "[DEPRECATION] #{klass.name}#call(worker_instance, queue, sqs_msg) is deprecated. Please use #{klass.name}#call(worker_instance, queue, sqs_msg, body)"
117
+
118
+ klass.class_eval do
119
+ alias_method :deprecated_call, :call
120
+
121
+ def call(worker_instance, queue, sqs_msg, body = nil, &block)
122
+ deprecated_call(worker_instance, queue, sqs_msg, &block)
123
+ end
124
+ end
125
+ end
126
+ end
109
127
  end
110
128
  end
111
129
  end
@@ -0,0 +1,18 @@
1
+ module Shoryuken
2
+ module Middleware
3
+ module Server
4
+ class AutoDelete
5
+
6
+ def call(worker, queue, sqs_msg, body)
7
+ yield
8
+
9
+ # I'm still deciding, but `auto_delete` will be probably deprecated soon
10
+ delete = worker.class.get_shoryuken_options['delete'] || worker.class.get_shoryuken_options['auto_delete']
11
+
12
+ Shoryuken::Client.queues(queue).batch_delete(*Array(sqs_msg)) if delete
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+
@@ -1,15 +1,15 @@
1
1
  module Shoryuken
2
2
  module Middleware
3
3
  module Server
4
- class Logging
4
+ class Timing
5
5
  include Util
6
6
 
7
- def call(worker, queue, sqs_msg)
7
+ def call(worker, queue, sqs_msg, body)
8
8
  Shoryuken::Logging.with_context("#{worker.class.to_s}/#{queue}/#{sqs_msg.id}") do
9
9
  begin
10
10
  started_at = Time.now
11
11
 
12
- logger.info { "started at #{started_at}" }
12
+ logger.info "started at #{started_at}"
13
13
 
14
14
  yield
15
15
 
@@ -19,9 +19,9 @@ module Shoryuken
19
19
  logger.warn "exceeded the queue visibility timeout by #{total_time - (timeout * 1000)} ms"
20
20
  end
21
21
 
22
- logger.info { "completed in: #{total_time} ms" }
22
+ logger.info "completed in: #{total_time} ms"
23
23
  rescue => e
24
- logger.info { "failed in: #{elapsed(started_at)} ms" }
24
+ logger.info "failed in: #{elapsed(started_at)} ms"
25
25
  raise e
26
26
  end
27
27
  end
@@ -1,4 +1,4 @@
1
- require 'multi_json'
1
+ require 'json'
2
2
 
3
3
  module Shoryuken
4
4
  class Processor
@@ -10,19 +10,46 @@ module Shoryuken
10
10
  end
11
11
 
12
12
  def process(queue, sqs_msg)
13
- if worker_class = Shoryuken.workers[queue]
14
- defer do
15
- worker = worker_class.new
13
+ worker_class = Shoryuken.workers[queue]
14
+ defer do
15
+ body = get_body(worker_class, sqs_msg)
16
16
 
17
- Shoryuken.server_middleware.invoke(worker, queue, sqs_msg) do
18
- worker.perform(sqs_msg)
19
- end
17
+ worker = worker_class.new
18
+
19
+ Shoryuken.server_middleware.invoke(worker, queue, sqs_msg, body) do
20
+ worker.perform(sqs_msg, body)
20
21
  end
21
- else
22
- logger.error "Worker not found for queue '#{queue}'"
23
22
  end
24
23
 
25
24
  @manager.async.processor_done(queue, current_actor)
26
25
  end
26
+
27
+ private
28
+
29
+ def get_body(worker_class, sqs_msg)
30
+ if sqs_msg.is_a? Array
31
+ sqs_msg.map { |m| parse_body(worker_class, m) }
32
+ else
33
+ parse_body(worker_class, sqs_msg)
34
+ end
35
+ end
36
+
37
+ def parse_body(worker_class, sqs_msg)
38
+ body_parser = worker_class.get_shoryuken_options['body_parser']
39
+
40
+ case body_parser
41
+ when :json
42
+ JSON.parse(sqs_msg.body)
43
+ when Proc
44
+ body_parser.call(sqs_msg)
45
+ when :text, nil
46
+ sqs_msg.body
47
+ else
48
+ body_parser.parse(sqs_msg.body) if body_parser.respond_to?(:parse) # i.e. JSON.parse(...)
49
+ end
50
+ rescue => e
51
+ logger.error "Error parsing the message body: #{e.message}\nbody_parser: #{body_parser}\nsqs_msg.body: #{sqs_msg.body}"
52
+ nil
53
+ end
27
54
  end
28
55
  end
@@ -13,6 +13,7 @@ module Shoryuken
13
13
  end
14
14
 
15
15
  def elapsed(started_at)
16
+ # elapsed in ms
16
17
  (Time.now - started_at) * 1000
17
18
  end
18
19
 
@@ -1,3 +1,3 @@
1
1
  module Shoryuken
2
- VERSION = '0.0.2'
2
+ VERSION = '0.0.3'
3
3
  end
@@ -5,6 +5,10 @@ module Shoryuken
5
5
  end
6
6
 
7
7
  module ClassMethods
8
+ def perform_async(body, options = {})
9
+ Shoryuken::Client.send_message(get_shoryuken_options['queue'], body, options)
10
+ end
11
+
8
12
  def shoryuken_options(opts = {})
9
13
  @shoryuken_options = get_shoryuken_options.merge(stringify_keys(Hash(opts)))
10
14
  queue = @shoryuken_options['queue']
data/shoryuken.gemspec CHANGED
@@ -24,5 +24,4 @@ Gem::Specification.new do |spec|
24
24
 
25
25
  spec.add_dependency "aws-sdk"
26
26
  spec.add_dependency "celluloid"
27
- spec.add_dependency "multi_json"
28
27
  end
@@ -11,20 +11,28 @@ describe Shoryuken::Launcher do
11
11
 
12
12
  subject.run
13
13
 
14
- $received_messages = 0
14
+ ShoryukenWorker.received_messages = 0
15
15
  end
16
16
 
17
- after do
18
- subject.stop
19
- end
17
+ after { subject.stop }
20
18
 
21
19
  class ShoryukenWorker
22
20
  include Shoryuken::Worker
23
21
 
22
+ @@received_messages = 0
23
+
24
24
  shoryuken_options queue: 'shoryuken', delete: true
25
25
 
26
- def perform(sqs_msg)
27
- $received_messages = Array(sqs_msg).size
26
+ def perform(sqs_msg, body)
27
+ @@received_messages = Array(sqs_msg).size
28
+ end
29
+
30
+ def self.received_messages
31
+ @@received_messages
32
+ end
33
+
34
+ def self.received_messages=(received_messages)
35
+ @@received_messages = received_messages
28
36
  end
29
37
  end
30
38
 
@@ -34,11 +42,11 @@ describe Shoryuken::Launcher do
34
42
  Shoryuken::Client.queues('shoryuken').send_message('Yo')
35
43
 
36
44
  10.times do
37
- break if $received_messages > 0
45
+ break if ShoryukenWorker.received_messages > 0
38
46
  sleep 0.2
39
47
  end
40
48
 
41
- expect($received_messages).to eq 1
49
+ expect(ShoryukenWorker.received_messages).to eq 1
42
50
  end
43
51
 
44
52
  it 'consumes a batch' do
@@ -47,12 +55,12 @@ describe Shoryuken::Launcher do
47
55
  Shoryuken::Client.queues('shoryuken').batch_send *(['Yo'] * 10)
48
56
 
49
57
  10.times do
50
- break if $received_messages > 0
58
+ break if ShoryukenWorker.received_messages > 0
51
59
  sleep 0.2
52
60
  end
53
61
 
54
62
  # the fetch result is uncertain, should be greater than 1, but hard to tell the exact size
55
- expect($received_messages).to be > 1
63
+ expect(ShoryukenWorker.received_messages).to be > 1
56
64
  end
57
65
  end
58
66
  end
@@ -21,6 +21,20 @@ describe Shoryuken::Client do
21
21
  end
22
22
  end
23
23
 
24
+ describe '.send_message' do
25
+ it 'enqueues a message' do
26
+ expect(sqs_queue).to receive(:send_message).with('test', {})
27
+
28
+ described_class.send_message(queue, 'test')
29
+ end
30
+
31
+ it 'enqueues a message with options' do
32
+ expect(sqs_queue).to receive(:send_message).with('test2', delay_seconds: 60)
33
+
34
+ described_class.send_message(queue, 'test2', delay_seconds: 60)
35
+ end
36
+ end
37
+
24
38
  describe '.visibility_timeout' do
25
39
  it 'memoizes visibility_timeout' do
26
40
  expect(sqs_queue).to receive(:visibility_timeout).once.and_return(30)
@@ -5,8 +5,8 @@ require 'shoryuken/fetcher'
5
5
  describe Shoryuken::Fetcher do
6
6
  let(:manager) { double Shoryuken::Manager }
7
7
  let(:sqs_queue) { double 'sqs_queue' }
8
- let(:queue) { 'shoryuken2' }
9
- let(:sqs_msg) { double 'SQS msg'}
8
+ let(:queue) { 'default' }
9
+ let(:sqs_msg) { double AWS::SQS::ReceivedMessage, id: 'fc754df7-9cc2-4c41-96ca-5996a44b771e', body: 'test' }
10
10
 
11
11
  subject { described_class.new(manager) }
12
12
 
@@ -16,14 +16,6 @@ describe Shoryuken::Fetcher do
16
16
  end
17
17
 
18
18
 
19
- class Shoryuken2Worker
20
- include Shoryuken::Worker
21
-
22
- shoryuken_options queue: 'shoryuken2'
23
-
24
- def perform(sqs_msg); end
25
- end
26
-
27
19
  describe '#fetch' do
28
20
  it 'calls pause when no message' do
29
21
  allow(sqs_queue).to receive(:receive_message).with(limit: 1).and_return([])
@@ -45,7 +37,7 @@ describe Shoryuken::Fetcher do
45
37
  end
46
38
 
47
39
  it 'assigns messages in batch' do
48
- Shoryuken2Worker.get_shoryuken_options['batch'] = true
40
+ TestWorker.get_shoryuken_options['batch'] = true
49
41
 
50
42
  allow(sqs_queue).to receive(:receive_message).with(limit: described_class::FETCH_LIMIT).and_return(sqs_msg)
51
43
 
@@ -20,7 +20,7 @@ describe Shoryuken::Middleware::Chain do
20
20
  expect(CustomMiddleware).to eq subject.entries.last.klass
21
21
  end
22
22
 
23
- it 'executes middleware' do
23
+ it 'invokes a middleware' do
24
24
  recorder = []
25
25
  subject.add CustomMiddleware, 'Pablo', recorder
26
26
 
@@ -31,8 +31,7 @@ describe Shoryuken::Middleware::Chain do
31
31
  end
32
32
 
33
33
  class NonYieldingMiddleware
34
- def call(*args)
35
- end
34
+ def call(*args); end
36
35
  end
37
36
 
38
37
  it 'allows middleware to abruptly stop processing rest of chain' do
@@ -45,4 +44,26 @@ describe Shoryuken::Middleware::Chain do
45
44
  expect(final_action).to eq nil
46
45
  expect(recorder).to eq []
47
46
  end
47
+
48
+ class DeprecatedMiddleware
49
+ def call(worker_instance, queue, sqs_msg)
50
+ @@success = true
51
+ end
52
+
53
+ def self.success?
54
+ !!@@success
55
+ end
56
+ end
57
+
58
+ it 'patches deprecated middleware' do
59
+ subject.clear
60
+
61
+ expect(Shoryuken.logger).to receive(:warn).with("[DEPRECATION] DeprecatedMiddleware#call(worker_instance, queue, sqs_msg) is deprecated. Please use DeprecatedMiddleware#call(worker_instance, queue, sqs_msg, body)")
62
+
63
+ subject.add DeprecatedMiddleware
64
+
65
+ subject.invoke TestWorker, 'test', double('SQS msg', body: 'test'), 'test'
66
+
67
+ expect(DeprecatedMiddleware.success?).to eq true
68
+ end
48
69
  end
@@ -0,0 +1,50 @@
1
+ require 'spec_helper'
2
+
3
+ describe Shoryuken::Middleware::Server::AutoDelete do
4
+ let(:sqs_msg) { double AWS::SQS::ReceivedMessage, id: 'fc754df7-9cc2-4c41-96ca-5996a44b771e', body: 'test' }
5
+ let(:queue) { 'default' }
6
+ let(:sqs_queue) { double AWS::SQS::Queue }
7
+
8
+ before do
9
+ allow(Shoryuken::Client).to receive(:queues).with(queue).and_return(sqs_queue)
10
+ end
11
+
12
+ it 'deletes a message' do
13
+ TestWorker.get_shoryuken_options['delete'] = true
14
+
15
+ expect(sqs_queue).to receive(:batch_delete).with(sqs_msg)
16
+
17
+ subject.call(TestWorker.new, queue, sqs_msg, sqs_msg.body) {}
18
+ end
19
+
20
+ it 'deletes a batch' do
21
+ TestWorker.get_shoryuken_options['delete'] = true
22
+
23
+ sqs_msg2 = double 'SQS msg', body: 'test'
24
+ sqs_msg3 = double 'SQS msg', body: 'test'
25
+
26
+ sqs_msgs = [sqs_msg, sqs_msg2, sqs_msg3]
27
+
28
+ expect(sqs_queue).to receive(:batch_delete).with(*sqs_msgs)
29
+
30
+ subject.call(TestWorker.new, queue, sqs_msgs, [sqs_msg.body, sqs_msg2.body, sqs_msg3.body]) {}
31
+ end
32
+
33
+ it 'does not delete a message' do
34
+ TestWorker.get_shoryuken_options['delete'] = false
35
+
36
+ expect(sqs_queue).to_not receive(:batch_delete)
37
+
38
+ subject.call(TestWorker.new, queue, sqs_msg, sqs_msg.body) {}
39
+ end
40
+
41
+ context 'when exception' do
42
+ it 'does not delete a message' do
43
+ expect(sqs_queue).to_not receive(:batch_delete)
44
+
45
+ expect {
46
+ subject.call(TestWorker.new, queue, sqs_msg, sqs_msg.body) { raise }
47
+ }.to raise_error
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe Shoryuken::Middleware::Server::Timing do
4
+ let(:sqs_msg) { double AWS::SQS::ReceivedMessage, id: 'fc754df7-9cc2-4c41-96ca-5996a44b771e', body: 'test' }
5
+ let(:queue) { 'default' }
6
+
7
+ xit 'logs timing' do
8
+ expect(Shoryuken.logger).to receive(:info).with(/started at/)
9
+ expect(Shoryuken.logger).to receive(:info).with(/completed in/)
10
+
11
+ subject.call(TestWorker.new, queue, sqs_msg, sqs_msg.body) {}
12
+ end
13
+
14
+ context 'when exceeded the `visibility_timeout`' do
15
+ it 'logs exceeded' do
16
+ allow(Shoryuken::Client).to receive(:visibility_timeout).and_return(60)
17
+ allow(subject).to receive(:elapsed).and_return(120000)
18
+
19
+ expect(Shoryuken.logger).to receive(:info).with(/started at/)
20
+ expect(Shoryuken.logger).to receive(:info).with(/completed in/)
21
+ expect(Shoryuken.logger).to receive(:warn).with('exceeded the queue visibility timeout by 60000 ms')
22
+
23
+ subject.call(TestWorker.new, queue, sqs_msg, sqs_msg.body) {}
24
+ end
25
+ end
26
+
27
+ context 'when exception' do
28
+ it 'logs failed in' do
29
+ expect(Shoryuken.logger).to receive(:info).with(/started at/)
30
+ expect(Shoryuken.logger).to receive(:info).with(/failed in/)
31
+
32
+ expect {
33
+ subject.call(TestWorker.new, queue, sqs_msg, sqs_msg.body) { raise }
34
+ }.to raise_error
35
+ end
36
+ end
37
+ end
@@ -1,11 +1,12 @@
1
1
  require 'spec_helper'
2
2
  require 'shoryuken/processor'
3
+ require 'shoryuken/manager'
3
4
 
4
5
  describe Shoryuken::Processor do
5
- let(:manager) { double Shoryuken::Manager }
6
- let(:sqs_queue) { double 'Queue', visibility_timeout: 30 }
7
- let(:queue) { 'yo' }
8
- let(:sqs_msg) { double AWS::SQS::ReceivedMessage, id: 'fc754df7-9cc2-4c41-96ca-5996a44b771e' }
6
+ let(:manager) { double Shoryuken::Manager, processor_done: nil }
7
+ let(:sqs_queue) { double AWS::SQS::Queue, visibility_timeout: 30 }
8
+ let(:queue) { 'default' }
9
+ let(:sqs_msg) { double AWS::SQS::ReceivedMessage, id: 'fc754df7-9cc2-4c41-96ca-5996a44b771e', body: 'test' }
9
10
 
10
11
  subject { described_class.new(manager) }
11
12
 
@@ -15,27 +16,84 @@ describe Shoryuken::Processor do
15
16
  end
16
17
 
17
18
  describe '#process' do
18
- class YoWorker
19
- include Shoryuken::Worker
19
+ it 'parses the body into JSON' do
20
+ TestWorker.get_shoryuken_options['body_parser'] = :json
20
21
 
21
- shoryuken_options queue: 'yo'
22
+ body = { 'test' => 'hi' }
22
23
 
23
- def perform(sqs_msg); end
24
+ expect_any_instance_of(TestWorker).to receive(:perform).with(sqs_msg, body)
25
+
26
+ allow(sqs_msg).to receive(:body).and_return(JSON.dump(body))
27
+
28
+ subject.process(queue, sqs_msg)
24
29
  end
25
30
 
26
- it 'skips when worker not found' do
27
- queue = 'notfound'
31
+ it 'parses the body calling the proc' do
32
+ TestWorker.get_shoryuken_options['body_parser'] = Proc.new { |sqs_msg| "*#{sqs_msg.body}*" }
28
33
 
29
- expect(manager).to receive(:processor_done).with(queue, subject)
34
+ expect_any_instance_of(TestWorker).to receive(:perform).with(sqs_msg, '*test*')
35
+
36
+ allow(sqs_msg).to receive(:body).and_return('test')
37
+
38
+ subject.process(queue, sqs_msg)
39
+ end
40
+
41
+ it 'parses the body as text' do
42
+ TestWorker.get_shoryuken_options['body_parser'] = :text
43
+
44
+ body = 'test'
45
+
46
+ expect_any_instance_of(TestWorker).to receive(:perform).with(sqs_msg, body)
47
+
48
+ allow(sqs_msg).to receive(:body).and_return(body)
49
+
50
+ subject.process(queue, sqs_msg)
51
+ end
52
+
53
+ it 'parses calling `.parse`' do
54
+ TestWorker.get_shoryuken_options['body_parser'] = JSON
55
+
56
+ body = { 'test' => 'hi' }
30
57
 
31
- expect(sqs_msg).to_not receive(:delete)
58
+ expect_any_instance_of(TestWorker).to receive(:perform).with(sqs_msg, body)
59
+
60
+ allow(sqs_msg).to receive(:body).and_return(JSON.dump(body))
32
61
 
33
62
  subject.process(queue, sqs_msg)
34
63
  end
35
64
 
65
+ context 'when parse errors' do
66
+ it 'does not fail' do
67
+ TestWorker.get_shoryuken_options['body_parser'] = :json
68
+
69
+ expect_any_instance_of(TestWorker).to receive(:perform).with(sqs_msg, nil)
70
+
71
+ allow(sqs_msg).to receive(:body).and_return('invalid json')
72
+
73
+ expect(subject.logger).to receive(:error).with("Error parsing the message body: 757: unexpected token at 'invalid json'\nbody_parser: json\nsqs_msg.body: invalid json")
74
+
75
+ subject.process(queue, sqs_msg)
76
+ end
77
+ end
78
+
79
+ context 'when `object_type: nil`' do
80
+ it 'parses the body as text' do
81
+ TestWorker.get_shoryuken_options['body_parser'] = nil
82
+
83
+ body = 'test'
84
+
85
+ expect_any_instance_of(TestWorker).to receive(:perform).with(sqs_msg, body)
86
+
87
+ allow(sqs_msg).to receive(:body).and_return(body)
88
+
89
+ subject.process(queue, sqs_msg)
90
+ end
91
+ end
92
+
36
93
  context 'when custom middleware' do
37
94
  class WorkerCalledMiddleware
38
- def call(worker, queue, sqs_msg)
95
+ def call(worker, queue, sqs_msg, body)
96
+ # called is defined with `allow(...).to receive(...)`
39
97
  worker.called(sqs_msg, queue)
40
98
  yield
41
99
  end
@@ -60,33 +118,33 @@ describe Shoryuken::Processor do
60
118
  it 'invokes middleware' do
61
119
  expect(manager).to receive(:processor_done).with(queue, subject)
62
120
 
63
- expect_any_instance_of(YoWorker).to receive(:perform).with(sqs_msg)
64
- expect_any_instance_of(YoWorker).to receive(:called).with(sqs_msg, queue)
121
+ expect_any_instance_of(TestWorker).to receive(:perform).with(sqs_msg, sqs_msg.body)
122
+ expect_any_instance_of(TestWorker).to receive(:called).with(sqs_msg, queue)
65
123
 
66
124
  subject.process(queue, sqs_msg)
67
125
  end
68
126
  end
69
127
 
70
128
  it 'performs with delete' do
71
- YoWorker.get_shoryuken_options['delete'] = true
129
+ TestWorker.get_shoryuken_options['delete'] = true
72
130
 
73
131
  expect(manager).to receive(:processor_done).with(queue, subject)
74
132
 
75
- expect_any_instance_of(YoWorker).to receive(:perform).with(sqs_msg)
133
+ expect_any_instance_of(TestWorker).to receive(:perform).with(sqs_msg, sqs_msg.body)
76
134
 
77
- expect(sqs_msg).to receive(:delete)
135
+ expect(sqs_queue).to receive(:batch_delete).with(sqs_msg)
78
136
 
79
137
  subject.process(queue, sqs_msg)
80
138
  end
81
139
 
82
140
  it 'performs without delete' do
83
- YoWorker.get_shoryuken_options['delete'] = false
141
+ TestWorker.get_shoryuken_options['delete'] = false
84
142
 
85
143
  expect(manager).to receive(:processor_done).with(queue, subject)
86
144
 
87
- expect_any_instance_of(YoWorker).to receive(:perform).with(sqs_msg)
145
+ expect_any_instance_of(TestWorker).to receive(:perform).with(sqs_msg, sqs_msg.body)
88
146
 
89
- expect(sqs_msg).to_not receive(:delete)
147
+ expect(sqs_queue).to_not receive(:batch_delete)
90
148
 
91
149
  subject.process(queue, sqs_msg)
92
150
  end
@@ -1,28 +1,42 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'Shoryuken::Worker' do
4
+ let(:sqs_queue) { double 'SQS Queue' }
5
+ let(:queue) { 'default' }
4
6
 
5
- describe '.shoryuken_options' do
6
- it 'registers the worker' do
7
- class UppercutWorker
8
- include Shoryuken::Worker
7
+ before do
8
+ allow(Shoryuken::Client).to receive(:queues).with(queue).and_return(sqs_queue)
9
+ end
9
10
 
10
- shoryuken_options queue: 'uppercut'
11
- end
11
+ describe '.perform_async' do
12
+ it 'enqueues a message' do
13
+ expect(sqs_queue).to receive(:send_message).with('message', {})
14
+
15
+ TestWorker.perform_async('message')
16
+ end
12
17
 
13
- expect(Shoryuken.workers['uppercut']).to eq UppercutWorker
18
+ it 'enqueues a message with options' do
19
+ expect(sqs_queue).to receive(:send_message).with('delayed message', delay_seconds: 60)
20
+
21
+ TestWorker.perform_async('delayed message', delay_seconds: 60)
22
+ end
23
+ end
24
+
25
+ describe '.shoryuken_options' do
26
+ it 'registers a worker' do
27
+ expect(Shoryuken.workers['default']).to eq TestWorker
14
28
  end
15
29
 
16
30
  it 'accepts a block as queue name' do
17
31
  $queue_prefix = 'production'
18
32
 
19
- class UppercutWorker
33
+ class NewTestWorker
20
34
  include Shoryuken::Worker
21
35
 
22
- shoryuken_options queue: ->{ "#{$queue_prefix}_uppercut" }
36
+ shoryuken_options queue: ->{ "#{$queue_prefix}_default" }
23
37
  end
24
38
 
25
- expect(Shoryuken.workers['production_uppercut']).to eq UppercutWorker
39
+ expect(Shoryuken.workers['production_default']).to eq NewTestWorker
26
40
  end
27
41
  end
28
42
  end
data/spec/spec_helper.rb CHANGED
@@ -2,8 +2,8 @@ require 'bundler/setup'
2
2
  Bundler.setup
3
3
 
4
4
  require 'pry-byebug'
5
- require 'shoryuken'
6
5
  require 'celluloid'
6
+ require 'shoryuken'
7
7
 
8
8
  options_file = File.join(File.expand_path('../..', __FILE__), 'shoryuken.yml')
9
9
 
@@ -18,6 +18,14 @@ end
18
18
  Shoryuken.logger.level = Logger::UNKNOWN
19
19
  Celluloid.logger.level = Logger::UNKNOWN
20
20
 
21
+ class TestWorker
22
+ include Shoryuken::Worker
23
+
24
+ shoryuken_options queue: 'default'
25
+
26
+ def perform(sqs_msg, body); end
27
+ end
28
+
21
29
  RSpec.configure do |config|
22
30
  config.filter_run_excluding slow: true unless ENV['SPEC_ALL']
23
31
 
@@ -38,5 +46,8 @@ RSpec.configure do |config|
38
46
  Shoryuken.options[:timeout] = 1
39
47
 
40
48
  Shoryuken.options[:aws] = {}
49
+
50
+ TestWorker.get_shoryuken_options.clear
51
+ TestWorker.get_shoryuken_options['queue'] = 'default'
41
52
  end
42
53
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shoryuken
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pablo Cantero
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-21 00:00:00.000000000 Z
11
+ date: 2014-10-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -94,20 +94,6 @@ dependencies:
94
94
  - - '>='
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: multi_json
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - '>='
102
- - !ruby/object:Gem::Version
103
- version: '0'
104
- type: :runtime
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - '>='
109
- - !ruby/object:Gem::Version
110
- version: '0'
111
97
  description: Shoryuken is a super efficient AWS SQS thread based message processor
112
98
  email:
113
99
  - pablo@pablocantero.com
@@ -125,9 +111,9 @@ files:
125
111
  - Rakefile
126
112
  - bin/shoryuken
127
113
  - examples/all.rb
128
- - examples/shoryuken_worker.rb
129
- - examples/sidekiq_worker.rb
130
- - examples/uppercut_worker.rb
114
+ - examples/default_worker.rb
115
+ - examples/high_priority_worker.rb
116
+ - examples/low_priority_worker.rb
131
117
  - lib/shoryuken.rb
132
118
  - lib/shoryuken/cli.rb
133
119
  - lib/shoryuken/client.rb
@@ -137,8 +123,8 @@ files:
137
123
  - lib/shoryuken/logging.rb
138
124
  - lib/shoryuken/manager.rb
139
125
  - lib/shoryuken/middleware/chain.rb
140
- - lib/shoryuken/middleware/server/delete.rb
141
- - lib/shoryuken/middleware/server/logging.rb
126
+ - lib/shoryuken/middleware/server/auto_delete.rb
127
+ - lib/shoryuken/middleware/server/timing.rb
142
128
  - lib/shoryuken/processor.rb
143
129
  - lib/shoryuken/util.rb
144
130
  - lib/shoryuken/version.rb
@@ -151,7 +137,8 @@ files:
151
137
  - spec/shoryuken/fetcher_spec.rb
152
138
  - spec/shoryuken/manager_spec.rb
153
139
  - spec/shoryuken/middleware/chain_spec.rb
154
- - spec/shoryuken/middleware/server/delete_spec.rb
140
+ - spec/shoryuken/middleware/server/auto_delete_spec.rb
141
+ - spec/shoryuken/middleware/server/timing_spec.rb
155
142
  - spec/shoryuken/processor_spec.rb
156
143
  - spec/shoryuken/util_spec.rb
157
144
  - spec/shoryuken/worker_spec.rb
@@ -187,7 +174,8 @@ test_files:
187
174
  - spec/shoryuken/fetcher_spec.rb
188
175
  - spec/shoryuken/manager_spec.rb
189
176
  - spec/shoryuken/middleware/chain_spec.rb
190
- - spec/shoryuken/middleware/server/delete_spec.rb
177
+ - spec/shoryuken/middleware/server/auto_delete_spec.rb
178
+ - spec/shoryuken/middleware/server/timing_spec.rb
191
179
  - spec/shoryuken/processor_spec.rb
192
180
  - spec/shoryuken/util_spec.rb
193
181
  - spec/shoryuken/worker_spec.rb
@@ -1,11 +0,0 @@
1
- class ShoryukenWorker
2
- include Shoryuken::Worker
3
-
4
- shoryuken_options queue: 'shoryuken', delete: true
5
-
6
- def perform(sqs_msg)
7
- puts "Shoryuken: '#{sqs_msg.body}'"
8
-
9
- sleep rand(0..1)
10
- end
11
- end
@@ -1,11 +0,0 @@
1
- class SidekiqWorker
2
- include Shoryuken::Worker
3
-
4
- shoryuken_options queue: 'sidekiq', delete: true
5
-
6
- def perform(sqs_msg)
7
- puts "Sidekiq: '#{sqs_msg.body}'"
8
-
9
- sleep rand(0..1)
10
- end
11
- end
@@ -1,11 +0,0 @@
1
- class UppercutWorker
2
- include Shoryuken::Worker
3
-
4
- shoryuken_options queue: 'uppercut', delete: true
5
-
6
- def perform(sqs_msg)
7
- puts "Uppercut: '#{sqs_msg.body}'"
8
-
9
- sleep rand(0..1)
10
- end
11
- end
@@ -1,17 +0,0 @@
1
- module Shoryuken
2
- module Middleware
3
- module Server
4
- class Delete
5
- def call(worker, queue, sqs_msg)
6
- yield
7
-
8
- # auto_delete is deprecated
9
- delete = worker.class.get_shoryuken_options['delete'] || worker.class.get_shoryuken_options['auto_delete']
10
-
11
- Array(sqs_msg).each(&:delete) if delete
12
- end
13
- end
14
- end
15
- end
16
- end
17
-
@@ -1,52 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Shoryuken::Middleware::Server::Delete do
4
- let(:sqs_msg) { double 'SQS msg' }
5
-
6
- before do
7
- DeleteWorker.get_shoryuken_options['delete'] = true
8
- end
9
-
10
- class DeleteWorker
11
- include Shoryuken::Worker
12
-
13
- shoryuken_options queue: 'delete', delete: true
14
-
15
- def perform; end
16
- end
17
-
18
- it 'deletes a message' do
19
- expect(sqs_msg).to receive(:delete)
20
-
21
- subject.call(DeleteWorker.new, 'delete', sqs_msg) {}
22
- end
23
-
24
- it 'deletes a batch' do
25
- sqs_msg2 = double
26
- sqs_msg3 = double
27
-
28
- expect(sqs_msg).to receive(:delete)
29
- expect(sqs_msg2).to receive(:delete)
30
- expect(sqs_msg3).to receive(:delete)
31
-
32
- subject.call(DeleteWorker.new, 'delete', [sqs_msg, sqs_msg2, sqs_msg3]) {}
33
- end
34
-
35
- it 'does not delete a message' do
36
- DeleteWorker.get_shoryuken_options['delete'] = false
37
-
38
- expect(sqs_msg).to_not receive(:delete)
39
-
40
- subject.call(DeleteWorker.new, 'delete', sqs_msg) {}
41
- end
42
-
43
- context 'when exception' do
44
- it 'does not delete a message' do
45
- expect(sqs_msg).to_not receive(:delete)
46
-
47
- expect {
48
- subject.call(DeleteWorker.new, 'delete', sqs_msg) { raise }
49
- }.to raise_error
50
- end
51
- end
52
- end