msgpack 1.4.2 → 1.7.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (95) hide show
  1. checksums.yaml +4 -4
  2. data/ChangeLog +89 -0
  3. data/README.md +73 -13
  4. data/ext/java/org/msgpack/jruby/Buffer.java +26 -19
  5. data/ext/java/org/msgpack/jruby/Decoder.java +29 -21
  6. data/ext/java/org/msgpack/jruby/Encoder.java +68 -30
  7. data/ext/java/org/msgpack/jruby/ExtensionRegistry.java +43 -64
  8. data/ext/java/org/msgpack/jruby/ExtensionValue.java +6 -9
  9. data/ext/java/org/msgpack/jruby/Factory.java +43 -42
  10. data/ext/java/org/msgpack/jruby/Packer.java +37 -40
  11. data/ext/java/org/msgpack/jruby/Unpacker.java +80 -73
  12. data/ext/msgpack/buffer.c +54 -74
  13. data/ext/msgpack/buffer.h +21 -18
  14. data/ext/msgpack/buffer_class.c +161 -52
  15. data/ext/msgpack/buffer_class.h +1 -0
  16. data/ext/msgpack/compat.h +0 -99
  17. data/ext/msgpack/extconf.rb +25 -46
  18. data/ext/msgpack/factory_class.c +143 -87
  19. data/ext/msgpack/packer.c +66 -43
  20. data/ext/msgpack/packer.h +25 -20
  21. data/ext/msgpack/packer_class.c +102 -130
  22. data/ext/msgpack/packer_class.h +11 -0
  23. data/ext/msgpack/packer_ext_registry.c +35 -40
  24. data/ext/msgpack/packer_ext_registry.h +41 -38
  25. data/ext/msgpack/rbinit.c +1 -1
  26. data/ext/msgpack/rmem.c +3 -4
  27. data/ext/msgpack/sysdep.h +5 -2
  28. data/ext/msgpack/unpacker.c +136 -111
  29. data/ext/msgpack/unpacker.h +16 -13
  30. data/ext/msgpack/unpacker_class.c +86 -126
  31. data/ext/msgpack/unpacker_class.h +11 -0
  32. data/ext/msgpack/unpacker_ext_registry.c +40 -28
  33. data/ext/msgpack/unpacker_ext_registry.h +21 -18
  34. data/lib/msgpack/bigint.rb +69 -0
  35. data/lib/msgpack/buffer.rb +9 -0
  36. data/lib/msgpack/factory.rb +140 -10
  37. data/lib/msgpack/packer.rb +10 -1
  38. data/lib/msgpack/symbol.rb +21 -4
  39. data/lib/msgpack/time.rb +1 -1
  40. data/lib/msgpack/unpacker.rb +14 -1
  41. data/lib/msgpack/version.rb +1 -1
  42. data/lib/msgpack.rb +6 -7
  43. data/msgpack.gemspec +8 -5
  44. metadata +37 -82
  45. data/.gitignore +0 -23
  46. data/.rubocop.yml +0 -36
  47. data/.travis.yml +0 -39
  48. data/Gemfile +0 -9
  49. data/Rakefile +0 -71
  50. data/appveyor.yml +0 -18
  51. data/bench/pack.rb +0 -23
  52. data/bench/pack_log.rb +0 -33
  53. data/bench/pack_log_long.rb +0 -65
  54. data/bench/pack_symbols.rb +0 -28
  55. data/bench/run.sh +0 -14
  56. data/bench/run_long.sh +0 -35
  57. data/bench/run_symbols.sh +0 -26
  58. data/bench/unpack.rb +0 -21
  59. data/bench/unpack_log.rb +0 -34
  60. data/bench/unpack_log_long.rb +0 -67
  61. data/doclib/msgpack/buffer.rb +0 -193
  62. data/doclib/msgpack/core_ext.rb +0 -101
  63. data/doclib/msgpack/error.rb +0 -19
  64. data/doclib/msgpack/extension_value.rb +0 -9
  65. data/doclib/msgpack/factory.rb +0 -101
  66. data/doclib/msgpack/packer.rb +0 -208
  67. data/doclib/msgpack/time.rb +0 -22
  68. data/doclib/msgpack/timestamp.rb +0 -44
  69. data/doclib/msgpack/unpacker.rb +0 -183
  70. data/doclib/msgpack.rb +0 -87
  71. data/msgpack.org.md +0 -46
  72. data/spec/cases.json +0 -1
  73. data/spec/cases.msg +0 -0
  74. data/spec/cases_compact.msg +0 -0
  75. data/spec/cases_spec.rb +0 -39
  76. data/spec/cruby/buffer_io_spec.rb +0 -255
  77. data/spec/cruby/buffer_packer.rb +0 -29
  78. data/spec/cruby/buffer_spec.rb +0 -575
  79. data/spec/cruby/buffer_unpacker.rb +0 -19
  80. data/spec/cruby/unpacker_spec.rb +0 -70
  81. data/spec/ext_value_spec.rb +0 -99
  82. data/spec/exttypes.rb +0 -51
  83. data/spec/factory_spec.rb +0 -367
  84. data/spec/format_spec.rb +0 -301
  85. data/spec/jruby/benchmarks/shootout_bm.rb +0 -73
  86. data/spec/jruby/benchmarks/symbolize_keys_bm.rb +0 -25
  87. data/spec/jruby/unpacker_spec.rb +0 -186
  88. data/spec/msgpack_spec.rb +0 -214
  89. data/spec/pack_spec.rb +0 -61
  90. data/spec/packer_spec.rb +0 -557
  91. data/spec/random_compat.rb +0 -24
  92. data/spec/spec_helper.rb +0 -55
  93. data/spec/timestamp_spec.rb +0 -121
  94. data/spec/unpack_spec.rb +0 -57
  95. data/spec/unpacker_spec.rb +0 -819
data/spec/msgpack_spec.rb DELETED
@@ -1,214 +0,0 @@
1
- # encoding: ascii-8bit
2
-
3
- require 'spec_helper'
4
-
5
- def utf8enc(str)
6
- str.encode('UTF-8')
7
- end
8
-
9
- def asciienc(str)
10
- str.encode('ASCII-8BIT')
11
- end
12
-
13
- describe MessagePack do
14
- tests = {
15
- 'constant values' => [
16
- ['true', true, "\xC3"],
17
- ['false', false, "\xC2"],
18
- ['nil', nil, "\xC0"]
19
- ],
20
- 'numbers' => [
21
- ['zero', 0, "\x00"],
22
- ['127', 127, "\x7F"],
23
- ['128', 128, "\xCC\x80"],
24
- ['256', 256, "\xCD\x01\x00"],
25
- ['-1', -1, "\xFF"],
26
- ['-33', -33, "\xD0\xDF"],
27
- ['-129', -129, "\xD1\xFF\x7F"],
28
- ['small integers', 42, "*"],
29
- ['medium integers', 333, "\xCD\x01M"],
30
- ['large integers', 2**31 - 1, "\xCE\x7F\xFF\xFF\xFF"],
31
- ['huge integers', 2**64 - 1, "\xCF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"],
32
- ['negative integers', -1, "\xFF"],
33
- ['1.0', 1.0, "\xcb\x3f\xf0\x00\x00\x00\x00\x00\x00"],
34
- ['small floats', 3.14, "\xCB@\t\x1E\xB8Q\xEB\x85\x1F"],
35
- ['big floats', Math::PI * 1_000_000_000_000_000_000, "\xCBC\xC5\xCC\x96\xEF\xD1\x19%"],
36
- ['negative floats', -2.1, "\xCB\xC0\x00\xCC\xCC\xCC\xCC\xCC\xCD"]
37
- ],
38
- 'strings' => [
39
- ['tiny strings', utf8enc('hello world'), "\xABhello world"],
40
- ['short strings', utf8enc('hello' * 5), "\xB9hellohellohellohellohello"],
41
- ['empty strings', utf8enc(''), "\xA0"]
42
- ],
43
- 'binary strings' => [
44
- ['tiny strings', asciienc('hello world'), "\xC4\vhello world"],
45
- ['short strings', asciienc('hello' * 5), "\xC4\x19hellohellohellohellohello"],
46
- ['empty strings', asciienc(''), "\xC4\x00"]
47
- ],
48
- 'arrays' => [
49
- ['empty arrays', [], "\x90"],
50
- ['arrays with strings', [utf8enc("hello"), utf8enc("world")], "\x92\xA5hello\xA5world"],
51
- ['arrays with mixed values', [utf8enc("hello"), utf8enc("world"), 42], "\x93\xA5hello\xA5world*"],
52
- ['arrays of arrays', [[[[1, 2], 3], 4]], "\x91\x92\x92\x92\x01\x02\x03\x04"],
53
- ['empty arrays', [], "\x90"]
54
- ],
55
- 'hashes' => [
56
- ['empty hashes', {}, "\x80"],
57
- ['hashes', {utf8enc('foo') => utf8enc('bar')}, "\x81\xA3foo\xA3bar"],
58
- ['hashes with mixed keys and values', {utf8enc('foo') => utf8enc('bar'), 3 => utf8enc('three'), utf8enc('four') => 4, utf8enc('x') => [utf8enc('y')], utf8enc('a') => utf8enc('b')}, "\x85\xA3foo\xA3bar\x03\xA5three\xA4four\x04\xA1x\x91\xA1y\xA1a\xA1b"],
59
- ['hashes of hashes', {{utf8enc('x') => {utf8enc('y') => utf8enc('z')}} => utf8enc('s')}, "\x81\x81\xA1x\x81\xA1y\xA1z\xA1s"],
60
- ['hashes with nils', {utf8enc('foo') => nil}, "\x81\xA3foo\xC0"]
61
- ]
62
- }
63
-
64
- tests.each do |ctx, its|
65
- context("with #{ctx}") do
66
- its.each do |desc, unpacked, packed|
67
- it("encodes #{desc}") do
68
- MessagePack.pack(unpacked).should == packed
69
- end
70
-
71
- it "decodes #{desc}" do
72
- MessagePack.unpack(packed).should == unpacked
73
- end
74
- end
75
- end
76
- end
77
-
78
- context 'using other names for .pack and .unpack' do
79
- it 'can unpack with .load' do
80
- MessagePack.load("\xABhello world").should == 'hello world'
81
- end
82
-
83
- it 'can pack with .dump' do
84
- MessagePack.dump(utf8enc('hello world')).should == "\xABhello world"
85
- end
86
- end
87
-
88
- context 'with symbols' do
89
- it 'encodes symbols as strings' do
90
- MessagePack.pack(:symbol).should == "\xA6symbol"
91
- end
92
- end
93
-
94
- context 'with different external encoding', :encodings do
95
- before do
96
- @default_external = Encoding.default_external
97
- @default_internal = Encoding.default_internal
98
- Encoding.default_external = Encoding::UTF_8
99
- Encoding.default_internal = Encoding::ISO_8859_1
100
- end
101
-
102
- after do
103
- Encoding.default_external = @default_external
104
- Encoding.default_internal = @default_internal
105
- end
106
-
107
- it 'transcodes strings when encoding' do
108
- input = "sk\xE5l".force_encoding(Encoding::ISO_8859_1)
109
- MessagePack.pack(input).should == "\xA5sk\xC3\xA5l"
110
- end
111
- end
112
-
113
- context 'with other things' do
114
- it 'raises an error on #pack with an unsupported type' do
115
- expect { MessagePack.pack(self) }.to raise_error(NoMethodError, /^undefined method `to_msgpack'/)
116
- end
117
-
118
- it 'rasies an error on #unpack with garbage' do
119
- skip "but nothing was raised. why?"
120
- expect { MessagePack.unpack('asdka;sd') }.to raise_error(MessagePack::UnpackError)
121
- end
122
- end
123
-
124
- context 'extensions' do
125
- it 'can unpack hashes with symbolized keys' do
126
- packed = MessagePack.pack({'hello' => 'world', 'nested' => ['object', {'structure' => true}]})
127
- unpacked = MessagePack.unpack(packed, :symbolize_keys => true)
128
- unpacked.should == {:hello => 'world', :nested => ['object', {:structure => true}]}
129
- end
130
-
131
- it 'does not symbolize keys even if other options are present' do
132
- packed = MessagePack.pack({'hello' => 'world', 'nested' => ['object', {'structure' => true}]})
133
- unpacked = MessagePack.unpack(packed, :other_option => false)
134
- unpacked.should == {'hello' => 'world', 'nested' => ['object', {'structure' => true}]}
135
- end
136
-
137
- it 'can unpack strings with a specified encoding', :encodings do
138
- packed = MessagePack.pack({utf8enc('hello') => utf8enc('world')})
139
- unpacked = MessagePack.unpack(packed)
140
- unpacked['hello'].encoding.should == Encoding::UTF_8
141
- end
142
-
143
- it 'can pack strings with a specified encoding', :encodings do
144
- packed = MessagePack.pack({'hello' => "w\xE5rld".force_encoding(Encoding::ISO_8859_1)})
145
- packed.index("w\xC3\xA5rld").should_not be_nil
146
- end
147
- end
148
-
149
- context 'in compatibility mode' do
150
- it 'does not use the bin types' do
151
- packed = MessagePack.pack('hello'.force_encoding(Encoding::BINARY), compatibility_mode: true)
152
- packed.should eq("\xA5hello")
153
- packed = MessagePack.pack(('hello' * 100).force_encoding(Encoding::BINARY), compatibility_mode: true)
154
- packed.should start_with("\xDA\x01\xF4")
155
- end
156
-
157
- it 'does not use the str8 type' do
158
- packed = MessagePack.pack('x' * 32, compatibility_mode: true)
159
- packed.should start_with("\xDA\x00\x20")
160
- end
161
- end
162
-
163
- context 'when a Bignum has a small value' do
164
- tests['numbers'].take(10).each do |desc, unpacked, packed|
165
- it("encodes #{desc} to the smallest representation") do
166
- bignum = (1 << 64).coerce(unpacked)[0]
167
- MessagePack.pack(bignum).should eq(packed)
168
- end
169
- end
170
- end
171
-
172
- context 'when the source is na IO-like object' do
173
- require 'tempfile'
174
- require 'stringio'
175
-
176
- it 'work with IO destination object as 2nd argument of MessagePack.pack' do
177
- Tempfile.create("pack-test") do |io|
178
- return_value = MessagePack.pack(utf8enc('hello world'), io)
179
- return_value.should be_nil
180
-
181
- io.rewind
182
- io.read.force_encoding(Encoding::ASCII_8BIT).should eq("\xABhello world".force_encoding(Encoding::ASCII_8BIT))
183
- end
184
- end
185
-
186
- it 'work with IO-like StringIO destination object as 2nd argument of MessagePack.pack' do
187
- io = StringIO.new
188
- return_value = MessagePack.pack(utf8enc('hello world'), io)
189
- return_value.should be_nil
190
-
191
- io.rewind
192
- io.read.force_encoding(Encoding::ASCII_8BIT).should eq("\xABhello world".force_encoding(Encoding::ASCII_8BIT))
193
- end
194
-
195
- it 'work with IO source object as source of MessagePack.unpack' do
196
- Tempfile.create("unpack-test") do |io|
197
- MessagePack.pack(utf8enc('hello world'), io)
198
- io.rewind
199
-
200
- return_value = MessagePack.unpack(io)
201
- return_value.should eq(utf8enc('hello world'))
202
- end
203
- end
204
-
205
- it 'work with IO-like StringIO object of MessagePack.unpack' do
206
- io = StringIO.new
207
- MessagePack.pack(utf8enc('hello world'), io)
208
- io.rewind
209
-
210
- return_value = MessagePack.unpack(io)
211
- return_value.should eq(utf8enc('hello world'))
212
- end
213
- end
214
- end
data/spec/pack_spec.rb DELETED
@@ -1,61 +0,0 @@
1
- # encoding: ascii-8bit
2
- require 'spec_helper'
3
-
4
- require 'stringio'
5
- if defined?(Encoding)
6
- Encoding.default_external = 'ASCII-8BIT'
7
- end
8
-
9
- describe MessagePack do
10
- it 'to_msgpack returns String' do
11
- nil.to_msgpack.class.should == String
12
- true.to_msgpack.class.should == String
13
- false.to_msgpack.class.should == String
14
- 1.to_msgpack.class.should == String
15
- 1.0.to_msgpack.class.should == String
16
- "".to_msgpack.class.should == String
17
- Hash.new.to_msgpack.class.should == String
18
- Array.new.to_msgpack.class.should == String
19
- end
20
-
21
- class CustomPack01
22
- def to_msgpack(pk=nil)
23
- return MessagePack.pack(self, pk) unless pk.class == MessagePack::Packer
24
- pk.write_array_header(2)
25
- pk.write(1)
26
- pk.write(2)
27
- return pk
28
- end
29
- end
30
-
31
- class CustomPack02
32
- def to_msgpack(pk=nil)
33
- [1,2].to_msgpack(pk)
34
- end
35
- end
36
-
37
- it 'calls custom to_msgpack method' do
38
- MessagePack.pack(CustomPack01.new).should == [1,2].to_msgpack
39
- MessagePack.pack(CustomPack02.new).should == [1,2].to_msgpack
40
- CustomPack01.new.to_msgpack.should == [1,2].to_msgpack
41
- CustomPack02.new.to_msgpack.should == [1,2].to_msgpack
42
- end
43
-
44
- it 'calls custom to_msgpack method with io' do
45
- s01 = StringIO.new
46
- MessagePack.pack(CustomPack01.new, s01)
47
- s01.string.should == [1,2].to_msgpack
48
-
49
- s02 = StringIO.new
50
- MessagePack.pack(CustomPack02.new, s02)
51
- s02.string.should == [1,2].to_msgpack
52
-
53
- s03 = StringIO.new
54
- CustomPack01.new.to_msgpack(s03)
55
- s03.string.should == [1,2].to_msgpack
56
-
57
- s04 = StringIO.new
58
- CustomPack02.new.to_msgpack(s04)
59
- s04.string.should == [1,2].to_msgpack
60
- end
61
- end