diff options
| author | Chris McDonough <chrism@agendaless.com> | 2008-07-04 20:00:59 +0000 |
|---|---|---|
| committer | Chris McDonough <chrism@agendaless.com> | 2008-07-04 20:00:59 +0000 |
| commit | 8f88693600edebb522b6d078691e72a0dcbdb287 (patch) | |
| tree | b2171add39cce18f42085f88f84e9a2a6b42e542 /repoze | |
| parent | 8b2c67309a9a3f9cf709bf3003dc3275f17c709e (diff) | |
| download | pyramid-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.py | 11 | ||||
| -rw-r--r-- | repoze/bfg/policy.py | 20 | ||||
| -rw-r--r-- | repoze/bfg/tests/test_policy.py | 37 |
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 |
