msgpack 1.5.1 → 1.7.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/ChangeLog +55 -0
  3. data/README.md +30 -1
  4. data/ext/java/org/msgpack/jruby/Buffer.java +3 -3
  5. data/ext/java/org/msgpack/jruby/ExtensionRegistry.java +11 -20
  6. data/ext/java/org/msgpack/jruby/ExtensionValue.java +1 -1
  7. data/ext/java/org/msgpack/jruby/Factory.java +11 -50
  8. data/ext/java/org/msgpack/jruby/Packer.java +9 -24
  9. data/ext/java/org/msgpack/jruby/Unpacker.java +15 -32
  10. data/ext/msgpack/buffer.c +54 -69
  11. data/ext/msgpack/buffer.h +16 -18
  12. data/ext/msgpack/buffer_class.c +138 -37
  13. data/ext/msgpack/buffer_class.h +1 -0
  14. data/ext/msgpack/compat.h +0 -99
  15. data/ext/msgpack/extconf.rb +25 -39
  16. data/ext/msgpack/factory_class.c +75 -86
  17. data/ext/msgpack/packer.c +12 -39
  18. data/ext/msgpack/packer.h +1 -11
  19. data/ext/msgpack/packer_class.c +73 -99
  20. data/ext/msgpack/packer_class.h +11 -0
  21. data/ext/msgpack/packer_ext_registry.c +31 -28
  22. data/ext/msgpack/packer_ext_registry.h +10 -14
  23. data/ext/msgpack/rbinit.c +1 -1
  24. data/ext/msgpack/rmem.c +3 -4
  25. data/ext/msgpack/sysdep.h +5 -2
  26. data/ext/msgpack/unpacker.c +66 -94
  27. data/ext/msgpack/unpacker.h +13 -12
  28. data/ext/msgpack/unpacker_class.c +64 -80
  29. data/ext/msgpack/unpacker_class.h +11 -0
  30. data/ext/msgpack/unpacker_ext_registry.c +4 -16
  31. data/ext/msgpack/unpacker_ext_registry.h +3 -7
  32. data/lib/msgpack/buffer.rb +9 -0
  33. data/lib/msgpack/factory.rb +90 -63
  34. data/lib/msgpack/packer.rb +10 -1
  35. data/lib/msgpack/unpacker.rb +14 -1
  36. data/lib/msgpack/version.rb +1 -1
  37. data/lib/msgpack.rb +1 -0
  38. data/msgpack.gemspec +7 -3
  39. metadata +33 -56
  40. data/.github/workflows/ci.yaml +0 -57
  41. data/.gitignore +0 -23
  42. data/.rubocop.yml +0 -36
  43. data/Gemfile +0 -9
  44. data/Rakefile +0 -70
  45. data/appveyor.yml +0 -18
  46. data/bench/pack.rb +0 -23
  47. data/bench/pack_log.rb +0 -33
  48. data/bench/pack_log_long.rb +0 -65
  49. data/bench/pack_symbols.rb +0 -28
  50. data/bench/run.sh +0 -14
  51. data/bench/run_long.sh +0 -35
  52. data/bench/run_symbols.sh +0 -26
  53. data/bench/unpack.rb +0 -21
  54. data/bench/unpack_log.rb +0 -34
  55. data/bench/unpack_log_long.rb +0 -67
  56. data/doclib/msgpack/buffer.rb +0 -193
  57. data/doclib/msgpack/core_ext.rb +0 -101
  58. data/doclib/msgpack/error.rb +0 -19
  59. data/doclib/msgpack/extension_value.rb +0 -9
  60. data/doclib/msgpack/factory.rb +0 -145
  61. data/doclib/msgpack/packer.rb +0 -209
  62. data/doclib/msgpack/time.rb +0 -22
  63. data/doclib/msgpack/timestamp.rb +0 -44
  64. data/doclib/msgpack/unpacker.rb +0 -183
  65. data/doclib/msgpack.rb +0 -87
  66. data/msgpack.org.md +0 -46
  67. data/spec/bigint_spec.rb +0 -26
  68. data/spec/cases.json +0 -1
  69. data/spec/cases.msg +0 -0
  70. data/spec/cases_compact.msg +0 -0
  71. data/spec/cases_spec.rb +0 -39
  72. data/spec/cruby/buffer_io_spec.rb +0 -255
  73. data/spec/cruby/buffer_packer.rb +0 -29
  74. data/spec/cruby/buffer_spec.rb +0 -575
  75. data/spec/cruby/buffer_unpacker.rb +0 -19
  76. data/spec/cruby/unpacker_spec.rb +0 -70
  77. data/spec/ext_value_spec.rb +0 -99
  78. data/spec/exttypes.rb +0 -51
  79. data/spec/factory_spec.rb +0 -654
  80. data/spec/format_spec.rb +0 -301
  81. data/spec/jruby/benchmarks/shootout_bm.rb +0 -73
  82. data/spec/jruby/benchmarks/symbolize_keys_bm.rb +0 -25
  83. data/spec/jruby/unpacker_spec.rb +0 -186
  84. data/spec/msgpack_spec.rb +0 -214
  85. data/spec/pack_spec.rb +0 -61
  86. data/spec/packer_spec.rb +0 -575
  87. data/spec/random_compat.rb +0 -24
  88. data/spec/spec_helper.rb +0 -65
  89. data/spec/timestamp_spec.rb +0 -159
  90. data/spec/unpack_spec.rb +0 -57
  91. data/spec/unpacker_spec.rb +0 -847
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 'raises 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