Mercurial > treepkg > treepkg
view treepkg/status.py @ 31:47d69e5d8ace
merge
author | Bernhard Herzog <bh@intevation.de> |
---|---|
date | Thu, 15 Mar 2007 11:42:03 +0100 |
parents | beec3ed6e0df efdd39f58a61 |
children | 1fefedfb77df |
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() class FieldDesc(object): def __init__(self, default=nodefault): self.default = default def has_default(self): return self.default is not nodefault def serialize(self, value): raise NotImplementedError def deserialize(self, string): raise NotImplementedError class StringFieldDesc(FieldDesc): def serialize(self, value): return str(value) def deserialize(self, value): return value.strip() class DateFieldDesc(FieldDesc): date_format = "%Y-%m-%d %H:%M:%S" def serialize(self, value): return value.strftime(self.date_format) def deserialize(self, string): return datetime.datetime(*time.strptime(string.strip(), self.date_format)[:6]) class Status(object): fields = dict(status=StringFieldDesc(default="unknown"), 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)