bunny 0.7.12 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. data/.gitignore +2 -2
  2. data/.travis.yml +7 -16
  3. data/CHANGELOG +3 -21
  4. data/Gemfile +2 -4
  5. data/README.textile +31 -9
  6. data/Rakefile +3 -3
  7. data/bunny.gemspec +6 -3
  8. data/examples/{simple_08.rb → simple.rb} +1 -1
  9. data/examples/{simple_ack_08.rb → simple_ack.rb} +1 -1
  10. data/examples/{simple_consumer_08.rb → simple_consumer.rb} +4 -4
  11. data/examples/{simple_fanout_08.rb → simple_fanout.rb} +1 -1
  12. data/examples/{simple_headers_08.rb → simple_headers.rb} +2 -2
  13. data/examples/{simple_publisher_09.rb → simple_publisher.rb} +1 -1
  14. data/examples/{simple_topic_09.rb → simple_topic.rb} +2 -2
  15. data/ext/amqp-0.9.1.json +1 -0
  16. data/ext/config.yml +3 -3
  17. data/ext/qparser.rb +9 -52
  18. data/lib/bunny.rb +15 -33
  19. data/lib/bunny/{channel08.rb → channel.rb} +0 -0
  20. data/lib/bunny/{client09.rb → client.rb} +34 -46
  21. data/lib/bunny/{exchange09.rb → exchange.rb} +16 -15
  22. data/lib/bunny/{queue09.rb → queue.rb} +26 -23
  23. data/lib/bunny/{subscription09.rb → subscription.rb} +11 -6
  24. data/lib/bunny/version.rb +1 -1
  25. data/lib/qrack/client.rb +30 -21
  26. data/lib/qrack/protocol/{protocol08.rb → protocol.rb} +2 -1
  27. data/lib/qrack/protocol/{spec09.rb → spec.rb} +8 -7
  28. data/lib/qrack/{qrack08.rb → qrack.rb} +4 -4
  29. data/lib/qrack/subscription.rb +58 -9
  30. data/lib/qrack/transport/{buffer08.rb → buffer.rb} +8 -0
  31. data/lib/qrack/transport/{frame08.rb → frame.rb} +7 -22
  32. data/spec/spec_09/bunny_spec.rb +10 -8
  33. data/spec/spec_09/connection_spec.rb +8 -3
  34. data/spec/spec_09/exchange_spec.rb +22 -19
  35. data/spec/spec_09/queue_spec.rb +32 -18
  36. metadata +69 -76
  37. checksums.yaml +0 -7
  38. data/examples/simple_09.rb +0 -32
  39. data/examples/simple_ack_09.rb +0 -35
  40. data/examples/simple_consumer_09.rb +0 -55
  41. data/examples/simple_fanout_09.rb +0 -41
  42. data/examples/simple_headers_09.rb +0 -42
  43. data/examples/simple_publisher_08.rb +0 -29
  44. data/examples/simple_topic_08.rb +0 -61
  45. data/ext/amqp-0.8.json +0 -616
  46. data/lib/bunny/channel09.rb +0 -39
  47. data/lib/bunny/client08.rb +0 -480
  48. data/lib/bunny/exchange08.rb +0 -177
  49. data/lib/bunny/queue08.rb +0 -403
  50. data/lib/bunny/subscription08.rb +0 -87
  51. data/lib/qrack/protocol/protocol09.rb +0 -135
  52. data/lib/qrack/protocol/spec08.rb +0 -828
  53. data/lib/qrack/qrack09.rb +0 -20
  54. data/lib/qrack/transport/buffer09.rb +0 -305
  55. data/lib/qrack/transport/frame09.rb +0 -97
  56. data/spec/spec_08/bunny_spec.rb +0 -75
  57. data/spec/spec_08/connection_spec.rb +0 -24
  58. data/spec/spec_08/exchange_spec.rb +0 -170
  59. data/spec/spec_08/queue_spec.rb +0 -239
@@ -1,20 +0,0 @@
1
- # encoding: utf-8
2
-
3
- $: << File.expand_path(File.dirname(__FILE__))
4
-
5
- require 'protocol/spec09'
6
- require 'protocol/protocol09'
7
-
8
- require 'transport/buffer09'
9
- require 'transport/frame09'
10
-
11
- require 'qrack/client'
12
- require 'qrack/channel'
13
- require 'qrack/queue'
14
- require 'bunny/consumer'
15
- require 'qrack/errors'
16
-
17
- module Qrack
18
- include Protocol09
19
- include Transport09
20
- end
@@ -1,305 +0,0 @@
1
- # encoding: utf-8
2
-
3
- if [].map.respond_to? :with_index
4
- class Array #:nodoc:
5
- def enum_with_index
6
- each.with_index
7
- end
8
- end
9
- else
10
- require 'enumerator'
11
- end
12
-
13
- module Qrack
14
- module Transport09 #:nodoc: all
15
- class Buffer
16
-
17
- def initialize data = ''
18
- @data = data
19
- @pos = 0
20
- end
21
-
22
- attr_reader :pos
23
-
24
- def data
25
- @data.clone
26
- end
27
- alias :contents :data
28
- alias :to_s :data
29
-
30
- def << data
31
- @data << data.to_s
32
- self
33
- end
34
-
35
- def length
36
- @data.bytesize
37
- end
38
-
39
- def empty?
40
- pos == length
41
- end
42
-
43
- def rewind
44
- @pos = 0
45
- end
46
-
47
- def read_properties *types
48
- types.shift if types.first == :properties
49
-
50
- i = 0
51
- values = []
52
-
53
- while props = read(:short)
54
- (0..14).each do |n|
55
- # no more property types
56
- break unless types[i]
57
-
58
- # if flag is set
59
- if props & (1<<(15-n)) != 0
60
- if types[i] == :bit
61
- # bit values exist in flags only
62
- values << true
63
- else
64
- # save type name for later reading
65
- values << types[i]
66
- end
67
- else
68
- # property not set or is false bit
69
- values << (types[i] == :bit ? false : nil)
70
- end
71
-
72
- i+=1
73
- end
74
-
75
- # bit(0) == 0 means no more property flags
76
- break unless props & 1 == 1
77
- end
78
-
79
- values.map do |value|
80
- value.is_a?(Symbol) ? read(value) : value
81
- end
82
- end
83
-
84
- def read *types
85
- if types.first == :properties
86
- return read_properties(*types)
87
- end
88
-
89
- values = types.map do |type|
90
- case type
91
- when :octet
92
- _read(1, 'C')
93
- when :short
94
- _read(2, 'n')
95
- when :long
96
- _read(4, 'N')
97
- when :longlong
98
- upper, lower = _read(8, 'NN')
99
- upper << 32 | lower
100
- when :shortstr
101
- _read read(:octet)
102
- when :longstr
103
- _read read(:long)
104
- when :timestamp
105
- Time.at read(:longlong)
106
- when :table
107
- t = Hash.new
108
-
109
- table = Buffer.new(read(:longstr))
110
- until table.empty?
111
- key, type = table.read(:shortstr, :octet)
112
- key = key.intern
113
- t[key] ||= case type
114
- when 83 # 'S'
115
- table.read(:longstr)
116
- when 73 # 'I'
117
- table.read(:long)
118
- when 68 # 'D'
119
- exp = table.read(:octet)
120
- num = table.read(:long)
121
- num / 10.0**exp
122
- when 84 # 'T'
123
- table.read(:timestamp)
124
- when 70 # 'F'
125
- table.read(:table)
126
- when 65 # 'A'
127
- table.read(:array)
128
- when 108 # 'l'
129
- table.read(:longlong)
130
- when 116 # 't'
131
- table.read(:octet) == 1
132
- end
133
- end
134
-
135
- t
136
- when :bit
137
- if (@bits ||= []).empty?
138
- val = read(:octet)
139
- @bits = (0..7).map{|i| (val & (1 << i)) != 0 }
140
- end
141
-
142
- @bits.shift
143
- when :array
144
- a = Array.new
145
-
146
- array = Buffer.new(read(:longstr))
147
- until array.empty?
148
- type = array.read(:octet)
149
- a << case type
150
- when 70 # 'F'
151
- array.read(:table)
152
- end
153
- end
154
-
155
- a
156
- else
157
- raise Qrack::InvalidTypeError, "Cannot read data of type #{type}"
158
- end
159
- end
160
-
161
- types.size == 1 ? values.first : values
162
- end
163
-
164
- def write type, data
165
- case type
166
- when :octet
167
- _write(data, 'C')
168
- when :short
169
- _write(data, 'n')
170
- when :long
171
- _write(data, 'N')
172
- when :longlong
173
- lower = data & 0xffffffff
174
- upper = (data & ~0xffffffff) >> 32
175
- _write([upper, lower], 'NN')
176
- when :shortstr
177
- data = (data || '').to_s
178
- _write([data.bytesize, data], 'Ca*')
179
- when :longstr
180
- if data.is_a? Hash
181
- write(:table, data)
182
- else
183
- data = (data || '').to_s
184
- _write([data.bytesize, data], 'Na*')
185
- end
186
- when :timestamp
187
- write(:longlong, data.to_i)
188
- when :table
189
- data ||= {}
190
- write :longstr, (data.inject(Buffer.new) do |table, (key, value)|
191
- table.write(:shortstr, key.to_s)
192
-
193
- case value
194
- when String
195
- table.write(:octet, 83) # 'S'
196
- table.write(:longstr, value.to_s)
197
- when Fixnum
198
- table.write(:octet, 73) # 'I'
199
- table.write(:long, value)
200
- when Float
201
- table.write(:octet, 68) # 'D'
202
- # XXX there's gotta be a better way to do this..
203
- exp = value.to_s.split('.').last.bytesize
204
- num = value * 10**exp
205
- table.write(:octet, exp)
206
- table.write(:long, num)
207
- when Time
208
- table.write(:octet, 84) # 'T'
209
- table.write(:timestamp, value)
210
- when Hash
211
- table.write(:octet, 70) # 'F'
212
- table.write(:table, value)
213
- when TrueClass
214
- table.write(:octet, 116) # 't'
215
- table.write(:octet, 1)
216
- when FalseClass
217
- table.write(:octet, 116) # 't'
218
- table.write(:octet, 0)
219
- else
220
- raise Qrack::InvalidTypeError, "Cannot write table field for the type of #{value}"
221
- end
222
-
223
- table
224
- end)
225
- when :bit
226
- [*data].to_enum(:each_slice, 8).each{|bits|
227
- write(:octet, bits.enum_with_index.inject(0){ |byte, (bit, i)|
228
- byte |= (1 << i) if bit
229
- byte
230
- })
231
- }
232
- when :properties
233
- values = []
234
- data.enum_with_index.inject(0) do |short, ((type, value), i)|
235
- n = i % 15
236
- last = i+1 == data.size
237
-
238
- if (n == 0 and i != 0) or last
239
- if data.size > i+1
240
- short |= (1 << 0)
241
- elsif last and value
242
- values << [type,value]
243
- short |= 1<<(15-n)
244
- end
245
-
246
- write(:short, short)
247
- short = 0
248
- end
249
-
250
- if value and !last
251
- values << [type,value]
252
- short |= 1<<(15-n)
253
- end
254
-
255
- short
256
- end
257
-
258
- values.each do |type, value|
259
- write(type, value) unless type == :bit
260
- end
261
- else
262
- raise Qrack::InvalidTypeError, "Cannot write data of type #{type}"
263
- end
264
-
265
- self
266
- end
267
-
268
- def extract
269
- begin
270
- cur_data, cur_pos = @data.clone, @pos
271
- yield self
272
- rescue Qrack::BufferOverflowError
273
- @data, @pos = cur_data, cur_pos
274
- nil
275
- end
276
- end
277
-
278
- def _read(size, pack = nil)
279
- if @data.is_a?(Qrack::Client)
280
- raw = @data.read(size)
281
- return raw if raw.nil? or pack.nil?
282
- return raw.unpack(pack).first
283
- end
284
-
285
- if @pos + size > length
286
- raise Qrack::BufferOverflowError
287
- else
288
- data = @data[@pos,size]
289
- @data[@pos,size] = ''
290
- if pack
291
- data = data.unpack(pack)
292
- data = data.pop if data.size == 1
293
- end
294
- data
295
- end
296
- end
297
-
298
- def _write data, pack = nil
299
- data = [*data].pack(pack) if pack
300
- @data[@pos,0] = data
301
- @pos += data.bytesize
302
- end
303
- end
304
- end
305
- end
@@ -1,97 +0,0 @@
1
-
2
- # encoding: utf-8
3
-
4
-
5
- #:stopdoc:
6
- # this file was autogenerated on 2011-07-21 07:07:06 +0100
7
- #
8
- # DO NOT EDIT! (edit ext/qparser.rb and config.yml instead, and run 'ruby qparser.rb')
9
-
10
- module Qrack
11
- module Transport09
12
- class Frame
13
-
14
- FOOTER = 206
15
- ID = 0
16
-
17
- @types = {
18
- 1 => 'Method',
19
- 2 => 'Header',
20
- 3 => 'Body',
21
- 8 => 'Heartbeat',
22
- }
23
-
24
- attr_accessor :channel, :payload
25
-
26
- def initialize payload = nil, channel = 0
27
- @channel, @payload = channel, payload
28
- end
29
-
30
- def id
31
- self.class::ID
32
- end
33
-
34
- def to_binary
35
- buf = Transport09::Buffer.new
36
- buf.write :octet, id
37
- buf.write :short, channel
38
- buf.write :longstr, payload
39
- buf.write :octet, FOOTER
40
- buf.rewind
41
- buf
42
- end
43
-
44
- def to_s
45
- to_binary.to_s
46
- end
47
-
48
- def == frame
49
- [ :id, :channel, :payload ].inject(true) do |eql, field|
50
- eql and __send__(field) == frame.__send__(field)
51
- end
52
- end
53
-
54
- def self.parse buf
55
- buf = Transport09::Buffer.new(buf) unless buf.is_a? Transport09::Buffer
56
- buf.extract do
57
- id, channel, payload, footer = buf.read(:octet, :short, :longstr, :octet)
58
- Qrack::Transport09.const_get(@types[id]).new(payload, channel) if footer == FOOTER
59
- end
60
- end
61
-
62
- end
63
-
64
- class Method < Frame
65
-
66
- ID = 1
67
-
68
- def initialize payload = nil, channel = 0
69
- super
70
- unless @payload.is_a? Protocol09::Class::Method or @payload.nil?
71
- @payload = Protocol09.parse(@payload)
72
- end
73
- end
74
- end
75
-
76
- class Header < Frame
77
-
78
- ID = 2
79
-
80
- def initialize payload = nil, channel = 0
81
- super
82
- unless @payload.is_a? Protocol09::Header or @payload.nil?
83
- @payload = Protocol09::Header.new(@payload)
84
- end
85
- end
86
- end
87
-
88
- class Body < Frame
89
- ID = 3
90
- end
91
-
92
- class Heartbeat < Frame
93
- ID = 8
94
- end
95
-
96
- end
97
- end
@@ -1,75 +0,0 @@
1
- # encoding: utf-8
2
-
3
- # bunny_spec.rb
4
-
5
- # Assumes that target message broker/server has a user called 'guest' with a password 'guest'
6
- # and that it is running on 'localhost'.
7
-
8
- # If this is not the case, please change the 'Bunny.new' call below to include
9
- # the relevant arguments e.g. @b = Bunny.new(:user => 'john', :pass => 'doe', :host => 'foobar')
10
-
11
- require File.expand_path(File.join(File.dirname(__FILE__), %w[.. .. lib bunny]))
12
-
13
- describe Bunny do
14
-
15
- before(:each) do
16
- @b = Bunny.new
17
- @b.start
18
- end
19
-
20
- after(:each) do
21
- begin
22
- @b.stop
23
- rescue Exception
24
- ensure
25
- @b = nil
26
- end
27
- end
28
-
29
- it "should connect to an AMQP server" do
30
- @b.status.should == :connected
31
- end
32
-
33
- it "should be able to create and open a new channel" do
34
- c = @b.create_channel
35
- c.number.should == 2
36
- c.should be_an_instance_of(Bunny::Channel)
37
- @b.channels.size.should == 3
38
- c.open.should == :open_ok
39
- @b.channel.number.should == 2
40
- end
41
-
42
- it "should be able to switch between channels" do
43
- @b.channel.number.should == 1
44
- @b.switch_channel(0)
45
- @b.channel.number.should == 0
46
- end
47
-
48
- it "should raise an error if trying to switch to a non-existent channel" do
49
- lambda { @b.switch_channel(5)}.should raise_error(RuntimeError)
50
- end
51
-
52
- it "should be able to create an exchange" do
53
- exch = @b.exchange('test_exchange')
54
- exch.should be_an_instance_of(Bunny::Exchange)
55
- exch.name.should == 'test_exchange'
56
- @b.exchanges.has_key?('test_exchange').should be(true)
57
- end
58
-
59
- it "should be able to create a queue" do
60
- q = @b.queue('test1')
61
- q.should be_an_instance_of(Bunny::Queue)
62
- q.name.should == 'test1'
63
- @b.queues.has_key?('test1').should be(true)
64
- end
65
-
66
- it "should be able to set QoS" do
67
- @b.qos.should == :qos_ok
68
- end
69
-
70
- it "should be able to set QoS (with global:true)" do
71
- @b.qos(:global => true).should == :qos_ok
72
- end
73
-
74
- end
75
-