# HG changeset patch # User Bernhard Herzog # Date 1173960001 -3600 # Node ID 17756cdce8445eaa33d30baa7bf627b812528508 # Parent dd88230dd762b1f7f2482a94db1571a15f4a7658 Make defining a status class easier with a meta class diff -r dd88230dd762 -r 17756cdce844 treepkg/status.py --- a/treepkg/status.py Thu Mar 15 12:20:12 2007 +0100 +++ b/treepkg/status.py Thu Mar 15 13:00:01 2007 +0100 @@ -51,8 +51,24 @@ return datetime.datetime(*time.strptime(string.strip(), self.date_format)[:6]) +class StatusMetaClass(type): + + def __new__(cls, name, bases, clsdict): + # Generate the _fields class variable from the field descriptors + # in clsdict. + fields = dict() + for key, value in clsdict.items(): + if isinstance(value, FieldDesc): + fields[key] = value + del clsdict[key] + clsdict["_fields"] = fields + return type.__new__(cls, name, bases, clsdict) + + class Status(object): + __metaclass__ = StatusMetaClass + # Overwrite in derived classes with a different magic string _magic = "Status 0.0\n" @@ -60,10 +76,6 @@ # variables. _attrs = set(["_filename", "_values"]) - # Derived classes should set this to a suitable list of attribute - # descriptors - _fields = () - def __init__(self, filename): assert os.path.isabs(filename) self._filename = filename @@ -118,7 +130,6 @@ _magic = "TreePackagerStatus 0.0\n" - _fields = dict(status=StringFieldDesc(default="unknown"), - start=DateFieldDesc(default=None), - stop=DateFieldDesc(default=None)) - + status = StringFieldDesc(default="unknown") + start = DateFieldDesc(default=None) + stop = DateFieldDesc(default=None)