From 77f5abc7bffc76cc53396a61593e8d63624b7e90 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Tue, 27 Feb 2024 17:40:59 +0100 Subject: [PATCH] basic folder implementation with tests --- demo/config.py | 9 ++++++++- pyproject.toml | 2 +- scopes/server/app.py | 1 + scopes/storage/folder.py | 22 +++++++++++++++++----- tests/test_storage.py | 13 ++++++++++++- 5 files changed, 39 insertions(+), 8 deletions(-) diff --git a/demo/config.py b/demo/config.py index 464dff2..80d834c 100644 --- a/demo/config.py +++ b/demo/config.py @@ -6,6 +6,13 @@ from scopes.server.app import demo_app, zope_app load_dotenv() -server_port = getenv('SERVER_PORT', '8999') +server_port = getenv('SERVER_PORT', '8099') app = zope_app + +# storage settings +dbengine = 'postgresql+psycopg' +dbname = getenv('DBNAME', 'demo') +dbuser = getenv('DBUSER', 'demo') +dbpassword = getenv('DBPASSWORD', 'secret') + diff --git a/pyproject.toml b/pyproject.toml index 405c74e..7b09479 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,7 +19,7 @@ dependencies = [ ] [project.optional-dependencies] -demo = ["python-dotenv", "zope.publisher"] +app = ["python-dotenv", "zope.publisher", "zope.traversing"] test = ["pytest"] [tool.setuptools] diff --git a/scopes/server/app.py b/scopes/server/app.py index 675a789..fda9130 100644 --- a/scopes/server/app.py +++ b/scopes/server/app.py @@ -3,6 +3,7 @@ from zope.publisher.base import DefaultPublication from zope.publisher.browser import BrowserRequest from zope.publisher.publish import publish +from zope.traversing.publicationtraverse import PublicationTraverser def demo_app(environ, start_response): diff --git a/scopes/storage/folder.py b/scopes/storage/folder.py index a2c85d6..287b5b7 100644 --- a/scopes/storage/folder.py +++ b/scopes/storage/folder.py @@ -6,23 +6,35 @@ from scopes.storage.tracking import Container, Track class Folder(Track): - headFields = ['parent', 'name'] + headFields = ['parent', 'name', 'ref'] prefix = 'fldr' def keys(self): - return [] + for f in self.container.query(parent=self.uid): + yield f.name def get(self, key, default=None): - return default + value = self.container.queryLast(parent=self.uid, name=key) + if value is None: + return default + return value def __getitem__(self, key): - raise KeyError + value = self.container.queryLast(parent=self.uid, name=key) + if value is None: + raise KeyError + return value + + def __setitem__(self, key, value): + value.head['parent'] = self.uid + value.head['name']= key + self.container.save(value) @registerContainerClass class Folders(Container): itemFactory = Folder - indexes = [('parent', 'name')] + indexes = [('parent', 'name'), ('ref',)] tableName = 'folders' insertOnChange = False diff --git a/tests/test_storage.py b/tests/test_storage.py index 9180e3b..ef8f248 100644 --- a/tests/test_storage.py +++ b/tests/test_storage.py @@ -72,7 +72,18 @@ class Test(unittest.TestCase): def testFolder(self): storage.dropTable('folders') - folders = storage.create(folder.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'] def suite(): return unittest.TestSuite((