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, [( |
|
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 |
|
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