comparison treepkg/status.py @ 250:b3f9cc956acc

Make the Status class usable without a filename and provide methods to (de-)serialize to and from memory to make writing tests easier.
author Bernhard Herzog <bh@intevation.de>
date Thu, 09 Apr 2009 18:20:04 +0000
parents 7888fe374e11
children 27824d3add92
comparison
equal deleted inserted replaced
249:a3f106580525 250:b3f9cc956acc
1 # Copyright (C) 2007, 2008 by Intevation GmbH 1 # Copyright (C) 2007, 2008, 2009 by Intevation GmbH
2 # Authors: 2 # Authors:
3 # Bernhard Herzog <bh@intevation.de> 3 # Bernhard Herzog <bh@intevation.de>
4 # 4 #
5 # This program is free software under the GPL (>=v2) 5 # This program is free software under the GPL (>=v2)
6 # Read the file COPYING coming with the software for details. 6 # Read the file COPYING coming with the software for details.
122 # Derived classes may extend a copy of this set with more instance 122 # Derived classes may extend a copy of this set with more instance
123 # variables. 123 # variables.
124 _attrs = set(["_filename", "_values"]) 124 _attrs = set(["_filename", "_values"])
125 125
126 def __init__(self, filename): 126 def __init__(self, filename):
127 assert os.path.isabs(filename) 127 self._values = dict()
128 self._filename = filename 128 self._filename = filename
129 self.read() 129 if self._filename is not None:
130 130 assert os.path.isabs(self._filename)
131 def _init_values(self): 131 self.read()
132 self._values = {} 132
133 133 def deserialize(self, iter_lines, filename=None):
134 def read(self): 134 magic = iter_lines.next()
135 self._init_values() 135 if magic != self._magic:
136 if not os.path.exists(self._filename): 136 message = ("Wrong magic: found %r but expected %r"
137 return 137 % (magic, self._magic))
138 f = open(self._filename) 138 if filename is not None:
139 try: 139 message += " (read from %r)" % filename
140 magic = f.next() 140 raise ValueError(message)
141 if magic != self._magic: 141 values = dict()
142 raise ValueError("File %r has wrong magic" % self._filename) 142 for line in iter_lines:
143 for line in f: 143 field, value = line.split(":", 1)
144 field, value = line.split(":", 1) 144 values[field] = self._fields[field].deserialize(value)
145 self._values[field] = self._fields[field].deserialize(value) 145 self._values = values
146 finally: 146
147 f.close() 147 def serialize(self):
148
149 def write(self):
150 lines = [self._magic] 148 lines = [self._magic]
151 for field, desc in self._fields.items(): 149 for field, desc in self._fields.items():
152 if field in self._values: 150 if field in self._values:
153 lines.append("%s: %s\n" 151 lines.append("%s: %s\n"
154 % (field, desc.serialize(self._values[field]))) 152 % (field, desc.serialize(self._values[field])))
155 util.writefile(self._filename, "".join(lines), 0644) 153 return lines
154
155 def read(self):
156 if not os.path.exists(self._filename):
157 return
158 f = open(self._filename)
159 try:
160 self.deserialize(f, self._filename)
161 finally:
162 f.close()
163
164 def write(self):
165 if self._filename is not None:
166 util.writefile(self._filename, "".join(self.serialize()), 0644)
156 167
157 def __getattr__(self, attr): 168 def __getattr__(self, attr):
158 desc = self._fields.get(attr) 169 desc = self._fields.get(attr)
159 if desc is not None: 170 if desc is not None:
160 if attr in self._values: 171 if attr in self._values:
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)