Skip to content

Commit 2c87904

Browse files
authored
Merge pull request #8 from ridecharge/pull-middlewares-logic-from-upstream
Pull middlewares logic from upstream
2 parents d882f82 + 9e1b1a9 commit 2c87904

8 files changed

Lines changed: 134 additions & 5 deletions

File tree

examples/middleware_worker.rb

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

lib/sneakers.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ module Concerns
1818
require 'sneakers/concerns/metrics'
1919
require 'sneakers/handlers/oneshot'
2020
require 'sneakers/content_type'
21+
require 'sneakers/middleware/config'
2122
require 'sneakers/worker'
2223
require 'sneakers/publisher'
2324

@@ -87,6 +88,10 @@ def error_reporters
8788
CONFIG[:error_reporters]
8889
end
8990

91+
def middleware
92+
@middleware ||= Sneakers::Middleware::Config
93+
end
94+
9095
private
9196

9297
def setup_general_logger!

lib/sneakers/middleware/config.rb

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

lib/sneakers/version.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
module Sneakers
2-
VERSION = "0.5.0.curb"
2+
VERSION = "10.0.0.curb"
33
end

lib/sneakers/worker.rb

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,20 @@ def do_work(delivery_info, metadata, msg, handler)
5555
Timeout.timeout(@timeout_after, WorkerTimeout) do
5656
metrics.timing("work.#{self.class.name}.time") do
5757
deserialized_msg = ContentType.deserialize(msg, @content_type || metadata && metadata[:content_type])
58-
if @call_with_params
59-
res = work_with_params(deserialized_msg, delivery_info, metadata)
60-
else
61-
res = work(deserialized_msg)
58+
59+
app = -> (deserialized_msg, delivery_info, metadata, handler) do
60+
if @call_with_params
61+
work_with_params(deserialized_msg, delivery_info, metadata)
62+
else
63+
work(deserialized_msg)
64+
end
65+
end
66+
67+
middlewares = Sneakers.middleware.to_a
68+
block_to_call = middlewares.reverse.reduce(app) do |mem, h|
69+
h[:class].new(mem, *h[:args])
6270
end
71+
res = block_to_call.call(deserialized_msg, delivery_info, metadata, handler)
6372
end
6473
end
6574
rescue WorkerTimeout => ex

sneakers.gemspec

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,5 +37,6 @@ Gem::Specification.new do |gem|
3737
gem.add_development_dependency 'rake'
3838
gem.add_development_dependency 'minitest'
3939
gem.add_development_dependency 'guard'
40+
gem.add_development_dependency 'pry-byebug'
4041
end
4142

spec/sneakers/worker_spec.rb

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,61 @@ def with_test_queuefactory(ctx, ack=true, msg=nil, nowork=false)
411411
w.do_work(header, nil, "msg", handler)
412412
end
413413

414+
describe 'middleware' do
415+
let(:middleware) do
416+
Class.new do
417+
def initialize(app, *args)
418+
@app = app
419+
end
420+
421+
def call(deserialized_msg, delivery_info, metadata, handler)
422+
@app.call(deserialized_msg, delivery_info, metadata, handler)
423+
end
424+
end
425+
end
426+
427+
let(:worker) do
428+
Class.new do
429+
include Sneakers::Worker
430+
from_queue 'defaults', ack: false
431+
432+
def work_with_params(msg, delivery_info, metadata)
433+
msg
434+
end
435+
end
436+
end
437+
438+
before do
439+
Sneakers.middleware.use(middleware, 'args')
440+
441+
@delivery_info = Object.new
442+
@metadata = Object.new
443+
stub(@metadata).[](:content_type) { 'some/fake' }
444+
@message = Object.new
445+
@handler = Object.new
446+
end
447+
448+
after do
449+
Sneakers.middleware.delete(middleware)
450+
end
451+
452+
it 'should process job and call #work_with_params/#work' do
453+
w = worker.new(@queue, TestPool.new)
454+
mock(w).work_with_params(@message, @delivery_info, @metadata).once
455+
456+
w.do_work(@delivery_info, @metadata, @message, @handler)
457+
end
458+
459+
it "should call registered middleware" do
460+
mock.proxy(middleware).new(instance_of(Proc), 'args').once do |res|
461+
mock.proxy(res).call(@message, @delivery_info, @metadata, @handler).once
462+
end
463+
464+
w = worker.new(@queue, TestPool.new)
465+
w.do_work(@delivery_info, @metadata, @message, @handler)
466+
end
467+
end
468+
414469
describe "with ack" do
415470
before do
416471
@delivery_info = Object.new

spec/spec_helper.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
require 'bundler/setup'
22
require 'simplecov'
33
require 'resolv'
4+
require 'pry-byebug'
5+
46
SimpleCov.start do
57
add_filter "/spec/"
68
end

0 commit comments

Comments
 (0)