beetle 0.3.0.rc.11 → 0.3.0.rc.14
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/README.rdoc +1 -1
- data/Rakefile +27 -18
- data/beetle.gemspec +6 -11
- data/examples/simple.rb +0 -2
- data/lib/beetle.rb +10 -2
- data/lib/beetle/client.rb +33 -12
- data/lib/beetle/message.rb +1 -1
- data/lib/beetle/redis_ext.rb +0 -24
- data/lib/beetle/version.rb +1 -1
- data/test/beetle/beetle_test.rb +16 -0
- data/test/beetle/client_test.rb +20 -2
- data/test/beetle/configuration_test.rb +6 -0
- data/test/beetle/deduplication_store_test.rb +3 -3
- data/test/beetle/publisher_test.rb +2 -2
- data/test/beetle/redis_ext_test.rb +4 -13
- data/test/beetle/subscriber_test.rb +2 -2
- data/test/test_helper.rb +7 -8
- metadata +29 -101
data/README.rdoc
CHANGED
@@ -85,7 +85,7 @@ For development, you'll need
|
|
85
85
|
{Ali Jelveh}[http://github.com/dudemeister] and
|
86
86
|
{Sebastian Roebke}[http://github.com/boosty].
|
87
87
|
|
88
|
-
You
|
88
|
+
You can find out more about our work on our {dev blog}[http://devblog.xing.com].
|
89
89
|
|
90
90
|
Copyright (c) 2010 {XING AG}[http://www.xing.com/]
|
91
91
|
|
data/Rakefile
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'rake'
|
2
2
|
require 'rake/testtask'
|
3
|
-
require 'rcov/rcovtask'
|
4
3
|
require 'bundler/gem_tasks'
|
5
4
|
|
6
5
|
# rake 0.9.2 hack to supress deprecation warnings caused by cucumber
|
@@ -11,25 +10,35 @@ require 'cucumber/rake/task'
|
|
11
10
|
$:.unshift 'lib'
|
12
11
|
require 'beetle'
|
13
12
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
13
|
+
if RUBY_VERSION < "1.9"
|
14
|
+
require 'rcov/rcovtask'
|
15
|
+
|
16
|
+
namespace :test do
|
17
|
+
namespace :coverage do
|
18
|
+
desc "Delete aggregate coverage data."
|
19
|
+
task(:clean) { rm_f "coverage.data" }
|
20
|
+
end
|
19
21
|
|
20
|
-
|
21
|
-
|
22
|
+
desc 'Aggregate code coverage'
|
23
|
+
task :coverage => "test:coverage:clean"
|
22
24
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
25
|
+
Rcov::RcovTask.new(:coverage) do |t|
|
26
|
+
t.libs << "test"
|
27
|
+
t.test_files = FileList["test/**/*_test.rb"]
|
28
|
+
t.output_dir = "test/coverage"
|
29
|
+
t.verbose = true
|
30
|
+
t.rcov_opts << "--exclude '.*' --include-file 'lib/beetle/'"
|
31
|
+
end
|
32
|
+
task :coverage do
|
33
|
+
system 'open test/coverage/index.html'
|
34
|
+
end if RUBY_PLATFORM =~ /darwin/
|
35
|
+
end
|
36
|
+
else
|
37
|
+
namespace :test do
|
38
|
+
task :coverage => :test do
|
39
|
+
system 'open coverage/index.html'
|
40
|
+
end
|
29
41
|
end
|
30
|
-
task :coverage do
|
31
|
-
system 'open test/coverage/index.html'
|
32
|
-
end if RUBY_PLATFORM =~ /darwin/
|
33
42
|
end
|
34
43
|
|
35
44
|
namespace :beetle do
|
@@ -98,7 +107,7 @@ Rake::TestTask.new do |t|
|
|
98
107
|
t.verbose = true
|
99
108
|
end
|
100
109
|
|
101
|
-
require '
|
110
|
+
require 'rdoc/task'
|
102
111
|
|
103
112
|
Rake::RDocTask.new do |rdoc|
|
104
113
|
rdoc.rdoc_dir = 'site/rdoc'
|
data/beetle.gemspec
CHANGED
@@ -33,19 +33,14 @@ Gem::Specification.new do |s|
|
|
33
33
|
|
34
34
|
s.specification_version = 3
|
35
35
|
s.add_runtime_dependency("uuid4r", [">= 0.1.2"])
|
36
|
-
s.add_runtime_dependency("bunny", ["= 0.7.
|
37
|
-
s.add_runtime_dependency("redis", ["=
|
38
|
-
s.add_runtime_dependency("hiredis", ["= 0.4.
|
39
|
-
s.add_runtime_dependency("amq-client", ["= 0.
|
40
|
-
s.add_runtime_dependency("amq-protocol", ["= 0.
|
41
|
-
s.add_runtime_dependency("amqp", ["= 0.
|
36
|
+
s.add_runtime_dependency("bunny", ["= 0.7.9"])
|
37
|
+
s.add_runtime_dependency("redis", ["= 3.0.1"])
|
38
|
+
s.add_runtime_dependency("hiredis", ["= 0.4.5"])
|
39
|
+
s.add_runtime_dependency("amq-client", ["= 0.9.3"])
|
40
|
+
s.add_runtime_dependency("amq-protocol", ["= 0.9.3"])
|
41
|
+
s.add_runtime_dependency("amqp", ["= 0.9.6"])
|
42
42
|
s.add_runtime_dependency("activesupport", [">= 2.3.4"])
|
43
43
|
s.add_runtime_dependency("eventmachine_httpserver", [">= 0.2.1"])
|
44
44
|
s.add_runtime_dependency("daemons", [">= 1.0.10"])
|
45
|
-
s.add_development_dependency("rake", [">= 0.8.7"])
|
46
|
-
s.add_development_dependency("mocha", [">= 0"])
|
47
|
-
s.add_development_dependency("rcov", [">= 0"])
|
48
|
-
s.add_development_dependency("cucumber", [">= 0.7.2"])
|
49
|
-
s.add_development_dependency("daemon_controller", [">= 0"])
|
50
45
|
end
|
51
46
|
|
data/examples/simple.rb
CHANGED
data/lib/beetle.rb
CHANGED
@@ -10,6 +10,7 @@ require 'socket'
|
|
10
10
|
require 'beetle/version'
|
11
11
|
|
12
12
|
module Beetle
|
13
|
+
#:nocov:
|
13
14
|
Timer = if RUBY_VERSION < "1.9"
|
14
15
|
begin
|
15
16
|
require 'system_timer'
|
@@ -23,6 +24,7 @@ module Beetle
|
|
23
24
|
require 'timeout'
|
24
25
|
Timeout
|
25
26
|
end
|
27
|
+
#:nocov:
|
26
28
|
|
27
29
|
# abstract superclass for Beetle specific exceptions
|
28
30
|
class Error < StandardError; end
|
@@ -40,7 +42,7 @@ module Beetle
|
|
40
42
|
# AMQP options for exchange creation
|
41
43
|
EXCHANGE_CREATION_KEYS = [:auto_delete, :durable, :internal, :nowait, :passive]
|
42
44
|
# AMQP options for queue creation
|
43
|
-
QUEUE_CREATION_KEYS = [:passive, :durable, :exclusive, :auto_delete, :no_wait]
|
45
|
+
QUEUE_CREATION_KEYS = [:passive, :durable, :exclusive, :auto_delete, :no_wait, :arguments]
|
44
46
|
# AMQP options for queue bindings
|
45
47
|
QUEUE_BINDING_KEYS = [:key, :no_wait]
|
46
48
|
# AMQP options for message publishing
|
@@ -52,7 +54,11 @@ module Beetle
|
|
52
54
|
def self.hostname
|
53
55
|
name = Socket.gethostname
|
54
56
|
parts = name.split('.')
|
55
|
-
parts.size > 1
|
57
|
+
if parts.size > 1
|
58
|
+
name
|
59
|
+
else
|
60
|
+
Socket.gethostbyname(parts.first).first rescue name
|
61
|
+
end
|
56
62
|
end
|
57
63
|
|
58
64
|
# use ruby's autoload mechanism for loading beetle classes
|
@@ -76,7 +82,9 @@ module Beetle
|
|
76
82
|
raise if $!.is_a?(Mocha::ExpectationError)
|
77
83
|
end
|
78
84
|
else
|
85
|
+
#:nocov:
|
79
86
|
def self.reraise_expectation_errors! #:nodoc:
|
80
87
|
end
|
88
|
+
#:nocov:
|
81
89
|
end
|
82
90
|
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
|
-
|
164
|
-
|
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
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
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
|
|
data/lib/beetle/message.rb
CHANGED
@@ -199,7 +199,7 @@ module Beetle
|
|
199
199
|
# have we already seen this message? if not, set the status to "incomplete" and store
|
200
200
|
# the message exipration timestamp in the deduplication store.
|
201
201
|
def key_exists?
|
202
|
-
old_message =
|
202
|
+
old_message = !@store.msetnx(msg_id, :status =>"incomplete", :expires => @expires_at, :timeout => now + timeout)
|
203
203
|
if old_message
|
204
204
|
logger.debug "Beetle: received duplicate message: #{msg_id} on queue: #{@queue}"
|
205
205
|
end
|
data/lib/beetle/redis_ext.rb
CHANGED
@@ -19,11 +19,6 @@ class Redis #:nodoc:
|
|
19
19
|
slaveof(host, port)
|
20
20
|
end
|
21
21
|
|
22
|
-
# Redis 2 tries to establish a connection on inspect. this is evil!
|
23
|
-
def inspect
|
24
|
-
super
|
25
|
-
end
|
26
|
-
|
27
22
|
def info_with_rescue
|
28
23
|
info
|
29
24
|
rescue Exception
|
@@ -51,23 +46,4 @@ class Redis #:nodoc:
|
|
51
46
|
info["role"] == "slave" && info["master_host"] == host && info["master_port"] == port.to_s
|
52
47
|
end
|
53
48
|
|
54
|
-
# redis 2.2.2 shutdown implementation does not disconnect from the redis server.
|
55
|
-
# this leaves the connection in an inconsistent state and causes the next command to silently fail.
|
56
|
-
# this in turn breaks our cucumber test scenarios.
|
57
|
-
# fix this here, until a new version is released which fixes the problem.
|
58
|
-
|
59
|
-
alias_method :broken_shutdown, :shutdown
|
60
|
-
|
61
|
-
# Synchronously save the dataset to disk and then shut down the server.
|
62
|
-
def shutdown
|
63
|
-
synchronize do
|
64
|
-
begin
|
65
|
-
@client.call [:shutdown]
|
66
|
-
rescue Errno::ECONNREFUSED
|
67
|
-
ensure
|
68
|
-
@client.disconnect
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
49
|
end
|
data/lib/beetle/version.rb
CHANGED
@@ -0,0 +1,16 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
2
|
+
|
3
|
+
module Beetle
|
4
|
+
class HostnameTest < Test::Unit::TestCase
|
5
|
+
test "should use Socket.gethostname if returned name name is fully qualified" do
|
6
|
+
Socket.expects(:gethostname).returns("a.b.com")
|
7
|
+
assert_equal "a.b.com", Beetle.hostname
|
8
|
+
end
|
9
|
+
|
10
|
+
test "should use Socket.gethosbyname if returned name name is not fully qualified" do
|
11
|
+
Socket.expects(:gethostname).returns("a")
|
12
|
+
Socket.expects(:gethostbyname).with("a").returns(["a.b.com"])
|
13
|
+
assert_equal "a.b.com", Beetle.hostname
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/test/beetle/client_test.rb
CHANGED
@@ -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(
|
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(
|
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
|
@@ -13,6 +13,12 @@ module Beetle
|
|
13
13
|
assert_equal new_value, config.gc_threshold
|
14
14
|
end
|
15
15
|
|
16
|
+
test "should log an error if the specified file does not exist" do
|
17
|
+
config = Configuration.new
|
18
|
+
config.logger.expects(:error)
|
19
|
+
assert_raises(Errno::ENOENT){ config.config_file = "some/path/to/a/file" }
|
20
|
+
end
|
21
|
+
|
16
22
|
test "should log to STDOUT if no log_file given" do
|
17
23
|
config = Configuration.new
|
18
24
|
Logger.expects(:new).with(STDOUT).returns(stub_everything)
|
@@ -13,11 +13,11 @@ module Beetle
|
|
13
13
|
assert_equal 0, @r.del("hahahaha")
|
14
14
|
end
|
15
15
|
|
16
|
-
test "msetnx returns
|
17
|
-
assert_equal
|
16
|
+
test "msetnx returns a boolean" do
|
17
|
+
assert_equal true, @r.msetnx("a", 1, "b", 2)
|
18
18
|
assert_equal "1", @r.get("a")
|
19
19
|
assert_equal "2", @r.get("b")
|
20
|
-
assert_equal
|
20
|
+
assert_equal false, @r.msetnx("a", 3, "b", 4)
|
21
21
|
assert_equal "1", @r.get("a")
|
22
22
|
assert_equal "2", @r.get("b")
|
23
23
|
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")
|
@@ -61,23 +61,14 @@ module Beetle
|
|
61
61
|
end
|
62
62
|
end
|
63
63
|
|
64
|
-
class
|
64
|
+
class RedisShutdownTest < Test::Unit::TestCase
|
65
65
|
def setup
|
66
66
|
@r = Redis.new(:host => "localhost", :port => 6390)
|
67
67
|
end
|
68
68
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
@r.client.expects(:call_without_reply).with([:shutdown]).once
|
73
|
-
@r.client.expects(:disconnect).never
|
74
|
-
@r.broken_shutdown
|
75
|
-
end
|
76
|
-
|
77
|
-
test "patched redis shutdown implementation should call :shutdown and rescue Errno::ECONNREFUSED" do
|
78
|
-
@r.client.expects(:call).with([:shutdown]).once.raises(Errno::ECONNREFUSED)
|
79
|
-
@r.client.expects(:disconnect).once
|
80
|
-
@r.shutdown
|
69
|
+
test "redis shutdown implementation should call :shutdown and return nil" do
|
70
|
+
@r.client.expects(:call).with([:shutdown]).once.raises(Redis::ConnectionError)
|
71
|
+
assert_nil @r.shutdown
|
81
72
|
end
|
82
73
|
end
|
83
74
|
|
@@ -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")
|
data/test/test_helper.rb
CHANGED
@@ -1,4 +1,10 @@
|
|
1
1
|
require 'rubygems'
|
2
|
+
if RUBY_VERSION >= "1.9"
|
3
|
+
require 'simplecov'
|
4
|
+
SimpleCov.start do
|
5
|
+
add_filter "/test/"
|
6
|
+
end
|
7
|
+
end
|
2
8
|
require 'test/unit'
|
3
9
|
require 'mocha'
|
4
10
|
require 'active_support/testing/declarative'
|
@@ -7,14 +13,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../lib/beetle')
|
|
7
13
|
require File.expand_path(File.dirname(__FILE__) + '/colorized_test_output')
|
8
14
|
|
9
15
|
# we can remove this hack which is needed only for testing
|
10
|
-
|
11
|
-
require 'qrack/errors'
|
12
|
-
rescue LoadError
|
13
|
-
module Qrack
|
14
|
-
class BufferOverflowError < StandardError; end
|
15
|
-
class InvalidTypeError < StandardError; end
|
16
|
-
end
|
17
|
-
end
|
16
|
+
require 'qrack/errors'
|
18
17
|
|
19
18
|
|
20
19
|
class Test::Unit::TestCase
|
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:
|
4
|
+
hash: -3659944352
|
5
5
|
prerelease: 6
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 3
|
9
9
|
- 0
|
10
10
|
- rc
|
11
|
-
-
|
12
|
-
version: 0.3.0.rc.
|
11
|
+
- 14
|
12
|
+
version: 0.3.0.rc.14
|
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:
|
24
|
+
date: 2012-07-01 00:00:00 Z
|
25
25
|
dependencies:
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: uuid4r
|
@@ -47,12 +47,12 @@ dependencies:
|
|
47
47
|
requirements:
|
48
48
|
- - "="
|
49
49
|
- !ruby/object:Gem::Version
|
50
|
-
hash:
|
50
|
+
hash: 17
|
51
51
|
segments:
|
52
52
|
- 0
|
53
53
|
- 7
|
54
|
-
-
|
55
|
-
version: 0.7.
|
54
|
+
- 9
|
55
|
+
version: 0.7.9
|
56
56
|
type: :runtime
|
57
57
|
version_requirements: *id002
|
58
58
|
- !ruby/object:Gem::Dependency
|
@@ -63,12 +63,12 @@ dependencies:
|
|
63
63
|
requirements:
|
64
64
|
- - "="
|
65
65
|
- !ruby/object:Gem::Version
|
66
|
-
hash:
|
66
|
+
hash: 5
|
67
67
|
segments:
|
68
|
-
-
|
69
|
-
-
|
70
|
-
-
|
71
|
-
version:
|
68
|
+
- 3
|
69
|
+
- 0
|
70
|
+
- 1
|
71
|
+
version: 3.0.1
|
72
72
|
type: :runtime
|
73
73
|
version_requirements: *id003
|
74
74
|
- !ruby/object:Gem::Dependency
|
@@ -79,12 +79,12 @@ dependencies:
|
|
79
79
|
requirements:
|
80
80
|
- - "="
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
hash:
|
82
|
+
hash: 5
|
83
83
|
segments:
|
84
84
|
- 0
|
85
85
|
- 4
|
86
|
-
-
|
87
|
-
version: 0.4.
|
86
|
+
- 5
|
87
|
+
version: 0.4.5
|
88
88
|
type: :runtime
|
89
89
|
version_requirements: *id004
|
90
90
|
- !ruby/object:Gem::Dependency
|
@@ -95,12 +95,12 @@ dependencies:
|
|
95
95
|
requirements:
|
96
96
|
- - "="
|
97
97
|
- !ruby/object:Gem::Version
|
98
|
-
hash:
|
98
|
+
hash: 61
|
99
99
|
segments:
|
100
100
|
- 0
|
101
|
-
-
|
102
|
-
-
|
103
|
-
version: 0.
|
101
|
+
- 9
|
102
|
+
- 3
|
103
|
+
version: 0.9.3
|
104
104
|
type: :runtime
|
105
105
|
version_requirements: *id005
|
106
106
|
- !ruby/object:Gem::Dependency
|
@@ -111,12 +111,12 @@ dependencies:
|
|
111
111
|
requirements:
|
112
112
|
- - "="
|
113
113
|
- !ruby/object:Gem::Version
|
114
|
-
hash:
|
114
|
+
hash: 61
|
115
115
|
segments:
|
116
116
|
- 0
|
117
|
-
-
|
118
|
-
-
|
119
|
-
version: 0.
|
117
|
+
- 9
|
118
|
+
- 3
|
119
|
+
version: 0.9.3
|
120
120
|
type: :runtime
|
121
121
|
version_requirements: *id006
|
122
122
|
- !ruby/object:Gem::Dependency
|
@@ -130,9 +130,9 @@ dependencies:
|
|
130
130
|
hash: 55
|
131
131
|
segments:
|
132
132
|
- 0
|
133
|
-
-
|
134
|
-
-
|
135
|
-
version: 0.
|
133
|
+
- 9
|
134
|
+
- 6
|
135
|
+
version: 0.9.6
|
136
136
|
type: :runtime
|
137
137
|
version_requirements: *id007
|
138
138
|
- !ruby/object:Gem::Dependency
|
@@ -183,80 +183,6 @@ dependencies:
|
|
183
183
|
version: 1.0.10
|
184
184
|
type: :runtime
|
185
185
|
version_requirements: *id010
|
186
|
-
- !ruby/object:Gem::Dependency
|
187
|
-
name: rake
|
188
|
-
prerelease: false
|
189
|
-
requirement: &id011 !ruby/object:Gem::Requirement
|
190
|
-
none: false
|
191
|
-
requirements:
|
192
|
-
- - ">="
|
193
|
-
- !ruby/object:Gem::Version
|
194
|
-
hash: 49
|
195
|
-
segments:
|
196
|
-
- 0
|
197
|
-
- 8
|
198
|
-
- 7
|
199
|
-
version: 0.8.7
|
200
|
-
type: :development
|
201
|
-
version_requirements: *id011
|
202
|
-
- !ruby/object:Gem::Dependency
|
203
|
-
name: mocha
|
204
|
-
prerelease: false
|
205
|
-
requirement: &id012 !ruby/object:Gem::Requirement
|
206
|
-
none: false
|
207
|
-
requirements:
|
208
|
-
- - ">="
|
209
|
-
- !ruby/object:Gem::Version
|
210
|
-
hash: 3
|
211
|
-
segments:
|
212
|
-
- 0
|
213
|
-
version: "0"
|
214
|
-
type: :development
|
215
|
-
version_requirements: *id012
|
216
|
-
- !ruby/object:Gem::Dependency
|
217
|
-
name: rcov
|
218
|
-
prerelease: false
|
219
|
-
requirement: &id013 !ruby/object:Gem::Requirement
|
220
|
-
none: false
|
221
|
-
requirements:
|
222
|
-
- - ">="
|
223
|
-
- !ruby/object:Gem::Version
|
224
|
-
hash: 3
|
225
|
-
segments:
|
226
|
-
- 0
|
227
|
-
version: "0"
|
228
|
-
type: :development
|
229
|
-
version_requirements: *id013
|
230
|
-
- !ruby/object:Gem::Dependency
|
231
|
-
name: cucumber
|
232
|
-
prerelease: false
|
233
|
-
requirement: &id014 !ruby/object:Gem::Requirement
|
234
|
-
none: false
|
235
|
-
requirements:
|
236
|
-
- - ">="
|
237
|
-
- !ruby/object:Gem::Version
|
238
|
-
hash: 7
|
239
|
-
segments:
|
240
|
-
- 0
|
241
|
-
- 7
|
242
|
-
- 2
|
243
|
-
version: 0.7.2
|
244
|
-
type: :development
|
245
|
-
version_requirements: *id014
|
246
|
-
- !ruby/object:Gem::Dependency
|
247
|
-
name: daemon_controller
|
248
|
-
prerelease: false
|
249
|
-
requirement: &id015 !ruby/object:Gem::Requirement
|
250
|
-
none: false
|
251
|
-
requirements:
|
252
|
-
- - ">="
|
253
|
-
- !ruby/object:Gem::Version
|
254
|
-
hash: 3
|
255
|
-
segments:
|
256
|
-
- 0
|
257
|
-
version: "0"
|
258
|
-
type: :development
|
259
|
-
version_requirements: *id015
|
260
186
|
description: A highly available, reliable messaging infrastructure
|
261
187
|
email: opensource@xing.com
|
262
188
|
executables:
|
@@ -324,6 +250,7 @@ files:
|
|
324
250
|
- MIT-LICENSE
|
325
251
|
- test/beetle/amqp_gem_behavior_test.rb
|
326
252
|
- test/beetle/base_test.rb
|
253
|
+
- test/beetle/beetle_test.rb
|
327
254
|
- test/beetle/client_test.rb
|
328
255
|
- test/beetle/configuration_test.rb
|
329
256
|
- test/beetle/deduplication_store_test.rb
|
@@ -371,13 +298,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
371
298
|
requirements: []
|
372
299
|
|
373
300
|
rubyforge_project:
|
374
|
-
rubygems_version: 1.8.
|
301
|
+
rubygems_version: 1.8.24
|
375
302
|
signing_key:
|
376
303
|
specification_version: 3
|
377
304
|
summary: High Availability AMQP Messaging with Redundant Queues
|
378
305
|
test_files:
|
379
306
|
- test/beetle/amqp_gem_behavior_test.rb
|
380
307
|
- test/beetle/base_test.rb
|
308
|
+
- test/beetle/beetle_test.rb
|
381
309
|
- test/beetle/client_test.rb
|
382
310
|
- test/beetle/configuration_test.rb
|
383
311
|
- test/beetle/deduplication_store_test.rb
|