bmabey-rosetta_queue 0.2.0 → 0.3.3

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.
Files changed (59) hide show
  1. data/History.txt +6 -3
  2. data/README.rdoc +1 -193
  3. data/Rakefile +7 -1
  4. data/cucumber.yml +1 -1
  5. data/examples/sample_amqp_consumer.rb +13 -3
  6. data/examples/sample_amqp_fanout_consumer.rb +6 -3
  7. data/examples/sample_amqp_fanout_producer.rb +3 -2
  8. data/examples/sample_amqp_producer.rb +2 -1
  9. data/features/filtering.feature +13 -13
  10. data/features/messaging.feature +28 -20
  11. data/features/step_definitions/common_messaging_steps.rb +54 -17
  12. data/features/step_definitions/filtering_steps.rb +2 -2
  13. data/features/step_definitions/point_to_point_steps.rb +19 -9
  14. data/features/step_definitions/publish_subscribe_steps.rb +22 -8
  15. data/features/support/env.rb +2 -0
  16. data/features/support/sample_consumers.rb +6 -6
  17. data/lib/rosetta_queue.rb +1 -0
  18. data/lib/rosetta_queue/adapter.rb +6 -6
  19. data/lib/rosetta_queue/adapters/amqp.rb +6 -3
  20. data/lib/rosetta_queue/adapters/amqp_evented.rb +22 -22
  21. data/lib/rosetta_queue/adapters/amqp_synch.rb +42 -36
  22. data/lib/rosetta_queue/adapters/base.rb +3 -3
  23. data/lib/rosetta_queue/adapters/beanstalk.rb +5 -5
  24. data/lib/rosetta_queue/adapters/fake.rb +5 -5
  25. data/lib/rosetta_queue/adapters/null.rb +9 -9
  26. data/lib/rosetta_queue/adapters/stomp.rb +25 -12
  27. data/lib/rosetta_queue/base.rb +2 -2
  28. data/lib/rosetta_queue/consumer.rb +4 -4
  29. data/lib/rosetta_queue/consumer_managers/base.rb +8 -6
  30. data/lib/rosetta_queue/consumer_managers/evented.rb +5 -5
  31. data/lib/rosetta_queue/consumer_managers/threaded.rb +4 -4
  32. data/lib/rosetta_queue/core_ext/string.rb +3 -3
  33. data/lib/rosetta_queue/core_ext/time.rb +20 -0
  34. data/lib/rosetta_queue/destinations.rb +6 -6
  35. data/lib/rosetta_queue/filters.rb +8 -8
  36. data/lib/rosetta_queue/logger.rb +2 -2
  37. data/lib/rosetta_queue/message_handler.rb +10 -4
  38. data/lib/rosetta_queue/producer.rb +2 -2
  39. data/lib/rosetta_queue/spec_helpers/hash.rb +3 -3
  40. data/lib/rosetta_queue/spec_helpers/helpers.rb +8 -8
  41. data/lib/rosetta_queue/spec_helpers/publishing_matchers.rb +26 -26
  42. data/spec/rosetta_queue/adapter_spec.rb +27 -27
  43. data/spec/rosetta_queue/adapters/amqp_synchronous_spec.rb +21 -1
  44. data/spec/rosetta_queue/adapters/beanstalk_spec.rb +3 -3
  45. data/spec/rosetta_queue/adapters/fake_spec.rb +6 -6
  46. data/spec/rosetta_queue/adapters/null_spec.rb +5 -5
  47. data/spec/rosetta_queue/adapters/shared_adapter_behavior.rb +4 -4
  48. data/spec/rosetta_queue/adapters/shared_fanout_behavior.rb +1 -1
  49. data/spec/rosetta_queue/adapters/stomp_spec.rb +39 -18
  50. data/spec/rosetta_queue/consumer_managers/evented_spec.rb +6 -6
  51. data/spec/rosetta_queue/consumer_managers/shared_manager_behavior.rb +3 -3
  52. data/spec/rosetta_queue/consumer_managers/threaded_spec.rb +5 -5
  53. data/spec/rosetta_queue/consumer_spec.rb +13 -13
  54. data/spec/rosetta_queue/core_ext/string_spec.rb +3 -3
  55. data/spec/rosetta_queue/destinations_spec.rb +8 -8
  56. data/spec/rosetta_queue/filters_spec.rb +16 -16
  57. data/spec/rosetta_queue/producer_spec.rb +15 -15
  58. data/spec/rosetta_queue/shared_messaging_behavior.rb +6 -6
  59. metadata +3 -2
@@ -95,7 +95,7 @@ module RosettaQueue::Gateway
95
95
 
96
96
  before(:each) do
97
97
  @queue = mock("Bunny::Queue", :pop => @msg, :publish => true, :unsubscribe => true)
98
- Bunny.stub!(:new).and_return(@conn = mock("Bunny::Client", :queue => @queue, :exchange => @exchange, :status => :connected))
98
+ Bunny.stub!(:new).and_return(@conn = mock("Bunny::Client", :queue => @queue, :exchange => @exchange, :status => :connected, :stop => nil))
99
99
  @queue.stub!(:subscribe).and_yield(@msg)
100
100
  @handler = mock("handler", :on_message => true, :destination => :foo)
101
101
  @exchange = SynchExchange::DirectExchange.new({:user => 'user', :password => 'pass', :host => 'host', :opts => {:vhost => "foo"}})
@@ -251,6 +251,26 @@ module RosettaQueue::Gateway
251
251
  # end
252
252
  # end
253
253
 
254
+ # describe SynchExchange::AmqpAdapterProxy do
255
+
256
+ # before(:each) do
257
+ # @queue = mock("Queue", :ack => nil)
258
+ # @proxy = SynchExchange::AmqpAdapterProxy.new(@queue)
259
+ # end
260
+
261
+ # context "#ack" do
262
+
263
+ # it "should delegate to AMQP queue object" do
264
+ # # expect
265
+ # @queue.should_receive(:ack)
266
+
267
+ # # when
268
+ # @proxy.ack
269
+ # end
270
+
271
+ # end
272
+ # end
273
+
254
274
  end
255
275
  end
256
276
  end
@@ -23,7 +23,7 @@ module RosettaQueue
23
23
  def do_receiving_once
24
24
  @adapter.receive_once
25
25
  end
26
-
26
+
27
27
  it "should delete messages once received" do
28
28
  when_receiving_once {
29
29
  @msg_obj.should_receive(:delete)
@@ -37,11 +37,11 @@ module RosettaQueue
37
37
  end
38
38
 
39
39
  it "should delete message during receive" do
40
- when_receiving {
40
+ when_receiving {
41
41
  @msg_obj.should_receive(:delete)
42
42
  }
43
43
  end
44
- end
44
+ end
45
45
  end
46
46
  end
47
47
  end
@@ -3,7 +3,7 @@ require 'rosetta_queue/adapters/fake'
3
3
 
4
4
  module RosettaQueue
5
5
  module Gateway
6
-
6
+
7
7
  describe FakeAdapter do
8
8
 
9
9
  describe "#queues" do
@@ -16,7 +16,7 @@ module RosettaQueue
16
16
  adapter.queues.should == ['queue 1', 'queue 2']
17
17
  end
18
18
  end
19
-
19
+
20
20
  describe "#messages_sent_to" do
21
21
 
22
22
  it "should return the message bodies that were delivered to the specified queue" do
@@ -41,7 +41,7 @@ module RosettaQueue
41
41
  # then
42
42
  adapter.messages_sent_to('queue').should == ['Filtered Message']
43
43
  end
44
-
44
+
45
45
  it "should return all the message's bodies when nil is passed in at the queue" do
46
46
  # given
47
47
  adapter = FakeAdapter.new
@@ -52,7 +52,7 @@ module RosettaQueue
52
52
  # then
53
53
  results.should == ['message 1', 'message 2']
54
54
  end
55
-
55
+
56
56
  it "should return an empty array when no messages have been delivered" do
57
57
  # given
58
58
  adapter = FakeAdapter.new
@@ -62,11 +62,11 @@ module RosettaQueue
62
62
  # then
63
63
  results.should == []
64
64
  end
65
-
65
+
66
66
  end
67
67
 
68
68
  end
69
-
69
+
70
70
  end
71
71
 
72
72
  end
@@ -6,25 +6,25 @@ module RosettaQueue
6
6
 
7
7
 
8
8
  describe NullAdapter do
9
-
9
+
10
10
  def null_adapter
11
11
  NullAdapter.new({:user => 'user', :password => 'password', :host => 'host', :port => 'port'})
12
12
  end
13
-
13
+
14
14
  %w[disconnect receive receive_with send_message subscribe unsubscribe].each do |adapter_method|
15
15
  it "should respond to ##{adapter_method}" do
16
16
  null_adapter.should respond_to(adapter_method)
17
17
  end
18
18
  end
19
-
19
+
20
20
  it "should raise an error when #receive is called" do
21
21
  running { null_adapter.receive }.should raise_error
22
22
  end
23
-
23
+
24
24
  it "should raise an error when #receive_with is called" do
25
25
  running { null_adapter.receive_with('consumer') }.should raise_error
26
26
  end
27
-
27
+
28
28
  end
29
29
 
30
30
  end
@@ -14,7 +14,7 @@ module RosettaQueue
14
14
  def do_receiving_with_handler
15
15
  @adapter.receive_with(@handler)
16
16
  end
17
-
17
+
18
18
  describe "#receive_once" do
19
19
 
20
20
  it "should return the message from the connection" do
@@ -22,7 +22,7 @@ module RosettaQueue
22
22
  end
23
23
 
24
24
  end
25
-
25
+
26
26
  describe "#receive_with" do
27
27
 
28
28
  it "should look up the destination defined on the class" do
@@ -30,9 +30,9 @@ module RosettaQueue
30
30
  Destinations.should_receive(:lookup).with(:foo).and_return("foo")
31
31
  }
32
32
  end
33
-
33
+
34
34
  end
35
-
35
+
36
36
  end
37
37
  end
38
38
  end
@@ -8,7 +8,7 @@ module RosettaQueue
8
8
  # @channel.should_receive(:fanout).with(@exchange).and_return(@bound_queue)
9
9
  # }
10
10
  # end
11
-
11
+
12
12
  it "should bind to fanout exchange" do
13
13
  when_receiving_exchange {
14
14
  @queue.should_receive(:bind).with(@exchange).and_return(@bound_queue)
@@ -18,7 +18,7 @@ module RosettaQueue
18
18
  end
19
19
 
20
20
  it_should_behave_like "an adapter"
21
-
21
+
22
22
  describe "#send_message" do
23
23
  it "should delegate to the connection" do
24
24
  # need this hack since the stomp client overrides #send
@@ -26,9 +26,9 @@ module RosettaQueue
26
26
  @args = args
27
27
  end
28
28
  def @conn.sent_args ; @args end
29
-
29
+
30
30
  after_publishing {
31
- @conn.sent_args.should == ['queue', 'message', 'options']
31
+ @conn.sent_args.should == ['queue', 'message', 'options']
32
32
  }
33
33
  end
34
34
  end
@@ -38,16 +38,16 @@ module RosettaQueue
38
38
  def do_receiving_once
39
39
  @adapter.receive_once("/queue/foo", {:persistent => false})
40
40
  end
41
-
41
+
42
42
  it "should subscribe to queue" do
43
- when_receiving_once {
44
- @conn.should_receive("subscribe").with("/queue/foo", {:persistent => false})
43
+ when_receiving_once {
44
+ @conn.should_receive("subscribe").with("/queue/foo", {:persistent => false})
45
45
  }
46
46
  end
47
-
47
+
48
48
  it "should unsubscribe from queue" do
49
- when_receiving_once {
50
- @conn.should_receive("unsubscribe").with("/queue/foo")
49
+ when_receiving_once {
50
+ @conn.should_receive("unsubscribe").with("/queue/foo")
51
51
  }
52
52
  end
53
53
  end
@@ -64,8 +64,8 @@ module RosettaQueue
64
64
  when_receiving_with_handler {
65
65
  @conn.should_receive(:ack)
66
66
  }
67
- end
68
-
67
+ end
68
+
69
69
  describe "no ack" do
70
70
 
71
71
  before(:each) do
@@ -74,15 +74,15 @@ module RosettaQueue
74
74
 
75
75
  it "should not acknowledge client" do
76
76
  when_receiving_with_handler {
77
- @conn.should_not_receive(:ack)
77
+ @conn.should_not_receive(:ack)
78
78
  }
79
- end
79
+ end
80
80
 
81
- end
81
+ end
82
82
  end
83
-
83
+
84
84
  describe "disconnect" do
85
-
85
+
86
86
  def do_disconnecting
87
87
  @adapter.disconnect(@handler)
88
88
  end
@@ -98,8 +98,29 @@ module RosettaQueue
98
98
  @conn.should_receive("disconnect")
99
99
  }
100
100
  end
101
-
102
- end
101
+
102
+ end
103
+
104
+ describe StompAdapterProxy do
105
+
106
+ before(:each) do
107
+ @adapter = mock("StompAdapter", :ack => nil)
108
+ @proxy = StompAdapterProxy.new(@adapter, "foo")
109
+ end
110
+
111
+ context "#ack" do
112
+
113
+ it "should delegate to AMQP queue object" do
114
+ # expect
115
+ @adapter.should_receive(:ack).with("foo")
116
+
117
+ # when
118
+ @proxy.ack
119
+ end
120
+
121
+ end
122
+ end
123
+
103
124
  end
104
125
  end
105
126
  end
@@ -7,7 +7,7 @@ module RosettaQueue
7
7
 
8
8
  before(:each) do
9
9
  Stomp::Connection.stub!(:open).and_return(nil)
10
- @consumer = mock("test_consumer_1", :receive => true,
10
+ @consumer = mock("test_consumer_1", :receive => true,
11
11
  :connection => mock("AmqpAdapter", :subscribe => true, :unsubscribe => nil, :disconnect => nil),
12
12
  :unsubscribe => true, :disconnect => true)
13
13
  Consumer.stub!(:new).and_return(@consumer)
@@ -24,7 +24,7 @@ module RosettaQueue
24
24
  end
25
25
 
26
26
  describe "starting" do
27
-
27
+
28
28
  def do_process
29
29
  @manager.start
30
30
  end
@@ -34,7 +34,7 @@ module RosettaQueue
34
34
  @manager.consumers.each_value { |cons| cons.should_receive(:receive) }
35
35
  }
36
36
  end
37
-
37
+
38
38
  end
39
39
 
40
40
  describe "stopping" do
@@ -42,15 +42,15 @@ module RosettaQueue
42
42
  def do_process
43
43
  @manager.stop
44
44
  end
45
-
45
+
46
46
  it "should stop consumers" do
47
47
  during_process {
48
48
  EM.should_receive(:stop)
49
49
  }
50
50
  end
51
-
51
+
52
52
  end
53
53
 
54
54
  end
55
55
  end
56
- end
56
+ end
@@ -3,9 +3,9 @@ module RosettaQueue
3
3
  describe "a consumer manager", :shared => true do
4
4
 
5
5
  def do_process
6
- @manager.start
6
+ @manager.start
7
7
  end
8
-
8
+
9
9
  describe ".add" do
10
10
 
11
11
  def do_process
@@ -23,4 +23,4 @@ module RosettaQueue
23
23
  end
24
24
 
25
25
  end
26
- end
26
+ end
@@ -19,7 +19,7 @@ module RosettaQueue
19
19
  it_should_behave_like "a consumer manager"
20
20
 
21
21
  describe "threading" do
22
-
22
+
23
23
  before do
24
24
  @manager.stub!(:join_threads)
25
25
  @manager.stub!(:monitor_threads)
@@ -31,9 +31,9 @@ module RosettaQueue
31
31
  it "should load subscriptions into threads on start" do
32
32
  during_process {Thread.should_receive(:new).with(:"spec/mocks/mock", @consumer).and_return(@thread)}
33
33
  end
34
-
34
+
35
35
  describe "shutting down" do
36
-
36
+
37
37
  def do_process
38
38
  @manager.start
39
39
  @manager.stop
@@ -42,10 +42,10 @@ module RosettaQueue
42
42
  it "should shut threaded subscriptions down on stop" do
43
43
  during_process do
44
44
  @consumer.should_receive(:disconnect)
45
- @thread.should_receive(:kill)
45
+ @thread.should_receive(:kill)
46
46
  end
47
47
  end
48
48
  end
49
49
  end
50
50
  end
51
- end
51
+ end
@@ -2,7 +2,7 @@ require File.dirname(__FILE__) + '/../spec_helper'
2
2
 
3
3
  module RosettaQueue
4
4
  describe Consumer do
5
-
5
+
6
6
  class TestConsumer
7
7
  include MessageHandler
8
8
 
@@ -16,14 +16,14 @@ module RosettaQueue
16
16
 
17
17
  before(:each) do
18
18
  @message = mock("message", "headers" => "foo", "body" => "message body")
19
- @adapter = mock("adpater", :subscribe => true, :unsubscribe => true, :disconnect => true, :receive_with => TestConsumer.new,
19
+ @adapter = mock("adpater", :subscribe => true, :unsubscribe => true, :disconnect => true, :receive_with => TestConsumer.new,
20
20
  :receive_once => @message.body, :ack => true)
21
21
  Adapter.stub!(:instance).and_return(@adapter)
22
22
  Destinations.stub!(:lookup).and_return("/queue/foo")
23
23
  end
24
-
24
+
25
25
  it_should_behave_like "a messaging gateway object"
26
-
26
+
27
27
  attr_reader :adapter
28
28
  def gateway
29
29
  @gateway ||= Consumer.new(TestConsumer.new)
@@ -33,30 +33,30 @@ module RosettaQueue
33
33
  before(:each) do
34
34
  @consumer = Consumer.new( @message_handler = TestConsumer.new)
35
35
  end
36
-
36
+
37
37
  def when_receiving
38
38
  yield if block_given?
39
39
  @consumer.receive
40
40
  end
41
-
41
+
42
42
  it "should pass message handler onto the adpater with #receive" do
43
- when_receiving {
43
+ when_receiving {
44
44
  @adapter.should_receive("receive_with").with(@message_handler)
45
45
  }
46
46
  end
47
47
  end
48
48
 
49
-
49
+
50
50
  describe ".delete" do
51
51
 
52
- before(:each) do
52
+ before(:each) do
53
53
  @adapter.stub!(:delete)
54
- Destinations.stub!(:lookup).and_return("/queue/foo")
55
- end
54
+ Destinations.stub!(:lookup).and_return("/queue/foo")
55
+ end
56
56
 
57
57
  it "should look up the destination" do
58
58
  # expect
59
- Destinations.should_receive(:lookup).with(:test_queue_passed_in).and_return("/queue/foo")
59
+ Destinations.should_receive(:lookup).with(:test_queue_passed_in).and_return("/queue/foo")
60
60
 
61
61
  # when
62
62
  Consumer.delete(:test_queue_passed_in)
@@ -80,7 +80,7 @@ module RosettaQueue
80
80
 
81
81
  it "should look up the destination" do
82
82
  when_receiving {
83
- Destinations.should_receive(:lookup).with(:test_queue_passed_in).and_return("/queue/foo")
83
+ Destinations.should_receive(:lookup).with(:test_queue_passed_in).and_return("/queue/foo")
84
84
  }
85
85
  end
86
86