Skip to content

Repository files navigation

dbus-objects

checkstestscodecovPyPI version

DBus objects implementation on top of the Python type system.

Object declarations will be introspected and the equivalent DBus signature automatically generated. This makes it incredible easy to develop DBus object providers ("servers"), especially if you are already writing typed Python!

Integrations:

importrandomfromtypingimportListimportdbus_objectsimportdbus_objects.integration.jeepneyclassExampleObject(dbus_objects.DBusObject):
def__init__(self):
super().__init__(default_interface_root='io.github.ffy00.dbus_objects.example')
self._bets= []
self._name='something'@dbus_objects.dbus_method()defping(self) ->str:
return'Pong!'@dbus_objects.dbus_method()defprint(self, msg: str) ->None:
print(msg)
@dbus_objects.dbus_method()defsum(self, a: int, b: int) ->int:
returna+b@dbus_objects.dbus_method()defsave_bet(self, number: int) ->None:
self._bets.append(number)
@dbus_objects.dbus_method()defget_bets(self) ->List[int]:
returnself._bets@dbus_objects.dbus_method()deflotery(self) ->int:
winner=random.choice(self._bets)
self._bets= []
returnwinner@dbus_objects.dbus_property()defname(self) ->str:
returnself._name@name.setterdefname(self, value: str):
self._name=valueself.name_updated(value)
name_updated=dbus_objects.dbus_signal(new_name=str)
server=dbus_objects.integration.jeepney.BlockingDBusServer(
bus='SESSION',
name='io.github.ffy00.dbus-objects',
)
server.register_object('/io/github/ffy00/dbus_objects/example', ExampleObject())
server.listen()

This example will generate the following server topology:

paths
├── /
│ ├── org.freedesktop.DBus.Introspectable
│ │ └── Introspect
│ └── org.freedesktop.DBus.Peer
│ └── Ping
├── /io
│ ├── org.freedesktop.DBus.Introspectable
│ │ └── Introspect
│ └── org.freedesktop.DBus.Peer
│ └── Ping
├── /io/github
│ ├── org.freedesktop.DBus.Introspectable
│ │ └── Introspect
│ └── org.freedesktop.DBus.Peer
│ └── Ping
├── /io/github/ffy00
│ ├── org.freedesktop.DBus.Introspectable
│ │ └── Introspect
│ └── org.freedesktop.DBus.Peer
│ └── Ping
├── /io/github/ffy00/dbus_objects
│ ├── org.freedesktop.DBus.Introspectable
│ │ └── Introspect
│ └── org.freedesktop.DBus.Peer
│ └── Ping
└── /io/github/ffy00/dbus_objects/example
├── io.github.ffy00.dbus_objects.example.ExampleObject
│ ├── GetBets
│ ├── Lotery
│ ├── Ping
│ ├── Print
│ ├── SaveBet
│ └── Sum
├── org.freedesktop.DBus.Introspectable
│ └── Introspect
├── org.freedesktop.DBus.Peer
│ └── Ping
└── org.freedesktop.DBus.Properties
├── Get
├── GetAll
└── Set

And, for eg., the following DBus introspection XML for /io/github/ffy00/dbus_objects/example:

<!DOCTYPEnode PUBLIC
"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd" >
<node>
<interfacename="io.github.ffy00.dbus_objects.example.ExampleObject">
<methodname="Ping">
<argdirection="out"type="s" />
</method>
<methodname="Print">
<argdirection="in"type="s"name="msg" />
</method>
<methodname="Sum">
<argdirection="in"type="i"name="a" />
<argdirection="in"type="i"name="b" />
<argdirection="out"type="i" />
</method>
<methodname="SaveBet">
<argdirection="in"type="i"name="number" />
</method>
<methodname="GetBets">
<argdirection="out"type="ai" />
</method>
<methodname="Lotery">
<argdirection="out"type="i" />
</method>
<propertyname="Name"type="s"access="readwrite" />
<signalname="NameUpdated">
<argtype="s"name="new_name" />
</signal>
</interface>
<interfacename="org.freedesktop.DBus.Properties">
<methodname="Get">
<argdirection="in"type="s"name="interface_name" />
<argdirection="in"type="s"name="property_name" />
<argdirection="out"type="v" />
</method>
<methodname="Set">
<argdirection="in"type="s"name="interface_name" />
<argdirection="in"type="s"name="property_name" />
<argdirection="in"type="v"name="value" />
</method>
<methodname="GetAll">
<argdirection="in"type="s"name="interface_name" />
<argdirection="out"type="a{sv}" />
</method>
</interface>
<interfacename="org.freedesktop.DBus.Peer">
<methodname="Ping" />
</interface>
<interfacename="org.freedesktop.DBus.Introspectable">
<methodname="Introspect">
<argdirection="out"type="s"name="xml" />
</method>
</interface>
</node>

License

MIT

About

DBus objects implementation on top of the Python type system

Topics

Resources

Stars

11 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Used by

Contributors

Languages