feat: unpack header names as message kwargs (#82)
This commit is contained in:
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
@@ -65,7 +65,7 @@ jobs:
|
|||||||
poetry install
|
poetry install
|
||||||
fi
|
fi
|
||||||
- name: Test with Pytest
|
- name: Test with Pytest
|
||||||
run: export $(dbus-launch); poetry run pytest --cov-report=xml
|
run: export $(dbus-launch); poetry run pytest --cov-report=xml --timeout=5
|
||||||
- name: Upload coverage to Codecov
|
- name: Upload coverage to Codecov
|
||||||
uses: codecov/codecov-action@v3
|
uses: codecov/codecov-action@v3
|
||||||
with:
|
with:
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ cdef unsigned int HEADER_ARRAY_OF_STRUCT_SIGNATURE_POSITION
|
|||||||
cdef unsigned int HEADER_SIGNATURE_SIZE
|
cdef unsigned int HEADER_SIGNATURE_SIZE
|
||||||
cdef unsigned int LITTLE_ENDIAN
|
cdef unsigned int LITTLE_ENDIAN
|
||||||
cdef unsigned int BIG_ENDIAN
|
cdef unsigned int BIG_ENDIAN
|
||||||
|
cdef unsigned int PROTOCOL_VERSION
|
||||||
cdef str UINT32_CAST
|
cdef str UINT32_CAST
|
||||||
cdef str INT16_CAST
|
cdef str INT16_CAST
|
||||||
|
|
||||||
|
|||||||
@@ -9,13 +9,7 @@ from ..constants import MESSAGE_FLAG_MAP, MESSAGE_TYPE_MAP
|
|||||||
from ..errors import InvalidMessageError
|
from ..errors import InvalidMessageError
|
||||||
from ..message import Message
|
from ..message import Message
|
||||||
from ..signature import SignatureType, Variant, get_signature_tree
|
from ..signature import SignatureType, Variant, get_signature_tree
|
||||||
from .constants import (
|
from .constants import BIG_ENDIAN, LITTLE_ENDIAN, PROTOCOL_VERSION, HeaderField
|
||||||
BIG_ENDIAN,
|
|
||||||
HEADER_NAME_MAP,
|
|
||||||
LITTLE_ENDIAN,
|
|
||||||
PROTOCOL_VERSION,
|
|
||||||
HeaderField,
|
|
||||||
)
|
|
||||||
|
|
||||||
IS_LITTLE_ENDIAN = sys.byteorder == "little"
|
IS_LITTLE_ENDIAN = sys.byteorder == "little"
|
||||||
IS_BIG_ENDIAN = sys.byteorder == "big"
|
IS_BIG_ENDIAN = sys.byteorder == "big"
|
||||||
@@ -54,14 +48,19 @@ UINT32_UNPACK_BY_ENDIAN = {
|
|||||||
HEADER_SIGNATURE_SIZE = 16
|
HEADER_SIGNATURE_SIZE = 16
|
||||||
HEADER_ARRAY_OF_STRUCT_SIGNATURE_POSITION = 12
|
HEADER_ARRAY_OF_STRUCT_SIGNATURE_POSITION = 12
|
||||||
|
|
||||||
HEADER_DESTINATION = HeaderField.DESTINATION.name
|
|
||||||
HEADER_PATH = HeaderField.PATH.name
|
HEADER_MESSAGE_ARG_NAME = {
|
||||||
HEADER_INTERFACE = HeaderField.INTERFACE.name
|
1: "path",
|
||||||
HEADER_MEMBER = HeaderField.MEMBER.name
|
2: "interface",
|
||||||
HEADER_ERROR_NAME = HeaderField.ERROR_NAME.name
|
3: "member",
|
||||||
HEADER_REPLY_SERIAL = HeaderField.REPLY_SERIAL.name
|
4: "error_name",
|
||||||
HEADER_SENDER = HeaderField.SENDER.name
|
5: "reply_serial",
|
||||||
HEADER_SIGNATURE = HeaderField.SIGNATURE.name
|
6: "destination",
|
||||||
|
7: "sender",
|
||||||
|
8: "signature",
|
||||||
|
9: "unix_fds",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
READER_TYPE = Callable[["Unmarshaller", SignatureType], Any]
|
READER_TYPE = Callable[["Unmarshaller", SignatureType], Any]
|
||||||
|
|
||||||
@@ -354,8 +353,9 @@ class Unmarshaller:
|
|||||||
o = self._pos + 1
|
o = self._pos + 1
|
||||||
self._pos += signature_len + 2 # one for the byte, one for the '\0'
|
self._pos += signature_len + 2 # one for the byte, one for the '\0'
|
||||||
tree = get_signature_tree(self._buf[o : o + signature_len].decode())
|
tree = get_signature_tree(self._buf[o : o + signature_len].decode())
|
||||||
headers[HEADER_NAME_MAP[field_0]] = self._readers[tree.types[0].token](
|
type_ = tree.types[0]
|
||||||
self, tree.types[0]
|
headers[HEADER_MESSAGE_ARG_NAME[field_0]] = self._readers[type_.token](
|
||||||
|
self, type_
|
||||||
)
|
)
|
||||||
return headers
|
return headers
|
||||||
|
|
||||||
@@ -400,17 +400,12 @@ class Unmarshaller:
|
|||||||
self._pos = HEADER_ARRAY_OF_STRUCT_SIGNATURE_POSITION
|
self._pos = HEADER_ARRAY_OF_STRUCT_SIGNATURE_POSITION
|
||||||
header_fields = self.header_fields(self._header_len)
|
header_fields = self.header_fields(self._header_len)
|
||||||
self._pos += -self._pos & 7 # align 8
|
self._pos += -self._pos & 7 # align 8
|
||||||
tree = get_signature_tree(header_fields.get(HEADER_SIGNATURE, ""))
|
header_fields.pop("unix_fds", None) # defined by self._unix_fds
|
||||||
|
tree = get_signature_tree(header_fields.pop("signature", ""))
|
||||||
self._message = Message(
|
self._message = Message(
|
||||||
destination=header_fields.get(HEADER_DESTINATION),
|
**header_fields,
|
||||||
path=header_fields.get(HEADER_PATH),
|
|
||||||
interface=header_fields.get(HEADER_INTERFACE),
|
|
||||||
member=header_fields.get(HEADER_MEMBER),
|
|
||||||
message_type=MESSAGE_TYPE_MAP[self._message_type],
|
message_type=MESSAGE_TYPE_MAP[self._message_type],
|
||||||
flags=MESSAGE_FLAG_MAP[self._flag],
|
flags=MESSAGE_FLAG_MAP[self._flag],
|
||||||
error_name=header_fields.get(HEADER_ERROR_NAME),
|
|
||||||
reply_serial=header_fields.get(HEADER_REPLY_SERIAL),
|
|
||||||
sender=header_fields.get(HEADER_SENDER),
|
|
||||||
unix_fds=self._unix_fds,
|
unix_fds=self._unix_fds,
|
||||||
signature=tree,
|
signature=tree,
|
||||||
body=[self._readers[t.token](self, t) for t in tree.types]
|
body=[self._readers[t.token](self, t) for t in tree.types]
|
||||||
|
|||||||
Reference in New Issue
Block a user