diff --git a/capnp/lib/capnp.pyx b/capnp/lib/capnp.pyx index 290c4cf..ab65392 100644 --- a/capnp/lib/capnp.pyx +++ b/capnp/lib/capnp.pyx @@ -679,7 +679,7 @@ cdef _setBytes(_DynamicSetterClasses thisptr, field, value): thisptr.set(field, temp) cdef _setBaseString(_DynamicSetterClasses thisptr, field, value): - encoded_value = value.encode() + encoded_value = value.encode('utf-8') cdef capnp.StringPtr temp_string = capnp.StringPtr(encoded_value, len(encoded_value)) cdef C_DynamicValue.Reader temp = C_DynamicValue.Reader(temp_string) thisptr.set(field, temp) @@ -690,7 +690,7 @@ cdef _setBytesField(DynamicStruct_Builder thisptr, _StructSchemaField field, val thisptr.setByField(field.thisptr, temp) cdef _setBaseStringField(DynamicStruct_Builder thisptr, _StructSchemaField field, value): - encoded_value = value.encode() + encoded_value = value.encode('utf-8') cdef capnp.StringPtr temp_string = capnp.StringPtr(encoded_value, len(encoded_value)) cdef C_DynamicValue.Reader temp = C_DynamicValue.Reader(temp_string) thisptr.setByField(field.thisptr, temp) @@ -1025,7 +1025,7 @@ cdef class _DynamicStructReader: try: return self._get(field) except KjException as e: - raise e._to_python() + raise e._to_python(), None, _sys.exc_info()[2] cpdef _get_by_field(self, _StructSchemaField field): return to_python_reader(self.thisptr.getByField(field.thisptr), self._parent) @@ -1225,7 +1225,7 @@ cdef class _DynamicStructBuilder: try: return self._get(field) except KjException as e: - raise e._to_python() + raise e._to_python(), None, _sys.exc_info()[2] cpdef _set(self, field, value): _setDynamicField(self.thisptr, field, value, self._parent) @@ -1237,7 +1237,7 @@ cdef class _DynamicStructBuilder: try: self._set(field, value) except KjException as e: - raise e._to_python() + raise e._to_python(), None, _sys.exc_info()[2] cpdef _has(self, field): return self.thisptr.has(field) @@ -1456,7 +1456,7 @@ cdef class _DynamicStructPipeline: try: return self._get(field) except KjException as e: - raise e._to_python() + raise e._to_python(), None, _sys.exc_info()[2] property schema: """A property that returns the _StructSchema object matching this reader""" @@ -1936,7 +1936,7 @@ cdef class _RemotePromise: try: return self._get(field) except KjException as e: - raise e._to_python() + raise e._to_python(), None, _sys.exc_info()[2] property schema: """A property that returns the _StructSchema object matching this reader""" @@ -2039,7 +2039,7 @@ cdef class _DynamicCapabilityServer: try: return getattr(self.server, field) except KjException as e: - raise e._to_python() + raise e._to_python(), None, _sys.exc_info()[2] cdef class _DynamicCapabilityClient: cdef C_DynamicCapability.Client thisptr @@ -2121,7 +2121,7 @@ cdef class _DynamicCapabilityClient: raise AttributeError('Method named %s not found' % name) return _partial(self._send, name) except KjException as e: - raise e._to_python() + raise e._to_python(), None, _sys.exc_info()[2] cpdef upcast(self, schema) except +reraise_kj_exception: cdef _InterfaceSchema s diff --git a/capnp/templates/module.pyx b/capnp/templates/module.pyx index df45582..943e802 100644 --- a/capnp/templates/module.pyx +++ b/capnp/templates/module.pyx @@ -90,7 +90,7 @@ cpdef _set_{{field.name}}(self, value): if type(value) is bytes: temp_string = StringPtr(value, len(value)) else: - encoded_value = value.encode() + encoded_value = value.encode('utf-8') temp_string = StringPtr(encoded_value, len(encoded_value)) self.thisptr_child.set{{field.c_name}}(temp_string) {% elif 'data' == field['type'] -%} @@ -99,7 +99,7 @@ cpdef _set_{{field.name}}(self, value): if type(value) is bytes: temp_string = StringPtr(value, len(value)) else: - encoded_value = value.encode() + encoded_value = value.encode('utf-8') temp_string = StringPtr(encoded_value, len(encoded_value)) self.thisptr_child.set{{field.c_name}}(ArrayPtr[byte](temp_string.begin(), temp_string.size())) {% else -%} @@ -133,40 +133,6 @@ cdef _from_list(_DynamicListBuilder msg, list d): msg._set(count, val) count += 1 -cdef DynamicValue.Reader to_dynamic_value(value): - cdef DynamicValue.Reader temp - cdef StringPtr temp_string - value_type = type(value) - - if value_type is int or value_type is long: - if value < 0: - temp = DynamicValue.Reader(value) - else: - temp = DynamicValue.Reader(value) - elif value_type is float: - temp = DynamicValue.Reader(value) - elif value_type is bool: - temp = DynamicValue.Reader(value) - elif value_type is bytes: - temp_string = StringPtr(value, len(value)) - temp = DynamicValue.Reader(temp_string) - elif isinstance(value, basestring): - encoded_value = value.encode() - temp_string = StringPtr(encoded_value, len(encoded_value)) - temp = DynamicValue.Reader(temp_string) - elif value is None: - temp = DynamicValue.Reader(VOID) - elif value_type is _DynamicStructBuilder: - temp = _extract_dynamic_struct_builder(value) - elif value_type is _DynamicStructReader: - temp = _extract_dynamic_struct_reader(value) - elif value_type is _DynamicEnum: - temp = _extract_dynamic_enum(value) - else: - raise ValueError("Tried to convert value of: '{}' which is an unsupported type: '{}'".format(str(value), str(type(value)))) - - return temp - cdef extern from "{{file.filename}}.h": {%- for node in code.nodes %} diff --git a/test/all-types.binary b/test/all-types.binary index ea39763..3381caa 100644 Binary files a/test/all-types.binary and b/test/all-types.binary differ diff --git a/test/all-types.packed b/test/all-types.packed index 8627833..acb6086 100644 Binary files a/test/all-types.packed and b/test/all-types.packed differ diff --git a/test/all-types.txt b/test/all-types.txt index 079ff8d..a9e3dcc 100644 --- a/test/all-types.txt +++ b/test/all-types.txt @@ -25,7 +25,7 @@ uInt64Field = 345678901234567890, float32Field = -1.25e-10, float64Field = 345, - textField = "baz", + textField = "\xe2\x98\x83", dataField = "qux", structField = ( voidField = void, diff --git a/test/test_regression.py b/test/test_regression.py index d21c2f4..78f3fec 100644 --- a/test/test_regression.py +++ b/test/test_regression.py @@ -1,10 +1,19 @@ + # -*- coding: utf-8 -*- + import pytest import capnp import os import math +import sys this_dir = os.path.dirname(__file__) +if sys.version_info[0] < 3: + EXPECT_BYTES = True +else: + EXPECT_BYTES = False + + @pytest.fixture def addressbook(): return capnp.load(os.path.join(this_dir, 'addressbook.capnp')) @@ -300,7 +309,7 @@ def init_all_types(builder): subBuilder.uInt64Field = 345678901234567890 subBuilder.float32Field = -1.25e-10 subBuilder.float64Field = 345 - subBuilder.textField = "baz" + subBuilder.textField = b"\xe2\x98\x83".decode('utf-8') # This is u"☃", but py3.2 doesn't support u subBuilder.dataField = b"qux" subSubBuilder = subBuilder.structField subSubBuilder.textField = "nested" @@ -390,7 +399,15 @@ def check_all_types(reader): assert subReader.uInt64Field == 345678901234567890 assert_almost(subReader.float32Field, -1.25e-10) assert subReader.float64Field == 345 - assert subReader.textField == "baz" + + assert subReader.textField == "☃" + # This assertion highlights the encoding we expect to see here, since + # otherwise this appears a bit magical... + if EXPECT_BYTES: + assert len(subReader.textField) == 3 + else: + assert len(subReader.textField) == 1 + assert subReader.dataField == b"qux" subSubReader = subReader.structField