From b7030e3ba73e954a0457330c1ed064310bd7fcb3 Mon Sep 17 00:00:00 2001 From: Jason Ayre Date: Fri, 13 May 2016 16:24:12 -0600 Subject: [PATCH 01/20] add middleware stack for sake of allowing forking --- lib/action_subscriber/middleware/stack.rb | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 lib/action_subscriber/middleware/stack.rb diff --git a/lib/action_subscriber/middleware/stack.rb b/lib/action_subscriber/middleware/stack.rb new file mode 100644 index 0000000..35c56a1 --- /dev/null +++ b/lib/action_subscriber/middleware/stack.rb @@ -0,0 +1,18 @@ +require 'middleware/builder' + +module ActionSubscriber + module Middleware + class Stack < ::Middleware::Builder + def uses(*middlewares) + middlewares.each{ |middleware_args| use(*middleware_args) } + end + + #fork is better method name but fork is defined on object + def forked + forked_stack = self.class.new(:runner_class => @runner_class) + forked_stack.uses(*@stack) + forked_stack + end + end + end +end From 2e46a33bb1d9dada62dba334d076985d2e8b0ac4 Mon Sep 17 00:00:00 2001 From: Jason Ayre Date: Fri, 13 May 2016 17:37:23 -0600 Subject: [PATCH 02/20] fetch middleware --- lib/action_subscriber/middleware/env.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/action_subscriber/middleware/env.rb b/lib/action_subscriber/middleware/env.rb index bef420c..0aff581 100644 --- a/lib/action_subscriber/middleware/env.rb +++ b/lib/action_subscriber/middleware/env.rb @@ -13,7 +13,8 @@ class Env :message_id, :routing_key, :queue, - :subscriber + :subscriber, + :middleware ## # @param subscriber [Class] the class that will handle this message @@ -38,6 +39,7 @@ def initialize(subscriber, encoded_payload, properties) @queue = properties.fetch(:queue) @routing_key = properties.fetch(:routing_key) @subscriber = subscriber + @middleware = properties.fetch(:middleware) || ::ActionSubscriber.config.middleware end def acknowledge From 03ddfc73a92cb723e11b81217d3e6c559475a9f6 Mon Sep 17 00:00:00 2001 From: Jason Ayre Date: Fri, 13 May 2016 17:37:44 -0600 Subject: [PATCH 03/20] instantiate own middleware stack --- lib/action_subscriber/middleware.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/action_subscriber/middleware.rb b/lib/action_subscriber/middleware.rb index 883762d..6c33c1f 100644 --- a/lib/action_subscriber/middleware.rb +++ b/lib/action_subscriber/middleware.rb @@ -3,11 +3,12 @@ require "action_subscriber/middleware/error_handler" require "action_subscriber/middleware/router" require "action_subscriber/middleware/runner" +require "action_subscriber/middleware/stack" module ActionSubscriber module Middleware def self.initialize_stack - builder = ::Middleware::Builder.new(:runner_class => ::ActionSubscriber::Middleware::Runner) + builder = ::ActionSubscriber::Middleware::Stack.new(:runner_class => ::ActionSubscriber::Middleware::Runner) builder.use ErrorHandler builder.use Decoder From 946b3507f824b5b79fac972f57cc615c3ce688b1 Mon Sep 17 00:00:00 2001 From: Jason Ayre Date: Fri, 13 May 2016 17:38:38 -0600 Subject: [PATCH 04/20] routes can have their own middleware which can be enhanced with additional middlewares --- lib/action_subscriber/route.rb | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/action_subscriber/route.rb b/lib/action_subscriber/route.rb index cf7cd05..001cedb 100644 --- a/lib/action_subscriber/route.rb +++ b/lib/action_subscriber/route.rb @@ -2,13 +2,14 @@ module ActionSubscriber class Route attr_reader :acknowledgements, :action, - :durable, + :durable, :exchange, :prefetch, :queue, :routing_key, :subscriber, - :threadpool + :threadpool, + :middleware def initialize(attributes) @acknowledgements = attributes.fetch(:acknowledgements) @@ -20,6 +21,7 @@ def initialize(attributes) @routing_key = attributes.fetch(:routing_key) @subscriber = attributes.fetch(:subscriber) @threadpool = attributes.fetch(:threadpool) { ::ActionSubscriber::Threadpool.pool(:default) } + @middleware = attributes.fetch(:middleware) { ::ActionSubscriber.config.middleware.forked } end def acknowledgements? @@ -29,5 +31,9 @@ def acknowledgements? def queue_subscription_options { :manual_ack => acknowledgements? } end + + def use(*middleware_args) + @middleware.use(*middleware_args) + end end end From 69b18f27337617e449b41644d78d35399349cf69 Mon Sep 17 00:00:00 2001 From: Jason Ayre Date: Fri, 13 May 2016 17:39:24 -0600 Subject: [PATCH 05/20] allow for block when defining route so use can be used to add middlewares to route --- lib/action_subscriber/router.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/action_subscriber/router.rb b/lib/action_subscriber/router.rb index ce4e540..c27363c 100644 --- a/lib/action_subscriber/router.rb +++ b/lib/action_subscriber/router.rb @@ -39,11 +39,13 @@ def resource_name(route_settings) route_settings[:subscriber].name.underscore.gsub(/_subscriber/, "").to_s end - def route(subscriber, action, options = {}) + def route(subscriber, action, options = {}, &block) route_settings = DEFAULT_SETTINGS.merge(options).merge(:subscriber => subscriber, :action => action) route_settings[:routing_key] ||= default_routing_key_for(route_settings) route_settings[:queue] ||= default_queue_for(route_settings) - routes << Route.new(route_settings) + _route = Route.new(route_settings) + _route.instance_eval(&block) if block_given? + routes << _route end def routes From 0631d28098e852ee98d1e8c67eae61ef92fd2020 Mon Sep 17 00:00:00 2001 From: Jason Ayre Date: Fri, 13 May 2016 17:40:34 -0600 Subject: [PATCH 06/20] middleware gets passed with env --- lib/action_subscriber/bunny/subscriber.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/action_subscriber/bunny/subscriber.rb b/lib/action_subscriber/bunny/subscriber.rb index d4a1ebd..08c7716 100644 --- a/lib/action_subscriber/bunny/subscriber.rb +++ b/lib/action_subscriber/bunny/subscriber.rb @@ -33,6 +33,7 @@ def auto_pop! :message_id => nil, :routing_key => delivery_info.routing_key, :queue => queue.name, + :middleware => route.middleware } env = ::ActionSubscriber::Middleware::Env.new(route.subscriber, encoded_payload, properties) enqueue_env(route.threadpool, env) @@ -57,6 +58,7 @@ def auto_subscribe! :message_id => properties.message_id, :routing_key => delivery_info.routing_key, :queue => queue.name, + :middleware => route.middleware } env = ::ActionSubscriber::Middleware::Env.new(route.subscriber, encoded_payload, properties) enqueue_env(route.threadpool, env) From 96c94430d2e05d06c7b367d7a2d3dadaa5b20ad9 Mon Sep 17 00:00:00 2001 From: Jason Ayre Date: Fri, 13 May 2016 17:44:06 -0600 Subject: [PATCH 07/20] call middleware pulled from route not ActionSubscriber.config --- lib/action_subscriber/bunny/subscriber.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/action_subscriber/bunny/subscriber.rb b/lib/action_subscriber/bunny/subscriber.rb index 08c7716..69419fd 100644 --- a/lib/action_subscriber/bunny/subscriber.rb +++ b/lib/action_subscriber/bunny/subscriber.rb @@ -74,7 +74,7 @@ def enqueue_env(threadpool, env) logger.info "RECEIVED #{env.message_id} from #{env.queue}" threadpool.async(env) do |env| ::ActiveSupport::Notifications.instrument "process_event.action_subscriber", :subscriber => env.subscriber.to_s, :routing_key => env.routing_key, :queue => env.queue do - ::ActionSubscriber.config.middleware.call(env) + env.middleware.call(env) end end end From c085e4cb56ee2145b4358d8f5e86f57d67816733 Mon Sep 17 00:00:00 2001 From: Jason Ayre Date: Sat, 14 May 2016 14:29:11 -0600 Subject: [PATCH 08/20] fetch middleware for route --- lib/action_subscriber/middleware/env.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/action_subscriber/middleware/env.rb b/lib/action_subscriber/middleware/env.rb index 0aff581..c4327f5 100644 --- a/lib/action_subscriber/middleware/env.rb +++ b/lib/action_subscriber/middleware/env.rb @@ -39,7 +39,7 @@ def initialize(subscriber, encoded_payload, properties) @queue = properties.fetch(:queue) @routing_key = properties.fetch(:routing_key) @subscriber = subscriber - @middleware = properties.fetch(:middleware) || ::ActionSubscriber.config.middleware + @middleware = properties.fetch(:middleware) end def acknowledge From 80ce5a80be22d8d03f99526d5e317dbba749a77e Mon Sep 17 00:00:00 2001 From: Jason Ayre Date: Sat, 14 May 2016 14:30:15 -0600 Subject: [PATCH 09/20] just pass middleware klass for now to use as splatting not passing args correctly for some reason --- lib/action_subscriber/middleware/stack.rb | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/lib/action_subscriber/middleware/stack.rb b/lib/action_subscriber/middleware/stack.rb index 35c56a1..7a4f80b 100644 --- a/lib/action_subscriber/middleware/stack.rb +++ b/lib/action_subscriber/middleware/stack.rb @@ -3,14 +3,13 @@ module ActionSubscriber module Middleware class Stack < ::Middleware::Builder - def uses(*middlewares) - middlewares.each{ |middleware_args| use(*middleware_args) } - end - - #fork is better method name but fork is defined on object def forked forked_stack = self.class.new(:runner_class => @runner_class) - forked_stack.uses(*@stack) + + @stack.each do |middleware_args| + forked_stack.use(middleware_args.first) + end + forked_stack end end From c09babb2a00729933d015cdcd1b3b73a5b2a67af Mon Sep 17 00:00:00 2001 From: Jason Ayre Date: Sat, 14 May 2016 14:30:49 -0600 Subject: [PATCH 10/20] delegate middleware methods --- lib/action_subscriber/route.rb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/action_subscriber/route.rb b/lib/action_subscriber/route.rb index 001cedb..8753b9d 100644 --- a/lib/action_subscriber/route.rb +++ b/lib/action_subscriber/route.rb @@ -32,8 +32,9 @@ def queue_subscription_options { :manual_ack => acknowledgements? } end - def use(*middleware_args) - @middleware.use(*middleware_args) - end + delegate :use, :to => :middleware + delegate :insert, :to => :middleware + delegate :insert_after, :to => :middleware + delegate :insert_before, :to => :middleware end end From 4018f2542c23fd3e63956177bdf026ddd8de2850 Mon Sep 17 00:00:00 2001 From: Jason Ayre Date: Sun, 15 May 2016 08:18:18 -0600 Subject: [PATCH 11/20] routes can define a stack of middleware and use that, like a pheonix pipeline --- lib/action_subscriber/router.rb | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/lib/action_subscriber/router.rb b/lib/action_subscriber/router.rb index c27363c..9babc9b 100644 --- a/lib/action_subscriber/router.rb +++ b/lib/action_subscriber/router.rb @@ -6,12 +6,21 @@ def self.draw_routes(&block) router.routes end + # def self.stacks + # @_stacks ||= {} + # end + + DEFAULT_SETTINGS = { :acknowledgements => false, :durable => false, :exchange => "events", }.freeze + def initialize + @stacks ||= {} + end + def default_routing_key_for(route_settings) [ route_settings[:publisher], @@ -39,10 +48,15 @@ def resource_name(route_settings) route_settings[:subscriber].name.underscore.gsub(/_subscriber/, "").to_s end + def stack(name, &block) + @stacks[name] ||= ::ActionSubscriber.config.middleware.forked.instance_eval(&block) + end + def route(subscriber, action, options = {}, &block) route_settings = DEFAULT_SETTINGS.merge(options).merge(:subscriber => subscriber, :action => action) route_settings[:routing_key] ||= default_routing_key_for(route_settings) route_settings[:queue] ||= default_queue_for(route_settings) + route_settings[:middleware] = @stacks[options[:stack]] if options.key?(:stack) _route = Route.new(route_settings) _route.instance_eval(&block) if block_given? routes << _route From 29fd602bd35b58fa34616e97ee4f56fef6be017e Mon Sep 17 00:00:00 2001 From: Jason Ayre Date: Sun, 15 May 2016 09:21:08 -0600 Subject: [PATCH 12/20] fetch middleware or fork from config as default --- lib/action_subscriber/middleware/env.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/action_subscriber/middleware/env.rb b/lib/action_subscriber/middleware/env.rb index c4327f5..9a63502 100644 --- a/lib/action_subscriber/middleware/env.rb +++ b/lib/action_subscriber/middleware/env.rb @@ -39,7 +39,7 @@ def initialize(subscriber, encoded_payload, properties) @queue = properties.fetch(:queue) @routing_key = properties.fetch(:routing_key) @subscriber = subscriber - @middleware = properties.fetch(:middleware) + @middleware = properties.fetch(:middleware) { ::ActionSubscriber.config.middleware.forked } end def acknowledge From 4d1e03c7ed002bb5af22b716dc3cdd0bb6b77bde Mon Sep 17 00:00:00 2001 From: Jason Ayre Date: Sun, 15 May 2016 10:22:28 -0600 Subject: [PATCH 13/20] add spec for middleware stack --- .../action_subscriber/middleware/stack_spec.rb | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 spec/lib/action_subscriber/middleware/stack_spec.rb diff --git a/spec/lib/action_subscriber/middleware/stack_spec.rb b/spec/lib/action_subscriber/middleware/stack_spec.rb new file mode 100644 index 0000000..5417561 --- /dev/null +++ b/spec/lib/action_subscriber/middleware/stack_spec.rb @@ -0,0 +1,15 @@ +describe ActionSubscriber::Middleware::Stack do + subject { ::ActionSubscriber::Middleware.initialize_stack } + + context "#forked" do + let(:forked_stack) { subject.forked } + + it "duplicates the stack without modifying original" do + class A; end; + forked_stack.use(A) + expect(forked_stack.instance_variable_get(:@stack).object_id).to_not eq subject.instance_variable_get(:@stack).object_id + expect(forked_stack.instance_variable_get(:@stack).map(&:first)).to include(A) + expect(subject.instance_variable_get(:@stack).map(&:first)).to_not include(A) + end + end +end From a71fb51d7123e0017a73c0c411ae3df3134097b8 Mon Sep 17 00:00:00 2001 From: Jason Ayre Date: Sun, 15 May 2016 10:23:16 -0600 Subject: [PATCH 14/20] set stacks like routes for consistency --- lib/action_subscriber/router.rb | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/lib/action_subscriber/router.rb b/lib/action_subscriber/router.rb index 9babc9b..c4c8f83 100644 --- a/lib/action_subscriber/router.rb +++ b/lib/action_subscriber/router.rb @@ -6,21 +6,12 @@ def self.draw_routes(&block) router.routes end - # def self.stacks - # @_stacks ||= {} - # end - - DEFAULT_SETTINGS = { :acknowledgements => false, :durable => false, :exchange => "events", }.freeze - def initialize - @stacks ||= {} - end - def default_routing_key_for(route_settings) [ route_settings[:publisher], @@ -49,14 +40,18 @@ def resource_name(route_settings) end def stack(name, &block) - @stacks[name] ||= ::ActionSubscriber.config.middleware.forked.instance_eval(&block) + stacks[name] ||= ::ActionSubscriber.config.middleware.forked.instance_eval(&block) + end + + def stacks + @stacks ||= {} end def route(subscriber, action, options = {}, &block) route_settings = DEFAULT_SETTINGS.merge(options).merge(:subscriber => subscriber, :action => action) route_settings[:routing_key] ||= default_routing_key_for(route_settings) route_settings[:queue] ||= default_queue_for(route_settings) - route_settings[:middleware] = @stacks[options[:stack]] if options.key?(:stack) + route_settings[:middleware] = stacks[options[:stack]] if options.key?(:stack) _route = Route.new(route_settings) _route.instance_eval(&block) if block_given? routes << _route From ff56991c814fef24b2b30af95c1a62108d3e7936 Mon Sep 17 00:00:00 2001 From: Jason Ayre Date: Sun, 15 May 2016 10:23:57 -0600 Subject: [PATCH 15/20] fix forked stack to preserve args, just deep dup array and set ivar directly as use mangles args --- lib/action_subscriber/middleware/stack.rb | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/lib/action_subscriber/middleware/stack.rb b/lib/action_subscriber/middleware/stack.rb index 7a4f80b..19485e5 100644 --- a/lib/action_subscriber/middleware/stack.rb +++ b/lib/action_subscriber/middleware/stack.rb @@ -5,11 +5,7 @@ module Middleware class Stack < ::Middleware::Builder def forked forked_stack = self.class.new(:runner_class => @runner_class) - - @stack.each do |middleware_args| - forked_stack.use(middleware_args.first) - end - + forked_stack.instance_variable_set(:@stack, @stack.deep_dup) forked_stack end end From 00d56533e4f2a943e4a60a7cbdba559817ed61fe Mon Sep 17 00:00:00 2001 From: Jason Ayre Date: Sun, 15 May 2016 10:24:19 -0600 Subject: [PATCH 16/20] add router stack spec --- spec/lib/action_subscriber/router_spec.rb | 24 +++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/spec/lib/action_subscriber/router_spec.rb b/spec/lib/action_subscriber/router_spec.rb index 24eeee8..f8e013c 100644 --- a/spec/lib/action_subscriber/router_spec.rb +++ b/spec/lib/action_subscriber/router_spec.rb @@ -139,4 +139,28 @@ def dim; end expect(routes.last.subscriber).to eq(SparkleSubscriber) expect(routes.last.queue).to eq("alice.tommy.sparkle.dim") end + + it "can define a stack of middleware and use on a per route basis" do + class FakeMiddleware + def initialize(app) + @app = app + end + + def call(env) + env + end + end + + routes = described_class.draw_routes do + stack :fake_stack do + use FakeMiddleware + end + + route FakeSubscriber, :foo, :stack => :fake_stack + route FakeSubscriber, :bar + end + + expect(routes.first.middleware.instance_variable_get(:@stack).last.first).to eq(FakeMiddleware) + expect(routes.last.middleware.instance_variable_get(:@stack).last.first).to_not eq(FakeMiddleware) + end end From f2a90321dafa4be7ce9d5b10b70638a46d3fc19e Mon Sep 17 00:00:00 2001 From: Jason Ayre Date: Sun, 15 May 2016 13:09:26 -0600 Subject: [PATCH 17/20] add example of adding/applying middleware stack in routes --- lib/action_subscriber/middleware/stack.rb | 2 +- routing.md | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/lib/action_subscriber/middleware/stack.rb b/lib/action_subscriber/middleware/stack.rb index 19485e5..95a4a20 100644 --- a/lib/action_subscriber/middleware/stack.rb +++ b/lib/action_subscriber/middleware/stack.rb @@ -5,7 +5,7 @@ module Middleware class Stack < ::Middleware::Builder def forked forked_stack = self.class.new(:runner_class => @runner_class) - forked_stack.instance_variable_set(:@stack, @stack.deep_dup) + forked_stack.instance_variable_set(:@stack, @stack.dup) forked_stack end end diff --git a/routing.md b/routing.md index 246205a..a554692 100644 --- a/routing.md +++ b/routing.md @@ -38,9 +38,26 @@ The `route` method supports the following options: * `exchange` specify which exchange you expect messages to be published to (default `"events"`) * This is the equivalent of calling `exchange :actions` in your subscriber * `publisher` this will prefix your queue and routing key with the publishers name - * This is the equivalent of puting `publisher :foo` in your subscriber + * This is the equivalent of putting `publisher :foo` in your subscriber * `queue` specifies which queue you will subscribe to rather than letting ActionSubscriber infer it from the name of the subscriber and action * `routing_key` specifies the routing key that will be bound to your queue +* `stack` Lets you use a custom middleware stack you already defined using the stack method + +## Middleware Stacks + +This give you the ability to build and apply a middleware stack on a per route basis. + +``` ruby +::ActionSubscriber.draw_routes do + stack :resourceful do + use ParseResourcePayload + use LoadResource + end + + default_routes_for ::UserSubscriber + route ::NotificationSubscriber, :created, :publisher => :newman, :exchange => :events, :stack => :resourceful +end +```

Footnotes

From 9a05360c80d9f4ab4b2479f90be8ac078599695b Mon Sep 17 00:00:00 2001 From: Jason Ayre Date: Sun, 15 May 2016 16:35:33 -0600 Subject: [PATCH 18/20] call route specific middleware for march hare subscriber --- lib/action_subscriber/march_hare/subscriber.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/action_subscriber/march_hare/subscriber.rb b/lib/action_subscriber/march_hare/subscriber.rb index a6be0fd..c820ab9 100644 --- a/lib/action_subscriber/march_hare/subscriber.rb +++ b/lib/action_subscriber/march_hare/subscriber.rb @@ -29,6 +29,7 @@ def auto_pop! :message_id => metadata.message_id, :routing_key => metadata.routing_key, :queue => queue.name, + :middleware => route.middleware } env = ::ActionSubscriber::Middleware::Env.new(route.subscriber, encoded_payload, properties) enqueue_env(route.threadpool, env) @@ -54,6 +55,7 @@ def auto_subscribe! :message_id => metadata.message_id, :routing_key => metadata.routing_key, :queue => queue.name, + :middleware => route.middleware } env = ::ActionSubscriber::Middleware::Env.new(route.subscriber, encoded_payload, properties) enqueue_env(route.threadpool, env) @@ -73,7 +75,7 @@ def enqueue_env(threadpool, env) logger.info "RECEIVED #{env.message_id} from #{env.queue}" threadpool.async(env) do |env| ::ActiveSupport::Notifications.instrument "process_event.action_subscriber", :subscriber => env.subscriber.to_s, :routing_key => env.routing_key, :queue => env.queue do - ::ActionSubscriber.config.middleware.call(env) + env.middleware.call(env) end end end From 55124385630cbd91ff59020bf3dcee517aa5ae0d Mon Sep 17 00:00:00 2001 From: Jason Ayre Date: Sun, 15 May 2016 16:36:48 -0600 Subject: [PATCH 19/20] add hash accessors to env to as it mimics rack/makes middleware more powerful --- lib/action_subscriber/middleware/env.rb | 9 +++++++++ spec/lib/action_subscriber/middleware/env_spec.rb | 13 +++++++++++++ 2 files changed, 22 insertions(+) diff --git a/lib/action_subscriber/middleware/env.rb b/lib/action_subscriber/middleware/env.rb index 9a63502..5528b6f 100644 --- a/lib/action_subscriber/middleware/env.rb +++ b/lib/action_subscriber/middleware/env.rb @@ -42,6 +42,15 @@ def initialize(subscriber, encoded_payload, properties) @middleware = properties.fetch(:middleware) { ::ActionSubscriber.config.middleware.forked } end + #allow env to be get/set from outside, like rack middleware allows + def [](key) + instance_variable_get(:"@#{key}") + end + + def []=(key, value) + instance_variable_set(:"@#{key}", value) + end + def acknowledge acknowledge_multiple_messages = false @channel.ack(@delivery_tag, acknowledge_multiple_messages) diff --git a/spec/lib/action_subscriber/middleware/env_spec.rb b/spec/lib/action_subscriber/middleware/env_spec.rb index 2bdcaa6..334fb8e 100644 --- a/spec/lib/action_subscriber/middleware/env_spec.rb +++ b/spec/lib/action_subscriber/middleware/env_spec.rb @@ -25,6 +25,19 @@ specify { expect(subject.routing_key).to eq(properties[:routing_key]) } specify { expect(subject.queue).to eq(properties[:queue]) } + describe "#[]" do + it "gets instance variable" do + expect(subject[:action]).to eq :created + end + end + + describe "#[]=" do + it "sets instance variable" do + subject[:whatever] = :something + expect(subject[:whatever]).to eq :something + end + end + describe "#acknowledge" do it "sends an acknowledgement to rabbitmq" do expect(channel).to receive(:ack).with(properties[:delivery_tag], false) From cfe42abd24dc05eca7ef7407468be6cfd5c6863c Mon Sep 17 00:00:00 2001 From: Jason Ayre Date: Mon, 16 May 2016 15:15:28 -0600 Subject: [PATCH 20/20] add action_subscriber_routes load hook so plugin authors can define own behavior for a routing stack --- lib/action_subscriber/router.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/action_subscriber/router.rb b/lib/action_subscriber/router.rb index c4c8f83..5793e13 100644 --- a/lib/action_subscriber/router.rb +++ b/lib/action_subscriber/router.rb @@ -2,6 +2,7 @@ module ActionSubscriber class Router def self.draw_routes(&block) router = self.new + ::ActiveSupport.run_load_hooks(:action_subscriber_routes, router) router.instance_eval(&block) router.routes end