sneakers 2.11.0 → 2.12.0.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.travis.yml +15 -8
- data/Dockerfile +6 -10
- data/bin/ci/install_on_debian.sh +17 -0
- data/docker-compose.yml +4 -0
- data/examples/max_retry_handler.rb +2 -12
- data/examples/middleware_worker.rb +34 -0
- data/lib/sneakers.rb +5 -0
- data/lib/sneakers/handlers/maxretry.rb +24 -5
- data/lib/sneakers/middleware/config.rb +23 -0
- data/lib/sneakers/queue.rb +6 -4
- data/lib/sneakers/version.rb +1 -1
- data/lib/sneakers/worker.rb +13 -4
- data/sneakers.gemspec +17 -11
- data/spec/sneakers/worker_handlers_spec.rb +15 -12
- data/spec/sneakers/worker_spec.rb +55 -0
- data/spec/spec_helper.rb +1 -0
- metadata +58 -42
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: be9610cd155fbf2b5e2e74b1e287f61ac7183b7d164aa99b3402af44bfa08166
|
|
4
|
+
data.tar.gz: 3e9e7339d58ef8cc4ed2c638774d55dfc3ccd32e95583b0317acbdd6ec1bf83b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 497640e283f35ec27da6f8b54a98c2decdf0dbdab9ccc8f73bef33ec04ac18794a6316cb2f586a4c6107e65efeec53a1711d53527d3b5a8dbd450f3ea93527f8
|
|
7
|
+
data.tar.gz: f78dfa2422ca9453c0b24b11b252f60aef2755429a8f296fd4636509fc4c686bd865062bcb964da6cffffba951df89fdcc4943cddd9b6528f523a533dac283e6
|
data/.travis.yml
CHANGED
|
@@ -1,18 +1,25 @@
|
|
|
1
|
+
dist: xenial
|
|
2
|
+
sudo: true
|
|
3
|
+
language: ruby
|
|
4
|
+
cache: bundler
|
|
1
5
|
services:
|
|
2
6
|
- rabbitmq
|
|
3
7
|
- redis-server
|
|
4
|
-
sudo: false
|
|
5
|
-
cache: bundler
|
|
6
|
-
language: ruby
|
|
7
8
|
before_install:
|
|
8
9
|
- gem install bundler
|
|
10
|
+
before_script:
|
|
11
|
+
- "./bin/ci/install_on_debian.sh"
|
|
12
|
+
- until sudo lsof -i:5672; do echo "Waiting for RabbitMQ to start..."; sleep 1; done
|
|
9
13
|
rvm:
|
|
10
14
|
- ruby-head
|
|
11
|
-
- "2.
|
|
12
|
-
- "2.
|
|
13
|
-
- "2.
|
|
14
|
-
- "2.
|
|
15
|
+
- "2.6.1"
|
|
16
|
+
- "2.5.3"
|
|
17
|
+
- "2.4.5"
|
|
18
|
+
- "2.3.8"
|
|
15
19
|
matrix:
|
|
16
20
|
include:
|
|
17
|
-
- rvm: 2.
|
|
21
|
+
- rvm: "2.6.0"
|
|
18
22
|
env: INTEGRATION_LOG=1 INTEGRATION=1
|
|
23
|
+
allow_failures:
|
|
24
|
+
rvm:
|
|
25
|
+
- ruby-head
|
data/Dockerfile
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
FROM ruby:2.3-
|
|
1
|
+
FROM ruby:2.3.7-alpine3.7
|
|
2
2
|
|
|
3
3
|
RUN apk add --no-cache git
|
|
4
4
|
|
|
@@ -9,20 +9,16 @@ RUN apk --update add --virtual build_deps \
|
|
|
9
9
|
linux-headers \
|
|
10
10
|
openssl-dev
|
|
11
11
|
|
|
12
|
-
RUN mkdir /myapp
|
|
13
|
-
|
|
14
12
|
WORKDIR /sneakers
|
|
15
13
|
|
|
16
|
-
COPY lib/sneakers/version.rb
|
|
17
|
-
|
|
18
|
-
COPY sneakers.gemspec /sneakers/sneakers.gemspec
|
|
14
|
+
COPY lib/sneakers/version.rb lib/sneakers/version.rb
|
|
19
15
|
|
|
20
|
-
COPY
|
|
16
|
+
COPY sneakers.gemspec .
|
|
21
17
|
|
|
22
|
-
COPY Gemfile
|
|
18
|
+
COPY Gemfile* ./
|
|
23
19
|
|
|
24
|
-
RUN bundle
|
|
20
|
+
RUN bundle install --retry=3
|
|
25
21
|
|
|
26
|
-
COPY .
|
|
22
|
+
COPY . .
|
|
27
23
|
|
|
28
24
|
CMD rake test
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
|
|
3
|
+
sudo apt-get install -y wget
|
|
4
|
+
wget -O - "https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc" | sudo apt-key add -
|
|
5
|
+
|
|
6
|
+
sudo tee /etc/apt/sources.list.d/bintray.rabbitmq.list <<EOF
|
|
7
|
+
deb https://dl.bintray.com/rabbitmq-erlang/debian xenial erlang
|
|
8
|
+
deb https://dl.bintray.com/rabbitmq/debian xenial main
|
|
9
|
+
EOF
|
|
10
|
+
|
|
11
|
+
sudo apt-get update -y
|
|
12
|
+
sudo apt-get upgrade -y
|
|
13
|
+
sudo apt-get install -y rabbitmq-server
|
|
14
|
+
|
|
15
|
+
sudo service rabbitmq-server start
|
|
16
|
+
|
|
17
|
+
until sudo lsof -i:5672; do echo "Waiting for RabbitMQ to start..."; sleep 1; done
|
data/docker-compose.yml
CHANGED
|
@@ -33,12 +33,7 @@ WORKER_OPTIONS = {
|
|
|
33
33
|
#
|
|
34
34
|
class MaxRetryWorker
|
|
35
35
|
include Sneakers::Worker
|
|
36
|
-
from_queue 'downloads',
|
|
37
|
-
WORKER_OPTIONS.merge({
|
|
38
|
-
:arguments => {
|
|
39
|
-
:'x-dead-letter-exchange' => 'downloads-retry'
|
|
40
|
-
},
|
|
41
|
-
})
|
|
36
|
+
from_queue 'downloads', WORKER_OPTIONS
|
|
42
37
|
|
|
43
38
|
def work(msg)
|
|
44
39
|
logger.info("MaxRetryWorker rejecting msg: #{msg.inspect}")
|
|
@@ -52,12 +47,7 @@ end
|
|
|
52
47
|
# see the message once.
|
|
53
48
|
class SucceedingWorker
|
|
54
49
|
include Sneakers::Worker
|
|
55
|
-
from_queue 'uploads',
|
|
56
|
-
WORKER_OPTIONS.merge({
|
|
57
|
-
:arguments => {
|
|
58
|
-
:'x-dead-letter-exchange' => 'uploads-retry'
|
|
59
|
-
},
|
|
60
|
-
})
|
|
50
|
+
from_queue 'uploads', WORKER_OPTIONS
|
|
61
51
|
|
|
62
52
|
def work(msg)
|
|
63
53
|
logger.info("SucceedingWorker succeeding on msg: #{msg.inspect}")
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
$: << File.expand_path('../lib', File.dirname(__FILE__))
|
|
2
|
+
require 'sneakers'
|
|
3
|
+
require 'sneakers/runner'
|
|
4
|
+
|
|
5
|
+
class MiddlewareWorker
|
|
6
|
+
include Sneakers::Worker
|
|
7
|
+
|
|
8
|
+
from_queue 'middleware-demo',
|
|
9
|
+
ack: false
|
|
10
|
+
|
|
11
|
+
def work(message)
|
|
12
|
+
puts "******** MiddlewareWorker -> #{message}"
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
class DemoMiddleware
|
|
17
|
+
def initialize(app, *args)
|
|
18
|
+
@app = app
|
|
19
|
+
@args = args
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def call(deserialized_msg, delivery_info, metadata, handler)
|
|
23
|
+
puts "******** DemoMiddleware - before; args #{@args}"
|
|
24
|
+
@app.call(deserialized_msg, delivery_info, metadata, handler)
|
|
25
|
+
puts "******** DemoMiddleware - after"
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
Sneakers.configure
|
|
30
|
+
Sneakers.middleware.use(DemoMiddleware, foo: :bar)
|
|
31
|
+
|
|
32
|
+
Sneakers.publish("{}", :to_queue => 'middleware-demo')
|
|
33
|
+
r = Sneakers::Runner.new([MiddlewareWorker])
|
|
34
|
+
r.run
|
data/lib/sneakers.rb
CHANGED
|
@@ -18,6 +18,7 @@ require 'sneakers/concerns/logging'
|
|
|
18
18
|
require 'sneakers/concerns/metrics'
|
|
19
19
|
require 'sneakers/handlers/oneshot'
|
|
20
20
|
require 'sneakers/content_type'
|
|
21
|
+
require 'sneakers/middleware/config'
|
|
21
22
|
require 'sneakers/worker'
|
|
22
23
|
require 'sneakers/publisher'
|
|
23
24
|
|
|
@@ -87,6 +88,10 @@ module Sneakers
|
|
|
87
88
|
CONFIG[:error_reporters]
|
|
88
89
|
end
|
|
89
90
|
|
|
91
|
+
def middleware
|
|
92
|
+
@middleware ||= Sneakers::Middleware::Config
|
|
93
|
+
end
|
|
94
|
+
|
|
90
95
|
private
|
|
91
96
|
|
|
92
97
|
def setup_general_logger!
|
|
@@ -82,6 +82,11 @@ module Sneakers
|
|
|
82
82
|
|
|
83
83
|
end
|
|
84
84
|
|
|
85
|
+
def self.configure_queue(name, opts)
|
|
86
|
+
retry_name = opts.fetch(:retry_exchange, "#{name}-retry")
|
|
87
|
+
opts.merge(arguments: { "x-dead-letter-exchange": retry_name })
|
|
88
|
+
end
|
|
89
|
+
|
|
85
90
|
def acknowledge(hdr, props, msg)
|
|
86
91
|
@channel.acknowledge(hdr.delivery_tag, false)
|
|
87
92
|
end
|
|
@@ -134,18 +139,32 @@ module Sneakers
|
|
|
134
139
|
error: reason.to_s,
|
|
135
140
|
num_attempts: num_attempts,
|
|
136
141
|
failed_at: Time.now.iso8601,
|
|
137
|
-
|
|
138
|
-
properties: Base64.encode64(props.to_json)
|
|
142
|
+
properties: props.to_hash
|
|
139
143
|
}.tap do |hash|
|
|
140
144
|
if reason.is_a?(Exception)
|
|
141
145
|
hash[:error_class] = reason.class.to_s
|
|
142
146
|
hash[:error_message] = "#{reason}"
|
|
143
147
|
if reason.backtrace
|
|
144
|
-
hash[:backtrace] = reason.backtrace.take(10)
|
|
148
|
+
hash[:backtrace] = reason.backtrace.take(10)
|
|
145
149
|
end
|
|
146
150
|
end
|
|
147
|
-
end
|
|
148
|
-
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
# Preserve retry log in a list
|
|
154
|
+
if retry_info = props[:headers]['retry_info']
|
|
155
|
+
old_retry0 = JSON.parse(retry_info) rescue {error: "Failed to parse retry info"}
|
|
156
|
+
old_retry = Array(old_retry0)
|
|
157
|
+
# Prevent old retry from nesting
|
|
158
|
+
data[:properties][:headers].delete('retry_info')
|
|
159
|
+
data = old_retry.unshift(data)
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
@error_exchange.publish(msg, {
|
|
163
|
+
routing_key: hdr.routing_key,
|
|
164
|
+
headers: {
|
|
165
|
+
retry_info: data.to_json
|
|
166
|
+
}
|
|
167
|
+
})
|
|
149
168
|
@channel.acknowledge(hdr.delivery_tag, false)
|
|
150
169
|
# TODO: metrics
|
|
151
170
|
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module Sneakers
|
|
2
|
+
module Middleware
|
|
3
|
+
class Config
|
|
4
|
+
def self.use(klass, args)
|
|
5
|
+
middlewares << { class: klass, args: args }
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def self.delete(klass)
|
|
9
|
+
middlewares.reject! { |el| el[:class] == klass }
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def self.to_a
|
|
13
|
+
middlewares
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.middlewares
|
|
17
|
+
@middlewares ||= []
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
private_class_method :middlewares
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
data/lib/sneakers/queue.rb
CHANGED
|
@@ -31,9 +31,12 @@ class Sneakers::Queue
|
|
|
31
31
|
routing_key = @opts[:routing_key] || @name
|
|
32
32
|
routing_keys = [*routing_key]
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
#
|
|
36
|
-
|
|
34
|
+
handler_klass = worker.opts[:handler] || Sneakers::CONFIG.fetch(:handler)
|
|
35
|
+
# Configure options if needed
|
|
36
|
+
if handler_klass.respond_to?(:configure_queue)
|
|
37
|
+
@opts[:queue_options] = handler_klass.configure_queue(@name, @opts[:queue_options])
|
|
38
|
+
end
|
|
39
|
+
|
|
37
40
|
queue = @channel.queue(@name, @opts[:queue_options])
|
|
38
41
|
|
|
39
42
|
if exchange_name.length > 0
|
|
@@ -50,7 +53,6 @@ class Sneakers::Queue
|
|
|
50
53
|
# has the same configuration as the worker. Also pass along the exchange and
|
|
51
54
|
# queue in case the handler requires access to them (for things like binding
|
|
52
55
|
# retry queues, etc).
|
|
53
|
-
handler_klass = worker.opts[:handler] || Sneakers::CONFIG.fetch(:handler)
|
|
54
56
|
handler = handler_klass.new(@channel, queue, worker.opts)
|
|
55
57
|
|
|
56
58
|
@consumer = queue.subscribe(block: false, manual_ack: @opts[:ack]) do | delivery_info, metadata, msg |
|
data/lib/sneakers/version.rb
CHANGED
data/lib/sneakers/worker.rb
CHANGED
|
@@ -57,11 +57,20 @@ module Sneakers
|
|
|
57
57
|
metrics.increment("work.#{self.class.name}.started")
|
|
58
58
|
metrics.timing("work.#{self.class.name}.time") do
|
|
59
59
|
deserialized_msg = ContentType.deserialize(msg, @content_type || metadata && metadata[:content_type])
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
60
|
+
|
|
61
|
+
app = -> (deserialized_msg, delivery_info, metadata, handler) do
|
|
62
|
+
if @call_with_params
|
|
63
|
+
work_with_params(deserialized_msg, delivery_info, metadata)
|
|
64
|
+
else
|
|
65
|
+
work(deserialized_msg)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
middlewares = Sneakers.middleware.to_a
|
|
70
|
+
block_to_call = middlewares.reverse.reduce(app) do |mem, h|
|
|
71
|
+
h[:class].new(mem, *h[:args])
|
|
64
72
|
end
|
|
73
|
+
res = block_to_call.call(deserialized_msg, delivery_info, metadata, handler)
|
|
65
74
|
end
|
|
66
75
|
rescue StandardError, ScriptError => ex
|
|
67
76
|
res = :error
|
data/sneakers.gemspec
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
#!/usr/bin/env gem build
|
|
2
|
+
# encoding: utf-8
|
|
3
|
+
|
|
1
4
|
lib = File.expand_path('../lib', __FILE__)
|
|
2
5
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
3
6
|
require 'sneakers/version'
|
|
@@ -14,27 +17,30 @@ Gem::Specification.new do |gem|
|
|
|
14
17
|
gem.required_ruby_version = Gem::Requirement.new(">= 2.2")
|
|
15
18
|
|
|
16
19
|
gem.files = `git ls-files`.split($/).reject { |f| f == 'Gemfile.lock' }
|
|
17
|
-
gem.executables = gem.files.grep(/^bin/).
|
|
20
|
+
gem.executables = gem.files.grep(/^bin/).
|
|
21
|
+
reject { |f| f =~ /^bin\/ci/ }.
|
|
22
|
+
map { |f| File.basename(f) }
|
|
18
23
|
gem.test_files = gem.files.grep(/^(test|spec|features)\//)
|
|
19
24
|
gem.require_paths = ['lib']
|
|
20
25
|
|
|
21
|
-
gem.add_dependency 'serverengine', '~> 2.0
|
|
22
|
-
gem.add_dependency 'bunny', '~> 2.
|
|
26
|
+
gem.add_dependency 'serverengine', '~> 2.1.0'
|
|
27
|
+
gem.add_dependency 'bunny', '~> 2.14'
|
|
23
28
|
gem.add_dependency 'concurrent-ruby', '~> 1.0'
|
|
24
29
|
gem.add_dependency 'thor'
|
|
25
|
-
gem.add_dependency 'rake'
|
|
30
|
+
gem.add_dependency 'rake', '~> 12.3'
|
|
26
31
|
|
|
27
32
|
# for integration environment (see .travis.yml and integration_spec)
|
|
28
33
|
gem.add_development_dependency 'rabbitmq_http_api_client'
|
|
29
34
|
gem.add_development_dependency 'redis'
|
|
30
35
|
|
|
31
|
-
gem.add_development_dependency 'rake'
|
|
32
|
-
gem.add_development_dependency 'minitest'
|
|
33
|
-
gem.add_development_dependency 'rr'
|
|
36
|
+
gem.add_development_dependency 'rake', '~> 12.3'
|
|
37
|
+
gem.add_development_dependency 'minitest', '~> 5.11'
|
|
38
|
+
gem.add_development_dependency 'rr', '~> 1.2.1'
|
|
34
39
|
gem.add_development_dependency 'unparser', '0.2.2' # keep below 0.2.5 for ruby 2.0 compat.
|
|
35
|
-
gem.add_development_dependency 'metric_fu'
|
|
36
|
-
gem.add_development_dependency 'simplecov'
|
|
40
|
+
gem.add_development_dependency 'metric_fu', '~> 4.12'
|
|
41
|
+
gem.add_development_dependency 'simplecov', '~> 0.16'
|
|
37
42
|
gem.add_development_dependency 'simplecov-rcov-text'
|
|
38
|
-
gem.add_development_dependency 'guard'
|
|
39
|
-
gem.add_development_dependency 'guard-minitest'
|
|
43
|
+
gem.add_development_dependency 'guard', '~> 2.15'
|
|
44
|
+
gem.add_development_dependency 'guard-minitest', '~> 2.4'
|
|
45
|
+
gem.add_development_dependency 'pry-byebug', '~> 3.7'
|
|
40
46
|
end
|
|
@@ -234,12 +234,13 @@ describe 'Handlers' do
|
|
|
234
234
|
@error_exchange.extend MockPublish
|
|
235
235
|
worker.do_work(@header, @props_with_x_death, :reject, @handler)
|
|
236
236
|
@error_exchange.called.must_equal(true)
|
|
237
|
-
@error_exchange.opts.must_equal(
|
|
238
|
-
data = JSON.parse(@error_exchange.
|
|
237
|
+
@error_exchange.opts[:routing_key].must_equal('#')
|
|
238
|
+
data = JSON.parse(@error_exchange.opts[:headers][:retry_info]) rescue nil
|
|
239
|
+
data.wont_be_nil
|
|
239
240
|
data['error'].must_equal('reject')
|
|
240
241
|
data['num_attempts'].must_equal(2)
|
|
241
|
-
data
|
|
242
|
-
data['properties'].must_equal(
|
|
242
|
+
@error_exchange.data.must_equal(:reject)
|
|
243
|
+
data['properties'].to_json.must_equal(@props_with_x_death.to_json)
|
|
243
244
|
Time.parse(data['failed_at']).wont_be_nil
|
|
244
245
|
end
|
|
245
246
|
|
|
@@ -250,12 +251,13 @@ describe 'Handlers' do
|
|
|
250
251
|
@error_exchange.extend MockPublish
|
|
251
252
|
worker.do_work(@header, props_with_x_death_count, :reject, @handler)
|
|
252
253
|
@error_exchange.called.must_equal(true)
|
|
253
|
-
@error_exchange.opts.must_equal(
|
|
254
|
-
data = JSON.parse(@error_exchange.
|
|
254
|
+
@error_exchange.opts[:routing_key].must_equal('#')
|
|
255
|
+
data = JSON.parse(@error_exchange.opts[:headers][:retry_info]) rescue nil
|
|
256
|
+
data.wont_be_nil
|
|
255
257
|
data['error'].must_equal('reject')
|
|
256
258
|
data['num_attempts'].must_equal(4)
|
|
257
|
-
data
|
|
258
|
-
data['properties'].must_equal(
|
|
259
|
+
@error_exchange.data.must_equal(:reject)
|
|
260
|
+
data['properties'].to_json.must_equal(props_with_x_death_count.to_json)
|
|
259
261
|
Time.parse(data['failed_at']).wont_be_nil
|
|
260
262
|
end
|
|
261
263
|
|
|
@@ -300,14 +302,15 @@ describe 'Handlers' do
|
|
|
300
302
|
|
|
301
303
|
worker.do_work(@header, @props_with_x_death, StandardError.new('boom!'), @handler)
|
|
302
304
|
@error_exchange.called.must_equal(true)
|
|
303
|
-
@error_exchange.opts.must_equal(
|
|
304
|
-
data = JSON.parse(@error_exchange.
|
|
305
|
+
@error_exchange.opts[:routing_key].must_equal('#')
|
|
306
|
+
data = JSON.parse(@error_exchange.opts[:headers][:retry_info]) rescue nil
|
|
307
|
+
data.wont_be_nil
|
|
305
308
|
data['error'].must_equal('boom!')
|
|
306
309
|
data['error_class'].must_equal(StandardError.to_s)
|
|
307
310
|
data['backtrace'].wont_be_nil
|
|
308
311
|
data['num_attempts'].must_equal(2)
|
|
309
|
-
data
|
|
310
|
-
data['properties'].must_equal(
|
|
312
|
+
@error_exchange.data.to_s.must_equal('boom!')
|
|
313
|
+
data['properties'].to_json.must_equal(@props_with_x_death.to_json)
|
|
311
314
|
Time.parse(data['failed_at']).wont_be_nil
|
|
312
315
|
end
|
|
313
316
|
end
|
|
@@ -392,6 +392,61 @@ describe Sneakers::Worker do
|
|
|
392
392
|
w.do_work(header, nil, "msg", handler)
|
|
393
393
|
end
|
|
394
394
|
|
|
395
|
+
describe 'middleware' do
|
|
396
|
+
let(:middleware) do
|
|
397
|
+
Class.new do
|
|
398
|
+
def initialize(app, *args)
|
|
399
|
+
@app = app
|
|
400
|
+
end
|
|
401
|
+
|
|
402
|
+
def call(deserialized_msg, delivery_info, metadata, handler)
|
|
403
|
+
@app.call(deserialized_msg, delivery_info, metadata, handler)
|
|
404
|
+
end
|
|
405
|
+
end
|
|
406
|
+
end
|
|
407
|
+
|
|
408
|
+
let(:worker) do
|
|
409
|
+
Class.new do
|
|
410
|
+
include Sneakers::Worker
|
|
411
|
+
from_queue 'defaults', ack: false
|
|
412
|
+
|
|
413
|
+
def work_with_params(msg, delivery_info, metadata)
|
|
414
|
+
msg
|
|
415
|
+
end
|
|
416
|
+
end
|
|
417
|
+
end
|
|
418
|
+
|
|
419
|
+
before do
|
|
420
|
+
Sneakers.middleware.use(middleware, 'args')
|
|
421
|
+
|
|
422
|
+
@delivery_info = Object.new
|
|
423
|
+
@metadata = Object.new
|
|
424
|
+
stub(@metadata).[](:content_type) { 'some/fake' }
|
|
425
|
+
@message = Object.new
|
|
426
|
+
@handler = Object.new
|
|
427
|
+
end
|
|
428
|
+
|
|
429
|
+
after do
|
|
430
|
+
Sneakers.middleware.delete(middleware)
|
|
431
|
+
end
|
|
432
|
+
|
|
433
|
+
it 'should process job and call #work_with_params/#work' do
|
|
434
|
+
w = worker.new(@queue, TestPool.new)
|
|
435
|
+
mock(w).work_with_params(@message, @delivery_info, @metadata).once
|
|
436
|
+
|
|
437
|
+
w.do_work(@delivery_info, @metadata, @message, @handler)
|
|
438
|
+
end
|
|
439
|
+
|
|
440
|
+
it "should call registered middleware" do
|
|
441
|
+
mock.proxy(middleware).new(instance_of(Proc), 'args').once do |res|
|
|
442
|
+
mock.proxy(res).call(@message, @delivery_info, @metadata, @handler).once
|
|
443
|
+
end
|
|
444
|
+
|
|
445
|
+
w = worker.new(@queue, TestPool.new)
|
|
446
|
+
w.do_work(@delivery_info, @metadata, @message, @handler)
|
|
447
|
+
end
|
|
448
|
+
end
|
|
449
|
+
|
|
395
450
|
describe "with ack" do
|
|
396
451
|
before do
|
|
397
452
|
@delivery_info = Object.new
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: sneakers
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.
|
|
4
|
+
version: 2.12.0.rc1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Dotan Nahum
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2019-
|
|
11
|
+
date: 2019-03-04 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: serverengine
|
|
@@ -16,28 +16,28 @@ dependencies:
|
|
|
16
16
|
requirements:
|
|
17
17
|
- - "~>"
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: 2.0
|
|
19
|
+
version: 2.1.0
|
|
20
20
|
type: :runtime
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
24
|
- - "~>"
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
|
-
version: 2.0
|
|
26
|
+
version: 2.1.0
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
28
|
name: bunny
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
30
30
|
requirements:
|
|
31
31
|
- - "~>"
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
|
-
version: '2.
|
|
33
|
+
version: '2.14'
|
|
34
34
|
type: :runtime
|
|
35
35
|
prerelease: false
|
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
37
|
requirements:
|
|
38
38
|
- - "~>"
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
|
-
version: '2.
|
|
40
|
+
version: '2.14'
|
|
41
41
|
- !ruby/object:Gem::Dependency
|
|
42
42
|
name: concurrent-ruby
|
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -70,16 +70,16 @@ dependencies:
|
|
|
70
70
|
name: rake
|
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
|
72
72
|
requirements:
|
|
73
|
-
- - "
|
|
73
|
+
- - "~>"
|
|
74
74
|
- !ruby/object:Gem::Version
|
|
75
|
-
version: '
|
|
75
|
+
version: '12.3'
|
|
76
76
|
type: :runtime
|
|
77
77
|
prerelease: false
|
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
|
79
79
|
requirements:
|
|
80
|
-
- - "
|
|
80
|
+
- - "~>"
|
|
81
81
|
- !ruby/object:Gem::Version
|
|
82
|
-
version: '
|
|
82
|
+
version: '12.3'
|
|
83
83
|
- !ruby/object:Gem::Dependency
|
|
84
84
|
name: rabbitmq_http_api_client
|
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -112,44 +112,44 @@ dependencies:
|
|
|
112
112
|
name: rake
|
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
|
114
114
|
requirements:
|
|
115
|
-
- - "
|
|
115
|
+
- - "~>"
|
|
116
116
|
- !ruby/object:Gem::Version
|
|
117
|
-
version: '
|
|
117
|
+
version: '12.3'
|
|
118
118
|
type: :development
|
|
119
119
|
prerelease: false
|
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
|
121
121
|
requirements:
|
|
122
|
-
- - "
|
|
122
|
+
- - "~>"
|
|
123
123
|
- !ruby/object:Gem::Version
|
|
124
|
-
version: '
|
|
124
|
+
version: '12.3'
|
|
125
125
|
- !ruby/object:Gem::Dependency
|
|
126
126
|
name: minitest
|
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
|
128
128
|
requirements:
|
|
129
|
-
- - "
|
|
129
|
+
- - "~>"
|
|
130
130
|
- !ruby/object:Gem::Version
|
|
131
|
-
version: '
|
|
131
|
+
version: '5.11'
|
|
132
132
|
type: :development
|
|
133
133
|
prerelease: false
|
|
134
134
|
version_requirements: !ruby/object:Gem::Requirement
|
|
135
135
|
requirements:
|
|
136
|
-
- - "
|
|
136
|
+
- - "~>"
|
|
137
137
|
- !ruby/object:Gem::Version
|
|
138
|
-
version: '
|
|
138
|
+
version: '5.11'
|
|
139
139
|
- !ruby/object:Gem::Dependency
|
|
140
140
|
name: rr
|
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
|
142
142
|
requirements:
|
|
143
|
-
- - "
|
|
143
|
+
- - "~>"
|
|
144
144
|
- !ruby/object:Gem::Version
|
|
145
|
-
version:
|
|
145
|
+
version: 1.2.1
|
|
146
146
|
type: :development
|
|
147
147
|
prerelease: false
|
|
148
148
|
version_requirements: !ruby/object:Gem::Requirement
|
|
149
149
|
requirements:
|
|
150
|
-
- - "
|
|
150
|
+
- - "~>"
|
|
151
151
|
- !ruby/object:Gem::Version
|
|
152
|
-
version:
|
|
152
|
+
version: 1.2.1
|
|
153
153
|
- !ruby/object:Gem::Dependency
|
|
154
154
|
name: unparser
|
|
155
155
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -168,30 +168,30 @@ dependencies:
|
|
|
168
168
|
name: metric_fu
|
|
169
169
|
requirement: !ruby/object:Gem::Requirement
|
|
170
170
|
requirements:
|
|
171
|
-
- - "
|
|
171
|
+
- - "~>"
|
|
172
172
|
- !ruby/object:Gem::Version
|
|
173
|
-
version: '
|
|
173
|
+
version: '4.12'
|
|
174
174
|
type: :development
|
|
175
175
|
prerelease: false
|
|
176
176
|
version_requirements: !ruby/object:Gem::Requirement
|
|
177
177
|
requirements:
|
|
178
|
-
- - "
|
|
178
|
+
- - "~>"
|
|
179
179
|
- !ruby/object:Gem::Version
|
|
180
|
-
version: '
|
|
180
|
+
version: '4.12'
|
|
181
181
|
- !ruby/object:Gem::Dependency
|
|
182
182
|
name: simplecov
|
|
183
183
|
requirement: !ruby/object:Gem::Requirement
|
|
184
184
|
requirements:
|
|
185
|
-
- - "
|
|
185
|
+
- - "~>"
|
|
186
186
|
- !ruby/object:Gem::Version
|
|
187
|
-
version: '0'
|
|
187
|
+
version: '0.16'
|
|
188
188
|
type: :development
|
|
189
189
|
prerelease: false
|
|
190
190
|
version_requirements: !ruby/object:Gem::Requirement
|
|
191
191
|
requirements:
|
|
192
|
-
- - "
|
|
192
|
+
- - "~>"
|
|
193
193
|
- !ruby/object:Gem::Version
|
|
194
|
-
version: '0'
|
|
194
|
+
version: '0.16'
|
|
195
195
|
- !ruby/object:Gem::Dependency
|
|
196
196
|
name: simplecov-rcov-text
|
|
197
197
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -210,30 +210,44 @@ dependencies:
|
|
|
210
210
|
name: guard
|
|
211
211
|
requirement: !ruby/object:Gem::Requirement
|
|
212
212
|
requirements:
|
|
213
|
-
- - "
|
|
213
|
+
- - "~>"
|
|
214
214
|
- !ruby/object:Gem::Version
|
|
215
|
-
version: '
|
|
215
|
+
version: '2.15'
|
|
216
216
|
type: :development
|
|
217
217
|
prerelease: false
|
|
218
218
|
version_requirements: !ruby/object:Gem::Requirement
|
|
219
219
|
requirements:
|
|
220
|
-
- - "
|
|
220
|
+
- - "~>"
|
|
221
221
|
- !ruby/object:Gem::Version
|
|
222
|
-
version: '
|
|
222
|
+
version: '2.15'
|
|
223
223
|
- !ruby/object:Gem::Dependency
|
|
224
224
|
name: guard-minitest
|
|
225
225
|
requirement: !ruby/object:Gem::Requirement
|
|
226
226
|
requirements:
|
|
227
|
-
- - "
|
|
227
|
+
- - "~>"
|
|
228
228
|
- !ruby/object:Gem::Version
|
|
229
|
-
version: '
|
|
229
|
+
version: '2.4'
|
|
230
230
|
type: :development
|
|
231
231
|
prerelease: false
|
|
232
232
|
version_requirements: !ruby/object:Gem::Requirement
|
|
233
233
|
requirements:
|
|
234
|
-
- - "
|
|
234
|
+
- - "~>"
|
|
235
235
|
- !ruby/object:Gem::Version
|
|
236
|
-
version: '
|
|
236
|
+
version: '2.4'
|
|
237
|
+
- !ruby/object:Gem::Dependency
|
|
238
|
+
name: pry-byebug
|
|
239
|
+
requirement: !ruby/object:Gem::Requirement
|
|
240
|
+
requirements:
|
|
241
|
+
- - "~>"
|
|
242
|
+
- !ruby/object:Gem::Version
|
|
243
|
+
version: '3.7'
|
|
244
|
+
type: :development
|
|
245
|
+
prerelease: false
|
|
246
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
247
|
+
requirements:
|
|
248
|
+
- - "~>"
|
|
249
|
+
- !ruby/object:Gem::Version
|
|
250
|
+
version: '3.7'
|
|
237
251
|
description: " Fast background processing framework for Ruby and RabbitMQ "
|
|
238
252
|
email:
|
|
239
253
|
- jondotan@gmail.com
|
|
@@ -252,11 +266,13 @@ files:
|
|
|
252
266
|
- LICENSE.txt
|
|
253
267
|
- README.md
|
|
254
268
|
- Rakefile
|
|
269
|
+
- bin/ci/install_on_debian.sh
|
|
255
270
|
- bin/sneakers
|
|
256
271
|
- docker-compose.yml
|
|
257
272
|
- examples/benchmark_worker.rb
|
|
258
273
|
- examples/max_retry_handler.rb
|
|
259
274
|
- examples/metrics_worker.rb
|
|
275
|
+
- examples/middleware_worker.rb
|
|
260
276
|
- examples/newrelic_metrics_worker.rb
|
|
261
277
|
- examples/profiling_worker.rb
|
|
262
278
|
- examples/sneakers.conf.rb.example
|
|
@@ -276,6 +292,7 @@ files:
|
|
|
276
292
|
- lib/sneakers/metrics/newrelic_metrics.rb
|
|
277
293
|
- lib/sneakers/metrics/null_metrics.rb
|
|
278
294
|
- lib/sneakers/metrics/statsd_metrics.rb
|
|
295
|
+
- lib/sneakers/middleware/config.rb
|
|
279
296
|
- lib/sneakers/publisher.rb
|
|
280
297
|
- lib/sneakers/queue.rb
|
|
281
298
|
- lib/sneakers/runner.rb
|
|
@@ -322,12 +339,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
322
339
|
version: '2.2'
|
|
323
340
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
324
341
|
requirements:
|
|
325
|
-
- - "
|
|
342
|
+
- - ">"
|
|
326
343
|
- !ruby/object:Gem::Version
|
|
327
|
-
version:
|
|
344
|
+
version: 1.3.1
|
|
328
345
|
requirements: []
|
|
329
|
-
|
|
330
|
-
rubygems_version: 2.6.8
|
|
346
|
+
rubygems_version: 3.0.2
|
|
331
347
|
signing_key:
|
|
332
348
|
specification_version: 4
|
|
333
349
|
summary: Fast background processing framework for Ruby and RabbitMQ
|