Skip to content

Commit 3a113bc

Browse files
committed
Support strongly typed signals
In addition to properties and methods, the arguments of a signal have also types which can be defined with `TypedSignal`, a subclass of `signal`.
1 parent f04257f commit 3a113bc

File tree

2 files changed

+22
-1
lines changed

2 files changed

+22
-1
lines changed

pydbus/strong_typing.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""Decorators for methods and properties to strongly typed the values."""
22
import inspect
33

4+
from pydbus.generic import signal
45
from pydbus.xml_generator import verify_arguments
56

67

@@ -34,3 +35,10 @@ def decorate(func):
3435
verify_arguments(func)
3536
return func
3637
return decorate
38+
39+
40+
class TypedSignal(signal):
41+
42+
def __init__(self, arguments):
43+
super(TypedSignal, self).__init__()
44+
self.arg_types = arguments

pydbus/xml_generator.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
from itertools import islice
66
from xml.etree import ElementTree
77

8+
from pydbus.generic import signal
9+
810

911
PROPERTY_EMITS_SIGNAL = "org.freedesktop.DBus.Property.EmitsChangedSignal"
1012

@@ -149,7 +151,7 @@ def valid_member(member):
149151
"""Only select members with the correct type and name."""
150152
if isinstance(member, property):
151153
member = member.fget
152-
elif not ismethod(member):
154+
elif not ismethod(member) and not isinstance(member, signal):
153155
return False
154156
return member.__name__[0].isupper()
155157

@@ -190,6 +192,17 @@ def valid_member(member):
190192
entry, "annotation",
191193
{"name": PROPERTY_EMITS_SIGNAL, "value": "true"})
192194
attributes["access"] = "readwrite"
195+
elif isinstance(value, signal):
196+
if hasattr(value, "arguments"):
197+
arguments = value.arguments
198+
elif require_strong_typing:
199+
raise ValueError(
200+
"No argument definitions for signal "
201+
"'{}'".format(value.__name__))
202+
entry = ElementTree.SubElement(value, "signal")
203+
for arg, arg_type in arguments:
204+
ElementTree.SubElement(
205+
entry, "arg", {"name": arg, "type": arg_type})
193206
elif ismethod(value):
194207
arg_types, ret_type = verify_arguments(value)
195208
entry = ElementTree.SubElement(get_interface(value), "method")

0 commit comments

Comments
 (0)