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)
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)