beetle 0.2.11 → 0.2.13

Sign up to get free protection for your applications and to get access to all the features.
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