Mercurial > treepkg > treepkg
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) |