[Zope-Checkins] SVN: Zope/trunk/lib/python/ - ported interfaces shipped with Five 1.0 to Zope core (Five 1.1 will use these interfaces)

Yvo Schubbe y.2005- at wcm-solutions.de
Thu Jun 2 07:24:21 EDT 2005


Log message for revision 30602:
  - ported interfaces shipped with Five 1.0 to Zope core (Five 1.1 will use these interfaces)
  - added some basic conformance tests
  
  Note that this is just a first step:
  - there are still some z2 interfaces that are not bridged to z3 interfaces
  - the bridging introduces a dependency on Five, non-dynamic z3 interfaces might be more suitable (but add redundant code)
  - 'implements' declarations are not complete
  - many interfaces have unresolved XXX coments

Changed:
  U   Zope/trunk/lib/python/AccessControl/Owned.py
  U   Zope/trunk/lib/python/AccessControl/PermissionMapping.py
  U   Zope/trunk/lib/python/AccessControl/Role.py
  A   Zope/trunk/lib/python/AccessControl/interfaces.py
  UU  Zope/trunk/lib/python/AccessControl/tests/testOwned.py
  A   Zope/trunk/lib/python/AccessControl/tests/testPermissionMapping.py
  A   Zope/trunk/lib/python/AccessControl/tests/testRole.py
  UU  Zope/trunk/lib/python/Acquisition/__init__.py
  A   Zope/trunk/lib/python/Acquisition/interfaces.py
  UU  Zope/trunk/lib/python/Acquisition/tests.py
  UU  Zope/trunk/lib/python/App/Management.py
  UU  Zope/trunk/lib/python/App/PersistentExtra.py
  UU  Zope/trunk/lib/python/App/Undo.py
  A   Zope/trunk/lib/python/App/interfaces.py
  A   Zope/trunk/lib/python/App/tests/testManagement.py
  A   Zope/trunk/lib/python/App/tests/testPersistentExtra.py
  A   Zope/trunk/lib/python/App/tests/testUndo.py
  A   Zope/trunk/lib/python/OFS/interfaces.py
  A   Zope/trunk/lib/python/OFS/tests/testApplication.py
  UU  Zope/trunk/lib/python/OFS/tests/testCopySupport.py
  A   Zope/trunk/lib/python/OFS/tests/testFTPInterface.py
  A   Zope/trunk/lib/python/OFS/tests/testFindSupport.py
  U   Zope/trunk/lib/python/OFS/tests/testFolder.py
  UU  Zope/trunk/lib/python/OFS/tests/testObjectManager.py
  U   Zope/trunk/lib/python/OFS/tests/testOrderSupport.py
  U   Zope/trunk/lib/python/OFS/tests/testOrderedFolder.py
  UU  Zope/trunk/lib/python/OFS/tests/testProperties.py
  A   Zope/trunk/lib/python/OFS/tests/testSimpleItem.py
  UU  Zope/trunk/lib/python/OFS/tests/testTraverse.py
  A   Zope/trunk/lib/python/webdav/interfaces.py
  A   Zope/trunk/lib/python/webdav/tests/testCollection.py
  U   Zope/trunk/lib/python/webdav/tests/testNullResource.py
  A   Zope/trunk/lib/python/webdav/tests/testResource.py

-=-
Modified: Zope/trunk/lib/python/AccessControl/Owned.py
===================================================================
--- Zope/trunk/lib/python/AccessControl/Owned.py	2005-06-02 10:42:11 UTC (rev 30601)
+++ Zope/trunk/lib/python/AccessControl/Owned.py	2005-06-02 11:24:21 UTC (rev 30602)
@@ -18,8 +18,11 @@
 import Globals, urlparse, SpecialUsers, ExtensionClass
 from AccessControl import getSecurityManager, Unauthorized
 from Acquisition import aq_get, aq_parent, aq_base
+from zope.interface import implements
 
+from interfaces import IOwned
 
+
 UnownableOwner=[]
 def ownableFilter(self):
     _owner = aq_get(self, '_owner', None, 1)
@@ -30,6 +33,8 @@
 
 class Owned(ExtensionClass.Base):
 
+    implements(IOwned)
+
     __ac_permissions__=(
         ('View management screens',
          ('manage_owner', 'owner_info')),

Modified: Zope/trunk/lib/python/AccessControl/PermissionMapping.py
===================================================================
--- Zope/trunk/lib/python/AccessControl/PermissionMapping.py	2005-06-02 10:42:11 UTC (rev 30601)
+++ Zope/trunk/lib/python/AccessControl/PermissionMapping.py	2005-06-02 11:24:21 UTC (rev 30602)
@@ -23,13 +23,17 @@
 
 import ExtensionClass, Acquisition
 from Globals import InitializeClass
+from zope.interface import implements
 
+from interfaces import IPermissionMappingSupport
 from Owned import UnownableOwner
 from Permission import pname
 
 
 class RoleManager:
 
+    implements(IPermissionMappingSupport)
+
     def manage_getPermissionMapping(self):
         """Return the permission mapping for the object
 

Modified: Zope/trunk/lib/python/AccessControl/Role.py
===================================================================
--- Zope/trunk/lib/python/AccessControl/Role.py	2005-06-02 10:42:11 UTC (rev 30601)
+++ Zope/trunk/lib/python/AccessControl/Role.py	2005-06-02 11:24:21 UTC (rev 30602)
@@ -20,7 +20,9 @@
 from Acquisition import Implicit, Acquired, aq_get
 import Globals, ExtensionClass, PermissionMapping, Products
 from App.Common import aq_base
+from zope.interface import implements
 
+from interfaces import IRoleManager
 from Permission import Permission
 
 
@@ -37,6 +39,8 @@
 
     """An object that has configurable permissions"""
 
+    implements(IRoleManager)
+
     __ac_permissions__=(
         ('Change permissions',
          ('manage_access', 'permission_settings',

Added: Zope/trunk/lib/python/AccessControl/interfaces.py
===================================================================
--- Zope/trunk/lib/python/AccessControl/interfaces.py	2005-06-02 10:42:11 UTC (rev 30601)
+++ Zope/trunk/lib/python/AccessControl/interfaces.py	2005-06-02 11:24:21 UTC (rev 30602)
@@ -0,0 +1,265 @@
+##############################################################################
+#
+# Copyright (c) 2005 Zope Corporation and Contributors. All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""AccessControl z3 interfaces.
+
+$Id$
+"""
+
+from zope.interface import Attribute
+from zope.interface import Interface
+
+
+# XXX: might contain non-API methods and outdated comments;
+#      not synced with ZopeBook API Reference;
+#      based on AccessControl.Owned.Owned
+class IOwned(Interface):
+
+    manage_owner = Attribute("""Manage owner view""")
+
+    def owner_info():
+        """Get ownership info for display
+        """
+
+    def getOwner(info=0):
+        """Get the owner
+
+        If a true argument is provided, then only the owner path and id are
+        returned. Otherwise, the owner object is returned.
+        """
+
+    def getOwnerTuple():
+        """Return a tuple, (userdb_path, user_id) for the owner.
+
+        o Ownership can be acquired, but only from the containment path.
+
+        o If unowned, return None.
+        """
+
+    def getWrappedOwner():
+        """Get the owner, modestly wrapped in the user folder.
+
+        o If the object is not owned, return None.
+
+        o If the owner's user database doesn't exist, return Nobody.
+
+        o If the owner ID does not exist in the user database, return Nobody.
+        """
+
+    def changeOwnership(user, recursive=0):
+        """Change the ownership to the given user.
+
+        If 'recursive' is true then also take ownership of all sub-objects,
+        otherwise sub-objects retain their ownership information.
+        """
+
+    def userCanTakeOwnership():
+        """
+        """
+
+    def manage_takeOwnership(REQUEST, RESPONSE, recursive=0):
+        """Take ownership (responsibility) for an object.
+
+        If 'recursive' is true, then also take ownership of all sub-objects.
+        """
+
+    def manage_changeOwnershipType(explicit=1,
+                                   RESPONSE=None, REQUEST=None):
+        """Change the type (implicit or explicit) of ownership.
+        """
+
+    def _deleteOwnershipAfterAdd():
+        """
+        """
+
+    def manage_fixupOwnershipAfterAdd():
+        """
+        """
+
+
+# XXX: might contain non-API methods and outdated comments;
+#      not synced with ZopeBook API Reference;
+#      based on AccessControl.PermissionMapping.RoleManager
+class IPermissionMappingSupport(Interface):
+
+    def manage_getPermissionMapping():
+        """Return the permission mapping for the object
+
+        This is a list of dictionaries with:
+
+          permission_name -- The name of the native object permission
+
+          class_permission -- The class permission the permission is
+             mapped to.
+        """
+
+    def manage_setPermissionMapping(permission_names=[],
+                                    class_permissions=[], REQUEST=None):
+        """Change the permission mapping
+        """
+
+
+# XXX: might contain non-API methods and outdated comments;
+#      not synced with ZopeBook API Reference;
+#      based on AccessControl.Role.RoleManager
+class IRoleManager(IPermissionMappingSupport):
+
+    """An object that has configurable permissions"""
+
+    permissionMappingPossibleValues = Attribute("""Acquired attribute""")
+
+    def ac_inherited_permissions(all=0):
+        """Get all permissions not defined in ourself that are inherited.
+
+        This will be a sequence of tuples with a name as the first item and an
+        empty tuple as the second.
+        """
+
+    def permission_settings(permission=None):
+        """Return user-role permission settings.
+
+        If 'permission' is passed to the method then only the settings for
+        'permission' is returned.
+        """
+
+    manage_roleForm = Attribute(""" """)
+
+    def manage_role(role_to_manage, permissions=[], REQUEST=None):
+        """Change the permissions given to the given role.
+        """
+
+    manage_acquiredForm = Attribute(""" """)
+
+    def manage_acquiredPermissions(permissions=[], REQUEST=None):
+        """Change the permissions that acquire.
+        """
+
+    manage_permissionForm = Attribute(""" """)
+
+    def manage_permission(permission_to_manage,
+                          roles=[], acquire=0, REQUEST=None):
+        """Change the settings for the given permission.
+
+        If optional arg acquire is true, then the roles for the permission
+        are acquired, in addition to the ones specified, otherwise the
+        permissions are restricted to only the designated roles.
+        """
+
+    def manage_access(REQUEST, **kw):
+        """Return an interface for making permissions settings.
+        """
+
+    def manage_changePermissions(REQUEST):
+        """Change all permissions settings, called by management screen.
+        """
+
+    def permissionsOfRole(role):
+        """Used by management screen.
+        """
+
+    def rolesOfPermission(permission):
+        """Used by management screen.
+        """
+
+    def acquiredRolesAreUsedBy(permission):
+        """Used by management screen.
+        """
+
+
+    # Local roles support
+    # -------------------
+    #
+    # Local roles allow a user to be given extra roles in the context
+    # of a particular object (and its children). When a user is given
+    # extra roles in a particular object, an entry for that user is made
+    # in the __ac_local_roles__ dict containing the extra roles.
+
+    __ac_local_roles__  = Attribute(""" """)
+
+    manage_listLocalRoles = Attribute(""" """)
+
+    manage_editLocalRoles = Attribute(""" """)
+
+    def has_local_roles():
+        """
+        """
+
+    def get_local_roles():
+        """
+        """
+
+    def users_with_local_role(role):
+        """
+        """
+
+    def get_valid_userids():
+        """
+        """
+
+    def get_local_roles_for_userid(userid):
+        """
+        """
+
+    def manage_addLocalRoles(userid, roles, REQUEST=None):
+        """Set local roles for a user."""
+
+    def manage_setLocalRoles(userid, roles, REQUEST=None):
+        """Set local roles for a user."""
+
+    def manage_delLocalRoles(userids, REQUEST=None):
+        """Remove all local roles for a user."""
+
+    #------------------------------------------------------------
+
+    def access_debug_info():
+        """Return debug info.
+        """
+
+    def valid_roles():
+        """Return list of valid roles.
+        """
+
+    def validate_roles(roles):
+        """Return true if all given roles are valid.
+        """
+
+    def userdefined_roles():
+        """Return list of user-defined roles.
+        """
+
+    def manage_defined_roles(submit=None, REQUEST=None):
+        """Called by management screen.
+        """
+
+    def _addRole(role, REQUEST=None):
+        """
+        """
+
+    def _delRoles(roles, REQUEST=None):
+        """
+        """
+
+    def _has_user_defined_role(role):
+        """
+        """
+
+    def manage_editRoles(REQUEST, acl_type='A', acl_roles=[]):
+        """
+        """
+
+    def _setRoles(acl_type, acl_roles):
+        """
+        """
+
+    def possible_permissions():
+        """
+        """


Property changes on: Zope/trunk/lib/python/AccessControl/interfaces.py
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Modified: Zope/trunk/lib/python/AccessControl/tests/testOwned.py
===================================================================
--- Zope/trunk/lib/python/AccessControl/tests/testOwned.py	2005-06-02 10:42:11 UTC (rev 30601)
+++ Zope/trunk/lib/python/AccessControl/tests/testOwned.py	2005-06-02 11:24:21 UTC (rev 30602)
@@ -63,6 +63,13 @@
 
         return Dummy(*args, **kw)
 
+    def test_z3interfaces(self):
+        from AccessControl.interfaces import IOwned
+        from AccessControl.Owned import Owned
+        from zope.interface.verify import verifyClass
+
+        verifyClass(IOwned, Owned)
+
     def test_getOwnerTuple_unowned(self):
         owned = self._makeOne()
 
@@ -169,5 +176,9 @@
 
         self.assertEqual(wrapped_owner.getId(), 'user')
 
+
 def test_suite():
     return unittest.makeSuite(OwnedTests)
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: Zope/trunk/lib/python/AccessControl/tests/testOwned.py
___________________________________________________________________
Name: cvs2svn:cvs-rev
   - 1.3

Added: Zope/trunk/lib/python/AccessControl/tests/testPermissionMapping.py
===================================================================
--- Zope/trunk/lib/python/AccessControl/tests/testPermissionMapping.py	2005-06-02 10:42:11 UTC (rev 30601)
+++ Zope/trunk/lib/python/AccessControl/tests/testPermissionMapping.py	2005-06-02 11:24:21 UTC (rev 30602)
@@ -0,0 +1,20 @@
+import unittest
+
+
+class TestRoleManager(unittest.TestCase):
+
+    def test_z3interfaces(self):
+        from AccessControl.interfaces import IPermissionMappingSupport
+        from AccessControl.PermissionMapping import RoleManager
+        from zope.interface.verify import verifyClass
+
+        verifyClass(IPermissionMappingSupport, RoleManager)
+
+
+def test_suite():
+    return unittest.TestSuite((
+        unittest.makeSuite(TestRoleManager),
+        ))
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: Zope/trunk/lib/python/AccessControl/tests/testPermissionMapping.py
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Added: Zope/trunk/lib/python/AccessControl/tests/testRole.py
===================================================================
--- Zope/trunk/lib/python/AccessControl/tests/testRole.py	2005-06-02 10:42:11 UTC (rev 30601)
+++ Zope/trunk/lib/python/AccessControl/tests/testRole.py	2005-06-02 11:24:21 UTC (rev 30602)
@@ -0,0 +1,20 @@
+import unittest
+
+
+class TestRoleManager(unittest.TestCase):
+
+    def test_z3interfaces(self):
+        from AccessControl.interfaces import IRoleManager
+        from AccessControl.Role import RoleManager
+        from zope.interface.verify import verifyClass
+
+        verifyClass(IRoleManager, RoleManager)
+
+
+def test_suite():
+    return unittest.TestSuite((
+        unittest.makeSuite(TestRoleManager),
+        ))
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: Zope/trunk/lib/python/AccessControl/tests/testRole.py
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Modified: Zope/trunk/lib/python/Acquisition/__init__.py
===================================================================
--- Zope/trunk/lib/python/Acquisition/__init__.py	2005-06-02 10:42:11 UTC (rev 30601)
+++ Zope/trunk/lib/python/Acquisition/__init__.py	2005-06-02 11:24:21 UTC (rev 30602)
@@ -1 +1,10 @@
+from zope.interface import classImplements
+
 from _Acquisition import *
+from interfaces import IAcquirer
+from interfaces import IAcquisitionWrapper
+
+classImplements(Explicit, IAcquirer)
+classImplements(ExplicitAcquisitionWrapper, IAcquisitionWrapper)
+classImplements(Implicit, IAcquirer)
+classImplements(ImplicitAcquisitionWrapper, IAcquisitionWrapper)


Property changes on: Zope/trunk/lib/python/Acquisition/__init__.py
___________________________________________________________________
Name: cvs2svn:cvs-rev
   - 1.2
Name: svn:keywords
   + Id

Added: Zope/trunk/lib/python/Acquisition/interfaces.py
===================================================================
--- Zope/trunk/lib/python/Acquisition/interfaces.py	2005-06-02 10:42:11 UTC (rev 30601)
+++ Zope/trunk/lib/python/Acquisition/interfaces.py	2005-06-02 11:24:21 UTC (rev 30602)
@@ -0,0 +1,64 @@
+##############################################################################
+#
+# Copyright (c) 2005 Zope Corporation and Contributors. All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Acquisition z3 interfaces.
+
+$Id$
+"""
+
+from zope.interface import Attribute
+from zope.interface import Interface
+
+
+class IAcquirer(Interface):
+
+    """Acquire attributes from containers.
+    """
+
+    def __of__(context):
+        """Get the object in a context.
+        """
+
+
+class IAcquisitionWrapper(Interface):
+
+    """Wrapper object for acquisition.
+    """
+
+    def aq_acquire(name, filter=None, extra=None, explicit=True, default=0,
+                   containment=0):
+        """Get an attribute, acquiring it if necessary.
+        """
+
+    def aq_inContextOf(obj, inner=1):
+        """Test whether the object is currently in the context of the argument.
+        """
+
+    aq_base = Attribute(
+        """Get the object unwrapped."""
+        )
+
+    aq_parent = Attribute(
+        """Get the parent of an object."""
+        )
+
+    aq_self = Attribute(
+        """Get the object with the outermost wrapper removed."""
+        )
+
+    aq_inner = Attribute(
+        """Get the object with all but the innermost wrapper removed."""
+        )
+
+    aq_chain = Attribute(
+        """Get a list of objects in the acquisition environment."""
+        )


Property changes on: Zope/trunk/lib/python/Acquisition/interfaces.py
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Modified: Zope/trunk/lib/python/Acquisition/tests.py
===================================================================
--- Zope/trunk/lib/python/Acquisition/tests.py	2005-06-02 10:42:11 UTC (rev 30601)
+++ Zope/trunk/lib/python/Acquisition/tests.py	2005-06-02 11:24:21 UTC (rev 30602)
@@ -1502,6 +1502,32 @@
     TypeError: Can't pickle objects in acquisition wrappers.
     """
 
+def test_z3interfaces():
+    """
+    >>> from zope.interface.verify import verifyClass
+
+    Explicit and Implicit implement IAcquirer:
+
+    >>> from Acquisition import Explicit
+    >>> from Acquisition import Implicit
+    >>> from Acquisition.interfaces import IAcquirer
+    >>> verifyClass(IAcquirer, Explicit)
+    True
+    >>> verifyClass(IAcquirer, Implicit)
+    True
+
+    ExplicitAcquisitionWrapper and ImplicitAcquisitionWrapper implement
+    IAcquisitionWrapper:
+
+    >>> from Acquisition import ExplicitAcquisitionWrapper
+    >>> from Acquisition import ImplicitAcquisitionWrapper
+    >>> from Acquisition.interfaces import IAcquisitionWrapper
+    >>> verifyClass(IAcquisitionWrapper, ExplicitAcquisitionWrapper)
+    True
+    >>> verifyClass(IAcquisitionWrapper, ImplicitAcquisitionWrapper)
+    True
+    """
+
 def show(x):
     print showaq(x).strip()
     
@@ -1604,4 +1630,5 @@
         DocTestSuite(),
         ))
 
-if __name__ == '__main__': unittest.main()
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: Zope/trunk/lib/python/Acquisition/tests.py
___________________________________________________________________
Name: cvs2svn:cvs-rev
   - 1.2

Modified: Zope/trunk/lib/python/App/Management.py
===================================================================
--- Zope/trunk/lib/python/App/Management.py	2005-06-02 10:42:11 UTC (rev 30601)
+++ Zope/trunk/lib/python/App/Management.py	2005-06-02 11:24:21 UTC (rev 30602)
@@ -10,19 +10,21 @@
 # FOR A PARTICULAR PURPOSE
 #
 ##############################################################################
-
 """Standard management interface support
 
 $Id$
 """
 
 import sys, Globals, ExtensionClass, urllib
-from Dialogs import MessageDialog
 from Globals import DTMLFile, HTMLFile
 from zExceptions import Redirect
 from AccessControl import getSecurityManager, Unauthorized
 from cgi import escape
+from zope.interface import implements
 
+from interfaces import INavigation
+
+
 class Tabs(ExtensionClass.Base):
     """Mix-in provides management folder tab support."""
 
@@ -154,6 +156,8 @@
 class Navigation(ExtensionClass.Base):
     """Basic navigation UI support"""
 
+    implements(INavigation)
+
     __ac_permissions__=(
         ('View management screens',
          ('manage', 'manage_menu', 'manage_top_frame',


Property changes on: Zope/trunk/lib/python/App/Management.py
___________________________________________________________________
Name: cvs2svn:cvs-rev
   - 1.66

Modified: Zope/trunk/lib/python/App/PersistentExtra.py
===================================================================
--- Zope/trunk/lib/python/App/PersistentExtra.py	2005-06-02 10:42:11 UTC (rev 30601)
+++ Zope/trunk/lib/python/App/PersistentExtra.py	2005-06-02 11:24:21 UTC (rev 30602)
@@ -10,18 +10,27 @@
 # FOR A PARTICULAR PURPOSE
 #
 ##############################################################################
+"""Patch for Persistent to support IPersistentExtra.
 
-import ZODB
+$Id$
+"""
 
-from class_init import default__class_init__
-from Persistence import Persistent
 import Globals
 from DateTime import DateTime
+from Persistence import Persistent
+from zope.interface import classImplements
+from zope.interface import implements
 
+from class_init import default__class_init__
+from interfaces import IPersistentExtra
+
+
 Persistent.__class_init__ = default__class_init__
 
 class PersistentUtil:
 
+    implements(IPersistentExtra)
+
     def bobobase_modification_time(self):
         jar=self._p_jar
         oid=self._p_oid
@@ -75,3 +84,4 @@
     if k[0] != '_':
         setattr(Persistent, k, v)
 
+classImplements(Persistent, IPersistentExtra)


Property changes on: Zope/trunk/lib/python/App/PersistentExtra.py
___________________________________________________________________
Name: cvs2svn:cvs-rev
   - 1.10
Name: svn:keywords
   + Id

Modified: Zope/trunk/lib/python/App/Undo.py
===================================================================
--- Zope/trunk/lib/python/App/Undo.py	2005-06-02 10:42:11 UTC (rev 30601)
+++ Zope/trunk/lib/python/App/Undo.py	2005-06-02 11:24:21 UTC (rev 30602)
@@ -10,9 +10,10 @@
 # FOR A PARTICULAR PURPOSE
 #
 ##############################################################################
+"""Undo support.
+
+$Id$
 """
-$Id$"""
-__version__='$Revision: 1.34 $'[11:-2]
 
 from Acquisition import aq_base, aq_parent, aq_inner
 from AccessControl import getSecurityManager
@@ -20,9 +21,15 @@
 import Globals, ExtensionClass
 from ZopeUndo.Prefix import Prefix
 import transaction
+from zope.interface import implements
 
+from interfaces import IUndoSupport
+
+
 class UndoSupport(ExtensionClass.Base):
 
+    implements(IUndoSupport)
+
     __ac_permissions__=(
         ('Undo changes', (
             'manage_undo_transactions',


Property changes on: Zope/trunk/lib/python/App/Undo.py
___________________________________________________________________
Name: cvs2svn:cvs-rev
   - 1.34

Added: Zope/trunk/lib/python/App/interfaces.py
===================================================================
--- Zope/trunk/lib/python/App/interfaces.py	2005-06-02 10:42:11 UTC (rev 30601)
+++ Zope/trunk/lib/python/App/interfaces.py	2005-06-02 11:24:21 UTC (rev 30602)
@@ -0,0 +1,82 @@
+##############################################################################
+#
+# Copyright (c) 2005 Zope Corporation and Contributors. All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""App z3 interfaces.
+
+$Id$
+"""
+
+from zope.interface import Attribute
+from zope.interface import Interface
+
+
+# XXX: might contain non-API methods and outdated comments;
+#      not synced with ZopeBook API Reference;
+#      based on App.Management.Navigation
+class INavigation(Interface):
+
+    """Basic navigation UI support"""
+
+    manage = Attribute(""" """)
+    manage_menu = Attribute(""" """)
+    manage_top_frame = Attribute(""" """)
+    manage_page_header = Attribute(""" """)
+    manage_page_footer = Attribute(""" """)
+    manage_form_title = Attribute("""Add Form""")
+    zope_quick_start = Attribute(""" """)
+    manage_copyright = Attribute(""" """)
+    manage_zmi_prefs = Attribute(""" """)
+
+    def manage_zmi_logout(REQUEST, RESPONSE):
+        """Logout current user"""
+
+INavigation.setTaggedValue('manage_page_style.css', Attribute(""" """))
+
+
+# XXX: might contain non-API methods and outdated comments;
+#      not synced with ZopeBook API Reference;
+#      based on App.PersistentExtra.PersistentUtil
+class IPersistentExtra(Interface):
+
+    def bobobase_modification_time():
+        """
+        """
+
+    def locked_in_version():
+        """Was the object modified in any version?
+        """
+
+    def modified_in_version():
+        """Was the object modified in this version?
+        """
+
+
+# XXX: might contain non-API methods and outdated comments;
+#      not synced with ZopeBook API Reference;
+#      based on App.Undo.UndoSupport
+class IUndoSupport(Interface):
+
+    manage_UndoForm = Attribute("""Manage Undo form""")
+
+    def get_request_var_or_attr(name, default):
+        """
+        """
+
+    def undoable_transactions(first_transaction=None,
+                              last_transaction=None,
+                              PrincipiaUndoBatchSize=None):
+        """
+        """
+
+    def manage_undo_transactions(transaction_info=(), REQUEST=None):
+        """
+        """


Property changes on: Zope/trunk/lib/python/App/interfaces.py
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Added: Zope/trunk/lib/python/App/tests/testManagement.py
===================================================================
--- Zope/trunk/lib/python/App/tests/testManagement.py	2005-06-02 10:42:11 UTC (rev 30601)
+++ Zope/trunk/lib/python/App/tests/testManagement.py	2005-06-02 11:24:21 UTC (rev 30602)
@@ -0,0 +1,20 @@
+import unittest
+
+
+class TestNavigation(unittest.TestCase):
+
+    def test_z3interfaces(self):
+        from App.interfaces import INavigation
+        from App.Management import Navigation
+        from zope.interface.verify import verifyClass
+
+        verifyClass(INavigation, Navigation)
+
+
+def test_suite():
+    return unittest.TestSuite((
+        unittest.makeSuite(TestNavigation),
+        ))
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: Zope/trunk/lib/python/App/tests/testManagement.py
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Added: Zope/trunk/lib/python/App/tests/testPersistentExtra.py
===================================================================
--- Zope/trunk/lib/python/App/tests/testPersistentExtra.py	2005-06-02 10:42:11 UTC (rev 30601)
+++ Zope/trunk/lib/python/App/tests/testPersistentExtra.py	2005-06-02 11:24:21 UTC (rev 30602)
@@ -0,0 +1,34 @@
+import unittest
+import Testing
+import Zope2
+Zope2.startup()
+
+
+class TestPersistentUtil(unittest.TestCase):
+
+    def test_z3interfaces(self):
+        from App.interfaces import IPersistentExtra
+        from App.PersistentExtra import PersistentUtil
+        from zope.interface.verify import verifyClass
+
+        verifyClass(IPersistentExtra, PersistentUtil)
+
+
+class TestPersistent(unittest.TestCase):
+
+    def test_z3interfaces(self):
+        from App.interfaces import IPersistentExtra
+        from Persistence import Persistent
+        from zope.interface.verify import verifyClass
+
+        verifyClass(IPersistentExtra, Persistent)
+
+
+def test_suite():
+    return unittest.TestSuite((
+        unittest.makeSuite(TestPersistentUtil),
+        unittest.makeSuite(TestPersistent),
+        ))
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: Zope/trunk/lib/python/App/tests/testPersistentExtra.py
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Added: Zope/trunk/lib/python/App/tests/testUndo.py
===================================================================
--- Zope/trunk/lib/python/App/tests/testUndo.py	2005-06-02 10:42:11 UTC (rev 30601)
+++ Zope/trunk/lib/python/App/tests/testUndo.py	2005-06-02 11:24:21 UTC (rev 30602)
@@ -0,0 +1,20 @@
+import unittest
+
+
+class TestUndoSupport(unittest.TestCase):
+
+    def test_z3interfaces(self):
+        from App.interfaces import IUndoSupport
+        from App.Undo import UndoSupport
+        from zope.interface.verify import verifyClass
+
+        verifyClass(IUndoSupport, UndoSupport)
+
+
+def test_suite():
+    return unittest.TestSuite((
+        unittest.makeSuite(TestUndoSupport),
+        ))
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: Zope/trunk/lib/python/App/tests/testUndo.py
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Added: Zope/trunk/lib/python/OFS/interfaces.py
===================================================================
--- Zope/trunk/lib/python/OFS/interfaces.py	2005-06-02 10:42:11 UTC (rev 30601)
+++ Zope/trunk/lib/python/OFS/interfaces.py	2005-06-02 11:24:21 UTC (rev 30602)
@@ -0,0 +1,810 @@
+##############################################################################
+#
+# Copyright (c) 2005 Zope Corporation and Contributors. All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""OFS z3 interfaces.
+
+$Id$
+"""
+
+from zope.interface import Attribute
+from zope.interface import Interface
+from zope.schema import Bool, BytesLine, Tuple
+
+from AccessControl.interfaces import IOwned
+from AccessControl.interfaces import IRoleManager
+from Acquisition.interfaces import IAcquirer
+from App.interfaces import INavigation
+from App.interfaces import IUndoSupport
+from persistent.interfaces import IPersistent
+from webdav.interfaces import IDAVCollection
+from webdav.interfaces import IDAVResource
+
+
+# create IOrderedContainer
+from Products.Five.fiveconfigure import createZope2Bridge
+from OFS.IOrderSupport import IOrderedContainer as z2IOrderedContainer
+import interfaces
+
+createZope2Bridge(z2IOrderedContainer, interfaces, 'IOrderedContainer')
+
+del createZope2Bridge
+del z2IOrderedContainer
+del interfaces
+
+
+# XXX: might contain non-API methods and outdated comments;
+#      not synced with ZopeBook API Reference;
+#      based on OFS.CopySupport.CopySource
+class ICopySource(Interface):
+
+    """Interface for objects which allow themselves to be copied."""
+
+    def _canCopy(op=0):
+        """Called to make sure this object is copyable.
+
+        The op var is 0 for a copy, 1 for a move.
+        """
+
+    def _notifyOfCopyTo(container, op=0):
+        """Overide this to be pickly about where you go!
+
+        If you dont want to go there, raise an exception. The op variable is 0
+        for a copy, 1 for a move.
+        """
+
+    def _getCopy(container):
+        """
+        """
+
+    def _postCopy(container, op=0):
+        """Called after the copy is finished to accomodate special cases.
+        The op var is 0 for a copy, 1 for a move.
+        """
+
+    def _setId(id):
+        """Called to set the new id of a copied object.
+        """
+
+    def cb_isCopyable():
+        """Is object copyable? Returns 0 or 1
+        """
+
+    def cb_isMoveable():
+        """Is object moveable? Returns 0 or 1
+        """
+
+    def cb_userHasCopyOrMovePermission():
+        """
+        """
+
+
+# XXX: might contain non-API methods and outdated comments;
+#      not synced with ZopeBook API Reference;
+#      based on OFS.FTPInterface.FTPInterface
+class IFTPAccess(Interface):
+
+    """Provide support for FTP access"""
+
+    def manage_FTPstat(REQUEST):
+        """Returns a stat-like tuple. (marshalled to a string) Used by
+        FTP for directory listings, and MDTM and SIZE"""
+
+    def manage_FTPlist(REQUEST):
+        """Returns a directory listing consisting of a tuple of
+        (id,stat) tuples, marshaled to a string. Note, the listing it
+        should include '..' if there is a Folder above the current
+        one.
+
+        In the case of non-foldoid objects it should return a single
+        tuple (id,stat) representing itself."""
+
+
+# XXX: might contain non-API methods and outdated comments;
+#      not synced with ZopeBook API Reference;
+#      based on OFS.Traversable.Traversable
+class ITraversable(Interface):
+
+    def absolute_url(relative=0):
+        """Return the absolute URL of the object.
+
+        This a canonical URL based on the object's physical
+        containment path.  It is affected by the virtual host
+        configuration, if any, and can be used by external
+        agents, such as a browser, to address the object.
+
+        If the relative argument is provided, with a true value, then
+        the value of virtual_url_path() is returned.
+
+        Some Products incorrectly use '/'+absolute_url(1) as an
+        absolute-path reference.  This breaks in certain virtual
+        hosting situations, and should be changed to use
+        absolute_url_path() instead.
+        """
+
+    def absolute_url_path():
+        """Return the path portion of the absolute URL of the object.
+
+        This includes the leading slash, and can be used as an
+        'absolute-path reference' as defined in RFC 2396.
+        """
+
+    def virtual_url_path():
+        """Return a URL for the object, relative to the site root.
+
+        If a virtual host is configured, the URL is a path relative to
+        the virtual host's root object.  Otherwise, it is the physical
+        path.  In either case, the URL does not begin with a slash.
+        """
+
+    def getPhysicalPath():
+        """Get the physical path of the object.
+
+        Returns a path (an immutable sequence of strings) that can be used to
+        access this object again later, for example in a copy/paste operation.
+        getPhysicalRoot() and getPhysicalPath() are designed to operate
+        together.
+        """
+
+    def unrestrictedTraverse(path, default=None, restricted=0):
+        """Lookup an object by path.
+
+        path -- The path to the object. May be a sequence of strings or a slash
+        separated string. If the path begins with an empty path element
+        (i.e., an empty string or a slash) then the lookup is performed
+        from the application root. Otherwise, the lookup is relative to
+        self. Two dots (..) as a path element indicates an upward traversal
+        to the acquisition parent.
+
+        default -- If provided, this is the value returned if the path cannot
+        be traversed for any reason (i.e., no object exists at that path or
+        the object is inaccessible).
+
+        restricted -- If false (default) then no security checking is performed.
+        If true, then all of the objects along the path are validated with
+        the security machinery. Usually invoked using restrictedTraverse().
+        """
+
+    def restrictedTraverse(path, default=None):
+        """Trusted code traversal code, always enforces security.
+        """
+
+
+# XXX: might contain non-API methods and outdated comments;
+#      not synced with ZopeBook API Reference;
+#      based on many classes
+class IZopeObject(Interface):
+
+    isPrincipiaFolderish = Bool(
+        title=u"Is a folderish object",
+        description=u"Should be false for simple items",
+        )
+
+    meta_type = BytesLine(
+        title=u"Meta type",
+        description=u"The object's Zope2 meta type",
+        )
+
+
+# XXX: might contain non-API methods and outdated comments;
+#      not synced with ZopeBook API Reference;
+#      based on OFS.SimpleItem.Item and App.Management.Tabs
+class IManageable(Interface):
+
+    """Something that is manageable in the ZMI"""
+
+    manage_tabs = Attribute("""Management tabs""")
+
+    manage_options = Tuple(
+        title=u"Manage options",
+        )
+
+    def manage(URL1):
+        """Show management screen"""
+
+    def manage_afterAdd(item, container):
+        """Gets called after being added to a container"""
+
+    def manage_beforeDelete(item, container):
+        """Gets called before being deleted"""
+
+    def manage_afterClone(item):
+        """Gets called after being cloned"""
+
+    def filtered_manage_options(REQUEST=None):
+        """
+        """
+
+    def manage_workspace(REQUEST):
+        """Dispatch to first interface in manage_options
+        """
+
+    def tabs_path_default(REQUEST):
+        """
+        """
+
+    def tabs_path_info(script, path):
+        """
+        """
+
+    def class_manage_path():
+        """
+        """
+
+
+# XXX: might contain non-API methods and outdated comments;
+#      not synced with ZopeBook API Reference;
+#      based on OFS.SimpleItem.Item
+class IItem(IZopeObject, IManageable, IFTPAccess, IDAVResource,
+            ICopySource, ITraversable, IOwned, IUndoSupport):
+
+    __name__ = BytesLine(
+        title=u"Name"
+        )
+
+    title = BytesLine(
+        title=u"Title"
+        )
+
+    icon = BytesLine(
+        title=u"Icon",
+        description=u"Name of icon, relative to SOFTWARE_URL",
+        )
+
+    def getId():
+        """Return the id of the object as a string.
+
+        This method should be used in preference to accessing an id
+        attribute of an object directly. The getId method is public.
+        """
+
+    def title_or_id():
+        """Return the title if it is not blank and the id otherwise.
+        """
+
+    def title_and_id():
+        """Return the title if it is not blank and the id otherwise.
+
+        If the title is not blank, then the id is included in parens.
+        """
+
+    def manage_editedDialog(REQUEST, **args):
+        """Show an 'edited' dialog.
+        """
+
+    def raise_standardErrorMessage(client=None, REQUEST={},
+                                   error_type=None, error_value=None, tb=None,
+                                   error_tb=None, error_message='',
+                                   tagSearch=None, error_log_url=''):
+        """Raise standard error message.
+        """
+
+
+# XXX: based on OFS.SimpleItem.Item_w__name__
+class IItemWithName(IItem):
+
+    """Item with name.
+    """
+
+
+# XXX: based on OFS.SimpleItem.SimpleItem
+class ISimpleItem(IItem, IPersistent, IAcquirer, IRoleManager):
+
+    """Not-so-simple item.
+    """
+
+
+# XXX: might contain non-API methods and outdated comments;
+#      not synced with ZopeBook API Reference;
+#      based on OFS.CopySupport.CopyContainer
+class ICopyContainer(Interface):
+
+    """Interface for containerish objects which allow cut/copy/paste"""
+
+    # The following three methods should be overridden to store sub-objects
+    # as non-attributes.
+    def _setOb(id, object):
+        """
+        """
+
+    def _delOb(id):
+        """
+        """
+
+    def _getOb(id, default=None):
+        """
+        """
+
+    def manage_CopyContainerFirstItem(REQUEST):
+        """
+        """
+
+    def manage_CopyContainerAllItems(REQUEST):
+        """
+        """
+
+    def manage_cutObjects(ids=None, REQUEST=None):
+        """Put a reference to the objects named in ids in the clip board"""
+
+    def manage_copyObjects(ids=None, REQUEST=None, RESPONSE=None):
+        """Put a reference to the objects named in ids in the clip board"""
+
+    def _get_id(id):
+        """Allow containers to override the generation of object copy id by
+        attempting to call its _get_id method, if it exists.
+        """
+
+    def manage_pasteObjects(cb_copy_data=None, REQUEST=None):
+        """Paste previously copied objects into the current object.
+
+        If calling manage_pasteObjects from python code, pass the result of a
+        previous call to manage_cutObjects or manage_copyObjects as the first
+        argument.
+        """
+
+    manage_renameForm = Attribute("""Rename management view""")
+
+    def manage_renameObjects(ids=[], new_ids=[], REQUEST=None):
+        """Rename several sub-objects"""
+
+    def manage_renameObject(id, new_id, REQUEST=None):
+        """Rename a particular sub-object"""
+
+    def manage_clone(ob, id, REQUEST=None):
+        """Clone an object, creating a new object with the given id.
+        """
+
+    def cb_dataValid():
+        """Return true if clipboard data seems valid.
+        """
+
+    def cb_dataItems():
+        """List of objects in the clip board.
+        """
+
+    def _verifyObjectPaste(object, validate_src=1):
+        """Verify whether the current user is allowed to paste the passed
+        object into self. This is determined by checking to see if the
+        user could create a new object of the same meta_type of the
+        object passed in and checking that the user actually is
+        allowed to access the passed in object in its existing
+        context.
+
+        Passing a false value for the validate_src argument will skip
+        checking the passed in object in its existing context. This is
+        mainly useful for situations where the passed in object has no
+        existing context, such as checking an object during an import
+        (the object will not yet have been connected to the
+        acquisition hierarchy).
+        """
+
+
+# XXX: might contain non-API methods and outdated comments;
+#      not synced with ZopeBook API Reference;
+#      based on OFS.ObjectManager.ObjectManager
+class IObjectManager(IZopeObject, ICopyContainer, INavigation, IManageable,
+                     IAcquirer, IPersistent, IDAVCollection, ITraversable):
+
+    """Generic object manager
+
+    This interface provides core behavior for collections of heterogeneous
+    objects.
+    """
+
+    meta_types = Tuple(
+        title=u"Meta types",
+        description=u"Sub-object types that are specific to this object",
+        )
+
+    isAnObjectManager = Bool(
+        title=u"Is an object manager",
+        )
+
+    manage_main = Attribute(""" """)
+    manage_index_main = Attribute(""" """)
+    manage_addProduct = Attribute(""" """)
+    manage_importExportForm = Attribute(""" """)
+
+    def all_meta_types(interfaces=None):
+        """
+        """
+
+    def _subobject_permissions():
+        """
+        """
+
+    def filtered_meta_types(user=None):
+        """Return a list of the types for which the user has adequate
+        permission to add that type of object.
+        """
+
+    def _setOb(id, object):
+        """
+        """
+
+    def _delOb(id):
+        """
+        """
+
+    def _getOb(id, default=None):
+        """
+        """
+
+    def _setObject(id, object, roles=None, user=None, set_owner=1):
+        """
+        """
+
+    def _delObject(id, dp=1):
+        """
+        """
+
+    def objectIds(spec=None):
+        """List the IDs of the subobjects of the current object.
+
+        If 'spec' is specified, returns only objects whose meta_types match
+        'spec'.
+        """
+
+    def objectValues(spec=None):
+        """List the subobjects of the current object.
+
+        If 'spec' is specified, returns only objects whose meta_types match
+        'spec'.
+        """
+
+    def objectItems(spec=None):
+        """List (ID, subobject) tuples for subobjects of the current object.
+
+        If 'spec' is specified, returns only objects whose meta_types match
+        'spec'.
+        """
+
+    def objectMap():
+        """Return a tuple of mappings containing subobject meta-data.
+        """
+
+    def superValues(t):
+        """Return all of the objects of a given type located in this object
+        and containing objects.
+        """
+
+    def manage_delObjects(ids=[], REQUEST=None):
+        """Delete a subordinate object
+
+        The objects specified in 'ids' get deleted.
+        """
+
+    def tpValues():
+        """Return a list of subobjects, used by tree tag.
+        """
+
+    def manage_exportObject(id='', download=None, toxml=None,
+                            RESPONSE=None,REQUEST=None):
+        """Exports an object to a file and returns that file."""
+
+    def manage_importObject(file, REQUEST=None, set_owner=1):
+        """Import an object from a file"""
+
+    def _importObjectFromFile(filepath, verify=1, set_owner=1):
+        """
+        """
+
+    def __getitem__(key):
+        """
+        """
+
+
+# XXX: might contain non-API methods and outdated comments;
+#      not synced with ZopeBook API Reference;
+#      based on OFS.FindSupport.FindSupport
+class IFindSupport(Interface):
+
+    """Find support for Zope Folders"""
+
+    manage_findFrame = Attribute(""" """)
+    manage_findForm = Attribute(""" """)
+    manage_findAdv = Attribute(""" """)
+    manage_findResult = Attribute(""" """)
+
+    def ZopeFind(obj, obj_ids=None, obj_metatypes=None,
+                 obj_searchterm=None, obj_expr=None,
+                 obj_mtime=None, obj_mspec=None,
+                 obj_permission=None, obj_roles=None,
+                 search_sub=0,
+                 REQUEST=None, result=None, pre=''):
+        """Zope Find interface"""
+
+    PrincipiaFind = ZopeFind
+
+    def ZopeFindAndApply(obj, obj_ids=None, obj_metatypes=None,
+                         obj_searchterm=None, obj_expr=None,
+                         obj_mtime=None, obj_mspec=None,
+                         obj_permission=None, obj_roles=None,
+                         search_sub=0,
+                         REQUEST=None, result=None, pre='',
+                         apply_func=None, apply_path=''):
+        """Zope Find interface and apply"""
+
+
+# XXX: might contain non-API methods and outdated comments;
+#      not synced with ZopeBook API Reference;
+#      based on OFS.PropertyManager.PropertyManager
+class IPropertyManager(Interface):
+
+    """
+    The PropertyManager mixin class provides an object with
+    transparent property management. An object which wants to
+    have properties should inherit from PropertyManager.
+
+    An object may specify that it has one or more predefined
+    properties, by specifying an _properties structure in its
+    class::
+
+      _properties=({'id':'title', 'type': 'string', 'mode': 'w'},
+                   {'id':'color', 'type': 'string', 'mode': 'w'},
+                   )
+
+    The _properties structure is a sequence of dictionaries, where
+    each dictionary represents a predefined property. Note that if a
+    predefined property is defined in the _properties structure, you
+    must provide an attribute with that name in your class or instance
+    that contains the default value of the predefined property.
+
+    Each entry in the _properties structure must have at least an 'id'
+    and a 'type' key. The 'id' key contains the name of the property,
+    and the 'type' key contains a string representing the object's type.
+    The 'type' string must be one of the values: 'float', 'int', 'long',
+    'string', 'lines', 'text', 'date', 'tokens', 'selection', or
+    'multiple section'.
+
+    For 'selection' and 'multiple selection' properties, there is an
+    addition item in the property dictionay, 'select_variable' which
+    provides the name of a property or method which returns a list of
+    strings from which the selection(s) can be chosen.
+
+    Each entry in the _properties structure may *optionally* provide a
+    'mode' key, which specifies the mutability of the property. The 'mode'
+    string, if present, must contain 0 or more characters from the set
+    'w','d'.
+
+    A 'w' present in the mode string indicates that the value of the
+    property may be changed by the user. A 'd' indicates that the user
+    can delete the property. An empty mode string indicates that the
+    property and its value may be shown in property listings, but that
+    it is read-only and may not be deleted.
+
+    Entries in the _properties structure which do not have a 'mode' key
+    are assumed to have the mode 'wd' (writeable and deleteable).
+
+    To fully support property management, including the system-provided
+    tabs and user interfaces for working with properties, an object which
+    inherits from PropertyManager should include the following entry in
+    its manage_options structure::
+
+      {'label':'Properties', 'action':'manage_propertiesForm',}
+
+    to ensure that a 'Properties' tab is displayed in its management
+    interface. Objects that inherit from PropertyManager should also
+    include the following entry in its __ac_permissions__ structure::
+
+      ('Manage properties', ('manage_addProperty',
+                             'manage_editProperties',
+                             'manage_delProperties',
+                             'manage_changeProperties',)),
+    """
+
+    manage_propertiesForm = Attribute(""" """)
+    manage_propertyTypeForm = Attribute(""" """)
+
+    title = BytesLine(
+        title=u"Title"
+        )
+
+    _properties = Tuple(
+        title=u"Properties",
+        )
+
+    propertysheets = Attribute(""" """)
+
+    def valid_property_id(id):
+        """
+        """
+
+    def hasProperty(id):
+        """Return true if object has a property 'id'.
+        """
+
+    def getProperty(id, d=None):
+        """Get the property 'id'.
+
+        Returns the optional second argument or None if no such property is
+        found.
+        """
+
+    def getPropertyType(id):
+        """Get the type of property 'id'.
+
+        Returns None if no such property exists.
+        """
+
+    def _wrapperCheck(object):
+        """Raise an error if an object is wrapped.
+        """
+
+    def _setPropValue(id, value):
+        """
+        """
+
+    def _delPropValue(id):
+        """
+        """
+
+    def _setProperty(id, value, type='string'):
+        """Set property.
+
+        For selection and multiple selection properties the value argument
+        indicates the select variable of the property.
+        """
+
+    def _updateProperty(id, value):
+        """Update the value of an existing property.
+
+        If value is a string, an attempt will be made to convert the value to
+        the type of the existing property.
+        """
+
+    def _delProperty(id):
+        """
+        """
+
+    def propertyIds():
+        """Return a list of property ids.
+        """
+
+    def propertyValues():
+        """Return a list of actual property objects.
+        """
+
+    def propertyItems():
+        """Return a list of (id,property) tuples.
+        """
+
+    def _propertyMap():
+        """Return a tuple of mappings, giving meta-data for properties.
+        """
+
+    def propertyMap():
+        """Return a tuple of mappings, giving meta-data for properties.
+
+        Return copies of the real definitions for security.
+        """
+
+    def propertyLabel(id):
+        """Return a label for the given property id
+        """
+
+    def propdict():
+        """
+        """
+
+    # Web interface
+
+    def manage_addProperty(id, value, type, REQUEST=None):
+        """Add a new property via the web.
+
+        Sets a new property with the given id, type, and value.
+        """
+
+    def manage_editProperties(REQUEST):
+        """Edit object properties via the web.
+
+        The purpose of this method is to change all property values,
+        even those not listed in REQUEST; otherwise checkboxes that
+        get turned off will be ignored.  Use manage_changeProperties()
+        instead for most situations.
+        """
+
+    def manage_changeProperties(REQUEST=None, **kw):
+        """Change existing object properties.
+
+        Change object properties by passing either a mapping object
+        of name:value pairs {'foo':6} or passing name=value parameters
+        """
+
+    def manage_changePropertyTypes(old_ids, props, REQUEST=None):
+        """Replace one set of properties with another
+
+        Delete all properties that have ids in old_ids, then add a
+        property for each item in props.  Each item has a new_id,
+        new_value, and new_type.  The type of new_value should match
+        new_type.
+        """
+
+    def manage_delProperties(ids=None, REQUEST=None):
+        """Delete one or more properties specified by 'ids'."""
+
+
+# XXX: based on OFS.Folder.Folder
+class IFolder(IObjectManager, IPropertyManager, IRoleManager,
+              IDAVCollection, IItem, IFindSupport):
+
+    """Folders are basic container objects that provide a standard
+    interface for object management. Folder objects also implement a
+    management interface and can have arbitrary properties."""
+
+
+# XXX: based on OFS.OrderedFolder.OrderedFolder
+class IOrderedFolder(IOrderedContainer, IFolder):
+
+    """Ordered folder.
+    """
+
+
+# XXX: might contain non-API methods and outdated comments;
+#      not synced with ZopeBook API Reference;
+#      based on OFS.Application.Application
+class IApplication(IFolder):
+
+    """Top-level system object"""
+
+    isTopLevelPrincipiaApplicationObject = Bool(
+        title=u"Is top level Principa application object",
+        )
+
+    HelpSys = Attribute("Help system")
+
+    p_ = Attribute(""" """)
+    misc_ = Attribute("Misc.")
+
+    def PrincipiaRedirect(destination, URL1):
+        """Utility function to allow user-controlled redirects"""
+
+    Redirect = ZopeRedirect = PrincipiaRedirect
+
+    def __bobo_traverse__(REQUEST, name=None):
+        """Bobo traverse.
+        """
+
+    def PrincipiaTime(*args):
+        """Utility function to return current date/time"""
+
+    ZopeTime = PrincipiaTime
+
+    def ZopeAttributionButton():
+        """Returns an HTML fragment that displays the 'powered by zope'
+        button along with a link to the Zope site."""
+
+    test_url = ZopeAttributionButton
+
+    def absolute_url(relative=0):
+        """The absolute URL of the root object is BASE1 or "/".
+        """
+
+    def absolute_url_path():
+        """The absolute URL path of the root object is BASEPATH1 or "/".
+        """
+
+    def virtual_url_path():
+        """The virtual URL path of the root object is empty.
+        """
+
+    def getPhysicalRoot():
+        """
+        """
+
+    def fixupZClassDependencies(rebuild=0):
+        """
+        """
+
+    def checkGlobalRegistry():
+        """Check the global (zclass) registry for problems, which can
+        be caused by things like disk-based products being deleted.
+        Return true if a problem is found"""


Property changes on: Zope/trunk/lib/python/OFS/interfaces.py
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Added: Zope/trunk/lib/python/OFS/tests/testApplication.py
===================================================================
--- Zope/trunk/lib/python/OFS/tests/testApplication.py	2005-06-02 10:42:11 UTC (rev 30601)
+++ Zope/trunk/lib/python/OFS/tests/testApplication.py	2005-06-02 11:24:21 UTC (rev 30602)
@@ -0,0 +1,20 @@
+import unittest
+
+
+class TestApplication(unittest.TestCase):
+
+    def test_z3interfaces(self):
+        from OFS.interfaces import IApplication
+        from OFS.Application import Application
+        from zope.interface.verify import verifyClass
+
+        verifyClass(IApplication, Application, 1)
+
+
+def test_suite():
+    return unittest.TestSuite((
+        unittest.makeSuite(TestApplication),
+        ))
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: Zope/trunk/lib/python/OFS/tests/testApplication.py
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Modified: Zope/trunk/lib/python/OFS/tests/testCopySupport.py
===================================================================
--- Zope/trunk/lib/python/OFS/tests/testCopySupport.py	2005-06-02 10:42:11 UTC (rev 30601)
+++ Zope/trunk/lib/python/OFS/tests/testCopySupport.py	2005-06-02 11:24:21 UTC (rev 30602)
@@ -1,4 +1,8 @@
 import unittest
+import Testing
+import Zope2
+Zope2.startup()
+
 import cStringIO
 from mimetools import Message
 from multifile import MultiFile
@@ -131,6 +135,16 @@
 
         self._cleanApp()
 
+    def test_z3interfaces(self):
+        from OFS.CopySupport import CopyContainer
+        from OFS.CopySupport import CopySource
+        from OFS.interfaces import ICopyContainer
+        from OFS.interfaces import ICopySource
+        from zope.interface.verify import verifyClass
+
+        verifyClass(ICopyContainer, CopyContainer, 1)
+        verifyClass(ICopySource, CopySource, 1)
+
     def testRename( self ):
         self.failUnless( 'file' in self.folder1.objectIds() )
         self.folder1.manage_renameObject( id='file', new_id='filex' )
@@ -518,8 +532,5 @@
     suite.addTest( unittest.makeSuite( TestCopySupportSecurity ) )
     return suite
 
-def main():
-    unittest.TextTestRunner().run(test_suite())
-
 if __name__ == '__main__':
-    main()
+    unittest.main(defaultTest='test_suite')


Property changes on: Zope/trunk/lib/python/OFS/tests/testCopySupport.py
___________________________________________________________________
Name: cvs2svn:cvs-rev
   - 1.7
Name: svn:keywords
   + Id

Added: Zope/trunk/lib/python/OFS/tests/testFTPInterface.py
===================================================================
--- Zope/trunk/lib/python/OFS/tests/testFTPInterface.py	2005-06-02 10:42:11 UTC (rev 30601)
+++ Zope/trunk/lib/python/OFS/tests/testFTPInterface.py	2005-06-02 11:24:21 UTC (rev 30602)
@@ -0,0 +1,20 @@
+import unittest
+
+
+class TestFTPInterface(unittest.TestCase):
+
+    def test_z3interfaces(self):
+        from OFS.interfaces import IFTPAccess
+        from OFS.FTPInterface import FTPInterface
+        from zope.interface.verify import verifyClass
+
+        verifyClass(IFTPAccess, FTPInterface, 1)
+
+
+def test_suite():
+    return unittest.TestSuite((
+        unittest.makeSuite(TestFTPInterface),
+        ))
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: Zope/trunk/lib/python/OFS/tests/testFTPInterface.py
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Added: Zope/trunk/lib/python/OFS/tests/testFindSupport.py
===================================================================
--- Zope/trunk/lib/python/OFS/tests/testFindSupport.py	2005-06-02 10:42:11 UTC (rev 30601)
+++ Zope/trunk/lib/python/OFS/tests/testFindSupport.py	2005-06-02 11:24:21 UTC (rev 30602)
@@ -0,0 +1,20 @@
+import unittest
+
+
+class TestFindSupport(unittest.TestCase):
+
+    def test_z3interfaces(self):
+        from OFS.interfaces import IFindSupport
+        from OFS.FindSupport import FindSupport
+        from zope.interface.verify import verifyClass
+
+        verifyClass(IFindSupport, FindSupport, 1)
+
+
+def test_suite():
+    return unittest.TestSuite((
+        unittest.makeSuite(TestFindSupport),
+        ))
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: Zope/trunk/lib/python/OFS/tests/testFindSupport.py
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Modified: Zope/trunk/lib/python/OFS/tests/testFolder.py
===================================================================
--- Zope/trunk/lib/python/OFS/tests/testFolder.py	2005-06-02 10:42:11 UTC (rev 30601)
+++ Zope/trunk/lib/python/OFS/tests/testFolder.py	2005-06-02 11:24:21 UTC (rev 30602)
@@ -10,7 +10,16 @@
 
         verifyClass(WriteLockInterface, Folder)
 
+    def test_z3interfaces(self):
+        from OFS.Folder import Folder
+        from OFS.interfaces import IFolder
+        from webdav.interfaces import IWriteLock
+        from zope.interface.verify import verifyClass
 
+        verifyClass(IFolder, Folder, 1)
+        verifyClass(IWriteLock, Folder, 1)
+
+
 def test_suite():
     return unittest.TestSuite((
         unittest.makeSuite(TestFolder),

Modified: Zope/trunk/lib/python/OFS/tests/testObjectManager.py
===================================================================
--- Zope/trunk/lib/python/OFS/tests/testObjectManager.py	2005-06-02 10:42:11 UTC (rev 30601)
+++ Zope/trunk/lib/python/OFS/tests/testObjectManager.py	2005-06-02 11:24:21 UTC (rev 30602)
@@ -70,6 +70,13 @@
 
         return self._getTargetClass()( *args, **kw ).__of__( FauxRoot() )
 
+    def test_z3interfaces(self):
+        from OFS.interfaces import IObjectManager
+        from OFS.ObjectManager import ObjectManager
+        from zope.interface.verify import verifyClass
+
+        verifyClass(IObjectManager, ObjectManager, 1)
+
     def test_setObject_set_owner_with_no_user( self ):
 
         om = self._makeOne()


Property changes on: Zope/trunk/lib/python/OFS/tests/testObjectManager.py
___________________________________________________________________
Name: cvs2svn:cvs-rev
   - 1.5
Name: svn:keywords
   + Id

Modified: Zope/trunk/lib/python/OFS/tests/testOrderSupport.py
===================================================================
--- Zope/trunk/lib/python/OFS/tests/testOrderSupport.py	2005-06-02 10:42:11 UTC (rev 30601)
+++ Zope/trunk/lib/python/OFS/tests/testOrderSupport.py	2005-06-02 11:24:21 UTC (rev 30602)
@@ -1,5 +1,4 @@
 import unittest
-
 import Testing
 import Zope2
 Zope2.startup()
@@ -44,6 +43,20 @@
         f.o4 = DummyObject('o4', 'mt2')
         return f
 
+    def test_z2interfaces(self):
+        from Interface.Verify import verifyClass
+        from OFS.IOrderSupport import IOrderedContainer
+        from OFS.OrderSupport import OrderSupport
+
+        verifyClass(IOrderedContainer, OrderSupport)
+
+    def test_z3interfaces(self):
+        from OFS.interfaces import IOrderedContainer
+        from OFS.OrderSupport import OrderSupport
+        from zope.interface.verify import verifyClass
+
+        verifyClass(IOrderedContainer, OrderSupport, 1)
+
     def _doCanonTest(self, methodname, table):
         for args, order, rval in table:
             f = self._makeOne()
@@ -160,14 +173,7 @@
         f.setDefaultSorting('position', True)
         self.failUnlessEqual( f.tpValues(), [f.o4, f.o3, f.o2] )
 
-    def test_z2interfaces(self):
-        from Interface.Verify import verifyClass
-        from OFS.IOrderSupport import IOrderedContainer
-        from OFS.OrderSupport import OrderSupport
 
-        verifyClass(IOrderedContainer, OrderSupport)
-
-
 def test_suite():
     return unittest.TestSuite((
         unittest.makeSuite(TestOrderSupport),

Modified: Zope/trunk/lib/python/OFS/tests/testOrderedFolder.py
===================================================================
--- Zope/trunk/lib/python/OFS/tests/testOrderedFolder.py	2005-06-02 10:42:11 UTC (rev 30601)
+++ Zope/trunk/lib/python/OFS/tests/testOrderedFolder.py	2005-06-02 11:24:21 UTC (rev 30602)
@@ -12,7 +12,18 @@
         verifyClass(IOrderedContainer, OrderedFolder)
         verifyClass(WriteLockInterface, OrderedFolder)
 
+    def test_z3interfaces(self):
+        from OFS.interfaces import IOrderedContainer
+        from OFS.interfaces import IOrderedFolder
+        from OFS.OrderedFolder import OrderedFolder
+        from webdav.interfaces import IWriteLock
+        from zope.interface.verify import verifyClass
 
+        verifyClass(IOrderedContainer, OrderedFolder, 1)
+        verifyClass(IOrderedFolder, OrderedFolder, 1)
+        verifyClass(IWriteLock, OrderedFolder, 1)
+
+
 def test_suite():
     return unittest.TestSuite((
         unittest.makeSuite(TestOrderedFolder),

Modified: Zope/trunk/lib/python/OFS/tests/testProperties.py
===================================================================
--- Zope/trunk/lib/python/OFS/tests/testProperties.py	2005-06-02 10:42:11 UTC (rev 30601)
+++ Zope/trunk/lib/python/OFS/tests/testProperties.py	2005-06-02 11:24:21 UTC (rev 30602)
@@ -12,20 +12,26 @@
 #
 ##############################################################################
 
-import os, sys, unittest
-from OFS.PropertyManager import PropertyManager
-from OFS.PropertySheets import PropertySheet
+import unittest
 
 
-class TestObject(PropertyManager):
-    pass
+class TestPropertyManager(unittest.TestCase):
+    """Property management tests."""
 
+    def _makeOne(self, *args, **kw):
+        from OFS.PropertyManager import PropertyManager
 
-class TestProperties( unittest.TestCase ):
-    """Property management tests."""
+        return PropertyManager(*args, **kw)
 
+    def test_z3interfaces(self):
+        from OFS.interfaces import IPropertyManager
+        from OFS.PropertyManager import PropertyManager
+        from zope.interface.verify import verifyClass
+
+        verifyClass(IPropertyManager, PropertyManager, 1)
+
     def testLinesPropertyIsTuple( self ):
-        inst = TestObject()
+        inst = self._makeOne()
 
         inst._setProperty('prop', ['xxx', 'yyy'], 'lines')
         self.failUnless(type(inst.getProperty('prop')) == type(()))
@@ -44,8 +50,16 @@
         self.failUnless(type(inst.prop2) == type(()))
 
 
+class TestPropertySheet(unittest.TestCase):
+    """Property management tests."""
+
+    def _makeOne(self, *args, **kw):
+        from OFS.PropertySheets import PropertySheet
+
+        return PropertySheet(*args, **kw)
+
     def testPropertySheetLinesPropertyIsTuple(self):
-        inst = PropertySheet('foo')
+        inst = self._makeOne('foo')
 
         inst._setProperty('prop', ['xxx', 'yyy'], 'lines')
         self.failUnless(type(inst.getProperty('prop')) == type(()))
@@ -60,14 +74,11 @@
         self.failUnless(type(inst.prop2) == type(()))
 
 
-
 def test_suite():
-    suite = unittest.TestSuite()
-    suite.addTest( unittest.makeSuite( TestProperties ) )
-    return suite
+    return unittest.TestSuite((
+        unittest.makeSuite(TestPropertyManager),
+        unittest.makeSuite(TestPropertySheet),
+        ))
 
-def main():
+if __name__ == '__main__':
     unittest.main(defaultTest='test_suite')
-
-if __name__ == '__main__':
-    main()


Property changes on: Zope/trunk/lib/python/OFS/tests/testProperties.py
___________________________________________________________________
Name: cvs2svn:cvs-rev
   - 1.2
Name: svn:keywords
   + Id

Added: Zope/trunk/lib/python/OFS/tests/testSimpleItem.py
===================================================================
--- Zope/trunk/lib/python/OFS/tests/testSimpleItem.py	2005-06-02 10:42:11 UTC (rev 30601)
+++ Zope/trunk/lib/python/OFS/tests/testSimpleItem.py	2005-06-02 11:24:21 UTC (rev 30602)
@@ -0,0 +1,44 @@
+import unittest
+
+
+class TestItem(unittest.TestCase):
+
+    def test_z3interfaces(self):
+        from OFS.interfaces import IItem
+        from OFS.interfaces import IManageable
+        from OFS.SimpleItem import Item
+        from zope.interface.verify import verifyClass
+
+        verifyClass(IItem, Item, 1)
+        verifyClass(IManageable, Item, 1)
+
+
+class TestItem_w__name__(unittest.TestCase):
+
+    def test_z3interfaces(self):
+        from OFS.interfaces import IItemWithName
+        from OFS.SimpleItem import Item_w__name__
+        from zope.interface.verify import verifyClass
+
+        verifyClass(IItemWithName, Item_w__name__, 1)
+
+
+class TestSimpleItem(unittest.TestCase):
+
+    def test_z3interfaces(self):
+        from OFS.interfaces import ISimpleItem
+        from OFS.SimpleItem import SimpleItem
+        from zope.interface.verify import verifyClass
+
+        verifyClass(ISimpleItem, SimpleItem, 1)
+
+
+def test_suite():
+    return unittest.TestSuite((
+        unittest.makeSuite(TestItem),
+        unittest.makeSuite(TestItem_w__name__),
+        unittest.makeSuite(TestSimpleItem),
+        ))
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: Zope/trunk/lib/python/OFS/tests/testSimpleItem.py
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Modified: Zope/trunk/lib/python/OFS/tests/testTraverse.py
===================================================================
--- Zope/trunk/lib/python/OFS/tests/testTraverse.py	2005-06-02 10:42:11 UTC (rev 30601)
+++ Zope/trunk/lib/python/OFS/tests/testTraverse.py	2005-06-02 11:24:21 UTC (rev 30602)
@@ -163,6 +163,13 @@
         del self.root
         del self.connection
 
+    def test_z3interfaces(self):
+        from OFS.interfaces import ITraversable
+        from OFS.Traversable import Traversable
+        from zope.interface.verify import verifyClass
+
+        verifyClass(ITraversable, Traversable, 1)
+
     def testTraversePath( self ):
         self.failUnless( 'file' in self.folder1.objectIds() )
         self.failUnless( 
@@ -269,8 +276,5 @@
     suite.addTest( unittest.makeSuite( TestTraverse ) )
     return suite
 
-def main():
+if __name__ == '__main__':
     unittest.main(defaultTest='test_suite')
-
-if __name__ == '__main__':
-    main()


Property changes on: Zope/trunk/lib/python/OFS/tests/testTraverse.py
___________________________________________________________________
Name: cvs2svn:cvs-rev
   - 1.6
Name: svn:keywords
   + Id

Added: Zope/trunk/lib/python/webdav/interfaces.py
===================================================================
--- Zope/trunk/lib/python/webdav/interfaces.py	2005-06-02 10:42:11 UTC (rev 30601)
+++ Zope/trunk/lib/python/webdav/interfaces.py	2005-06-02 11:24:21 UTC (rev 30602)
@@ -0,0 +1,156 @@
+##############################################################################
+#
+# Copyright (c) 2005 Zope Corporation and Contributors. All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""webdav z3 interfaces.
+
+$Id$
+"""
+
+from zope.interface import Interface
+from zope.schema import Bool, Tuple
+
+
+# create IWriteLock
+from Products.Five.fiveconfigure import createZope2Bridge
+from webdav.WriteLockInterface import WriteLockInterface
+import interfaces
+
+createZope2Bridge(WriteLockInterface, interfaces, 'IWriteLock')
+
+del createZope2Bridge
+del WriteLockInterface
+del interfaces
+
+
+# XXX: might contain non-API methods and outdated comments;
+#      not synced with ZopeBook API Reference;
+#      based on webdav.Resource.Resource
+class IDAVResource(IWriteLock):
+
+    """Provide basic WebDAV support for non-collection objects."""
+
+    __dav_resource__ = Bool(
+        title=u"Is DAV resource"
+        )
+
+    __http_methods__ = Tuple(
+        title=u"HTTP methods",
+        description=u"Sequence of valid HTTP methods"
+        )
+
+    def dav__init(request, response):
+        """Init expected HTTP 1.1 / WebDAV headers which are not
+        currently set by the base response object automagically.
+
+        Also, we sniff for a ZServer response object, because we don't
+        want to write duplicate headers (since ZS writes Date
+        and Connection itself).
+        """
+
+    def dav__validate(object, methodname, REQUEST):
+        """
+        """
+
+    def dav__simpleifhandler(request, response, method='PUT',
+                             col=0, url=None, refresh=0):
+        """
+        """
+
+    def HEAD(REQUEST, RESPONSE):
+        """Retrieve resource information without a response body."""
+
+    def PUT(REQUEST, RESPONSE):
+        """Replace the GET response entity of an existing resource.
+        Because this is often object-dependent, objects which handle
+        PUT should override the default PUT implementation with an
+        object-specific implementation. By default, PUT requests
+        fail with a 405 (Method Not Allowed)."""
+
+    def OPTIONS(REQUEST, RESPONSE):
+        """Retrieve communication options."""
+
+    def TRACE(REQUEST, RESPONSE):
+        """Return the HTTP message received back to the client as the
+        entity-body of a 200 (OK) response. This will often usually
+        be intercepted by the web server in use. If not, the TRACE
+        request will fail with a 405 (Method Not Allowed), since it
+        is not often possible to reproduce the HTTP request verbatim
+        from within the Zope environment."""
+
+    def DELETE(REQUEST, RESPONSE):
+        """Delete a resource. For non-collection resources, DELETE may
+        return either 200 or 204 (No Content) to indicate success."""
+
+    def PROPFIND(REQUEST, RESPONSE):
+        """Retrieve properties defined on the resource."""
+
+    def PROPPATCH(REQUEST, RESPONSE):
+        """Set and/or remove properties defined on the resource."""
+
+    def MKCOL(REQUEST, RESPONSE):
+        """Create a new collection resource. If called on an existing
+        resource, MKCOL must fail with 405 (Method Not Allowed)."""
+
+    def COPY(REQUEST, RESPONSE):
+        """Create a duplicate of the source resource whose state
+        and behavior match that of the source resource as closely
+        as possible. Though we may later try to make a copy appear
+        seamless across namespaces (e.g. from Zope to Apache), COPY
+        is currently only supported within the Zope namespace."""
+
+    def MOVE(REQUEST, RESPONSE):
+        """Move a resource to a new location. Though we may later try to
+        make a move appear seamless across namespaces (e.g. from Zope
+        to Apache), MOVE is currently only supported within the Zope
+        namespace."""
+
+    def LOCK(REQUEST, RESPONSE):
+        """Lock a resource"""
+
+    def UNLOCK(REQUEST, RESPONSE):
+        """Remove an existing lock on a resource."""
+
+    def manage_DAVget():
+        """Gets the document source"""
+
+    def listDAVObjects():
+        """
+        """
+
+
+# XXX: might contain non-API methods and outdated comments;
+#      not synced with ZopeBook API Reference;
+#      based on webdav.Collection.Collection
+class IDAVCollection(IDAVResource):
+
+    """The Collection class provides basic WebDAV support for
+    collection objects. It provides default implementations
+    for all supported WebDAV HTTP methods. The behaviors of some
+    WebDAV HTTP methods for collections are slightly different
+    than those for non-collection resources."""
+
+    __dav_collection__ = Bool(
+        title=u"Is a DAV collection",
+        description=u"Should be true",
+        )
+
+    def PUT(REQUEST, RESPONSE):
+        """The PUT method has no inherent meaning for collection
+        resources, though collections are not specifically forbidden
+        to handle PUT requests. The default response to a PUT request
+        for collections is 405 (Method Not Allowed)."""
+
+    def DELETE(REQUEST, RESPONSE):
+        """Delete a collection resource. For collection resources, DELETE
+        may return either 200 (OK) or 204 (No Content) to indicate total
+        success, or may return 207 (Multistatus) to indicate partial
+        success. Note that in Zope a DELETE currently never returns 207."""


Property changes on: Zope/trunk/lib/python/webdav/interfaces.py
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Added: Zope/trunk/lib/python/webdav/tests/testCollection.py
===================================================================
--- Zope/trunk/lib/python/webdav/tests/testCollection.py	2005-06-02 10:42:11 UTC (rev 30601)
+++ Zope/trunk/lib/python/webdav/tests/testCollection.py	2005-06-02 11:24:21 UTC (rev 30602)
@@ -0,0 +1,23 @@
+import unittest
+import Testing
+import Zope2
+Zope2.startup()
+
+
+class TestCollection(unittest.TestCase):
+
+    def test_z3interfaces(self):
+        from webdav.Collection import Collection
+        from webdav.interfaces import IDAVCollection
+        from zope.interface.verify import verifyClass
+
+        verifyClass(IDAVCollection, Collection, 1)
+
+
+def test_suite():
+    return unittest.TestSuite((
+        unittest.makeSuite(TestCollection),
+        ))
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: Zope/trunk/lib/python/webdav/tests/testCollection.py
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Modified: Zope/trunk/lib/python/webdav/tests/testNullResource.py
===================================================================
--- Zope/trunk/lib/python/webdav/tests/testNullResource.py	2005-06-02 10:42:11 UTC (rev 30601)
+++ Zope/trunk/lib/python/webdav/tests/testNullResource.py	2005-06-02 11:24:21 UTC (rev 30602)
@@ -1,4 +1,7 @@
 import unittest
+import Testing
+import Zope2
+Zope2.startup()
 
 
 class TestLockNullResource(unittest.TestCase):
@@ -10,7 +13,14 @@
 
         verifyClass(WriteLockInterface, LockNullResource)
 
+    def test_z3interfaces(self):
+        from webdav.interfaces import IWriteLock
+        from webdav.NullResource import LockNullResource
+        from zope.interface.verify import verifyClass
 
+        verifyClass(IWriteLock, LockNullResource, 1)
+
+
 class TestNullResource(unittest.TestCase):
 
     def test_z2interfaces(self):
@@ -20,7 +30,14 @@
 
         verifyClass(WriteLockInterface, NullResource)
 
+    def test_z3interfaces(self):
+        from webdav.interfaces import IWriteLock
+        from webdav.NullResource import NullResource
+        from zope.interface.verify import verifyClass
 
+        verifyClass(IWriteLock, NullResource, 1)
+
+
 def test_suite():
     return unittest.TestSuite((
         unittest.makeSuite(TestLockNullResource),

Added: Zope/trunk/lib/python/webdav/tests/testResource.py
===================================================================
--- Zope/trunk/lib/python/webdav/tests/testResource.py	2005-06-02 10:42:11 UTC (rev 30601)
+++ Zope/trunk/lib/python/webdav/tests/testResource.py	2005-06-02 11:24:21 UTC (rev 30602)
@@ -0,0 +1,23 @@
+import unittest
+import Testing
+import Zope2
+Zope2.startup()
+
+
+class TestResource(unittest.TestCase):
+
+    def test_z3interfaces(self):
+        from webdav.interfaces import IDAVResource
+        from webdav.Resource import Resource
+        from zope.interface.verify import verifyClass
+
+        verifyClass(IDAVResource, Resource, 1)
+
+
+def test_suite():
+    return unittest.TestSuite((
+        unittest.makeSuite(TestResource),
+        ))
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: Zope/trunk/lib/python/webdav/tests/testResource.py
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native



More information about the Zope-Checkins mailing list