changeset 143:236786389dfd

Added file-system backend for report storage.
author cmlenz
date Thu, 18 Aug 2005 11:24:32 +0000
parents 5a27ec93100d
children 76dea27af878
files bitten/store.py bitten/tests/store.py
diffstat 2 files changed, 98 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/bitten/store.py
+++ b/bitten/store.py
@@ -140,3 +140,63 @@
                 container.addIndex('', name, index, ctxt)
             return container
         return mgr.openContainer(self.path)
+
+
+class FSBackend(Component):
+    implements(IReportStoreBackend)
+
+
+    class FileWrapper(xmlio.ParsedElement):
+
+        _metadata = None
+
+        def __init__(self, path):
+            self.path = path
+            from xml.dom import minidom
+            fd = file(path, 'r')
+            try:
+                dom = minidom.parse(fd)
+            finally:
+                fd.close()
+            xmlio.ParsedElement.__init__(self, dom.documentElement)
+
+        def _get_metadata(self):
+            if self._metadata is None:
+                step_dir = os.path.dirname(self.path)
+                build_dir = os.path.dirname(step_dir)
+                self._metadata = {
+                    'build': os.path.basename(build_dir),
+                    'step': os.path.basename(step_dir)
+                }
+            return self._metadata
+        metadata = property(fget=lambda self: self._get_metadata())
+
+
+    def __init__(self):
+        self.path = os.path.join(self.env.path, 'reports')
+
+    def _get_path(self, build, step, type=None):
+        if type:
+            return os.path.join(self.path, build.id, step.name, type) + '.xml'
+        else:
+            return os.path.join(self.path, build.id, step.name)
+
+    def store_report(self, build, step, xml):
+        if not os.path.exists(self.path):
+            os.mkdir(self.path)
+        dirname = os.path.join(self.path, str(build.id), step.name)
+        if not os.path.exists(dirname):
+            os.makedirs(dirname)
+        filename = os.path.join(dirname, xml.attr['type'] + '.xml')
+        fd = file(filename, 'w')
+        try:
+            xml.write(fd)
+        finally:
+            fd.close()
+
+    def retrieve_reports(self, build, step, type=None):
+        dirname = os.path.join(self.path, str(build.id), step.name)
+        if os.path.exists(dirname):
+            for filename in os.listdir(dirname):
+                if type is None or filename == type + '.xml':
+                    yield FSBackend.FileWrapper(os.path.join(dirname, filename))
--- a/bitten/tests/store.py
+++ b/bitten/tests/store.py
@@ -25,7 +25,7 @@
 import unittest
 
 from trac.test import EnvironmentStub, Mock
-from bitten.store import BDBXMLBackend
+from bitten.store import BDBXMLBackend, FSBackend
 from bitten.util import xmlio
 
 
@@ -63,13 +63,48 @@
         self.assertEqual(1, len(reports))
 
 
+class FSBackendTestCase(unittest.TestCase):
+
+    def setUp(self):
+        self.env = EnvironmentStub()
+        self.env.path = tempfile.mkdtemp('bitten-test')
+
+    def tearDown(self):
+        shutil.rmtree(self.env.path)
+
+    def test_store_report(self):
+        store = FSBackend(self.env)
+        build = Mock(id=42)
+        step = Mock(name='foo')
+        xml = xmlio.Element('report', type='test')[xmlio.Element('dummy')]
+        store.store_report(build, step, xml)
+
+        xml = xmlio.Element('report', type='lint')[xmlio.Element('dummy')]
+        store.store_report(build, step, xml)
+
+        reports = list(store.retrieve_reports(build, step))
+        self.assertEqual(2, len(reports))
+        self.assertEqual('42', reports[0].metadata['build'])
+        self.assertEqual('foo', reports[0].metadata['step'])
+        self.assertEqual('42', reports[1].metadata['build'])
+        self.assertEqual('foo', reports[1].metadata['step'])
+
+        reports = list(store.retrieve_reports(build, step, 'test'))
+        self.assertEqual(1, len(reports))
+
+        reports = list(store.retrieve_reports(build, step, 'lint'))
+        self.assertEqual(1, len(reports))
+
+
 def suite():
+    suite = unittest.TestSuite()
     try:
         import dbxml
-        return unittest.makeSuite(BDBXMLBackendTestCase, 'test')
+        suite.addTest(unittest.makeSuite(BDBXMLBackendTestCase, 'test'))
     except ImportError:
         print>>sys.stderr, 'Skipping unit tests for BDB XML backend'
-    return unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(FSBackendTestCase, 'test'))
+    return suite
 
 if __name__ == '__main__':
     unittest.main(defaultTest='suite')
Copyright (C) 2012-2017 Edgewall Software