bones-rpc-adapter-msgpack 0.0.1 → 0.0.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a1df5582bead38cbe911c2b8690a6f4d9eab4ff7
4
- data.tar.gz: d5afec1dabce19378c0ba82befbc79e1ad7b1ada
3
+ metadata.gz: c1a820a5d6ab6ad54a540a935c9e3aa952f184ec
4
+ data.tar.gz: 2c177cbe7c16a83b33b86fe5581529d06c26e4c7
5
5
  SHA512:
6
- metadata.gz: 7c0ac5acfe09d95783e17261db3252d32262c4ddea24c6e6af65a84ae89ad7715ba7fc3ad555c7976c3b68c34165e6c7b591d64c5a52195c753169bbfdd740cd
7
- data.tar.gz: ec3274d024fdf22b5934d5f4ac5385d8e25e1a924f073de73cadaa749621cc04533f10521b85a39194c38c04c935c41b01969664877604871ea887524e7a1c46
6
+ metadata.gz: 7b7cf534927b6abdd024020db390532d1389866b246c3ef053ce4593d07c7e79c9b23a1e80df030515f994070abeaacedcf218971a9d6090c577e18f51efec42
7
+ data.tar.gz: 9b3a85d3401427150f6e3136c043da9b215b93201a034d1376462135eb14077e0032be0ae98eb6bb00951e607568d22b7afb9a2158bea82ff982ef44191a2e8b
@@ -1,11 +1,6 @@
1
1
  # encoding: utf-8
2
2
  require 'bones/rpc/adapter'
3
-
4
- if !!(RUBY_PLATFORM =~ /java/)
5
- require 'msgpack-jruby'
6
- else
7
- require 'msgpack'
8
- end
3
+ require 'msgpack'
9
4
 
10
5
  module Bones
11
6
  module RPC
@@ -32,23 +27,39 @@ module Bones
32
27
  end
33
28
 
34
29
  def unpacker(data)
35
- ::MessagePack::Unpacker.new(StringIO.new(data))
30
+ Unpacker.new(StringIO.new(data))
36
31
  end
37
32
 
38
33
  def parser(data)
39
34
  Adapter::Parser.new(self, data)
40
35
  end
41
36
 
42
- def unpacker_pos(parser)
43
- size = parser.unpacker.buffer.size
44
- pos = parser.unpacker.buffer.io.pos
45
- (pos > size) ? (pos - size) : 0
46
- end
37
+ if !!(RUBY_PLATFORM =~ /java/)
38
+ require 'bones/rpc/adapter/msgpack/ruby'
39
+ Unpacker = Bones::RPC::Adapter::Msgpack::Ruby::Decoder
40
+
41
+ def unpacker_pos(parser)
42
+ parser.unpacker.buffer.pos
43
+ end
44
+
45
+ def unpacker_seek(parser, n)
46
+ parser.unpacker.buffer.seek(n)
47
+ return n
48
+ end
49
+ else
50
+ Unpacker = ::MessagePack::Unpacker
51
+
52
+ def unpacker_pos(parser)
53
+ size = parser.unpacker.buffer.size
54
+ pos = parser.unpacker.buffer.io.pos
55
+ (pos > size) ? (pos - size) : 0
56
+ end
47
57
 
48
- def unpacker_seek(parser, n)
49
- pos = unpacker_pos(parser)
50
- parser.unpacker.buffer.skip(n - pos) if pos < n
51
- return pos
58
+ def unpacker_seek(parser, n)
59
+ pos = unpacker_pos(parser)
60
+ parser.unpacker.buffer.skip(n - pos) if pos < n
61
+ return pos
62
+ end
52
63
  end
53
64
 
54
65
  Adapter.register self
@@ -0,0 +1,128 @@
1
+ # encoding: utf-8
2
+
3
+ module Bones
4
+ module RPC
5
+ module Adapter
6
+ module Msgpack
7
+ module Ruby
8
+ def self.unpack(bytes)
9
+ Decoder.new(bytes).next
10
+ end
11
+
12
+ class Decoder
13
+ attr_reader :buffer
14
+
15
+ def initialize(buffer)
16
+ @buffer = ::Bones::RPC::Parser::Buffer.new(buffer)
17
+ end
18
+
19
+ def next
20
+ buffer.transaction do
21
+ consume_next
22
+ end
23
+ rescue TypeError
24
+ raise EOFError
25
+ end
26
+ alias :read :next
27
+
28
+ private
29
+
30
+ DECODINGS = []
31
+ DECODINGS[0xc0] = lambda { |d| nil }
32
+ DECODINGS[0xc2] = lambda { |d| false }
33
+ DECODINGS[0xc3] = lambda { |d| true }
34
+ DECODINGS[0xc4] = lambda { |d| d.consume_string(d.consume_byte, Encoding::BINARY) }
35
+ DECODINGS[0xc5] = lambda { |d| d.consume_string(d.consume_int16, Encoding::BINARY) }
36
+ DECODINGS[0xc6] = lambda { |d| d.consume_string(d.consume_int32, Encoding::BINARY) }
37
+ DECODINGS[0xca] = lambda { |d| d.consume_float }
38
+ DECODINGS[0xcb] = lambda { |d| d.consume_double }
39
+ DECODINGS[0xcc] = lambda { |d| d.consume_byte }
40
+ DECODINGS[0xcd] = lambda { |d| d.consume_int16 }
41
+ DECODINGS[0xce] = lambda { |d| d.consume_int32 }
42
+ DECODINGS[0xcf] = lambda { |d| d.consume_int64 }
43
+ DECODINGS[0xd0] = lambda { |d| d.consume_byte - 0x100 }
44
+ DECODINGS[0xd1] = lambda { |d| d.consume_int16 - 0x10000 }
45
+ DECODINGS[0xd2] = lambda { |d| d.consume_int32 - 0x100000000 }
46
+ DECODINGS[0xd3] = lambda { |d| d.consume_int64 - 0x10000000000000000 }
47
+ DECODINGS[0xd9] = lambda { |d| d.consume_string(d.consume_byte) }
48
+ DECODINGS[0xda] = lambda { |d| d.consume_string(d.consume_int16) }
49
+ DECODINGS[0xdb] = lambda { |d| d.consume_string(d.consume_int32) }
50
+ DECODINGS[0xdc] = lambda { |d| d.consume_array(d.consume_int16) }
51
+ DECODINGS[0xdd] = lambda { |d| d.consume_array(d.consume_int32) }
52
+ DECODINGS[0xde] = lambda { |d| Hash[*d.consume_array(d.consume_int16 * 2)] }
53
+ DECODINGS[0xdf] = lambda { |d| Hash[*d.consume_array(d.consume_int32 * 2)] }
54
+
55
+ FLOAT_FMT = 'g'.freeze
56
+ DOUBLE_FMT = 'G'.freeze
57
+
58
+ public
59
+
60
+ def consume_byte
61
+ buffer.getbyte
62
+ end
63
+
64
+ def consume_int16
65
+ (consume_byte << 8) | consume_byte
66
+ end
67
+
68
+ def consume_int32
69
+ (consume_byte << 24) | (consume_byte << 16) | (consume_byte << 8) | consume_byte
70
+ end
71
+
72
+ def consume_int64
73
+ n = (consume_byte << 56)
74
+ n |= (consume_byte << 48)
75
+ n |= (consume_byte << 40)
76
+ n |= (consume_byte << 32)
77
+ n |= (consume_byte << 24)
78
+ n |= (consume_byte << 16)
79
+ n |= (consume_byte << 8)
80
+ n |= consume_byte
81
+ n
82
+ end
83
+
84
+ def consume_float
85
+ f, = buffer.read(4).unpack(FLOAT_FMT)
86
+ f
87
+ end
88
+
89
+ def consume_double
90
+ d, = buffer.read(8).unpack(DOUBLE_FMT)
91
+ d
92
+ end
93
+
94
+ def consume_string(size, encoding=Encoding::UTF_8)
95
+ s = buffer.read(size)
96
+ s.force_encoding(encoding)
97
+ s
98
+ end
99
+
100
+ def consume_array(size)
101
+ Array.new(size) { consume_next }
102
+ end
103
+
104
+ def consume_next
105
+ b = consume_byte
106
+ if (method = DECODINGS[b])
107
+ method.call(self)
108
+ elsif b <= 0b01111111
109
+ b
110
+ elsif b & 0b11100000 == 0b11100000
111
+ b - 0x100
112
+ elsif b & 0b11100000 == 0b10100000
113
+ size = b & 0b00011111
114
+ consume_string(size)
115
+ elsif b & 0b11110000 == 0b10010000
116
+ size = b & 0b00001111
117
+ consume_array(size)
118
+ elsif b & 0b11110000 == 0b10000000
119
+ size = b & 0b00001111
120
+ Hash[*consume_array(size * 2)]
121
+ end
122
+ end
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end
128
+ end
@@ -3,7 +3,7 @@ module Bones
3
3
  module RPC
4
4
  module Adapter
5
5
  module Msgpack
6
- VERSION = "0.0.1"
6
+ VERSION = "0.0.2"
7
7
  end
8
8
  end
9
9
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bones-rpc-adapter-msgpack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Bennett
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-08 00:00:00.000000000 Z
11
+ date: 2013-10-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bones-rpc
@@ -83,6 +83,7 @@ files:
83
83
  - bones-rpc-adapter-msgpack.gemspec
84
84
  - lib/bones-rpc-adapter-msgpack.rb
85
85
  - lib/bones/rpc/adapter/msgpack.rb
86
+ - lib/bones/rpc/adapter/msgpack/ruby.rb
86
87
  - lib/bones/rpc/adapter/msgpack/version.rb
87
88
  homepage: ''
88
89
  licenses: