This PR is for resolving the following issue: [issue](https://github.com/capnproto/pycapnp/issues/379) 1. Created `_PyCustomMessageBuilder` extends `MessageBuilder`, enabling the ability to customise the `SegmentAllocate` method in Python. This allows allocation and data population within shared memory, and supports zero-copy inter-process data transfer by passing segment offsets. 2. Fields of type `Data` now support being set with a `memoryview`. When retrieving a `Data` field from a `DynamicStructBuilder`, it will return a writable `memoryview`, allowing users to modify the data directly. This enables memory to be pre-allocated and content to be modified in later, eliminating an extra copy. When retrieving a `Data` field from a `DynamicStructReader`, it will return a read-only `memoryview`, allowing user to read data without memory copy. * add memoryview and custom builder * support set dynamic field * add curSize * add initialSize and lastSize * change StringPtr name * add test case * refine test case * convert func to py callable object * add initial value * refine example * add copy as_reader and new_message, make structReader's data field return RO memoryView * rebase master and bugfix * reformat flake8 * refine test case * refine test cases for blob * remove unused import for flake8 * run black . --------- Co-authored-by: Brian Xu <brian.xu1@bytedance.com>
21 lines
516 B
Python
21 lines
516 B
Python
import os
|
|
import capnp
|
|
import pytest
|
|
|
|
this_dir = os.path.dirname(__file__)
|
|
|
|
|
|
@pytest.fixture
|
|
def blob_schema():
|
|
return capnp.load(os.path.join(this_dir, "blob_test.capnp"))
|
|
|
|
|
|
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
|
|
msg = blob_schema.BlobTest.new_message()
|
|
msg.from_dict(blob_dict)
|
|
assert blob.blob == blob_value
|