##// END OF EJS Templates
Merging notifications when changing the same attribute multiple times
Sylvain Corlay -
Show More
@@ -1366,7 +1366,7 b' def test_hold_trait_notifications():'
1366 nt.assert_equal(t.a, 4)
1366 nt.assert_equal(t.a, 4)
1367 nt.assert_equal(changes, [])
1367 nt.assert_equal(changes, [])
1368
1368
1369 nt.assert_equal(changes, [(3,4)])
1369 nt.assert_equal(changes, [(0, 4)])
1370 # Test roll-back
1370 # Test roll-back
1371 try:
1371 try:
1372 with t.hold_trait_notifications():
1372 with t.hold_trait_notifications():
@@ -599,22 +599,23 b' class HasTraits(py3compat.with_metaclass(MetaHasTraits, object)):'
599 else:
599 else:
600 self._cross_validation_lock = True
600 self._cross_validation_lock = True
601 cache = {}
601 cache = {}
602 notifications = {}
603 _notify_trait = self._notify_trait
604
602
605 def cache_values(*a):
603 def merge(previous, current):
606 cache[a[0]] = a
604 """merges notifications of the form (name, old, value)"""
607
605 if previous is None:
608 def hold_notifications(*a):
606 return current
609 notifications[a[0]] = a
607 else:
608 return (current[0], previous[1], current[2])
610
609
611 self._notify_trait = cache_values
610 def hold(*a):
611 cache[a[0]] = merge(cache.get(a[0]), a)
612
612
613 try:
613 try:
614 _notify_trait = self._notify_trait
615 self._notify_trait = hold
614 yield
616 yield
615 finally:
617 finally:
616 try:
618 try:
617 self._notify_trait = hold_notifications
618 for name in cache:
619 for name in cache:
619 if hasattr(self, '_%s_validate' % name):
620 if hasattr(self, '_%s_validate' % name):
620 cross_validate = getattr(self, '_%s_validate' % name)
621 cross_validate = getattr(self, '_%s_validate' % name)
@@ -627,7 +628,6 b' class HasTraits(py3compat.with_metaclass(MetaHasTraits, object)):'
627 else:
628 else:
628 delattr(self, name)
629 delattr(self, name)
629 cache = {}
630 cache = {}
630 notifications = {}
631 raise e
631 raise e
632 finally:
632 finally:
633 self._notify_trait = _notify_trait
633 self._notify_trait = _notify_trait
@@ -638,8 +638,9 b' class HasTraits(py3compat.with_metaclass(MetaHasTraits, object)):'
638 # remove the redundant value from __dict__
638 # remove the redundant value from __dict__
639 # (only used to preserve pickleability on Python < 3.4)
639 # (only used to preserve pickleability on Python < 3.4)
640 self.__dict__.pop('_notify_trait', None)
640 self.__dict__.pop('_notify_trait', None)
641
641 # trigger delayed notifications
642 # trigger delayed notifications
642 for v in dict(cache, **notifications).values():
643 for v in cache.values():
643 self._notify_trait(*v)
644 self._notify_trait(*v)
644
645
645 def _notify_trait(self, name, old_value, new_value):
646 def _notify_trait(self, name, old_value, new_value):
General Comments 0
You need to be logged in to leave comments. Login now