From e2df59247cf2b89d3b47e070aacd8afd8d490f83 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Tue, 5 Mar 2024 15:18:38 +0100 Subject: [PATCH] work in progress: concepts, relations, ...; folder: use name as value for parent --- scopes/organize/__init__.py | 1 + scopes/storage/common.py | 6 ++++-- scopes/storage/concept.py | 12 ++++++++++++ scopes/storage/folder.py | 8 ++++---- scopes/storage/relation.py | 3 +++ tests/test_storage.py | 2 +- 6 files changed, 25 insertions(+), 7 deletions(-) create mode 100644 scopes/organize/__init__.py create mode 100644 scopes/storage/concept.py create mode 100644 scopes/storage/relation.py diff --git a/scopes/organize/__init__.py b/scopes/organize/__init__.py new file mode 100644 index 0000000..829e828 --- /dev/null +++ b/scopes/organize/__init__.py @@ -0,0 +1 @@ +"""package scopes.organize""" diff --git a/scopes/storage/common.py b/scopes/storage/common.py index 89f6673..6d04ec1 100644 --- a/scopes/storage/common.py +++ b/scopes/storage/common.py @@ -71,8 +71,10 @@ class Storage(object): registry = {} def registerContainerClass(cls): - # TODO: error on duplicate key - registry[cls.itemFactory.prefix] = cls + prefix = cls.itemFactory.prefix + if prefix in registry: + raise ValueError("prefix '%s' already registered!" % prefix) + registry[prefix] = cls cls.headCols = cols = tuple(f.lower() for f in cls.itemFactory.headFields) if cls.indexes is None: cls.indexes = [cols[i:] for i in range(len(cols))] diff --git a/scopes/storage/concept.py b/scopes/storage/concept.py new file mode 100644 index 0000000..967f3a4 --- /dev/null +++ b/scopes/storage/concept.py @@ -0,0 +1,12 @@ +# scopes.storage.concept + +"""Abstract base classes for concept map application classes.""" + +from scopes.storage.common import registerContainerClass +from scopes.storage.tracking import Container, Track + + +class Concept(Track): + + headFields = ['parent', 'name'] + diff --git a/scopes/storage/folder.py b/scopes/storage/folder.py index 6a0eb88..c5e80d5 100644 --- a/scopes/storage/folder.py +++ b/scopes/storage/folder.py @@ -10,23 +10,23 @@ class Folder(Track): prefix = 'fldr' def keys(self): - for f in self.container.query(parent=self.uid): + for f in self.container.query(parent=self.name): yield f.name def get(self, key, default=None): - value = self.container.queryLast(parent=self.uid, name=key) + value = self.container.queryLast(parent=self.name, name=key) if value is None: return default return value def __getitem__(self, key): - value = self.container.queryLast(parent=self.uid, name=key) + value = self.container.queryLast(parent=self.name, name=key) if value is None: raise KeyError(key) return value def __setitem__(self, key, value): - value.set('parent', self.uid) + value.set('parent', self.name) value.set('name', key) self.container.save(value) diff --git a/scopes/storage/relation.py b/scopes/storage/relation.py new file mode 100644 index 0000000..100528e --- /dev/null +++ b/scopes/storage/relation.py @@ -0,0 +1,3 @@ +# scopes.storage.relation + +"""An SQL-based relationship engine using RDF-like triples.""" diff --git a/tests/test_storage.py b/tests/test_storage.py index ed49eec..ab234ad 100644 --- a/tests/test_storage.py +++ b/tests/test_storage.py @@ -80,7 +80,7 @@ class Test(unittest.TestCase): top['child1'] = folder.Folder(data=dict(title='First Child')) self.assertEqual(list(top.keys()), ['child1']) ch1 = top['child1'] - self.assertEqual(ch1.parent, top.uid) + self.assertEqual(ch1.parent, top.name) assert list(top.keys()) == ['child1'] def suite():