amqp 0.8.0.rc1 → 0.8.0.rc2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. data/CHANGELOG +15 -3
  2. data/README.textile +4 -5
  3. data/amqp.gemspec +1 -1
  4. data/docs/RabbitMQVersions.textile +21 -0
  5. data/examples/extensions/rabbitmq/per_queue_message_ttl.rb +57 -0
  6. data/examples/tls_certificates/client/cert.pem +18 -0
  7. data/examples/tls_certificates/client/key.pem +27 -0
  8. data/examples/tls_certificates/client/keycert.p12 +0 -0
  9. data/examples/tls_certificates/client/req.pem +15 -0
  10. data/examples/tls_certificates/server/cert.pem +18 -0
  11. data/examples/tls_certificates/server/key.pem +27 -0
  12. data/examples/tls_certificates/server/keycert.p12 +0 -0
  13. data/examples/tls_certificates/server/req.pem +15 -0
  14. data/examples/tls_certificates/testca/cacert.cer +0 -0
  15. data/examples/tls_certificates/testca/cacert.pem +17 -0
  16. data/examples/tls_certificates/testca/certs/01.pem +18 -0
  17. data/examples/tls_certificates/testca/certs/02.pem +18 -0
  18. data/examples/tls_certificates/testca/index.txt +2 -0
  19. data/examples/tls_certificates/testca/index.txt.attr +1 -0
  20. data/examples/tls_certificates/testca/index.txt.attr.old +1 -0
  21. data/examples/tls_certificates/testca/index.txt.old +1 -0
  22. data/examples/tls_certificates/testca/openssl.cnf +53 -0
  23. data/examples/tls_certificates/testca/private/cakey.pem +27 -0
  24. data/examples/tls_certificates/testca/serial +1 -0
  25. data/examples/tls_certificates/testca/serial.old +1 -0
  26. data/lib/amqp/channel.rb +9 -4
  27. data/lib/amqp/exchange.rb +4 -1
  28. data/lib/amqp/queue.rb +8 -2
  29. data/lib/amqp/version.rb +1 -1
  30. data/spec/integration/automatic_binding_for_default_direct_exchange_spec.rb +11 -3
  31. data/spec/integration/basic_get_spec.rb +7 -3
  32. data/spec/integration/queue_declaration_spec.rb +45 -8
  33. metadata +56 -61
data/CHANGELOG CHANGED
@@ -1,14 +1,26 @@
1
1
  = Version 0.8.0
2
2
 
3
+ * [API] AMQP::Exchange#initialize now accepts :arguments option that takes a hash. Brokers
4
+ may implement AMQP extensions using (usually x-prefixed) declaration arguments.
5
+ * [API] AMQP::Queue#initialize now accepts :arguments option that takes a hash. RabbitMQ
6
+ recognizes x-message-ttl argument and uses it as message TTL in milliseconds for
7
+ queue that is being declared.
8
+ * [API] AMQP#Logger is deprecated. It will be removed before 1.0 release.
9
+ * [API] AMQP#fork is deprecated. It will be removed before 1.0 release.
10
+ * [API] AMQP::RPC is deprecated. It will be removed before 1.0 release.
11
+ * [FEATURE] Significant improvements to the documentation
12
+ * [FEATURE] Support for RabbitMQ extensions to AMQP 0.9.1
13
+ * [API] AMQP::Exchange#publish now accepts (an optional) block that is called as soon as message
14
+ is considered published (EventMachine loop has pushed payload down the network stack).
3
15
  * [API] AMQP::Channel.new now accepts (an optional) block and yields newly opened channel to it as soon as
4
16
  channel.open-ok arrives from the broker.
5
17
  * [API] AMQP::Header#ack now can acknowledge multiple deliveries
6
18
  * [API] AMQP::Exchange#delete now takes (an optional) block that is called when exchange.delete-ok response arrives.
7
19
  * [API] AMQP::Header now implements #to_hash
8
- * [API] AMQP::Queue#pop block now can take 1, 2 or 7 (that's right) arguments.
20
+ * [API] AMQP::Queue#pop block now can take 1, 2 or 3 arguments.
9
21
  1 argument means handler is only interested in content payload
10
- 2 arguments means handler is interested in headers and the content
11
- 7 arguments means handlers wants all the properties get-ok (or get-empty) carries
22
+ 2 arguments mean handler is interested in headers and the content
23
+ 3 arguments mean handler is interested in headers, content and AMQP method instance
12
24
  * [API] AMQP::Queue#purge now takes an optional block which is called when queue.purge-ok response arrives.
13
25
  * [API] AMQP::Queue#delete now takes an optional block which is called when queue.delete-ok response arrives.
14
26
  * [API] AMQP::Queue#delete now accepts :nowait option.
@@ -52,9 +52,7 @@ h3. Install RabbitMQ
52
52
 
53
53
  Please refer to "RabbitMQ installation guide":http://www.rabbitmq.com/install.html
54
54
  Note that for Ubuntu and Debian we strongly advice that you use "RabbitMQ apt repository":http://www.rabbitmq.com/debian.html#apt
55
- that has recent versions of RabbitMQ. Ubuntu (even 10.10) and Debian both "ship with old RabbitMQ version":http://packages.ubuntu.com/maverick/rabbitmq-server,
56
- that only supports AMQP protocol 0.8. amqp gem 0.8.0 and later *will not work with RabbitMQ versions
57
- before 2.0*.
55
+ that has recent versions of RabbitMQ. Learn more in {file:docs/RabbitMQVersions.textile RabbitMQ versions} section.
58
56
 
59
57
 
60
58
  h3. Install the gem
@@ -146,7 +144,7 @@ gem "amqp", :git => "git://github.com/ruby-amqp/amqp.git", :branch => "master"
146
144
  h2. Examples
147
145
 
148
146
  You can find many examples (both real-world cases and simple demonstrations)
149
- "under examples directory":https://github.com/ruby-amqp/amqp/tree/master/examples in the repository.
147
+ under "examples directory":https://github.com/ruby-amqp/amqp/tree/master/examples in the repository.
150
148
 
151
149
 
152
150
 
@@ -183,7 +181,8 @@ h2. Community
183
181
 
184
182
  h2. License
185
183
 
186
- AMQP gem is licensed under the "Ruby License:"http://www.ruby-lang.org/en/LICENSE.txt.
184
+ AMQP gem is licensed under the "Ruby License":http://www.ruby-lang.org/en/LICENSE.txt.
185
+
187
186
 
188
187
 
189
188
  h2. Credits and copyright information
@@ -25,7 +25,7 @@ Gem::Specification.new do |s|
25
25
 
26
26
  # Dependencies
27
27
  s.add_dependency "eventmachine", "~> 0.12.10"
28
- s.add_dependency "amq-client"
28
+ s.add_dependency "amq-client", ">= 0.7.0.alpha2"
29
29
 
30
30
  begin
31
31
  require "changelog"
@@ -0,0 +1,21 @@
1
+ h1. amqp gem and RabbitMQ versions compatibility
2
+
3
+ h2. Using recent versions on Debian and Ubuntu
4
+
5
+ Ubuntu (even 10.10) and Debian both "ship with old RabbitMQ version":http://packages.ubuntu.com/maverick/rabbitmq-server,
6
+ that only supports AMQP protocol 0.8. amqp gem 0.8.0 and later *will not work with RabbitMQ versions
7
+ before 1.8.0*.
8
+
9
+ We strongly recommend that you use "RabbitMQ apt repository":http://www.rabbitmq.com/debian.html#apt that has recent versions of RabbitMQ.
10
+
11
+
12
+
13
+ h2. TLS (SSL) support
14
+
15
+ Note that "before 1.7.0, RabbitMQ did not support TLS":http://www.rabbitmq.com/ssl.html. In order to have TLS
16
+ support, RabbitMQ 1.7.0 requires
17
+
18
+ * Erlang/OTP R13B or later
19
+ * Erlang SSL 3.10 or later
20
+
21
+ and recommends using Erlang R141B that ships with Erlang SSL 4.0.1.
@@ -0,0 +1,57 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ require "bundler"
5
+ Bundler.setup
6
+
7
+ $:.unshift(File.expand_path("../../../../lib", __FILE__))
8
+ require 'amqp'
9
+ require "amqp/extensions/rabbitmq"
10
+
11
+ AMQP.start do |connection|
12
+ puts "Connected!"
13
+ AMQP::Channel.new(connection) do |channel, open_ok|
14
+ puts "Channel #{channel.id} is now open"
15
+
16
+ channel.on_error do
17
+ puts "Oops, there is a channel-levle exceptions!"
18
+ end
19
+
20
+ x = channel.fanout("amq.fanout")
21
+ channel.queue("", :auto_delete => true, :arguments => { "x-message-ttl" => 1000 }) do |q|
22
+ puts "Declared a new server-named qeueue: #{q.name}"
23
+ q.bind(x)
24
+
25
+
26
+ EventMachine.add_timer(0.3) do
27
+ 10.times do |i|
28
+ puts "Publishing message ##{i}"
29
+ x.publish("Message ##{i}")
30
+ end
31
+ end
32
+
33
+ EventMachine.add_timer(0.7) do
34
+ q.pop do |headers, payload|
35
+ raise "x-message-ttl didn't seem to work (timeout is up)" if payload.nil?
36
+ end
37
+ end
38
+
39
+ EventMachine.add_timer(1.5) do
40
+ q.pop do |headers, payload|
41
+ raise "x-message-ttl didn't seem to work (timeout isn't up)" if payload
42
+ end
43
+ end
44
+ end
45
+ end
46
+
47
+ show_stopper = Proc.new {
48
+ AMQP.stop do
49
+ EM.stop
50
+ end
51
+ }
52
+
53
+
54
+ EM.add_timer(3, show_stopper)
55
+ Signal.trap('INT', show_stopper)
56
+ Signal.trap('TERM', show_stopper)
57
+ end
@@ -0,0 +1,18 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIC5DCCAcygAwIBAgIBAjANBgkqhkiG9w0BAQUFADATMREwDwYDVQQDEwhNeVRl
3
+ c3RDQTAeFw0xMTA0MTcyMDE4MzNaFw0xMjA0MTYyMDE4MzNaMCcxFDASBgNVBAMT
4
+ C2dpb3ZlLmxvY2FsMQ8wDQYDVQQKEwZjbGllbnQwggEiMA0GCSqGSIb3DQEBAQUA
5
+ A4IBDwAwggEKAoIBAQC/4CSqBjpmNXoDt5xU0D4ONG3bQXBV4bJid/nmzIvV67pb
6
+ v/VpqKxM+UqoV9d09u/H+f/jAKu0of1e1d+1o09JtjJshX4sYREh2/n0umENH1xC
7
+ yvWnP0eFTithj9qmVcK5UOvoZKSKYT4gtCIpYhRUQZkEhPYKhvxePztjRIeUghkK
8
+ Qc9Qi0/eARm8d3Zdo0ORnnNNIP+G7BjecmJvTLCP/PBDIGG6r1eybNeulNWddgLg
9
+ cUq0ACFepxCJW6RdGVrMXhWomScvKssIUMAdDfwM9ffq64MYE2ZLG1OBBPefNI47
10
+ wz8h9ak15T2ZpKFU9biXLr/SnGhdhNR31d16pAtLAgMBAAGjLzAtMAkGA1UdEwQC
11
+ MAAwCwYDVR0PBAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMCMA0GCSqGSIb3DQEB
12
+ BQUAA4IBAQCVBpz3gZRr1s48SVF4+C9YLzrSaWsvzKZNDKH7RJ4f1VR//ZY5zsYi
13
+ RqSlzSfLM76Y6Y/Eq0iFshtKmuXHKyA4r/Gp+iiCw4U9Htk91rg98wAPc8wOBgn1
14
+ OmomH65JpLwxYvUwyt91opGppcqZHWhruhI0fFTFtPIlGKK3KOmJLPpaSvY0YTJ+
15
+ vaI3D6yQEMQoZ/mcXk928ofJJvOpUEmvjTW4Orz+T8NmiffLb64P50h86bdV+8tw
16
+ FJx6ix6vLF41LU2iPEYHuuXkA7+M5e+POGscJJCb1p6JKxzI6D/UVDnrbhOlqBa5
17
+ U45f0oXQ/ndOYUrBRu3BPFdNAjvpa0ld
18
+ -----END CERTIFICATE-----
@@ -0,0 +1,27 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIIEowIBAAKCAQEAv+AkqgY6ZjV6A7ecVNA+DjRt20FwVeGyYnf55syL1eu6W7/1
3
+ aaisTPlKqFfXdPbvx/n/4wCrtKH9XtXftaNPSbYybIV+LGERIdv59LphDR9cQsr1
4
+ pz9HhU4rYY/aplXCuVDr6GSkimE+ILQiKWIUVEGZBIT2Cob8Xj87Y0SHlIIZCkHP
5
+ UItP3gEZvHd2XaNDkZ5zTSD/huwY3nJib0ywj/zwQyBhuq9XsmzXrpTVnXYC4HFK
6
+ tAAhXqcQiVukXRlazF4VqJknLyrLCFDAHQ38DPX36uuDGBNmSxtTgQT3nzSOO8M/
7
+ IfWpNeU9maShVPW4ly6/0pxoXYTUd9XdeqQLSwIDAQABAoIBAQC1hScqcpns98pm
8
+ md2bnyYV6iPDuTS9Crfnz/jrD7d6uXekNQXG33uhlnW6rN94F+TgGvKpnojSai14
9
+ +nyZKdZotaUeZWvoMCw1DBZ8H5aRA4oU5k1f282dn0YLFjyT/64oAxYq1IuVHknY
10
+ RpHK9K6mxygrzl21t94oi0lzr/FT29t8mSlcCQiHxAZWyGE55HvqSS4625P5pvh1
11
+ Bh4bZGT285XvlA1qbKbEn8M1IsCZmhPU87U+k6lCvEpBG32cdg9Ykt+BA33OCJj0
12
+ OrC6vKjLsIKEfbq8xoTjm7+fofv78B2/zobK7dFMVTAdnju8Tpwu/IDcHnLuKtt2
13
+ Vd8GOwGBAoGBAPBO/EeHSvlT46F3jT8ygIhB2rGQ8LBZwQmiejOdfhJ5EPs8KC7U
14
+ i9Wfo2Mktn7gr+X9nsY5ZHZoTFaFV1YSoIrsaWFd0RmuQKBcka+A9WPWEgRL0KrG
15
+ Km9pHjlYK6WAu+XzKnGlHzasxxLW48mvuMQApE5U5nVbZWonGBA2psRNAoGBAMxn
16
+ jHWH51SN5R/ldPvmNPEG8McR1XmzTM9M40snrj6UV8mLMH+KRHgoj664nhm1dnMa
17
+ rolKzoFQtS5unwjCGX+Lx9AnwUDDak2Q6LsqedO0PhIwUEtcaLnt8Zf3KWi4v4Es
18
+ eAHnYXZ1I7sqjCZ7pAwNBlCfE4Ai1XMH7syv5bn3AoGAYhbrlUrdSJ58eQkyp4w2
19
+ uOegnABcrq9EQ2mF1hHAR0wRqWtpv4vUtFMgPzTaJToTsp5us9zza/2ww1RUTPb3
20
+ fx12+l5wHrpo+MwwT2IlSCY2XniP6VVQNv/CbYfW8Qx2Jiu2tILBFfE6pS7/9fB7
21
+ S84zQyIWm+q9n7HreZrFQbUCgYB4BnnY7eOtp+CaGS/XVrdRrOSn0FYNL3bz5080
22
+ a2mKv6rI4x2oVrWb5R1x2GCl8gNK1akVX0LhdlXdnQFvsCIu3hKHrUByWg1K3MN8
23
+ XBXLdXRZU9tiVTH9s7YAqRa8sndpT4Zsf8SgPWqs1fAUDNgoZ2GE59QYktvJvye/
24
+ M65uwwKBgDnuu0PZ6tn7dKZWYhfBeQT21DsaQglvY3kQ4RHHlHiQnyALKnZqbLu9
25
+ wlAZIvRIltWeeQ+oT/Bxq9cD7GrdX8VmZ2xo/gYkJQoduT3AtyLrau8aZFWpiREH
26
+ 2pDcznE7+DWcKKwr/Z2eQEOoE2KikeuAbMd2SG4vVTLG9w+N2e5I
27
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1,15 @@
1
+ -----BEGIN CERTIFICATE REQUEST-----
2
+ MIICbDCCAVQCAQAwJzEUMBIGA1UEAxMLZ2lvdmUubG9jYWwxDzANBgNVBAoTBmNs
3
+ aWVudDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL/gJKoGOmY1egO3
4
+ nFTQPg40bdtBcFXhsmJ3+ebMi9Xrulu/9WmorEz5SqhX13T278f5/+MAq7Sh/V7V
5
+ 37WjT0m2MmyFfixhESHb+fS6YQ0fXELK9ac/R4VOK2GP2qZVwrlQ6+hkpIphPiC0
6
+ IiliFFRBmQSE9gqG/F4/O2NEh5SCGQpBz1CLT94BGbx3dl2jQ5Gec00g/4bsGN5y
7
+ Ym9MsI/88EMgYbqvV7Js166U1Z12AuBxSrQAIV6nEIlbpF0ZWsxeFaiZJy8qywhQ
8
+ wB0N/Az19+rrgxgTZksbU4EE9580jjvDPyH1qTXlPZmkoVT1uJcuv9KcaF2E1HfV
9
+ 3XqkC0sCAwEAAaAAMA0GCSqGSIb3DQEBBQUAA4IBAQAOpwkzMe1xYgYz8GOp5xF7
10
+ xJtfeh5z9JTt8ogvjS34mri2vNUPQd35H3y6Dhh9ZjLqC03mMV/KOtRCf7oJXpgZ
11
+ S8C/NyJWNXB7/QNf9/EWEyOxoWYuvhTxqc0MhLPWrJRjgBKvvCGszBj2kWxDn7OO
12
+ //TRq4ao2wQWHIlaP5htsr+rD4IJZqZC8lgptv0u9O/O8vruPUg3k6dnuiKdUyTL
13
+ 2CDsiKSc6vZKJKL0TguBHSQj/sybAw1lyxIlpxiDcTCbM5FsER6jFydLly+ov3+x
14
+ sqMOTieWU3qnaqOwK2ENqQfRMAk3FXEuDzvW4t7oxHB2gJfUJXfEVUWv7Kol25VT
15
+ -----END CERTIFICATE REQUEST-----
@@ -0,0 +1,18 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIC5DCCAcygAwIBAgIBATANBgkqhkiG9w0BAQUFADATMREwDwYDVQQDEwhNeVRl
3
+ c3RDQTAeFw0xMTA0MTcyMDE3MjdaFw0xMjA0MTYyMDE3MjdaMCcxFDASBgNVBAMT
4
+ C2dpb3ZlLmxvY2FsMQ8wDQYDVQQKEwZzZXJ2ZXIwggEiMA0GCSqGSIb3DQEBAQUA
5
+ A4IBDwAwggEKAoIBAQDdBEpnl+BRcIzZ4M6pB649cT/YUxebTekUq0HhFXATba44
6
+ XkSx81Nn5dMVnKgJgJVRhBxU0ZpBt4/wogKaaYI4/OAEgbUcH03OnEXHNLB586eJ
7
+ GdaFHkSQOfnUbBIzpQKlQjGLfjmn6mXkLW5lLP5OrN+npuEI4Wq/jgbIQQp9t7Kw
8
+ g+Pb9VdJGw0dmMlVfPP8FVCRpGB9lJc1Ayw8gKHg4mi/uyKKFdLV9IWf+DXlvRQ2
9
+ vljmQEhSq4bvxnCtm4p5B7AFHefTnldSgGRUZuyI5/4vFMypB3deV+lku95514uN
10
+ F0gg66eDAfoNjEmca09P+GBy8LfJsuiBeFV4irtjAgMBAAGjLzAtMAkGA1UdEwQC
11
+ MAAwCwYDVR0PBAQDAgUgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA0GCSqGSIb3DQEB
12
+ BQUAA4IBAQCCmvsAQ1GaPfoKMqCWxyrQ2BNVPWm9J65thZKxZQF01gLox9cpv6+X
13
+ QERcD71HStxbzh2B8Hebbk9OplGuyrdgfvzUxcn88kObj6udipDx4YxTJvtff/9w
14
+ xeD5OWDVgef0GkB1Rjj3C3W/sfmTZBYfdKuWuwxMG/NxISkQP4aFHwJnPrzNx9ON
15
+ bHoKVNrQ2iKAiMysjnFeA/4QuhBQRf41h9SBWwJEW3Ts91TzbgcjCL46Dq29QB9A
16
+ 4v8t6K/nibP6n53zHbVzdxIEJ2hFKm+vuqaHRW3048Xgww1xkdxrVbyGp9si92i1
17
+ KJ5SDIOR8bQ7OXvdvpiyy6p9fIG0Z6w0
18
+ -----END CERTIFICATE-----
@@ -0,0 +1,27 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIIEpAIBAAKCAQEA3QRKZ5fgUXCM2eDOqQeuPXE/2FMXm03pFKtB4RVwE22uOF5E
3
+ sfNTZ+XTFZyoCYCVUYQcVNGaQbeP8KICmmmCOPzgBIG1HB9NzpxFxzSwefOniRnW
4
+ hR5EkDn51GwSM6UCpUIxi345p+pl5C1uZSz+Tqzfp6bhCOFqv44GyEEKfbeysIPj
5
+ 2/VXSRsNHZjJVXzz/BVQkaRgfZSXNQMsPICh4OJov7siihXS1fSFn/g15b0UNr5Y
6
+ 5kBIUquG78ZwrZuKeQewBR3n055XUoBkVGbsiOf+LxTMqQd3XlfpZLveedeLjRdI
7
+ IOungwH6DYxJnGtPT/hgcvC3ybLogXhVeIq7YwIDAQABAoIBAEu0+YussZET/Ztw
8
+ bznlQKEZVuZR6Ccxs+J5m1JvlnmBO4lheSR/lhVj2z9u7vx6SCupFk9TkQRrzWl/
9
+ BWdBNvMwY8gHajNc4bkhPKG1AbJ0bPIAoMPuj0vcICDMeBuqrVJQb0o6DaPgHdDg
10
+ Yw1TMTVf8CiseC8jj/5XtykHZoGTNTKzusvTjL8hTXFaWQfHQaN3WC1qwrFU2+x6
11
+ AJeoSz5F1Q/lykqVAdl2B1L39kiSCAkbVE1GI2qjftCff3ycufYV/fxXeyZwZx9B
12
+ NGWUJFyZte8EcrAUoo9B/gvALGDbJsSUsbri+HsRsdOQT3K/giafUipX2FB8Bnxm
13
+ nasEfskCgYEA74PrKYo13mTUWRJ2FQTBRHLsMR53PK83RpRRs8361/uCJrjpqfdD
14
+ 2fUt8kH0rmm2vaWYsllucJoYdYSC9CQdECLzpOZS907PJHXCOsFsBjw74fvjZ+gY
15
+ 9EXIENZSOSR1PQCWZm+5lL4xi/T+beWBfz0YksErj2GM7dyJeQjkIz8CgYEA7Dpx
16
+ ANgrgO9WTu51NIlKt3P7+t6q6MHQcWuzkWMBmVU4zxeyggux+ucMj+l3KLyw7fLT
17
+ jRz03eGpqjQT8Yl676uYONhTDC9VOBbLgjShuVOX7lleMLxVFJWqL1FphNghxysF
18
+ HVCq1WH0Qu4keirPEotBxkNZRaRYHwRYlVPKMt0CgYEApIHSAj0IlNBiPS995R/X
19
+ 8sCQU4heU1LxP0vd9gZy1OfNU/VLoE7RzqEkxrDgcu7u8cEMaOsd/L8KL6UtIKyx
20
+ PYUUHV2I/I2nnp43Io35OSsj4ipU3eg/Q3+uU0oxPUg6MgT2SDNSnsQnWb6TBj5N
21
+ PGxlNV7yIU/aMQF5dqVRtJcCgYEArC4Mn6jwTJImPnHgS+Kl6wFG8JvLxss9uu3d
22
+ fGLFj5VmSsvi+Ja9qzstFNf+WlruOwF64KfycqdAmyZKQwsJ6BcSZJyIK6F0Y+V5
23
+ f/YMyp/7ZWcOGEetW8uat9KHLqS6OglJOQzK96zl9MLPI5yAQevujSwZrYEUGcd5
24
+ KZ5hCqECgYBExYSDJOuSMvKFw66jrLiBedLPuzh1iznwd6e4idpqIUkdhbEuXhHG
25
+ +35HeN5cGwjbjXtIjxJsAddTbjvSqaPukmBKLm1ABqF3r0irbNaPcK1xfG9a5L28
26
+ /enwipaSWjGovfDXWqmmCvWC8M7iGiqFChI87WlzbvaAapOW0D576Q==
27
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1,15 @@
1
+ -----BEGIN CERTIFICATE REQUEST-----
2
+ MIICbDCCAVQCAQAwJzEUMBIGA1UEAxMLZ2lvdmUubG9jYWwxDzANBgNVBAoTBnNl
3
+ cnZlcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN0ESmeX4FFwjNng
4
+ zqkHrj1xP9hTF5tN6RSrQeEVcBNtrjheRLHzU2fl0xWcqAmAlVGEHFTRmkG3j/Ci
5
+ Apppgjj84ASBtRwfTc6cRcc0sHnzp4kZ1oUeRJA5+dRsEjOlAqVCMYt+OafqZeQt
6
+ bmUs/k6s36em4Qjhar+OBshBCn23srCD49v1V0kbDR2YyVV88/wVUJGkYH2UlzUD
7
+ LDyAoeDiaL+7IooV0tX0hZ/4NeW9FDa+WOZASFKrhu/GcK2binkHsAUd59OeV1KA
8
+ ZFRm7Ijn/i8UzKkHd15X6WS73nnXi40XSCDrp4MB+g2MSZxrT0/4YHLwt8my6IF4
9
+ VXiKu2MCAwEAAaAAMA0GCSqGSIb3DQEBBQUAA4IBAQC2aRbyq5pJ34M8jsaEjcks
10
+ iov5KP17jfnHnz517/rKxKYRaoxftXVvUbtDLKMQNMAA9K65jetg6/6zqi3QTJwd
11
+ 52Pn6OYTpzyFov42KRh1OSiRRa5CNXzDlHhosuVnVEOo2rdQggWZTY1clAbjEJmU
12
+ N6bn6NSL4B/Vn8GAVxXhRGGoHj26LupdoI6GS2S3xuExw0xiS3usq6xYthpxHQ/L
13
+ pQI2Ijk+IJZPnJR2RZji/7P3nWHWQX+HrCagCu4oyY4o7inWPVJpxD+1LmagRhv5
14
+ RyMdQKoY+6x3/r+tWATTNOVqbGzfuKj6TQSkCYvOZOejlRBsMhyYlpldVMCRmaoh
15
+ -----END CERTIFICATE REQUEST-----
@@ -0,0 +1,17 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIICxjCCAa6gAwIBAgIJAOF/re9e0JhgMA0GCSqGSIb3DQEBBQUAMBMxETAPBgNV
3
+ BAMTCE15VGVzdENBMB4XDTExMDQxNzIwMDcxN1oXDTEyMDQxNjIwMDcxN1owEzER
4
+ MA8GA1UEAxMITXlUZXN0Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
5
+ AQDK8ZdVo1llXXrS7ed5Luel1VRq0DmJG1TZ8bAgovK9fx6WsgzeJ17zYwAEheUz
6
+ B8PogkNqU3ZIa4T51VCtamoiG6bbKYpco4lutKM7aNGNJNcUfDhwyt/NYOxXM3xf
7
+ ahMWjrbH0e4qKJgEjnJLpoeEa+YquDG2NXzocZY5+upy0pX6Reh1EQbju69j9f5Q
8
+ Z6u4cvraScyN5IYuq3lKTmc2TxVyINVkpK9DlGJZUBAOBLSbFxGZDRoY0D3b1aeS
9
+ /XMfVvcrJi48Ns2ZvT+CAy0KVeKBeQ9+6kD/YAizcxDGLRvqOZXOHYaE2L51DabL
10
+ QTxk9NFPgIxrYtGS7RtQ7dUhAgMBAAGjHTAbMAwGA1UdEwQFMAMBAf8wCwYDVR0P
11
+ BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAzFtKwsrCBaIAf1/VCJZh4+gzs/UW+
12
+ UXeC17GRzazb0O0drm9aMOtwE48NGVTwBjqmnPzFg56FYyll3oVZHz/fgkQZ+6iu
13
+ qAbwlmY2H+L9RyC9Mv3B+Ew/o3MNCQQ3rgxbA7hb0k8mwDplxS5GBRROwZl/zHks
14
+ gb4yPR6G83+zrgn6JIybdEGUySc1XDx+p6fVXvQG/1fsmExN9/ZuC6ulgBF7e+R5
15
+ d7l1AluGL4kS7GMDRZnU9QcXkhnlUyPXIDr/Jd1HFKtwgrXtVl5YIWTaRdWOXGwX
16
+ Q8BpM3Vk/NQFoTHO4Na3y8JY6iJzYTIXWHjI6RJdUffsEPtBoysHFHYv
17
+ -----END CERTIFICATE-----
@@ -0,0 +1,18 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIC5DCCAcygAwIBAgIBATANBgkqhkiG9w0BAQUFADATMREwDwYDVQQDEwhNeVRl
3
+ c3RDQTAeFw0xMTA0MTcyMDE3MjdaFw0xMjA0MTYyMDE3MjdaMCcxFDASBgNVBAMT
4
+ C2dpb3ZlLmxvY2FsMQ8wDQYDVQQKEwZzZXJ2ZXIwggEiMA0GCSqGSIb3DQEBAQUA
5
+ A4IBDwAwggEKAoIBAQDdBEpnl+BRcIzZ4M6pB649cT/YUxebTekUq0HhFXATba44
6
+ XkSx81Nn5dMVnKgJgJVRhBxU0ZpBt4/wogKaaYI4/OAEgbUcH03OnEXHNLB586eJ
7
+ GdaFHkSQOfnUbBIzpQKlQjGLfjmn6mXkLW5lLP5OrN+npuEI4Wq/jgbIQQp9t7Kw
8
+ g+Pb9VdJGw0dmMlVfPP8FVCRpGB9lJc1Ayw8gKHg4mi/uyKKFdLV9IWf+DXlvRQ2
9
+ vljmQEhSq4bvxnCtm4p5B7AFHefTnldSgGRUZuyI5/4vFMypB3deV+lku95514uN
10
+ F0gg66eDAfoNjEmca09P+GBy8LfJsuiBeFV4irtjAgMBAAGjLzAtMAkGA1UdEwQC
11
+ MAAwCwYDVR0PBAQDAgUgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA0GCSqGSIb3DQEB
12
+ BQUAA4IBAQCCmvsAQ1GaPfoKMqCWxyrQ2BNVPWm9J65thZKxZQF01gLox9cpv6+X
13
+ QERcD71HStxbzh2B8Hebbk9OplGuyrdgfvzUxcn88kObj6udipDx4YxTJvtff/9w
14
+ xeD5OWDVgef0GkB1Rjj3C3W/sfmTZBYfdKuWuwxMG/NxISkQP4aFHwJnPrzNx9ON
15
+ bHoKVNrQ2iKAiMysjnFeA/4QuhBQRf41h9SBWwJEW3Ts91TzbgcjCL46Dq29QB9A
16
+ 4v8t6K/nibP6n53zHbVzdxIEJ2hFKm+vuqaHRW3048Xgww1xkdxrVbyGp9si92i1
17
+ KJ5SDIOR8bQ7OXvdvpiyy6p9fIG0Z6w0
18
+ -----END CERTIFICATE-----
@@ -0,0 +1,18 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIC5DCCAcygAwIBAgIBAjANBgkqhkiG9w0BAQUFADATMREwDwYDVQQDEwhNeVRl
3
+ c3RDQTAeFw0xMTA0MTcyMDE4MzNaFw0xMjA0MTYyMDE4MzNaMCcxFDASBgNVBAMT
4
+ C2dpb3ZlLmxvY2FsMQ8wDQYDVQQKEwZjbGllbnQwggEiMA0GCSqGSIb3DQEBAQUA
5
+ A4IBDwAwggEKAoIBAQC/4CSqBjpmNXoDt5xU0D4ONG3bQXBV4bJid/nmzIvV67pb
6
+ v/VpqKxM+UqoV9d09u/H+f/jAKu0of1e1d+1o09JtjJshX4sYREh2/n0umENH1xC
7
+ yvWnP0eFTithj9qmVcK5UOvoZKSKYT4gtCIpYhRUQZkEhPYKhvxePztjRIeUghkK
8
+ Qc9Qi0/eARm8d3Zdo0ORnnNNIP+G7BjecmJvTLCP/PBDIGG6r1eybNeulNWddgLg
9
+ cUq0ACFepxCJW6RdGVrMXhWomScvKssIUMAdDfwM9ffq64MYE2ZLG1OBBPefNI47
10
+ wz8h9ak15T2ZpKFU9biXLr/SnGhdhNR31d16pAtLAgMBAAGjLzAtMAkGA1UdEwQC
11
+ MAAwCwYDVR0PBAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMCMA0GCSqGSIb3DQEB
12
+ BQUAA4IBAQCVBpz3gZRr1s48SVF4+C9YLzrSaWsvzKZNDKH7RJ4f1VR//ZY5zsYi
13
+ RqSlzSfLM76Y6Y/Eq0iFshtKmuXHKyA4r/Gp+iiCw4U9Htk91rg98wAPc8wOBgn1
14
+ OmomH65JpLwxYvUwyt91opGppcqZHWhruhI0fFTFtPIlGKK3KOmJLPpaSvY0YTJ+
15
+ vaI3D6yQEMQoZ/mcXk928ofJJvOpUEmvjTW4Orz+T8NmiffLb64P50h86bdV+8tw
16
+ FJx6ix6vLF41LU2iPEYHuuXkA7+M5e+POGscJJCb1p6JKxzI6D/UVDnrbhOlqBa5
17
+ U45f0oXQ/ndOYUrBRu3BPFdNAjvpa0ld
18
+ -----END CERTIFICATE-----
@@ -0,0 +1,2 @@
1
+ V 120416201727Z 01 unknown /CN=giove.local/O=server
2
+ V 120416201833Z 02 unknown /CN=giove.local/O=client
@@ -0,0 +1 @@
1
+ unique_subject = yes
@@ -0,0 +1 @@
1
+ unique_subject = yes
@@ -0,0 +1 @@
1
+ V 120416201727Z 01 unknown /CN=giove.local/O=server
@@ -0,0 +1,53 @@
1
+ [ ca ]
2
+ default_ca = testca
3
+
4
+ [ testca ]
5
+ dir = .
6
+ certificate = $dir/cacert.pem
7
+ database = $dir/index.txt
8
+ new_certs_dir = $dir/certs
9
+ private_key = $dir/private/cakey.pem
10
+ serial = $dir/serial
11
+
12
+ default_crl_days = 7
13
+ default_days = 365
14
+ default_md = sha1
15
+
16
+ policy = testca_policy
17
+ x509_extensions = certificate_extensions
18
+
19
+ [ testca_policy ]
20
+ commonName = supplied
21
+ stateOrProvinceName = optional
22
+ countryName = optional
23
+ emailAddress = optional
24
+ organizationName = optional
25
+ organizationalUnitName = optional
26
+
27
+ [ certificate_extensions ]
28
+ basicConstraints = CA:false
29
+
30
+ [ req ]
31
+ default_bits = 2048
32
+ default_keyfile = ./private/cakey.pem
33
+ default_md = sha1
34
+ prompt = yes
35
+ distinguished_name = root_ca_distinguished_name
36
+ x509_extensions = root_ca_extensions
37
+
38
+ [ root_ca_distinguished_name ]
39
+ commonName = hostname
40
+
41
+ [ root_ca_extensions ]
42
+ basicConstraints = CA:true
43
+ keyUsage = keyCertSign, cRLSign
44
+
45
+ [ client_ca_extensions ]
46
+ basicConstraints = CA:false
47
+ keyUsage = digitalSignature
48
+ extendedKeyUsage = 1.3.6.1.5.5.7.3.2
49
+
50
+ [ server_ca_extensions ]
51
+ basicConstraints = CA:false
52
+ keyUsage = keyEncipherment
53
+ extendedKeyUsage = 1.3.6.1.5.5.7.3.1
@@ -0,0 +1,27 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIIEowIBAAKCAQEAyvGXVaNZZV160u3neS7npdVUatA5iRtU2fGwIKLyvX8elrIM
3
+ 3ide82MABIXlMwfD6IJDalN2SGuE+dVQrWpqIhum2ymKXKOJbrSjO2jRjSTXFHw4
4
+ cMrfzWDsVzN8X2oTFo62x9HuKiiYBI5yS6aHhGvmKrgxtjV86HGWOfrqctKV+kXo
5
+ dREG47uvY/X+UGeruHL62knMjeSGLqt5Sk5nNk8VciDVZKSvQ5RiWVAQDgS0mxcR
6
+ mQ0aGNA929Wnkv1zH1b3KyYuPDbNmb0/ggMtClXigXkPfupA/2AIs3MQxi0b6jmV
7
+ zh2GhNi+dQ2my0E8ZPTRT4CMa2LRku0bUO3VIQIDAQABAoIBAQDJoXiDHFVgUZ0L
8
+ XlUBYKnEaIyDxzey0hXep7Me6eaUgW0JugLw4VsEI9NLqyBKMCfjpTCHvj6huzmV
9
+ 4utSMI0cMC76Rm5ylgSgmhYnm3+/ZN/QOY71+YqcCfUmuj+SqNgoLEjLhPbEqipH
10
+ NKO4J88ysOUwgmrZppDgfKIOHw66Xlx0WtyFksozLve5pqxzs2gNZDmT5YdlGt+w
11
+ X2zaUr7GholPGUVzhZSlpBpPkloSNYyGPX7O25bc63Ev92m3vnroJZYFiaUaKcFE
12
+ M2RVVd3m8J47uoSwxl2ppnIgwodTWe20swc3d4cXK30U4USLsvWesthnfUc65QWa
13
+ KfeanOrBAoGBAOvxGM9ufV1EFyV3D4kDB2UGp2ccv2t+rJ+urpl7JLCw1Aetpc3v
14
+ Qg/QsbBfOhfI650zOZgzE5bG6B6wNYVLAC/UusrYgeLkyqKVbQgDTP+djD61jYjy
15
+ IG5RP7EumN07Gvja59B4Kw5zN6TB3MKGz9Qv3a2MOvyg/3TRnssHOkQ5AoGBANwy
16
+ V822s149G46tIbESw5ICcY8HorP1kD2syMeBQWKJcEgiSXL8Q3TIKdqaim8Q1Bqu
17
+ fSYwISUVsFDaTyvRl25hLfkQ0t+qsul7EcjNFHf9L7dJx7z/dj8lVTQWGYse5iVQ
18
+ aplx7fYQHgXdC7NjtpIrxUZkJ7bAl+0cpavdcCgpAoGAetCbO46mDyBcdBIPsiAz
19
+ fzEBfrkGIyxjKxPAqv/gz2CcXgrT3eiHGLhnZgmLscnSa5e4iTM9JSUQuri6g1HR
20
+ HRS8zs34fmTd3deuU5d0QzJ9SD81F24B16rPXqmExNP5bER2mpuSvgjXlBmdklye
21
+ XjM0TxxJsCsWDnb3E3QFrnECgYBSpXqbNZXBK0JqnMTmh1psNQqWWpFQ5jxLScza
22
+ RMNbzqYcDPJwfAp9jJtY92Q6J6DUmuVSLgJivu88iZPpqHMj9MmikBP160XXqF+W
23
+ dJLYLml4a/LSFzg0nziJojnYI7LSEorQKRjdoFMEdGDt5eEin9cdgn39c/ASCQyN
24
+ o0FzcQKBgHifRoEEyyHzepXiv2osPsOV9cEoWROLRaooE7boPISimJ1PCFGON0XT
25
+ 20PmWJL3j3/f2Eqk47x4WpzLOp/OwUqqpaDpImtQX7GD7C+/PbAdbT1Q1Kc9kxc9
26
+ a5FJg85oJqDPB1yEmYG5nWIlqB3LOX/IdOfYSOUFvRiomwJJoxys
27
+ -----END RSA PRIVATE KEY-----
@@ -118,12 +118,17 @@ module AMQP
118
118
  # only send channel.open when connection is actually open. Makes it possible to
119
119
  # do c = AMQP.connect; AMQP::Channel.new(c) that is what some people do. MK.
120
120
  @connection.on_open do
121
- self.open do |*args|
121
+ self.open do |ch, open_ok|
122
122
  @channel_is_open_deferrable.succeed
123
123
 
124
- block.call(*args) if block
125
- end
126
- end
124
+ if block
125
+ case block.arity
126
+ when 1 then block.call(ch)
127
+ else block.call(ch, open_ok)
128
+ end # case
129
+ end # if
130
+ end # self.open
131
+ end # @connection.on_open
127
132
  end
128
133
 
129
134
 
@@ -294,6 +294,9 @@ module AMQP
294
294
  # @option opts [String] :default_routing_key (nil) Default routing key that will be used by {Exchange#publish} when no routing key is not passed explicitly.
295
295
  # It is perfectly fine for applications to always specify routing key to {Exchange#publish}.
296
296
  #
297
+ # @option opts [Hash] :arguments (nil) A hash of optional arguments with the declaration. Some brokers implement
298
+ # AMQP extensions using x-prefixed declaration arguments.
299
+ #
297
300
  #
298
301
  # @raise [AMQP::Error] Raised when exchange is redeclared with parameters different from original declaration.
299
302
  # @raise [AMQP::Error] Raised when exchange is declared with :passive => true and the exchange does not exist.
@@ -357,7 +360,7 @@ module AMQP
357
360
 
358
361
  unless @opts[:no_declare]
359
362
  @channel.once_open do
360
- self.declare(passive = @opts[:passive], durable = @opts[:durable], exclusive = @opts[:exclusive], auto_delete = @opts[:auto_delete], nowait = @opts[:nowait], nil, &shim)
363
+ self.declare(passive = @opts[:passive], durable = @opts[:durable], exclusive = @opts[:exclusive], auto_delete = @opts[:auto_delete], nowait = @opts[:nowait], @opts[:arguments], &shim)
361
364
  end
362
365
  end
363
366
  else
@@ -148,6 +148,12 @@ module AMQP
148
148
  # method it will raise a channel or connection exception.
149
149
  #
150
150
  #
151
+ # @option opts [Hash] :arguments (nil) A hash of optional arguments with the declaration. Some brokers implement
152
+ # AMQP extensions using x-prefixed declaration arguments. For example, RabbitMQ
153
+ # recognizes x-message-ttl declaration arguments that defines TTL of messages in
154
+ # the queue.
155
+ #
156
+ #
151
157
  # @yield [queue, declare_ok] Yields successfully declared queue instance and AMQP method (queue.declare-ok) instance. The latter is optional.
152
158
  # @yieldparam [Queue] queue Queue that is successfully declared and is ready to be used.
153
159
  # @yieldparam [AMQP::Protocol::Queue::DeclareOk] declare_ok AMQP queue.declare-ok) instance.
@@ -179,9 +185,9 @@ module AMQP
179
185
 
180
186
  @channel.once_open do
181
187
  if block
182
- self.declare(@opts[:passive], @opts[:durable], @opts[:exclusive], @opts[:auto_delete], @opts[:nowait], nil, &shim)
188
+ self.declare(@opts[:passive], @opts[:durable], @opts[:exclusive], @opts[:auto_delete], @opts[:nowait], @opts[:arguments], &shim)
183
189
  else
184
- self.declare(@opts[:passive], @opts[:durable], @opts[:exclusive], @opts[:auto_delete], @opts[:nowait], nil)
190
+ self.declare(@opts[:passive], @opts[:durable], @opts[:exclusive], @opts[:auto_delete], @opts[:nowait], @opts[:arguments])
185
191
  end
186
192
  end
187
193
  end
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module AMQP
4
- VERSION = '0.8.0.rc1'
4
+ VERSION = '0.8.0.rc2'
5
5
  end
@@ -15,9 +15,12 @@ describe "Queue that was bound to default direct exchange thanks to Automatic Mo
15
15
  amqp_before do
16
16
  @channel = AMQP::Channel.new
17
17
  @channel.should be_open
18
+ @channel.on_error do |*args|
19
+ puts "Channel-level error!"
20
+ end
18
21
 
19
- @queue1 = @channel.queue("queue1")
20
- @queue2 = @channel.queue("queue2")
22
+ @queue1 = @channel.queue("queue1", :auto_delete => true)
23
+ @queue2 = @channel.queue("queue2", :auto_delete => true)
21
24
 
22
25
  # Rely on default direct exchange binding, see section 2.1.2.4 Automatic Mode in AMQP 0.9.1 spec.
23
26
  @exchange = AMQP::Exchange.default(@channel)
@@ -55,7 +58,12 @@ describe "Queue that was bound to default direct exchange thanks to Automatic Mo
55
58
  @exchange.publish("some white noise", :routing_key => "killa key")
56
59
  end
57
60
 
58
- done(0.2) {
61
+ delayed(0.3) {
62
+ # We never subscribe to it, hence, need to delete manually
63
+ @queue2.delete
64
+ }
65
+
66
+ done(0.5) {
59
67
  number_of_received_messages.should == expected_number_of_messages
60
68
  }
61
69
  end # it
@@ -47,7 +47,7 @@ describe AMQP::Queue, "#pop" do
47
47
 
48
48
  @queue.pop do |payload|
49
49
  callback_has_fired = true
50
-
50
+ @queue.delete
51
51
  payload.should be_nil
52
52
  end
53
53
 
@@ -58,7 +58,7 @@ describe AMQP::Queue, "#pop" do
58
58
  end
59
59
  end
60
60
 
61
- context "when THERE ARE messages in the queue" do
61
+ context "when THERE ARE messages in the queue" do
62
62
  it "yields message payload to the callback" do
63
63
  number_of_received_messages = 0
64
64
  expected_number_of_messages = 300
@@ -71,7 +71,7 @@ describe AMQP::Queue, "#pop" do
71
71
  expected_number_of_messages.times do
72
72
  @queue.pop do |headers, payload|
73
73
  payload.should_not be_nil
74
- number_of_received_messages += 1
74
+ number_of_received_messages += 1
75
75
  headers.message_count.should == (expected_number_of_messages - number_of_received_messages)
76
76
 
77
77
  if RUBY_VERSION =~ /^1.9/
@@ -83,6 +83,10 @@ describe AMQP::Queue, "#pop" do
83
83
  end # do
84
84
  end
85
85
 
86
+ delayed(1.3) {
87
+ # Queue.Get doesn't qualify for subscription, hence, manual deletion is required
88
+ @queue.delete
89
+ }
86
90
  done(1.5) {
87
91
  number_of_received_messages.should == expected_number_of_messages
88
92
  }
@@ -28,14 +28,12 @@ describe AMQP do
28
28
  it "declares a new queue with that name" do
29
29
  queue = @channel.queue(name)
30
30
  queue.name.should == name
31
-
32
31
  done
33
32
  end
34
33
 
35
34
  it "caches that queue" do
36
35
  queue = @channel.queue(name)
37
36
  @channel.queue(name).object_id.should == queue.object_id
38
-
39
37
  done
40
38
  end
41
39
  end # context
@@ -44,29 +42,68 @@ describe AMQP do
44
42
  it "uses server-assigned queue name" do
45
43
  @channel.queue("") do |queue, *args|
46
44
  queue.name.should_not be_empty
47
- done
45
+ queue.delete
46
+ done(0.3)
48
47
  end
49
48
  end
50
49
  end # context
51
50
 
52
51
 
52
+ context "when queue is redeclared with different attributes" do
53
+ let(:name) { "amqp-gem.nondurable.queue" }
54
+ let(:options) { {:durable => false, :passive => false} }
55
+ let(:different_options) { {:durable => true, :passive => false} }
56
+ amqp_before do
57
+ @queue = @channel.queue(name, options)
58
+ delayed(0.25) { @queue.delete }
59
+ end
60
+
61
+ context "on the same channel" do
62
+ it "should raise ruby exception" do
63
+ expect {
64
+ @other_queue = @channel.queue(name, different_options)
65
+ }.to raise_error(AMQP::IncompatibleOptionsError)
66
+ @queue.delete
67
+ done(0.2)
68
+ end
69
+ end
53
70
 
71
+ context "on different channels (or even in different processes)" do
72
+ amqp_before { @other_channel = AMQP::Channel.new }
73
+
74
+ it "should not raise ruby exception" do
75
+ expect {
76
+ @other_queue = @other_channel.queue(name, different_options)
77
+ }.to_not raise_error
78
+ done
79
+ end
80
+
81
+ it "should trigger channel-level #on_error callback" do
82
+ @other_channel.on_error {|*args| @callback_fired = true }
83
+ @other_queue = @other_channel.queue(name, different_options)
84
+ done(0.35) {
85
+ @callback_fired.should be_true
86
+ @other_channel.should be_closed
87
+ }
88
+ end
89
+ end
90
+ end
54
91
 
55
92
  context "when passive option is used" do
56
- context "and exchange with given name already exists" do
93
+ context "and queue with given name already exists" do
57
94
  it "silently returns" do
58
95
  name = "a_new_queue declared at #{Time.now.to_i}"
59
96
 
60
- original_exchange = @channel.queue(name)
61
- exchange = @channel.queue(name, :passive => true)
97
+ original_queue = @channel.queue(name)
98
+ queue = @channel.queue(name, :passive => true)
62
99
 
63
- exchange.should == original_exchange
100
+ queue.should == original_queue
64
101
 
65
102
  done
66
103
  end # it
67
104
  end
68
105
 
69
- context "and exchange with given name DOES NOT exist" do
106
+ context "and queue with given name DOES NOT exist" do
70
107
  it "raises an exception" do
71
108
  pending "Not yet supported"
72
109
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: amqp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0.rc1
4
+ version: 0.8.0.rc2
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -11,12 +11,12 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain:
14
- date: 2011-04-17 00:00:00.000000000 +04:00
14
+ date: 2011-04-18 00:00:00.000000000
15
15
  default_executable:
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: eventmachine
19
- requirement: &2164608620 !ruby/object:Gem::Requirement
19
+ requirement: &2168550180 !ruby/object:Gem::Requirement
20
20
  none: false
21
21
  requirements:
22
22
  - - ~>
@@ -24,18 +24,18 @@ dependencies:
24
24
  version: 0.12.10
25
25
  type: :runtime
26
26
  prerelease: false
27
- version_requirements: *2164608620
27
+ version_requirements: *2168550180
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: amq-client
30
- requirement: &2164608200 !ruby/object:Gem::Requirement
30
+ requirement: &2168549540 !ruby/object:Gem::Requirement
31
31
  none: false
32
32
  requirements:
33
33
  - - ! '>='
34
34
  - !ruby/object:Gem::Version
35
- version: '0'
35
+ version: 0.7.0.alpha2
36
36
  type: :runtime
37
37
  prerelease: false
38
- version_requirements: *2164608200
38
+ version_requirements: *2168549540
39
39
  description: Asynchronous AMQP 0.9.1 client for Ruby. Built on top of Eventmachine.
40
40
  email:
41
41
  - michael@novemberain.com
@@ -44,24 +44,6 @@ executables: []
44
44
  extensions: []
45
45
  extra_rdoc_files:
46
46
  - README.textile
47
- - doc/_index.html
48
- - doc/AMQP.html
49
- - doc/class_list.html
50
- - doc/EXAMPLE_01_PINGPONG
51
- - doc/EXAMPLE_02_CLOCK
52
- - doc/EXAMPLE_03_STOCKS
53
- - doc/EXAMPLE_04_MULTICLOCK
54
- - doc/EXAMPLE_05_ACK
55
- - doc/EXAMPLE_05_POP
56
- - doc/EXAMPLE_06_HASHTABLE
57
- - doc/file.README.html
58
- - doc/file.VendorSpecificExtensions.html
59
- - doc/file_list.html
60
- - doc/frames.html
61
- - doc/index.html
62
- - doc/method_list.html
63
- - doc/MQ.html
64
- - doc/top-level-namespace.html
65
47
  files:
66
48
  - .gitignore
67
49
  - .rspec
@@ -77,19 +59,34 @@ files:
77
59
  - bin/irb
78
60
  - bin/jenkins.sh
79
61
  - bin/set_test_suite_realms_up.sh
80
- - doc/EXAMPLE_01_PINGPONG
81
- - doc/EXAMPLE_02_CLOCK
82
- - doc/EXAMPLE_03_STOCKS
83
- - doc/EXAMPLE_04_MULTICLOCK
84
- - doc/EXAMPLE_05_ACK
85
- - doc/EXAMPLE_05_POP
86
- - doc/EXAMPLE_06_HASHTABLE
62
+ - docs/RabbitMQVersions.textile
87
63
  - docs/VendorSpecificExtensions.textile
64
+ - examples/extensions/rabbitmq/per_queue_message_ttl.rb
88
65
  - examples/extensions/rabbitmq/publisher_confirmations_with_transient_messages.rb
89
66
  - examples/hello_world.rb
90
67
  - examples/real-world/task-queue/README.textile
91
68
  - examples/real-world/task-queue/consumer.rb
92
69
  - examples/real-world/task-queue/producer.rb
70
+ - examples/tls_certificates/client/cert.pem
71
+ - examples/tls_certificates/client/key.pem
72
+ - examples/tls_certificates/client/keycert.p12
73
+ - examples/tls_certificates/client/req.pem
74
+ - examples/tls_certificates/server/cert.pem
75
+ - examples/tls_certificates/server/key.pem
76
+ - examples/tls_certificates/server/keycert.p12
77
+ - examples/tls_certificates/server/req.pem
78
+ - examples/tls_certificates/testca/cacert.cer
79
+ - examples/tls_certificates/testca/cacert.pem
80
+ - examples/tls_certificates/testca/certs/01.pem
81
+ - examples/tls_certificates/testca/certs/02.pem
82
+ - examples/tls_certificates/testca/index.txt
83
+ - examples/tls_certificates/testca/index.txt.attr
84
+ - examples/tls_certificates/testca/index.txt.attr.old
85
+ - examples/tls_certificates/testca/index.txt.old
86
+ - examples/tls_certificates/testca/openssl.cnf
87
+ - examples/tls_certificates/testca/private/cakey.pem
88
+ - examples/tls_certificates/testca/serial
89
+ - examples/tls_certificates/testca/serial.old
93
90
  - examples/various/ack.rb
94
91
  - examples/various/automatic_binding_for_default_direct_exchange.rb
95
92
  - examples/various/basic_get.rb
@@ -146,42 +143,40 @@ files:
146
143
  - spec/unit/amqp/basic_spec.rb
147
144
  - spec/unit/amqp/connection_spec.rb
148
145
  - tasks.rb
149
- - doc/_index.html
150
- - doc/AMQP.html
151
- - doc/class_list.html
152
- - doc/file.README.html
153
- - doc/file.VendorSpecificExtensions.html
154
- - doc/file_list.html
155
- - doc/frames.html
156
- - doc/index.html
157
- - doc/method_list.html
158
- - doc/MQ.html
159
- - doc/top-level-namespace.html
160
146
  has_rdoc: true
161
147
  homepage: http://github.com/ruby-amqp/amqp
162
148
  licenses: []
163
- post_install_message: ! "[\e[32mVersion 0.8.0\e[0m] [API] AMQP::Channel.new now accepts
164
- (an optional) block and yields newly opened channel to it as soon as\n[\e[32mVersion
149
+ post_install_message: ! "[\e[32mVersion 0.8.0\e[0m] [API] AMQP::Exchange#initialize
150
+ now accepts :arguments option that takes a hash. Brokers\n[\e[32mVersion 0.8.0\e[0m]
151
+ [API] AMQP::Queue#initialize now accepts :arguments option that takes a hash. RabbitMQ\n[\e[32mVersion
152
+ 0.8.0\e[0m] [API] AMQP#Logger is deprecated. It will be removed before 1.0 release.\n[\e[32mVersion
153
+ 0.8.0\e[0m] [API] AMQP#fork is deprecated. It will be removed before 1.0 release.\n[\e[32mVersion
154
+ 0.8.0\e[0m] [API] AMQP::RPC is deprecated. It will be removed before 1.0 release.\n[\e[32mVersion
155
+ 0.8.0\e[0m] [FEATURE] Significant improvements to the documentation\n[\e[32mVersion
156
+ 0.8.0\e[0m] [FEATURE] Support for RabbitMQ extensions to AMQP 0.9.1\n[\e[32mVersion
157
+ 0.8.0\e[0m] [API] AMQP::Exchange#publish now accepts (an optional) block that is
158
+ called as soon as message\n[\e[32mVersion 0.8.0\e[0m] [API] AMQP::Channel.new now
159
+ accepts (an optional) block and yields newly opened channel to it as soon as\n[\e[32mVersion
165
160
  0.8.0\e[0m] [API] AMQP::Header#ack now can acknowledge multiple deliveries\n[\e[32mVersion
166
161
  0.8.0\e[0m] [API] AMQP::Exchange#delete now takes (an optional) block that is called
167
162
  when exchange.delete-ok response arrives.\n[\e[32mVersion 0.8.0\e[0m] [API] AMQP::Header
168
163
  now implements #to_hash\n[\e[32mVersion 0.8.0\e[0m] [API] AMQP::Queue#pop block
169
- now can take 1, 2 or 7 (that's right) arguments.\n[\e[32mVersion 0.8.0\e[0m] [API]
170
- AMQP::Queue#purge now takes an optional block which is called when queue.purge-ok
171
- response arrives.\n[\e[32mVersion 0.8.0\e[0m] [API] AMQP::Queue#delete now takes
172
- an optional block which is called when queue.delete-ok response arrives.\n[\e[32mVersion
173
- 0.8.0\e[0m] [API] AMQP::Queue#delete now accepts :nowait option.\n[\e[32mVersion
174
- 0.8.0\e[0m] [API] AMQP::Queue#unbind now takes an optional block which is called
175
- when queue.unbind-ok response arrives.\n[\e[32mVersion 0.8.0\e[0m] [API] AMQP::Queue#unbind
176
- now accepts :routing_key as alias to :key. we believe it is a good idea to use AMQP
177
- terms.\n[\e[32mVersion 0.8.0\e[0m] [API] AMQP::Channel#prefetch now takes (an optional)
178
- 2nd parameter that specifies\n[\e[32mVersion 0.8.0\e[0m] [API] AMQP::Channel#recover
179
- now takes (an optional) callback that is called when\n[\e[32mVersion 0.8.0\e[0m]
180
- [API] AMQP::Frame is gone.\n[\e[32mVersion 0.8.0\e[0m] [API] AMQP::Buffer is gone.
181
- Serialization & framing are now handled primarily by amq-protocol.\n[\e[32mVersion
182
- 0.8.0\e[0m] [FEATURE] AMQP gem is now AMQP 0.9.1 compatible: it runs atop of amq-client
183
- gem\n[\e[32mVersion 0.8.0\e[0m] [API] AMQP::Queue#publish is deprecated.\n[\e[32mVersion
184
- 0.8.0\e[0m] [API] Name argument for AMQP::Queue.new and Channel#queue is optional.\n"
164
+ now can take 1, 2 or 3 arguments.\n[\e[32mVersion 0.8.0\e[0m] [API] AMQP::Queue#purge
165
+ \ now takes an optional block which is called when queue.purge-ok response arrives.\n[\e[32mVersion
166
+ 0.8.0\e[0m] [API] AMQP::Queue#delete now takes an optional block which is called
167
+ when queue.delete-ok response arrives.\n[\e[32mVersion 0.8.0\e[0m] [API] AMQP::Queue#delete
168
+ now accepts :nowait option.\n[\e[32mVersion 0.8.0\e[0m] [API] AMQP::Queue#unbind
169
+ now takes an optional block which is called when queue.unbind-ok response arrives.\n[\e[32mVersion
170
+ 0.8.0\e[0m] [API] AMQP::Queue#unbind now accepts :routing_key as alias to :key.
171
+ we believe it is a good idea to use AMQP terms.\n[\e[32mVersion 0.8.0\e[0m] [API]
172
+ AMQP::Channel#prefetch now takes (an optional) 2nd parameter that specifies\n[\e[32mVersion
173
+ 0.8.0\e[0m] [API] AMQP::Channel#recover now takes (an optional) callback that is
174
+ called when\n[\e[32mVersion 0.8.0\e[0m] [API] AMQP::Frame is gone.\n[\e[32mVersion
175
+ 0.8.0\e[0m] [API] AMQP::Buffer is gone. Serialization & framing are now handled
176
+ primarily by amq-protocol.\n[\e[32mVersion 0.8.0\e[0m] [FEATURE] AMQP gem is now
177
+ AMQP 0.9.1 compatible: it runs atop of amq-client gem\n[\e[32mVersion 0.8.0\e[0m]
178
+ [API] AMQP::Queue#publish is deprecated.\n[\e[32mVersion 0.8.0\e[0m] [API] Name
179
+ argument for AMQP::Queue.new and Channel#queue is optional.\n"
185
180
  rdoc_options:
186
181
  - --include=examples --main README.textile
187
182
  require_paths: