[Zope3-checkins] CVS: Zope3/src/zope/products/demo/insensitivefolder - __init__.py:1.2 tests.py:1.2 interfaces.py:NONE

Stephan Richter srichter at cosmos.phy.tufts.edu
Fri Feb 13 21:27:41 EST 2004


Update of /cvs-repository/Zope3/src/zope/products/demo/insensitivefolder
In directory cvs.zope.org:/tmp/cvs-serv20243

Modified Files:
	__init__.py tests.py 
Removed Files:
	interfaces.py 
Log Message:
Cleaned up the code some more:

- For the traverser you really require IReadContainer not ISimpleReadContainer,
  since you use keys().

- There is no need for a new interface for the traverser. 

- There is no need to implement the traverser from scratch, since the default
  ContainerTraverser provides most of what we need. Note that this is also 
  more instructive, since we can now concentrate on the one important method
  publishTraverse().

- Cleaned up the tests, since they were using single letter variables, which
  is not very instructive, since tests should be documentation. 


=== Zope3/src/zope/products/demo/insensitivefolder/__init__.py 1.1 => 1.2 ===
--- Zope3/src/zope/products/demo/insensitivefolder/__init__.py:1.1	Fri Feb 13 18:28:45 2004
+++ Zope3/src/zope/products/demo/insensitivefolder/__init__.py	Fri Feb 13 21:27:40 2004
@@ -16,53 +16,46 @@
 $Id$
 """
 from zope.app import zapi
+from zope.app.container.traversal import ContainerTraverser
 from zope.app.content.folder import Folder
-from zope.app.interfaces.container import ISimpleReadContainer
+from zope.app.interfaces.container import IReadContainer
+from zope.app.interfaces.content.folder import IFolder
 from zope.component.interfaces import IFactory
-from zope.interface import implements, directlyProvides, directlyProvidedBy
-from zope.interface import implementedBy
+from zope.interface import \
+     implements, implementedBy, directlyProvides, directlyProvidedBy 
 from zope.publisher.interfaces import NotFound
 from zope.publisher.interfaces.browser import IBrowserPublisher
-from interfaces import \
-     ICaseInsensitiveFolder, ICaseInsensitiveContainerTraverser
 
-class CaseInsensitiveContainerTraverser(object):
 
-    implements(IBrowserPublisher, ICaseInsensitiveContainerTraverser)
-    __used_for__ = ISimpleReadContainer
+class CaseInsensitiveContainerTraverser(ContainerTraverser):
 
-    def __init__(self, container, request):
-        """Initialize object."""
-        self.context = container
-        self.request = request
+    __used_for__ = IReadContainer
 
     def publishTraverse(self, request, name):
         """See zope.publisher.interfaces.browser.IBrowserPublisher"""
-        subob = self.context.get(name, None)
+        subob = self._guessTraverse(name) 
         if subob is None:
             view = zapi.queryView(self.context, name, request)
             if view is not None:
                 return view
 
-            subob = self.guessTraverse(name) 
-            if subob is None:
-                raise NotFound(self.context, name, request)
+            raise NotFound(self.context, name, request)
          
         return subob
 
-    def guessTraverse(self, name):
-        """See friendlyfolder.interfaces.IFriendlyContainerTraverser"""
+    def _guessTraverse(self, name):
         for key in self.context.keys():
             if key.lower() == name.lower():
                 return self.context[key]
         return None
 
-    def browserDefault(self, request):
-        """See zope.publisher.interfaces.browser.IBrowserPublisher"""
-        view_name = zapi.getDefaultViewName(self.context, request)
-        view_uri = "@@%s" % view_name
-        return self.context, (view_uri,)
 
+class ICaseInsensitiveFolder(IFolder):
+    """Marker for folders whose contained items keys are case insensitive.
+
+    When traversing in this folder, all names will be converted to lower
+    case. For example, if the traverser requests an item called 'Foo', in
+    reality item 'foo' is looked up in the container."""        
 
 class CaseInsensitiveFolderFactory(object):
     """A Factory that creates case-insensitive Folders."""


=== Zope3/src/zope/products/demo/insensitivefolder/tests.py 1.1 => 1.2 ===
--- Zope3/src/zope/products/demo/insensitivefolder/tests.py:1.1	Fri Feb 13 18:28:45 2004
+++ Zope3/src/zope/products/demo/insensitivefolder/tests.py	Fri Feb 13 21:27:40 2004
@@ -16,21 +16,19 @@
 $Id$
 """
 import unittest
-from zope.component.tests.request import Request
-from zope.component.servicenames import Presentation
-from zope.products.demo.insensitivefolder import CaseInsensitiveContainerTraverser
-from zope.interface import Interface, implements
-from zope.exceptions import NotFoundError
 from zope.app import zapi
-from zope.app.interfaces.container import IContainer
+from zope.app.interfaces.container import IReadContainer
+from zope.app.tests import ztapi
 from zope.app.tests.placelesssetup import PlacelessSetup
-
-class I(Interface):
-    pass
-
+from zope.component.tests.request import Request
+from zope.exceptions import NotFoundError
+from zope.interface import implements
+from zope.publisher.interfaces.browser import IBrowserRequest
+from zope.products.demo.insensitivefolder import \
+     CaseInsensitiveContainerTraverser
 
 class Container:
-    implements(IContainer)
+    implements(IReadContainer)
 
     def __init__(self, **kw):
         for k in kw:
@@ -45,52 +43,53 @@
     def __getitem__(self, name):
         return self.__dict__[name]
 
-class Request(Request):
-    def getEffectiveURL(self):
-        return ''
-
 
 class View:
-    def __init__(self, comp, request):
-        self._comp = comp
-
-
-class Test(PlacelessSetup, unittest.TestCase):
-
-    def testAttr(self):
-        # test container traverse
-        foo = Container()
-        c   = Container(foo=foo)
-        req = Request(I, '')
-
-        T = CaseInsensitiveContainerTraverser(c, req)
-        self.failUnless(T.publishTraverse(req,'foo') is foo)
-        self.failUnless(T.publishTraverse(req,'foO') is foo)
-        self.assertRaises(NotFoundError , T.publishTraverse, req ,'morebar')
-
-
-    def testView(self):
-        # test getting a view
-        foo = Container()
-        c   = Container(foo=foo)
-        req = Request(I, '')
-
-        T = CaseInsensitiveContainerTraverser(c, req)
-        zapi.getService(None, Presentation).provideView(
-            IContainer, 'viewfoo', I, [View])
-
-        self.failUnless(T.publishTraverse(req,'viewfoo').__class__ is View )
-        self.failUnless(T.publishTraverse(req,'foo') is foo)
-
-        self.assertRaises(NotFoundError , T.publishTraverse, req, 'morebar')
-        self.assertRaises(NotFoundError , T.publishTraverse, req,
-                          '@@morebar')
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+
+class TraverserTest(PlacelessSetup, unittest.TestCase):
+
+    def setUp(self):
+        super(TraverserTest, self).setUp()
+        self.foo = Container()
+        foo2 = Container(foo=self.foo)
+        self.request = Request(IBrowserRequest, '')
+        self.traverser = CaseInsensitiveContainerTraverser(foo2, self.request)
+        ztapi.browserView(IReadContainer, 'viewfoo', [View])
+        
+    def test_itemTraversal(self):
+        self.assertEquals(
+            self.traverser.publishTraverse(self.request, 'foo'),
+            self.foo)
+        self.assertEquals(
+            self.traverser.publishTraverse(self.request, 'foO'),
+            self.foo)
+        self.assertRaises(
+            NotFoundError,
+            self.traverser.publishTraverse, self.request, 'morebar')
+
+    def test_viewTraversal(self):
+        self.assertEquals(
+            self.traverser.publishTraverse(self.request, 'viewfoo').__class__,
+            View)
+        self.assertEquals(
+            self.traverser.publishTraverse(self.request, 'foo'),
+            self.foo)
+        self.assertRaises(
+            NotFoundError,
+            self.traverser.publishTraverse, self.request, 'morebar')
+        self.assertRaises(
+            NotFoundError,
+            self.traverser.publishTraverse, self.request, '@@morebar')
 
 
 def test_suite():
-    loader = unittest.TestLoader()
-    return loader.loadTestsFromTestCase(Test)
-
+    return unittest.TestSuite((
+        unittest.makeSuite(TraverserTest),
+        ))
 
 if __name__ == '__main__':
-    unittest.TextTestRunner().run(test_suite())
+    unittest.main(defaultTest='test_suite')

=== Removed File Zope3/src/zope/products/demo/insensitivefolder/interfaces.py ===




More information about the Zope3-Checkins mailing list