annotate 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
rev   line source
12
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
1 # Copyright (C) 2007 by Intevation GmbH
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
2 # Authors:
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
3 # Bernhard Herzog <bh@intevation.de>
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
4 #
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
5 # This program is free software under the GPL (>=v2)
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
6 # Read the file COPYING coming with the software for details.
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
7
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
8 import os
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
9 import datetime
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
10 import time
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
11
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
12 import util
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
13
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
14
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
15 # special object to indicate no default value
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
16 nodefault = object()
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
17
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
18
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
19 class FieldDesc(object):
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
20
24
beec3ed6e0df turn the (de)serialize functions of the status fields into methods
Bernhard Herzog <bh@intevation.de>
parents: 15
diff changeset
21 def __init__(self, default=nodefault):
12
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
22 self.default = default
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
23
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
24 def has_default(self):
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
25 return self.default is not nodefault
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
26
24
beec3ed6e0df turn the (de)serialize functions of the status fields into methods
Bernhard Herzog <bh@intevation.de>
parents: 15
diff changeset
27 def serialize(self, value):
beec3ed6e0df turn the (de)serialize functions of the status fields into methods
Bernhard Herzog <bh@intevation.de>
parents: 15
diff changeset
28 raise NotImplementedError
beec3ed6e0df turn the (de)serialize functions of the status fields into methods
Bernhard Herzog <bh@intevation.de>
parents: 15
diff changeset
29
beec3ed6e0df turn the (de)serialize functions of the status fields into methods
Bernhard Herzog <bh@intevation.de>
parents: 15
diff changeset
30 def deserialize(self, string):
beec3ed6e0df turn the (de)serialize functions of the status fields into methods
Bernhard Herzog <bh@intevation.de>
parents: 15
diff changeset
31 raise NotImplementedError
beec3ed6e0df turn the (de)serialize functions of the status fields into methods
Bernhard Herzog <bh@intevation.de>
parents: 15
diff changeset
32
beec3ed6e0df turn the (de)serialize functions of the status fields into methods
Bernhard Herzog <bh@intevation.de>
parents: 15
diff changeset
33
12
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
34 class StringFieldDesc(FieldDesc):
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
35
24
beec3ed6e0df turn the (de)serialize functions of the status fields into methods
Bernhard Herzog <bh@intevation.de>
parents: 15
diff changeset
36 def serialize(self, value):
beec3ed6e0df turn the (de)serialize functions of the status fields into methods
Bernhard Herzog <bh@intevation.de>
parents: 15
diff changeset
37 return str(value)
beec3ed6e0df turn the (de)serialize functions of the status fields into methods
Bernhard Herzog <bh@intevation.de>
parents: 15
diff changeset
38
beec3ed6e0df turn the (de)serialize functions of the status fields into methods
Bernhard Herzog <bh@intevation.de>
parents: 15
diff changeset
39 def deserialize(self, value):
beec3ed6e0df turn the (de)serialize functions of the status fields into methods
Bernhard Herzog <bh@intevation.de>
parents: 15
diff changeset
40 return value.strip()
beec3ed6e0df turn the (de)serialize functions of the status fields into methods
Bernhard Herzog <bh@intevation.de>
parents: 15
diff changeset
41
12
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
42
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
43 class DateFieldDesc(FieldDesc):
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
44
24
beec3ed6e0df turn the (de)serialize functions of the status fields into methods
Bernhard Herzog <bh@intevation.de>
parents: 15
diff changeset
45 date_format = "%Y-%m-%d %H:%M:%S"
beec3ed6e0df turn the (de)serialize functions of the status fields into methods
Bernhard Herzog <bh@intevation.de>
parents: 15
diff changeset
46
beec3ed6e0df turn the (de)serialize functions of the status fields into methods
Bernhard Herzog <bh@intevation.de>
parents: 15
diff changeset
47 def serialize(self, value):
beec3ed6e0df turn the (de)serialize functions of the status fields into methods
Bernhard Herzog <bh@intevation.de>
parents: 15
diff changeset
48 return value.strftime(self.date_format)
beec3ed6e0df turn the (de)serialize functions of the status fields into methods
Bernhard Herzog <bh@intevation.de>
parents: 15
diff changeset
49
beec3ed6e0df turn the (de)serialize functions of the status fields into methods
Bernhard Herzog <bh@intevation.de>
parents: 15
diff changeset
50 def deserialize(self, string):
beec3ed6e0df turn the (de)serialize functions of the status fields into methods
Bernhard Herzog <bh@intevation.de>
parents: 15
diff changeset
51 return datetime.datetime(*time.strptime(string.strip(),
beec3ed6e0df turn the (de)serialize functions of the status fields into methods
Bernhard Herzog <bh@intevation.de>
parents: 15
diff changeset
52 self.date_format)[:6])
12
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
53
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
54
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
55 class Status(object):
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
56
29
efdd39f58a61 Introduce 'unknown' as default status of a revision
Bernhard Herzog <bh@intevation.de>
parents: 15
diff changeset
57 fields = dict(status=StringFieldDesc(default="unknown"),
15
667ae96b50f7 Add a stop field to the status
Bernhard Herzog <bh@intevation.de>
parents: 12
diff changeset
58 start=DateFieldDesc(default=None),
667ae96b50f7 Add a stop field to the status
Bernhard Herzog <bh@intevation.de>
parents: 12
diff changeset
59 stop=DateFieldDesc(default=None))
12
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
60
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
61 attrs = set(["filename", "values"])
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
62
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
63 magic = "TreePackagerStatus 0.0\n"
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
64
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
65 def __init__(self, filename):
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
66 assert os.path.isabs(filename)
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
67 self.filename = filename
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
68 self.read()
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
69
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
70 def _init_values(self):
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
71 self.values = {}
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
72
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
73 def read(self):
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
74 self._init_values()
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
75 if not os.path.exists(self.filename):
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
76 return
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
77 f = open(self.filename)
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
78 try:
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
79 magic = f.next()
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
80 if magic != self.magic:
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
81 raise ValueError("File %r has wrong magic" % self.filename)
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
82 for line in f:
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
83 field, value = line.split(":", 1)
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
84 self.values[field] = self.fields[field].deserialize(value)
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
85 finally:
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
86 f.close()
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
87
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
88 def write(self):
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
89 lines = [self.magic]
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
90 for field, desc in self.fields.items():
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
91 if field in self.values:
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
92 lines.append("%s: %s\n"
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
93 % (field, desc.serialize(self.values[field])))
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
94 util.writefile(self.filename, "".join(lines))
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
95
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
96 def __getattr__(self, attr):
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
97 desc = self.fields.get(attr)
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
98 if desc is not None:
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
99 if attr in self.values:
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
100 return self.values[attr]
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
101 elif desc.has_default():
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
102 return desc.default
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
103 raise AttributeError(attr)
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
104
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
105 def __setattr__(self, attr, value):
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
106 if attr in self.fields:
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
107 self.values[attr] = value
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
108 self.write()
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
109 elif attr in self.attrs:
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
110 self.__dict__[attr] = value
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
111 else:
f9f15ee39ed7 New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
112 raise AttributeError(attr)
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)