[z3-checkins] r36313 - in z3/sqlos/trunk/src/sqlos: . container file file/tests ftests interfaces testing testing/tests tests
kobold at codespeak.net
kobold at codespeak.net
Mon Jan 8 20:13:18 CET 2007
Author: kobold
Date: Mon Jan 8 20:13:17 2007
New Revision: 36313
Added:
z3/sqlos/trunk/src/sqlos/container/mono.py (contents, props changed)
- copied, changed from r36307, z3/sqlos/trunk/src/sqlos/container/isolated.py
z3/sqlos/trunk/src/sqlos/ftests/mono_containers.txt
Modified:
z3/sqlos/trunk/src/sqlos/__init__.py (props changed)
z3/sqlos/trunk/src/sqlos/_transaction.py (props changed)
z3/sqlos/trunk/src/sqlos/adapter.py (props changed)
z3/sqlos/trunk/src/sqlos/configure.zcml
z3/sqlos/trunk/src/sqlos/connection.py (props changed)
z3/sqlos/trunk/src/sqlos/container/__init__.py (contents, props changed)
z3/sqlos/trunk/src/sqlos/container/isolated.py (props changed)
z3/sqlos/trunk/src/sqlos/container/standard.py (props changed)
z3/sqlos/trunk/src/sqlos/file/__init__.py (props changed)
z3/sqlos/trunk/src/sqlos/file/fsutility.py (props changed)
z3/sqlos/trunk/src/sqlos/file/interfaces.py (props changed)
z3/sqlos/trunk/src/sqlos/file/tests/__init__.py (props changed)
z3/sqlos/trunk/src/sqlos/file/tests/test_fsutility.py (props changed)
z3/sqlos/trunk/src/sqlos/ftests/__init__.py (props changed)
z3/sqlos/trunk/src/sqlos/ftests/test_doctest.py (contents, props changed)
z3/sqlos/trunk/src/sqlos/ftests/test_transaction.py (props changed)
z3/sqlos/trunk/src/sqlos/interfaces/__init__.py (props changed)
z3/sqlos/trunk/src/sqlos/interfaces/auth.py (props changed)
z3/sqlos/trunk/src/sqlos/interfaces/container.py (contents, props changed)
z3/sqlos/trunk/src/sqlos/metaconfigure.py (props changed)
z3/sqlos/trunk/src/sqlos/metadirectives.py (props changed)
z3/sqlos/trunk/src/sqlos/testing/__init__.py (props changed)
z3/sqlos/trunk/src/sqlos/testing/sampleperson.py (contents, props changed)
z3/sqlos/trunk/src/sqlos/testing/testdb.py (props changed)
z3/sqlos/trunk/src/sqlos/testing/tests/__init__.py (props changed)
z3/sqlos/trunk/src/sqlos/testing/tests/test_sampleperson.py (props changed)
z3/sqlos/trunk/src/sqlos/tests/__init__.py (props changed)
z3/sqlos/trunk/src/sqlos/tests/test_doctests.py (contents, props changed)
z3/sqlos/trunk/src/sqlos/tests/test_transaction.py (props changed)
z3/sqlos/trunk/src/sqlos/tests/test_verify.py (props changed)
z3/sqlos/trunk/src/sqlos/zsqlobject.py (props changed)
Log:
Implemented mono containers; ftests for mono containers.
Modified: z3/sqlos/trunk/src/sqlos/configure.zcml
==============================================================================
--- z3/sqlos/trunk/src/sqlos/configure.zcml (original)
+++ z3/sqlos/trunk/src/sqlos/configure.zcml Mon Jan 8 20:13:17 2007
@@ -39,6 +39,13 @@
factory=".container.SQLObjectNameChooser"
/>
+ <adapter
+ provides="zope.app.container.interfaces.INameChooser"
+ for="sqlos.interfaces.container.ISQLObjectMonoContainer"
+ permission="zope.Public"
+ factory=".container.SQLObjectMonoNameChooser"
+ />
+
<!-- Default view for containers. Should we really be specifying this??-->
<browser:defaultView
Modified: z3/sqlos/trunk/src/sqlos/container/__init__.py
==============================================================================
--- z3/sqlos/trunk/src/sqlos/container/__init__.py (original)
+++ z3/sqlos/trunk/src/sqlos/container/__init__.py Mon Jan 8 20:13:17 2007
@@ -13,3 +13,4 @@
from standard import contained, SQLObjectNameChooser, SQLObjectContainer
from isolated import SQLIsolatedContainer
+from mono import SQLObjectMonoNameChooser, SQLObjectMonoContainer
Copied: z3/sqlos/trunk/src/sqlos/container/mono.py (from r36307, z3/sqlos/trunk/src/sqlos/container/isolated.py)
==============================================================================
--- z3/sqlos/trunk/src/sqlos/container/isolated.py (original)
+++ z3/sqlos/trunk/src/sqlos/container/mono.py Mon Jan 8 20:13:17 2007
@@ -13,70 +13,72 @@
import random
+from sqlobject import SQLObjectNotFound
+
from zope.interface import implements
+from zope.app.container.contained import NameChooser
from sqlos.container.standard import contained, SQLObjectContainer
-from sqlos.interfaces import ISQLObjectIsolated
-from sqlos.interfaces.container import IIsolatedSQLContainer
+from sqlos.interfaces.container import ISQLObjectMonoContainer
-class SQLIsolatedContainer(SQLObjectContainer):
+class SQLObjectMonoNameChooser(NameChooser):
+ """NameChooser for sqlos mono containers"""
- implements(IIsolatedSQLContainer)
+ def chooseName(self, name, obj):
+ if ISQLObject.providedBy(obj):
+ return str(obj.id)
+ raise UserError("Cannot find a name")
- _container_id = None
- def _getAllowedIISQLObjectUtilities(self):
- # Ignore all utilities not implementing ISQLObjectIsolated
- for name, utility in SQLObjectContainer._getAllowedIISQLObjectUtilities(self):
- if ISQLObjectIsolated.implementedBy(utility):
- yield name, utility
-
- def _getContainerId(self):
- if self._container_id is None:
- self._container_id = str(random.random()) # TODO better generation?
- return self._container_id
- def _setContainerId(self, value):
- self._container_id = value
- container_id = property(_getContainerId, _setContainerId)
-
- def __len__(self):
- """Return the number of objects in the folder."""
- i = 0
- for name, utility in self._getAllowedIISQLObjectUtilities():
- i += utility.countByDomain(self.container_id)
- return i
+class SQLObjectMonoContainer(SQLObjectContainer):
- def __delitem__(self, name):
- """Delete the named object from the container.
+ implements(ISQLObjectMonoContainer)
- Raises a KeyError if the object is not found.
- """
- obj = self[name]
- domains = [d for d in obj.domains if d != self.container_id]
- if not domains:
- obj.destroySelf()
- return
- obj.domains = tuple(domains)
-
- def __setitem__(self, name, content):
- domains = content.domains
- if self.container_id not in domains:
- content.domains = domains + (self.container_id, )
- return name
+ factory = None
+
+ def _getAllowedIISQLObjectUtilities(self):
+ factories = filter(lambda x: x[0] == self.factory,
+ list(super(SQLObjectMonoContainer, self)._getAllowedIISQLObjectUtilities()))
+ if len(factories) != 1:
+ raise TypeError, "Unable to look up the selected factory: %s" % self.factory
+ return factories
def items(self):
"""Return a sequence-like object containing tuples of the form
(name, object) for the objects that appear in the folder.
"""
for utility_name, utility in self._getAllowedIISQLObjectUtilities():
- for obj in utility.selectByDomain(self.container_id):
- name = '%s.%s' % (utility_name, obj.id)
+ for obj in utility.select():
+ name = isinstance(obj.id, basestring) and obj.id or unicode(obj.id)
yield (name, contained(obj, parent=self, name=name))
def __getitem__(self, name):
- obj = super(SQLIsolatedContainer, self).__getitem__(name)
- if hasattr(obj, 'domains'):
- if self.container_id in obj.domains:
+ """Return the named object.
+
+ If the object is not found a KeyError is raised.
+
+ lets get a container:
+
+ >>> c = SQLObjectMonoContainer()
+ >>> c.factory = "XXX"
+
+ And make sure it doesn't bork on non-string values:
+
+ >>> c[None]
+ Traceback (most recent call last):
+ ...
+ TypeError: Unable to look up ...
+ >>> c[object()]
+ Traceback (most recent call last):
+ ...
+ TypeError: Unable to look up ...
+
+ """
+ for utility_name, utility in self._getAllowedIISQLObjectUtilities():
+ try:
+ obj = utility.get(utility.sqlmeta.idType(name))
return contained(obj, parent=self, name=name)
+ except (SQLObjectNotFound, ValueError):
+ raise KeyError, name
raise KeyError, name
Added: z3/sqlos/trunk/src/sqlos/ftests/mono_containers.txt
==============================================================================
--- (empty file)
+++ z3/sqlos/trunk/src/sqlos/ftests/mono_containers.txt Mon Jan 8 20:13:17 2007
@@ -0,0 +1,106 @@
+Functional test for SQLOSContainer objects
+==========================================
+
+First, prepare the testing environment:
+
+ >>> from sqlos.testing.sampleperson import SamplePerson, SamplePersonMonoContainer
+ >>> from sqlos.interfaces import ISQLObject
+ >>> from sqlos.interfaces.container import ISQLObjectMonoContainer
+ >>> from zope.interface.verify import verifyObject
+ >>> container = SamplePersonMonoContainer()
+ >>> verifyObject(ISQLObjectMonoContainer, container)
+ True
+
+We are not in the business of letting errors pass silently, so looking inside if
+we get a database error (it must be of the type DatabaseException):
+
+ >>> [i for i in container.items()]
+ Traceback (most recent call last):
+ ...
+ DatabaseException: ...
+
+So let's create some database tables if not already there:
+
+ >>> from sqlos.testing.sampleperson import createTestingTables
+ >>> createTestingTables()
+
+We should now be able to look inside an empty container:
+
+ >>> [i for i in container.keys()]
+ []
+ >>> [i for i in container.items()]
+ []
+ >>> [i for i in container]
+ []
+ >>> [i for i in container.values()]
+ []
+ >>> len(container)
+ 0
+
+Lets create some objects:
+
+ >>> people = [{'username': 'harry',
+ ... 'fullname': 'Harry the Hack',
+ ... 'password': 'harrypass'},
+ ... {'username': 'sally',
+ ... 'fullname': 'Sally the Wack',
+ ... 'password': 'sallypass'}]
+ >>> from zope.app import zapi
+ >>> from sqlos.interfaces import IISQLObject
+ >>> SamplePerson = zapi.getUtility(IISQLObject,
+ ... u'sqlos.somename.SamplePerson',
+ ... context=container)
+ >>> harry = SamplePerson(**people[0])
+ >>> len(container)
+ 1
+ >>> sally = SamplePerson(**people[1])
+ >>> len(container)
+ 2
+
+Lets see whats inside:
+
+ >>> [i[0] for i in container.items()]
+ [u'1', u'2']
+ >>> [i[1] for i in container.items()] == [harry, sally]
+ True
+ >>> [i for i in container.values()] == [harry, sally]
+ True
+ >>> [i for i in container.keys()]
+ [u'1', u'2']
+ >>> [i for i in container]
+ [u'1', u'2']
+
+Let's test to see what the container does with bad id's (must raise KeyError):
+
+ >>> container[3]
+ Traceback (most recent call last):
+ ...
+ KeyError: ...
+
+You can get() as well:
+
+ >>> container.get(1) == harry
+ True
+ >>> container.get('sss', 'default')
+ 'default'
+
+Setitem passes but is really a no-op:
+
+ >>> container['sss'] = 'yyy'
+ >>> len(container)
+ 2
+
+Finally let's delete harry:
+
+ >>> del container[1]
+ >>> len(container)
+ 1
+ >>> container[1]
+ Traceback (most recent call last):
+ ...
+ KeyError: 1
+
+CleanUp:
+
+ >>> from sqlos.testing.sampleperson import dropTestingTables
+ >>> dropTestingTables()
Modified: z3/sqlos/trunk/src/sqlos/ftests/test_doctest.py
==============================================================================
--- z3/sqlos/trunk/src/sqlos/ftests/test_doctest.py (original)
+++ z3/sqlos/trunk/src/sqlos/ftests/test_doctest.py Mon Jan 8 20:13:17 2007
@@ -24,5 +24,6 @@
'connection.txt',
'containers.txt',
'localutilities.txt',
- 'isolated_containers.txt']
+ 'isolated_containers.txt',
+ 'mono_containers.txt']
return FunctionalDocFileSuite(*filelist)
Modified: z3/sqlos/trunk/src/sqlos/interfaces/container.py
==============================================================================
--- z3/sqlos/trunk/src/sqlos/interfaces/container.py (original)
+++ z3/sqlos/trunk/src/sqlos/interfaces/container.py Mon Jan 8 20:13:17 2007
@@ -15,19 +15,26 @@
from zope.app.container.interfaces import IContainerNamesContainer
from zope.app.container.interfaces import IReadContainer, IContainer
+
class ISQLObjectReadContainer(IReadContainer, IAttributeAnnotatable):
- """ An SQLObject Container """
+ """An SQLObject Container """
+
class ISQLObjectContainer(IContainer, IContainerNamesContainer,
IAttributeAnnotatable):
- """ An SQLObject Container """
+ """An SQLObject Container """
def __setitem__(name, obj):
"""Add a new object"""
__setitem__.precondition = ItemTypePrecondition()
+
class IIsolatedSQLContainer(ISQLObjectContainer):
# TODO Attribute -> zope.schema.* - jinty
container_id = Attribute("The id of the containers, this is a filter on the"
"database table.")
+
+
+class ISQLObjectMonoContainer(ISQLObjectContainer):
+ """An SQLObject Container """
Modified: z3/sqlos/trunk/src/sqlos/testing/sampleperson.py
==============================================================================
--- z3/sqlos/trunk/src/sqlos/testing/sampleperson.py (original)
+++ z3/sqlos/trunk/src/sqlos/testing/sampleperson.py Mon Jan 8 20:13:17 2007
@@ -7,7 +7,7 @@
from sqlos.zsqlobject import SQLOS
from sqlos.interfaces import ISQLSchema, IISQLObjectIsolated, ISQLObjectIsolated
from sqlos.interfaces.container import ISQLObjectContainer
-from sqlos.container import SQLObjectContainer, SQLIsolatedContainer
+from sqlos.container import SQLObjectContainer, SQLIsolatedContainer, SQLObjectMonoContainer
def createTestingTablesSubscriber(obj):
# An event subscriber that can be used to create the testing tables
@@ -55,6 +55,12 @@
implements(IPersonContainer)
+class SamplePersonMonoContainer(SQLObjectMonoContainer):
+
+ implements(IPersonContainer)
+ factory = 'sqlos.somename.SamplePerson'
+
+
class SamplePerson(SQLOS):
implements(IPerson, IPersonContained)
Modified: z3/sqlos/trunk/src/sqlos/tests/test_doctests.py
==============================================================================
--- z3/sqlos/trunk/src/sqlos/tests/test_doctests.py (original)
+++ z3/sqlos/trunk/src/sqlos/tests/test_doctests.py Mon Jan 8 20:13:17 2007
@@ -25,6 +25,7 @@
return unittest.TestSuite([
DocTestSuite('sqlos.container.standard', optionflags=doctest.ELLIPSIS),
DocTestSuite('sqlos.container.isolated', optionflags=doctest.ELLIPSIS),
+ DocTestSuite('sqlos.container.mono', optionflags=doctest.ELLIPSIS),
DocTestSuite('sqlos.connection'),
DocTestSuite('sqlos._transaction'),
DocTestSuite('sqlos.zsqlobject')
More information about the z3-checkins
mailing list