diff --git a/demo/config.py b/demo/config.py index 80d834c..b910662 100644 --- a/demo/config.py +++ b/demo/config.py @@ -2,17 +2,19 @@ from dotenv import load_dotenv from os import getenv -from scopes.server.app import demo_app, zope_app +from scopes.server.app import zope_app_factory load_dotenv() server_port = getenv('SERVER_PORT', '8099') -app = zope_app +app_factory = zope_app_factory # storage settings +from scopes.storage.db.postgres import StorageFactory dbengine = 'postgresql+psycopg' dbname = getenv('DBNAME', 'demo') dbuser = getenv('DBUSER', 'demo') dbpassword = getenv('DBPASSWORD', 'secret') +dbschema = getenv('DBSCHEMA', 'demo') diff --git a/demo/demo_server.py b/demo/demo_server.py index b585fac..a7f69f1 100644 --- a/demo/demo_server.py +++ b/demo/demo_server.py @@ -14,6 +14,7 @@ def run(app, config): if __name__ == '__main__': import config - run(config.app, config) - #run(config.app_factory(), config) + #run(config.app, config) + app = config.app_factory(config) + run(app, config) # see zope.app.wsgi.getWSGIApplication diff --git a/scopes/server/app.py b/scopes/server/app.py index fda9130..706bbae 100644 --- a/scopes/server/app.py +++ b/scopes/server/app.py @@ -5,6 +5,8 @@ from zope.publisher.browser import BrowserRequest from zope.publisher.publish import publish from zope.traversing.publicationtraverse import PublicationTraverser +from scopes.storage.folder import Root + def demo_app(environ, start_response): print(f'*** environ {environ}.') @@ -14,18 +16,26 @@ def demo_app(environ, start_response): return ['Hello World'.encode()] -def zope_app(environ, start_response): - request = BrowserRequest(environ['wsgi.input'], environ) - request.setPublication(DefaultPublication(AppRoot())) - request = publish(request, False) - response = request.response - start_response(response.getStatusString(), response.getHeaders()) - return response.consumeBodyIter() +def zope_app_factory(config): + config.storageFactory = config.StorageFactory(config) + def zope_app(environ, start_response): + request = BrowserRequest(environ['wsgi.input'], environ) + storage = config.storageFactory(config.dbschema) + appRoot = Root(storage, config) + request.setPublication(DefaultPublication(appRoot)) + request = publish(request, False) + response = request.response + start_response(response.getStatusString(), response.getHeaders()) + return response.consumeBodyIter() + return zope_app class AppRoot: """Zope Demo AppRoot""" + def __init__(self, config): + self.config = config + def __call__(self): """calling AppRoot""" return 'At root' diff --git a/scopes/storage/folder.py b/scopes/storage/folder.py index 9ac89be..9c3463e 100644 --- a/scopes/storage/folder.py +++ b/scopes/storage/folder.py @@ -5,6 +5,7 @@ from scopes.storage.tracking import Container, Track class Folder(Track): + """Needs docstring to be traversable.""" headFields = ['parent', 'name', 'ref'] prefix = 'fldr' @@ -30,12 +31,16 @@ class Folder(Track): value.set('name', key) self.container.save(value) + def __call__(self, request=None): + return 'folder: %s; keys: %s' % (self.name, list(self.keys())) + class Root(Folder): """A dummy (virtual) root folder for creating real folders using the Folder API.""" - def __init__(self, storage): + def __init__(self, storage, config=None): + self.config = config cont = storage.create(Folders) super(Root, self).__init__(container=cont) diff --git a/tests/test_postgres.py b/tests/test_postgres.py index a94df90..bc07c0f 100644 --- a/tests/test_postgres.py +++ b/tests/test_postgres.py @@ -3,27 +3,25 @@ """Tests for the 'scopes.storage' package - using PostgreSQL.""" import unittest +import tlib_storage +from scopes.storage.db.postgres import StorageFactory import config config.dbengine = 'postgresql+psycopg' config.dbname = 'testdb' config.dbuser = 'testuser' config.dbpassword = 'secret' +config.dbschema = 'testing' +config.storageFactory = StorageFactory(config) -# PostgreSQL-specific settings -from scopes.storage.db.postgres import StorageFactory -factory = StorageFactory(config) -storage = factory(schema='testing') - -import tlib class Test(unittest.TestCase): def test_001_tracking(self): - tlib.test_tracking(self, storage) + tlib_storage.test_tracking(self, config) def test_002_folder(self): - tlib.test_folder(self, storage) + tlib_storage.test_folder(self, config) def suite(): return unittest.TestSuite(( diff --git a/tests/test_standard.py b/tests/test_standard.py index 6ff4a7e..fb54e0a 100644 --- a/tests/test_standard.py +++ b/tests/test_standard.py @@ -3,24 +3,23 @@ """Tests for the 'scopes.storage' package.""" import unittest +import tlib_storage +from scopes.storage.common import StorageFactory import config config.dbengine = 'sqlite' config.dbname = 'var/test.db' +config.dbschema = None +config.storageFactory = StorageFactory(config) -from scopes.storage.common import StorageFactory -factory = StorageFactory(config) -storage = factory(schema=None) - -import tlib class Test(unittest.TestCase): def test_001_tracking(self): - tlib.test_tracking(self, storage) + tlib_storage.test_tracking(self, config) def test_002_folder(self): - tlib.test_folder(self, storage) + tlib_storage.test_folder(self, config) def suite(): return unittest.TestSuite(( diff --git a/tests/tlib.py b/tests/tlib_storage.py similarity index 88% rename from tests/tlib.py rename to tests/tlib_storage.py index dbb6d40..5b937d9 100644 --- a/tests/tlib.py +++ b/tests/tlib_storage.py @@ -1,10 +1,12 @@ -"""The real test implementations""" +# tests/tlib_storage.py +"""Test implementation for the `scopes.storage` package.""" from datetime import datetime from scopes.storage import folder, tracking -def test_tracking(self, storage): +def test_tracking(self, config): + storage = config.storageFactory(config.dbschema) storage.dropTable('tracks') tracks = storage.create(tracking.Container) @@ -54,9 +56,10 @@ def test_tracking(self, storage): storage.commit() -def test_folder(self, storage): +def test_folder(self, config): + storage = config.storageFactory(config.dbschema) storage.dropTable('folders') - root = folder.Root(storage) + root = folder.Root(storage, config) self.assertEqual(list(root.keys()), []) root['top'] = folder.Folder() self.assertEqual(list(root.keys()), ['top'])