[Repoze-checkins] r1231 - in repoze.bfg/trunk: . repoze/bfg repoze/bfg/tests

Chris McDonough chrism at agendaless.com
Fri Jul 4 16:00:59 EDT 2008


Author: Chris McDonough <chrism at agendaless.com>
Date: Fri Jul  4 16:00:59 2008
New Revision: 1231

Log:
Depend on zope.component

Use an adapter to perform traversal.



Modified:
   repoze.bfg/trunk/repoze/bfg/interfaces.py
   repoze.bfg/trunk/repoze/bfg/policy.py
   repoze.bfg/trunk/repoze/bfg/tests/test_policy.py
   repoze.bfg/trunk/setup.py

Modified: repoze.bfg/trunk/repoze/bfg/interfaces.py
==============================================================================
--- repoze.bfg/trunk/repoze/bfg/interfaces.py	(original)
+++ repoze.bfg/trunk/repoze/bfg/interfaces.py	Fri Jul  4 16:00:59 2008
@@ -4,7 +4,14 @@
     def __call__(environ, start_response):
         """ Represent a WSGI (PEP 333) application """
 
-class IPolicy(Interface):
-    def __call__(root, environ):
+class ITraversalPolicy(Interface):
+    def __call__(environ, root):
         """ Return a tuple in the form (context, name, subpath) """
         
+class ITraverser(Interface):
+    def __init__(context):
+        """ Accept a context """
+
+    def __call__(environ, name):
+        """ Return a subcontext or based on name """
+        

Modified: repoze.bfg/trunk/repoze/bfg/policy.py
==============================================================================
--- repoze.bfg/trunk/repoze/bfg/policy.py	(original)
+++ repoze.bfg/trunk/repoze/bfg/policy.py	Fri Jul  4 16:00:59 2008
@@ -2,7 +2,8 @@
 
 from zope.interface import implements
 
-from repoze.bfg.interfaces import IPolicy
+from repoze.bfg.interfaces import ITraversalPolicy
+from repoze.bfg.interfaces import ITraverser
 
 def split_path(path):
     if path.startswith('/'):
@@ -20,26 +21,27 @@
             clean.append(item)
     return clean
 
-class NaivePolicy:
-
-    implements(IPolicy)
+class NaiveTraversalPolicy:
+    implements(ITraversalPolicy)
 
     def __call__(self, environ, root):
         path = split_path(environ['PATH_INFO'])
         
         ob = root
         name = ''
+
         while path:
             element = pop(path)
-            try:
-                ob = ob[element]
-            except KeyError:
+            traverser = ITraverser(ob)
+            next = traverser(environ, element)
+            if next is None:
                 if path:
                     name = pop(path)
                 break
-            
+            ob = next
+
         return ob, name, path
-            
+
 def pop(path):
     return path.pop(0)
 

Modified: repoze.bfg/trunk/repoze/bfg/tests/test_policy.py
==============================================================================
--- repoze.bfg/trunk/repoze/bfg/tests/test_policy.py	(original)
+++ repoze.bfg/trunk/repoze/bfg/tests/test_policy.py	Fri Jul  4 16:00:59 2008
@@ -1,5 +1,7 @@
 import unittest
 
+from zope.component.testing import PlacelessSetup
+
 class SplitPathTests(unittest.TestCase):
     def _getFUT(self):
         from repoze.bfg.policy import split_path
@@ -25,25 +27,35 @@
         f = self._getFUT()
         self.assertEqual(f('/foo/space%20thing/bar'), ['foo', 'space thing',
                                                        'bar'])
-   
-class NaivePolicyTests(unittest.TestCase):
+
+class NaivePolicyTests(unittest.TestCase, PlacelessSetup):
+    def setUp(self):
+        PlacelessSetup.setUp(self)
+
+    def tearDown(self):
+        PlacelessSetup.tearDown(self)
+        
     def _getTargetClass(self):
-        from repoze.bfg.policy import NaivePolicy
-        return NaivePolicy
+        from repoze.bfg.policy import NaiveTraversalPolicy
+        return NaiveTraversalPolicy
 
     def _makeOne(self, *arg, **kw):
+        import zope.component
+        gsm = zope.component.getGlobalSiteManager()
+        from repoze.bfg.interfaces import ITraverser
+        gsm.registerAdapter(DummyTraverser, (None,), ITraverser, '')
         klass = self._getTargetClass()
         return klass(*arg, **kw)
 
     def test_class_conforms_to_IPolicy(self):
         from zope.interface.verify import verifyClass
-        from repoze.bfg.interfaces import IPolicy
-        verifyClass(IPolicy, self._getTargetClass())
+        from repoze.bfg.interfaces import ITraversalPolicy
+        verifyClass(ITraversalPolicy, self._getTargetClass())
 
     def test_instance_conforms_to_IPolicy(self):
         from zope.interface.verify import verifyObject
-        from repoze.bfg.interfaces import IPolicy
-        verifyObject(IPolicy, self._makeOne())
+        from repoze.bfg.interfaces import ITraversalPolicy
+        verifyObject(ITraversalPolicy, self._makeOne())
 
     def test_call_nonkeyerror_raises(self):
         policy = self._makeOne()
@@ -92,3 +104,12 @@
             raise KeyError, name
         return self.next
     
+class DummyTraverser:
+    def __init__(self, context):
+        self.context = context
+
+    def __call__(self, environ, name):
+        try:
+            return self.context[name]
+        except KeyError:
+            return None

Modified: repoze.bfg/trunk/setup.py
==============================================================================
--- repoze.bfg/trunk/setup.py	(original)
+++ repoze.bfg/trunk/setup.py	Fri Jul  4 16:00:59 2008
@@ -48,8 +48,8 @@
       include_package_data=True,
       namespace_packages=['repoze', 'repoze.bfg'],
       zip_safe=False,
-      tests_require = ['zope.interface'],
-      install_requires=['zope.interface'],
+      tests_require = ['zope.interface', 'zope.component', 'zope.testing'],
+      install_requires=['zope.interface', 'zope.component', 'zope.testing'],
       test_suite="repoze.bfg.tests",
       entry_points = """\
       """


More information about the Repoze-checkins mailing list