Skip to content

Instantly share code, notes, and snippets.

@milibopp
Created August 30, 2013 13:19
Show Gist options
  • Save milibopp/6389779 to your computer and use it in GitHub Desktop.
Save milibopp/6389779 to your computer and use it in GitHub Desktop.
def test_weak_and_lazy_loading():
'''Test loading/saving of model references'''
class ChainMember(Model):
'''This is a simple infinite chain of models referencing each other.'''
def __init__(self, number, prev_member=None, next_member=None):
Model.__init__(self)
self.number = number
self.prev_member = ref(prev_member, prev_member.model_id if prev_member is not None else None)
self.next_member = ref(next_member, next_member.model_id if next_member is not None else None)
@weak_and_lazy
def prev_member(self, model_id):
try:
return self.loader.load(model_id)
except KeyError:
new_chain = ChainMember(self.number - 1, None, self)
self.loader.register(new_chain)
return new_chain
@weak_and_lazy
def next_member(self, model_id):
try:
return self.loader.load(model_id)
except KeyError:
new_chain = ChainMember(self.number + 1, self, None)
self.loader.register(new_chain)
return new_chain
# Instantiate loader
loader = DefaultLoader()
# Create a chain and register it
c1 = ChainMember(1)
loader.register(c1)
# Obtain more members
c2 = c1.next_member
assert c2.number == 2
c3 = c2.next_member
assert c3.prev_member is c1.next_member
# Test the loading from the backend by asserting identity after deleting
# the second chain member
print c2
del c2
print id(c3.prev_member)
print id(c1.next_member)
assert c3.prev_member is c1.next_member
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment