diff 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
line wrap: on
line diff
--- a/treepkg/status.py	Mon Mar 09 16:00:44 2009 +0000
+++ b/treepkg/status.py	Thu Apr 09 18:20:04 2009 +0000
@@ -1,4 +1,4 @@
-# Copyright (C) 2007, 2008 by Intevation GmbH
+# Copyright (C) 2007, 2008, 2009 by Intevation GmbH
 # Authors:
 # Bernhard Herzog <bh@intevation.de>
 #
@@ -124,35 +124,46 @@
     _attrs = set(["_filename", "_values"])
 
     def __init__(self, filename):
-        assert os.path.isabs(filename)
+        self._values = dict()
         self._filename = filename
-        self.read()
-
-    def _init_values(self):
-        self._values = {}
+        if self._filename is not None:
+            assert os.path.isabs(self._filename)
+            self.read()
 
-    def read(self):
-        self._init_values()
-        if not os.path.exists(self._filename):
-            return
-        f = open(self._filename)
-        try:
-            magic = f.next()
-            if magic != self._magic:
-                raise ValueError("File %r has wrong magic" % self._filename)
-            for line in f:
-                field, value = line.split(":", 1)
-                self._values[field] = self._fields[field].deserialize(value)
-        finally:
-            f.close()
+    def deserialize(self, iter_lines, filename=None):
+        magic = iter_lines.next()
+        if magic != self._magic:
+            message = ("Wrong magic: found %r but expected %r"
+                       % (magic, self._magic))
+            if filename is not None:
+                message += " (read from %r)" % filename
+            raise ValueError(message)
+        values = dict()
+        for line in iter_lines:
+            field, value = line.split(":", 1)
+            values[field] = self._fields[field].deserialize(value)
+        self._values = values
 
-    def write(self):
+    def serialize(self):
         lines = [self._magic]
         for field, desc in self._fields.items():
             if field in self._values:
                 lines.append("%s: %s\n"
                              % (field, desc.serialize(self._values[field])))
-        util.writefile(self._filename, "".join(lines), 0644)
+        return lines
+
+    def read(self):
+        if not os.path.exists(self._filename):
+            return
+        f = open(self._filename)
+        try:
+            self.deserialize(f, self._filename)
+        finally:
+            f.close()
+
+    def write(self):
+        if self._filename is not None:
+            util.writefile(self._filename, "".join(self.serialize()), 0644)
 
     def __getattr__(self, attr):
         desc = self._fields.get(attr)
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)