[SCM] GUI front-end for Debian Live. branch, master, updated. 1ad3ce3a2310adcc3f54d947751f88a5c6526caa

Chris Lamb chris at chris-lamb.co.uk
Tue Mar 4 12:58:58 UTC 2008


The following commit has been merged in the master branch:
commit 26119efe55b72c2679a081bc04d0b442602a083a
Author: Chris Lamb <chris at chris-lamb.co.uk>
Date:   Tue Mar 4 12:46:17 2008 +0000

    Update FolderOfFiles config element and tests.
    
    Signed-off-by: Chris Lamb <chris at chris-lamb.co.uk>

diff --git a/DebianLive/elements/folder_of_files.py b/DebianLive/elements/folder_of_files.py
index 0addf98..8ede713 100644
--- a/DebianLive/elements/folder_of_files.py
+++ b/DebianLive/elements/folder_of_files.py
@@ -3,34 +3,40 @@ import os
 
 from os.path import join
 
-class FolderOfFiles(object):
+class FolderOfFiles(dict):
     """
     Represents a folder containing a number of files.
     """
 
+    def __new__(self, *args, **kwargs):
+        return dict.__new__(self, *args, **kwargs)
+
     def __init__(self, basedir, name, dir):
         self.dir = os.path.join(basedir, 'config', dir)
 
-        self._stale = set()
-        self.files = {}
-
-        # No file has been deleted
-        self.file_deleted = False
-
-        self.load()
+        self.stale = set()
 
-    def __getitem__(self, k):
-        return self.files[k]
-
-    def __contains__(self, k):
-        return k in self.files
+        for name in glob.glob(join(self.dir, '*')):
+            key = name.split('/')[-1]
+            try:
+                f = open(name, 'r')
+                try:
+                    dict.__setitem__(self, key, f.read())
+                finally:
+                    f.close()
+            except IOError, e:
+                # "Is a directory"
+                if e.errno == 21:
+                    continue
+                raise e
 
     def __delitem__(self, k):
-        del self.files[k]
+        self.stale.add(k)
+        dict.__delitem__(self, k)
 
     def __setitem__(self, k, v):
-        self._stale.add(k)
-        self.files[k] = v
+        self.stale.add(k)
+        dict.__setitem__(self, k, v)
 
     def _config_exists(self, file):
         try:
@@ -39,55 +45,20 @@ class FolderOfFiles(object):
         except OSError:
             return False
 
-    def load(self):
-        """
-        Loads files.
-        """
-        self.deleted = False
-        self._stale.clear()
-        self.files.clear()
-        for name in glob.glob(join(self.dir, '*')):
-            key = name.split('/')[-1]
-            try:
-                f = open(name, 'r')
-                self.files[key] = f.read()
-                f.close()
-            except IOError, e:
-                # "Is a directory"
-                if e.errno == 21:
-                    continue
-                raise e
-
     def save(self):
-        """
-        Update all updated files in this directory.
-        """
-        for filename in self._stale:
-            pathname = join(self.dir, filename)
-            f = open(pathname, 'w+')
-            f.write(self[filename])
-            f.close()
-
-        self._stale.clear()
-
-    def delete(self, hook_name):
-        if self._config_exists(hook_name):
-            os.remove(join(self.dir, hook_name))
-        del self[hook_name]
-        if hook_name in self._stale: self._stale.remove(hook_name)
-        self.file_deleted = True
-
-    def rename(self, orig, new):
-        """
-        Throws ValueError if 'new' already exists.
-        """
-        if self._config_exists(new):
-            raise ValueError
-        if self._config_exists(orig):
-            os.rename(join(self.dir, orig), join(self.dir, new))
-        if orig in self._stale: self._stale.remove(orig)
-        self[new] = self[orig]
-        del self[orig]
+        for filename in self.stale:
+            if filename in self:
+                pathname = join(self.dir, filename)
+
+                f = open(pathname, 'w+')
+                try:
+                    f.write(self[filename])
+                finally:
+                    f.close()
+            else:
+                if self._config_exists(filename):
+                    os.remove(join(self.dir, filename))
+        self.stale.clear()
 
     def import_file(self, source):
         """
@@ -98,26 +69,21 @@ class FolderOfFiles(object):
         source_contents = f.read()
         f.close()
 
-        target_name = self._gen_import_name(source)
-        self[target_name] = source_contents
-
-        return target_name
+        def gen_import_name(filename):
+            # Use existing filename as the root
+            root = filename.split(os.sep)[-1]
 
-    def _gen_import_name(self, filename):
-        """
-        Generates a unique name of the imported file.
-        """
-        # Use existing filename as the root
-        root = filename.split(os.sep)[-1]
+            if root not in self:
+                return root
 
-        if root in self:
-            # Keep adding a number to the end until it doesn't exist.
             i = 1
             while True:
                 tmpnam = "%s-%d" % (root, i)
                 if not tmpnam in self:
                     return tmpnam
                 i += 1
-        else:
-            # Just use the root name
-            return root
+
+        target_name = gen_import_name(source)
+        self[target_name] = source_contents
+
+        return target_name
diff --git a/tests/test_folder_of_files.py b/tests/test_folder_of_files.py
index 68f7c21..bf6ec3f 100755
--- a/tests/test_folder_of_files.py
+++ b/tests/test_folder_of_files.py
@@ -9,164 +9,167 @@ sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
 from DebianLive.elements import FolderOfFiles
 
 class TestFolderOfFiles(unittest.TestCase):
+    name = 'fof-test'
+
     def setUp(self):
         import tempfile
         self.dir = tempfile.mkdtemp()
-        self.fof = FolderOfFiles(self.dir, 'dummy name', 'fof-test')
+        os.makedirs(os.path.join(self.dir, 'config', self.name))
+        self.reload()
+
+    def reload(self):
+        self.fof = FolderOfFiles(self.dir, 'dummy name', self.name)
 
     def tearDown(self):
         import shutil
         shutil.rmtree(self.dir)
 
     def f_c(self, filename):
-        return open("%s/%s" % (self.dir, filename), 'r').read()
+        return open(os.path.join(self.dir, 'config', self.name, filename), 'r').read()
 
     def write(self, filename, contents):
-        f = open("%s/%s" % (self.dir, filename), 'w+')
+        f = open(os.path.join(self.dir, 'config', self.name, filename), 'w+')
         f.write(contents)
         f.close()
 
+class TestSimple(TestFolderOfFiles):
     def testEmptyFolder(self):
-        assert len(self.fof.files) == 0
+        self.assertEqual(len(self.fof), 0)
 
     def testSmallFiles(self):
-        self.write('one', 'Contents of file one')
-        self.write('two', 'Contents of file two')
-        self.fof.load()
-        assert self.fof['one'] == 'Contents of file one'
-        assert self.fof['two'] == 'Contents of file two'
+        self.write('spam', 'eggs')
+        self.reload()
+        self.assertEqual(self.fof['spam'], 'eggs')
 
-    def testnewfile(self):
+    def testNewFile(self):
         self.fof['spam'] = 'eggs'
         self.assertRaises(IOError, self.f_c, 'spam')
 
+    def testIgnoreFoldersInDir(self):
+        os.mkdir(os.path.join(self.dir, 'config', self.name, 'dir-name'))
+        self.reload()
+        self.assertEqual(len(self.fof), 0)
+
+class TestSave(TestFolderOfFiles):
     def testSave(self):
         self.fof['spam'] = 'eggs'
         self.fof.save()
-        assert self.f_c('spam') == 'eggs'
+        self.assertEqual(self.f_c('spam'), 'eggs')
+
 
     def testEditFile(self):
         self.write('spam', 'eggs')
-        self.fof.load()
-        assert self.f_c('spam') == 'eggs'
-        self.fof['spam'] = 'moreeggs'
-        self.fof.save()
-        assert self.f_c('spam') == 'moreeggs'
+        self.reload()
+        self.assertEqual(self.f_c('spam'), 'eggs')
 
-    def testAlteredState(self):
-        assert self.fof.altered() == False
-        self.fof['spam'] = 'eggs'
-        assert self.fof.altered() == True
+        self.fof['spam'] = 'bacon'
         self.fof.save()
-        assert self.fof.altered() == False
+        self.assertEqual(self.f_c('spam'), 'bacon')
 
-    def testNewRename(self):
-        self.fof['spam'] = 'eggs'
-        self.fof.rename('spam', 'morespam')
-        assert 'morespam' in self.fof
-        assert 'spam' not in self.fof
-        self.assertRaises(IOError, self.f_c, 'morespam')
-        self.assertRaises(IOError, self.f_c, 'spam')
 
-    def testAlteredStateNewRename(self):
+class TestRename(TestFolderOfFiles):
+    def testNoSave(self):
         self.fof['spam'] = 'eggs'
-        assert self.fof.altered() == True
-        self.fof.rename('spam', 'morespam')
-        assert self.fof.altered() == True
 
-    def testExistingRename(self):
-        self.fof['spam'] = 'eggs'
-        self.fof.save()
-        self.fof.rename('spam', 'morespam')
-        assert 'morespam' in self.fof
-        assert 'spam' not in self.fof
-        assert self.f_c('morespam') == 'eggs'
+        self.fof['new_name'] = self.fof['spam']
+        del self.fof['spam']
+
+        self.assert_('new_name' in self.fof)
+        self.assert_('spam' not in self.fof)
         self.assertRaises(IOError, self.f_c, 'spam')
+        self.assertRaises(IOError, self.f_c, 'new_name')
 
-    def testRenameFileExists(self):
+    def testOneSave(self):
         self.fof['spam'] = 'eggs'
-        self.fof['morespam'] = 'moreeggs'
         self.fof.save()
-        try:
-            self.fof.rename('spam', 'morespam')
-            self.fail(msg="Should have thrown ValueError on a renaming overwrite")
-        except ValueError:
-            pass
 
-    def testAlteredStateRename(self):
+        self.fof['new_name'] = self.fof['spam']
+        del self.fof['spam']
+
+        self.assert_('new_name' in self.fof)
+        self.assert_('spam' not in self.fof)
+        self.assertEqual(self.f_c('spam'), 'eggs')
+        self.assertRaises(IOError, self.f_c, 'new_name')
+
+    def testTwoSaves(self):
         self.fof['spam'] = 'eggs'
-        assert self.fof.altered() == True
         self.fof.save()
-        assert self.fof.altered() == False
-        self.fof.rename('spam', 'morespam')
-        assert self.fof.altered() == True
 
-    def testDeleteNotSaved(self):
-        self.fof['spam'] = 'eggs'
+        self.fof['new_name'] = self.fof['spam']
+        del self.fof['spam']
+        self.fof.save()
+
+        self.assert_('new_name' in self.fof)
+        self.assert_('spam' not in self.fof)
         self.assertRaises(IOError, self.f_c, 'spam')
-        assert 'spam' in self.fof
-        self.fof.delete('spam')
-        assert 'spam' not in self.fof
+        self.assertEqual(self.f_c('new_name'), 'eggs')
 
-    def testDeleteNotSavedAlteredState(self):
-        assert self.fof.altered() == False
+class TestDelete(TestFolderOfFiles):
+    def testNoSave(self):
         self.fof['spam'] = 'eggs'
-        assert self.fof.altered() == True
-        self.fof.delete('spam')
-        assert self.fof.altered() == True
+        del self.fof['spam']
+        self.assert_('spam' not in self.fof)
+        self.assertRaises(IOError, self.f_c, 'spam')
 
-    def testDeleteSaved(self):
+    def testDeleteUnsavedItem(self):
         self.fof['spam'] = 'eggs'
+        del self.fof['spam']
         self.fof.save()
-        assert self.f_c('spam') == 'eggs'
-        self.fof.delete('spam')
+        self.assert_('spam' not in self.fof)
         self.assertRaises(IOError, self.f_c, 'spam')
 
-    def testDeleteSavedAlteredState(self):
+    def testSaved(self):
         self.fof['spam'] = 'eggs'
         self.fof.save()
-        assert self.fof.altered() == False
-        self.fof.delete('spam')
-        assert self.fof.altered() == True
+        del self.fof['spam']
+        self.fof.save()
+        self.assert_('spam' not in self.fof)
         self.assertRaises(IOError, self.f_c, 'spam')
 
-    def testIgnoreFoldersInDir(self):
-        os.mkdir("%s/spam" % self.dir,)
-        self.fof.load()
-        assert len(self.fof.files) == 0
+    def testUpdated(self):
+        self.fof['spam'] = 'eggs'
+        self.fof.save()
 
-    def testImportFile(self):
-        fd, filename = tempfile.mkstemp('live-magic')
-        conf_name = filename.split(os.sep)[-1]
-        os.write(fd, 'spam')
-        os.close(fd)
-        self.fof.import_file(filename)
+        del self.fof['spam']
+        self.fof['spam'] = 'bacon'
         self.fof.save()
-        assert self.f_c(conf_name) == 'spam'
+        self.assertEqual(self.f_c('spam'), 'bacon')
+
+class TestImport(TestFolderOfFiles):
+    def setUp(self):
+        TestFolderOfFiles.setUp(self)
 
-    def testImportFileNotSaved(self):
-        fd, filename = tempfile.mkstemp('live-magic')
-        conf_name = filename.split(os.sep)[-1]
+        import tempfile
+        fd, self.filename = tempfile.mkstemp()
+        self.conf_name = self.filename.split(os.sep)[-1]
         os.write(fd, 'spam')
         os.close(fd)
-        self.fof.import_file(filename)
-        self.assertRaises(IOError, self.f_c, conf_name)
 
-    def testImportAlreadyExists(self):
-        fd, filename = tempfile.mkstemp('live-magic')
-        conf_name = filename.split('/')[-1]
-        os.write(fd, 'file_to_import')
-        os.close(fd)
+    def tearDown(self):
+        os.unlink(self.filename)
+        TestFolderOfFiles.tearDown(self)
+
+    def testSimple(self):
+        self.fof.import_file(self.filename)
+        self.fof.save()
+        self.assertEqual(self.f_c(self.conf_name), 'spam')
+
+    def testNotSaved(self):
+        self.fof.import_file(self.filename)
+        self.assertRaises(IOError, self.f_c, self.conf_name)
 
-        self.fof[conf_name] = 'existing_file'
+    def testAlreadyExists(self):
+        self.fof[self.conf_name] = 'existing_file'
         self.fof.save()
 
-        self.fof.import_file(filename)
+        self.fof.import_file(self.filename)
         self.fof.save()
-        assert self.f_c(conf_name) == 'existing_file'
-        self.fof[conf_name] == 'existing_file'
-        assert self.f_c("%s-1" % conf_name) == 'file_to_import'
-        self.fof["%s-1" % conf_name] == 'file_to_import'
+
+        self.assertEqual(self.f_c(self.conf_name), 'existing_file')
+        self.assertEqual(self.fof[self.conf_name], 'existing_file')
+
+        self.assertEqual(self.f_c("%s-1" % self.conf_name), 'spam')
+        self.assertEqual(self.fof["%s-1" % self.conf_name], 'spam')
 
 if __name__ == "__main__":
     unittest.main()

-- 
GUI front-end for Debian Live.



More information about the debian-live-changes mailing list