##// END OF EJS Templates
Merge pull request #8253 from SylvainCorlay/context_manager...
Min RK -
r21160:de3a01a4 merge
parent child Browse files
Show More
@@ -1366,7 +1366,7 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():
@@ -597,24 +597,23 class HasTraits(py3compat.with_metaclass(MetaHasTraits, object)):
597 yield
597 yield
598 return
598 return
599 else:
599 else:
600 self._cross_validation_lock = True
601 cache = {}
600 cache = {}
602 notifications = {}
603 _notify_trait = self._notify_trait
601 _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 self._notify_trait = hold
615 self._cross_validation_lock = True
614 yield
616 yield
615 finally:
616 try:
617 self._notify_trait = hold_notifications
618 for name in cache:
617 for name in cache:
619 if hasattr(self, '_%s_validate' % name):
618 if hasattr(self, '_%s_validate' % name):
620 cross_validate = getattr(self, '_%s_validate' % name)
619 cross_validate = getattr(self, '_%s_validate' % name)
@@ -627,7 +626,6 class HasTraits(py3compat.with_metaclass(MetaHasTraits, object)):
627 else:
626 else:
628 delattr(self, name)
627 delattr(self, name)
629 cache = {}
628 cache = {}
630 notifications = {}
631 raise e
629 raise e
632 finally:
630 finally:
633 self._notify_trait = _notify_trait
631 self._notify_trait = _notify_trait
@@ -638,8 +636,9 class HasTraits(py3compat.with_metaclass(MetaHasTraits, object)):
638 # remove the redundant value from __dict__
636 # remove the redundant value from __dict__
639 # (only used to preserve pickleability on Python < 3.4)
637 # (only used to preserve pickleability on Python < 3.4)
640 self.__dict__.pop('_notify_trait', None)
638 self.__dict__.pop('_notify_trait', None)
639
641 # trigger delayed notifications
640 # trigger delayed notifications
642 for v in dict(cache, **notifications).values():
641 for v in cache.values():
643 self._notify_trait(*v)
642 self._notify_trait(*v)
644
643
645 def _notify_trait(self, name, old_value, new_value):
644 def _notify_trait(self, name, old_value, new_value):
General Comments 0
You need to be logged in to leave comments. Login now