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