msgpack 1.2.10-java → 1.3.0-java

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 68e21b85c0e2e2db53641e8b8eabd536907b1b96f91ba6f98a8a45e51f6895cf
4
- data.tar.gz: 7a413a7514351ba8c4fa80068a4d5a597af824e0eae9ce8f9cf4fea771e1e280
3
+ metadata.gz: 50acb5f580ca3bc5003de45dc2348d7461365b6f262bb39d5c06095b31889dd2
4
+ data.tar.gz: 4071ce9a089de10c2a3f583c27aaa9f8ca952766d29a9a16fd6112154fa28752
5
5
  SHA512:
6
- metadata.gz: 5e03b708ad5d3e50ef830b5b6965bd22556dc1681690fba5cb0a21fe57ef54d27952fad7d17d88949177828047e6a1f99027ff42632cab567921be727bb18f57
7
- data.tar.gz: 80e15ddbf479f6939802d23a3ce886c0a667ae9d60d5e9e78f436274c456cb6d7903c9d6ce880a695aad1c72f4c2ee61c58faea66ae47bbc11fbbf35f60928ed
6
+ metadata.gz: 9d75669baa1bc0e075909195655dc4c06481ce659d7ad1368b07502279c4f5300e6e9c130ca1d3d1674aaecf2e5c3350b02a1dd5f04c66a374384030ba28680d
7
+ data.tar.gz: 7bbaef49fe323be3f172eb961e184608333643a37202ca5ecda86deaa2b3ea01ab3618828e1b88dd617798a79953255bfc83c6cbcad4d347b027ee35825bc0ab
@@ -17,6 +17,8 @@ require "msgpack/unpacker"
17
17
  require "msgpack/factory"
18
18
  require "msgpack/symbol"
19
19
  require "msgpack/core_ext"
20
+ require "msgpack/timestamp"
21
+ require "msgpack/time"
20
22
 
21
23
  module MessagePack
22
24
  DefaultFactory = MessagePack::Factory.new
Binary file
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ # MessagePack extention packer and unpacker for built-in Time class
4
+ module MessagePack
5
+ module Time
6
+ # 3-arg Time.at is available Ruby >= 2.5
7
+ TIME_AT_3_AVAILABLE = begin
8
+ !!::Time.at(0, 0, :nanosecond)
9
+ rescue ArgumentError
10
+ false
11
+ end
12
+
13
+ Unpacker = if TIME_AT_3_AVAILABLE
14
+ lambda do |payload|
15
+ tv = MessagePack::Timestamp.from_msgpack_ext(payload)
16
+ ::Time.at(tv.sec, tv.nsec, :nanosecond)
17
+ end
18
+ else
19
+ lambda do |payload|
20
+ tv = MessagePack::Timestamp.from_msgpack_ext(payload)
21
+ ::Time.at(tv.sec, tv.nsec / 1000.0)
22
+ end
23
+ end
24
+
25
+ Packer = lambda { |time|
26
+ MessagePack::Timestamp.to_msgpack_ext(time.tv_sec, time.tv_nsec)
27
+ }
28
+ end
29
+ end
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MessagePack
4
+ class Timestamp # a.k.a. "TimeSpec"
5
+ # Because the byte-order of MessagePack is big-endian in,
6
+ # pack() and unpack() specifies ">".
7
+ # See https://docs.ruby-lang.org/en/trunk/Array.html#method-i-pack for details.
8
+
9
+ # The timestamp extension type defined in the MessagePack spec.
10
+ # See https://github.com/msgpack/msgpack/blob/master/spec.md#timestamp-extension-type for details.
11
+ TYPE = -1
12
+
13
+ TIMESTAMP32_MAX_SEC = (1 << 32) - 1
14
+ TIMESTAMP64_MAX_SEC = (1 << 34) - 1
15
+
16
+ # @return [Integer]
17
+ attr_reader :sec
18
+
19
+ # @return [Integer]
20
+ attr_reader :nsec
21
+
22
+ # @param [Integer] sec
23
+ # @param [Integer] nsec
24
+ def initialize(sec, nsec)
25
+ @sec = sec
26
+ @nsec = nsec
27
+ end
28
+
29
+ def self.from_msgpack_ext(data)
30
+ case data.length
31
+ when 4
32
+ # timestamp32 (sec: uint32be)
33
+ sec, = data.unpack('L>')
34
+ new(sec, 0)
35
+ when 8
36
+ # timestamp64 (nsec: uint30be, sec: uint34be)
37
+ n, s = data.unpack('L>2')
38
+ sec = ((n & 0b11) << 32) | s
39
+ nsec = n >> 2
40
+ new(sec, nsec)
41
+ when 12
42
+ # timestam96 (nsec: uint32be, sec: int64be)
43
+ nsec, sec = data.unpack('L>q>')
44
+ new(sec, nsec)
45
+ else
46
+ raise MalformedFormatError, "Invalid timestamp data size: #{data.length}"
47
+ end
48
+ end
49
+
50
+ def self.to_msgpack_ext(sec, nsec)
51
+ if sec >= 0 && nsec >= 0 && sec <= TIMESTAMP64_MAX_SEC
52
+ if nsec === 0 && sec <= TIMESTAMP32_MAX_SEC
53
+ # timestamp32 = (sec: uint32be)
54
+ [sec].pack('L>')
55
+ else
56
+ # timestamp64 (nsec: uint30be, sec: uint34be)
57
+ nsec30 = nsec << 2
58
+ sec_high2 = sec << 32 # high 2 bits (`x & 0b11` is redandunt)
59
+ sec_low32 = sec & 0xffffffff # low 32 bits
60
+ [nsec30 | sec_high2, sec_low32].pack('L>2')
61
+ end
62
+ else
63
+ # timestamp96 (nsec: uint32be, sec: int64be)
64
+ [nsec, sec].pack('L>q>')
65
+ end
66
+ end
67
+
68
+ def to_msgpack_ext
69
+ self.class.to_msgpack_ext(sec, nsec)
70
+ end
71
+
72
+ def ==(other)
73
+ other.class == self.class && sec == other.sec && nsec == other.nsec
74
+ end
75
+ end
76
+ end
@@ -1,5 +1,5 @@
1
1
  module MessagePack
2
- VERSION = "1.2.10"
2
+ VERSION = "1.3.0"
3
3
 
4
4
  # NOTE for msgpack-ruby maintainer:
5
5
  # Check these things to release new binaryes for new Ruby versions (especially for Windows):
@@ -0,0 +1,117 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe MessagePack::Timestamp do
6
+ describe 'malformed format' do
7
+ it do
8
+ expect do
9
+ MessagePack::Timestamp.from_msgpack_ext([0xd4, 0x00].pack("C*"))
10
+ end.to raise_error(MessagePack::MalformedFormatError)
11
+ end
12
+ end
13
+
14
+ describe 'register_type with Time' do
15
+ let(:factory) do
16
+ factory = MessagePack::Factory.new
17
+ factory.register_type(
18
+ MessagePack::Timestamp::TYPE,
19
+ Time,
20
+ packer: MessagePack::Time::Packer,
21
+ unpacker: MessagePack::Time::Unpacker
22
+ )
23
+ factory
24
+ end
25
+
26
+ let(:time) { Time.local(2019, 6, 17, 1, 2, 3, 123_456_789 / 1000.0) }
27
+ it 'serializes and deserializes Time' do
28
+ prefix_fixext8_with_type_id = [0xd7, -1].pack("c*")
29
+
30
+ packed = factory.pack(time)
31
+ expect(packed).to start_with(prefix_fixext8_with_type_id)
32
+ expect(packed.size).to eq(10)
33
+ unpacked = factory.unpack(packed)
34
+ expect(unpacked.to_i).to eq(time.to_i)
35
+ expect(unpacked.to_f).to eq(time.to_f)
36
+ # expect(unpacked).to eq(time) # we can't do it because of nsec (rational vs float?)
37
+ end
38
+
39
+ let(:time_without_nsec) { Time.local(2019, 6, 17, 1, 2, 3, 0) }
40
+ it 'serializes time without nanosec as fixext4' do
41
+ prefix_fixext4_with_type_id = [0xd6, -1].pack("c*")
42
+
43
+ packed = factory.pack(time_without_nsec)
44
+ expect(packed).to start_with(prefix_fixext4_with_type_id)
45
+ expect(packed.size).to eq(6)
46
+ unpacked = factory.unpack(packed)
47
+ expect(unpacked).to eq(time_without_nsec)
48
+ end
49
+
50
+ let(:time_after_2514) { Time.at(1 << 34) } # the max num of 34bit int means 2514-05-30 01:53:04 UTC
51
+ it 'serializes time after 2038 as ext8' do
52
+ prefix_ext8_with_12bytes_payload_and_type_id = [0xc7, 12, -1].pack("c*")
53
+
54
+ expect(time_after_2514.to_i).to be > 0xffffffff
55
+ packed = factory.pack(time_after_2514)
56
+ expect(packed).to start_with(prefix_ext8_with_12bytes_payload_and_type_id)
57
+ expect(packed.size).to eq(15)
58
+ end
59
+ end
60
+
61
+ describe 'register_type with MessagePack::Timestamp' do
62
+ let(:factory) do
63
+ factory = MessagePack::Factory.new
64
+ factory.register_type(MessagePack::Timestamp::TYPE, MessagePack::Timestamp)
65
+ factory
66
+ end
67
+
68
+ let(:timestamp) { MessagePack::Timestamp.new(Time.now.tv_sec, 123_456_789) }
69
+ it 'serializes and deserializes MessagePack::Timestamp' do
70
+ packed = factory.pack(timestamp)
71
+ unpacked = factory.unpack(packed)
72
+ expect(unpacked).to eq(timestamp)
73
+ end
74
+ end
75
+
76
+ describe 'timestamp32' do
77
+ it 'handles [1, 0]' do
78
+ t = MessagePack::Timestamp.new(1, 0)
79
+
80
+ payload = t.to_msgpack_ext
81
+ unpacked = MessagePack::Timestamp.from_msgpack_ext(payload)
82
+
83
+ expect(unpacked).to eq(t)
84
+ end
85
+ end
86
+
87
+ describe 'timestamp64' do
88
+ it 'handles [1, 1]' do
89
+ t = MessagePack::Timestamp.new(1, 1)
90
+
91
+ payload = t.to_msgpack_ext
92
+ unpacked = MessagePack::Timestamp.from_msgpack_ext(payload)
93
+
94
+ expect(unpacked).to eq(t)
95
+ end
96
+ end
97
+
98
+ describe 'timestamp96' do
99
+ it 'handles [-1, 0]' do
100
+ t = MessagePack::Timestamp.new(-1, 0)
101
+
102
+ payload = t.to_msgpack_ext
103
+ unpacked = MessagePack::Timestamp.from_msgpack_ext(payload)
104
+
105
+ expect(unpacked).to eq(t)
106
+ end
107
+
108
+ it 'handles [-1, 999_999_999]' do
109
+ t = MessagePack::Timestamp.new(-1, 999_999_999)
110
+
111
+ payload = t.to_msgpack_ext
112
+ unpacked = MessagePack::Timestamp.from_msgpack_ext(payload)
113
+
114
+ expect(unpacked).to eq(t)
115
+ end
116
+ end
117
+ end
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.2.10
4
+ version: 1.3.0
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: 2019-04-19 00:00:00.000000000 Z
13
+ date: 2019-06-20 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  requirement: !ruby/object:Gem::Requirement
@@ -113,6 +113,8 @@ files:
113
113
  - lib/msgpack/msgpack.jar
114
114
  - lib/msgpack/packer.rb
115
115
  - lib/msgpack/symbol.rb
116
+ - lib/msgpack/time.rb
117
+ - lib/msgpack/timestamp.rb
116
118
  - lib/msgpack/unpacker.rb
117
119
  - lib/msgpack/version.rb
118
120
  - spec/cases.json
@@ -136,6 +138,7 @@ files:
136
138
  - spec/packer_spec.rb
137
139
  - spec/random_compat.rb
138
140
  - spec/spec_helper.rb
141
+ - spec/timestamp_spec.rb
139
142
  - spec/unpack_spec.rb
140
143
  - spec/unpacker_spec.rb
141
144
  homepage: http://msgpack.org/
@@ -157,8 +160,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
157
160
  - !ruby/object:Gem::Version
158
161
  version: '0'
159
162
  requirements: []
160
- rubyforge_project: msgpack
161
- rubygems_version: 2.7.6
163
+ rubygems_version: 3.0.3
162
164
  signing_key:
163
165
  specification_version: 4
164
166
  summary: MessagePack, a binary-based efficient data interchange format.
@@ -184,5 +186,6 @@ test_files:
184
186
  - spec/packer_spec.rb
185
187
  - spec/random_compat.rb
186
188
  - spec/spec_helper.rb
189
+ - spec/timestamp_spec.rb
187
190
  - spec/unpack_spec.rb
188
191
  - spec/unpacker_spec.rb