def test_result_shadows_descriptor(self): # The result of the function call should be stored in # the object __dict__, shadowing the descriptor. called = [] class Foo(object): @lazy_property def foo(self): called.append('foo') return 1 f = Foo() self.assertTrue(isinstance(Foo.foo, lazy_property)) self.assertTrue(f.foo is f.foo) self.assertTrue(f.foo is f.__dict__['foo']) # ! self.assertEqual(len(called), 1) self.assertEqual(f.foo, 1) self.assertEqual(f.foo, 1) self.assertEqual(len(called), 1) lazy_property.invalidate(f, 'foo') self.assertEqual(f.foo, 1) self.assertEqual(len(called), 2) self.assertEqual(f.foo, 1) self.assertEqual(f.foo, 1) self.assertEqual(len(called), 2)
def test_result_shadows_descriptor(self): # The result of the function call should be stored in # the object __dict__, shadowing the descriptor. called = [] class Foo(object): @lazy_property def foo(self): called.append('foo') return 1 f = Foo() self.assertTrue(isinstance(Foo.foo, lazy_property)) self.assertTrue(f.foo is f.foo) self.assertTrue(f.foo is f.__dict__['foo']) # ! self.assertEqual(len(called), 1) self.assertEqual(f.foo, 1) self.assertEqual(f.foo, 1) self.assertEqual(len(called), 1) lazy_property.invalidate(f, 'foo') self.assertEqual(f.foo, 1) self.assertEqual(len(called), 2) self.assertEqual(f.foo, 1) self.assertEqual(f.foo, 1) self.assertEqual(len(called), 2)
def test_invalidate_uncalled_attribute(self): # It should be possible to invalidate an empty attribute # cache without causing harm. called = [] class Foo(object): @lazy_property def foo(self): called.append('foo') return 1 f = Foo() self.assertEqual(len(called), 0) lazy_property.invalidate(f, 'foo') # Nothing happens
def test_invalidate_uncalled_attribute(self): # It should be possible to invalidate an empty attribute # cache without causing harm. called = [] class Foo(object): @lazy_property def foo(self): called.append('foo') return 1 f = Foo() self.assertEqual(len(called), 0) lazy_property.invalidate(f, 'foo') # Nothing happens
def test_invalidate_subclass_attribute(self): # Whereas lazy_property.invalidate CAN invalidate a subclass (cached) attribute. called = [] class Bar(object): @cached def bar(self): called.append('bar') return 1 b = Bar() self.assertEqual(b.bar, 1) self.assertEqual(len(called), 1) lazy_property.invalidate(b, 'bar') self.assertEqual(b.bar, 1) self.assertEqual(len(called), 2)
def test_invalidate_reserved_attribute(self): # It should be possible to invalidate a reserved lazy_property attribute. called = [] class Foo(object): @lazy_property def __foo__(self): called.append('foo') return 1 f = Foo() self.assertEqual(f.__foo__, 1) self.assertEqual(len(called), 1) lazy_property.invalidate(f, '__foo__') self.assertEqual(f.__foo__, 1) self.assertEqual(len(called), 2)
def test_invalidate_subclass_attribute(self): # Whereas lazy_property.invalidate CAN invalidate a subclass (cached) attribute. called = [] class Bar(object): @cached def bar(self): called.append('bar') return 1 b = Bar() self.assertEqual(b.bar, 1) self.assertEqual(len(called), 1) lazy_property.invalidate(b, 'bar') self.assertEqual(b.bar, 1) self.assertEqual(len(called), 2)
def test_invalidate_reserved_attribute(self): # It should be possible to invalidate a reserved lazy_property attribute. called = [] class Foo(object): @lazy_property def __foo__(self): called.append('foo') return 1 f = Foo() self.assertEqual(f.__foo__, 1) self.assertEqual(len(called), 1) lazy_property.invalidate(f, '__foo__') self.assertEqual(f.__foo__, 1) self.assertEqual(len(called), 2)
def test_invalidate_attribute(self): # It should be possible to invalidate a lazy_property attribute. called = [] class Foo(object): @lazy_property def foo(self): called.append("foo") return 1 f = Foo() self.assertEqual(f.foo, 1) self.assertEqual(len(called), 1) lazy_property.invalidate(f, "foo") self.assertEqual(f.foo, 1) self.assertEqual(len(called), 2)
def test_invalidate_private_attribute(self): # It should be possible to invalidate a private lazy_property attribute. called = [] class Foo(object): @lazy_property def __foo(self): called.append('foo') return 1 def get_foo(self): return self.__foo f = Foo() self.assertEqual(f.get_foo(), 1) self.assertEqual(len(called), 1) lazy_property.invalidate(f, '__foo') self.assertEqual(f.get_foo(), 1) self.assertEqual(len(called), 2)
def test_invalidate_attribute_twice(self): # It should be possible to invalidate a lazy_property attribute # twice without causing harm. called = [] class Foo(object): @lazy_property def foo(self): called.append('foo') return 1 f = Foo() self.assertEqual(f.foo, 1) self.assertEqual(len(called), 1) lazy_property.invalidate(f, 'foo') lazy_property.invalidate(f, 'foo') # Nothing happens self.assertEqual(f.foo, 1) self.assertEqual(len(called), 2)
def test_invalidate_attribute_twice(self): # It should be possible to invalidate a lazy_property attribute # twice without causing harm. called = [] class Foo(object): @lazy_property def foo(self): called.append('foo') return 1 f = Foo() self.assertEqual(f.foo, 1) self.assertEqual(len(called), 1) lazy_property.invalidate(f, 'foo') lazy_property.invalidate(f, 'foo') # Nothing happens self.assertEqual(f.foo, 1) self.assertEqual(len(called), 2)
def test_invalidate_private_attribute(self): # It should be possible to invalidate a private lazy_property attribute. called = [] class Foo(object): @lazy_property def __foo(self): called.append('foo') return 1 def get_foo(self): return self.__foo f = Foo() self.assertEqual(f.get_foo(), 1) self.assertEqual(len(called), 1) lazy_property.invalidate(f, '__foo') self.assertEqual(f.get_foo(), 1) self.assertEqual(len(called), 2)
def test_invalidate_mangled_attribute(self): # It should be possible to invalidate a private lazy_property attribute # by its mangled name. called = [] class Foo(object): @lazy_property def __foo(self): called.append("foo") return 1 def get_foo(self): return self.__foo f = Foo() self.assertEqual(f.get_foo(), 1) self.assertEqual(len(called), 1) lazy_property.invalidate(f, "_Foo__foo") self.assertEqual(f.get_foo(), 1) self.assertEqual(len(called), 2)