altdesktop / python-dbus-next

🚌 The next great DBus library for Python with asyncio support
https://python-dbus-next.readthedocs.io/en/latest/
MIT License
187 stars 58 forks source link

Use enum's constructor to resolve enum values #143

Open whot opened 1 year ago

whot commented 1 year ago

Rather than creating a map of {value: enum}, let's just use Foo(value) to resolve to the respective enum value.

This fixes a regression with introspection introduced in commit 3282eed "Improve unmarshall performance":

  File "dbus_next/_private/unmarshaller.py", line 247, in _read_header
    self.flag = MESSAGE_FLAG_MAP[buffer[2]]
                ~~~~~~~~~~~~~~~~^^^^^^^^^^^
  KeyError: 0

MESSAGE_FLAG_MAP is built like this:

    MESSAGE_FLAG_MAP = {field.value: field for field in MessageFlag}

But MessageFlag is a IntFlag, so the zero value (NONE) is missing from the iterator:

  >>> [f for f in dbus_next.constants.MessageFlag]
  [<MessageFlag.NO_REPLY_EXPECTED: 1>, <MessageFlag.NO_AUTOSTART: 2>,
   <MessageFlag.ALLOW_INTERACTIVE_AUTHORIZATION: 4>]

Resolving the enum through the constructor fixes this. MESSAGE_TYPE_MAP and HEADER_NAME_MAP are changed in solidarity.

Fixes #142