[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