diff -r --unified roundup.orig/backends/back_anydbm.py roundup/backends/back_anydbm.py --- roundup.orig/backends/back_anydbm.py 2005-07-18 03:42:26.000000000 +0200 +++ roundup/backends/back_anydbm.py 2006-01-23 17:03:14.000000000 +0100 @@ -730,32 +730,6 @@ class Class(hyperdb.Class): '''The handle to a particular class of nodes in a hyperdatabase.''' - def __init__(self, db, classname, **properties): - '''Create a new class with a given name and property specification. - - 'classname' must not collide with the name of an existing class, - or a ValueError is raised. The keyword arguments in 'properties' - must map names to property objects, or a TypeError is raised. - ''' - for name in 'creation activity creator actor'.split(): - if properties.has_key(name): - raise ValueError, '"creation", "activity", "creator" and '\ - '"actor" are reserved' - - self.classname = classname - self.properties = properties - self.db = weakref.proxy(db) # use a weak ref to avoid circularity - self.key = '' - - # should we journal changes (default yes) - self.do_journal = 1 - - # do the db-related init stuff - db.addclass(self) - - self.auditors = {'create': [], 'set': [], 'retire': [], 'restore': []} - self.reactors = {'create': [], 'set': [], 'retire': [], 'restore': []} - def enableJournalling(self): '''Turn journalling on for this class ''' @@ -1885,36 +1830,6 @@ continue self.db.indexer.add_text((self.classname, nodeid, prop), value) - - # - # Detector interface - # - def audit(self, event, detector): - '''Register a detector - ''' - l = self.auditors[event] - if detector not in l: - self.auditors[event].append(detector) - - def fireAuditors(self, action, nodeid, newvalues): - '''Fire all registered auditors. - ''' - for audit in self.auditors[action]: - audit(self.db, self, nodeid, newvalues) - - def react(self, event, detector): - '''Register a detector - ''' - l = self.reactors[event] - if detector not in l: - self.reactors[event].append(detector) - - def fireReactors(self, action, nodeid, oldvalues): - '''Fire all registered reactors. - ''' - for react in self.reactors[action]: - react(self.db, self, nodeid, oldvalues) - # # import / export support # diff -r --unified roundup.orig/backends/back_metakit.py roundup/backends/back_metakit.py --- roundup.orig/backends/back_metakit.py 2005-07-18 03:20:23.000000000 +0200 +++ roundup/backends/back_metakit.py 2006-01-23 17:04:39.000000000 +0100 @@ -399,27 +399,18 @@ privateprops = None def __init__(self, db, classname, **properties): - if (properties.has_key('creation') or properties.has_key('activity') - or properties.has_key('creator') or properties.has_key('actor')): - raise ValueError, '"creation", "activity" and "creator" are '\ - 'reserved' if hasattr(db, classname): raise ValueError, "Class %s already exists"%classname - - self.db = db - self.classname = classname + hyperdb.Class.__init__ (self, db, classname, **properties) + self.db = db # why isn't this a weakref as for other backends?? self.key = None - self.ruprops = properties + self.ruprops = self.properties self.privateprops = { 'id' : hyperdb.String(), 'activity' : hyperdb.Date(), 'actor' : hyperdb.Link('user'), 'creation' : hyperdb.Date(), 'creator' : hyperdb.Link('user') } - # event -> list of callables - self.auditors = {'create': [], 'set': [], 'retire': [], 'restore': []} - self.reactors = {'create': [], 'set': [], 'retire': [], 'restore': []} - view = self.__getview() self.maxid = 1 if view: @@ -429,13 +420,8 @@ self.rbactions = [] # people reach inside!! - self.properties = self.ruprops - self.db.addclass(self) self.idcache = {} - # default is to journal changes - self.do_journal = 1 - def setid(self, maxid): self.maxid = maxid + 1 @@ -449,35 +435,6 @@ ''' self.do_journal = 0 - # - # Detector/reactor interface - # - def audit(self, event, detector): - '''Register a detector - ''' - l = self.auditors[event] - if detector not in l: - self.auditors[event].append(detector) - - def fireAuditors(self, action, nodeid, newvalues): - '''Fire all registered auditors. - ''' - for audit in self.auditors[action]: - audit(self.db, self, nodeid, newvalues) - - def react(self, event, detector): - '''Register a reactor - ''' - l = self.reactors[event] - if detector not in l: - self.reactors[event].append(detector) - - def fireReactors(self, action, nodeid, oldvalues): - '''Fire all registered reactors. - ''' - for react in self.reactors[action]: - react(self.db, self, nodeid, oldvalues) - # --- the hyperdb.Class methods def create(self, **propvalues): ''' Create a new node of this class and return its id. diff -r --unified roundup.orig/backends/back_mysql.py roundup/backends/back_mysql.py diff -r --unified roundup.orig/backends/rdbms_common.py roundup/backends/rdbms_common.py --- roundup.orig/backends/rdbms_common.py 2005-12-13 14:49:57.000000000 +0100 +++ roundup/backends/rdbms_common.py 2006-01-23 17:02:04.240726408 +0100 @@ -1219,32 +1219,6 @@ concrete backend Class. ''' - def __init__(self, db, classname, **properties): - '''Create a new class with a given name and property specification. - - 'classname' must not collide with the name of an existing class, - or a ValueError is raised. The keyword arguments in 'properties' - must map names to property objects, or a TypeError is raised. - ''' - for name in 'creation activity creator actor'.split(): - if properties.has_key(name): - raise ValueError, '"creation", "activity", "creator" and '\ - '"actor" are reserved' - - self.classname = classname - self.properties = properties - self.db = weakref.proxy(db) # use a weak ref to avoid circularity - self.key = '' - - # should we journal changes (default yes) - self.do_journal = 1 - - # do the db-related init stuff - db.addclass(self) - - self.auditors = {'create': [], 'set': [], 'retire': [], 'restore': []} - self.reactors = {'create': [], 'set': [], 'retire': [], 'restore': []} - def schema(self): ''' A dumpable version of the schema that we can store in the database @@ -2332,36 +2280,6 @@ self.db.indexer.add_text((self.classname, nodeid, prop), str(self.get(nodeid, prop))) - - # - # Detector interface - # - def audit(self, event, detector): - '''Register a detector - ''' - l = self.auditors[event] - if detector not in l: - self.auditors[event].append(detector) - - def fireAuditors(self, action, nodeid, newvalues): - '''Fire all registered auditors. - ''' - for audit in self.auditors[action]: - audit(self.db, self, nodeid, newvalues) - - def react(self, event, detector): - '''Register a detector - ''' - l = self.reactors[event] - if detector not in l: - self.reactors[event].append(detector) - - def fireReactors(self, action, nodeid, oldvalues): - '''Fire all registered reactors. - ''' - for react in self.reactors[action]: - react(self.db, self, nodeid, oldvalues) - # # import / export support # diff -r --unified roundup.orig/hyperdb.py roundup/hyperdb.py --- roundup.orig/hyperdb.py 2005-07-18 04:27:14.000000000 +0200 +++ roundup/hyperdb.py 2006-01-23 20:27:12.290551366 +0100 @@ -22,10 +22,11 @@ __docformat__ = 'restructuredtext' # standard python modules -import sys, os, time, re, shutil +import sys, os, time, re, shutil, weakref # roundup modules import date, password +from support import PrioList # # Types @@ -440,7 +441,25 @@ or a ValueError is raised. The keyword arguments in 'properties' must map names to property objects, or a TypeError is raised. """ - raise NotImplementedError + for name in 'creation activity creator actor'.split(): + if properties.has_key(name): + raise ValueError, '"creation", "activity", "creator" and '\ + '"actor" are reserved' + + self.classname = classname + self.properties = properties + self.db = weakref.proxy(db) # use a weak ref to avoid circularity + self.key = '' + + # should we journal changes (default yes) + self.do_journal = 1 + + # do the db-related init stuff + db.addclass(self) + + actions = "create set retire restore".split () + self.auditors = dict ([(a, PrioList ()) for a in actions]) + self.reactors = dict ([(a, PrioList ()) for a in actions]) def __repr__(self): '''Slightly more useful representation @@ -685,6 +753,34 @@ ''' raise NotImplementedError + # + # Detector interface + # + def audit(self, action, detector, priority = 100): + '''Register a detector + ''' + self.auditors[action].append((priority, detector)) + + def fireAuditors(self, action, nodeid, newvalues): + '''Fire all registered auditors. + ''' + for prio, audit in self.auditors[action]: + audit(self.db, self, nodeid, newvalues) + + def react(self, action, detector, priority = 100): + '''Register a detector + ''' + self.reactors[action].append((priority, detector)) + + def fireReactors(self, action, nodeid, oldvalues): + '''Fire all registered reactors. + ''' + for prio, react in self.reactors[action]: + react(self.db, self, nodeid, oldvalues) + + # + # import / export support + # def export_propnames(self): '''List the property names for export from this Class.''' propnames = self.getprops().keys() diff -r --unified roundup.orig/support.py roundup/support.py --- roundup.orig/support.py 2005-01-03 03:53:03.000000000 +0100 +++ roundup/support.py 2006-01-23 14:18:49.419359040 +0100 @@ -18,4 +18,36 @@ def __getitem__(self, name): return self.keys.has_key(name) +class PrioList: + '''Manages a sorted list. + Currently only implements method 'append' and iteration from a + full list interface. + Implementation: We manage a "sorted" status and sort on demand. + Appending to the list will require re-sorting before use. + >>> p = PrioList () + >>> for i in 5,7,1,-1 : + ... p.append (i) + ... + >>> for k in p : + ... print k + ... + -1 + 1 + 5 + 7 + ''' + def __init__(self): + self.list = [] + self.sorted = True + + def append(self, item): + self.list.append (item) + self.sorted = False + + def __iter__(self): + if not self.sorted : + self.list.sort () + self.sorted = True + return iter (self.list) + # vim: set et sts=4 sw=4 :