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).

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 timezone aware.

use_bin_type=False

The pack and packb routines set use_bin_type=False. So the UTF-8 “bytestrings” get dumped as “fixstr”, “str 8/16/32”, and those will load as str back into Python (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('こんにちは世界'.encode('utf-8'))
print(hex(res), len(res))
print(unpackb(res))

\xb5 indicates “fixstr” 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
こんにちは世界

If you need byte arrays, an alternate version of pack/unpack can be constructed, that still handle naive datetime objects, and the other types:

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=True, datetime=True)
packb = partial(msgpack.packb, default=msgpack_default, use_bin_type=True, datetime=True)

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

\xc4\x15 indicates “bin 8” of length 21

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.

\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'
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\x2a\x17\x82 4
2011-10-02
exception: <class 'ValueError'> year out of range 2000-2126

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.1.0.tar.gz (13.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ruamel.ext.msgpack-0.1.0-py3-none-any.whl (5.3 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for ruamel.ext.msgpack-0.1.0.tar.gz
Algorithm Hash digest
SHA256 c5f47059bedd990fb3e9f61a8c0a88934e6b983d1fec15c314fc6ad327c930cd
MD5 0a2f6230534f2fc2c18e5e9c27b0e614
BLAKE2b-256 ccffaa3cc492af399ff9346a4e1bb8c775040cb867fe3ef7ff610b6a3512fdce

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruamel.ext.msgpack-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 8bb1fae69b9c1be4de24dd7587c9f7358106c3eca8692b7425a7fe4e1f72acb8
MD5 12afbd866a7f9e189ecb8e6038393c1c
BLAKE2b-256 2c7dd7423ee017eb8e379b3a45c325cbfe7ce3591d9d5fbe9f8d968c3f4527ce

See more details on using hashes here.

Supported by

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