def _observer_change_handler(event, graph, handler, target, dispatcher): """ Handler for maintaining observers. Used by ObserverChangeNotifier. Parameters ---------- event : DictChangeEvent Change event that triggers the maintainer. graph : ObserverGraph Description for the *downstream* observers, i.e. excluding self. handler : callable User handler. target : object Object seen by the user as the owner of the observer. dispatcher : callable Callable for dispatching the handler. """ for removed_item in event.removed.values(): add_or_remove_notifiers( object=removed_item, graph=graph, handler=handler, target=target, dispatcher=dispatcher, remove=True, ) for added_item in event.added.values(): add_or_remove_notifiers( object=added_item, graph=graph, handler=handler, target=target, dispatcher=dispatcher, remove=False, )
def observe(object, expression, handler, *, remove=False, dispatcher=dispatch_same): """ Observer or unobserve traits on an object. Parameters ---------- object : object An object to be observed. Usually an instance of ``HasTraits``. expression : ObserverExpression An object describing what traits are being observed. handler : callable(event) User-defined callable to handle change events. ``event`` is an object representing the change. Its type and content depends on the change. remove : boolean, optional If true, remove notifiers. i.e. unobserve the traits. dispatcher : callable(callable, event) Callable for dispatching the user-defined handler, i.e. dispatching callback on a different thread. """ # Implicit interface: ``expression`` can be anything with a method # ``_as_graphs`` that returns a list of ObserverGraph. for graph in expression._as_graphs(): add_or_remove_notifiers( object=object, graph=graph, handler=handler, target=object, dispatcher=dispatcher, remove=remove, )
def observer_change_handler(event, graph, handler, target, dispatcher): """ Handler for maintaining observers. Parameters ---------- event : TraitChangeEvent Event triggered by add_trait. graph : ObserverGraph Description for the *downstream* observers, i.e. excluding self. handler : callable User handler. target : object Object seen by the user as the owner of the observer. dispatcher : callable Callable for dispatching the handler. """ new_graph = ObserverGraph(node=_RestrictedNamedTraitObserver( name=event.new, wrapped_observer=graph.node, ), children=graph.children) add_or_remove_notifiers( object=event.object, graph=new_graph, handler=handler, target=target, dispatcher=dispatcher, remove=False, )
def call_add_or_remove_notifiers(**kwargs): """ Convenience function for calling add_or_remove_notifiers with default values. Parameters ---------- **kwargs New argument values to use instead. """ values = dict( object=mock.Mock(), graph=ObserverGraph(node=None), handler=mock.Mock(), target=_DEFAULT_TARGET, dispatcher=dispatch_same, remove=False, ) values.update(kwargs) add_or_remove_notifiers(**values)
def observer_change_handler(event, graph, handler, target, dispatcher): """ Maintain downstream notifiers when the trait changes. Parameters ---------- event : TraitChangeEvent The event that triggers this function. graph : ObserverGraph Description for the *downstream* observers, i.e. excluding the observer that contributed this maintainer function. handler : callable User handler. target : object Object seen by the user as the owner of the observer. dispatcher : callable Callable for dispatching the handler. """ if event.old not in UNOBSERVABLE_VALUES: try: add_or_remove_notifiers( object=event.old, graph=graph, handler=handler, target=target, dispatcher=dispatcher, remove=True, ) except NotifierNotFound: # The old value could be a default value that does not have any # notifier. pass if event.new not in UNOBSERVABLE_VALUES: add_or_remove_notifiers( object=event.new, graph=graph, handler=handler, target=target, dispatcher=dispatcher, remove=False, )