beetle 0.2.11 → 0.2.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/Rakefile CHANGED
@@ -2,7 +2,6 @@ require 'rake'
2
2
  require 'rake/testtask'
3
3
  require 'rcov/rcovtask'
4
4
  require 'cucumber/rake/task'
5
- require 'active_support'
6
5
 
7
6
  # 1.8/1.9 compatible way of loading lib/beetle.rb
8
7
  $:.unshift 'lib'
data/beetle.gemspec CHANGED
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "beetle"
3
- s.version = "0.2.11"
4
- s.required_rubygems_version = ">= 1.3.1"
3
+ s.version = "0.2.13"
4
+ s.required_rubygems_version = ">= 1.3.7"
5
5
  s.authors = ["Stefan Kaes", "Pascal Friederich", "Ali Jelveh", "Sebastian Roebke"]
6
6
  s.date = Time.now.strftime('%Y-%m-%d')
7
7
  s.default_executable = "beetle"
@@ -28,15 +28,18 @@ Gem::Specification.new do |s|
28
28
  INFO
29
29
 
30
30
  s.specification_version = 3
31
- s.add_runtime_dependency("uuid4r", [">= 0.1.1"])
31
+ s.add_runtime_dependency("uuid4r", [">= 0.1.2"])
32
32
  s.add_runtime_dependency("bunny", ["= 0.6.0"])
33
33
  s.add_runtime_dependency("bunny-ext", [">= 0.6.5"])
34
34
  s.add_runtime_dependency("redis", ["= 2.0.4"])
35
- s.add_runtime_dependency("amqp", [">= 0.6.7"])
36
- s.add_runtime_dependency("activesupport", ["~> 2.3.4"])
35
+ s.add_runtime_dependency("amqp", ["~> 0.6.7"])
36
+ s.add_runtime_dependency("activesupport", [">= 2.3.4"])
37
37
  s.add_runtime_dependency("daemons", [">= 1.0.10"])
38
+ s.add_development_dependency("rake", [">= 0.8.7"])
38
39
  s.add_development_dependency("mocha", [">= 0"])
39
40
  s.add_development_dependency("rcov", [">= 0"])
41
+ s.add_development_dependency("redgreen", [">= 0"])
42
+ s.add_development_dependency("wirble", [">= 0"])
40
43
  s.add_development_dependency("cucumber", [">= 0.7.2"])
41
44
  s.add_development_dependency("daemon_controller", [">= 0"])
42
45
  end
@@ -40,7 +40,9 @@ def first_redis_configuration_client_pid
40
40
  end
41
41
 
42
42
  def system_notification_log_path
43
- tmp_path + "/system_notifications.log"
43
+ log_path = tmp_path + "/system_notifications.log"
44
+ `touch #{log_path}` unless File.exists?(log_path)
45
+ log_path
44
46
  end
45
47
 
46
48
  def tmp_path
@@ -185,5 +185,5 @@ glueoutputbuf yes
185
185
  # WARNING: object sharing is experimental, don't enable this feature
186
186
  # in production before of Redis 1.0-stable. Still please try this feature in
187
187
  # your development environment so that we can test it better.
188
- shareobjects no
189
- shareobjectspoolsize 1024
188
+ # shareobjects no
189
+ # shareobjectspoolsize 1024
data/lib/beetle.rb CHANGED
@@ -2,7 +2,9 @@ $:.unshift(File.expand_path('..', __FILE__))
2
2
  require 'bunny-ext'
3
3
  require 'uuid4r'
4
4
  require 'active_support'
5
+ require 'active_support/core_ext'
5
6
  require 'redis'
7
+ require 'set'
6
8
 
7
9
  module Beetle
8
10
 
data/lib/beetle/base.rb CHANGED
@@ -53,7 +53,7 @@ module Beetle
53
53
  queues[name] ||=
54
54
  begin
55
55
  opts = @client.queues[name]
56
- error("You are trying to bind a queue #{name} which is not configured!") unless opts
56
+ raise UnknownQueue.new("You are trying to bind a queue #{name} which is not configured!") unless opts
57
57
  logger.debug("Beetle: binding queue #{name} with internal name #{opts[:amqp_name]} on server #{@server}")
58
58
  queue_name = opts[:amqp_name]
59
59
  creation_options = opts.slice(*QUEUE_CREATION_KEYS)
data/lib/beetle/client.rb CHANGED
@@ -189,12 +189,17 @@ module Beetle
189
189
  publisher.purge(queue_name)
190
190
  end
191
191
 
192
- # start listening to a list of messages (default to all registered messages).
192
+ # start listening to all registered queues. Calls #listen_queues internally
193
193
  # runs the given block before entering the eventmachine loop.
194
- def listen(messages=self.messages.keys, &block)
195
- messages = messages.map(&:to_s)
196
- messages.each{|m| raise UnknownMessage.new("unknown message #{m}") unless self.messages.include?(m)}
197
- subscriber.listen(messages, &block)
194
+ def listen(_deprecated_messages=nil, &block)
195
+ raise Error.new("Beetle::Client#listen no longer works with arguments. Please use #listen_queues(['queue1', 'queue2']) instead") if _deprecated_messages
196
+ listen_queues(&block)
197
+ end
198
+
199
+ # start listening to a list of queues (default to all registered queues).
200
+ # runs the given block before entering the eventmachine loop.
201
+ def listen_queues(queues=self.queues.keys, &block)
202
+ subscriber.listen_queues(queues, &block)
198
203
  end
199
204
 
200
205
  # stops the eventmachine loop
@@ -207,19 +212,20 @@ module Beetle
207
212
  publisher.stop
208
213
  end
209
214
 
210
- # traces messages without consuming them. useful for debugging message flow.
211
- def trace(messages=self.messages.keys, &block)
212
- queues.each do |name, opts|
215
+ # traces queues without consuming them. useful for debugging message flow.
216
+ def trace(queue_names=self.queues.keys, &block)
217
+ queues_to_trace = self.queues.slice(*queue_names)
218
+ queues_to_trace.each do |name, opts|
213
219
  opts.merge! :durable => false, :auto_delete => true, :amqp_name => queue_name_for_tracing(opts[:amqp_name])
214
220
  end
215
- register_handler(queues.keys) do |msg|
221
+ register_handler(queue_names) do |msg|
216
222
  puts "-----===== new message =====-----"
217
223
  puts "SERVER: #{msg.server}"
218
224
  puts "HEADER: #{msg.header.inspect}"
219
225
  puts "MSGID: #{msg.msg_id}"
220
226
  puts "DATA: #{msg.data}"
221
227
  end
222
- listen(messages, &block)
228
+ listen_queues(queue_names, &block)
223
229
  end
224
230
 
225
231
  # evaluate the ruby files matching the given +glob+ pattern in the context of the client instance.
@@ -14,26 +14,25 @@ module Beetle
14
14
  @mqs = {}
15
15
  end
16
16
 
17
- # the client calls this method to subscribe to all queues on all servers which have
18
- # handlers registered for the given list of messages. this method does the following
19
- # things:
17
+ # the client calls this method to subscribe to a list of queues.
18
+ # this method does the following things:
20
19
  #
21
- # * creates all exchanges which have been registered for the given messages
22
- # * creates and binds queues which have been registered for the exchanges
20
+ # * creates all exchanges which have been registered for the given queues
21
+ # * creates and binds each listed queue queues
23
22
  # * subscribes the handlers for all these queues
24
23
  #
25
24
  # yields before entering the eventmachine loop (if a block was given)
26
- def listen(messages) #:nodoc:
25
+ def listen_queues(queues) #:nodoc:
27
26
  EM.run do
28
- exchanges = exchanges_for_messages(messages)
27
+ exchanges = exchanges_for_queues(queues)
29
28
  create_exchanges(exchanges)
30
- queues = queues_for_exchanges(exchanges)
31
29
  bind_queues(queues)
32
30
  subscribe_queues(queues)
33
31
  yield if block_given?
34
32
  end
35
33
  end
36
34
 
35
+
37
36
  # closes all AMQP connections and stops the eventmachine loop
38
37
  def stop! #:nodoc:
39
38
  if @amqp_connections.empty?
@@ -53,6 +52,10 @@ module Beetle
53
52
 
54
53
  private
55
54
 
55
+ def exchanges_for_queues(queues)
56
+ @client.bindings.slice(*queues).map{|_, opts| opts.map{|opt| opt[:exchange]}}.flatten.uniq
57
+ end
58
+
56
59
  def exchanges_for_messages(messages)
57
60
  @client.messages.slice(*messages).map{|_, opts| opts[:exchange]}.uniq
58
61
  end
data/script/console~ ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env ruby
2
+ $:.unshift(File.expand_path("../lib",__FILE__))
@@ -261,18 +261,26 @@ module Beetle
261
261
 
262
262
  test "should delegate listening to the subscriber instance" do
263
263
  client = Client.new
264
- client.register_queue(:a)
265
- client.register_message(:a)
266
- client.register_queue(:b)
267
- client.register_message(:b)
268
- client.send(:subscriber).expects(:listen).with(["a", "b"]).yields
269
- x = 0
270
- client.listen([:a, "b"]) { x = 5 }
271
- assert_equal 5, x
264
+ client.register_queue("b_queue")
265
+ client.register_queue("a_queue")
266
+ client.send(:subscriber).expects(:listen_queues).with {|value| value.include?("a_queue") && value.include?("b_queue")}.yields
267
+ client.listen
272
268
  end
273
269
 
274
- test "trying to listen to an unknown message should raise an exception" do
275
- assert_raises(UnknownMessage) { Client.new.listen([:a])}
270
+ test "trying to listen to a message is no longer supported and should raise an exception" do
271
+ assert_raises(Error) { Client.new.listen([:a])}
272
+ end
273
+
274
+ test "should delegate listening to queues to the subscriber instance" do
275
+ client = Client.new
276
+ client.register_queue(:test)
277
+ client.send(:subscriber).expects(:listen_queues).with([:test]).yields
278
+ client.listen_queues([:test])
279
+ end
280
+
281
+ test "trying to listen to an unknown queue should raise an exception" do
282
+ client = Client.new
283
+ assert_raises(UnknownQueue) { Client.new.listen_queues([:foobar])}
276
284
  end
277
285
 
278
286
  test "should delegate stop_listening to the subscriber instance" do
@@ -314,7 +322,7 @@ module Beetle
314
322
  client.register_queue("test")
315
323
  sub = client.send(:subscriber)
316
324
  sub.expects(:register_handler).with(client.queues.keys, {}, nil).yields(stub_everything("message"))
317
- sub.expects(:listen)
325
+ sub.expects(:listen_queues)
318
326
  client.stubs(:puts)
319
327
  client.trace
320
328
  test_queue_opts = client.queues["test"]
@@ -324,5 +332,16 @@ module Beetle
324
332
  assert !test_queue_opts[:durable]
325
333
  end
326
334
 
335
+ test "limiting tracing to some queues" do
336
+ client = Client.new
337
+ client.register_queue("test")
338
+ client.register_queue("irrelevant")
339
+ sub = client.send(:subscriber)
340
+ sub.expects(:register_handler).with(["test"], {}, nil).yields(stub_everything("message"))
341
+ sub.expects(:listen_queues).with(["test"])
342
+ client.stubs(:puts)
343
+ client.trace(["test"])
344
+ end
345
+
327
346
  end
328
347
  end
@@ -249,14 +249,16 @@ module Beetle
249
249
  assert_raises(Error){ @sub.send(:subscribe, "some_queue") }
250
250
  end
251
251
 
252
- test "listening should use eventmachine. create exchanges. bind queues. install subscribers. and yield." do
253
- @client.register_queue(:a)
254
- @client.register_message(:a)
252
+ test "listeninging on queues should use eventmachine. create exchanges. bind queues. install subscribers. and yield." do
253
+ @client.register_exchange(:an_exchange)
254
+ @client.register_queue(:a_queue, :exchange => :an_exchange)
255
+ @client.register_message(:a_message, :key => "foo", :exchange => :an_exchange)
256
+
255
257
  EM.expects(:run).yields
256
- @sub.expects(:create_exchanges).with(["a"])
257
- @sub.expects(:bind_queues).with(["a"])
258
- @sub.expects(:subscribe_queues).with(["a"])
259
- @sub.listen(["a"]) {}
258
+ @sub.expects(:create_exchanges).with(["an_exchange"])
259
+ @sub.expects(:bind_queues).with(["a_queue"])
260
+ @sub.expects(:subscribe_queues).with(["a_queue"])
261
+ @sub.listen_queues(["a_queue"]) {}
260
262
  end
261
263
  end
262
264
 
data/test/test_helper.rb CHANGED
@@ -1,10 +1,13 @@
1
1
  require 'rubygems'
2
- require 'active_support'
3
- require 'active_support/testing/declarative'
4
2
  require 'test/unit'
3
+ require 'mocha'
4
+ require 'active_support/testing/declarative'
5
+
6
+ require File.expand_path(File.dirname(__FILE__) + '/../lib/beetle')
7
+
5
8
  begin
6
9
  require 'redgreen' unless ENV['TM_FILENAME']
7
- rescue MissingSourceFile
10
+ rescue LoadError => e
8
11
  end
9
12
 
10
13
  # we can remove this hack which is needed only for testing
@@ -17,8 +20,6 @@ rescue LoadError
17
20
  end
18
21
  end
19
22
 
20
- require 'mocha'
21
- require File.expand_path(File.dirname(__FILE__) + '/../lib/beetle')
22
23
 
23
24
  class Test::Unit::TestCase
24
25
  extend ActiveSupport::Testing::Declarative
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: beetle
3
3
  version: !ruby/object:Gem::Version
4
- hash: 1
5
- prerelease: false
4
+ hash: 13
5
+ prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 11
10
- version: 0.2.11
9
+ - 13
10
+ version: 0.2.13
11
11
  platform: ruby
12
12
  authors:
13
13
  - Stefan Kaes
@@ -18,7 +18,7 @@ autorequire:
18
18
  bindir: bin
19
19
  cert_chain: []
20
20
 
21
- date: 2011-02-15 00:00:00 +01:00
21
+ date: 2011-05-15 00:00:00 +02:00
22
22
  default_executable: beetle
23
23
  dependencies:
24
24
  - !ruby/object:Gem::Dependency
@@ -29,12 +29,12 @@ dependencies:
29
29
  requirements:
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
- hash: 25
32
+ hash: 31
33
33
  segments:
34
34
  - 0
35
35
  - 1
36
- - 1
37
- version: 0.1.1
36
+ - 2
37
+ version: 0.1.2
38
38
  type: :runtime
39
39
  version_requirements: *id001
40
40
  - !ruby/object:Gem::Dependency
@@ -91,7 +91,7 @@ dependencies:
91
91
  requirement: &id005 !ruby/object:Gem::Requirement
92
92
  none: false
93
93
  requirements:
94
- - - ">="
94
+ - - ~>
95
95
  - !ruby/object:Gem::Version
96
96
  hash: 9
97
97
  segments:
@@ -107,7 +107,7 @@ dependencies:
107
107
  requirement: &id006 !ruby/object:Gem::Requirement
108
108
  none: false
109
109
  requirements:
110
- - - ~>
110
+ - - ">="
111
111
  - !ruby/object:Gem::Version
112
112
  hash: 11
113
113
  segments:
@@ -134,21 +134,23 @@ dependencies:
134
134
  type: :runtime
135
135
  version_requirements: *id007
136
136
  - !ruby/object:Gem::Dependency
137
- name: mocha
137
+ name: rake
138
138
  prerelease: false
139
139
  requirement: &id008 !ruby/object:Gem::Requirement
140
140
  none: false
141
141
  requirements:
142
142
  - - ">="
143
143
  - !ruby/object:Gem::Version
144
- hash: 3
144
+ hash: 49
145
145
  segments:
146
146
  - 0
147
- version: "0"
147
+ - 8
148
+ - 7
149
+ version: 0.8.7
148
150
  type: :development
149
151
  version_requirements: *id008
150
152
  - !ruby/object:Gem::Dependency
151
- name: rcov
153
+ name: mocha
152
154
  prerelease: false
153
155
  requirement: &id009 !ruby/object:Gem::Requirement
154
156
  none: false
@@ -162,9 +164,51 @@ dependencies:
162
164
  type: :development
163
165
  version_requirements: *id009
164
166
  - !ruby/object:Gem::Dependency
165
- name: cucumber
167
+ name: rcov
166
168
  prerelease: false
167
169
  requirement: &id010 !ruby/object:Gem::Requirement
170
+ none: false
171
+ requirements:
172
+ - - ">="
173
+ - !ruby/object:Gem::Version
174
+ hash: 3
175
+ segments:
176
+ - 0
177
+ version: "0"
178
+ type: :development
179
+ version_requirements: *id010
180
+ - !ruby/object:Gem::Dependency
181
+ name: redgreen
182
+ prerelease: false
183
+ requirement: &id011 !ruby/object:Gem::Requirement
184
+ none: false
185
+ requirements:
186
+ - - ">="
187
+ - !ruby/object:Gem::Version
188
+ hash: 3
189
+ segments:
190
+ - 0
191
+ version: "0"
192
+ type: :development
193
+ version_requirements: *id011
194
+ - !ruby/object:Gem::Dependency
195
+ name: wirble
196
+ prerelease: false
197
+ requirement: &id012 !ruby/object:Gem::Requirement
198
+ none: false
199
+ requirements:
200
+ - - ">="
201
+ - !ruby/object:Gem::Version
202
+ hash: 3
203
+ segments:
204
+ - 0
205
+ version: "0"
206
+ type: :development
207
+ version_requirements: *id012
208
+ - !ruby/object:Gem::Dependency
209
+ name: cucumber
210
+ prerelease: false
211
+ requirement: &id013 !ruby/object:Gem::Requirement
168
212
  none: false
169
213
  requirements:
170
214
  - - ">="
@@ -176,11 +220,11 @@ dependencies:
176
220
  - 2
177
221
  version: 0.7.2
178
222
  type: :development
179
- version_requirements: *id010
223
+ version_requirements: *id013
180
224
  - !ruby/object:Gem::Dependency
181
225
  name: daemon_controller
182
226
  prerelease: false
183
- requirement: &id011 !ruby/object:Gem::Requirement
227
+ requirement: &id014 !ruby/object:Gem::Requirement
184
228
  none: false
185
229
  requirements:
186
230
  - - ">="
@@ -190,7 +234,7 @@ dependencies:
190
234
  - 0
191
235
  version: "0"
192
236
  type: :development
193
- version_requirements: *id011
237
+ version_requirements: *id014
194
238
  description: A highly available, reliable messaging infrastructure
195
239
  email: developers@xing.com
196
240
  executables:
@@ -243,6 +287,7 @@ files:
243
287
  - features/support/test_daemons/redis_configuration_client.rb
244
288
  - features/support/test_daemons/redis_configuration_server.rb
245
289
  - script/console
290
+ - script/console~
246
291
  - script/start_rabbit
247
292
  - beetle.gemspec
248
293
  - Rakefile
@@ -290,16 +335,16 @@ required_rubygems_version: !ruby/object:Gem::Requirement
290
335
  requirements:
291
336
  - - ">="
292
337
  - !ruby/object:Gem::Version
293
- hash: 25
338
+ hash: 21
294
339
  segments:
295
340
  - 1
296
341
  - 3
297
- - 1
298
- version: 1.3.1
342
+ - 7
343
+ version: 1.3.7
299
344
  requirements: []
300
345
 
301
346
  rubyforge_project:
302
- rubygems_version: 1.3.7
347
+ rubygems_version: 1.6.2
303
348
  signing_key:
304
349
  specification_version: 3
305
350
  summary: High Availability AMQP Messaging with Redundant Queues