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