# encoding: utf-8 """The IPython Core Notification Center. See docs/blueprints/notification_blueprint.txt for an overview of the notification module. """ __docformat__ = "restructuredtext en" #----------------------------------------------------------------------------- # Copyright (C) 2008 The IPython Development Team # # Distributed under the terms of the BSD License. The full license is in # the file COPYING, distributed as part of this software. #----------------------------------------------------------------------------- class NotificationCenter(object): """Synchronous notification center""" def __init__(self): super(NotificationCenter, self).__init__() self.registeredTypes = set() #set of types that are observed self.registeredSenders = set() #set of senders that are observed self.observers = {} #map (type,sender) => callback (callable) def post_notification(self, theType, sender, **kwargs): """Post notification (type,sender,**kwargs) to all registered observers. Implementation -------------- * If no registered observers, performance is O(1). * Notificaiton order is undefined. * Notifications are posted synchronously. """ if(theType==None or sender==None): raise Exception("NotificationCenter.post_notification requires \ type and sender.") # If there are no registered observers for the type/sender pair if((theType not in self.registeredTypes) or (sender not in self.registeredSenders)): return keys = ((theType,sender), (None, sender), (theType, None), (None,None)) observers = set() for k in keys: observers.update(self.observers.get(k, set())) for o in observers: o(theType, sender, args=kwargs) def add_observer(self, observerCallback, theType, sender): """Add an observer callback to this notification center. The given callback will be called upon posting of notifications of the given type/sender and will receive any additional kwargs passed to post_notification. Parameters ---------- observerCallback : callable Callable. Must take at least two arguments:: observerCallback(type, sender, args={}) theType : hashable The notification type. If None, all notifications from sender will be posted. sender : hashable The notification sender. If None, all notifications of theType will be posted. """ assert(observerCallback != None) self.registeredTypes.add(theType) self.registeredSenders.add(sender) self.observers.setdefault((theType,sender), set()).add(observerCallback) sharedCenter = NotificationCenter()