amqp 0.8.0.rc8 → 0.8.0.rc9

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/.gitignore CHANGED
@@ -12,3 +12,4 @@ vendor
12
12
 
13
13
  .yardoc/*
14
14
  doc/*
15
+ tmp/*
data/.travis.yml CHANGED
@@ -3,8 +3,8 @@ rvm:
3
3
  - 1.8.7
4
4
  - 1.9.2
5
5
  - ree
6
- - rbx
7
6
  - jruby
7
+ - rbx
8
8
  gemfile:
9
9
  - Gemfile
10
10
  - gemfiles/eventmachine-pre
data/Gemfile CHANGED
@@ -25,6 +25,10 @@ group(:development) do
25
25
 
26
26
  custom_gem "nake", :platform => :ruby_19
27
27
  custom_gem "contributors", :platform => :ruby_19
28
+
29
+ # To test event loop helper and various Rack apps
30
+ gem "thin"
31
+ gem "unicorn", :platform => :ruby
28
32
  end
29
33
 
30
34
  group(:test) do
data/amqp.gemspec CHANGED
@@ -11,21 +11,18 @@ Gem::Specification.new do |s|
11
11
  s.homepage = "http://github.com/ruby-amqp/amqp"
12
12
  s.summary = "AMQP client implementation in Ruby/EventMachine."
13
13
  s.description = "Widely used, feature-rich asynchronous AMQP 0.9.1 client with batteries included"
14
- s.cert_chain = nil
15
14
  s.email = ["bWljaGFlbEBub3ZlbWJlcmFpbi5jb20=\n", "c3Rhc3RueUAxMDFpZGVhcy5jeg==\n"].map { |i| Base64.decode64(i) }
16
15
 
17
16
  # files
18
17
  s.files = `git ls-files`.split("\n").reject { |file| file =~ /^vendor\// || file =~ /^gemfiles\// }
19
18
  s.require_paths = ["lib"]
20
19
 
21
- # RDoc
22
- s.has_rdoc = true
23
20
  s.rdoc_options = '--include=examples --main README.textile'
24
21
  s.extra_rdoc_files = ["README.textile"] + Dir.glob("docs/*")
25
22
 
26
23
  # Dependencies
27
24
  s.add_dependency "eventmachine"
28
- s.add_dependency "amq-client", ">= 0.7.0.alpha20"
25
+ s.add_dependency "amq-client", ">= 0.7.0.alpha21"
29
26
 
30
27
  begin
31
28
  require "changelog"
@@ -236,7 +236,7 @@ EventMachine.run do
236
236
  }
237
237
  end
238
238
 
239
- channel.direct("").publish "Hello, world!", :routing_key => queue.name
239
+ channel.direct("").publish "Hello, world!", :routing_key => "amqpgem.examples.helloworld"
240
240
  end
241
241
  end
242
242
  </code>
@@ -22,8 +22,8 @@ AMQP.start("amqp://dev.rabbitmq.com:5672/") do |connection|
22
22
 
23
23
  exchange.publish("BOS 101, NYK 89").publish("ORL 85, ALT 88")
24
24
 
25
- # disconnect & exit after 1 second
26
- EventMachine.add_timer(1) do
25
+ # disconnect & exit after 2 seconds
26
+ EventMachine.add_timer(2) do
27
27
  exchange.delete
28
28
 
29
29
  connection.close {
@@ -0,0 +1,36 @@
1
+ use Rack::CommonLogger
2
+
3
+ require "bundler"
4
+ Bundler.setup
5
+
6
+ $:.unshift(File.expand_path("../../../../lib", __FILE__))
7
+
8
+ require 'amqp'
9
+ require 'amqp/utilities/event_loop_helper'
10
+
11
+ puts "EventMachine.reactor_running? => #{EventMachine.reactor_running?.inspect}"
12
+
13
+ AMQP::Utilities::EventLoopHelper.run do
14
+ AMQP.start
15
+
16
+ exchange = AMQP.channel.fanout("amq.fanout")
17
+
18
+ q = AMQP.channel.queue("", :auto_delete => true, :exclusive => true)
19
+ q.bind(exchange)
20
+ AMQP::channel.default_exchange.publish("Started!", :routing_key => q.name)
21
+ end
22
+
23
+ app = proc do |env|
24
+ AMQP.channel.fanout("amq.fanout").publish("Served a request at (#{Time.now.to_i})")
25
+
26
+ [
27
+ 200, # Status code
28
+ { # Response headers
29
+ 'Content-Type' => 'text/html',
30
+ 'Content-Length' => '2',
31
+ },
32
+ ['hi'] # Response body
33
+ ]
34
+ end
35
+
36
+ run app
@@ -38,6 +38,7 @@ module AMQP
38
38
  def self.start(connection_options_or_string = {}, other_options = {}, &block)
39
39
  EM.run do
40
40
  @connection ||= connect(connection_options_or_string, other_options, &block)
41
+ @channel = Channel.new(@connection)
41
42
  @connection
42
43
  end
43
44
  end
@@ -59,8 +60,15 @@ module AMQP
59
60
  return if @connection.nil? || self.closing?
60
61
 
61
62
  EM.next_tick do
63
+ if AMQP.channel and AMQP.channel.open? and AMQP.channel.connection.open?
64
+ AMQP.channel.close
65
+ end
66
+ AMQP.channel = nil
67
+
68
+
62
69
  shim = Proc.new {
63
70
  block.call
71
+
64
72
  AMQP.connection = nil
65
73
  }
66
74
  @connection.disconnect(reply_code, reply_text, &shim)
@@ -95,6 +103,26 @@ module AMQP
95
103
  @connection
96
104
  end
97
105
 
106
+ # "Default channel". A placeholder for apps that only want to use one channel. This channel is not global, *not* used
107
+ # under the hood by methods like {AMQP::Exchange#initialize} and only shared by exchanges/queues you decide on.
108
+ # To reiterate: this is only a conventience accessor, since many apps (especially Web apps) can get by with just one
109
+ # connection and one channel.
110
+ #
111
+ # @api public
112
+ def self.channel
113
+ @channel
114
+ end
115
+
116
+ # A placeholder for applications that only need one channel. If you use {AMQP.start} to set up default connection,
117
+ # {AMQP.channel} is open on that connection, but can be replaced by your application.
118
+ #
119
+ #
120
+ # @see AMQP.channel
121
+ # @api public
122
+ def self.channel=(value)
123
+ @channel = value
124
+ end
125
+
98
126
  # Sets global connection object.
99
127
  # @api public
100
128
  def self.connection=(value)
@@ -176,7 +204,8 @@ module AMQP
176
204
  # To handle it, pass a callable object (a proc, a lambda, an instance of a class that responds to #call)
177
205
  # with :on_possible_authentication_failure option.
178
206
  #
179
- # @note This method assumes that EventMachine even loop is already running. If it is not the case or you are not sure, we recommend you use {AMQP.start} instead. It takes exactly the same parameters.
207
+ # @note This method assumes that EventMachine even loop is already running. If it is not the case or you are not sure, we recommend you use {AMQP.start} instead.
208
+ # It takes exactly the same parameters.
180
209
  # @return [AMQP::Session]
181
210
  # @api public
182
211
  def self.connect(connection_options_or_string = {}, other_options = {}, &block)
data/lib/amqp/queue.rb CHANGED
@@ -642,7 +642,7 @@ module AMQP
642
642
  # @deprecated
643
643
  # @api public
644
644
  def publish(data, opts = {})
645
- exchange.publish(data, opts)
645
+ exchange.publish(data, opts.merge(:routing_key => self.name))
646
646
  end
647
647
 
648
648
  # Resets queue state. Useful for error handling.
@@ -1,8 +1,21 @@
1
1
  require "eventmachine"
2
2
  require "amqp/utilities/server_type"
3
3
 
4
+ require "thread"
5
+
4
6
  module AMQP
5
7
  module Utilities
8
+
9
+ # A helper that starts EventMachine reactor the optimal way depending on what Web server
10
+ # (if any) you are running. It should not be considered a 100% safe, general purpose EventMachine
11
+ # reactor "on/off switch" but is very useful in Web applications and some stand-alone applications.
12
+ #
13
+ # This helper was inspired by Qusion project by Dan DeLeo.
14
+ #
15
+ # h2. Key methods
16
+ #
17
+ # * {EventLoopHelper.run}
18
+ # * {EventLoopHelper.server_type}
6
19
  class EventLoopHelper
7
20
 
8
21
  def self.eventmachine_thread
@@ -13,36 +26,61 @@ module AMQP
13
26
  EventMachine.reactor_running?
14
27
  end # self.reactor_running?
15
28
 
29
+ # Type of server (if any) that is running.
30
+ #
31
+ # @see AMQP::Utilities::ServerType.detect
16
32
  def self.server_type
17
33
  @server_type ||= ServerType.detect
18
34
  end # self.server_type
19
35
 
20
- def self.run(in_a_worker_process = false)
21
- # TODO: make reentrant
22
-
23
- @eventmachine_thread = case self.server_type
24
- when :thin, :goliath, :evented_mongrel then
25
- Thread.current
26
- when :unicorn, :passenger then
27
- EventMachine.stop if in_a_worker_process
36
+ # A helper that detects what app server (if any) is running and starts
37
+ # EventMachine reactor in the most optimal way. For event-driven servers like
38
+ # Thin and Goliath, this means relying on them starting the reactor but delaying
39
+ # execution of a block you pass to {EventLoopHelper.run} until reactor is actually running.
40
+ #
41
+ # For Unicorn, Passenger, Mongrel and other servers and standalone apps EventMachine is started
42
+ # in a separate thread.
43
+ #
44
+ # @example Using EventLoopHelper.run to start EventMachine reactor the optimal way without blocking current thread
45
+ #
46
+ # AMQP::Utilities::EventLoopHelper.run do
47
+ # # Sets up default connection, accessible via AMQP.connection, and opens a channel
48
+ # # accessible via AMQP.channel for convenience
49
+ # AMQP.start
50
+ #
51
+ # exchange = AMQP.channel.fanout("amq.fanout")
52
+ #
53
+ # AMQP.channel.queue("", :auto_delete => true, :exclusive => true).bind(exchange)
54
+ # AMQP::channel.default_exchange.publish("Started!", :routing_key => AMQP::State.queue.name)
55
+ # end
56
+ #
57
+ # @return [Thread] A thread EventMachine event loop will be started in (there is no guarantee it is already running).
58
+ #
59
+ #
60
+ # @note This method, unlike EventMachine.run, DOES NOT block current thread.
61
+ def self.run(&block)
62
+ @eventmachine_thread ||= begin
63
+ case self.server_type
64
+ when :thin, :goliath, :evented_mongrel then
65
+ EventMachine.next_tick { block.call }
66
+ Thread.current
67
+ when :unicorn, :passenger, :mongrel, :scgi, :webrick, nil then
68
+ t = Thread.new { EventMachine.run(&block) }
69
+ # give EventMachine reactor some time to start
70
+ sleep(0.25)
28
71
 
29
- t = Thread.new { EventMachine.run }
30
- # give EventMachine reactor some time to start
31
- sleep(0.25)
72
+ t
73
+ else
74
+ t = Thread.new { EventMachine.run(&block) }
75
+ # give EventMachine reactor some time to start
76
+ sleep(0.25)
32
77
 
33
- t
34
- when :mongrel, :scgi, :webrick, nil then
35
- t = Thread.new { EventMachine.run }
36
- # give EventMachine reactor some time to start
37
- sleep(0.25)
38
-
39
- t
40
- end
78
+ t
79
+ end
80
+ end
41
81
  end # self.run
42
82
 
43
- def self.stop
44
- EventMachine.stop
45
- end
83
+
46
84
  end # EventLoopHelper
47
85
  end # Utilities
48
86
  end # AMQP
@@ -23,7 +23,25 @@
23
23
 
24
24
  module AMQP
25
25
  module Utilities
26
+ # A helper that detects Web server that may be running (if any). Partially derived
27
+ # from Qusion project by Daniel DeLeo.
26
28
  class ServerType
29
+
30
+ # Return a symbol representing Web server that is running (if any).
31
+ #
32
+ # Possible values are:
33
+ #
34
+ # * :thin for Thin
35
+ # * :unicorn for Unicorn
36
+ # * :passenger for Passenger (Apache mod_rack)
37
+ # * :goliath for PostRank's Goliath
38
+ # * :evented_mongrel for Swiftiply's Evented Mongrel
39
+ # * :mongrel for Mongrel
40
+ # * :scgi for SCGI
41
+ # * :webrick for WEBrick
42
+ # * nil: none of the above (the case for non-Web application, for example)
43
+ #
44
+ # @return [Symbol]
27
45
  def self.detect
28
46
  if defined?(::PhusionPassenger)
29
47
  :passenger
data/lib/amqp/version.rb CHANGED
@@ -6,5 +6,5 @@ module AMQP
6
6
  #
7
7
  # @see AMQ::Protocol::VERSION
8
8
  # @return [String] AMQP gem version
9
- VERSION = '0.8.0.rc8'
9
+ VERSION = '0.8.0.rc9'
10
10
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- describe AMQP do
5
+ describe AMQP::Channel do
6
6
 
7
7
  #
8
8
  # Environment
@@ -10,13 +10,15 @@ describe AMQP do
10
10
 
11
11
  include EventedSpec::AMQPSpec
12
12
 
13
- default_timeout 10
13
+ default_timeout 2
14
+
14
15
 
15
16
  amqp_before do
16
17
  @channel = AMQP::Channel.new
17
18
  end
18
19
 
19
20
 
21
+
20
22
  #
21
23
  # Examples
22
24
  #
@@ -26,7 +28,7 @@ describe AMQP do
26
28
  it 'declares a new direct exchange with that name' do
27
29
  @channel.direct('name').name.should == 'name'
28
30
 
29
- done
31
+ done(0.3)
30
32
  end
31
33
 
32
34
  it "declares direct exchange as transient (non-durable)" do
@@ -35,7 +37,7 @@ describe AMQP do
35
37
  exchange.should_not be_durable
36
38
  exchange.should be_transient
37
39
 
38
- done
40
+ done(0.3)
39
41
  end
40
42
 
41
43
  it "declares direct exchange as non-auto-deleted" do
@@ -43,7 +45,7 @@ describe AMQP do
43
45
 
44
46
  exchange.should_not be_auto_deleted
45
47
 
46
- done
48
+ done(0.3)
47
49
  end
48
50
  end
49
51
 
@@ -51,7 +53,7 @@ describe AMQP do
51
53
  context "when exchange name is omitted" do
52
54
  it 'uses amq.direct' do
53
55
  @channel.direct.name.should == 'amq.direct'
54
- done
56
+ done(0.3)
55
57
  end # it
56
58
  end # context
57
59
 
@@ -64,7 +66,7 @@ describe AMQP do
64
66
  EOF
65
67
  @channel.direct("") do |exchange|
66
68
  exchange.name.should_not be_empty
67
- done
69
+ done(0.3)
68
70
  end
69
71
  end
70
72
  end # context
@@ -80,7 +82,7 @@ describe AMQP do
80
82
 
81
83
  exchange.should == original_exchange
82
84
 
83
- done
85
+ done(0.3)
84
86
  end # it
85
87
  end
86
88
 
@@ -92,7 +94,7 @@ describe AMQP do
92
94
  exchange = @channel.direct("direct exchange declared at #{Time.now.to_i}", :passive => true)
93
95
  }.to raise_error
94
96
 
95
- done
97
+ done(0.3)
96
98
  end # it
97
99
  end # context
98
100
  end # context
@@ -104,7 +106,7 @@ describe AMQP do
104
106
  exchange.should be_durable
105
107
  exchange.should_not be_transient
106
108
 
107
- done
109
+ done(0.3)
108
110
  end # it
109
111
  end # context
110
112
 
@@ -115,7 +117,7 @@ describe AMQP do
115
117
  exchange.should_not be_durable
116
118
  exchange.should be_transient
117
119
 
118
- done
120
+ done(0.3)
119
121
  end # it
120
122
  end # context
121
123
 
@@ -125,7 +127,7 @@ describe AMQP do
125
127
  exchange = @channel.direct("a new auto-deleted direct exchange", :auto_delete => true)
126
128
 
127
129
  exchange.should be_auto_deleted
128
- done
130
+ done(0.3)
129
131
  end # it
130
132
  end # context
131
133
 
@@ -135,7 +137,7 @@ describe AMQP do
135
137
  exchange = @channel.direct("a new non-auto-deleted direct exchange", :auto_delete => false)
136
138
 
137
139
  exchange.should_not be_auto_deleted
138
- done
140
+ done(0.3)
139
141
  end # it
140
142
  end # context
141
143
 
@@ -145,7 +147,7 @@ describe AMQP do
145
147
  exchange = @channel.direct("a new non-auto-deleted direct exchange", :auto_delete => false)
146
148
 
147
149
  exchange.should_not be_auto_deleted
148
- done
150
+ done(0.3)
149
151
  end # it
150
152
  end # context
151
153
 
@@ -158,7 +160,7 @@ describe AMQP do
158
160
  @channel.direct("previously.declared.durable.direct.exchange", :durable => false)
159
161
  }.to raise_error(AMQP::IncompatibleOptionsError)
160
162
 
161
- done
163
+ done(0.3)
162
164
  end # it
163
165
  end # context
164
166
  end # describe
@@ -175,7 +177,7 @@ describe AMQP do
175
177
 
176
178
  exchange.name.should == name
177
179
 
178
- done
180
+ done(0.3)
179
181
  end
180
182
  end # context
181
183
 
@@ -185,7 +187,7 @@ describe AMQP do
185
187
  exchange.name.should == "amq.fanout"
186
188
  exchange.name.should_not == "amq.fanout2"
187
189
 
188
- done
190
+ done(0.3)
189
191
  end
190
192
  end # context
191
193
 
@@ -199,7 +201,7 @@ describe AMQP do
199
201
 
200
202
  exchange.should == original_exchange
201
203
 
202
- done
204
+ done(0.3)
203
205
  end # it
204
206
  end
205
207
 
@@ -211,7 +213,7 @@ describe AMQP do
211
213
  exchange = @channel.fanout("fanout exchange declared at #{Time.now.to_i}", :passive => true)
212
214
  }.to raise_error
213
215
 
214
- done
216
+ done(0.3)
215
217
  end # it
216
218
  end # context
217
219
  end # context
@@ -223,7 +225,7 @@ describe AMQP do
223
225
  exchange.should be_durable
224
226
  exchange.should_not be_transient
225
227
 
226
- done
228
+ done(0.3)
227
229
  end # it
228
230
  end # context
229
231
 
@@ -234,7 +236,7 @@ describe AMQP do
234
236
  exchange.should_not be_durable
235
237
  exchange.should be_transient
236
238
 
237
- done
239
+ done(0.3)
238
240
  end # it
239
241
  end # context
240
242
 
@@ -244,7 +246,7 @@ describe AMQP do
244
246
  exchange = @channel.fanout("a new auto-deleted fanout exchange", :auto_delete => true)
245
247
 
246
248
  exchange.should be_auto_deleted
247
- done
249
+ done(0.3)
248
250
  end # it
249
251
  end # context
250
252
 
@@ -254,7 +256,7 @@ describe AMQP do
254
256
  exchange = @channel.fanout("a new non-auto-deleted fanout exchange", :auto_delete => false)
255
257
 
256
258
  exchange.should_not be_auto_deleted
257
- done
259
+ done(0.3)
258
260
  end # it
259
261
  end # context
260
262
 
@@ -264,7 +266,7 @@ describe AMQP do
264
266
  exchange = @channel.fanout("a new non-auto-deleted fanout exchange", :auto_delete => false)
265
267
 
266
268
  exchange.should_not be_auto_deleted
267
- done
269
+ done(0.3)
268
270
  end # it
269
271
  end # context
270
272
 
@@ -277,7 +279,7 @@ describe AMQP do
277
279
  @channel.fanout("previously.declared.durable.topic.exchange", :durable => false)
278
280
  }.to raise_error(AMQP::IncompatibleOptionsError)
279
281
 
280
- done
282
+ done(0.3)
281
283
  end # it
282
284
  end # context
283
285
  end # describe
@@ -293,7 +295,7 @@ describe AMQP do
293
295
  exchange = @channel.topic(name)
294
296
  exchange.name.should == name
295
297
 
296
- done
298
+ done(0.3)
297
299
  end
298
300
  end # context
299
301
 
@@ -303,7 +305,7 @@ describe AMQP do
303
305
  exchange.name.should == "amq.topic"
304
306
  exchange.name.should_not == "amq.topic2"
305
307
 
306
- done
308
+ done(0.3)
307
309
  end
308
310
  end # context
309
311
 
@@ -317,7 +319,7 @@ describe AMQP do
317
319
 
318
320
  exchange.should == original_exchange
319
321
 
320
- done
322
+ done(0.3)
321
323
  end # it
322
324
  end
323
325
 
@@ -329,7 +331,7 @@ describe AMQP do
329
331
  exchange = @channel.topic("topic exchange declared at #{Time.now.to_i}", :passive => true)
330
332
  }.to raise_error
331
333
 
332
- done
334
+ done(0.3)
333
335
  end # it
334
336
  end # context
335
337
  end # context
@@ -341,7 +343,7 @@ describe AMQP do
341
343
  exchange.should be_durable
342
344
  exchange.should_not be_transient
343
345
 
344
- done
346
+ done(0.3)
345
347
  end # it
346
348
  end # context
347
349
 
@@ -352,7 +354,7 @@ describe AMQP do
352
354
  exchange.should_not be_durable
353
355
  exchange.should be_transient
354
356
 
355
- done
357
+ done(0.3)
356
358
  end # it
357
359
  end # context
358
360
 
@@ -362,7 +364,7 @@ describe AMQP do
362
364
  exchange = @channel.topic("a new auto-deleted topic exchange", :auto_delete => true)
363
365
 
364
366
  exchange.should be_auto_deleted
365
- done
367
+ done(0.3)
366
368
  end # it
367
369
  end # context
368
370
 
@@ -372,7 +374,7 @@ describe AMQP do
372
374
  exchange = @channel.topic("a new non-auto-deleted topic exchange", :auto_delete => false)
373
375
 
374
376
  exchange.should_not be_auto_deleted
375
- done
377
+ done(0.3)
376
378
  end # it
377
379
  end # context
378
380
 
@@ -382,7 +384,7 @@ describe AMQP do
382
384
  exchange = @channel.topic("a new non-auto-deleted topic exchange", :auto_delete => false)
383
385
 
384
386
  exchange.should_not be_auto_deleted
385
- done
387
+ done(0.3)
386
388
  end # it
387
389
  end # context
388
390
 
@@ -402,7 +404,7 @@ describe AMQP do
402
404
  channel.topic("previously.declared.durable.topic.exchange", :durable => false)
403
405
  }.to raise_error(AMQP::IncompatibleOptionsError)
404
406
 
405
- done
407
+ done(0.3)
406
408
  end # it
407
409
  end # context
408
410
  end # describe
@@ -419,7 +421,7 @@ describe AMQP do
419
421
 
420
422
  exchange.name.should == name
421
423
 
422
- done
424
+ done(0.3)
423
425
  end
424
426
  end # context
425
427
 
@@ -433,7 +435,7 @@ describe AMQP do
433
435
  exchange.name.should == "amq.match"
434
436
  exchange.name.should_not == "amq.headers"
435
437
 
436
- done
438
+ done(0.3)
437
439
  end
438
440
  end # context
439
441
 
@@ -447,7 +449,7 @@ describe AMQP do
447
449
 
448
450
  exchange.should == original_exchange
449
451
 
450
- done
452
+ done(0.3)
451
453
  end # it
452
454
  end
453
455
 
@@ -459,7 +461,7 @@ describe AMQP do
459
461
  exchange = @channel.headers("headers exchange declared at #{Time.now.to_i}", :passive => true)
460
462
  }.to raise_error
461
463
 
462
- done
464
+ done(0.3)
463
465
  end # it
464
466
  end # context
465
467
  end # context
@@ -471,7 +473,7 @@ describe AMQP do
471
473
  exchange.should be_durable
472
474
  exchange.should_not be_transient
473
475
 
474
- done
476
+ done(0.3)
475
477
  end # it
476
478
  end # context
477
479
 
@@ -482,7 +484,7 @@ describe AMQP do
482
484
  exchange.should_not be_durable
483
485
  exchange.should be_transient
484
486
 
485
- done
487
+ done(0.3)
486
488
  end # it
487
489
  end # context
488
490
 
@@ -492,7 +494,7 @@ describe AMQP do
492
494
  exchange = @channel.headers("a new auto-deleted headers exchange", :auto_delete => true)
493
495
 
494
496
  exchange.should be_auto_deleted
495
- done
497
+ done(0.3)
496
498
  end # it
497
499
  end # context
498
500
 
@@ -502,7 +504,7 @@ describe AMQP do
502
504
  exchange = @channel.headers("a new non-auto-deleted headers exchange", :auto_delete => false)
503
505
 
504
506
  exchange.should_not be_auto_deleted
505
- done
507
+ done(0.3)
506
508
  end # it
507
509
  end # context
508
510
 
@@ -512,7 +514,7 @@ describe AMQP do
512
514
  exchange = @channel.headers("a new non-auto-deleted headers exchange", :auto_delete => false)
513
515
 
514
516
  exchange.should_not be_auto_deleted
515
- done
517
+ done(0.3)
516
518
  end # it
517
519
  end # context
518
520
 
@@ -529,7 +531,7 @@ describe AMQP do
529
531
  @channel.headers("previously.declared.durable.topic.exchange", :durable => false)
530
532
  }.to raise_error(AMQP::IncompatibleOptionsError)
531
533
 
532
- done
534
+ done(0.3)
533
535
  end # it
534
536
  end # context
535
537
  end # describe
@@ -16,6 +16,10 @@ describe AMQP do
16
16
  @channel = AMQP::Channel.new
17
17
  end
18
18
 
19
+ after(:all) do
20
+ AMQP.cleanup_state
21
+ done(0.3)
22
+ end
19
23
 
20
24
  #
21
25
  # Examples
@@ -28,13 +32,13 @@ describe AMQP do
28
32
  it "declares a new queue with that name" do
29
33
  queue = @channel.queue(name)
30
34
  queue.name.should == name
31
- done
35
+ done(0.3)
32
36
  end
33
37
 
34
38
  it "caches that queue" do
35
39
  queue = @channel.queue(name)
36
40
  @channel.queue(name).object_id.should == queue.object_id
37
- done
41
+ done(0.3)
38
42
  end
39
43
  end # context
40
44
 
@@ -68,7 +72,7 @@ describe AMQP do
68
72
  @channel.queue(name, different_options)
69
73
  }.to raise_error(AMQP::IncompatibleOptionsError)
70
74
  @queue.delete
71
- done(0.2)
75
+ done(0.3)
72
76
  end
73
77
  end
74
78
  end
@@ -83,7 +87,7 @@ describe AMQP do
83
87
 
84
88
  queue.should == original_queue
85
89
 
86
- done
90
+ done(0.3)
87
91
  end # it
88
92
  end
89
93
 
@@ -95,7 +99,7 @@ describe AMQP do
95
99
  exchange = @channel.queue("queue declared at #{Time.now.to_i}", :passive => true)
96
100
  }.to raise_error
97
101
 
98
- done
102
+ done(0.3)
99
103
  end # it
100
104
  end # context
101
105
  end # context
@@ -111,7 +115,7 @@ describe AMQP do
111
115
  @channel.queue("previously.declared.durable.queue", :durable => false)
112
116
  }.to raise_error(AMQP::IncompatibleOptionsError)
113
117
 
114
- done
118
+ done(0.3)
115
119
  end # it
116
120
  end # context
117
121
  end # describe
@@ -74,49 +74,4 @@ describe AMQP, 'class object' do
74
74
  end
75
75
  end
76
76
  end # .start
77
-
78
-
79
-
80
-
81
- describe '.stop' do
82
- context "when connection is not established" do
83
- it 'is a no-op' do
84
- AMQP.stop
85
- AMQP.stop
86
-
87
- @res = AMQP.stop
88
- @res.should be_nil
89
- end # it
90
- end # context
91
-
92
-
93
- context 'with established AMQP connection' do
94
-
95
- #
96
- #
97
- #
98
-
99
- include EventedSpec::EMSpec
100
- default_options AMQP_OPTS
101
- #
102
- # Examples
103
- #
104
-
105
- it 'properly closes AMQP broker connection and fires a callback. Mind the delay!' do
106
- AMQP.start(AMQP_OPTS) do
107
- AMQP.connection.should be_connected
108
-
109
- @block_has_fired = false
110
-
111
- AMQP.stop do
112
- @block_has_fired = true
113
- end
114
- AMQP.connection.should_not be_nil
115
- done(0.1) do
116
- @block_has_fired.should be_true
117
- end
118
- end
119
- end # it
120
- end # context
121
- end # describe
122
77
  end # describe AMQP
metadata CHANGED
@@ -1,65 +1,48 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: amqp
3
- version: !ruby/object:Gem::Version
4
- hash: 977940489
5
- prerelease: true
6
- segments:
7
- - 0
8
- - 8
9
- - 0
10
- - rc8
11
- version: 0.8.0.rc8
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.8.0.rc9
5
+ prerelease: 6
12
6
  platform: ruby
13
- authors:
7
+ authors:
14
8
  - Aman Gupta
15
9
  - Jakub Stastny aka botanicus
16
10
  - Michael S. Klishin
17
11
  autorequire:
18
12
  bindir: bin
19
- cert_chain:
20
- date: 2011-05-09 00:00:00 +04:00
21
- default_executable:
22
- dependencies:
23
- - !ruby/object:Gem::Dependency
13
+ cert_chain: []
14
+ date: 2011-05-10 00:00:00.000000000Z
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
24
17
  name: eventmachine
25
- prerelease: false
26
- requirement: &id001 !ruby/object:Gem::Requirement
18
+ requirement: &2152811580 !ruby/object:Gem::Requirement
27
19
  none: false
28
- requirements:
29
- - - ">="
30
- - !ruby/object:Gem::Version
31
- hash: 3
32
- segments:
33
- - 0
34
- version: "0"
20
+ requirements:
21
+ - - ! '>='
22
+ - !ruby/object:Gem::Version
23
+ version: '0'
35
24
  type: :runtime
36
- version_requirements: *id001
37
- - !ruby/object:Gem::Dependency
38
- name: amq-client
39
25
  prerelease: false
40
- requirement: &id002 !ruby/object:Gem::Requirement
26
+ version_requirements: *2152811580
27
+ - !ruby/object:Gem::Dependency
28
+ name: amq-client
29
+ requirement: &2152833600 !ruby/object:Gem::Requirement
41
30
  none: false
42
- requirements:
43
- - - ">="
44
- - !ruby/object:Gem::Version
45
- hash: 1369095468
46
- segments:
47
- - 0
48
- - 7
49
- - 0
50
- - alpha20
51
- version: 0.7.0.alpha20
31
+ requirements:
32
+ - - ! '>='
33
+ - !ruby/object:Gem::Version
34
+ version: 0.7.0.alpha21
52
35
  type: :runtime
53
- version_requirements: *id002
54
- description: Widely used, feature-rich asynchronous AMQP 0.9.1 client with batteries included
55
- email:
36
+ prerelease: false
37
+ version_requirements: *2152833600
38
+ description: Widely used, feature-rich asynchronous AMQP 0.9.1 client with batteries
39
+ included
40
+ email:
56
41
  - michael@novemberain.com
57
42
  - stastny@101ideas.cz
58
43
  executables: []
59
-
60
44
  extensions: []
61
-
62
- extra_rdoc_files:
45
+ extra_rdoc_files:
63
46
  - README.textile
64
47
  - docs/08Migration.textile
65
48
  - docs/Bindings.textile
@@ -75,7 +58,7 @@ extra_rdoc_files:
75
58
  - docs/RabbitMQVersions.textile
76
59
  - docs/Routing.textile
77
60
  - docs/VendorSpecificExtensions.textile
78
- files:
61
+ files:
79
62
  - .gitignore
80
63
  - .rspec
81
64
  - .travis.yml
@@ -88,7 +71,6 @@ files:
88
71
  - amqp.gemspec
89
72
  - bin/cleanify.rb
90
73
  - bin/irb
91
- - bin/jenkins.sh
92
74
  - bin/set_test_suite_realms_up.sh
93
75
  - docs/08Migration.textile
94
76
  - docs/Bindings.textile
@@ -151,6 +133,7 @@ files:
151
133
  - examples/queues/declare_a_queue_without_assignment.rb
152
134
  - examples/queues/declare_and_bind_a_server_named_queue.rb
153
135
  - examples/queues/queue_status.rb
136
+ - examples/rack/publish_a_message_on_request/thin.ru
154
137
  - examples/real-world/task-queue/README.textile
155
138
  - examples/real-world/task-queue/consumer.rb
156
139
  - examples/real-world/task-queue/producer.rb
@@ -220,41 +203,29 @@ files:
220
203
  - spec/unit/amqp/basic_spec.rb
221
204
  - spec/unit/amqp/connection_spec.rb
222
205
  - tasks.rb
223
- has_rdoc: true
224
206
  homepage: http://github.com/ruby-amqp/amqp
225
207
  licenses: []
226
-
227
208
  post_install_message:
228
- rdoc_options:
209
+ rdoc_options:
229
210
  - --include=examples --main README.textile
230
- require_paths:
211
+ require_paths:
231
212
  - lib
232
- required_ruby_version: !ruby/object:Gem::Requirement
213
+ required_ruby_version: !ruby/object:Gem::Requirement
233
214
  none: false
234
- requirements:
235
- - - ">="
236
- - !ruby/object:Gem::Version
237
- hash: 3
238
- segments:
239
- - 0
240
- version: "0"
241
- required_rubygems_version: !ruby/object:Gem::Requirement
215
+ requirements:
216
+ - - ! '>='
217
+ - !ruby/object:Gem::Version
218
+ version: '0'
219
+ required_rubygems_version: !ruby/object:Gem::Requirement
242
220
  none: false
243
- requirements:
244
- - - ">"
245
- - !ruby/object:Gem::Version
246
- hash: 25
247
- segments:
248
- - 1
249
- - 3
250
- - 1
221
+ requirements:
222
+ - - ! '>'
223
+ - !ruby/object:Gem::Version
251
224
  version: 1.3.1
252
225
  requirements: []
253
-
254
226
  rubyforge_project: amqp
255
- rubygems_version: 1.3.7
227
+ rubygems_version: 1.8.1
256
228
  signing_key:
257
229
  specification_version: 3
258
230
  summary: AMQP client implementation in Ruby/EventMachine.
259
231
  test_files: []
260
-
data/bin/jenkins.sh DELETED
@@ -1,27 +0,0 @@
1
- #!/bin/bash
2
-
3
- echo -e "\n\n==== Setup ===="
4
- source /etc/profile
5
- git fetch && git reset origin/master --hard
6
-
7
- # FIXME: Jenkins user doesn't have permissions to run it.
8
- # PATH=/usr/sbin:$PATH ./bin/set_test_suite_realms_up.sh
9
- echo "~ NOT running ./bin/set_test_suite_realms_up.sh"
10
-
11
- echo -e "\n\n==== Ruby 1.9.2 Head ===="
12
- rvm use 1.9.2-head@ruby-amqp
13
- gem install bundler --no-ri --no-rdoc
14
- bundle install --path vendor/bundle/1.9.2 --without development; echo
15
- bundle update; echo
16
- bundle exec rspec spec
17
- return_status=$?
18
-
19
- echo -e "\n\n==== Ruby 1.8.7 ===="
20
- rvm use 1.8.7@ruby-amqp
21
- gem install bundler --no-ri --no-rdoc
22
- bundle install --path vendor/bundle/1.8.7 --without development; echo
23
- bundle update; echo
24
- bundle exec rspec spec
25
- return_status=$(expr $return_status + $?)
26
-
27
- test $return_status -eq 0