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