diff --git a/interfaces.py b/interfaces.py new file mode 100644 index 0000000..ff203cf --- /dev/null +++ b/interfaces.py @@ -0,0 +1,3 @@ +# scopes.interfaces + + diff --git a/scopes/interfaces.py b/scopes/interfaces.py new file mode 100644 index 0000000..8d1eef1 --- /dev/null +++ b/scopes/interfaces.py @@ -0,0 +1,24 @@ +# scopes.interfaces + +from zope.interface import Interface + + +class ITraversable(Interface): + + def items(): + """Return a sequence of key, value pairs of child objects.""" + + def keys(): + """Return a sequence of keys of child objects.""" + + def get(key, default): + """Return the item addressed by `key`; return `default` if not found.""" + + def __getitem__(key): + """Return the item addressed by `key`; rais KeyError if not found.""" + + def __setitem__(key, value): + """Store the `value` under the `key`. + + May modify `value` so that the attributes referencing this object + and the value object (e.g. `parent´ and `name`) are stored correctly.""" diff --git a/scopes/server/app.py b/scopes/server/app.py index 706bbae..1ed9223 100644 --- a/scopes/server/app.py +++ b/scopes/server/app.py @@ -8,47 +8,21 @@ from zope.traversing.publicationtraverse import PublicationTraverser from scopes.storage.folder import Root -def demo_app(environ, start_response): - print(f'*** environ {environ}.') - status = '200 OK' - headers = [("Content-type", "text/plain; charset=utf-8")] - start_response(status, headers) - return ['Hello World'.encode()] - - def zope_app_factory(config): - config.storageFactory = config.StorageFactory(config) + storageFactory = config.StorageFactory(config) def zope_app(environ, start_response): - request = BrowserRequest(environ['wsgi.input'], environ) - storage = config.storageFactory(config.dbschema) + storage = storageFactory(config.dbschema) appRoot = Root(storage, config) - request.setPublication(DefaultPublication(appRoot)) - request = publish(request, False) + request = BrowserRequest(environ['wsgi.input'], environ) + request.setPublication(Publication(appRoot)) + request = publish(request, True) 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' - - def __getitem__(self, key): - def child(): - """get child""" - print(f'--- getitem {key}') - return 'getitem' - return child - - def hello(self): - """method hello""" - return 'Hello AppRoot' +class Publication(DefaultPublication): + pass diff --git a/scopes/storage/folder.py b/scopes/storage/folder.py index 9c3463e..961294a 100644 --- a/scopes/storage/folder.py +++ b/scopes/storage/folder.py @@ -10,9 +10,11 @@ class Folder(Track): headFields = ['parent', 'name', 'ref'] prefix = 'fldr' + def items(self): + return ((f.name, f) for f in self.container.query(parent=self.rid)) + def keys(self): - for f in self.container.query(parent=self.rid): - yield f.name + return (k for k, v in self.items()) def get(self, key, default=None): value = self.container.queryLast(parent=self.rid, name=key)