beetle 0.3.0.rc.12 → 0.3.0.rc.13

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/examples/simple.rb CHANGED
@@ -15,7 +15,7 @@ Beetle.config.logger.level = Logger::INFO
15
15
 
16
16
  # setup client
17
17
  client = Beetle::Client.new
18
- client.register_queue(:test)
18
+ client.register_queue(:test, :arguments => {"x-message-ttl" => 60 * 1000})
19
19
  client.register_message(:test)
20
20
 
21
21
  # purge the test queue
@@ -0,0 +1,32 @@
1
+ # attempts.rb
2
+ # this example shows you how to use the exception limiting feature of beetle
3
+ # it allows you to control the number of retries your handler will go through
4
+ # with one message before giving up on it
5
+ #
6
+ # ! check the examples/README.rdoc for information on starting your redis/rabbit !
7
+ #
8
+ # start it with ruby attempts.rb
9
+
10
+ require "rubygems"
11
+ require File.expand_path("../lib/beetle", File.dirname(__FILE__))
12
+ require "eventmachine"
13
+
14
+ # set Beetle log level to info, less noisy than debug
15
+ Beetle.config.logger.level = Logger::INFO
16
+
17
+ # setup client
18
+ client = Beetle::Client.new
19
+ client.register_message(:test)
20
+
21
+ n = 0
22
+ EM.run do
23
+ EM.add_periodic_timer(0.1) do
24
+ data = (n+=1)
25
+ client.logger.info "publishing #{data}"
26
+ client.publish(:test, data)
27
+ end
28
+ trap("INT") do
29
+ client.stop_publishing
30
+ EM.stop_event_loop
31
+ end
32
+ end
data/lib/beetle/client.rb CHANGED
@@ -149,9 +149,10 @@ module Beetle
149
149
 
150
150
  # this is a convenience method to configure exchanges, queues, messages and handlers
151
151
  # with a common set of options. allows one to call all register methods without the
152
- # register_ prefix. returns self.
152
+ # register_ prefix. returns self. if the passed in block has no parameters, the block
153
+ # will be evaluated in the context of the client configurator.
153
154
  #
154
- # Example:
155
+ # Example: (block with config argument)
155
156
  # client = Beetle.client.new.configure :exchange => :foobar do |config|
156
157
  # config.queue :q1, :key => "foo"
157
158
  # config.queue :q2, :key => "bar"
@@ -160,8 +161,24 @@ module Beetle
160
161
  # config.handler :q1 { puts "got foo"}
161
162
  # config.handler :q2 { puts "got bar"}
162
163
  # end
163
- def configure(options={}) #:yields: config
164
- yield Configurator.new(self, options)
164
+ #
165
+ # Example: (block without config argument)
166
+ # client = Beetle.client.new.configure :exchange => :foobar do
167
+ # queue :q1, :key => "foo"
168
+ # queue :q2, :key => "bar"
169
+ # message :foo
170
+ # message :bar
171
+ # handler :q1 { puts "got foo"}
172
+ # handler :q2 { puts "got bar"}
173
+ # end
174
+ #
175
+ def configure(options={}, &block)
176
+ configurator = Configurator.new(self, options)
177
+ if block.arity == 1
178
+ yield configurator
179
+ else
180
+ configurator.instance_eval &block
181
+ end
165
182
  self
166
183
  end
167
184
 
@@ -223,18 +240,22 @@ module Beetle
223
240
  end
224
241
 
225
242
  # traces queues without consuming them. useful for debugging message flow.
226
- def trace(queue_names=self.queues.keys, &block)
243
+ def trace(queue_names=self.queues.keys, tracer=nil, &block)
227
244
  queues_to_trace = self.queues.slice(*queue_names)
228
245
  queues_to_trace.each do |name, opts|
229
246
  opts.merge! :durable => false, :auto_delete => true, :amqp_name => queue_name_for_tracing(opts[:amqp_name])
230
247
  end
231
- register_handler(queue_names) do |msg|
232
- puts "-----===== new message =====-----"
233
- puts "SERVER: #{msg.server}"
234
- puts "HEADER: #{msg.header.inspect}"
235
- puts "MSGID: #{msg.msg_id}"
236
- puts "DATA: #{msg.data}"
237
- end
248
+ tracer ||=
249
+ lambda do |msg|
250
+ puts "-----===== new message =====-----"
251
+ puts "SERVER: #{msg.server}"
252
+ puts "HEADER: #{msg.header.attributes[:headers].inspect}"
253
+ puts "EXCHANGE: #{msg.header.method.exchange}"
254
+ puts "KEY: #{msg.header.method.routing_key}"
255
+ puts "MSGID: #{msg.msg_id}"
256
+ puts "DATA: #{msg.data}"
257
+ end
258
+ register_handler(queue_names){|msg| tracer.call msg }
238
259
  listen_queues(queue_names, &block)
239
260
  end
240
261
 
@@ -1,3 +1,3 @@
1
1
  module Beetle
2
- VERSION = "0.3.0.rc.12"
2
+ VERSION = "0.3.0.rc.13"
3
3
  end
data/lib/beetle.rb CHANGED
@@ -40,7 +40,7 @@ module Beetle
40
40
  # AMQP options for exchange creation
41
41
  EXCHANGE_CREATION_KEYS = [:auto_delete, :durable, :internal, :nowait, :passive]
42
42
  # AMQP options for queue creation
43
- QUEUE_CREATION_KEYS = [:passive, :durable, :exclusive, :auto_delete, :no_wait]
43
+ QUEUE_CREATION_KEYS = [:passive, :durable, :exclusive, :auto_delete, :no_wait, :arguments]
44
44
  # AMQP options for queue bindings
45
45
  QUEUE_BINDING_KEYS = [:key, :no_wait]
46
46
  # AMQP options for message publishing
@@ -151,6 +151,16 @@ module Beetle
151
151
  @client.configure(options) {|config| assert_equal 42, config}
152
152
  end
153
153
 
154
+ test "configure should eval a passed block without arguments in the context of the configurator" do
155
+ options = {:exchange => :foobar}
156
+ m = "mock"
157
+ m.expects(:foo).returns(42)
158
+ Client::Configurator.expects(:new).with(@client, options).returns(m)
159
+ value = nil
160
+ @client.configure(options) { value = foo }
161
+ assert_equal 42, value
162
+ end
163
+
154
164
  test "a configurator should forward all known registration methods to the client" do
155
165
  options = {:foo => :bar}
156
166
  config = Client::Configurator.new(@client, options)
@@ -353,7 +363,7 @@ module Beetle
353
363
  client = Client.new
354
364
  client.register_queue("test")
355
365
  sub = client.send(:subscriber)
356
- sub.expects(:register_handler).with(client.queues.keys, {}, nil).yields(stub_everything("message"))
366
+ sub.expects(:register_handler).with(client.queues.keys, {}, nil).yields(message_stub_for_tracing)
357
367
  sub.expects(:listen_queues)
358
368
  client.stubs(:puts)
359
369
  client.trace
@@ -369,11 +379,19 @@ module Beetle
369
379
  client.register_queue("test")
370
380
  client.register_queue("irrelevant")
371
381
  sub = client.send(:subscriber)
372
- sub.expects(:register_handler).with(["test"], {}, nil).yields(stub_everything("message"))
382
+ sub.expects(:register_handler).with(["test"], {}, nil).yields(message_stub_for_tracing)
373
383
  sub.expects(:listen_queues).with(["test"])
374
384
  client.stubs(:puts)
375
385
  client.trace(["test"])
376
386
  end
377
387
 
388
+ def message_stub_for_tracing
389
+ header_stub = stub_everything("header")
390
+ header_stub.stubs(:method).returns(stub_everything("method"))
391
+ header_stub.stubs(:attributes).returns(stub_everything("attributes"))
392
+ msg_stub = stub_everything("message")
393
+ msg_stub.stubs(:header).returns(header_stub)
394
+ msg_stub
395
+ end
378
396
  end
379
397
  end
@@ -224,12 +224,12 @@ module Beetle
224
224
  end
225
225
 
226
226
  test "binding a queue should create it using the config and bind it to the exchange with the name specified" do
227
- @client.register_queue("some_queue", :exchange => "some_exchange", :key => "haha.#")
227
+ @client.register_queue("some_queue", :exchange => "some_exchange", :key => "haha.#", :arguments => {"foo" => "fighter"})
228
228
  @pub.expects(:exchange).with("some_exchange").returns(:the_exchange)
229
229
  q = mock("queue")
230
230
  q.expects(:bind).with(:the_exchange, {:key => "haha.#"})
231
231
  m = mock("Bunny")
232
- m.expects(:queue).with("some_queue", :durable => true, :passive => false, :auto_delete => false, :exclusive => false).returns(q)
232
+ m.expects(:queue).with("some_queue", :durable => true, :passive => false, :auto_delete => false, :exclusive => false, :arguments => {"foo" => "fighter"}).returns(q)
233
233
  @pub.expects(:bunny).returns(m)
234
234
 
235
235
  @pub.send(:queue, "some_queue")
@@ -128,12 +128,12 @@ module Beetle
128
128
  end
129
129
 
130
130
  test "binding a queue should create it using the config and bind it to the exchange with the name specified" do
131
- @client.register_queue("some_queue", "durable" => true, "exchange" => "some_exchange", "key" => "haha.#")
131
+ @client.register_queue("some_queue", "durable" => true, "exchange" => "some_exchange", "key" => "haha.#", "arguments" => {"schmu" => 5})
132
132
  @sub.expects(:exchange).with("some_exchange").returns(:the_exchange)
133
133
  q = mock("queue")
134
134
  q.expects(:bind).with(:the_exchange, {:key => "haha.#"})
135
135
  m = mock("MQ")
136
- m.expects(:queue).with("some_queue", :durable => true, :passive => false, :auto_delete => false, :exclusive => false).returns(q)
136
+ m.expects(:queue).with("some_queue", :durable => true, :passive => false, :auto_delete => false, :exclusive => false, :arguments => {"schmu" => 5}).returns(q)
137
137
  @sub.expects(:channel).returns(m)
138
138
 
139
139
  @sub.send(:queue, "some_queue")
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: beetle
3
3
  version: !ruby/object:Gem::Version
4
- hash: 534360161
4
+ hash: 3659109081
5
5
  prerelease: true
6
6
  segments:
7
7
  - 0
8
8
  - 3
9
9
  - 0
10
10
  - rc
11
- - 12
12
- version: 0.3.0.rc.12
11
+ - 13
12
+ version: 0.3.0.rc.13
13
13
  platform: ruby
14
14
  authors:
15
15
  - Stefan Kaes
@@ -21,7 +21,7 @@ autorequire:
21
21
  bindir: bin
22
22
  cert_chain: []
23
23
 
24
- date: 2012-01-25 00:00:00 +01:00
24
+ date: 2012-03-06 00:00:00 +01:00
25
25
  default_executable: beetle
26
26
  dependencies:
27
27
  - !ruby/object:Gem::Dependency
@@ -284,6 +284,7 @@ files:
284
284
  - examples/redundant.rb
285
285
  - examples/rpc.rb
286
286
  - examples/simple.rb
287
+ - examples/test_publisher.rb
287
288
  - lib/beetle/base.rb
288
289
  - lib/beetle/client.rb
289
290
  - lib/beetle/commands/configuration_client.rb