Source code for mpris2.decorator.method

'''
This is not part of specification

Helper class to make it work as python lib
'''

from .base import Decorator, ATTR_KEY


[docs]def kw_to_dbus(**kw): return kw
[docs]def args_to_dbus(*args): return args
[docs]class DbusMethod(Decorator): def __init__(self, meth=None, iface=None, produces=lambda resp: resp, args_to_dbus=args_to_dbus, kw_to_dbus=kw_to_dbus, std_args=(), std_kwds={}): self.meth = meth self.handler = None self.produces = produces self.iface = iface self.args_to_dbus = args_to_dbus self.kw_to_dbus = kw_to_dbus self.std_args = std_args self.std_kwds = std_kwds self.obj = None self._update_me(meth) def __call__(self, meth=None): self.meth = meth self._update_me(meth) return self def __get__(self, obj=None, cls=None): if obj is None: return self self.obj = obj return self._call_dbus def _call_dbus(self, *args, **kwds): _dbus = getattr(self.obj, ATTR_KEY) if self.iface: iface = self.iface else: iface = _dbus.iface bus_obj = _dbus.object bus_meth = bus_obj.get_dbus_method(self.meth.__name__, iface) _args = self.merge_args(args, self.std_args) args = self.convert_args_to_dbus_args(*_args) _kwds = self.std_kwds.copy() _kwds.update(kwds) kwds = self.convert_kw_to_dbus_kw(**_kwds) result = bus_meth(*args, **kwds) return self.produces(result) @classmethod
[docs] def merge_args(cls, args, std_args): _len = len(std_args) - len(args) return args + std_args[-_len:] if _len > 0 else args
@classmethod
[docs] def merge_kwds(cls, kwds, std_kwds): _kwds = std_kwds.copy() _kwds.update(kwds) return _kwds
[docs] def convert_args_to_dbus_args(self, *args): args_to_dbus = self.args_to_dbus if callable(args_to_dbus): return args_to_dbus(*args) #iterate over args result = [] for arg in args: i = args.index(arg) if i < len(args_to_dbus): make = args_to_dbus[i] if callable(make): arg = make(arg) result.append(arg) return tuple(result)
[docs] def convert_kw_to_dbus_kw(self, **kw): kw_to_dbus = self.kw_to_dbus if callable(kw_to_dbus): return kw_to_dbus(**kw) if hasattr(self.kw_to_dbus, 'keys'): for key, val in kw.items(): make = kw_to_dbus.get(key, lambda v: v) kw[key] = make(val) return kw
if __name__ == '__main__': # examples from .interface import DbusInterface @DbusInterface('org.freedesktop.DBus', '/') class Example(object): @DbusMethod def GetId(self): pass @DbusMethod def GetNameOwner(self, name): pass d = Example( dbus_interface_info={ 'dbus_uri': 'org.freedesktop.DBus'}) assert d.GetId() assert d.GetNameOwner('org.freedesktop.DBus') == 'org.freedesktop.DBus'