Mercurial > treepkg > treepkg
view treepkg/status.py @ 35:de7c1237220c
prefix the instance variables of BaseStatus with a '_'
author | Bernhard Herzog <bh@intevation.de> |
---|---|
date | Thu, 15 Mar 2007 12:04:52 +0100 |
parents | 1fefedfb77df |
children | 086c68ca51d2 |
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 BaseStatus(object): magic = "Status 0.0\n" attrs = set(["_filename", "_values"]) 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) class Status(BaseStatus): magic = "TreePackagerStatus 0.0\n" fields = dict(status=StringFieldDesc(default="unknown"), start=DateFieldDesc(default=None), stop=DateFieldDesc(default=None))