bunny 2.7.0 → 2.7.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CONTRIBUTING.md +4 -2
- data/ChangeLog.md +45 -1
- data/README.md +1 -1
- data/lib/bunny/channel.rb +6 -1
- data/lib/bunny/session.rb +33 -8
- data/lib/bunny/version.rb +1 -1
- data/spec/higher_level_api/integration/basic_get_spec.rb +24 -0
- data/spec/higher_level_api/integration/tls_connection_spec.rb +44 -36
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3f58b34695f1799decb5818ead7efbf21448656d
|
4
|
+
data.tar.gz: 4c8db08cd4581da8eab1bdd0afd81693d4042a55
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 941c64ca6a10063df82456aec1f5dd4a44d5df67c6d9e74a73cfc41821b1b3d29f2ddfe260ea31434adb0697d5136d6cbc28e5a84e8adaca2b83d8897fb8d164
|
7
|
+
data.tar.gz: a3056eae41a6600aeed337094851c1f5f16e0f80e7b8170e2a7a18d22ac2caabdb0cf0ce69637c1f9f0ecdee7e693d1e9cf84dbc66ebfdd866bd6602a6b84a67
|
data/CONTRIBUTING.md
CHANGED
@@ -30,8 +30,10 @@ these. TLS (x509 PEM) certificates include a hostname-specific fields,
|
|
30
30
|
the tests allow for expecting hostname overriding using the `BUNNY_RABBITMQ_HOSTNAME`
|
31
31
|
environment variables (default value is `127.0.0.1`).
|
32
32
|
|
33
|
-
Server, CA and client certificates can be found under `spec/tls`.
|
34
|
-
|
33
|
+
Server, CA and client certificates can be found under `spec/tls`.
|
34
|
+
The location can be overridden via the `BUNNY_CERTIFICATE_DIR` environment variable.
|
35
|
+
It is supposed to target [tls-gen](https://github.com/michaelklishin/tls-gen)'s basic profile
|
36
|
+
output (result) directory on the host where specs are to be executed.
|
35
37
|
|
36
38
|
Next up you'll need to prepare your node for the specs (just once):
|
37
39
|
|
data/ChangeLog.md
CHANGED
@@ -1,8 +1,52 @@
|
|
1
|
-
## Changes between Bunny 2.7.
|
1
|
+
## Changes between Bunny 2.7.1 and 2.7.2 (unreleased)
|
2
2
|
|
3
3
|
No changes yet.
|
4
4
|
|
5
5
|
|
6
|
+
## Changes between Bunny 2.7.0 and 2.7.1 (Sep 25th, 2017)
|
7
|
+
|
8
|
+
### Sensible Socket Read Timeouts When RabbitMQ is Configured to Disabled Heartbeats
|
9
|
+
|
10
|
+
Bunny now correctly handles scenarios where server is configured
|
11
|
+
to disable heartbeats (which is a terrible idea, don't do it!)
|
12
|
+
|
13
|
+
GitHub issue: [#519](https://github.com/ruby-amqp/bunny/issues/519).
|
14
|
+
|
15
|
+
### Bunny::Channel#basic_get Usability
|
16
|
+
|
17
|
+
`Bunny::Channel#basic_get` invoked with a non-existent queue now
|
18
|
+
throws a channel exception instead of a generic operation timeout.
|
19
|
+
|
20
|
+
GitHub issue: [#518](https://github.com/ruby-amqp/bunny/issues/518).
|
21
|
+
|
22
|
+
### Spec Suite Improvements
|
23
|
+
|
24
|
+
`BUNNY_CERTIFICATE_DIR` environment variable now can be used
|
25
|
+
to override local CA and client certificate/key pair directory.
|
26
|
+
The directory is expected to be the result directory generated
|
27
|
+
by the basic [tls-gen](http://github.com/michaelklishin/tls-gen) profile.
|
28
|
+
|
29
|
+
TLSv1.0 is no longer used in tests because it's being disabled by default
|
30
|
+
by more and more installations as it has known vulnerabilities
|
31
|
+
and is no longer considered to be acceptable by several compliance
|
32
|
+
standards (e.g. PCI DSS).
|
33
|
+
|
34
|
+
### Improved Synchronisation for channel.close Handlers
|
35
|
+
|
36
|
+
`channel.close` handler will now acquire a lock . This avoids concurrency
|
37
|
+
hazards in some rare scenarios when a channel is closed due a protocol
|
38
|
+
exception by the server and concurrently opened by user code
|
39
|
+
at the same time.
|
40
|
+
|
41
|
+
### More Meaningful Error Messages in Bunny::Session#create_channel
|
42
|
+
|
43
|
+
Sometimes users attempt to open a channel on a connection that
|
44
|
+
isn't connected yet because `Bunny::Session#start` was never invoked.
|
45
|
+
|
46
|
+
`Bunny::Session#create_channel` will now provide a more sensible exception message
|
47
|
+
in those cases.
|
48
|
+
|
49
|
+
|
6
50
|
## Changes between Bunny 2.6.0 and 2.7.0 (May 11th, 2017)
|
7
51
|
|
8
52
|
### amq-protocol Update
|
data/README.md
CHANGED
data/lib/bunny/channel.rb
CHANGED
@@ -602,7 +602,12 @@ module Bunny
|
|
602
602
|
# we implement them). So we return a triple of nils immediately which apps should be
|
603
603
|
# able to handle anyway as "got no message, no need to act". MK.
|
604
604
|
last_basic_get_response = if @connection.open?
|
605
|
-
|
605
|
+
begin
|
606
|
+
wait_on_basic_get_continuations
|
607
|
+
rescue Timeout::Error => e
|
608
|
+
raise_if_continuation_resulted_in_a_channel_error!
|
609
|
+
raise e
|
610
|
+
end
|
606
611
|
else
|
607
612
|
[nil, nil, nil]
|
608
613
|
end
|
data/lib/bunny/session.rb
CHANGED
@@ -101,16 +101,18 @@ module Bunny
|
|
101
101
|
# @option connection_string_or_opts [String] :username ("guest") Username
|
102
102
|
# @option connection_string_or_opts [String] :password ("guest") Password
|
103
103
|
# @option connection_string_or_opts [String] :vhost ("/") Virtual host to use
|
104
|
-
# @option connection_string_or_opts [Integer] :heartbeat (
|
104
|
+
# @option connection_string_or_opts [Integer, Symbol] :heartbeat (:server) Heartbeat interval. :server means use the default suggested by RabbitMQ. 0 means no heartbeat (not recommended).
|
105
105
|
# @option connection_string_or_opts [Integer] :network_recovery_interval (4) Recovery interval periodic network recovery will use. This includes initial pause after network failure.
|
106
106
|
# @option connection_string_or_opts [Boolean] :tls (false) Should TLS/SSL be used?
|
107
107
|
# @option connection_string_or_opts [String] :tls_cert (nil) Path to client TLS/SSL certificate file (.pem)
|
108
108
|
# @option connection_string_or_opts [String] :tls_key (nil) Path to client TLS/SSL private key file (.pem)
|
109
109
|
# @option connection_string_or_opts [Array<String>] :tls_ca_certificates Array of paths to TLS/SSL CA files (.pem), by default detected from OpenSSL configuration
|
110
110
|
# @option connection_string_or_opts [String] :verify_peer (true) Whether TLS peer verification should be performed
|
111
|
-
# @option connection_string_or_opts [
|
111
|
+
# @option connection_string_or_opts [Symbol] :tls_version (negotiated) What TLS version should be used (:TLSv1, :TLSv1_1, or :TLSv1_2)
|
112
112
|
# @option connection_string_or_opts [Integer] :continuation_timeout (15000) Timeout for client operations that expect a response (e.g. {Bunny::Queue#get}), in milliseconds.
|
113
|
-
# @option connection_string_or_opts [Integer] :connection_timeout (
|
113
|
+
# @option connection_string_or_opts [Integer] :connection_timeout (30) Timeout in seconds for connecting to the server.
|
114
|
+
# @option connection_string_or_opts [Integer] :read_timeout (30) TCP socket read timeout in seconds.
|
115
|
+
# @option connection_string_or_opts [Integer] :write_timeout (30) TCP socket write timeout in seconds.
|
114
116
|
# @option connection_string_or_opts [Proc] :hosts_shuffle_strategy A Proc that reorders a list of host strings, defaults to Array#shuffle
|
115
117
|
# @option connection_string_or_opts [Logger] :logger The logger. If missing, one is created using :log_file and :log_level.
|
116
118
|
# @option connection_string_or_opts [IO, String] :log_file The file or path to use when creating a logger. Defaults to STDOUT.
|
@@ -346,6 +348,7 @@ module Bunny
|
|
346
348
|
def create_channel(n = nil, consumer_pool_size = 1, consumer_pool_abort_on_exception = false, consumer_pool_shutdown_timeout = 60)
|
347
349
|
raise ArgumentError, "channel number 0 is reserved in the protocol and cannot be used" if 0 == n
|
348
350
|
raise ConnectionAlreadyClosed if manually_closed?
|
351
|
+
raise RuntimeError, "this connection is not open. Was Bunny::Session#start invoked? Is automatic recovery enabled?" if !connected?
|
349
352
|
|
350
353
|
@channel_mutex.synchronize do
|
351
354
|
if n && (ch = @channels[n])
|
@@ -540,6 +543,16 @@ module Bunny
|
|
540
543
|
end
|
541
544
|
end
|
542
545
|
|
546
|
+
# @private
|
547
|
+
def find_channel(number)
|
548
|
+
@channels[number]
|
549
|
+
end
|
550
|
+
|
551
|
+
# @private
|
552
|
+
def synchronised_find_channel(number)
|
553
|
+
@channel_mutex.synchronize { @channels[number] }
|
554
|
+
end
|
555
|
+
|
543
556
|
# @private
|
544
557
|
def close_all_channels
|
545
558
|
@channel_mutex.synchronize do
|
@@ -606,15 +619,20 @@ module Bunny
|
|
606
619
|
@unblock_callback.call(method) if @unblock_callback
|
607
620
|
when AMQ::Protocol::Channel::Close then
|
608
621
|
begin
|
609
|
-
ch =
|
622
|
+
ch = synchronised_find_channel(ch_number)
|
623
|
+
# this includes sending a channel.close-ok and
|
624
|
+
# potentially invoking a user-provided callback,
|
625
|
+
# avoid doing that while holding a mutex lock. MK.
|
610
626
|
ch.handle_method(method)
|
611
627
|
ensure
|
628
|
+
# synchronises on @channel_mutex under the hood
|
612
629
|
self.unregister_channel(ch)
|
613
630
|
end
|
614
631
|
when AMQ::Protocol::Basic::GetEmpty then
|
615
|
-
|
632
|
+
ch = find_channel(ch_number)
|
633
|
+
ch.handle_basic_get_empty(method)
|
616
634
|
else
|
617
|
-
if ch =
|
635
|
+
if ch = find_channel(ch_number)
|
618
636
|
ch.handle_method(method)
|
619
637
|
else
|
620
638
|
@logger.warn "Channel #{ch_number} is not open on this connection!"
|
@@ -1161,11 +1179,18 @@ module Bunny
|
|
1161
1179
|
|
1162
1180
|
# We set the read_write_timeout to twice the heartbeat value
|
1163
1181
|
# This allows us to miss a single heartbeat before we time out the socket.
|
1164
|
-
|
1182
|
+
#
|
1183
|
+
# Since RabbitMQ can be configured to disable heartbeats (bad idea but technically
|
1184
|
+
# possible nonetheless), we need to take both client and server values into
|
1185
|
+
# consideration when deciding about using the heartbeat value for read timeouts.
|
1186
|
+
@transport.read_timeout = if heartbeat_disabled?(@client_heartbeat) || heartbeat_disabled?(@heartbeat)
|
1187
|
+
@logger.debug { "Will use default socket read timeout of #{Transport::DEFAULT_READ_TIMEOUT}" }
|
1165
1188
|
Transport::DEFAULT_READ_TIMEOUT
|
1166
1189
|
else
|
1167
1190
|
# pad to account for edge cases. MK.
|
1168
|
-
@heartbeat * 2.2
|
1191
|
+
n = @heartbeat * 2.2
|
1192
|
+
@logger.debug { "Will use socket read timeout of #{n}" }
|
1193
|
+
n
|
1169
1194
|
end
|
1170
1195
|
|
1171
1196
|
|
data/lib/bunny/version.rb
CHANGED
@@ -54,3 +54,27 @@ describe Bunny::Queue, "#pop" do
|
|
54
54
|
end
|
55
55
|
end
|
56
56
|
end
|
57
|
+
|
58
|
+
|
59
|
+
describe Bunny::Channel, "#basic_get" do
|
60
|
+
let(:connection) do
|
61
|
+
c = Bunny.new(username: "bunny_gem", password: "bunny_password", vhost: "bunny_testbed",
|
62
|
+
automatically_recover: false, continuation_timeout: 3000)
|
63
|
+
c.start
|
64
|
+
c
|
65
|
+
end
|
66
|
+
|
67
|
+
after :each do
|
68
|
+
connection.close if connection.open?
|
69
|
+
end
|
70
|
+
|
71
|
+
context "with a non-existent queue" do
|
72
|
+
it "throws a NOT_FOUND" do
|
73
|
+
ch = connection.create_channel
|
74
|
+
|
75
|
+
expect do
|
76
|
+
ch.basic_get "non_existent_#{rand.to_s}"
|
77
|
+
end.to raise_error(Bunny::NotFound)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -2,10 +2,14 @@
|
|
2
2
|
require "spec_helper"
|
3
3
|
|
4
4
|
unless ENV["CI"]
|
5
|
+
CERTIFICATE_DIR=ENV.fetch("BUNNY_CERTIFICATE_DIR", "./spec/tls")
|
6
|
+
puts "Will use certificates from #{CERTIFICATE_DIR}"
|
7
|
+
|
5
8
|
shared_examples_for "successful TLS connection" do
|
6
9
|
it "succeeds" do
|
7
|
-
expect(
|
8
|
-
ch =
|
10
|
+
expect(subject).to be_tls
|
11
|
+
ch = subject.create_channel
|
12
|
+
ch.confirm_select
|
9
13
|
|
10
14
|
q = ch.queue("", exclusive: true)
|
11
15
|
x = ch.default_exchange
|
@@ -15,7 +19,7 @@ unless ENV["CI"]
|
|
15
19
|
publish("xyzzy", routing_key: q.name).
|
16
20
|
publish("xyzzy", routing_key: q.name)
|
17
21
|
|
18
|
-
|
22
|
+
x.wait_for_confirms
|
19
23
|
expect(q.message_count).to eq 4
|
20
24
|
|
21
25
|
i = 0
|
@@ -41,9 +45,9 @@ unless ENV["CI"]
|
|
41
45
|
:vhost => "bunny_testbed",
|
42
46
|
:tls => true,
|
43
47
|
:verify_peer => verify_peer,
|
44
|
-
:tls_cert => "
|
45
|
-
:tls_key => "
|
46
|
-
:tls_ca_certificates => ["
|
48
|
+
:tls_cert => "#{CERTIFICATE_DIR}/client_certificate.pem",
|
49
|
+
:tls_key => "#{CERTIFICATE_DIR}/client_key.pem",
|
50
|
+
:tls_ca_certificates => ["#{CERTIFICATE_DIR}/ca_certificate.pem"])
|
47
51
|
end
|
48
52
|
|
49
53
|
context "peer verification is off" do
|
@@ -58,6 +62,10 @@ unless ENV["CI"]
|
|
58
62
|
subject.start
|
59
63
|
expect(subject.transport.socket.hostname).to_not be_empty
|
60
64
|
end
|
65
|
+
|
66
|
+
after :each do
|
67
|
+
subject.close
|
68
|
+
end
|
61
69
|
end
|
62
70
|
|
63
71
|
context "peer verification is on" do
|
@@ -70,21 +78,21 @@ unless ENV["CI"]
|
|
70
78
|
end
|
71
79
|
|
72
80
|
describe "TLS connection to RabbitMQ with client certificates" do
|
73
|
-
let(:
|
81
|
+
let(:subject) do
|
74
82
|
c = Bunny.new(username: "bunny_gem",
|
75
83
|
password: "bunny_password",
|
76
84
|
vhost: "bunny_testbed",
|
77
85
|
tls: true,
|
78
|
-
tls_cert: "
|
79
|
-
tls_key: "
|
80
|
-
tls_ca_certificates: ["
|
86
|
+
tls_cert: "#{CERTIFICATE_DIR}/client_certificate.pem",
|
87
|
+
tls_key: "#{CERTIFICATE_DIR}/client_key.pem",
|
88
|
+
tls_ca_certificates: ["#{CERTIFICATE_DIR}/ca_certificate.pem"],
|
81
89
|
verify_peer: false)
|
82
90
|
c.start
|
83
91
|
c
|
84
92
|
end
|
85
93
|
|
86
94
|
after :each do
|
87
|
-
|
95
|
+
subject.close
|
88
96
|
end
|
89
97
|
|
90
98
|
include_examples "successful TLS connection"
|
@@ -92,19 +100,19 @@ unless ENV["CI"]
|
|
92
100
|
|
93
101
|
|
94
102
|
describe "TLS connection to RabbitMQ without client certificates" do
|
95
|
-
let(:
|
103
|
+
let(:subject) do
|
96
104
|
c = Bunny.new(username: "bunny_gem",
|
97
105
|
password: "bunny_password",
|
98
106
|
vhost: "bunny_testbed",
|
99
107
|
tls: true,
|
100
|
-
tls_ca_certificates: ["
|
108
|
+
tls_ca_certificates: ["#{CERTIFICATE_DIR}/ca_certificate.pem"],
|
101
109
|
verify_peer: false)
|
102
110
|
c.start
|
103
111
|
c
|
104
112
|
end
|
105
113
|
|
106
114
|
after :each do
|
107
|
-
|
115
|
+
subject.close
|
108
116
|
end
|
109
117
|
|
110
118
|
include_examples "successful TLS connection"
|
@@ -112,18 +120,18 @@ unless ENV["CI"]
|
|
112
120
|
|
113
121
|
|
114
122
|
describe "TLS connection to RabbitMQ with a connection string" do
|
115
|
-
let(:
|
123
|
+
let(:subject) do
|
116
124
|
c = Bunny.new("amqps://bunny_gem:bunny_password@#{local_hostname}/bunny_testbed",
|
117
|
-
tls_cert: "
|
118
|
-
tls_key: "
|
119
|
-
tls_ca_certificates: ["
|
125
|
+
tls_cert: "#{CERTIFICATE_DIR}/client_certificate.pem",
|
126
|
+
tls_key: "#{CERTIFICATE_DIR}/client_key.pem",
|
127
|
+
tls_ca_certificates: ["#{CERTIFICATE_DIR}/ca_certificate.pem"],
|
120
128
|
verify_peer: false)
|
121
129
|
c.start
|
122
130
|
c
|
123
131
|
end
|
124
132
|
|
125
133
|
after :each do
|
126
|
-
|
134
|
+
subject.close
|
127
135
|
end
|
128
136
|
|
129
137
|
include_examples "successful TLS connection"
|
@@ -131,16 +139,16 @@ unless ENV["CI"]
|
|
131
139
|
|
132
140
|
|
133
141
|
describe "TLS connection to RabbitMQ with a connection string and w/o client certificate and key" do
|
134
|
-
let(:
|
142
|
+
let(:subject) do
|
135
143
|
c = Bunny.new("amqps://bunny_gem:bunny_password@#{local_hostname}/bunny_testbed",
|
136
|
-
tls_ca_certificates: ["
|
144
|
+
tls_ca_certificates: ["#{CERTIFICATE_DIR}/ca_certificate.pem"],
|
137
145
|
verify_peer: verify_peer)
|
138
146
|
c.start
|
139
147
|
c
|
140
148
|
end
|
141
149
|
|
142
150
|
after :each do
|
143
|
-
|
151
|
+
subject.close
|
144
152
|
end
|
145
153
|
|
146
154
|
context "peer verification is off" do
|
@@ -150,7 +158,7 @@ unless ENV["CI"]
|
|
150
158
|
|
151
159
|
it "sends the SNI details" do
|
152
160
|
# https://github.com/ruby-amqp/bunny/issues/440
|
153
|
-
expect(
|
161
|
+
expect(subject.transport.socket.hostname).to_not be_empty
|
154
162
|
end
|
155
163
|
end
|
156
164
|
|
@@ -161,54 +169,54 @@ unless ENV["CI"]
|
|
161
169
|
|
162
170
|
it "sends the SNI details" do
|
163
171
|
# https://github.com/ruby-amqp/bunny/issues/440
|
164
|
-
expect(
|
172
|
+
expect(subject.transport.socket.hostname).to_not be_empty
|
165
173
|
end
|
166
174
|
end
|
167
175
|
end
|
168
176
|
|
169
177
|
|
170
178
|
describe "TLS connection to RabbitMQ with client certificates provided inline" do
|
171
|
-
let(:
|
179
|
+
let(:subject) do
|
172
180
|
c = Bunny.new(username: "bunny_gem",
|
173
181
|
password: "bunny_password",
|
174
182
|
vhost: "bunny_testbed",
|
175
183
|
tls: true,
|
176
|
-
tls_cert: File.read("
|
177
|
-
tls_key: File.read("
|
178
|
-
tls_ca_certificates: ["
|
184
|
+
tls_cert: File.read("#{CERTIFICATE_DIR}/client_certificate.pem"),
|
185
|
+
tls_key: File.read("#{CERTIFICATE_DIR}/client_key.pem"),
|
186
|
+
tls_ca_certificates: ["#{CERTIFICATE_DIR}/ca_certificate.pem"],
|
179
187
|
verify_peer: false)
|
180
188
|
c.start
|
181
189
|
c
|
182
190
|
end
|
183
191
|
|
184
192
|
after :each do
|
185
|
-
|
193
|
+
subject.close
|
186
194
|
end
|
187
195
|
|
188
196
|
include_examples "successful TLS connection"
|
189
197
|
end
|
190
198
|
|
191
|
-
describe "TLS connection to RabbitMQ with tls_version TLSv1 specified" do
|
192
|
-
let(:
|
199
|
+
describe "TLS connection to RabbitMQ with tls_version TLSv1.1 specified" do
|
200
|
+
let(:subject) do
|
193
201
|
c = Bunny.new(username: "bunny_gem",
|
194
202
|
password: "bunny_password",
|
195
203
|
vhost: "bunny_testbed",
|
196
204
|
tls: true,
|
197
|
-
tls_protocol: :
|
198
|
-
tls_ca_certificates: ["
|
205
|
+
tls_protocol: :TLSv1_1,
|
206
|
+
tls_ca_certificates: ["#{CERTIFICATE_DIR}/ca_certificate.pem"],
|
199
207
|
verify_peer: false)
|
200
208
|
c.start
|
201
209
|
c
|
202
210
|
end
|
203
211
|
|
204
212
|
after :each do
|
205
|
-
|
213
|
+
subject.close
|
206
214
|
end
|
207
215
|
|
208
216
|
include_examples "successful TLS connection"
|
209
217
|
|
210
|
-
it "connects using TLSv1" do
|
211
|
-
expect(
|
218
|
+
it "connects using TLSv1.1" do
|
219
|
+
expect(subject.transport.socket.ssl_version).to eq "TLSv1.1"
|
212
220
|
end
|
213
221
|
end
|
214
222
|
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: 2.7.
|
4
|
+
version: 2.7.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Duncan
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date: 2017-
|
15
|
+
date: 2017-09-24 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: amq-protocol
|
@@ -231,7 +231,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
231
231
|
version: '0'
|
232
232
|
requirements: []
|
233
233
|
rubyforge_project:
|
234
|
-
rubygems_version: 2.6.
|
234
|
+
rubygems_version: 2.6.13
|
235
235
|
signing_key:
|
236
236
|
specification_version: 4
|
237
237
|
summary: Popular easy to use Ruby client for RabbitMQ
|