def default_handlers(self): """The map of default event handlers described by this listener """ return {evname: cb for evname, cbtype, cb in marks.get_callbacks( self, skip=('default_handlers',), only='handler')}
def load_app(self, ns, on_value=None, **prepost_kwargs): """Load annotated callbacks and from a namespace and add them to this client's listener's callback chain. :param ns: A namespace-like object containing functions marked with @event_callback (can be a module, class or instance). :params str on_value: id key to be used for registering app callbacks with `EventListener` """ listener = self.listener name = utils.get_name(ns) app = self._apps.get(name, None) if not app: # if handed a class, instantiate appropriately app = ns() if isinstance(ns, type) else ns prepost = getattr(app, 'prepost', False) if prepost: args, kwargs = utils.get_args(app.prepost) funcargs = tuple(weakref.proxy(getattr(self, argname)) for argname in args if argname != 'self') ret = prepost(*funcargs, **prepost_kwargs) if inspect.isgenerator(ret): # run init step next(ret) app._finalize = ret # assign a 'consumer id' cid = on_value if on_value else utils.uuid() self.log.info("Loading call app '{}' for listener '{}'" .format(name, listener)) icb, failed = 1, False # insert handlers and callbacks for ev_type, cb_type, obj in marks.get_callbacks(app): if cb_type == 'handler': # TODO: similar unloading on failure here as above? listener.add_handler(ev_type, obj) elif cb_type == 'callback': # add default handler if none exists if ev_type not in listener._handlers: self.log.info( "adding default session lookup handler for event" " type '{}'".format(ev_type) ) listener.add_handler( ev_type, listener.lookup_sess ) added = listener.add_callback(ev_type, cid, obj) if not added: failed = obj listener.remove_callbacks(cid, last=icb) break icb += 1 self.log.debug("'{}' event callback '{}' added for id '{}'" .format(ev_type, obj.__name__, cid)) if failed: raise TypeError("app load failed since '{}' is not a valid" "callback type".format(failed)) # register locally self._apps[name] = app app.cid, app.name = cid, name return app.cid
def load_app(self, ns, on_value=None, **prepost_kwargs): """Load annotated callbacks and from a namespace and add them to this client's listener's callback chain. :param ns: A namespace-like object containing functions marked with @event_callback (can be a module, class or instance). :params str on_value: id key to be used for registering app callbacks with `EventListener` """ listener = self.listener name = utils.get_name(ns) if name not in self._apps: # if handed a class, instantiate appropriately app = ns() if isinstance(ns, type) else ns prepost = getattr(app, 'prepost', False) if prepost: args, kwargs = utils.get_args(app.prepost) funcargs = tuple(weakref.proxy(getattr(self, argname)) for argname in args if argname != 'self') ret = prepost(*funcargs, **prepost_kwargs) if inspect.isgenerator(ret): # run init step next(ret) app._finalize = ret # assign a 'consumer id' cid = on_value if on_value else utils.uuid() self.log.info("Loading call app '{}' for listener '{}'" .format(name, listener)) icb, failed = 1, False # insert handlers and callbacks for ev_type, cb_type, obj in marks.get_callbacks(app): if cb_type == 'handler': # TODO: similar unloading on failure here as above? listener.add_handler(ev_type, obj) elif cb_type == 'callback': # add default handler if none exists if ev_type not in listener._handlers: self.log.info( "adding default session lookup handler for event" " type '{}'".format(ev_type) ) listener.add_handler( ev_type, listener.lookup_sess ) added = listener.add_callback(ev_type, cid, obj) if not added: failed = obj listener.remove_callbacks(cid, last=icb) break icb += 1 self.log.debug("'{}' event callback '{}' added for id '{}'" .format(ev_type, obj.__name__, cid)) if failed: raise TypeError("app load failed since '{}' is not a valid" "callback type".format(failed)) # register locally self._apps[name] = app app.cid, app.name = cid, name return cid