You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by jd...@apache.org on 2023/09/30 08:33:57 UTC
[qpid-python] 03/05: QPID-8631: add encodings for Python 3 types
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 <jd...@redhat.com>
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: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org