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