summaryrefslogtreecommitdiff
path: root/repoze
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2008-07-04 20:00:59 +0000
committerChris McDonough <chrism@agendaless.com>2008-07-04 20:00:59 +0000
commit8f88693600edebb522b6d078691e72a0dcbdb287 (patch)
treeb2171add39cce18f42085f88f84e9a2a6b42e542 /repoze
parent8b2c67309a9a3f9cf709bf3003dc3275f17c709e (diff)
downloadpyramid-8f88693600edebb522b6d078691e72a0dcbdb287.tar.gz
pyramid-8f88693600edebb522b6d078691e72a0dcbdb287.tar.bz2
pyramid-8f88693600edebb522b6d078691e72a0dcbdb287.zip
Depend on zope.component
Use an adapter to perform traversal.
Diffstat (limited to 'repoze')
-rw-r--r--repoze/bfg/interfaces.py11
-rw-r--r--repoze/bfg/policy.py20
-rw-r--r--repoze/bfg/tests/test_policy.py37
3 files changed, 49 insertions, 19 deletions
diff --git a/repoze/bfg/interfaces.py b/repoze/bfg/interfaces.py
index 711ea44cc..b6d7ff623 100644
--- a/repoze/bfg/interfaces.py
+++ b/repoze/bfg/interfaces.py
@@ -4,7 +4,14 @@ class IWSGIApplication(Interface):
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 """
+
diff --git a/repoze/bfg/policy.py b/repoze/bfg/policy.py
index a25da9efd..697350b16 100644
--- a/repoze/bfg/policy.py
+++ b/repoze/bfg/policy.py
@@ -2,7 +2,8 @@ import urllib
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 @@ def split_path(path):
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)
diff --git a/repoze/bfg/tests/test_policy.py b/repoze/bfg/tests/test_policy.py
index e8752d1a1..3623d43f5 100644
--- a/repoze/bfg/tests/test_policy.py
+++ b/repoze/bfg/tests/test_policy.py
@@ -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 @@ class SplitPathTests(unittest.TestCase):
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 @@ class DummyContext:
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