amq-protocol 1.1.0 → 1.2.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.
data/.gitignore CHANGED
@@ -9,4 +9,5 @@ Gemfile.lock
9
9
  .rbx/*
10
10
  .Apple*
11
11
  .bundle/*
12
- bin/*
12
+ bin/*
13
+ *.bundle
@@ -188,9 +188,17 @@ module AMQ
188
188
  def self.encode_body(body, channel, frame_size)
189
189
  return [] if body.empty?
190
190
 
191
- # See https://dev.rabbitmq.com/wiki/Amqp091Errata#section_11
191
+ # 8 = 1 + 2 + 4 + 1
192
+ # 1 byte of frame type
193
+ # 2 bytes of channel number
194
+ # 4 bytes of frame payload length
195
+ # 1 byte of payload trailer FRAME_END byte
192
196
  limit = frame_size - 8
193
197
 
198
+ # Otherwise String#slice on 1.9 will operate with code points,
199
+ # and we need bytes. MK.
200
+ body.force_encoding("ASCII-8BIT") if RUBY_VERSION.to_f >= 1.9
201
+
194
202
  array = Array.new
195
203
  while body
196
204
  payload, body = body[0, limit], body[limit, body.length - limit]
@@ -31,6 +31,9 @@ module AMQ
31
31
  PACK_32BIT_FLOAT = 'f'.freeze
32
32
  PACK_64BIT_FLOAT = 'd'.freeze
33
33
 
34
+ PACK_SIGNED_8BIT = 'c'.freeze
35
+ PACK_SIGNED_16BIT = 's'.freeze
36
+
34
37
 
35
38
 
36
39
  # @return [Array] Collection of subclasses of AMQ::Protocol::Class.
@@ -251,13 +254,20 @@ module AMQ
251
254
  def self.encode_body(body, channel, frame_size)
252
255
  return [] if body.empty?
253
256
 
254
- # See https://dev.rabbitmq.com/wiki/Amqp091Errata#section_11
257
+ # 8 = 1 + 2 + 4 + 1
258
+ # 1 byte of frame type
259
+ # 2 bytes of channel number
260
+ # 4 bytes of frame payload length
261
+ # 1 byte of payload trailer FRAME_END byte
255
262
  limit = frame_size - 8
256
263
 
264
+ # Otherwise String#slice on 1.9 will operate with code points,
265
+ # and we need bytes. MK.
266
+ body.force_encoding("ASCII-8BIT") if RUBY_VERSION.to_f >= 1.9
267
+
257
268
  array = Array.new
258
269
  while body
259
270
  payload, body = body[0, limit], body[limit, body.length - limit]
260
- # array << [0x03, payload]
261
271
  array << BodyFrame.new(payload, channel)
262
272
  end
263
273
 
@@ -1785,7 +1795,9 @@ module AMQ
1785
1795
  end
1786
1796
  properties_payload = Basic.encode_properties(payload.bytesize, properties)
1787
1797
  frames << HeaderFrame.new(properties_payload, channel)
1788
- frames + self.encode_body(payload, channel, frame_size)
1798
+ frames += self.encode_body(payload, channel, frame_size)
1799
+
1800
+ frames
1789
1801
  end
1790
1802
 
1791
1803
  end
@@ -85,9 +85,11 @@ module AMQ
85
85
  v, offset = TableValueDecoder.decode_boolean(data, offset)
86
86
  v
87
87
  when TYPE_SIGNED_8BIT then
88
- raise NotImplementedError.new
88
+ v, offset = TableValueDecoder.decode_short_short(data, offset)
89
+ v
89
90
  when TYPE_SIGNED_16BIT then
90
- raise NotImplementedError.new
91
+ v, offset = TableValueDecoder.decode_short(data, offset)
92
+ v
91
93
  when TYPE_SIGNED_64BIT then
92
94
  v, offset = TableValueDecoder.decode_long(data, offset)
93
95
  v
@@ -21,7 +21,7 @@ module AMQ
21
21
  #
22
22
 
23
23
  BIG_ENDIAN = ([1].pack("s") == "\x00\x01")
24
- Q = "Q".freeze
24
+ Q = "q".freeze
25
25
 
26
26
 
27
27
  def self.decode_array(data, initial_offset)
@@ -53,11 +53,11 @@ module AMQ
53
53
  v, offset = decode_boolean(data, offset)
54
54
  v
55
55
  when TYPE_SIGNED_8BIT then
56
- # TODO
57
- raise NotImplementedError.new
56
+ v, offset = decode_short_short(data, offset)
57
+ v
58
58
  when TYPE_SIGNED_16BIT then
59
- # TODO
60
- raise NotImplementedError.new
59
+ v, offset = decode_short(data, offset)
60
+ v
61
61
  when TYPE_SIGNED_64BIT then
62
62
  v, offset = decode_long(data, offset)
63
63
  v
@@ -174,6 +174,19 @@ module AMQ
174
174
 
175
175
  [v, offset]
176
176
  end # self.decode_hash(data, offset)
177
+
178
+
179
+ def self.decode_short_short(data, offset)
180
+ v = data.slice(offset, 1).unpack(PACK_SIGNED_8BIT).first
181
+ offset += 1
182
+ [v, offset]
183
+ end
184
+
185
+ def self.decode_short(data, offset)
186
+ v = data.slice(offset, 2).unpack(PACK_SIGNED_16BIT).first
187
+ offset += 2
188
+ [v, offset]
189
+ end
177
190
  end # TableValueDecoder
178
191
  end # Protocol
179
192
  end # AMQ
@@ -9,7 +9,7 @@ module AMQ
9
9
  TYPE_TIME = 'T'.freeze
10
10
  TYPE_DECIMAL = 'D'.freeze
11
11
  TYPE_BOOLEAN = 't'.freeze
12
- TYPE_SIGNED_8BIT = 'b'.freeze
12
+ TYPE_SIGNED_8BIT = 'c'.freeze
13
13
  TYPE_SIGNED_16BIT = 's'.freeze
14
14
  TYPE_SIGNED_64BIT = 'l'.freeze
15
15
  TYPE_32BIT_FLOAT = 'f'.freeze
@@ -1,5 +1,5 @@
1
1
  module AMQ
2
2
  module Protocol
3
- VERSION = "1.1.0"
3
+ VERSION = "1.2.0"
4
4
  end # Protocol
5
5
  end # AMQ
@@ -171,8 +171,15 @@ module AMQ
171
171
  Table.decode(Table.encode(input)).should == input
172
172
  end
173
173
 
174
+ it 'is capable of decoding 8bit signed integers' do
175
+ output = TableValueDecoder.decode_short_short("\xC0",0).first
176
+ output.should == -64
177
+ end
174
178
 
175
-
179
+ it 'is capable of decoding 16bit signed integers' do
180
+ output = TableValueDecoder.decode_short("\b\xC0",0).first
181
+ output.should == -16376
182
+ end
176
183
 
177
184
  it "is capable of decoding tables" do
178
185
  input = {
metadata CHANGED
@@ -1,106 +1,107 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: amq-protocol
3
- version: !ruby/object:Gem::Version
4
- version: 1.1.0
5
- prerelease:
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 1.2.0
6
6
  platform: ruby
7
- authors:
8
- - Jakub Stastny
9
- - Michael S. Klishin
10
- - Theo Hultberg
11
- - Mark Abramov
12
- autorequire:
7
+ authors:
8
+ - Jakub Stastny
9
+ - Michael S. Klishin
10
+ - Theo Hultberg
11
+ - Mark Abramov
12
+ autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2013-01-21 00:00:00.000000000 Z
15
+
16
+ date: 2013-02-12 00:00:00 Z
16
17
  dependencies: []
17
- description: ! " amq-protocol is an AMQP 0.9.1 serialization library for Ruby. It\
18
- \ is not an\n AMQP client: amq-protocol only handles serialization and deserialization.\n\
19
- \ If you want to write your own AMQP client, this gem can help you with that.\n"
20
- email:
21
- - !binary |-
22
- bWljaGFlbEBub3ZlbWJlcmFpbi5jb20=
23
- - !binary |-
24
- c3Rhc3RueUAxMDFpZGVhcy5jeg==
18
+
19
+ description: " amq-protocol is an AMQP 0.9.1 serialization library for Ruby. It is not an\n AMQP client: amq-protocol only handles serialization and deserialization.\n If you want to write your own AMQP client, this gem can help you with that.\n"
20
+ email:
21
+ - michael@novemberain.com
22
+ - stastny@101ideas.cz
25
23
  executables: []
24
+
26
25
  extensions: []
27
- extra_rdoc_files:
28
- - README.md
29
- files:
30
- - .gitignore
31
- - .gitmodules
32
- - .rspec
33
- - .travis.yml
34
- - ChangeLog.md
35
- - Gemfile
36
- - LICENSE
37
- - PROFILING.md
38
- - README.md
39
- - amq-protocol.gemspec
40
- - codegen/__init__.py
41
- - codegen/amqp_0.9.1_changes.json
42
- - codegen/codegen.py
43
- - codegen/codegen_helpers.py
44
- - codegen/protocol.rb.pytemplate
45
- - generate.rb
46
- - lib/amq/bit_set.rb
47
- - lib/amq/hacks.rb
48
- - lib/amq/int_allocator.rb
49
- - lib/amq/protocol.rb
50
- - lib/amq/protocol/client.rb
51
- - lib/amq/protocol/frame.rb
52
- - lib/amq/protocol/table.rb
53
- - lib/amq/protocol/table_value_decoder.rb
54
- - lib/amq/protocol/table_value_encoder.rb
55
- - lib/amq/protocol/type_constants.rb
56
- - lib/amq/protocol/version.rb
57
- - lib/amq/settings.rb
58
- - spec/amq/bit_set_spec.rb
59
- - spec/amq/hacks_spec.rb
60
- - spec/amq/int_allocator_spec.rb
61
- - spec/amq/protocol/basic_spec.rb
62
- - spec/amq/protocol/blank_body_encoding_spec.rb
63
- - spec/amq/protocol/channel_spec.rb
64
- - spec/amq/protocol/confirm_spec.rb
65
- - spec/amq/protocol/connection_spec.rb
66
- - spec/amq/protocol/constants_spec.rb
67
- - spec/amq/protocol/exchange_spec.rb
68
- - spec/amq/protocol/frame_spec.rb
69
- - spec/amq/protocol/method_spec.rb
70
- - spec/amq/protocol/queue_spec.rb
71
- - spec/amq/protocol/table_spec.rb
72
- - spec/amq/protocol/tx_spec.rb
73
- - spec/amq/protocol/value_decoder_spec.rb
74
- - spec/amq/protocol/value_encoder_spec.rb
75
- - spec/amq/protocol_spec.rb
76
- - spec/amq/settings_spec.rb
77
- - spec/spec_helper.rb
26
+
27
+ extra_rdoc_files:
28
+ - README.md
29
+ files:
30
+ - .gitignore
31
+ - .gitmodules
32
+ - .rspec
33
+ - .travis.yml
34
+ - ChangeLog.md
35
+ - Gemfile
36
+ - LICENSE
37
+ - PROFILING.md
38
+ - README.md
39
+ - amq-protocol.gemspec
40
+ - codegen/__init__.py
41
+ - codegen/amqp_0.9.1_changes.json
42
+ - codegen/codegen.py
43
+ - codegen/codegen_helpers.py
44
+ - codegen/protocol.rb.pytemplate
45
+ - generate.rb
46
+ - lib/amq/bit_set.rb
47
+ - lib/amq/hacks.rb
48
+ - lib/amq/int_allocator.rb
49
+ - lib/amq/protocol.rb
50
+ - lib/amq/protocol/client.rb
51
+ - lib/amq/protocol/frame.rb
52
+ - lib/amq/protocol/table.rb
53
+ - lib/amq/protocol/table_value_decoder.rb
54
+ - lib/amq/protocol/table_value_encoder.rb
55
+ - lib/amq/protocol/type_constants.rb
56
+ - lib/amq/protocol/version.rb
57
+ - lib/amq/settings.rb
58
+ - spec/amq/bit_set_spec.rb
59
+ - spec/amq/hacks_spec.rb
60
+ - spec/amq/int_allocator_spec.rb
61
+ - spec/amq/protocol/basic_spec.rb
62
+ - spec/amq/protocol/blank_body_encoding_spec.rb
63
+ - spec/amq/protocol/channel_spec.rb
64
+ - spec/amq/protocol/confirm_spec.rb
65
+ - spec/amq/protocol/connection_spec.rb
66
+ - spec/amq/protocol/constants_spec.rb
67
+ - spec/amq/protocol/exchange_spec.rb
68
+ - spec/amq/protocol/frame_spec.rb
69
+ - spec/amq/protocol/method_spec.rb
70
+ - spec/amq/protocol/queue_spec.rb
71
+ - spec/amq/protocol/table_spec.rb
72
+ - spec/amq/protocol/tx_spec.rb
73
+ - spec/amq/protocol/value_decoder_spec.rb
74
+ - spec/amq/protocol/value_encoder_spec.rb
75
+ - spec/amq/protocol_spec.rb
76
+ - spec/amq/settings_spec.rb
77
+ - spec/spec_helper.rb
78
78
  homepage: http://github.com/ruby-amqp/amq-protocol
79
- licenses:
80
- - MIT
81
- post_install_message:
79
+ licenses:
80
+ - MIT
81
+ post_install_message:
82
82
  rdoc_options: []
83
- require_paths:
84
- - lib
85
- required_ruby_version: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ! '>='
88
- - !ruby/object:Gem::Version
89
- version: !binary |-
90
- MA==
83
+
84
+ require_paths:
85
+ - lib
86
+ required_ruby_version: !ruby/object:Gem::Requirement
91
87
  none: false
92
- required_rubygems_version: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ! '>='
95
- - !ruby/object:Gem::Version
96
- version: !binary |-
97
- MA==
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ version: "0"
92
+ required_rubygems_version: !ruby/object:Gem::Requirement
98
93
  none: false
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: "0"
99
98
  requirements: []
99
+
100
100
  rubyforge_project: amq-protocol
101
101
  rubygems_version: 1.8.24
102
- signing_key:
102
+ signing_key:
103
103
  specification_version: 3
104
104
  summary: AMQP 0.9.1 encoder & decoder.
105
105
  test_files: []
106
- has_rdoc:
106
+
107
+ has_rdoc: