Modul relations - nástroj pro vytváření a spravování relací
| Author: | Jan Švec |
|---|---|
| Copyright: | Copyright 2005 Jan Švec |
| License: | GPL |
| Contact: | honza(at)py(dot)cz |
Úvod
Tento modul podporuje vytváření a používání relací. Relace mohou být vytvořeny mezi dvěma objekty a spravovány jednoduchým způsobem. Podporují callback funkce volané vždy, když jsou dva objekty spojeny nebo rozpojeny relací.
Download
- http://home.zcu.cz/~honzas/download/relations/ - zdrojový kód a tarball včetně dokumentace.
- Dokumentace generovaná pomocí epydoc.
Komentovaný příklad
Modelová situace:
Máme objekt třídy Application, která zobrazuje objekty Document za použití objektů View. Pokud vytvoříme Document je k němu nové View vytvořeno automaticky. Pokud je uzavřeno poslední View konkrétního objektu Document, tento Document je též uzavřen. Relace mezi objekty jsou popsány následujícím ERA modelem:
. +-------------+ 1 N +----------+ 1 N +------+ | Application |--------| Document |--------| View | +-------------+ +----------+ +------+
Pomocné třídy:
class MyObj(object):
def __init__(self, name):
self.name = name
def __repr__(self):
return '<%s %r>' % (self.__class__.__name__, self.name)
Relace (definované pomocí příkazu class), přínos modulu ``relations`` (!!!):
class RAppDocs(Relation):
name = 'app:docs*'
def plug(app, doc):
# Document nemá žádná View, vytvoříme nové
if not doc.views:
v = View('View of %s' % doc.name)
doc.views.add(v)
def unplug(app, doc):
# Document je uzavírán, odstraňme všechna jeho View
doc.views.clear()
class RViewsDoc(Relation):
name = 'views*:doc'
def unplug(view, doc):
# Bylo-li uzavřeno poslední View dokumentu, zavřeme ho též
if not doc.views:
doc.close()
# Uzavřeme View
view.close()
Třída Application:
class App(MyObj):
docs = RAppDocs.docs
Třída Document:
class Doc(MyObj):
app = RAppDocs.app
views = RViewsDoc.views
def __init__(self, *args):
super(Doc, self).__init__(*args)
self.saved = False
def save(self):
print 'Saving %r' % self
self.saved = True
def close(self):
if not self.saved:
print 'Not saved %r' % self
raise RuntimeError("Not saved")
print 'Closing document'
Třída View:
class View(MyObj):
doc = RViewsDoc.doc
def __init__(self, *args):
super(View, self).__init__(*args)
print 'New view'
def close(self):
print 'Closing view'
def __repr__(self):
return '<View of %r>' % self.doc
Vytvoříme instanci aplikace:
app = App('main')
Vytvoříme nějaké dokumenty:
d1 = Doc('FOO.TXT')
d2 = Doc('BAR.TXT')
Vytvořené dokumenty přidáme k aplikaci:
app.docs.add(d1) app.docs.add(d2)
Vytvoříme nové View, takže d2 má dvě View:
d2.views.add(View('Foo'))
print RAppDocs.all()
print RViewsDoc.all()
Pokusíme se uzavřít všechna view dokumentu d1 a tím i uzavřít d1, ale ten není uložen a je vyvolána RuntimeError:
try:
d1.views.clear()
except RuntimeError:
pass
d1.save()
print app.docs
print RAppDocs.all()
print RViewsDoc.all()
Dokument d1 můžeme uzavřít i odstraněním vazeb na app:
del d1.app print RAppDocs.all() print RViewsDoc.all()