def testSubscribe(): topicName = 'testSubscribe' def proto(a, b, c=None): pass topicMgr.getOrCreateTopic(topicName, proto) def listener(a, b, c=None): pass # verify that pub.isValid() works too pub.validate(listener, topicName) assert pub.isValid(listener, topicName) assert topicMgr.getTopic(topicName).getNumListeners() == 0 assert topicMgr.getTopicsSubscribed(listener) == [] assert not pub.isSubscribed(listener, topicName) assert pub.subscribe(listener, topicName) assert pub.isSubscribed(listener, topicName) def topicNames(listener): return [t.getName() for t in topicMgr.getTopicsSubscribed(listener)] assert topicNames(listener) == [topicName] # should do nothing if already subscribed: assert not pub.subscribe(listener, topicName)[1] assert topicMgr.getTopic(topicName).getNumListeners() == 1 # test topicMgr.getTopicsSubscribed() pub.subscribe(listener, 'lt2', ) assert set(topicNames(listener)) == set([topicName,'lt2']) pub.subscribe(listener, 'lt1.lst1') assert set(topicNames(listener)) == set([topicName,'lt2','lt1.lst1']) # test ALL_TOPICS def listenToAll(): pass pub.subscribe(listenToAll, pub.ALL_TOPICS) assert topicNames(listenToAll) == [pub.ALL_TOPICS]
def _subscribe(self): def sgetter(funcname): def realsgetter(owner, msg): return owner._subs[funcname](owner, msg) return realsgetter # wx classes throw exception if getmember is applied to the instance (self) methods = inspect.getmembers(self.__class__, inspect.ismethod) topicmgr = pub.getDefaultTopicMgr() for mname, method in methods: pubsubtopic = getattr(method, '_pubrecv', None) if pubsubtopic: self._subs[mname] = method subsgetter = sgetter(mname) if not topicmgr.getTopic(pubsubtopic, True) or not pub.isSubscribed(subsgetter, pubsubtopic): setattr(self, mname, subsgetter) pub.subscribe(subsgetter.__get__(self, self.__class__), pubsubtopic)
def remove_listener(self, listener): """Remove a listener for a topic Args: ---- listener : dict A dictionary comprised of a "handler": handler (fct) and a "topic":"topicname" key-value pairs """ try: if pub.isSubscribed(listener["handler"], listener["topic"]): pub.unsubscribe(listener["handler"], listener["topic"]) else: logger.debug("Listener not subscribed", listener) except Exception as exc: print(f"Removing webhooks listener failed! {exc!r} occurred.") logger.warn( f"Removing webhooks listener failed! {exc!r} occurred.")
def _subscribe(self): def sgetter(funcname): def realsgetter(owner, msg): return owner._subs[funcname](owner, msg) return realsgetter # wx classes throw exception if getmember is applied to the instance (self) methods = inspect.getmembers(self.__class__, inspect.ismethod) topicmgr = pub.getDefaultTopicMgr() for mname, method in methods: pubsubtopic = getattr(method, '_pubrecv', None) if pubsubtopic: self._subs[mname] = method subsgetter = sgetter(mname) if not topicmgr.getTopic(pubsubtopic, True) or not pub.isSubscribed( subsgetter, pubsubtopic): setattr(self, mname, subsgetter) pub.subscribe(subsgetter.__get__(self, self.__class__), pubsubtopic)
def remove_listener(self, listener): if pub.isSubscribed(listener["handler"], listener["topic"]): pub.unsubscribe(listener["handler"], listener["topic"]) else: logger.debug("Listener not subscribed", listener)
def isSubscribed(self, listener, topic): topic = self._get_pubsub_uid() + '.' + topic return pub.isSubscribed(listener, topic)