bunny 1.2.2 → 1.3.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0b9d1b9674fc6fe77346de7896e4ac8900c4c047
4
- data.tar.gz: 19972fd3c10baf9a7acf1bc2c49a43ed995baeaa
3
+ metadata.gz: 972f0f0055bbc831144da54e6805c4d5f5e2262c
4
+ data.tar.gz: ad2f3539fb6946771238e6451b17d33cfdba692b
5
5
  SHA512:
6
- metadata.gz: ba09b21e9cbe72298decba6a551ecc554e17ff58c7f88a907979a4859453c7674341989588fd407d6923de40ebaa9e6af9cbbe31615e41d223a8c4163c5f89a0
7
- data.tar.gz: df71d64b16826cfb887db8bcec84ecc114410cfaa92e9c97ca2d03cc003ffa7558998fcad6019031729c999888642ec82a69e2b00d10e3984b538dec61ebd800
6
+ metadata.gz: ad93a02f5623437589eb2027259de36a2269df8ab06d251b00e6b28b265f8f562068a1c7e473b2513eff18bdde77902b46a24c114a9a1c9dbe29426c93f67085
7
+ data.tar.gz: da94e1d8349674cf2819678f2fb18a1fd911017fb7c99104d64d755c9d7f9622068db60a5502411c6442d04fe341372d09d31c6e5885c0cda18293ea04db3e81
@@ -1,4 +1,25 @@
1
- ## Changes between Bunny 1.2.1 and 1.2.2
1
+ ## Changes between Bunny 1.2.0 and 1.3.0
2
+
3
+ ### TLS Can Be Explicitly Disabled
4
+
5
+ TLS now can be explicitly disabled even when connecting (without TLS)
6
+ to the default RabbitMQ TLS/amqps port (5671):
7
+
8
+ ``` ruby
9
+ conn = Bunny.new(:port => 5671, :tls => false)
10
+ ```
11
+
12
+ Contributed by Muhan Zou.
13
+
14
+
15
+ ### Single Threaded Connections Raise Shutdown Exceptions
16
+
17
+ Single threaded Bunny connections will now raise exceptions
18
+ that occur during shutdown as is (instead of trying to shut down
19
+ I/O loop which only threaded ones have).
20
+
21
+ Contributed by Carl Hörberg.
22
+
2
23
 
3
24
  ### Synchronization Improvements for Session#close
4
25
 
@@ -6,7 +27,29 @@
6
27
  eliminating a few race condition scenarios with I/O reader thread.
7
28
 
8
29
 
9
- ## Changes between Bunny 1.2.0 and 1.2.1
30
+ ### Bunny::Exchange.default Fix
31
+
32
+ `Bunny::Exchange.default` no longer raises an exception.
33
+
34
+ Note that it is a legacy compatibility method. Please use
35
+ `Bunny::Channel#default_exchange` instead.
36
+
37
+ Contributed by Justin Litchfield.
38
+
39
+ GH issue [#211](https://github.com/ruby-amqp/bunny/pull/211).
40
+
41
+ ### Bunny::Queue#pop_as_hash Removed
42
+
43
+ `Bunny::Queue#pop_as_hash`, which was added to ease migration
44
+ to Bunny 0.9, was removed.
45
+
46
+ ### Bunny::Queue#pop Wraps Metadata
47
+
48
+ `Bunny::Queue#pop` now wraps `basic.get-ok` and message properties
49
+ into `Bunny::GetResponse` and `Bunny::MessageProperties`, just like
50
+ `basic.consume` deliveries.
51
+
52
+ GH issue: [#212](https://github.com/ruby-amqp/bunny/issues/212).
10
53
 
11
54
  ### Better Synchronization for Publisher Confirms
12
55
 
@@ -23,6 +66,7 @@ on a recovered connection (in addition to the channels
23
66
  it already had).
24
67
 
25
68
 
69
+
26
70
  ## Changes between Bunny 1.1.0 and 1.2.0
27
71
 
28
72
  ### :key Supported in Bunny::Channel#queue_bind
data/Gemfile CHANGED
@@ -34,7 +34,7 @@ group :development do
34
34
  end
35
35
 
36
36
  group :test do
37
- gem "rspec", ">= 2.13.0"
37
+ gem "rspec", "~> 2.13.0"
38
38
  gem "rabbitmq_http_api_client", "~> 1.1.0"
39
39
  end
40
40
 
@@ -0,0 +1,83 @@
1
+ require "bunny/versioned_delivery_tag"
2
+
3
+ module Bunny
4
+ # Wraps {AMQ::Protocol::Basic::GetOk} to
5
+ # provide access to the delivery properties as immutable hash as
6
+ # well as methods.
7
+ class GetResponse
8
+
9
+ #
10
+ # Behaviors
11
+ #
12
+
13
+ include Enumerable
14
+
15
+ #
16
+ # API
17
+ #
18
+
19
+ # @return [Bunny::Channel] Channel this basic.get-ok response is on
20
+ attr_reader :channel
21
+
22
+ # @private
23
+ def initialize(get_ok, consumer, channel)
24
+ @get_ok = get_ok
25
+ @hash = {
26
+ :delivery_tag => @get_ok.delivery_tag,
27
+ :redelivered => @get_ok.redelivered,
28
+ :exchange => @get_ok.exchange,
29
+ :routing_key => @get_ok.routing_key,
30
+ :channel => channel
31
+ }
32
+ @channel = channel
33
+ end
34
+
35
+ # Iterates over the delivery properties
36
+ # @see Enumerable#each
37
+ def each(*args, &block)
38
+ @hash.each(*args, &block)
39
+ end
40
+
41
+ # Accesses delivery properties by key
42
+ # @see Hash#[]
43
+ def [](k)
44
+ @hash[k]
45
+ end
46
+
47
+ # @return [Hash] Hash representation of this delivery info
48
+ def to_hash
49
+ @hash
50
+ end
51
+
52
+ # @private
53
+ def to_s
54
+ to_hash.to_s
55
+ end
56
+
57
+ # @private
58
+ def inspect
59
+ to_hash.inspect
60
+ end
61
+
62
+ # @return [String] Delivery identifier that is used to acknowledge, reject and nack deliveries
63
+ def delivery_tag
64
+ @get_ok.delivery_tag
65
+ end
66
+
67
+ # @return [Boolean] true if this delivery is a redelivery (the message was requeued at least once)
68
+ def redelivered
69
+ @get_ok.redelivered
70
+ end
71
+ alias redelivered? redelivered
72
+
73
+ # @return [String] Name of the exchange this message was published to
74
+ def exchange
75
+ @get_ok.exchange
76
+ end
77
+
78
+ # @return [String] Routing key this message was published with
79
+ def routing_key
80
+ @get_ok.routing_key
81
+ end
82
+ end
83
+ end
@@ -1,4 +1,5 @@
1
1
  require "bunny/compatibility"
2
+ require "bunny/get_response"
2
3
 
3
4
  module Bunny
4
5
  # Represents AMQP 0.9.1 queue.
@@ -229,33 +230,29 @@ module Bunny
229
230
  # puts "This is the message: " + payload + "\n\n"
230
231
  # conn.close
231
232
  def pop(opts = {:ack => false}, &block)
232
- delivery_info, properties, content = @channel.basic_get(@name, opts)
233
+ get_response, properties, content = @channel.basic_get(@name, opts)
233
234
 
234
235
  if block
235
- block.call(delivery_info, properties, content)
236
+ if properties
237
+ di = GetResponse.new(get_response, properties, @channel)
238
+ mp = MessageProperties.new(properties)
239
+
240
+ block.call(di, mp, content)
241
+ else
242
+ block.call(nil, nil, nil)
243
+ end
236
244
  else
237
- [delivery_info, properties, content]
245
+ if properties
246
+ di = GetResponse.new(get_response, properties, @channel)
247
+ mp = MessageProperties.new(properties)
248
+ [di, mp, content]
249
+ else
250
+ [nil, nil, nil]
251
+ end
238
252
  end
239
253
  end
240
254
  alias get pop
241
255
 
242
- # Version of {Bunny::Queue#pop} that returns data in legacy format
243
- # (as a hash).
244
- # @return [Hash]
245
- # @deprecated
246
- def pop_as_hash(opts = {:ack => false}, &block)
247
- delivery_info, properties, content = @channel.basic_get(@name, opts)
248
-
249
- result = {:header => properties, :payload => content, :delivery_details => delivery_info}
250
-
251
- if block
252
- block.call(result)
253
- else
254
- result
255
- end
256
- end
257
-
258
-
259
256
  # Publishes a message to the queue via default exchange. Takes the same arguments
260
257
  # as {Bunny::Exchange#publish}
261
258
  #
@@ -707,7 +707,11 @@ module Bunny
707
707
  @continuations.push(method)
708
708
 
709
709
  clean_up_on_shutdown
710
- @origin_thread.terminate_with(@last_connection_error)
710
+ if threaded?
711
+ @origin_thread.terminate_with(@last_connection_error)
712
+ else
713
+ raise @last_connection_error
714
+ end
711
715
  end
712
716
 
713
717
  def clean_up_on_shutdown
@@ -265,7 +265,9 @@ module Bunny
265
265
  protected
266
266
 
267
267
  def tls_enabled?(opts)
268
- opts[:tls] || opts[:ssl] || (opts[:port] == AMQ::Protocol::TLS_PORT) || false
268
+ return opts[:tls] unless opts[:tls].nil?
269
+ return opts[:ssl] unless opts[:ssl].nil?
270
+ (opts[:port] == AMQ::Protocol::TLS_PORT) || false
269
271
  end
270
272
 
271
273
  def tls_certificate_path_from(opts)
@@ -2,5 +2,5 @@
2
2
 
3
3
  module Bunny
4
4
  # @return [String] Version of the library
5
- VERSION = "1.2.2"
5
+ VERSION = "1.3.0"
6
6
  end
@@ -19,11 +19,17 @@ describe Bunny::Queue, "#pop" do
19
19
  q = ch.queue("", :exclusive => true)
20
20
  x = ch.default_exchange
21
21
 
22
- x.publish("xyzzy", :routing_key => q.name)
22
+ msg = "xyzzy"
23
+ x.publish(msg, :routing_key => q.name)
23
24
 
24
25
  sleep(0.5)
25
- delivery_info, properties, content = q.pop
26
- content.should == "xyzzy"
26
+ get_ok, properties, content = q.pop
27
+ expect(get_ok).to be_kind_of(Bunny::GetResponse)
28
+ expect(properties).to be_kind_of(Bunny::MessageProperties)
29
+ expect(properties.content_type).to eq("application/octet-stream")
30
+ expect(get_ok.routing_key).to eq(q.name)
31
+ expect(get_ok.delivery_tag).to be_kind_of(Bunny::VersionedDeliveryTag)
32
+ expect(content).to eq(msg)
27
33
  q.message_count.should == 0
28
34
 
29
35
  ch.close
@@ -38,8 +44,10 @@ describe Bunny::Queue, "#pop" do
38
44
  q = ch.queue("", :exclusive => true)
39
45
  q.purge
40
46
 
41
- _, _, content = q.pop
42
- content.should be_nil
47
+ get_empty, properties, content = q.pop
48
+ expect(get_empty).to eq(nil)
49
+ expect(properties).to eq(nil)
50
+ expect(content).to eq(nil)
43
51
  q.message_count.should == 0
44
52
 
45
53
  ch.close
@@ -13,7 +13,7 @@ unless ENV["CI"]
13
13
  end
14
14
 
15
15
  def wait_for_recovery
16
- sleep 0.7
16
+ sleep 1.5
17
17
  end
18
18
 
19
19
  def with_open(c = Bunny.new(:network_recovery_interval => 0.2, :recover_from_connection_close => true), &block)
@@ -209,7 +209,7 @@ unless ENV["CI"]
209
209
  end
210
210
  end
211
211
 
212
- it "recovers consumer" do
212
+ it "recovers consumers" do
213
213
  with_open do |c|
214
214
  delivered = false
215
215
 
@@ -230,5 +230,51 @@ unless ENV["CI"]
230
230
  expect(delivered).to be_true
231
231
  end
232
232
  end
233
+
234
+ it "recovers all consumers" do
235
+ n = 1024
236
+
237
+ with_open do |c|
238
+ ch = c.create_channel
239
+ q = ch.queue("", :exclusive => true)
240
+ n.times do
241
+ q.subscribe do |_, _, _|
242
+ delivered = true
243
+ end
244
+ end
245
+ close_all_connections!
246
+ sleep 0.1
247
+ c.should_not be_open
248
+
249
+ wait_for_recovery
250
+ ch.should be_open
251
+
252
+ q.consumer_count.should == n
253
+ end
254
+ end
255
+
256
+ it "recovers all queues" do
257
+ n = 256
258
+
259
+ qs = []
260
+
261
+ with_open do |c|
262
+ ch = c.create_channel
263
+
264
+ n.times do
265
+ qs << ch.queue("", :exclusive => true)
266
+ end
267
+ close_all_connections!
268
+ sleep 0.1
269
+ c.should_not be_open
270
+
271
+ wait_for_recovery
272
+ ch.should be_open
273
+
274
+ qs.each do |q|
275
+ ch.queue_declare(q.name, :passive => true)
276
+ end
277
+ end
278
+ end
233
279
  end
234
280
  end
@@ -1,3 +1,4 @@
1
+ # -*- coding: utf-8 -*-
1
2
  require "spec_helper"
2
3
 
3
4
  unless ENV["CI"]
@@ -37,6 +38,27 @@ unless ENV["CI"]
37
38
  end
38
39
 
39
40
 
41
+ context "with payload of several MBs of non-ASCII characters" do
42
+ it "successfully frames the message" do
43
+ ch = connection.create_channel
44
+
45
+ q = ch.queue("", :exclusive => true)
46
+ x = ch.default_exchange
47
+
48
+ as = "кириллца, йо" * (1024 * 1024)
49
+ x.publish(as, :routing_key => q.name, :persistent => true)
50
+
51
+ sleep(1)
52
+ q.message_count.should == 1
53
+
54
+ _, _, payload = q.pop
55
+ payload.bytesize.should == as.bytesize
56
+
57
+ ch.close
58
+ end
59
+ end
60
+
61
+
40
62
 
41
63
  context "with empty message body" do
42
64
  it "successfully publishes the message" do
@@ -23,24 +23,6 @@ unless defined?(JRUBY_VERSION) && !ENV["FORCE_JRUBY_RUN"]
23
23
  end
24
24
  end
25
25
 
26
- n.times do |i|
27
- it "can be closed in the Hello, World example (take #{i})" do
28
- c = Bunny.new(:automatically_recover => false)
29
- c.start
30
- ch = c.create_channel
31
- x = ch.default_exchange
32
- q = ch.queue("", :exclusive => true)
33
- q.subscribe do |delivery_info, properties, payload|
34
- # no-op
35
- end
36
- 20.times { x.publish("hello", :routing_key => q.name) }
37
-
38
- c.should be_connected
39
- c.stop
40
- c.should be_closed
41
- end
42
- end
43
-
44
26
  n.times do |i|
45
27
  it "can be closed (automatic recovery enabled, take #{i})" do
46
28
  c = Bunny.new(:automatically_recover => true)
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: 1.2.2
4
+ version: 1.3.0
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: 2014-05-26 00:00:00.000000000 Z
15
+ date: 2014-06-18 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: amq-protocol
@@ -118,6 +118,7 @@ files:
118
118
  - lib/bunny/exceptions.rb
119
119
  - lib/bunny/exchange.rb
120
120
  - lib/bunny/framing.rb
121
+ - lib/bunny/get_response.rb
121
122
  - lib/bunny/heartbeat_sender.rb
122
123
  - lib/bunny/jruby/socket.rb
123
124
  - lib/bunny/jruby/ssl_socket.rb
@@ -305,4 +306,3 @@ test_files:
305
306
  - spec/unit/concurrent/synchronized_sorted_set_spec.rb
306
307
  - spec/unit/system_timer_spec.rb
307
308
  - spec/unit/version_delivery_tag_spec.rb
308
- has_rdoc: true