bunny 0.9.0.pre9 → 0.9.0.pre10
Sign up to get free protection for your applications and to get access to all the features.
- data/.ruby-version +1 -0
- data/ChangeLog.md +43 -0
- data/Gemfile +2 -2
- data/README.md +4 -2
- data/bunny.gemspec +1 -1
- data/lib/bunny/channel.rb +30 -5
- data/lib/bunny/exceptions.rb +1 -1
- data/lib/bunny/session.rb +19 -6
- data/lib/bunny/version.rb +1 -1
- data/spec/higher_level_api/integration/connection_spec.rb +33 -0
- data/spec/stress/channel_open_stress_spec.rb +37 -35
- data/spec/stress/channel_open_stress_with_single_threaded_connection_spec.rb +36 -35
- data/spec/stress/concurrent_consumers_stress_spec.rb +47 -45
- data/spec/stress/concurrent_publishers_stress_spec.rb +40 -38
- data/spec/unit/concurrent/condition_spec.rb +14 -12
- metadata +5 -4
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
1.9.3@amqp
|
data/ChangeLog.md
CHANGED
@@ -1,5 +1,48 @@
|
|
1
|
+
## Changes between Bunny 0.9.0.pre9 and 0.9.0.pre10
|
2
|
+
|
3
|
+
This release contains a **breaking API change**.
|
4
|
+
|
5
|
+
### Explicitly Closed Sockets
|
6
|
+
|
7
|
+
Bunny now will correctly close the socket previous connection had
|
8
|
+
when recovering from network issues.
|
9
|
+
|
10
|
+
|
11
|
+
### Bunny::Exception Now Extends StandardError
|
12
|
+
|
13
|
+
`Bunny::Exception` now inherits from `StandardError` and not `Exception`.
|
14
|
+
|
15
|
+
Naked rescue like this
|
16
|
+
|
17
|
+
``` ruby
|
18
|
+
begin
|
19
|
+
# ...
|
20
|
+
rescue => e
|
21
|
+
# ...
|
22
|
+
end
|
23
|
+
```
|
24
|
+
|
25
|
+
catches only descendents of `StandardError`. Most people don't
|
26
|
+
know this and this is a very counter-intuitive practice, but
|
27
|
+
apparently there is code out there that can't be changed that
|
28
|
+
depends on this behavior.
|
29
|
+
|
30
|
+
This is a **breaking API change**.
|
31
|
+
|
32
|
+
|
33
|
+
|
1
34
|
## Changes between Bunny 0.9.0.pre8 and 0.9.0.pre9
|
2
35
|
|
36
|
+
### Bunny::Session#start Now Returns a Session
|
37
|
+
|
38
|
+
`Bunny::Session#start` now returns a session instead of the default channel
|
39
|
+
(which wasn't intentional, default channel is a backwards-compatibility implementation
|
40
|
+
detail).
|
41
|
+
|
42
|
+
`Bunny::Session#start` also no longer leaves dead threads behind if called multiple
|
43
|
+
times on the same connection.
|
44
|
+
|
45
|
+
|
3
46
|
### More Reliable Heartbeat Sender
|
4
47
|
|
5
48
|
Heartbeat sender no longer slips into an infinite loop if it encounters an exception.
|
data/Gemfile
CHANGED
@@ -21,7 +21,7 @@ extend Module.new {
|
|
21
21
|
|
22
22
|
gem "SystemTimer", "1.2", :platform => :ruby_18
|
23
23
|
|
24
|
-
gem "rake"
|
24
|
+
gem "rake", ">= 10.0.4"
|
25
25
|
gem "effin_utf8"
|
26
26
|
|
27
27
|
group :development do
|
@@ -30,7 +30,7 @@ group :development do
|
|
30
30
|
end
|
31
31
|
|
32
32
|
group :test do
|
33
|
-
gem "rspec", "
|
33
|
+
gem "rspec", ">= 2.13.0"
|
34
34
|
end
|
35
35
|
|
36
36
|
gemspec
|
data/README.md
CHANGED
@@ -7,7 +7,7 @@ features and is free of many limitations of earlier versions.
|
|
7
7
|
|
8
8
|
## Supported Ruby Versions
|
9
9
|
|
10
|
-
Bunny 0.9 and more recent versions support Ruby 1.9.3, 1.9.2, JRuby 1.7, Rubinius 2.0 and 1.8.7.
|
10
|
+
Bunny 0.9 and more recent versions support Ruby 1.9.3, 1.9.2, 2.0, JRuby 1.7, Rubinius 2.0 and 1.8.7.
|
11
11
|
|
12
12
|
|
13
13
|
## Supported RabbitMQ Versions
|
@@ -33,10 +33,12 @@ To install Bunny 0.9.x with RubyGems:
|
|
33
33
|
gem install bunny --pre
|
34
34
|
```
|
35
35
|
|
36
|
+
the most recent 0.9.x version is `0.9.0.pre10`.
|
37
|
+
|
36
38
|
To use Bunny 0.9.x in a project managed with Bundler:
|
37
39
|
|
38
40
|
``` ruby
|
39
|
-
gem "bunny", ">= 0.9.0.
|
41
|
+
gem "bunny", ">= 0.9.0.pre10" # optionally: , :git => "git://github.com/ruby-amqp/bunny.git", :branch => "master"
|
40
42
|
```
|
41
43
|
|
42
44
|
|
data/bunny.gemspec
CHANGED
data/lib/bunny/channel.rb
CHANGED
@@ -11,6 +11,12 @@ require "bunny/delivery_info"
|
|
11
11
|
require "bunny/return_info"
|
12
12
|
require "bunny/message_properties"
|
13
13
|
|
14
|
+
if defined?(JRUBY_VERSION)
|
15
|
+
require "bunny/concurrent/linked_continuation_queue"
|
16
|
+
else
|
17
|
+
require "bunny/concurrent/continuation_queue"
|
18
|
+
end
|
19
|
+
|
14
20
|
module Bunny
|
15
21
|
# ## What are AMQP channels
|
16
22
|
#
|
@@ -169,9 +175,8 @@ module Bunny
|
|
169
175
|
|
170
176
|
@unconfirmed_set_mutex = Mutex.new
|
171
177
|
|
172
|
-
|
173
|
-
|
174
|
-
@basic_get_continuations = ::Queue.new
|
178
|
+
self.reset_continuations
|
179
|
+
|
175
180
|
# threads awaiting on continuations. Used to unblock
|
176
181
|
# them when network connection goes down so that busy loops
|
177
182
|
# that perform synchronous operations can work. MK.
|
@@ -1735,5 +1740,25 @@ module Bunny
|
|
1735
1740
|
def raise_if_no_longer_open!
|
1736
1741
|
raise ChannelAlreadyClosed.new("cannot use a channel that was already closed! Channel id: #{@id}", self) if closed?
|
1737
1742
|
end
|
1738
|
-
|
1739
|
-
|
1743
|
+
|
1744
|
+
# @api private
|
1745
|
+
def reset_continuations
|
1746
|
+
@continuations = new_continuation
|
1747
|
+
@confirms_continuations = new_continuation
|
1748
|
+
@basic_get_continuations = new_continuation
|
1749
|
+
end
|
1750
|
+
|
1751
|
+
|
1752
|
+
if defined?(JRUBY_VERSION)
|
1753
|
+
# @api private
|
1754
|
+
def new_continuation
|
1755
|
+
Concurrent::LinkedContinuationQueue.new
|
1756
|
+
end
|
1757
|
+
else
|
1758
|
+
# @api private
|
1759
|
+
def new_continuation
|
1760
|
+
Concurrent::ContinuationQueue.new
|
1761
|
+
end
|
1762
|
+
end # if defined?
|
1763
|
+
end # Channel
|
1764
|
+
end # Bunny
|
data/lib/bunny/exceptions.rb
CHANGED
data/lib/bunny/session.rb
CHANGED
@@ -171,15 +171,23 @@ module Bunny
|
|
171
171
|
@status = :connecting
|
172
172
|
self.reset_continuations
|
173
173
|
|
174
|
-
|
174
|
+
begin
|
175
|
+
# close existing transport if we have one,
|
176
|
+
# to not leak sockets
|
177
|
+
self.maybe_close_transport
|
178
|
+
self.initialize_transport
|
175
179
|
|
176
|
-
|
177
|
-
|
180
|
+
self.init_connection
|
181
|
+
self.open_connection
|
178
182
|
|
179
|
-
|
180
|
-
|
183
|
+
@event_loop = nil
|
184
|
+
self.start_main_loop if @threaded
|
181
185
|
|
182
|
-
|
186
|
+
@default_channel = self.create_channel
|
187
|
+
rescue Exception => e
|
188
|
+
@status = :not_connected
|
189
|
+
raise e
|
190
|
+
end
|
183
191
|
|
184
192
|
self
|
185
193
|
end
|
@@ -733,6 +741,11 @@ module Bunny
|
|
733
741
|
@transport = Transport.new(self, @host, @port, @opts.merge(:session_thread => Thread.current))
|
734
742
|
end
|
735
743
|
|
744
|
+
# @api private
|
745
|
+
def maybe_close_transport
|
746
|
+
@transport.close if @transport
|
747
|
+
end
|
748
|
+
|
736
749
|
# Sends AMQ protocol header (also known as preamble).
|
737
750
|
# @api private
|
738
751
|
def send_preamble
|
data/lib/bunny/version.rb
CHANGED
@@ -338,4 +338,37 @@ describe Bunny::Session do
|
|
338
338
|
subject.password.should == password
|
339
339
|
end
|
340
340
|
end
|
341
|
+
|
342
|
+
|
343
|
+
context "initialized with a disconnected host" do
|
344
|
+
subject do
|
345
|
+
described_class.new(:port => 38000)
|
346
|
+
end
|
347
|
+
|
348
|
+
it "fails to connect" do
|
349
|
+
lambda do
|
350
|
+
subject.start
|
351
|
+
end.should raise_error(Bunny::TCPConnectionFailed)
|
352
|
+
end
|
353
|
+
|
354
|
+
it "is not connected" do
|
355
|
+
begin
|
356
|
+
subject.start
|
357
|
+
rescue Bunny::TCPConnectionFailed => e
|
358
|
+
true
|
359
|
+
end
|
360
|
+
|
361
|
+
subject.status.should == :not_connected
|
362
|
+
end
|
363
|
+
|
364
|
+
it "is not open" do
|
365
|
+
begin
|
366
|
+
subject.start
|
367
|
+
rescue Bunny::TCPConnectionFailed => e
|
368
|
+
true
|
369
|
+
end
|
370
|
+
|
371
|
+
subject.should_not be_open
|
372
|
+
end
|
373
|
+
end
|
341
374
|
end
|
@@ -1,48 +1,50 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
3
|
+
unless ENV["CI"]
|
4
|
+
describe "Rapidly opening and closing lots of channels" do
|
5
|
+
let(:connection) do
|
6
|
+
c = Bunny.new(:user => "bunny_gem", :password => "bunny_password", :vhost => "bunny_testbed", :automatic_recovery => false)
|
7
|
+
c.start
|
8
|
+
c
|
9
|
+
end
|
9
10
|
|
10
|
-
|
11
|
-
|
12
|
-
|
11
|
+
after :all do
|
12
|
+
connection.close
|
13
|
+
end
|
13
14
|
|
14
|
-
|
15
|
-
|
15
|
+
context "in a single-threaded scenario" do
|
16
|
+
let(:n) { 500 }
|
16
17
|
|
17
|
-
|
18
|
-
|
19
|
-
|
18
|
+
it "works correctly" do
|
19
|
+
xs = Array.new(n) { connection.create_channel }
|
20
|
+
puts "Opened #{n} channels"
|
20
21
|
|
21
|
-
|
22
|
-
|
23
|
-
|
22
|
+
xs.size.should == n
|
23
|
+
xs.each do |ch|
|
24
|
+
ch.close
|
25
|
+
end
|
24
26
|
end
|
25
27
|
end
|
26
|
-
end
|
27
28
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
29
|
+
context "in a multi-threaded scenario" do
|
30
|
+
# actually, on MRI values greater than ~100 will eventually cause write
|
31
|
+
# operations to fail with a timeout (1 second is not enough)
|
32
|
+
# which will cause recovery to re-acquire @channel_mutex in Session.
|
33
|
+
# Because Ruby's mutexes are not re-entrant, it will raise a ThreadError.
|
34
|
+
#
|
35
|
+
# But this already demonstrates that within these platform constraints,
|
36
|
+
# Bunny is safe to use in such scenarios.
|
37
|
+
let(:n) { 20 }
|
38
|
+
|
39
|
+
it "works correctly" do
|
40
|
+
n.times do
|
41
|
+
t = Thread.new do
|
42
|
+
ch = connection.create_channel
|
43
|
+
|
44
|
+
ch.close
|
45
|
+
end
|
46
|
+
t.abort_on_exception = true
|
44
47
|
end
|
45
|
-
t.abort_on_exception = true
|
46
48
|
end
|
47
49
|
end
|
48
50
|
end
|
@@ -1,48 +1,49 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
3
|
+
unless ENV["CI"]
|
4
|
+
describe "Rapidly opening and closing lots of channels on a non-threaded connection" do
|
5
|
+
let(:connection) do
|
6
|
+
c = Bunny.new(:user => "bunny_gem", :password => "bunny_password", :vhost => "bunny_testbed", :automatic_recovery => false, :threaded => false)
|
7
|
+
c.start
|
8
|
+
c
|
9
|
+
end
|
9
10
|
|
10
|
-
|
11
|
-
|
12
|
-
|
11
|
+
after :all do
|
12
|
+
connection.close
|
13
|
+
end
|
13
14
|
|
14
|
-
|
15
|
-
|
15
|
+
context "in a single-threaded scenario" do
|
16
|
+
let(:n) { 500 }
|
16
17
|
|
17
|
-
|
18
|
-
|
19
|
-
puts "Opened #{n} channels"
|
18
|
+
it "works correctly" do
|
19
|
+
xs = Array.new(n) { connection.create_channel }
|
20
20
|
|
21
|
-
|
22
|
-
|
23
|
-
|
21
|
+
xs.size.should == n
|
22
|
+
xs.each do |ch|
|
23
|
+
ch.close
|
24
|
+
end
|
24
25
|
end
|
25
26
|
end
|
26
|
-
end
|
27
27
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
28
|
+
context "in a multi-threaded scenario" do
|
29
|
+
# actually, on MRI values greater than ~100 will eventually cause write
|
30
|
+
# operations to fail with a timeout (1 second is not enough)
|
31
|
+
# which will cause recovery to re-acquire @channel_mutex in Session.
|
32
|
+
# Because Ruby's mutexes are not re-entrant, it will raise a ThreadError.
|
33
|
+
#
|
34
|
+
# But this already demonstrates that within these platform constraints,
|
35
|
+
# Bunny is safe to use in such scenarios.
|
36
|
+
let(:n) { 20 }
|
37
|
+
|
38
|
+
it "works correctly" do
|
39
|
+
n.times do
|
40
|
+
t = Thread.new do
|
41
|
+
ch = connection.create_channel
|
42
|
+
|
43
|
+
ch.close
|
44
|
+
end
|
45
|
+
t.abort_on_exception = true
|
44
46
|
end
|
45
|
-
t.abort_on_exception = true
|
46
47
|
end
|
47
48
|
end
|
48
49
|
end
|
@@ -1,66 +1,68 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
require "spec_helper"
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
4
|
+
unless ENV["CI"]
|
5
|
+
describe "Concurrent consumers sharing a connection" do
|
6
|
+
let(:connection) do
|
7
|
+
c = Bunny.new(:user => "bunny_gem", :password => "bunny_password", :vhost => "bunny_testbed", :automatic_recovery => false)
|
8
|
+
c.start
|
9
|
+
c
|
10
|
+
end
|
10
11
|
|
11
|
-
|
12
|
-
|
13
|
-
|
12
|
+
after :all do
|
13
|
+
connection.close
|
14
|
+
end
|
14
15
|
|
15
|
-
|
16
|
-
|
17
|
-
|
16
|
+
def any_not_drained?(qs)
|
17
|
+
qs.any? { |q| !q.message_count.zero? }
|
18
|
+
end
|
18
19
|
|
19
|
-
|
20
|
-
|
20
|
+
context "when publishing thousands of messages over 128K in size" do
|
21
|
+
let(:colors) { ["red", "blue", "white"] }
|
21
22
|
|
22
|
-
|
23
|
-
|
23
|
+
let(:n) { 32 }
|
24
|
+
let(:m) { 1000 }
|
24
25
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
26
|
+
it "successfully drain all queues" do
|
27
|
+
ch = connection.create_channel
|
28
|
+
body = "абвг"
|
29
|
+
x = ch.topic("bunny.stress.concurrent.consumers.topic", :durable => true)
|
29
30
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
31
|
+
chs = {}
|
32
|
+
n.times do |i|
|
33
|
+
chs[i] = connection.create_channel
|
34
|
+
end
|
35
|
+
qs = []
|
35
36
|
|
36
|
-
|
37
|
-
|
38
|
-
|
37
|
+
n.times do |i|
|
38
|
+
t = Thread.new do
|
39
|
+
cht = chs[i]
|
39
40
|
|
40
|
-
|
41
|
-
|
42
|
-
|
41
|
+
q = cht.queue("", :exclusive => true)
|
42
|
+
q.bind(x.name, :routing_key => colors.sample).subscribe do |delivery_info, meta, payload|
|
43
|
+
# no-op
|
44
|
+
end
|
45
|
+
qs << q
|
43
46
|
end
|
44
|
-
|
47
|
+
t.abort_on_exception = true
|
45
48
|
end
|
46
|
-
t.abort_on_exception = true
|
47
|
-
end
|
48
49
|
|
49
|
-
|
50
|
+
sleep 1.0
|
50
51
|
|
51
|
-
|
52
|
-
|
53
|
-
|
52
|
+
5.times do |i|
|
53
|
+
m.times do
|
54
|
+
x.publish(body, :routing_key => colors.sample)
|
55
|
+
end
|
56
|
+
puts "Published #{(i + 1) * m} messages..."
|
54
57
|
end
|
55
|
-
puts "Published #{(i + 1) * m} messages..."
|
56
|
-
end
|
57
58
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
59
|
+
while any_not_drained?(qs)
|
60
|
+
sleep 1.0
|
61
|
+
end
|
62
|
+
puts "Drained all the queues..."
|
62
63
|
|
63
|
-
|
64
|
+
ch.close
|
65
|
+
end
|
64
66
|
end
|
65
67
|
end
|
66
68
|
end
|
@@ -1,58 +1,60 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
require "spec_helper"
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
4
|
+
unless ENV["CI"]
|
5
|
+
describe "Concurrent publishers sharing a connection" do
|
6
|
+
let(:connection) do
|
7
|
+
c = Bunny.new(:user => "bunny_gem", :password => "bunny_password", :vhost => "bunny_testbed", :automatically_recover => false)
|
8
|
+
c.start
|
9
|
+
c
|
10
|
+
end
|
10
11
|
|
11
|
-
|
12
|
-
|
13
|
-
|
12
|
+
after :all do
|
13
|
+
connection.close
|
14
|
+
end
|
14
15
|
|
15
|
-
|
16
|
-
|
16
|
+
let(:n) { 32 }
|
17
|
+
let(:m) { 1000 }
|
17
18
|
|
18
|
-
|
19
|
-
|
19
|
+
it "successfully finish publishing" do
|
20
|
+
ch = connection.create_channel
|
20
21
|
|
21
|
-
|
22
|
-
|
22
|
+
q = ch.queue("", :exclusive => true)
|
23
|
+
body = "сообщение"
|
23
24
|
|
24
|
-
|
25
|
-
|
25
|
+
# let the queue name be sent back by RabbitMQ
|
26
|
+
sleep 0.25
|
26
27
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
28
|
+
chs = {}
|
29
|
+
n.times do |i|
|
30
|
+
chs[i] = connection.create_channel
|
31
|
+
end
|
31
32
|
|
32
|
-
|
33
|
+
ts = []
|
33
34
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
35
|
+
n.times do |i|
|
36
|
+
t = Thread.new do
|
37
|
+
cht = chs[i]
|
38
|
+
x = ch.default_exchange
|
38
39
|
|
39
|
-
|
40
|
-
|
41
|
-
|
40
|
+
5.times do |i|
|
41
|
+
m.times do
|
42
|
+
x.publish(body, :routing_key => q.name)
|
43
|
+
end
|
44
|
+
puts "Published #{(i + 1) * m} messages..."
|
42
45
|
end
|
43
|
-
puts "Published #{(i + 1) * m} messages..."
|
44
46
|
end
|
47
|
+
t.abort_on_exception = true
|
48
|
+
|
49
|
+
ts << t
|
45
50
|
end
|
46
|
-
t.abort_on_exception = true
|
47
51
|
|
48
|
-
ts
|
49
|
-
|
52
|
+
ts.each do |t|
|
53
|
+
t.join
|
54
|
+
end
|
50
55
|
|
51
|
-
|
52
|
-
|
56
|
+
sleep 4.0
|
57
|
+
q.message_count.should == 5 * n * m
|
53
58
|
end
|
54
|
-
|
55
|
-
sleep 4.0
|
56
|
-
q.message_count.should == 5 * n * m
|
57
59
|
end
|
58
60
|
end
|
@@ -45,27 +45,29 @@ describe Bunny::Concurrent::Condition do
|
|
45
45
|
end
|
46
46
|
|
47
47
|
describe "#notify_all" do
|
48
|
+
let(:n) { 20 }
|
49
|
+
|
48
50
|
it "notifies all the threads waiting on the latch" do
|
49
51
|
condition = described_class.new
|
50
52
|
@xs = []
|
51
53
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
t2 = Thread.new do
|
59
|
-
condition.wait
|
60
|
-
@xs << :notified2
|
54
|
+
n.times do |i|
|
55
|
+
t = Thread.new do
|
56
|
+
condition.wait
|
57
|
+
@xs << "notified#{i + 1}".to_sym
|
58
|
+
end
|
59
|
+
t.abort_on_exception = true
|
61
60
|
end
|
62
|
-
t2.abort_on_exception = true
|
63
61
|
|
64
62
|
sleep 0.5
|
65
63
|
condition.notify_all
|
66
64
|
sleep 0.5
|
67
|
-
|
68
|
-
|
65
|
+
|
66
|
+
n.times do |i|
|
67
|
+
item = "notified#{i + 1}".to_sym
|
68
|
+
|
69
|
+
@xs.should include(item)
|
70
|
+
end
|
69
71
|
end
|
70
72
|
end
|
71
73
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bunny
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.0.
|
4
|
+
version: 0.9.0.pre10
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ authors:
|
|
13
13
|
autorequire:
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
|
-
date: 2013-
|
16
|
+
date: 2013-05-02 00:00:00.000000000 Z
|
17
17
|
dependencies:
|
18
18
|
- !ruby/object:Gem::Dependency
|
19
19
|
name: amq-protocol
|
@@ -21,13 +21,13 @@ dependencies:
|
|
21
21
|
requirements:
|
22
22
|
- - ">="
|
23
23
|
- !ruby/object:Gem::Version
|
24
|
-
version: 1.
|
24
|
+
version: 1.4.0
|
25
25
|
none: false
|
26
26
|
requirement: !ruby/object:Gem::Requirement
|
27
27
|
requirements:
|
28
28
|
- - ">="
|
29
29
|
- !ruby/object:Gem::Version
|
30
|
-
version: 1.
|
30
|
+
version: 1.4.0
|
31
31
|
none: false
|
32
32
|
prerelease: false
|
33
33
|
type: :runtime
|
@@ -50,6 +50,7 @@ extra_rdoc_files:
|
|
50
50
|
files:
|
51
51
|
- ".gitignore"
|
52
52
|
- ".rspec"
|
53
|
+
- ".ruby-version"
|
53
54
|
- ".travis.yml"
|
54
55
|
- ".yardopts"
|
55
56
|
- ChangeLog.md
|