Skip to content

Commit

Permalink
observe via tags and register notifiers with metadata
Browse files Browse the repository at this point in the history
  • Loading branch information
rmorshea committed Dec 19, 2015
1 parent e48fb06 commit 5602beb
Show file tree
Hide file tree
Showing 2 changed files with 321 additions and 119 deletions.
72 changes: 68 additions & 4 deletions traitlets/tests/test_traitlets.py
Original file line number Diff line number Diff line change
Expand Up @@ -418,10 +418,10 @@ class A(HasTraits):
a.on_trait_change(callback4, 'a')
a.a = 100000
self.assertEqual(self.cb,('a',10000,100000,a))
self.assertEqual(len(a._trait_notifiers['a']['change']), 1)
self.assertEqual(len(a.trait_notifiers('a')), 1)
a.on_trait_change(callback4, 'a', remove=True)

self.assertEqual(len(a._trait_notifiers['a']['change']), 0)
self.assertEqual(len(a.trait_notifiers('a')), 0)

def test_notify_only_once(self):

Expand Down Expand Up @@ -614,10 +614,10 @@ class A(HasTraits):
a.a = 100
change = change_dict('a', 10, 100, a, 'change')
self.assertEqual(self.cb, change)
self.assertEqual(len(a._trait_notifiers['a']['change']), 1)
self.assertEqual(len(a.trait_notifiers('a')), 1)
a.unobserve(callback1, 'a')

self.assertEqual(len(a._trait_notifiers['a']['change']), 0)
self.assertEqual(len(a.trait_notifiers('a')), 0)

def test_notify_only_once(self):

Expand Down Expand Up @@ -658,6 +658,70 @@ def _a_changed(self, change):
self.assertEqual(b.b, b.c)
self.assertEqual(b.b, b.d)

def test_unobserve_with_bound_method_raises(self):
class A(HasTraits):
i = Int()

@observe('i')
def _observer(self, change): pass

a = A()
self.assertRaises(TraitError, a.unobserve, a._observer)

def test_unobserve_with_trait_notifiers(self):
class A(HasTraits):
i = Int()

@observe('i')
def _observer(self, change): pass

a = A()
n_list = a.trait_notifiers('i')
self.assertEqual(len(n_list), 1)

a.unobserve(n_list[0])
n_list = a.trait_notifiers('i')
self.assertEqual(len(n_list), 0)

def test_observe_decorator_via_tags(self):
class A(HasTraits):
foo = Int()
bar = Int().tag(test=True)

@observe(tags={'test':True})
def _test_observer(self, change):
self.foo = change['new']

a = A()
a.bar = 1
self.assertEqual(a.foo, a.bar)

a.add_traits(baz=Int().tag(test=True))
a.baz = 2
self.assertEqual(a.foo, a.baz)

def test_observe_via_tags(self):

class A(HasTraits):
foo = Int()
bar = Int().tag(test=True)

a = A()

def _test_observer(change):
a.foo = change['new']

a.observe(_test_observer, tags={'test':True})
a.bar = 1
self.assertEqual(a.foo, a.bar)

a.add_traits(baz=Int().tag(test=True))
a.baz = 2
self.assertEqual(a.foo, a.baz)

a.unobserve(_test_observer)
a.bar = 3
self.assertNotEqual(a.bar, a.baz)

class TestHasTraits(TestCase):

Expand Down
Loading

0 comments on commit 5602beb

Please sign in to comment.