Hello community,
here is the log from the commit of package rubygem-msgpack for openSUSE:Factory
checked in at 2019-07-08 15:12:44
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/rubygem-msgpack (Old)
and /work/SRC/openSUSE:Factory/.rubygem-msgpack.new.4615 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "rubygem-msgpack"
Mon Jul 8 15:12:44 2019 rev:10 rq:714009 version:1.3.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/rubygem-msgpack/rubygem-msgpack.changes
2019-06-19 21:00:40.614102033 +0200
+++
/work/SRC/openSUSE:Factory/.rubygem-msgpack.new.4615/rubygem-msgpack.changes
2019-07-08 16:41:03.924963363 +0200
@@ -1,0 +2,7 @@
+Mon Jul 8 08:32:18 UTC 2019 - Manuel Schnitzer <[email protected]>
+
+- updated to version 1.3.0
+
+ * Add timestamp ext type (id:-1) support
+
+-------------------------------------------------------------------
Old:
----
msgpack-1.2.10.gem
New:
----
msgpack-1.3.0.gem
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ rubygem-msgpack.spec ++++++
--- /var/tmp/diff_new_pack.CSI420/_old 2019-07-08 16:41:04.492964169 +0200
+++ /var/tmp/diff_new_pack.CSI420/_new 2019-07-08 16:41:04.496964174 +0200
@@ -24,7 +24,7 @@
#
Name: rubygem-msgpack
-Version: 1.2.10
+Version: 1.3.0
Release: 0
%define mod_name msgpack
%define mod_full_name %{mod_name}-%{version}
++++++ msgpack-1.2.10.gem -> msgpack-1.3.0.gem ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/.rubocop.yml new/.rubocop.yml
--- old/.rubocop.yml 2019-04-19 03:15:28.000000000 +0200
+++ new/.rubocop.yml 2019-06-20 09:16:11.000000000 +0200
@@ -5,6 +5,9 @@
# Note that changes in the inspected code, or installation of new
# versions of RuboCop, may require this file to be generated again.
+AllCops:
+ TargetRubyVersion: 2.3
+
# Offense count: 3
Lint/AmbiguousOperator:
Enabled: false
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ChangeLog new/ChangeLog
--- old/ChangeLog 2019-04-19 03:15:28.000000000 +0200
+++ new/ChangeLog 2019-06-20 09:16:11.000000000 +0200
@@ -1,3 +1,7 @@
+2019-06-20 verison 1.3.0:
+
+* Add timestamp ext type (id:-1) support
+
2019-04-19 version 1.2.10:
* Optimze MessagePack.unpack not to copy source string
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/README.rdoc new/README.rdoc
--- old/README.rdoc 2019-04-19 03:15:28.000000000 +0200
+++ new/README.rdoc 2019-06-20 09:16:11.000000000 +0200
@@ -121,6 +121,22 @@
[1, :symbol, 'string'].to_msgpack # => RuntimeError: Serialization of
symbols prohibited
+= Serializing and deserializing Time instances
+
+There are the timestamp extension type in MessagePack,
+but it is not registered by default.
+
+To map Ruby's Time to MessagePack's timestamp for the default factory:
+
+ MessagePack::DefaultFactory.register_type(
+ MessagePack::Timestamp::TYPE, # or just -1
+ Time,
+ packer: MessagePack::Time::Packer,
+ unpacker: MessagePack::Time::Unpacker
+ )
+
+See {API reference}[http://ruby.msgpack.org/] for details.
+
= Extension Types
Packer and Unpacker support {Extension types of
MessagePack}[https://github.com/msgpack/msgpack/blob/master/spec.md#types-extension-type].
Binary files old/checksums.yaml.gz and new/checksums.yaml.gz differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/doclib/msgpack/time.rb new/doclib/msgpack/time.rb
--- old/doclib/msgpack/time.rb 1970-01-01 01:00:00.000000000 +0100
+++ new/doclib/msgpack/time.rb 2019-06-20 09:16:11.000000000 +0200
@@ -0,0 +1,22 @@
+module MessagePack
+
+ # MessagePack::Time provides packer and unpacker functions for a timestamp
type.
+ # @example Setup for DefaultFactory
+ # MessagePack::DefaultFactory.register_type(
+ # MessagePack::Timestamp::TYPE,
+ # Time,
+ # packer: MessagePack::Time::Packer,
+ # unpacker: MessagePack::Time::Unpacker
+ # )
+ class Time
+ # A packer function that packs a Time instance to a MessagePack timestamp.
+ Packer = lambda { |payload|
+ # ...
+ }
+
+ # An unpacker function that unpacks a MessagePack timestamp to a Time
instance.
+ Unpcker = lambda { |time|
+ # ...
+ }
+ end
+end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/doclib/msgpack/timestamp.rb
new/doclib/msgpack/timestamp.rb
--- old/doclib/msgpack/timestamp.rb 1970-01-01 01:00:00.000000000 +0100
+++ new/doclib/msgpack/timestamp.rb 2019-06-20 09:16:11.000000000 +0200
@@ -0,0 +1,44 @@
+module MessagePack
+ # A utility class for MessagePack timestamp type
+ class Timestamp
+ #
+ # The timestamp extension type defined in the MessagePack spec.
+ #
+ # See
https://github.com/msgpack/msgpack/blob/master/spec.md#timestamp-extension-type
for details.
+ #
+ TYPE = -1
+
+ # @return [Integer] Second part of the timestamp.
+ attr_reader :sec
+
+ # @return [Integer] Nanosecond part of the timestamp.
+ attr_reader :nsec
+
+ # @param [Integer] sec
+ # @param [Integer] nsec
+ def initialize(sec, nsec)
+ end
+
+ # @example An unpacker implementation for the Time class
+ # lambda do |payload|
+ # tv = MessagePack::Timestamp.from_msgpack_ext(payload)
+ # Time.at(tv.sec, tv.nsec, :nanosecond)
+ # end
+ #
+ # @param [String] data
+ # @return [MessagePack::Timestamp]
+ def self.from_msgpack_ext(data)
+ end
+
+ # @example A packer implementation for the Time class
+ # unpacker = lambda do |time|
+ # MessagePack::Timestamp.to_msgpack_ext(time.tv_sec, time.tv_nsec)
+ # end
+ #
+ # @param [Integer] sec
+ # @param [Integer] nsec
+ # @return [String]
+ def self.to_msgpack_ext(sec, nsec)
+ end
+ end
+end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/lib/msgpack/time.rb new/lib/msgpack/time.rb
--- old/lib/msgpack/time.rb 1970-01-01 01:00:00.000000000 +0100
+++ new/lib/msgpack/time.rb 2019-06-20 09:16:11.000000000 +0200
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+# MessagePack extention packer and unpacker for built-in Time class
+module MessagePack
+ module Time
+ # 3-arg Time.at is available Ruby >= 2.5
+ TIME_AT_3_AVAILABLE = begin
+ !!::Time.at(0, 0, :nanosecond)
+ rescue ArgumentError
+ false
+ end
+
+ Unpacker = if TIME_AT_3_AVAILABLE
+ lambda do |payload|
+ tv = MessagePack::Timestamp.from_msgpack_ext(payload)
+ ::Time.at(tv.sec, tv.nsec, :nanosecond)
+ end
+ else
+ lambda do |payload|
+ tv = MessagePack::Timestamp.from_msgpack_ext(payload)
+ ::Time.at(tv.sec, tv.nsec / 1000.0)
+ end
+ end
+
+ Packer = lambda { |time|
+ MessagePack::Timestamp.to_msgpack_ext(time.tv_sec, time.tv_nsec)
+ }
+ end
+end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/lib/msgpack/timestamp.rb new/lib/msgpack/timestamp.rb
--- old/lib/msgpack/timestamp.rb 1970-01-01 01:00:00.000000000 +0100
+++ new/lib/msgpack/timestamp.rb 2019-06-20 09:16:11.000000000 +0200
@@ -0,0 +1,76 @@
+# frozen_string_literal: true
+
+module MessagePack
+ class Timestamp # a.k.a. "TimeSpec"
+ # Because the byte-order of MessagePack is big-endian in,
+ # pack() and unpack() specifies ">".
+ # See https://docs.ruby-lang.org/en/trunk/Array.html#method-i-pack for
details.
+
+ # The timestamp extension type defined in the MessagePack spec.
+ # See
https://github.com/msgpack/msgpack/blob/master/spec.md#timestamp-extension-type
for details.
+ TYPE = -1
+
+ TIMESTAMP32_MAX_SEC = (1 << 32) - 1
+ TIMESTAMP64_MAX_SEC = (1 << 34) - 1
+
+ # @return [Integer]
+ attr_reader :sec
+
+ # @return [Integer]
+ attr_reader :nsec
+
+ # @param [Integer] sec
+ # @param [Integer] nsec
+ def initialize(sec, nsec)
+ @sec = sec
+ @nsec = nsec
+ end
+
+ def self.from_msgpack_ext(data)
+ case data.length
+ when 4
+ # timestamp32 (sec: uint32be)
+ sec, = data.unpack('L>')
+ new(sec, 0)
+ when 8
+ # timestamp64 (nsec: uint30be, sec: uint34be)
+ n, s = data.unpack('L>2')
+ sec = ((n & 0b11) << 32) | s
+ nsec = n >> 2
+ new(sec, nsec)
+ when 12
+ # timestam96 (nsec: uint32be, sec: int64be)
+ nsec, sec = data.unpack('L>q>')
+ new(sec, nsec)
+ else
+ raise MalformedFormatError, "Invalid timestamp data size:
#{data.length}"
+ end
+ end
+
+ def self.to_msgpack_ext(sec, nsec)
+ if sec >= 0 && nsec >= 0 && sec <= TIMESTAMP64_MAX_SEC
+ if nsec === 0 && sec <= TIMESTAMP32_MAX_SEC
+ # timestamp32 = (sec: uint32be)
+ [sec].pack('L>')
+ else
+ # timestamp64 (nsec: uint30be, sec: uint34be)
+ nsec30 = nsec << 2
+ sec_high2 = sec << 32 # high 2 bits (`x & 0b11` is redandunt)
+ sec_low32 = sec & 0xffffffff # low 32 bits
+ [nsec30 | sec_high2, sec_low32].pack('L>2')
+ end
+ else
+ # timestamp96 (nsec: uint32be, sec: int64be)
+ [nsec, sec].pack('L>q>')
+ end
+ end
+
+ def to_msgpack_ext
+ self.class.to_msgpack_ext(sec, nsec)
+ end
+
+ def ==(other)
+ other.class == self.class && sec == other.sec && nsec == other.nsec
+ end
+ end
+end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/lib/msgpack/version.rb new/lib/msgpack/version.rb
--- old/lib/msgpack/version.rb 2019-04-19 03:15:28.000000000 +0200
+++ new/lib/msgpack/version.rb 2019-06-20 09:16:11.000000000 +0200
@@ -1,5 +1,5 @@
module MessagePack
- VERSION = "1.2.10"
+ VERSION = "1.3.0"
# NOTE for msgpack-ruby maintainer:
# Check these things to release new binaryes for new Ruby versions
(especially for Windows):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/lib/msgpack.rb new/lib/msgpack.rb
--- old/lib/msgpack.rb 2019-04-19 03:15:28.000000000 +0200
+++ new/lib/msgpack.rb 2019-06-20 09:16:11.000000000 +0200
@@ -17,6 +17,8 @@
require "msgpack/factory"
require "msgpack/symbol"
require "msgpack/core_ext"
+require "msgpack/timestamp"
+require "msgpack/time"
module MessagePack
DefaultFactory = MessagePack::Factory.new
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/metadata new/metadata
--- old/metadata 2019-04-19 03:15:28.000000000 +0200
+++ new/metadata 2019-06-20 09:16:11.000000000 +0200
@@ -1,7 +1,7 @@
--- !ruby/object:Gem::Specification
name: msgpack
version: !ruby/object:Gem::Version
- version: 1.2.10
+ version: 1.3.0
platform: ruby
authors:
- Sadayuki Furuhashi
@@ -10,7 +10,7 @@
autorequire:
bindir: bin
cert_chain: []
-date: 2019-04-19 00:00:00.000000000 Z
+date: 2019-06-20 00:00:00.000000000 Z
dependencies:
- !ruby/object:Gem::Dependency
name: bundler
@@ -148,6 +148,8 @@
- doclib/msgpack/extension_value.rb
- doclib/msgpack/factory.rb
- doclib/msgpack/packer.rb
+- doclib/msgpack/time.rb
+- doclib/msgpack/timestamp.rb
- doclib/msgpack/unpacker.rb
- ext/java/org/msgpack/jruby/Buffer.java
- ext/java/org/msgpack/jruby/Decoder.java
@@ -192,6 +194,8 @@
- lib/msgpack/factory.rb
- lib/msgpack/packer.rb
- lib/msgpack/symbol.rb
+- lib/msgpack/time.rb
+- lib/msgpack/timestamp.rb
- lib/msgpack/unpacker.rb
- lib/msgpack/version.rb
- msgpack.gemspec
@@ -217,6 +221,7 @@
- spec/packer_spec.rb
- spec/random_compat.rb
- spec/spec_helper.rb
+- spec/timestamp_spec.rb
- spec/unpack_spec.rb
- spec/unpacker_spec.rb
homepage: http://msgpack.org/
@@ -264,5 +269,6 @@
- spec/packer_spec.rb
- spec/random_compat.rb
- spec/spec_helper.rb
+- spec/timestamp_spec.rb
- spec/unpack_spec.rb
- spec/unpacker_spec.rb
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/spec/timestamp_spec.rb new/spec/timestamp_spec.rb
--- old/spec/timestamp_spec.rb 1970-01-01 01:00:00.000000000 +0100
+++ new/spec/timestamp_spec.rb 2019-06-20 09:16:11.000000000 +0200
@@ -0,0 +1,117 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe MessagePack::Timestamp do
+ describe 'malformed format' do
+ it do
+ expect do
+ MessagePack::Timestamp.from_msgpack_ext([0xd4, 0x00].pack("C*"))
+ end.to raise_error(MessagePack::MalformedFormatError)
+ end
+ end
+
+ describe 'register_type with Time' do
+ let(:factory) do
+ factory = MessagePack::Factory.new
+ factory.register_type(
+ MessagePack::Timestamp::TYPE,
+ Time,
+ packer: MessagePack::Time::Packer,
+ unpacker: MessagePack::Time::Unpacker
+ )
+ factory
+ end
+
+ let(:time) { Time.local(2019, 6, 17, 1, 2, 3, 123_456_789 / 1000.0) }
+ it 'serializes and deserializes Time' do
+ prefix_fixext8_with_type_id = [0xd7, -1].pack("c*")
+
+ packed = factory.pack(time)
+ expect(packed).to start_with(prefix_fixext8_with_type_id)
+ expect(packed.size).to eq(10)
+ unpacked = factory.unpack(packed)
+ expect(unpacked.to_i).to eq(time.to_i)
+ expect(unpacked.to_f).to eq(time.to_f)
+ # expect(unpacked).to eq(time) # we can't do it because of nsec
(rational vs float?)
+ end
+
+ let(:time_without_nsec) { Time.local(2019, 6, 17, 1, 2, 3, 0) }
+ it 'serializes time without nanosec as fixext4' do
+ prefix_fixext4_with_type_id = [0xd6, -1].pack("c*")
+
+ packed = factory.pack(time_without_nsec)
+ expect(packed).to start_with(prefix_fixext4_with_type_id)
+ expect(packed.size).to eq(6)
+ unpacked = factory.unpack(packed)
+ expect(unpacked).to eq(time_without_nsec)
+ end
+
+ let(:time_after_2514) { Time.at(1 << 34) } # the max num of 34bit int
means 2514-05-30 01:53:04 UTC
+ it 'serializes time after 2038 as ext8' do
+ prefix_ext8_with_12bytes_payload_and_type_id = [0xc7, 12, -1].pack("c*")
+
+ expect(time_after_2514.to_i).to be > 0xffffffff
+ packed = factory.pack(time_after_2514)
+ expect(packed).to
start_with(prefix_ext8_with_12bytes_payload_and_type_id)
+ expect(packed.size).to eq(15)
+ end
+ end
+
+ describe 'register_type with MessagePack::Timestamp' do
+ let(:factory) do
+ factory = MessagePack::Factory.new
+ factory.register_type(MessagePack::Timestamp::TYPE,
MessagePack::Timestamp)
+ factory
+ end
+
+ let(:timestamp) { MessagePack::Timestamp.new(Time.now.tv_sec, 123_456_789)
}
+ it 'serializes and deserializes MessagePack::Timestamp' do
+ packed = factory.pack(timestamp)
+ unpacked = factory.unpack(packed)
+ expect(unpacked).to eq(timestamp)
+ end
+ end
+
+ describe 'timestamp32' do
+ it 'handles [1, 0]' do
+ t = MessagePack::Timestamp.new(1, 0)
+
+ payload = t.to_msgpack_ext
+ unpacked = MessagePack::Timestamp.from_msgpack_ext(payload)
+
+ expect(unpacked).to eq(t)
+ end
+ end
+
+ describe 'timestamp64' do
+ it 'handles [1, 1]' do
+ t = MessagePack::Timestamp.new(1, 1)
+
+ payload = t.to_msgpack_ext
+ unpacked = MessagePack::Timestamp.from_msgpack_ext(payload)
+
+ expect(unpacked).to eq(t)
+ end
+ end
+
+ describe 'timestamp96' do
+ it 'handles [-1, 0]' do
+ t = MessagePack::Timestamp.new(-1, 0)
+
+ payload = t.to_msgpack_ext
+ unpacked = MessagePack::Timestamp.from_msgpack_ext(payload)
+
+ expect(unpacked).to eq(t)
+ end
+
+ it 'handles [-1, 999_999_999]' do
+ t = MessagePack::Timestamp.new(-1, 999_999_999)
+
+ payload = t.to_msgpack_ext
+ unpacked = MessagePack::Timestamp.from_msgpack_ext(payload)
+
+ expect(unpacked).to eq(t)
+ end
+ end
+end