Skip to main content

thin wrapper around msgpack to deal with naive datetime and ruamel defined extension types

Project description

ruamel.ext.msgpack is a thin wrapper around msgpack, that deals with naive datetime instances and ruamel defined extension types (date).

https://sourceforge.net/p/ruamel-ext-msgpack/code/ci/default/tree/_doc/_static/license.svg?format=raw https://sourceforge.net/p/ruamel-ext-msgpack/code/ci/default/tree/_doc/_static/pypi.svg?format=raw https://sourceforge.net/p/oitnb/code/ci/default/tree/_doc/_static/oitnb.svg?format=raw

naive datetime.datetime

If you try to pack a naive datetime.datetime instance, you’ll get an error:

import datetime
from msgpack import packb

try:
    packb(datetime.datetime(2011, 10, 2), datetime=True)
except Exception as e:
    print('exception:', type(e), e)

which will print:

exception: <class 'ValueError'> can not serialize 'datetime.datetime' object where tzinfo=None

using pack/packb from ruamel.ext.msgpack will prevent this from happening, without having to go over the data structure and replacing all naive datetime.datetime instances. It will provide both an argument to default that handles the naive datetimestamp and some Ext types, set use_bin_type=True and datetime=True.

import sys
import datetime
from ruamel.ext.msgpack import packb, unpackb

res = packb(datetime.datetime(2011, 10, 2, 17, 15, 1))
print(unpackb(res))

which will print:

2011-10-02 17:15:01+00:00

as you can see from the output this will make the instance, that was read back, timezone aware.

use_bin_type=True

The pack and packb routines do not change the default use_bin_type=True. So the UTF-8 “bytestrings” get dumped as bin 8/16/32 and not as the slightly more efficient “fixstr” for strings up to a length of 31 bytes. In the following the function hex() returns a string of hexadecimal values from the bytes array passed into it:

from ruamel.ext.msgpack import packb, unpackb, hex

res = packb('こんにちは世界')
print(hex(res), len(res))
print(unpackb(res))
res = packb('こんにちは世界'.encode('utf-8'))
print(hex(res), len(res))
print(unpackb(res))

\xb5 indicates “fixstr” of length 21, \xc4\x15 indicates “bin 8” of length 21

\xb5\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf\xe4\xb8\x96\xe7\x95\x8c 22
こんにちは世界
\xc4\x15\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf\xe4\xb8\x96\xe7\x95\x8c 23
b'\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf\xe4\xb8\x96\xe7\x95\x8c'

If you don’t need byte arrays, and want conversion done of bytes to str on msgpack-roundtrip, an alternate version of pack/unpack can be constructed, that still handles naive datetime objects, and the other types provided by ruamel.ext.msgpack:

from functools import partial
from ruamel.ext.msgpack import hex, unpackb, msgpack_default
import msgpack

pack = partial(msgpack.pack, default=msgpack_default, use_bin_type=False, datetime=True)
packb = partial(msgpack.packb, default=msgpack_default, use_bin_type=False, datetime=True)

res = packb('こんにちは世界'.encode('utf-8'))
print(hex(res), len(res))
print(unpackb(res))

Although packing bytes, now \xb5 indicates “fixstr” of length 21, and the unpacking results in a str:

\xb5\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf\xe4\xb8\x96\xe7\x95\x8c 22
こんにちは世界

extension types

The following extension types are provided by ruamel.ext.msgpack. Each has associated attribute on msgpack_default with the type number. This number can be changed, but the same numbers should be used for packing and unpacking. If a number is set to None the associated type will not be packed or unpacked. The type used for naive datetime.datetime, -1, cannot be changed.

datetime.date

Python’s datetime.date instances are packed in a two bytes stucture for dates in the range 2000-01-01 and 2126-12-31.

import datetime
from ruamel.ext.msgpack import packb, unpackb, hex, msgpack_default

res = packb(datetime.date(2011, 10, 2))
print('hex:', hex(res), len(res))
print(unpackb(res))
print(f'{msgpack_default.date=}')

msgpack_default.date = 42
res = packb(datetime.date(2011, 10, 2))
print('hex:', hex(res), len(res))
print(unpackb(res))

try:
    msgpack_default.date = None
    res = packb(datetime.date(2011, 10, 2))
except Exception as e:
    print('exception:', type(e), e)

which will print:

hex: \xd5\x11\x17\x82 4
2011-10-02
msgpack_default.date=17
hex: \xd5\x11\x17\x82 4
2011-10-02

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ruamel.ext.msgpack-0.2.2.tar.gz (14.7 kB view details)

Uploaded Source

Built Distribution

ruamel.ext.msgpack-0.2.2-py3-none-any.whl (6.0 kB view details)

Uploaded Python 3

File details

Details for the file ruamel.ext.msgpack-0.2.2.tar.gz.

File metadata

  • Download URL: ruamel.ext.msgpack-0.2.2.tar.gz
  • Upload date:
  • Size: 14.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.5

File hashes

Hashes for ruamel.ext.msgpack-0.2.2.tar.gz
Algorithm Hash digest
SHA256 51e9ebd1d28245a6816eb7aad2f8d672ff921d2c55e864cd68b8cb798f6753d6
MD5 02fe63f8662e60c5dad431abefd0a2b0
BLAKE2b-256 b59435e8e0cac3a5d6ac51efe039373e141c373417d88c22140726a65719d037

See more details on using hashes here.

File details

Details for the file ruamel.ext.msgpack-0.2.2-py3-none-any.whl.

File metadata

File hashes

Hashes for ruamel.ext.msgpack-0.2.2-py3-none-any.whl
Algorithm Hash digest
SHA256 7a0ec51f0a7e7fa0f078bf1d1e1d3f643b055a2446fb230444979253e31f394c
MD5 e1f085e0871b2df23b36abffae61e378
BLAKE2b-256 d5ebe25e14f825fe88e5f4f51455db62b7c329b96d2a68eb8aa47f7e382612c5

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page