[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