amq-protocol 1.0.1 → 1.1.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/ChangeLog.md CHANGED
@@ -1,8 +1,10 @@
1
- ## Changes between 1.0.0 and 1.0.1
1
+ ## Changes between 1.0.0 and 1.1.0
2
2
 
3
- ### Missing require
3
+ ### Performance Enhancements
4
4
 
5
- `amq-protocol` now makes sure `DateTime` is loaded before trying to use it.
5
+ Encoding of large payloads is now done more efficiently.
6
+
7
+ Contributed by Greg Brockman.
6
8
 
7
9
 
8
10
  ## Changes between 1.0.0.pre6 and 1.0.0.pre7
@@ -2,7 +2,6 @@
2
2
 
3
3
  module AMQ
4
4
  module Protocol
5
- SIMPLE_BYTE_PACK = 'c*'
6
5
  class Frame
7
6
  TYPES = {:method => 1, :headers => 2, :body => 3, :heartbeat => 8}.freeze
8
7
  TYPES_REVERSE = TYPES.invert.freeze
@@ -10,11 +9,27 @@ module AMQ
10
9
  CHANNEL_RANGE = (0..65535).freeze
11
10
  FINAL_OCTET = "\xCE".freeze # 206
12
11
 
12
+ def self.encoded_payload(payload)
13
+ if payload.respond_to?(:force_encoding) && payload.encoding.name != 'BINARY'
14
+ # Only copy if we have to.
15
+ payload = payload.dup.force_encoding('BINARY')
16
+ end
17
+ payload
18
+ end
19
+
13
20
  # The channel number is 0 for all frames which are global to the connection and 1-65535 for frames that refer to specific channels.
14
- def self.encode(type, payload, channel)
21
+ def self.encode_to_array(type, payload, channel)
15
22
  raise RuntimeError.new("Channel has to be 0 or an integer in range 1..65535 but was #{channel.inspect}") unless CHANNEL_RANGE.include?(channel)
16
23
  raise RuntimeError.new("Payload can't be nil") if payload.nil?
17
- [find_type(type), channel, payload.bytesize].pack(PACK_CHAR_UINT16_UINT32) + payload.bytes.to_a.pack(SIMPLE_BYTE_PACK) + FINAL_OCTET
24
+ components = []
25
+ components << [find_type(type), channel, payload.bytesize].pack(PACK_CHAR_UINT16_UINT32)
26
+ components << encoded_payload(payload)
27
+ components << FINAL_OCTET
28
+ components
29
+ end
30
+
31
+ def self.encode(type, payload, channel)
32
+ encode_to_array(type, payload, channel).join
18
33
  end
19
34
 
20
35
  class << self
@@ -80,8 +95,16 @@ This functionality is part of the https://github.com/ruby-amqp/amq-client librar
80
95
  @payload.bytesize
81
96
  end
82
97
 
98
+ def encode_to_array
99
+ components = []
100
+ components << [self.class.id, @channel, self.size].pack(PACK_CHAR_UINT16_UINT32)
101
+ components << self.class.encoded_payload(@payload)
102
+ components << FINAL_OCTET
103
+ components
104
+ end
105
+
83
106
  def encode
84
- [self.class.id, @channel, self.size].pack(PACK_CHAR_UINT16_UINT32) + @payload.bytes.to_a.pack(SIMPLE_BYTE_PACK) + FINAL_OCTET
107
+ encode_to_array.join
85
108
  end
86
109
  end
87
110
 
@@ -1,5 +1,5 @@
1
1
  module AMQ
2
2
  module Protocol
3
- VERSION = "1.0.1"
3
+ VERSION = "1.1.0"
4
4
  end # Protocol
5
5
  end # AMQ
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: amq-protocol
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2012-12-06 00:00:00.000000000 Z
15
+ date: 2013-01-21 00:00:00.000000000 Z
16
16
  dependencies: []
17
17
  description: ! " amq-protocol is an AMQP 0.9.1 serialization library for Ruby. It\
18
18
  \ is not an\n AMQP client: amq-protocol only handles serialization and deserialization.\n\
@@ -103,3 +103,4 @@ signing_key:
103
103
  specification_version: 3
104
104
  summary: AMQP 0.9.1 encoder & decoder.
105
105
  test_files: []
106
+ has_rdoc: