From 929d389f4b89420f58aa5133bae530482cb7d1c3 Mon Sep 17 00:00:00 2001 From: Brian Xu Date: Tue, 30 Sep 2025 17:13:37 +1000 Subject: [PATCH 1/4] change to_dict return bytes for DATA type --- capnp/lib/capnp.pyx | 11 ++++++++--- test/test_blob_to_dict_base64.py | 3 ++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/capnp/lib/capnp.pyx b/capnp/lib/capnp.pyx index b69e0926d..91aa9566f 100644 --- a/capnp/lib/capnp.pyx +++ b/capnp/lib/capnp.pyx @@ -1056,9 +1056,14 @@ cdef _to_dict(msg, bint verbose, bint ordered, bint encode_bytes_as_base64=False if msg_type is _DynamicEnum: return str(msg) - if encode_bytes_as_base64 and msg_type is bytes: - # encode the message as base64 and return utf-8 string - return base64.b64encode(msg).decode('utf-8') + if encode_bytes_as_base64: + if msg_type is bytes: + return base64.b64encode(msg).decode('utf-8') + elif msg_type is memoryview: + return base64.b64encode(bytes(msg)).decode('utf-8') + else: + if msg_type is memoryview: + return bytes(msg) return msg diff --git a/test/test_blob_to_dict_base64.py b/test/test_blob_to_dict_base64.py index c6f7a03b8..5e70f7ebf 100644 --- a/test/test_blob_to_dict_base64.py +++ b/test/test_blob_to_dict_base64.py @@ -1,5 +1,6 @@ import os import capnp +import base64 import pytest this_dir = os.path.dirname(__file__) @@ -14,7 +15,7 @@ def test_blob_to_dict(blob_schema): blob_value = b"hello world" blob = blob_schema.BlobTest(blob=blob_value) blob_dict = blob.to_dict(encode_bytes_as_base64=True) - assert blob_dict["blob"].tobytes() == blob_value + assert base64.b64decode(blob_dict["blob"]) == blob_value msg = blob_schema.BlobTest.new_message() msg.from_dict(blob_dict) assert blob.blob == blob_value From 4d73e43bead208c828641f085b05277051e0f39d Mon Sep 17 00:00:00 2001 From: Brian Xu Date: Tue, 30 Sep 2025 17:47:42 +1000 Subject: [PATCH 2/4] reformat --- capnp/lib/capnp.pyx | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/capnp/lib/capnp.pyx b/capnp/lib/capnp.pyx index 91aa9566f..9dae0e8e9 100644 --- a/capnp/lib/capnp.pyx +++ b/capnp/lib/capnp.pyx @@ -1058,11 +1058,16 @@ cdef _to_dict(msg, bint verbose, bint ordered, bint encode_bytes_as_base64=False if encode_bytes_as_base64: if msg_type is bytes: - return base64.b64encode(msg).decode('utf-8') - elif msg_type is memoryview: + # encode the message as base64 and return utf-8 string + + if encode_bytes_as_base64 and msg_type is bytes: + # encode the message as base64 and return utf-8 string + return base64.b64encode(msg).decode('utf-8') + + if msg_type is memoryview: + if encode_bytes_as_base64: return base64.b64encode(bytes(msg)).decode('utf-8') - else: - if msg_type is memoryview: + else: return bytes(msg) return msg From d171ce1e586f7502cb16ff8737b5547fc3d34216 Mon Sep 17 00:00:00 2001 From: Brian Xu Date: Tue, 30 Sep 2025 17:48:32 +1000 Subject: [PATCH 3/4] reformat --- capnp/lib/capnp.pyx | 4 ---- 1 file changed, 4 deletions(-) diff --git a/capnp/lib/capnp.pyx b/capnp/lib/capnp.pyx index 9dae0e8e9..ae8c4f1e4 100644 --- a/capnp/lib/capnp.pyx +++ b/capnp/lib/capnp.pyx @@ -1056,10 +1056,6 @@ cdef _to_dict(msg, bint verbose, bint ordered, bint encode_bytes_as_base64=False if msg_type is _DynamicEnum: return str(msg) - if encode_bytes_as_base64: - if msg_type is bytes: - # encode the message as base64 and return utf-8 string - if encode_bytes_as_base64 and msg_type is bytes: # encode the message as base64 and return utf-8 string return base64.b64encode(msg).decode('utf-8') From cfe515bca0914589a8dcc0f734a58471a93b026f Mon Sep 17 00:00:00 2001 From: Brian Xu Date: Tue, 30 Sep 2025 18:16:43 +1000 Subject: [PATCH 4/4] add includes .h --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index 60c5ab7fe..ea4bc830a 100644 --- a/setup.py +++ b/setup.py @@ -222,6 +222,7 @@ def run(self): # noqa: C901 "*.capnp", "helpers/*.pxd", "helpers/*.h", + "includes/*.h", "includes/*.pxd", "lib/*.pxd", "lib/*.py",