This is an automated email from the ASF dual-hosted git repository. jdanek pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/qpid-python.git
commit 2e65fb29b98749e8bf4d5e6cae8f11f12f0562dd Author: Jiri Daněk <[email protected]> AuthorDate: Fri Sep 29 14:36:26 2023 +0200 QPID-8631: add encodings for Python 3 types --- qpid/codec.py | 12 ++++++------ qpid/codec010.py | 38 ++++++++++++++++++++++++++++++++++---- 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/qpid/codec.py b/qpid/codec.py index f302955..3b61677 100644 --- a/qpid/codec.py +++ b/qpid/codec.py @@ -34,11 +34,6 @@ from struct import * from .reference import ReferenceId from logging import getLogger -try: - basestring -except: - basestring = bytes - try: unicode except NameError: @@ -92,7 +87,8 @@ class Codec: self.integertypes = [int, long] self.encodings = { float: "double", # python uses 64bit floats, send them as doubles - basestring: "longstr", + bytes: "longstr", + unicode: "longstr", None.__class__:"void", list: "sequence", tuple: "sequence", @@ -403,6 +399,8 @@ class Codec: """ encodes a string 's' in network byte order as per format 'fmt' """ + if not isinstance(s, bytes): + s = s.encode() size = len(s) self.pack(fmt, size) self.write(s) @@ -418,6 +416,8 @@ class Codec: """ encodes a short string 's' in network byte order """ + if not isinstance(s, bytes): + s.encode() # short strings are limited to 255 octets if len(s) > 255: diff --git a/qpid/codec010.py b/qpid/codec010.py index f742d4a..eff003a 100644 --- a/qpid/codec010.py +++ b/qpid/codec010.py @@ -22,6 +22,7 @@ import datetime from .packer import Packer from .datatypes import serial, timestamp, RangedSet, Struct, UUID from .ops import Compound, PRIMITIVE, COMPOUND +from qpid.py3compat import PY2 try: buffer @@ -49,9 +50,9 @@ def map_str(s): return "vbin16" return "str16" -class Codec(Packer): - ENCODINGS = { +if PY2: + _ENCODINGS = { bool: direct("boolean"), unicode: direct("str16"), str: map_str, @@ -68,6 +69,28 @@ class Codec(Packer): UUID: direct("uuid"), Compound: direct("struct32") } +else: + _ENCODINGS = { + bool: direct("boolean"), + int: direct("int64"), + float: direct("double"), + None.__class__: direct("void"), + list: direct("list"), + tuple: direct("list"), + dict: direct("map"), + timestamp: direct("datetime"), + datetime.datetime: direct("datetime"), + UUID: direct("uuid"), + Compound: direct("struct32"), + + str: direct("str16"), + bytes: direct("vbin16"), + memoryview: direct("vbin32"), + } + +class Codec(Packer): + + ENCODINGS = _ENCODINGS def encoding(self, obj): enc = self._encoding(obj.__class__, obj) @@ -180,6 +203,9 @@ class Codec(Packer): def write_datetime(self, t): if isinstance(t, datetime.datetime): t = timestamp(t) + # python2 does this conversion implicitly in struct.pack("!Q", ...) + if isinstance(t, timestamp): + t = int(t) self.write_uint64(t) def read_double(self): @@ -191,7 +217,9 @@ class Codec(Packer): return self.read(self.read_uint8()) def write_vbin8(self, b): if isinstance(b, buffer): - b = str(b) + b = bytes(b) + if not isinstance(b, bytes): + b = b.encode() self.write_uint8(len(b)) self.write(b) @@ -215,7 +243,9 @@ class Codec(Packer): return self.read(self.read_uint16()) def write_vbin16(self, b): if isinstance(b, buffer): - b = str(b) + b = bytes(b) + if not isinstance(b, bytes): + b = b.encode() self.write_uint16(len(b)) self.write(b) --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
