msgpack 1.3.3-java → 1.4.3-java
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 +4 -4
- data/lib/msgpack/msgpack.jar +0 -0
- data/lib/msgpack/symbol.rb +14 -4
- data/lib/msgpack/time.rb +1 -1
- data/lib/msgpack/version.rb +4 -8
- data/lib/msgpack.rb +2 -7
- data/spec/factory_spec.rb +17 -0
- data/spec/msgpack_spec.rb +1 -1
- data/spec/packer_spec.rb +18 -0
- data/spec/spec_helper.rb +27 -0
- data/spec/timestamp_spec.rb +40 -0
- data/spec/unpacker_spec.rb +113 -1
- metadata +8 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c13610f5243e8a0bbcb5be9d2e4cec62e5f90f443a90c61501b088ebd8d958c9
|
4
|
+
data.tar.gz: 5afe456db4aa4cf41795d8bd62b66b6ce94887408edc2629ec896a69f31b9741
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c1760ab752e904de9d80651134c92a21763bf161d64de9c7564b1e9532bb84ff0b31b5006eb78790c9c49293cf017a222806dfbc9a6c282ef242ebbb6c2d6a4b
|
7
|
+
data.tar.gz: 4d9c0f170b9aeff8e08f74aa9103c7ba2949132d3aa3772f0b6db596ed085738c8f98d78b5f6d35c09b98bb264de6c82f43ebe9b0689ca468f57cbeba85061bc
|
data/lib/msgpack/msgpack.jar
CHANGED
Binary file
|
data/lib/msgpack/symbol.rb
CHANGED
@@ -1,9 +1,19 @@
|
|
1
1
|
class Symbol
|
2
|
-
|
3
|
-
|
2
|
+
# to_msgpack_ext is supposed to return a binary string.
|
3
|
+
# The canonical way to do it for symbols would be:
|
4
|
+
# [to_s].pack('A*')
|
5
|
+
# However in this instance we can take a shortcut
|
6
|
+
if method_defined?(:name)
|
7
|
+
alias_method :to_msgpack_ext, :name
|
8
|
+
else
|
9
|
+
alias_method :to_msgpack_ext, :to_s
|
4
10
|
end
|
5
11
|
|
6
12
|
def self.from_msgpack_ext(data)
|
7
|
-
|
13
|
+
# from_msgpack_ext is supposed to parse a binary string.
|
14
|
+
# The canonical way to do it for symbols would be:
|
15
|
+
# data.unpack1('A*').to_sym
|
16
|
+
# However in this instance we can take a shortcut
|
17
|
+
data.to_sym
|
8
18
|
end
|
9
|
-
end
|
19
|
+
end
|
data/lib/msgpack/time.rb
CHANGED
data/lib/msgpack/version.rb
CHANGED
@@ -1,10 +1,6 @@
|
|
1
1
|
module MessagePack
|
2
|
-
VERSION = "1.
|
3
|
-
|
4
|
-
#
|
5
|
-
#
|
6
|
-
# * versions/supports of rake-compiler & rake-compiler-dock
|
7
|
-
# https://github.com/rake-compiler/rake-compiler-dock/blob/master/History.md
|
8
|
-
# * update RUBY_CC_VERSION in Rakefile
|
9
|
-
# * check Ruby dependency of released mswin gem details
|
2
|
+
VERSION = "1.4.3"
|
3
|
+
# Note for maintainers:
|
4
|
+
# Don't miss building/releasing the JRuby version (rake buld:java)
|
5
|
+
# See "How to build -java rubygems" in README for more details.
|
10
6
|
end
|
data/lib/msgpack.rb
CHANGED
@@ -1,15 +1,10 @@
|
|
1
1
|
require "msgpack/version"
|
2
2
|
|
3
3
|
if defined?(RUBY_ENGINE) && RUBY_ENGINE == "jruby" # This is same with `/java/ =~ RUBY_VERSION`
|
4
|
-
require "java"
|
5
4
|
require "msgpack/msgpack.jar"
|
6
|
-
org.msgpack.jruby.MessagePackLibrary
|
5
|
+
JRuby::Util.load_ext("org.msgpack.jruby.MessagePackLibrary")
|
7
6
|
else
|
8
|
-
|
9
|
-
require "msgpack/#{RUBY_VERSION[/\d+.\d+/]}/msgpack"
|
10
|
-
rescue LoadError
|
11
|
-
require "msgpack/msgpack"
|
12
|
-
end
|
7
|
+
require "msgpack/msgpack"
|
13
8
|
end
|
14
9
|
|
15
10
|
require "msgpack/packer"
|
data/spec/factory_spec.rb
CHANGED
@@ -280,6 +280,23 @@ describe MessagePack::Factory do
|
|
280
280
|
unpacker.feed(packed_symbol).unpack
|
281
281
|
end
|
282
282
|
|
283
|
+
context 'using the optimized symbol unpacker' do
|
284
|
+
before do
|
285
|
+
skip if IS_JRUBY # JRuby implementation doesn't support the optimized symbols unpacker for now
|
286
|
+
subject.register_type(
|
287
|
+
0x00,
|
288
|
+
::Symbol,
|
289
|
+
packer: :to_msgpack_ext,
|
290
|
+
unpacker: :from_msgpack_ext,
|
291
|
+
optimized_symbols_parsing: true,
|
292
|
+
)
|
293
|
+
end
|
294
|
+
|
295
|
+
it 'lets symbols survive a roundtrip' do
|
296
|
+
expect(symbol_after_roundtrip).to be :symbol
|
297
|
+
end
|
298
|
+
end
|
299
|
+
|
283
300
|
context 'if no ext type is registered for symbols' do
|
284
301
|
it 'converts symbols to string' do
|
285
302
|
expect(symbol_after_roundtrip).to eq 'symbol'
|
data/spec/msgpack_spec.rb
CHANGED
@@ -115,7 +115,7 @@ describe MessagePack do
|
|
115
115
|
expect { MessagePack.pack(self) }.to raise_error(NoMethodError, /^undefined method `to_msgpack'/)
|
116
116
|
end
|
117
117
|
|
118
|
-
it '
|
118
|
+
it 'raises an error on #unpack with garbage' do
|
119
119
|
skip "but nothing was raised. why?"
|
120
120
|
expect { MessagePack.unpack('asdka;sd') }.to raise_error(MessagePack::UnpackError)
|
121
121
|
end
|
data/spec/packer_spec.rb
CHANGED
@@ -488,6 +488,24 @@ describe MessagePack::Packer do
|
|
488
488
|
it { is_expected.to eq "\xC7\x0F\x01value_msgpacked" }
|
489
489
|
end
|
490
490
|
|
491
|
+
shared_examples_for 'extension subclasses core type' do |klass|
|
492
|
+
before { stub_const('Value', Class.new(klass)) }
|
493
|
+
let(:object) { Value.new }
|
494
|
+
subject { packer.pack(object).to_s }
|
495
|
+
|
496
|
+
it "defaults to #{klass.name} packer if no extension is present" do
|
497
|
+
expect(subject).to eq(MessagePack.dump(klass.new))
|
498
|
+
end
|
499
|
+
|
500
|
+
it "uses core type extension for #{klass.name}" do
|
501
|
+
packer.register_type(0x01, Value, ->(_) { 'value_msgpacked' })
|
502
|
+
expect(subject).to eq("\xC7\x0F\x01value_msgpacked")
|
503
|
+
end
|
504
|
+
end
|
505
|
+
it_behaves_like 'extension subclasses core type', Hash
|
506
|
+
it_behaves_like 'extension subclasses core type', Array
|
507
|
+
it_behaves_like 'extension subclasses core type', String
|
508
|
+
|
491
509
|
context 'when registering a type for symbols' do
|
492
510
|
before { packer.register_type(0x00, ::Symbol, :to_msgpack_ext) }
|
493
511
|
|
data/spec/spec_helper.rb
CHANGED
@@ -15,10 +15,37 @@ end
|
|
15
15
|
|
16
16
|
require 'msgpack'
|
17
17
|
|
18
|
+
if GC.respond_to?(:verify_compaction_references)
|
19
|
+
# This method was added in Ruby 3.0.0. Calling it this way asks the GC to
|
20
|
+
# move objects around, helping to find object movement bugs.
|
21
|
+
GC.verify_compaction_references(double_heap: true, toward: :empty)
|
22
|
+
end
|
23
|
+
|
24
|
+
if GC.respond_to?(:auto_compact=)
|
25
|
+
GC.auto_compact = true
|
26
|
+
end
|
27
|
+
|
18
28
|
def java?
|
19
29
|
/java/ =~ RUBY_PLATFORM
|
20
30
|
end
|
21
31
|
|
32
|
+
# checking if Hash#[]= (rb_hash_aset) dedupes string keys
|
33
|
+
def automatic_string_keys_deduplication?
|
34
|
+
h = {}
|
35
|
+
x = {}
|
36
|
+
r = rand.to_s
|
37
|
+
h[%W(#{r}).join('')] = :foo
|
38
|
+
x[%W(#{r}).join('')] = :foo
|
39
|
+
|
40
|
+
x.keys[0].equal?(h.keys[0])
|
41
|
+
end
|
42
|
+
|
43
|
+
def string_deduplication?
|
44
|
+
r1 = rand.to_s
|
45
|
+
r2 = r1.dup
|
46
|
+
(-r1).equal?(-r2)
|
47
|
+
end
|
48
|
+
|
22
49
|
if java?
|
23
50
|
RSpec.configure do |c|
|
24
51
|
c.treat_symbols_as_metadata_keys_with_true_values = true
|
data/spec/timestamp_spec.rb
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
|
+
IS_JRUBY = Kernel.const_defined?(:JRUBY_VERSION)
|
6
|
+
|
5
7
|
describe MessagePack::Timestamp do
|
6
8
|
describe 'malformed format' do
|
7
9
|
it do
|
@@ -60,6 +62,44 @@ describe MessagePack::Timestamp do
|
|
60
62
|
it 'runs correctly (regression)' do
|
61
63
|
expect(factory.unpack(factory.pack(Time.utc(2200)))).to eq(Time.utc(2200))
|
62
64
|
end
|
65
|
+
|
66
|
+
let(:time32_max) { Time.new(2106, 2, 7, 6, 28, 15, "+00:00") }
|
67
|
+
it 'is serialized into timestamp32' do
|
68
|
+
expect(factory.pack(time32_max).size).to be 6
|
69
|
+
expect(factory.unpack(factory.pack(time32_max)).utc).to eq(time32_max)
|
70
|
+
end
|
71
|
+
|
72
|
+
let(:time64_min) { Time.new(2106, 2, 7, 6, 28, 16, "+00:00") }
|
73
|
+
it 'is serialized into timestamp64' do
|
74
|
+
expect(factory.pack(time64_min).size).to be 10
|
75
|
+
expect(factory.unpack(factory.pack(time64_min)).utc).to eq(time64_min)
|
76
|
+
end
|
77
|
+
|
78
|
+
let(:time64_max) { Time.at(Time.new(2514, 5, 30, 1, 53, 3, "+00:00").to_i, 999999999 / 1000.0r).utc } # TODO: use Time.at(sec, nsec, :nsec) when removing Ruby 2.4 from the list
|
79
|
+
it 'is serialized into timestamp64' do
|
80
|
+
expect(factory.pack(time64_max).size).to be 10
|
81
|
+
expect(factory.unpack(factory.pack(time64_max)).utc).to eq(time64_max)
|
82
|
+
end
|
83
|
+
|
84
|
+
let(:time96_positive_min) { Time.new(2514, 5, 30, 1, 53, 4, "+00:00") }
|
85
|
+
it 'is serialized into timestamp96' do
|
86
|
+
expect(factory.pack(time96_positive_min).size).to be 15
|
87
|
+
expect(factory.unpack(factory.pack(time96_positive_min)).utc).to eq(time96_positive_min)
|
88
|
+
end
|
89
|
+
|
90
|
+
let(:time96_min) { Time.at(-2**63).utc }
|
91
|
+
it 'is serialized into timestamp96' do
|
92
|
+
skip if IS_JRUBY # JRuby cannot handle numerics larger than long
|
93
|
+
expect(factory.pack(time96_min).size).to be 15
|
94
|
+
expect(factory.unpack(factory.pack(time96_min)).utc).to eq(time96_min)
|
95
|
+
end
|
96
|
+
|
97
|
+
let(:time96_max) { Time.at(2**63 - 1).utc }
|
98
|
+
it 'is serialized into timestamp96' do
|
99
|
+
skip if IS_JRUBY # JRuby cannot handle numerics larger than long
|
100
|
+
expect(factory.pack(time96_max).size).to be 15
|
101
|
+
expect(factory.unpack(factory.pack(time96_max)).utc).to eq(time96_max)
|
102
|
+
end
|
63
103
|
end
|
64
104
|
|
65
105
|
describe 'register_type with MessagePack::Timestamp' do
|
data/spec/unpacker_spec.rb
CHANGED
@@ -18,13 +18,35 @@ describe MessagePack::Unpacker do
|
|
18
18
|
it 'gets options to specify how to unpack values' do
|
19
19
|
u1 = MessagePack::Unpacker.new
|
20
20
|
u1.symbolize_keys?.should == false
|
21
|
+
u1.freeze?.should == false
|
21
22
|
u1.allow_unknown_ext?.should == false
|
22
23
|
|
23
|
-
u2 = MessagePack::Unpacker.new(symbolize_keys: true, allow_unknown_ext: true)
|
24
|
+
u2 = MessagePack::Unpacker.new(symbolize_keys: true, freeze: true, allow_unknown_ext: true)
|
24
25
|
u2.symbolize_keys?.should == true
|
26
|
+
u2.freeze?.should == true
|
25
27
|
u2.allow_unknown_ext?.should == true
|
26
28
|
end
|
27
29
|
|
30
|
+
if automatic_string_keys_deduplication?
|
31
|
+
it 'ensure string hash keys are deduplicated' do
|
32
|
+
sample_data = [{"foo" => 1}, {"foo" => 2}]
|
33
|
+
sample_packed = MessagePack.pack(sample_data).force_encoding('ASCII-8BIT')
|
34
|
+
unpacker.feed(sample_packed)
|
35
|
+
hashes = nil
|
36
|
+
unpacker.each { |obj| hashes = obj }
|
37
|
+
expect(hashes[0].keys.first).to equal(hashes[1].keys.first)
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'ensure strings are not deduplicated' do
|
41
|
+
sample_data = ["foo"]
|
42
|
+
sample_packed = MessagePack.pack(sample_data).force_encoding('ASCII-8BIT')
|
43
|
+
unpacker.feed(sample_packed)
|
44
|
+
ary = nil
|
45
|
+
unpacker.each { |obj| ary = obj }
|
46
|
+
expect(ary.first.frozen?).to eq(false)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
28
50
|
it 'gets IO or object which has #read to read data from it' do
|
29
51
|
sample_data = {"message" => "morning!", "num" => 1}
|
30
52
|
sample_packed = MessagePack.pack(sample_data).force_encoding('ASCII-8BIT')
|
@@ -621,6 +643,14 @@ describe MessagePack::Unpacker do
|
|
621
643
|
array = ['foo'] * 10_000
|
622
644
|
MessagePack.unpack(MessagePack.pack(array)).size.should == 10_000
|
623
645
|
end
|
646
|
+
|
647
|
+
it 'preserves string encoding (issue #200)' do
|
648
|
+
string = 'a'.force_encoding(Encoding::UTF_8)
|
649
|
+
MessagePack.unpack(MessagePack.pack(string)).encoding.should == string.encoding
|
650
|
+
|
651
|
+
string *= 256
|
652
|
+
MessagePack.unpack(MessagePack.pack(string)).encoding.should == string.encoding
|
653
|
+
end
|
624
654
|
end
|
625
655
|
|
626
656
|
context 'extensions' do
|
@@ -651,6 +681,88 @@ describe MessagePack::Unpacker do
|
|
651
681
|
end
|
652
682
|
end
|
653
683
|
|
684
|
+
context 'freeze' do
|
685
|
+
let :struct do
|
686
|
+
{'hello' => 'world', 'nested' => ['object', {'structure' => true}]}
|
687
|
+
end
|
688
|
+
|
689
|
+
let :buffer do
|
690
|
+
MessagePack.pack(struct)
|
691
|
+
end
|
692
|
+
|
693
|
+
let :unpacker do
|
694
|
+
described_class.new(:freeze => true)
|
695
|
+
end
|
696
|
+
|
697
|
+
it 'can freeze objects when using .unpack' do
|
698
|
+
parsed_struct = MessagePack.unpack(buffer, freeze: true)
|
699
|
+
parsed_struct.should == struct
|
700
|
+
|
701
|
+
parsed_struct.should be_frozen
|
702
|
+
parsed_struct['hello'].should be_frozen
|
703
|
+
parsed_struct['nested'].should be_frozen
|
704
|
+
parsed_struct['nested'][0].should be_frozen
|
705
|
+
parsed_struct['nested'][1].should be_frozen
|
706
|
+
|
707
|
+
if string_deduplication?
|
708
|
+
parsed_struct.keys[0].should be_equal('hello'.freeze)
|
709
|
+
parsed_struct.keys[1].should be_equal('nested'.freeze)
|
710
|
+
parsed_struct.values[0].should be_equal('world'.freeze)
|
711
|
+
parsed_struct.values[1][0].should be_equal('object'.freeze)
|
712
|
+
parsed_struct.values[1][1].keys[0].should be_equal('structure'.freeze)
|
713
|
+
end
|
714
|
+
end
|
715
|
+
|
716
|
+
it 'can freeze objects when using #each' do
|
717
|
+
objs = []
|
718
|
+
unpacker.feed(buffer)
|
719
|
+
unpacker.each do |obj|
|
720
|
+
objs << obj
|
721
|
+
end
|
722
|
+
|
723
|
+
parsed_struct = objs.first
|
724
|
+
parsed_struct.should == struct
|
725
|
+
|
726
|
+
parsed_struct.should be_frozen
|
727
|
+
parsed_struct['hello'].should be_frozen
|
728
|
+
parsed_struct['nested'].should be_frozen
|
729
|
+
parsed_struct['nested'][0].should be_frozen
|
730
|
+
parsed_struct['nested'][1].should be_frozen
|
731
|
+
|
732
|
+
if string_deduplication?
|
733
|
+
parsed_struct.keys[0].should be_equal('hello'.freeze)
|
734
|
+
parsed_struct.keys[1].should be_equal('nested'.freeze)
|
735
|
+
parsed_struct.values[0].should be_equal('world'.freeze)
|
736
|
+
parsed_struct.values[1][0].should be_equal('object'.freeze)
|
737
|
+
parsed_struct.values[1][1].keys[0].should be_equal('structure'.freeze)
|
738
|
+
end
|
739
|
+
end
|
740
|
+
|
741
|
+
it 'can freeze objects when using #feed_each' do
|
742
|
+
objs = []
|
743
|
+
unpacker.feed_each(buffer) do |obj|
|
744
|
+
objs << obj
|
745
|
+
end
|
746
|
+
|
747
|
+
parsed_struct = objs.first
|
748
|
+
parsed_struct.should == struct
|
749
|
+
|
750
|
+
parsed_struct.should be_frozen
|
751
|
+
parsed_struct['hello'].should be_frozen
|
752
|
+
parsed_struct['nested'].should be_frozen
|
753
|
+
parsed_struct['nested'][0].should be_frozen
|
754
|
+
parsed_struct['nested'][1].should be_frozen
|
755
|
+
|
756
|
+
if string_deduplication?
|
757
|
+
parsed_struct.keys[0].should be_equal('hello'.freeze)
|
758
|
+
parsed_struct.keys[1].should be_equal('nested'.freeze)
|
759
|
+
parsed_struct.values[0].should be_equal('world'.freeze)
|
760
|
+
parsed_struct.values[1][0].should be_equal('object'.freeze)
|
761
|
+
parsed_struct.values[1][1].keys[0].should be_equal('structure'.freeze)
|
762
|
+
end
|
763
|
+
end
|
764
|
+
end
|
765
|
+
|
654
766
|
context 'binary encoding', :encodings do
|
655
767
|
let :buffer do
|
656
768
|
MessagePack.pack({'hello' => 'world', 'nested' => ['object', {'structure' => true}]})
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: msgpack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.3
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Sadayuki Furuhashi
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2022-01-20 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
@@ -43,17 +43,17 @@ dependencies:
|
|
43
43
|
- !ruby/object:Gem::Dependency
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
|
-
- - "
|
46
|
+
- - ">="
|
47
47
|
- !ruby/object:Gem::Version
|
48
|
-
version: '
|
48
|
+
version: '0'
|
49
49
|
name: rake-compiler
|
50
50
|
prerelease: false
|
51
51
|
type: :development
|
52
52
|
version_requirements: !ruby/object:Gem::Requirement
|
53
53
|
requirements:
|
54
|
-
- - "
|
54
|
+
- - ">="
|
55
55
|
- !ruby/object:Gem::Version
|
56
|
-
version: '
|
56
|
+
version: '0'
|
57
57
|
- !ruby/object:Gem::Dependency
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
@@ -153,14 +153,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
153
153
|
requirements:
|
154
154
|
- - ">="
|
155
155
|
- !ruby/object:Gem::Version
|
156
|
-
version: '
|
156
|
+
version: '2.4'
|
157
157
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
158
158
|
requirements:
|
159
159
|
- - ">="
|
160
160
|
- !ruby/object:Gem::Version
|
161
161
|
version: '0'
|
162
162
|
requirements: []
|
163
|
-
rubygems_version: 3.
|
163
|
+
rubygems_version: 3.2.29
|
164
164
|
signing_key:
|
165
165
|
specification_version: 4
|
166
166
|
summary: MessagePack, a binary-based efficient data interchange format.
|