[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