amqp-boilerplate 0.0.1 → 0.0.2

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.
data/.gitignore CHANGED
@@ -3,5 +3,7 @@
3
3
  *.swp
4
4
  .bundle
5
5
  .rvmrc
6
+ .yardoc
7
+ doc/*
6
8
  Gemfile.lock
7
9
  pkg/*
@@ -22,5 +22,6 @@ Gem::Specification.new do |s|
22
22
  # specify any dependencies here; for example:
23
23
  s.add_development_dependency "rake", "~> 0.9"
24
24
  s.add_development_dependency "rspec", "~> 2.6"
25
+ s.add_development_dependency "yard", "~> 0.7"
25
26
  s.add_runtime_dependency "amqp", "~> 0.8"
26
27
  end
@@ -5,6 +5,7 @@ module AMQP
5
5
  def amqp_queue(name=AMQ::Protocol::EMPTY_STRING, options={})
6
6
  @queue_name = name
7
7
  @queue_options = options
8
+ AMQP::Boilerplate.register_consumer(self)
8
9
  end
9
10
 
10
11
  def amqp_subscription(options={})
@@ -19,6 +20,8 @@ module AMQP
19
20
 
20
21
  queue = channel.queue(@queue_name, @queue_options)
21
22
  queue.subscribe(@subscription_options, &consumer.method(:handle_message))
23
+
24
+ AMQP::Boilerplate.logger.info("[#{self.name}.start] Started consumer '#{self.name}'")
22
25
  end
23
26
  end
24
27
 
@@ -0,0 +1,32 @@
1
+ module AMQP
2
+ module Boilerplate
3
+ module ConsumerRegistry
4
+ attr_writer :consumer_paths
5
+
6
+ def consumer_paths
7
+ @consumer_paths ||= []
8
+ end
9
+
10
+ def load_consumers
11
+ consumer_paths.each do |dir|
12
+ Dir[File.join(dir, "*.rb")].each {|f| require f}
13
+ end
14
+ end
15
+
16
+ def registry
17
+ @registry ||= []
18
+ end
19
+
20
+ def register_consumer(klass)
21
+ AMQP::Boilerplate.logger.info("[#{self.name}#register_consumer] Registered consumer '#{klass.name}'")
22
+ registry << klass
23
+ end
24
+
25
+ def start_consumers
26
+ registry.each do |consumer|
27
+ consumer.start
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -1,32 +1,84 @@
1
1
  module AMQP
2
2
  module Boilerplate
3
+ # Use this module to turn a class into a potential producer that can
4
+ # deliver messages to an AMQP exchange.
5
+ #
6
+ # @example Getting started
7
+ # class MyProducer
8
+ # extend AMQP::Boilerplate::Producer
9
+ #
10
+ # amqp :routing_key => "hello.world"
11
+ # amqp_message :message
12
+ #
13
+ # def message
14
+ # "Look! I am a string that will be posted to the exchange."
15
+ # end
16
+ # end
17
+ #
18
+ # @example Configuring exchange
19
+ # class MyProducer
20
+ # extend AMQP::Boilerplate::Producer
21
+ #
22
+ # amqp :routing_key => "hello.world"
23
+ # amqp_exchange :fanout, "amq.fanout", :durable => true
24
+ # amqp_message :message
25
+ #
26
+ # def message
27
+ # "Look! I am a string that will be posted to the exchange."
28
+ # end
29
+ # end
3
30
  module Producer
4
- def amqp(options={})
31
+ # Macro that sets up amqp for a class.
32
+ #
33
+ # @param [Hash] opts Options that will be passed to +AMQP::Exchange#publish
34
+ # @return [void]
35
+ def amqp(opts={})
5
36
  send :include, InstanceMethods
6
- @amqp_boilerplate_options = options
37
+ @amqp_boilerplate_options = opts
7
38
  end
8
39
 
9
- def amqp_exchange(type=:direct, name=AMQ::Protocol::EMPTY_STRING, options={})
10
- @amqp_boilerplate_exchange = [type, name, options]
40
+ # Configuration for the exchange to be used
41
+ #
42
+ # @param [Symbol] type Exchange type
43
+ # @param [String] name Exchange name
44
+ # @param [Hash] opts a customizable set of options
45
+ # @see AMQP::Exchange#initialize
46
+ # @return [void]
47
+ def amqp_exchange(type=:direct, name=AMQ::Protocol::EMPTY_STRING, opts={})
48
+ @amqp_boilerplate_exchange = [type, name, opts]
11
49
  end
12
50
 
51
+ # Choose the method that will return the actual message (payload) to be
52
+ # delivered to the exchange
53
+ #
54
+ # This method SHOULD return a string.
55
+ #
56
+ # @param [Symbol] method_name Name of method that generates message
57
+ # @return [void]
13
58
  def amqp_message(method_name)
14
59
  @amqp_boilerplate_message = method_name
15
60
  end
16
61
 
62
+ # TODO Can we do this in a nicer way?
17
63
  def amqp_boilerplate_options
18
64
  @amqp_boilerplate_options
19
65
  end
20
66
 
67
+ # TODO Can we do this in a nicer way?
21
68
  def amqp_boilerplate_exchange
22
69
  @amqp_boilerplate_exchange || amqp_exchange
23
70
  end
24
71
 
72
+ # TODO Can we do this in a nicer way?
25
73
  def amqp_boilerplate_message
26
74
  @amqp_boilerplate_message
27
75
  end
28
76
 
29
77
  module InstanceMethods
78
+ # Publishes a message to the exchange
79
+ #
80
+ # @see AMQP::Exchange#publish
81
+ # @return [void]
30
82
  def publish
31
83
  message = send(self.class.amqp_boilerplate_message.to_sym)
32
84
  exchange.publish(message, self.class.amqp_boilerplate_options) do
@@ -36,6 +88,11 @@ module AMQP
36
88
 
37
89
  private
38
90
 
91
+ # Instantiates a new exchange, additional configuration can be given
92
+ # through the +amqp_exchange+ class macro.
93
+ #
94
+ # @see AMQP::Exchange#initialize
95
+ # @return [AMQP::Exchange]
39
96
  def exchange
40
97
  AMQP::Exchange.new(AMQP.channel, *self.class.amqp_boilerplate_exchange)
41
98
  end
@@ -1,5 +1,5 @@
1
1
  module AMQP
2
2
  module Boilerplate
3
- VERSION = "0.0.1"
3
+ VERSION = "0.0.2"
4
4
  end
5
5
  end
@@ -1,17 +1,61 @@
1
1
  require 'amqp'
2
+ require 'amqp/utilities/event_loop_helper'
2
3
 
3
4
  require 'amqp/boilerplate/version'
4
5
 
5
6
  require 'amqp/boilerplate/consumer'
7
+ require 'amqp/boilerplate/consumer_registry'
6
8
  require 'amqp/boilerplate/logging'
7
9
  require 'amqp/boilerplate/producer'
8
10
 
9
11
  module AMQP
10
12
  module Boilerplate
13
+ extend ConsumerRegistry
11
14
  extend Logging
12
15
 
16
+ def self.boot
17
+ if defined?(PhusionPassenger)
18
+ PhusionPassenger.on_event(:starting_worker_process) do |forked|
19
+ if forked
20
+ amqp_thread = Thread.new {
21
+ AMQP::Boilerplate.start
22
+ }
23
+ amqp_thread.abort_on_exception = true
24
+ end
25
+ end
26
+ else
27
+ AMQP::Utilities::EventLoopHelper.run do
28
+ AMQP::Boilerplate.start
29
+ end
30
+ end
31
+
32
+ sleep(0.25)
33
+
34
+ AMQP::Boilerplate.logger.info("[#{self.name}.boot] Started AMQP (Server Type: #{AMQP::Utilities::EventLoopHelper.server_type})")
35
+
36
+ EventMachine.next_tick do
37
+ AMQP.channel ||= AMQP::Channel.new(AMQP.connection)
38
+
39
+ load_consumers
40
+ start_consumers
41
+ end
42
+ end
43
+
44
+ # TODO Documentation!
13
45
  def self.configure
14
46
  yield self if block_given?
15
47
  end
48
+
49
+ def self.connection_options
50
+ @connection_options
51
+ end
52
+
53
+ def self.connection_options=(options)
54
+ @connection_options = options
55
+ end
56
+
57
+ def self.start
58
+ AMQP.start self.connection_options
59
+ end
16
60
  end
17
61
  end
@@ -0,0 +1,72 @@
1
+ require 'spec_helper'
2
+
3
+ describe AMQP::Boilerplate::ConsumerRegistry do
4
+ before(:each) do
5
+ AMQP::Boilerplate.stub(:logger).and_return(mock.as_null_object)
6
+ end
7
+
8
+ describe "#consumer_paths" do
9
+ it "should be an Array" do
10
+ AMQP::Boilerplate.consumer_paths.should be_an(Array)
11
+ end
12
+
13
+ it "should always return the same Array" do
14
+ consumer_paths = AMQP::Boilerplate.consumer_paths
15
+ AMQP::Boilerplate.consumer_paths.should equal(consumer_paths)
16
+ end
17
+
18
+ it "should default to an empty Array" do
19
+ AMQP::Boilerplate.consumer_paths.should be_empty
20
+ end
21
+ end
22
+
23
+ describe "#load_consumers" do
24
+ before(:each) do
25
+ AMQP::Boilerplate.stub(:registry).and_return([])
26
+ end
27
+
28
+ it "should require all files in configured consumer_paths" do
29
+ AMQP::Boilerplate.consumer_paths << File.expand_path(File.join(File.dirname(__FILE__), '..', '..', "fixtures/consumers"))
30
+
31
+ defined?(DummyConsumer).should be_nil
32
+ AMQP::Boilerplate.load_consumers
33
+ defined?(DummyConsumer).should_not be_nil
34
+ end
35
+ end
36
+
37
+ describe "#register_consumer" do
38
+ before(:each) do
39
+ AMQP::Boilerplate.stub(:registry).and_return(Array.new)
40
+ end
41
+
42
+ it "should call #registry" do
43
+ AMQP::Boilerplate.should_receive(:registry).once
44
+ AMQP::Boilerplate.register_consumer(mock.as_null_object)
45
+ end
46
+
47
+ it "should add classes to registry" do
48
+ expect {
49
+ AMQP::Boilerplate.register_consumer(mock.as_null_object)
50
+ }.to change(AMQP::Boilerplate.registry, :size).by(1)
51
+ end
52
+ end
53
+
54
+ describe "#registry" do
55
+ it "should return an Array" do
56
+ AMQP::Boilerplate.registry.should be_an(Array)
57
+ end
58
+
59
+ it "should always return the same array" do
60
+ registry = AMQP::Boilerplate.registry
61
+ AMQP::Boilerplate.registry.should equal(registry)
62
+ end
63
+ end
64
+
65
+ describe "#start_consumers" do
66
+ it "should call .start on all registered consumer classes" do
67
+ FooConsumer.should_receive(:start)
68
+ BarConsumer.should_receive(:start)
69
+ AMQP::Boilerplate.start_consumers
70
+ end
71
+ end
72
+ end
@@ -1,16 +1,9 @@
1
1
  require 'spec_helper'
2
2
 
3
- class DummyConsumer < AMQP::Boilerplate::Consumer
4
- amqp_queue "queue.name.here", :durable => true
5
- amqp_subscription :ack => true
6
- end
7
-
8
- class FooConsumer < AMQP::Boilerplate::Consumer
9
- amqp_queue
10
- end
11
-
3
+ # NOTE See spec_helper for Consumer definitions
12
4
  describe AMQP::Boilerplate::Consumer do
13
5
  before(:each) do
6
+ AMQP::Boilerplate.stub(:logger).and_return(mock.as_null_object)
14
7
  @channel = mock(AMQP::Channel)
15
8
  @channel.stub(:on_error).and_return(true)
16
9
  end
@@ -21,9 +14,9 @@ describe AMQP::Boilerplate::Consumer do
21
14
  end
22
15
 
23
16
  it "should log the code and message" do
24
- AMQP::Boilerplate.logger.should_receive(:error).with("[DummyConsumer#handle_channel_error] Code = #{@channel_close.reply_code}, message = #{@channel_close.reply_text}")
17
+ AMQP::Boilerplate.logger.should_receive(:error).with("[BarConsumer#handle_channel_error] Code = #{@channel_close.reply_code}, message = #{@channel_close.reply_text}")
25
18
 
26
- DummyConsumer.new.handle_channel_error(@channel, @channel_close)
19
+ BarConsumer.new.handle_channel_error(@channel, @channel_close)
27
20
  end
28
21
  end
29
22
 
@@ -58,8 +51,8 @@ describe AMQP::Boilerplate::Consumer do
58
51
 
59
52
  describe ".start" do
60
53
  before(:each) do
61
- @consumer = DummyConsumer.new
62
- DummyConsumer.stub(:new).and_return(@consumer)
54
+ @consumer = BarConsumer.new
55
+ BarConsumer.stub(:new).and_return(@consumer)
63
56
 
64
57
  AMQP.stub(:channel).and_return(@channel)
65
58
 
@@ -70,32 +63,32 @@ describe AMQP::Boilerplate::Consumer do
70
63
 
71
64
  it "should use a channel" do
72
65
  AMQP.should_receive(:channel).and_return(@channel)
73
- DummyConsumer.start
66
+ BarConsumer.start
74
67
  end
75
68
 
76
69
  it "should instantiate a consumer" do
77
- DummyConsumer.should_receive(:new).and_return(@consumer)
78
- DummyConsumer.start
70
+ BarConsumer.should_receive(:new).and_return(@consumer)
71
+ BarConsumer.start
79
72
  end
80
73
 
81
74
  it "should register a channel error handler" do
82
75
  @channel.should_receive(:on_error)
83
- DummyConsumer.start
76
+ BarConsumer.start
84
77
  end
85
78
 
86
79
  it "should instantiate a queue with the proper queue name" do
87
80
  @channel.should_receive(:queue).with("queue.name.here", anything)
88
- DummyConsumer.start
81
+ BarConsumer.start
89
82
  end
90
83
 
91
84
  it "should instantiate a queue provided with options" do
92
85
  @channel.should_receive(:queue).with(anything, :durable => true)
93
- DummyConsumer.start
86
+ BarConsumer.start
94
87
  end
95
88
 
96
89
  it "should subscribe to the queue" do
97
90
  @queue.should_receive(:subscribe).with(:ack => true)
98
- DummyConsumer.start
91
+ BarConsumer.start
99
92
  end
100
93
  end
101
94
  end
@@ -9,7 +9,7 @@ describe AMQP::Boilerplate::Logging do
9
9
  describe "#logger" do
10
10
  it "should set the logger to use" do
11
11
  MyLogger = Class.new
12
- AMQP::Boilerplate.logger = MyLogger # { |config| config.logger = MyLogger }
12
+ AMQP::Boilerplate.logger = MyLogger
13
13
  AMQP::Boilerplate.logger.should == MyLogger
14
14
  end
15
15
 
@@ -1,28 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- class DummyProducer
4
- extend AMQP::Boilerplate::Producer
5
-
6
- amqp :routing_key => "some.routing.key"
7
- amqp_exchange :fanout, "amq.fanout", { :durable => true }
8
- amqp_message :message
9
-
10
- def message
11
- "hello world!"
12
- end
13
- end
14
-
15
- class FooProducer
16
- extend AMQP::Boilerplate::Producer
17
-
18
- amqp :routing_key => "another.routing.key"
19
- amqp_message :some_method
20
-
21
- def some_method
22
- 'Foo Bar'
23
- end
24
- end
25
-
3
+ # NOTE See spec_helper for Producer definitions
26
4
  describe AMQP::Boilerplate::Producer do
27
5
  before(:each) do
28
6
  AMQP::Boilerplate.stub(:logger).and_return(mock.as_null_object)
@@ -31,7 +9,7 @@ describe AMQP::Boilerplate::Producer do
31
9
  @exchange.stub(:publish).and_yield
32
10
  AMQP::Exchange.stub!(:new).and_return(@exchange)
33
11
 
34
- @producer = DummyProducer.new
12
+ @producer = BarProducer.new
35
13
  end
36
14
 
37
15
  describe ".amqp_exchange" do
@@ -63,11 +41,11 @@ describe AMQP::Boilerplate::Producer do
63
41
  end
64
42
 
65
43
  it "should pass options to AMQP::Exchange#publish" do
66
- DummyProducer.amqp({ :routing_key => "some.routing.key", :mandatory => true })
44
+ BarProducer.amqp({ :routing_key => "some.routing.key", :mandatory => true })
67
45
  @exchange.should_receive(:publish).with(@producer.message, :routing_key => "some.routing.key", :mandatory => true)
68
46
  @producer.publish
69
47
 
70
- DummyProducer.amqp({ :routing_key => "some.routing.key", :mandatory => true, :immediate => true })
48
+ BarProducer.amqp({ :routing_key => "some.routing.key", :mandatory => true, :immediate => true })
71
49
  @exchange.should_receive(:publish).with(@producer.message, :routing_key => "some.routing.key", :mandatory => true, :immediate => true)
72
50
  @producer.publish
73
51
  end
@@ -89,7 +67,7 @@ describe AMQP::Boilerplate::Producer do
89
67
  end
90
68
 
91
69
  it "should use defaults for exchange configuration" do
92
- DummyProducer.amqp_exchange()
70
+ BarProducer.amqp_exchange()
93
71
 
94
72
  AMQP::Exchange.should_receive(:new).with(@channel, :direct, AMQ::Protocol::EMPTY_STRING, {})
95
73
  @producer.publish
@@ -1,6 +1,62 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe AMQP::Boilerplate do
4
+ describe ".boot" do
5
+ before(:each) do
6
+ AMQP::Boilerplate.stub(:logger).and_return(mock.as_null_object)
7
+
8
+ EventMachine.stub(:next_tick).and_yield
9
+
10
+ AMQP::Boilerplate.stub(:start_consumers)
11
+ AMQP::Boilerplate.stub(:load_consumers)
12
+ end
13
+
14
+ it "should load all consumers" do
15
+ AMQP::Boilerplate.should_receive(:load_consumers)
16
+ AMQP::Boilerplate.boot
17
+ end
18
+
19
+ it "should start all consumers" do
20
+ AMQP::Boilerplate.should_receive(:start_consumers)
21
+ AMQP::Boilerplate.boot
22
+ end
23
+
24
+ it "should connect to AMQP" do
25
+ AMQP::Boilerplate.should_receive(:start)
26
+ AMQP::Boilerplate.boot
27
+ end
28
+
29
+ describe "when using passenger" do
30
+ before(:each) do
31
+ PhusionPassenger = Class.new
32
+ PhusionPassenger.stub(:on_event).and_yield(true)
33
+
34
+ @thread = mock(Thread, :abort_on_exception= => nil)
35
+ Thread.stub(:new).and_yield.and_return(@thread)
36
+ end
37
+
38
+ # Don't try this at home!
39
+ after(:each) do
40
+ Object.send(:remove_const, "PhusionPassenger")
41
+ end
42
+
43
+ it "should register to starting_worker_process event" do
44
+ PhusionPassenger.should_receive(:on_event).with(:starting_worker_process)
45
+ AMQP::Boilerplate.boot
46
+ end
47
+
48
+ it "should start new thread after process forked" do
49
+ Thread.should_receive(:new)
50
+ AMQP::Boilerplate.boot
51
+ end
52
+
53
+ it "should abort thread on exception" do
54
+ @thread.should_receive(:abort_on_exception=).with(true)
55
+ AMQP::Boilerplate.boot
56
+ end
57
+ end
58
+ end
59
+
4
60
  describe ".configure" do
5
61
  after(:each) do
6
62
  AMQP::Boilerplate.logger = nil
@@ -11,5 +67,30 @@ describe AMQP::Boilerplate do
11
67
  AMQP::Boilerplate.configure { |config| config.logger = MyFunkyLogger }
12
68
  AMQP::Boilerplate.logger.should == MyFunkyLogger
13
69
  end
70
+
71
+ it "should let us choose where consumers can be found" do
72
+ consumer_path = 'app/consumers'
73
+ AMQP::Boilerplate.configure { |config| config.consumer_paths << consumer_path }
74
+ AMQP::Boilerplate.consumer_paths.should include(consumer_path)
75
+ end
76
+
77
+ it "should allow us to set connection options" do
78
+ connection_options = { :host => "localhost", :port => 5672 }
79
+ AMQP::Boilerplate.configure { |config| config.connection_options = connection_options }
80
+ AMQP::Boilerplate.connection_options.should == connection_options
81
+ end
82
+ end
83
+
84
+ describe ".start" do
85
+ it "should start AMQP" do
86
+ AMQP.should_receive(:start)
87
+ AMQP::Boilerplate.start
88
+ end
89
+
90
+ it "should use the connection options" do
91
+ AMQP::Boilerplate.connection_options = { :host => "localhost", :port => 5672 }
92
+ AMQP.should_receive(:start).with(AMQP::Boilerplate.connection_options)
93
+ AMQP::Boilerplate.start
94
+ end
14
95
  end
15
96
  end
@@ -0,0 +1,3 @@
1
+ class DummyConsumer < AMQP::Boilerplate::Consumer
2
+ amqp_queue
3
+ end
data/spec/spec_helper.rb CHANGED
@@ -5,3 +5,38 @@ require 'amqp/boilerplate'
5
5
  RSpec.configure do |c|
6
6
  c.mock_with :rspec
7
7
  end
8
+
9
+ # "Test" consumers
10
+ class FooConsumer < AMQP::Boilerplate::Consumer
11
+ amqp_queue
12
+ end
13
+
14
+ class BarConsumer < AMQP::Boilerplate::Consumer
15
+ amqp_queue "queue.name.here", :durable => true
16
+ amqp_subscription :ack => true
17
+ end
18
+
19
+ # "Test" producers
20
+ class FooProducer
21
+ extend AMQP::Boilerplate::Producer
22
+
23
+ amqp :routing_key => "another.routing.key"
24
+ amqp_message :some_method
25
+
26
+ def some_method
27
+ 'Foo Bar'
28
+ end
29
+ end
30
+
31
+ class BarProducer
32
+ extend AMQP::Boilerplate::Producer
33
+
34
+ amqp :routing_key => "some.routing.key"
35
+ amqp_exchange :fanout, "amq.fanout", { :durable => true }
36
+ amqp_message :message
37
+
38
+ def message
39
+ "hello world!"
40
+ end
41
+ end
42
+
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: amqp-boilerplate
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 27
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 1
10
- version: 0.0.1
9
+ - 2
10
+ version: 0.0.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Patrick Baselier
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2011-09-12 00:00:00 +02:00
19
+ date: 2011-09-13 00:00:00 +02:00
20
20
  default_executable:
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency
@@ -49,10 +49,25 @@ dependencies:
49
49
  version: "2.6"
50
50
  prerelease: false
51
51
  requirement: *id002
52
+ - !ruby/object:Gem::Dependency
53
+ name: yard
54
+ type: :development
55
+ version_requirements: &id003 !ruby/object:Gem::Requirement
56
+ none: false
57
+ requirements:
58
+ - - ~>
59
+ - !ruby/object:Gem::Version
60
+ hash: 5
61
+ segments:
62
+ - 0
63
+ - 7
64
+ version: "0.7"
65
+ prerelease: false
66
+ requirement: *id003
52
67
  - !ruby/object:Gem::Dependency
53
68
  name: amqp
54
69
  type: :runtime
55
- version_requirements: &id003 !ruby/object:Gem::Requirement
70
+ version_requirements: &id004 !ruby/object:Gem::Requirement
56
71
  none: false
57
72
  requirements:
58
73
  - - ~>
@@ -63,7 +78,7 @@ dependencies:
63
78
  - 8
64
79
  version: "0.8"
65
80
  prerelease: false
66
- requirement: *id003
81
+ requirement: *id004
67
82
  description: Collection of modules that aid in setting up AMQP producers and consumers.
68
83
  email:
69
84
  - patrick@kabisa.nl
@@ -84,13 +99,16 @@ files:
84
99
  - lib/amqp-boilerplate.rb
85
100
  - lib/amqp/boilerplate.rb
86
101
  - lib/amqp/boilerplate/consumer.rb
102
+ - lib/amqp/boilerplate/consumer_registry.rb
87
103
  - lib/amqp/boilerplate/logging.rb
88
104
  - lib/amqp/boilerplate/producer.rb
89
105
  - lib/amqp/boilerplate/version.rb
106
+ - spec/amqp/boilerplate/consumer_registry_spec.rb
90
107
  - spec/amqp/boilerplate/consumer_spec.rb
91
108
  - spec/amqp/boilerplate/logging_spec.rb
92
109
  - spec/amqp/boilerplate/producer_spec.rb
93
110
  - spec/amqp/boilerplate_spec.rb
111
+ - spec/fixtures/consumers/dummy_consumer.rb
94
112
  - spec/spec_helper.rb
95
113
  has_rdoc: true
96
114
  homepage: ""
@@ -127,8 +145,10 @@ signing_key:
127
145
  specification_version: 3
128
146
  summary: Helper modules for quickly setting up AMQP producers/consumers
129
147
  test_files:
148
+ - spec/amqp/boilerplate/consumer_registry_spec.rb
130
149
  - spec/amqp/boilerplate/consumer_spec.rb
131
150
  - spec/amqp/boilerplate/logging_spec.rb
132
151
  - spec/amqp/boilerplate/producer_spec.rb
133
152
  - spec/amqp/boilerplate_spec.rb
153
+ - spec/fixtures/consumers/dummy_consumer.rb
134
154
  - spec/spec_helper.rb