Mercurial > treepkg > treepkg
view treepkg/status.py @ 15:667ae96b50f7
Add a stop field to the status
author | Bernhard Herzog <bh@intevation.de> |
---|---|
date | Fri, 09 Mar 2007 19:38:46 +0100 |
parents | f9f15ee39ed7 |
children | beec3ed6e0df efdd39f58a61 |
line wrap: on
line source
# Copyright (C) 2007 by Intevation GmbH # Authors: # Bernhard Herzog <bh@intevation.de> # # This program is free software under the GPL (>=v2) # Read the file COPYING coming with the software for details. import os import datetime import time import util # special object to indicate no default value nodefault = object() def serialize_datetime(d): return d.strftime("%Y-%m-%d %H:%M:%S") def deserialize_datetime(s): return datetime.datetime(*time.strptime(s.strip(), "%Y-%m-%d %H:%M:%S")[:6]) class FieldDesc(object): def __init__(self, serialize, deserialize, default=nodefault): self.serialize = serialize self.deserialize = deserialize self.default = default def has_default(self): return self.default is not nodefault class StringFieldDesc(FieldDesc): def __init__(self, **kw): super(StringFieldDesc, self).__init__(str, lambda s: s.strip(), **kw) class DateFieldDesc(FieldDesc): def __init__(self, **kw): super(DateFieldDesc, self).__init__(serialize_datetime, deserialize_datetime, **kw) class Status(object): fields = dict(status=StringFieldDesc(), start=DateFieldDesc(default=None), stop=DateFieldDesc(default=None)) attrs = set(["filename", "values"]) magic = "TreePackagerStatus 0.0\n" def __init__(self, filename): assert os.path.isabs(filename) self.filename = filename self.read() def _init_values(self): self.values = {} def read(self): self._init_values() if not os.path.exists(self.filename): return f = open(self.filename) try: magic = f.next() if magic != self.magic: raise ValueError("File %r has wrong magic" % self.filename) for line in f: field, value = line.split(":", 1) self.values[field] = self.fields[field].deserialize(value) finally: f.close() def write(self): lines = [self.magic] for field, desc in self.fields.items(): if field in self.values: lines.append("%s: %s\n" % (field, desc.serialize(self.values[field]))) util.writefile(self.filename, "".join(lines)) def __getattr__(self, attr): desc = self.fields.get(attr) if desc is not None: if attr in self.values: return self.values[attr] elif desc.has_default(): return desc.default raise AttributeError(attr) def __setattr__(self, attr, value): if attr in self.fields: self.values[attr] = value self.write() elif attr in self.attrs: self.__dict__[attr] = value else: raise AttributeError(attr)