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

Chris McDonough chrism at agendaless.com
Fri Jul 4 20:43:34 EDT 2008


Author: Chris McDonough <chrism at agendaless.com>
Date: Fri Jul  4 20:43:33 2008
New Revision: 1232

Log:
policy -> traversal.


Added:
   repoze.bfg/trunk/repoze/bfg/tests/test_traversal.py   (contents, props changed)
   repoze.bfg/trunk/repoze/bfg/traversal.py   (contents, props changed)
Removed:
   repoze.bfg/trunk/repoze/bfg/policy.py
   repoze.bfg/trunk/repoze/bfg/tests/test_policy.py
Modified:
   repoze.bfg/trunk/repoze/bfg/router.py
   repoze.bfg/trunk/setup.py

Modified: repoze.bfg/trunk/repoze/bfg/router.py
==============================================================================
--- repoze.bfg/trunk/repoze/bfg/router.py	(original)
+++ repoze.bfg/trunk/repoze/bfg/router.py	Fri Jul  4 20:43:33 2008
@@ -2,14 +2,14 @@
 from repoze.bfg.interfaces import IWSGIApplication
 
 class Router:
-    def __init__(self, app, root_finder, policy):
+    def __init__(self, app, root_policy, traversal_policy):
         self.app = app
-        self.root_finder = root_finder
-        self.policy = policy
+        self.root_policy = root_policy
+        self.traversal_policy = traversal_policy
 
     def __call__(self, environ, start_response):
-        root = self.root_finder(environ)
-        context, name, subpath = self.policy(root, environ)
+        root = self.root_policy(environ)
+        context, name, subpath = self.traversal_policy(root, environ)
         app = getAdapter(context, IWSGIApplication, name)
         environ['repoze.bfg.context'] = context
         environ['repoze.bfg.subpath'] = subpath

Added: repoze.bfg/trunk/repoze/bfg/tests/test_traversal.py
==============================================================================
--- (empty file)
+++ repoze.bfg/trunk/repoze/bfg/tests/test_traversal.py	Fri Jul  4 20:43:33 2008
@@ -0,0 +1,115 @@
+import unittest
+
+from zope.component.testing import PlacelessSetup
+
+class SplitPathTests(unittest.TestCase):
+    def _getFUT(self):
+        from repoze.bfg.traversal import split_path
+        return split_path
+        
+    def test_cleanPath_path_startswith_endswith(self):
+        f = self._getFUT()
+        self.assertEqual(f('/foo/'), ['foo'])
+
+    def test_cleanPath_empty_elements(self):
+        f = self._getFUT()
+        self.assertEqual(f('foo///'), ['foo'])
+
+    def test_cleanPath_onedot(self):
+        f = self._getFUT()
+        self.assertEqual(f('foo/./bar'), ['foo', 'bar'])
+
+    def test_cleanPath_twodots(self):
+        f = self._getFUT()
+        self.assertEqual(f('foo/../bar'), ['bar'])
+
+    def test_cleanPath_element_urllquoted(self):
+        f = self._getFUT()
+        self.assertEqual(f('/foo/space%20thing/bar'), ['foo', 'space thing',
+                                                       'bar'])
+
+class NaivePolicyTests(unittest.TestCase, PlacelessSetup):
+    def setUp(self):
+        PlacelessSetup.setUp(self)
+
+    def tearDown(self):
+        PlacelessSetup.tearDown(self)
+        
+    def _getTargetClass(self):
+        from repoze.bfg.traversal 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_ITraversalPolicy(self):
+        from zope.interface.verify import verifyClass
+        from repoze.bfg.interfaces import ITraversalPolicy
+        verifyClass(ITraversalPolicy, self._getTargetClass())
+
+    def test_instance_conforms_to_ITraversalPolicy(self):
+        from zope.interface.verify import verifyObject
+        from repoze.bfg.interfaces import ITraversalPolicy
+        verifyObject(ITraversalPolicy, self._makeOne())
+
+    def test_call_nonkeyerror_raises(self):
+        policy = self._makeOne()
+        environ = {'PATH_INFO':'/foo'}
+        root = None
+        self.assertRaises(TypeError, policy, environ, root)
+
+    def test_call_withconn_getitem_emptypath_nosubpath(self):
+        policy = self._makeOne()
+        context = DummyContext()
+        environ = {'PATH_INFO':''}
+        root = context
+        ctx, name, subpath = policy(environ, root)
+        self.assertEqual(context, ctx)
+        self.assertEqual(name, '')
+        self.assertEqual(subpath, [])
+
+    def test_call_withconn_getitem_withpath_nosubpath(self):
+        policy = self._makeOne()
+        context = DummyContext()
+        context2 = DummyContext(context)
+        environ = {'PATH_INFO':'/foo/bar'}
+        root = context
+        ctx, name, subpath = policy(environ, root)
+        self.assertEqual(context, ctx)
+        self.assertEqual(name, 'bar')
+        self.assertEqual(subpath, [])
+
+    def test_call_withconn_getitem_withpath_withsubpath(self):
+        policy = self._makeOne()
+        context = DummyContext()
+        context2 = DummyContext(context)
+        environ = {'PATH_INFO':'/foo/bar/baz/buz'}
+        root = context
+        ctx, name, subpath = policy(environ, root)
+        self.assertEqual(context, ctx)
+        self.assertEqual(name, 'bar')
+        self.assertEqual(subpath, ['baz', 'buz'])
+
+class DummyContext:
+    def __init__(self, next=None):
+        self.next = next
+        
+    def __getitem__(self, name):
+        if self.next is None:
+            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

Added: repoze.bfg/trunk/repoze/bfg/traversal.py
==============================================================================
--- (empty file)
+++ repoze.bfg/trunk/repoze/bfg/traversal.py	Fri Jul  4 20:43:33 2008
@@ -0,0 +1,47 @@
+import urllib
+
+from zope.interface import implements
+
+from repoze.bfg.interfaces import ITraversalPolicy
+from repoze.bfg.interfaces import ITraverser
+
+def split_path(path):
+    if path.startswith('/'):
+        path = path[1:]
+    if path.endswith('/'):
+        path = path[:-1]
+    clean=[]
+    for segment in path.split('/'):
+        segment = urllib.unquote(segment) # deal with spaces in path segment
+        if not segment or segment=='.':
+            continue
+        elif segment == '..':
+            del clean[-1]
+        else:
+            clean.append(segment)
+    return clean
+
+class NaiveTraversalPolicy:
+    implements(ITraversalPolicy)
+
+    def __call__(self, environ, root):
+        path = split_path(environ['PATH_INFO'])
+        
+        ob = root
+        name = ''
+
+        while path:
+            segment = pop(path)
+            traverser = ITraverser(ob)
+            next = traverser(environ, segment)
+            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/setup.py
==============================================================================
--- repoze.bfg/trunk/setup.py	(original)
+++ repoze.bfg/trunk/setup.py	Fri Jul  4 20:43:33 2008
@@ -48,8 +48,14 @@
       include_package_data=True,
       namespace_packages=['repoze', 'repoze.bfg'],
       zip_safe=False,
-      tests_require = ['zope.interface', 'zope.component', 'zope.testing'],
-      install_requires=['zope.interface', 'zope.component', 'zope.testing'],
+      install_requires=[
+            'zope.interface',
+            'zope.component',
+            'zope.testing'],
+      tests_require=[
+            'zope.interface',
+            'zope.component',
+            'zope.testing'],
       test_suite="repoze.bfg.tests",
       entry_points = """\
       """


More information about the Repoze-checkins mailing list