Mercurial > treepkg > treepkg
annotate treepkg/status.py @ 579:97a5e09c84dc tip
Fix: pass url to command expand to be able to checkout a new git repository
author | Bjoern Ricks <bricks@intevation.de> |
---|---|
date | Sat, 03 Sep 2011 12:32:32 +0000 |
parents | 5fda6768bef6 |
children |
rev | line source |
---|---|
250
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
1 # Copyright (C) 2007, 2008, 2009 by Intevation GmbH |
12
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 |
40
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
27 def set_default(self, value): |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
28 self.default = value |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
29 |
24
beec3ed6e0df
turn the (de)serialize functions of the status fields into methods
Bernhard Herzog <bh@intevation.de>
parents:
15
diff
changeset
|
30 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
|
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 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
|
34 raise NotImplementedError |
beec3ed6e0df
turn the (de)serialize functions of the status fields into methods
Bernhard Herzog <bh@intevation.de>
parents:
15
diff
changeset
|
35 |
beec3ed6e0df
turn the (de)serialize functions of the status fields into methods
Bernhard Herzog <bh@intevation.de>
parents:
15
diff
changeset
|
36 |
12
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
37 class StringFieldDesc(FieldDesc): |
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
38 |
24
beec3ed6e0df
turn the (de)serialize functions of the status fields into methods
Bernhard Herzog <bh@intevation.de>
parents:
15
diff
changeset
|
39 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
|
40 return str(value) |
beec3ed6e0df
turn the (de)serialize functions of the status fields into methods
Bernhard Herzog <bh@intevation.de>
parents:
15
diff
changeset
|
41 |
beec3ed6e0df
turn the (de)serialize functions of the status fields into methods
Bernhard Herzog <bh@intevation.de>
parents:
15
diff
changeset
|
42 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
|
43 return value.strip() |
beec3ed6e0df
turn the (de)serialize functions of the status fields into methods
Bernhard Herzog <bh@intevation.de>
parents:
15
diff
changeset
|
44 |
12
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
45 |
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
46 class DateFieldDesc(FieldDesc): |
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
47 |
24
beec3ed6e0df
turn the (de)serialize functions of the status fields into methods
Bernhard Herzog <bh@intevation.de>
parents:
15
diff
changeset
|
48 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
|
49 |
beec3ed6e0df
turn the (de)serialize functions of the status fields into methods
Bernhard Herzog <bh@intevation.de>
parents:
15
diff
changeset
|
50 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
|
51 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
|
52 |
beec3ed6e0df
turn the (de)serialize functions of the status fields into methods
Bernhard Herzog <bh@intevation.de>
parents:
15
diff
changeset
|
53 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
|
54 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
|
55 self.date_format)[:6]) |
12
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
56 |
40
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
57 |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
58 class EnumValue(object): |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
59 |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
60 def __init__(self, name, description, finished=False, error=False): |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
61 self.name = name |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
62 self.description = description |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
63 self.finished = finished |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
64 self.error = error |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
65 |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
66 |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
67 class EnumFieldDesc(FieldDesc): |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
68 |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
69 def __init__(self, *args, **kw): |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
70 super(EnumFieldDesc, self).__init__(*args, **kw) |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
71 self.values = {} |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
72 |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
73 def add(self, name, description, default=False, **kw): |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
74 enum = EnumValue(name, description, **kw) |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
75 self.values[enum.name] = enum |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
76 if default: |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
77 self.set_default(enum) |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
78 |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
79 def __iter__(self): |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
80 return self.values.itervalues() |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
81 |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
82 def serialize(self, value): |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
83 assert value.name is not None |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
84 return value.name |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
85 |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
86 def deserialize(self, string): |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
87 return self.values[string.strip()] |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
88 |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
89 |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
90 def make_setter(fieldname, enum): |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
91 def setter(self): |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
92 setattr(self, fieldname, enum) |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
93 setter.__name__ = enum.name |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
94 return setter |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
95 |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
96 |
39
17756cdce844
Make defining a status class easier with a meta class
Bernhard Herzog <bh@intevation.de>
parents:
38
diff
changeset
|
97 class StatusMetaClass(type): |
17756cdce844
Make defining a status class easier with a meta class
Bernhard Herzog <bh@intevation.de>
parents:
38
diff
changeset
|
98 |
17756cdce844
Make defining a status class easier with a meta class
Bernhard Herzog <bh@intevation.de>
parents:
38
diff
changeset
|
99 def __new__(cls, name, bases, clsdict): |
17756cdce844
Make defining a status class easier with a meta class
Bernhard Herzog <bh@intevation.de>
parents:
38
diff
changeset
|
100 # Generate the _fields class variable from the field descriptors |
40
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
101 # in clsdict and remove the descriptors themselves. Also, add |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
102 # one setter method for each enum. |
39
17756cdce844
Make defining a status class easier with a meta class
Bernhard Herzog <bh@intevation.de>
parents:
38
diff
changeset
|
103 fields = dict() |
17756cdce844
Make defining a status class easier with a meta class
Bernhard Herzog <bh@intevation.de>
parents:
38
diff
changeset
|
104 for key, value in clsdict.items(): |
17756cdce844
Make defining a status class easier with a meta class
Bernhard Herzog <bh@intevation.de>
parents:
38
diff
changeset
|
105 if isinstance(value, FieldDesc): |
17756cdce844
Make defining a status class easier with a meta class
Bernhard Herzog <bh@intevation.de>
parents:
38
diff
changeset
|
106 fields[key] = value |
17756cdce844
Make defining a status class easier with a meta class
Bernhard Herzog <bh@intevation.de>
parents:
38
diff
changeset
|
107 del clsdict[key] |
40
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
108 if isinstance(value, EnumFieldDesc): |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
109 for enum in value: |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
39
diff
changeset
|
110 clsdict[enum.name] = make_setter(key, enum) |
39
17756cdce844
Make defining a status class easier with a meta class
Bernhard Herzog <bh@intevation.de>
parents:
38
diff
changeset
|
111 clsdict["_fields"] = fields |
17756cdce844
Make defining a status class easier with a meta class
Bernhard Herzog <bh@intevation.de>
parents:
38
diff
changeset
|
112 return type.__new__(cls, name, bases, clsdict) |
17756cdce844
Make defining a status class easier with a meta class
Bernhard Herzog <bh@intevation.de>
parents:
38
diff
changeset
|
113 |
17756cdce844
Make defining a status class easier with a meta class
Bernhard Herzog <bh@intevation.de>
parents:
38
diff
changeset
|
114 |
37
eae021bb673d
Rename BaseStatus to Status
Bernhard Herzog <bh@intevation.de>
parents:
36
diff
changeset
|
115 class Status(object): |
12
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
116 |
39
17756cdce844
Make defining a status class easier with a meta class
Bernhard Herzog <bh@intevation.de>
parents:
38
diff
changeset
|
117 __metaclass__ = StatusMetaClass |
17756cdce844
Make defining a status class easier with a meta class
Bernhard Herzog <bh@intevation.de>
parents:
38
diff
changeset
|
118 |
38
dd88230dd762
Prefix some more attributes of Status with an underscore
Bernhard Herzog <bh@intevation.de>
parents:
37
diff
changeset
|
119 # Overwrite in derived classes with a different magic string |
dd88230dd762
Prefix some more attributes of Status with an underscore
Bernhard Herzog <bh@intevation.de>
parents:
37
diff
changeset
|
120 _magic = "Status 0.0\n" |
12
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
121 |
38
dd88230dd762
Prefix some more attributes of Status with an underscore
Bernhard Herzog <bh@intevation.de>
parents:
37
diff
changeset
|
122 # Derived classes may extend a copy of this set with more instance |
dd88230dd762
Prefix some more attributes of Status with an underscore
Bernhard Herzog <bh@intevation.de>
parents:
37
diff
changeset
|
123 # variables. |
464
5fda6768bef6
Enable a status_hook to be set and executed on status changes
Andre Heinecke <aheinecke@intevation.de>
parents:
259
diff
changeset
|
124 _attrs = set(["_filename", "_values", "_after_setattr"]) |
38
dd88230dd762
Prefix some more attributes of Status with an underscore
Bernhard Herzog <bh@intevation.de>
parents:
37
diff
changeset
|
125 |
464
5fda6768bef6
Enable a status_hook to be set and executed on status changes
Andre Heinecke <aheinecke@intevation.de>
parents:
259
diff
changeset
|
126 def __init__(self, filename, after_setattr=None): |
250
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
127 self._values = dict() |
35
de7c1237220c
prefix the instance variables of BaseStatus with a '_'
Bernhard Herzog <bh@intevation.de>
parents:
34
diff
changeset
|
128 self._filename = filename |
464
5fda6768bef6
Enable a status_hook to be set and executed on status changes
Andre Heinecke <aheinecke@intevation.de>
parents:
259
diff
changeset
|
129 self._after_setattr = after_setattr |
250
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
130 if self._filename is not None: |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
131 assert os.path.isabs(self._filename) |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
132 self.read() |
12
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
133 |
250
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
134 def deserialize(self, iter_lines, filename=None): |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
135 magic = iter_lines.next() |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
136 if magic != self._magic: |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
137 message = ("Wrong magic: found %r but expected %r" |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
138 % (magic, self._magic)) |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
139 if filename is not None: |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
140 message += " (read from %r)" % filename |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
141 raise ValueError(message) |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
142 values = dict() |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
143 for line in iter_lines: |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
144 field, value = line.split(":", 1) |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
145 values[field] = self._fields[field].deserialize(value) |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
146 self._values = values |
12
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
147 |
250
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
148 def serialize(self): |
38
dd88230dd762
Prefix some more attributes of Status with an underscore
Bernhard Herzog <bh@intevation.de>
parents:
37
diff
changeset
|
149 lines = [self._magic] |
dd88230dd762
Prefix some more attributes of Status with an underscore
Bernhard Herzog <bh@intevation.de>
parents:
37
diff
changeset
|
150 for field, desc in self._fields.items(): |
35
de7c1237220c
prefix the instance variables of BaseStatus with a '_'
Bernhard Herzog <bh@intevation.de>
parents:
34
diff
changeset
|
151 if field in self._values: |
12
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
152 lines.append("%s: %s\n" |
35
de7c1237220c
prefix the instance variables of BaseStatus with a '_'
Bernhard Herzog <bh@intevation.de>
parents:
34
diff
changeset
|
153 % (field, desc.serialize(self._values[field]))) |
250
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
154 return lines |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
155 |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
156 def read(self): |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
157 if not os.path.exists(self._filename): |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
158 return |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
159 f = open(self._filename) |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
160 try: |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
161 self.deserialize(f, self._filename) |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
162 finally: |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
163 f.close() |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
164 |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
165 def write(self): |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
166 if self._filename is not None: |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
167 util.writefile(self._filename, "".join(self.serialize()), 0644) |
12
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
168 |
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
169 def __getattr__(self, attr): |
38
dd88230dd762
Prefix some more attributes of Status with an underscore
Bernhard Herzog <bh@intevation.de>
parents:
37
diff
changeset
|
170 desc = self._fields.get(attr) |
12
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
171 if desc is not None: |
35
de7c1237220c
prefix the instance variables of BaseStatus with a '_'
Bernhard Herzog <bh@intevation.de>
parents:
34
diff
changeset
|
172 if attr in self._values: |
de7c1237220c
prefix the instance variables of BaseStatus with a '_'
Bernhard Herzog <bh@intevation.de>
parents:
34
diff
changeset
|
173 return self._values[attr] |
12
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
174 elif desc.has_default(): |
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
175 return desc.default |
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
176 raise AttributeError(attr) |
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
177 |
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
178 def __setattr__(self, attr, value): |
38
dd88230dd762
Prefix some more attributes of Status with an underscore
Bernhard Herzog <bh@intevation.de>
parents:
37
diff
changeset
|
179 if attr in self._fields: |
35
de7c1237220c
prefix the instance variables of BaseStatus with a '_'
Bernhard Herzog <bh@intevation.de>
parents:
34
diff
changeset
|
180 self._values[attr] = value |
12
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
181 self.write() |
464
5fda6768bef6
Enable a status_hook to be set and executed on status changes
Andre Heinecke <aheinecke@intevation.de>
parents:
259
diff
changeset
|
182 if self._after_setattr is not None: |
5fda6768bef6
Enable a status_hook to be set and executed on status changes
Andre Heinecke <aheinecke@intevation.de>
parents:
259
diff
changeset
|
183 self._after_setattr(self, attr) |
38
dd88230dd762
Prefix some more attributes of Status with an underscore
Bernhard Herzog <bh@intevation.de>
parents:
37
diff
changeset
|
184 elif attr in self._attrs: |
12
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
185 self.__dict__[attr] = value |
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
186 else: |
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
187 raise AttributeError(attr) |
34
1fefedfb77df
Separate a generic base class from Status
Bernhard Herzog <bh@intevation.de>
parents:
31
diff
changeset
|
188 |
1fefedfb77df
Separate a generic base class from Status
Bernhard Herzog <bh@intevation.de>
parents:
31
diff
changeset
|
189 |
37
eae021bb673d
Rename BaseStatus to Status
Bernhard Herzog <bh@intevation.de>
parents:
36
diff
changeset
|
190 class RevisionStatus(Status): |
34
1fefedfb77df
Separate a generic base class from Status
Bernhard Herzog <bh@intevation.de>
parents:
31
diff
changeset
|
191 |
38
dd88230dd762
Prefix some more attributes of Status with an underscore
Bernhard Herzog <bh@intevation.de>
parents:
37
diff
changeset
|
192 _magic = "TreePackagerStatus 0.0\n" |
34
1fefedfb77df
Separate a generic base class from Status
Bernhard Herzog <bh@intevation.de>
parents:
31
diff
changeset
|
193 |
41
f7ec40638a06
use the enums for the status field of RevisionStatus
Bernhard Herzog <bh@intevation.de>
parents:
40
diff
changeset
|
194 status = EnumFieldDesc() |
f7ec40638a06
use the enums for the status field of RevisionStatus
Bernhard Herzog <bh@intevation.de>
parents:
40
diff
changeset
|
195 status.add("creating_source_package", "creating source package") |
f7ec40638a06
use the enums for the status field of RevisionStatus
Bernhard Herzog <bh@intevation.de>
parents:
40
diff
changeset
|
196 status.add("source_package_created", "source package created") |
f7ec40638a06
use the enums for the status field of RevisionStatus
Bernhard Herzog <bh@intevation.de>
parents:
40
diff
changeset
|
197 status.add("creating_binary_package", "building binary packages") |
f7ec40638a06
use the enums for the status field of RevisionStatus
Bernhard Herzog <bh@intevation.de>
parents:
40
diff
changeset
|
198 status.add("binary_package_created", "build successful", finished=True) |
f7ec40638a06
use the enums for the status field of RevisionStatus
Bernhard Herzog <bh@intevation.de>
parents:
40
diff
changeset
|
199 status.add("error", "error", error=True) |
f7ec40638a06
use the enums for the status field of RevisionStatus
Bernhard Herzog <bh@intevation.de>
parents:
40
diff
changeset
|
200 status.add("unknown", "unknown", default=True) |
f7ec40638a06
use the enums for the status field of RevisionStatus
Bernhard Herzog <bh@intevation.de>
parents:
40
diff
changeset
|
201 |
39
17756cdce844
Make defining a status class easier with a meta class
Bernhard Herzog <bh@intevation.de>
parents:
38
diff
changeset
|
202 start = DateFieldDesc(default=None) |
17756cdce844
Make defining a status class easier with a meta class
Bernhard Herzog <bh@intevation.de>
parents:
38
diff
changeset
|
203 stop = DateFieldDesc(default=None) |
99
7888fe374e11
Add support for notification mails in case of build errors
Bernhard Herzog <bh@intevation.de>
parents:
58
diff
changeset
|
204 |
259
27824d3add92
Add a tags field to the revision status to keep track of which tags
Bernhard Herzog <bh@intevation.de>
parents:
250
diff
changeset
|
205 tags = StringFieldDesc(default="") |
27824d3add92
Add a tags field to the revision status to keep track of which tags
Bernhard Herzog <bh@intevation.de>
parents:
250
diff
changeset
|
206 |
99
7888fe374e11
Add support for notification mails in case of build errors
Bernhard Herzog <bh@intevation.de>
parents:
58
diff
changeset
|
207 notification_mail = EnumFieldDesc() |
7888fe374e11
Add support for notification mails in case of build errors
Bernhard Herzog <bh@intevation.de>
parents:
58
diff
changeset
|
208 notification_mail.add("notification_sent", |
7888fe374e11
Add support for notification mails in case of build errors
Bernhard Herzog <bh@intevation.de>
parents:
58
diff
changeset
|
209 "notification mail has been sent", default=True) |
7888fe374e11
Add support for notification mails in case of build errors
Bernhard Herzog <bh@intevation.de>
parents:
58
diff
changeset
|
210 notification_mail.add("notification_pending", |
7888fe374e11
Add support for notification mails in case of build errors
Bernhard Herzog <bh@intevation.de>
parents:
58
diff
changeset
|
211 "notification mail still needs to be sent") |