Source code for envisage.tests.event_tracker
# (C) Copyright 2007-2023 Enthought, Inc., Austin, TX
# All rights reserved.
#
# This software is provided without warranty under the terms of the BSD
# license included in LICENSE.txt and may be redistributed only under
# the conditions described in the aforementioned license. The license
# is also available online at http://www.enthought.com/licenses/BSD.txt
#
# Thanks for using Enthought open source!
""" Used to track events in tests. """
# Enthought library imports.
from traits.api import HasTraits, List, Str, Tuple
from traits.has_traits import observe
[docs]class EventTracker(HasTraits):
"""Used to track traits events."""
# The traits events that have fired.
#
# This is a list of tuples in the form:-
#
# (obj, trait_name, old, new)
events = List(Tuple)
# The names of the traits events that have fired.
#
# This is useful if you just care about the order of the events, not the
# contents.
event_names = List(Str)
# The trait event subscriptions used by the tracker.
#
# This is a list of tuples in the form:-
#
# (obj, trait_name)
#
# Where 'obj' is the object to listen to, and 'trait_name' is the name of
# the trait to listen to, or None to listen for all trait events.
subscriptions = List(Tuple)
###########################################################################
# Private interface.
###########################################################################
#### Trait change handlers ################################################
@observe("subscriptions")
def _update_listeners_on_all_subscriptions(self, event):
"""Static trait change handler."""
old, new = event.old, event.new
for subscription in old:
self._remove_subscription(subscription)
for subscription in new:
self._add_subscription(subscription)
@observe("subscriptions:items")
def _update_listeners_on_changed_subscriptions(self, event):
"""Static trait change handler."""
for subscription in event.removed:
self._remove_subscription(subscription)
for subscription in event.added:
self._add_subscription(subscription)
def _listener(self, obj, trait_name, old, new):
"""Dynamic trait change listener."""
self.events.append((obj, trait_name, old, new))
self.event_names.append(trait_name)
#### Methods ##############################################################
def _add_subscription(self, subscription):
"""Add a subscription."""
obj, trait_name = subscription
if trait_name is not None:
obj.on_trait_change(self._listener, trait_name)
else:
obj.on_trait_change(self._listener)
def _remove_subscription(self, subscription):
"""Remove a subscription."""
obj, trait_name = subscription
if trait_name is not None:
obj.on_trait_change(self._listener, trait_name, remove=True)
else:
obj.on_trait_change(self._listener, remove=True)