From 2382abf129ccaafbe524230a054a36fd42cf0a93 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Tue, 27 Feb 2024 19:07:29 +0100 Subject: [PATCH] provide a virtual / dummy folder root object for top-down folder creation and access --- scopes/storage/folder.py | 17 ++++++++++++++--- scopes/storage/tracking.py | 9 +++++++++ tests/test_storage.py | 22 ++++++++++------------ 3 files changed, 33 insertions(+), 15 deletions(-) diff --git a/scopes/storage/folder.py b/scopes/storage/folder.py index 287b5b7..6a0eb88 100644 --- a/scopes/storage/folder.py +++ b/scopes/storage/folder.py @@ -22,15 +22,26 @@ class Folder(Track): def __getitem__(self, key): value = self.container.queryLast(parent=self.uid, name=key) if value is None: - raise KeyError + raise KeyError(key) return value def __setitem__(self, key, value): - value.head['parent'] = self.uid - value.head['name']= key + value.set('parent', self.uid) + value.set('name', key) self.container.save(value) +class Root(Folder): + """A dummy (virtual) root folder for creating real folders + using the Folder API.""" + + def __init__(self, storage): + cont = storage.create(Folders) + super(Root, self).__init__(container=cont) + + uid = '' + + @registerContainerClass class Folders(Container): diff --git a/scopes/storage/tracking.py b/scopes/storage/tracking.py index 4c0ea38..ba0d5c0 100644 --- a/scopes/storage/tracking.py +++ b/scopes/storage/tracking.py @@ -36,6 +36,15 @@ class Track(object): self.trackId = trackId self.container = container + def set(self, attr, value): + if attr in self.headFields: + if value is None: + value = '' + self.head[attr] = value + setattr(self, attr, value) + else: + raise AttributeError(attr) + def update(self, data, overwrite=False): if data is None: return diff --git a/tests/test_storage.py b/tests/test_storage.py index ef8f248..ed49eec 100644 --- a/tests/test_storage.py +++ b/tests/test_storage.py @@ -72,18 +72,16 @@ class Test(unittest.TestCase): def testFolder(self): storage.dropTable('folders') - cont = storage.create(folder.Folders) - self.assertEqual(list(cont.query(parent='')), []) - cont.save(folder.Folder('', 'root')) - folders = list(cont.query(parent='')) - self.assertEqual(len(folders), 1) - root = folders[0] - root['child1'] = folder.Folder(data=dict(title='First Child')) - folders = list(cont.query(parent=root.uid)) - self.assertEqual(len(folders), 1) - ch1 = root['child1'] - self.assertEqual(ch1.parent, root.uid) - assert list(root.keys()) == ['child1'] + root = folder.Root(storage) + self.assertEqual(list(root.keys()), []) + root['top'] = folder.Folder() + self.assertEqual(list(root.keys()), ['top']) + top = root['top'] + top['child1'] = folder.Folder(data=dict(title='First Child')) + self.assertEqual(list(top.keys()), ['child1']) + ch1 = top['child1'] + self.assertEqual(ch1.parent, top.uid) + assert list(top.keys()) == ['child1'] def suite(): return unittest.TestSuite((