summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES.txt17
-rw-r--r--TODO.txt7
-rw-r--r--repoze/bfg/chameleon_text.py5
-rw-r--r--repoze/bfg/chameleon_zpt.py5
-rw-r--r--repoze/bfg/renderers.py19
-rw-r--r--repoze/bfg/request.py5
-rw-r--r--repoze/bfg/resource.py6
-rw-r--r--repoze/bfg/scripting.py7
-rw-r--r--repoze/bfg/settings.py6
-rw-r--r--repoze/bfg/testing.py40
-rw-r--r--repoze/bfg/tests/test_paster.py4
-rw-r--r--repoze/bfg/tests/test_request.py18
-rw-r--r--repoze/bfg/tests/test_scripting.py2
-rw-r--r--repoze/bfg/tests/test_traversal.py90
-rw-r--r--repoze/bfg/tests/test_url.py104
-rw-r--r--repoze/bfg/traversal.py18
-rw-r--r--repoze/bfg/url.py25
17 files changed, 193 insertions, 185 deletions
diff --git a/CHANGES.txt b/CHANGES.txt
index 631f7eaba..7fc56546f 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -72,6 +72,15 @@ Internals
use the ``path`` method of the ZCML context to resolve a relative
name to an absolute one (imperative configuration requirement).
+- The ``repoze.bfg.scripting.get_root`` API now uses a 'real' WebOb
+ request rather than a FakeRequest when it sets up the request as a
+ threadlocal.
+
+- The ``repoze.bfg.traversal.traverse`` API now uses a 'real' WebOb
+ request rather than a FakeRequest when it calls the traverser.
+
+- The ``repoze.bfg.request.FakeRequest`` class has been removed.
+
Backwards Incompatibilites
--------------------------
@@ -128,6 +137,14 @@ Backwards Incompatibilites
``repoze.bfg.security.forget``
+ ``repoze.bfg.url.route_url``
+
+ ``repoze.bfg.url.model_url``
+
+ ``repoze.bfg.url.static_url``
+
+ ``repoze.bfg.traversal.virtual_root``
+
Each of these functions now expects to be called with a request
object that has a ``registry`` attribute which represents the
current ZCA registry. Previously these functions used the ZCA
diff --git a/TODO.txt b/TODO.txt
index 2ecb82af6..47418bca3 100644
--- a/TODO.txt
+++ b/TODO.txt
@@ -1,12 +1,7 @@
-- Make ZCML filename argument optional to ``make_app``. Document
- configuration without ZCML.
-
- Replace martian with something simpler.
-- Make sure repoze.bfg.scripting.get_root makes a request with a valid
- registry arg.
-
- Get rid of ``declarative`` method of Configurator.
- Allow policies, settings, and a root factory to be passed to
Configurator constructor.
+
diff --git a/repoze/bfg/chameleon_text.py b/repoze/bfg/chameleon_text.py
index 7e3ea17f4..b69e8fed0 100644
--- a/repoze/bfg/chameleon_text.py
+++ b/repoze/bfg/chameleon_text.py
@@ -1,6 +1,5 @@
from webob import Response
-from zope.component import queryUtility
from zope.interface import implements
from chameleon.core.template import TemplateFile
@@ -11,6 +10,7 @@ from repoze.bfg.interfaces import ITemplateRenderer
from repoze.bfg.renderers import template_renderer_factory
from repoze.bfg.settings import get_settings
+from repoze.bfg.threadlocal import get_current_registry
class TextTemplateFile(TemplateFile):
default_parser = Parser()
@@ -69,5 +69,6 @@ def render_template_to_response(path, **kw):
template result."""
renderer = renderer_factory(path)
result = renderer(kw, {})
- response_factory = queryUtility(IResponseFactory, default=Response)
+ reg = get_current_registry()
+ response_factory = reg.queryUtility(IResponseFactory, default=Response)
return response_factory(result)
diff --git a/repoze/bfg/chameleon_zpt.py b/repoze/bfg/chameleon_zpt.py
index 090321204..270ad6394 100644
--- a/repoze/bfg/chameleon_zpt.py
+++ b/repoze/bfg/chameleon_zpt.py
@@ -1,6 +1,5 @@
from webob import Response
-from zope.component import queryUtility
from zope.interface import implements
from chameleon.zpt.template import PageTemplateFile
@@ -10,6 +9,7 @@ from repoze.bfg.interfaces import ITemplateRenderer
from repoze.bfg.renderers import template_renderer_factory
from repoze.bfg.settings import get_settings
+from repoze.bfg.threadlocal import get_current_registry
def renderer_factory(path):
return template_renderer_factory(path, ZPTTemplateRenderer)
@@ -58,6 +58,7 @@ def render_template_to_response(path, **kw):
template result. """
renderer = renderer_factory(path)
result = renderer(kw, {})
- response_factory = queryUtility(IResponseFactory, default=Response)
+ reg = get_current_registry()
+ response_factory = reg.queryUtility(IResponseFactory, default=Response)
return response_factory(result)
diff --git a/repoze/bfg/renderers.py b/repoze/bfg/renderers.py
index 8fa6e5c31..424c400ac 100644
--- a/repoze/bfg/renderers.py
+++ b/repoze/bfg/renderers.py
@@ -1,14 +1,12 @@
import os
import pkg_resources
-from zope.component import getSiteManager
-from zope.component import queryUtility
-
from repoze.bfg.interfaces import ITemplateRenderer
from repoze.bfg.compat import json
from repoze.bfg.settings import get_settings
from repoze.bfg.path import caller_package
+from repoze.bfg.threadlocal import get_current_registry
# concrete renderer factory implementations
@@ -27,22 +25,22 @@ def string_renderer_factory(name):
# utility functions
def template_renderer_factory(spec, impl):
+ reg = get_current_registry()
if os.path.isabs(spec):
# 'spec' is an absolute filename
if not os.path.exists(spec):
raise ValueError('Missing template file: %s' % spec)
- renderer = queryUtility(ITemplateRenderer, name=spec)
+ renderer = reg.queryUtility(ITemplateRenderer, name=spec)
if renderer is None:
renderer = impl(spec)
- sm = getSiteManager()
- sm.registerUtility(renderer, ITemplateRenderer, name=spec)
+ reg.registerUtility(renderer, ITemplateRenderer, name=spec)
else:
# spec is a package:relpath resource spec
- renderer = queryUtility(ITemplateRenderer, name=spec)
+ renderer = reg.queryUtility(ITemplateRenderer, name=spec)
if renderer is None:
# service unit tests by trying the relative path string as
# the utility name directly
- renderer = queryUtility(ITemplateRenderer, name=spec)
+ renderer = reg.queryUtility(ITemplateRenderer, name=spec)
if renderer is None:
try:
package_name, filename = spec.split(':', 1)
@@ -56,14 +54,13 @@ def template_renderer_factory(spec, impl):
renderer = impl(abspath)
if not _reload_resources():
# cache the template
- sm = getSiteManager()
- sm.registerUtility(renderer, ITemplateRenderer, name=spec)
+ reg.registerUtility(renderer, ITemplateRenderer, name=spec)
return renderer
def renderer_from_name(path):
from repoze.bfg.configuration import Configurator
- reg = getSiteManager()
+ reg = get_current_registry()
config = Configurator(reg)
return config.renderer_from_name(path)
diff --git a/repoze/bfg/request.py b/repoze/bfg/request.py
index d25e93ef0..131c786ca 100644
--- a/repoze/bfg/request.py
+++ b/repoze/bfg/request.py
@@ -93,8 +93,3 @@ deprecated('get_request',
'deprecated. Use ``from repoze.bfg.threadlocal import '
'get_current_request instead.')
-class FakeRequest(dict):
- def __init__(self, environ):
- self.environ = environ
- self.update(environ)
-
diff --git a/repoze/bfg/resource.py b/repoze/bfg/resource.py
index ca6cee543..d76dbcaac 100644
--- a/repoze/bfg/resource.py
+++ b/repoze/bfg/resource.py
@@ -1,11 +1,10 @@
import os
-import sys
import pkg_resources
-from zope.component import queryUtility
from zope.interface import implements
from repoze.bfg.interfaces import IPackageOverrides
+from repoze.bfg.threadlocal import get_current_registry
class OverrideProvider(pkg_resources.DefaultProvider):
def __init__(self, module):
@@ -13,7 +12,8 @@ class OverrideProvider(pkg_resources.DefaultProvider):
self.module_name = module.__name__
def _get_overrides(self):
- overrides = queryUtility(IPackageOverrides, self.module_name)
+ reg = get_current_registry()
+ overrides = reg.queryUtility(IPackageOverrides, self.module_name)
return overrides
def get_resource_filename(self, manager, resource_name):
diff --git a/repoze/bfg/scripting.py b/repoze/bfg/scripting.py
index f31db56fa..bf2423a8c 100644
--- a/repoze/bfg/scripting.py
+++ b/repoze/bfg/scripting.py
@@ -1,4 +1,4 @@
-from repoze.bfg.request import FakeRequest
+from repoze.bfg.request import Request
def get_root(app, request=None):
""" Return a tuple composed of ``(root, closer)`` when provided a
@@ -9,9 +9,10 @@ def get_root(app, request=None):
the root. If ``request`` is not None, it is used as the request
passed to the BFG application root factory. A faux request is
constructed and passed to the root factory if ``request`` is None."""
- if request is None:
- request = FakeRequest({})
registry = app.registry
+ if request is None:
+ request = Request.blank('/')
+ request.registry = registry
threadlocals = {'registry':registry, 'request':request}
app.threadlocal_manager.push(threadlocals)
def closer(request=request): # keep request alive via this function default
diff --git a/repoze/bfg/settings.py b/repoze/bfg/settings.py
index e9a03ad0b..500c4503c 100644
--- a/repoze/bfg/settings.py
+++ b/repoze/bfg/settings.py
@@ -1,10 +1,11 @@
import os
-from zope.component import queryUtility
from zope.interface import implements
from repoze.bfg.interfaces import ISettings
+from repoze.bfg.threadlocal import get_current_registry
+
class Settings(dict):
""" Deployment settings. Update application settings (usually
from PasteDeploy keywords) with framework-specific key/value pairs
@@ -62,7 +63,8 @@ def get_settings():
For backwards compatibility, dictionary keys can also be looked up
as attributes of the settings object.
"""
- return queryUtility(ISettings)
+ reg = get_current_registry()
+ return reg.queryUtility(ISettings)
def asbool(s):
s = str(s).strip()
diff --git a/repoze/bfg/testing.py b/repoze/bfg/testing.py
index 79fa3bb9c..def8c6aea 100644
--- a/repoze/bfg/testing.py
+++ b/repoze/bfg/testing.py
@@ -2,7 +2,6 @@ import copy
from zope.configuration.xmlconfig import _clearContext
-from zope.component import getSiteManager
from zope.deprecation import deprecated
from zope.interface import implements
from zope.interface import Interface
@@ -31,8 +30,9 @@ def registerDummySecurityPolicy(userid=None, groupids=(), permissive=True):
policy = DummySecurityPolicy(userid, groupids, permissive)
from repoze.bfg.interfaces import IAuthorizationPolicy
from repoze.bfg.interfaces import IAuthenticationPolicy
- registerUtility(policy, IAuthorizationPolicy)
- registerUtility(policy, IAuthenticationPolicy)
+ reg = get_current_registry()
+ reg.registerUtility(policy, IAuthorizationPolicy)
+ reg.registerUtility(policy, IAuthenticationPolicy)
def registerModels(models):
""" Registers a dictionary of models. This is most useful for
@@ -176,9 +176,8 @@ def registerUtility(impl, iface=Interface, name=''):
string by default. See `The ZCA book
<http://www.muthukadan.net/docs/zca.html>`_ for more information
about ZCA utilities."""
- import zope.component
- sm = zope.component.getSiteManager()
- sm.registerUtility(impl, iface, name=name)
+ reg = get_current_registry()
+ reg.registerUtility(impl, iface, name=name)
return impl
def registerAdapter(impl, for_=Interface, provides=Interface, name=''):
@@ -196,11 +195,10 @@ def registerAdapter(impl, for_=Interface, provides=Interface, name=''):
default. See `The ZCA book
<http://www.muthukadan.net/docs/zca.html>`_ for more information
about ZCA adapters."""
- import zope.component
- sm = zope.component.getSiteManager()
+ reg = get_current_registry()
if not isinstance(for_, (tuple, list)):
for_ = (for_,)
- sm.registerAdapter(impl, for_, provides, name=name)
+ reg.registerAdapter(impl, for_, provides, name=name)
return impl
def registerSubscriber(subscriber, iface=Interface):
@@ -215,11 +213,10 @@ def registerSubscriber(subscriber, iface=Interface):
passed to underlying zca registerHandler query. See `The ZCA book
<http://www.muthukadan.net/docs/zca.html>`_ for more information
about ZCA subscribers."""
- import zope.component
- sm = zope.component.getSiteManager()
+ reg = get_current_registry()
if not isinstance(iface, (tuple, list)):
iface = (iface,)
- sm.registerHandler(subscriber, iface)
+ reg.registerHandler(subscriber, iface)
return subscriber
def registerTraverser(traverser, for_=Interface):
@@ -234,8 +231,8 @@ def registerRoute(path, name, factory=None):
.. note:: This API was added in :mod:`repoze.bfg` version 1.1.
"""
from repoze.bfg.interfaces import IRoutesMapper
- from zope.component import queryUtility
- mapper = queryUtility(IRoutesMapper)
+ reg = get_current_registry()
+ mapper = reg.queryUtility(IRoutesMapper)
if mapper is None:
mapper = registerRoutesMapper(factory)
mapper.connect(path, name, factory)
@@ -265,8 +262,8 @@ def registerRoutesMapper(root_factory=None):
from repoze.bfg.interfaces import IRoutesMapper
from repoze.bfg.urldispatch import RoutesMapper
mapper = RoutesMapper()
- sm = getSiteManager()
- sm.registerUtility(mapper, IRoutesMapper)
+ reg = get_current_registry()
+ reg.registerUtility(mapper, IRoutesMapper)
return mapper
def registerSettings(dictarg=None, **kw):
@@ -289,13 +286,12 @@ def registerSettings(dictarg=None, **kw):
.. note:: This API is new as of :mod:`repoze.bfg` 1.1.
"""
from repoze.bfg.interfaces import ISettings
- from zope.component import queryUtility
from repoze.bfg.settings import Settings
- settings = queryUtility(ISettings)
+ reg = get_current_registry()
+ settings = reg.queryUtility(ISettings)
if settings is None:
settings = Settings()
- sm = getSiteManager()
- sm.registerUtility(settings, ISettings)
+ reg.registerUtility(settings, ISettings)
if dictarg is not None:
settings.update(dictarg)
settings.update(kw)
@@ -520,7 +516,7 @@ class DummyRequest:
self.root = None
self.virtual_root = None
self.marshalled = params # repoze.monty
- self.registry = getSiteManager()
+ self.registry = get_current_registry()
self.__dict__.update(kw)
def setUp():
@@ -536,6 +532,7 @@ def setUp():
.. note:: This feature is new as of :mod:`repoze.bfg` 1.1.
"""
from repoze.bfg.registry import Registry
+ from zope.component import getSiteManager
registry = Registry('testing')
manager.clear()
request = DummyRequest()
@@ -556,6 +553,7 @@ def tearDown():
.. note:: This feature is new as of :mod:`repoze.bfg` 1.1.
"""
+ from zope.component import getSiteManager
getSiteManager.reset()
manager.pop()
diff --git a/repoze/bfg/tests/test_paster.py b/repoze/bfg/tests/test_paster.py
index d9cbefb5e..6091aec44 100644
--- a/repoze/bfg/tests/test_paster.py
+++ b/repoze/bfg/tests/test_paster.py
@@ -27,7 +27,7 @@ class TestBFGShellCommand(unittest.TestCase):
self.assertEqual(len(app.threadlocal_manager.pushed), 1)
pushed = app.threadlocal_manager.pushed[0]
self.assertEqual(pushed['registry'], dummy_registry)
- self.assertEqual(pushed['request'].environ, {})
+ self.assertEqual(pushed['request'].registry, dummy_registry)
self.assertEqual(interact.local, {'root':dummy_root})
self.failUnless(interact.banner)
self.assertEqual(len(app.threadlocal_manager.popped), 1)
@@ -51,7 +51,7 @@ class TestBFGShellCommand(unittest.TestCase):
self.assertEqual(len(app.threadlocal_manager.pushed), 1)
pushed = app.threadlocal_manager.pushed[0]
self.assertEqual(pushed['registry'], dummy_registry)
- self.assertEqual(pushed['request'].environ, {})
+ self.assertEqual(pushed['request'].registry, dummy_registry)
self.assertEqual(dummy_shell_factory.shell.local_ns,{'root':dummy_root})
self.assertEqual(dummy_shell_factory.shell.global_ns, {})
self.failUnless('\n\n' in dummy_shell_factory.shell.IP.BANNER)
diff --git a/repoze/bfg/tests/test_request.py b/repoze/bfg/tests/test_request.py
index a10ba1a75..6dd05a1ec 100644
--- a/repoze/bfg/tests/test_request.py
+++ b/repoze/bfg/tests/test_request.py
@@ -165,24 +165,6 @@ class Test_add_global_response_headers(unittest.TestCase):
self._callFUT(request, [('c', 1)])
self.assertEqual(request.global_response_headers, headers + [('c', 1)])
-class TestFakeRequest(unittest.TestCase):
- def _makeOne(self, environ):
- from repoze.bfg.request import FakeRequest
- return FakeRequest(environ)
-
- def test_environ(self):
- environ = {'a':1, 'b':2}
- request = self._makeOne(environ)
- self.assertEqual(request.environ['a'], 1)
- self.assertEqual(request.environ['b'], 2)
-
- def test_asdict(self):
- environ = {'a':1, 'b':2}
- request = self._makeOne(environ)
- self.assertEqual(request['a'], 1)
- self.assertEqual(request['b'], 2)
-
-
class DummyRequest:
def __init__(self, environ=None):
if environ is None:
diff --git a/repoze/bfg/tests/test_scripting.py b/repoze/bfg/tests/test_scripting.py
index 41542f457..4d45a6456 100644
--- a/repoze/bfg/tests/test_scripting.py
+++ b/repoze/bfg/tests/test_scripting.py
@@ -11,7 +11,7 @@ class TestGetRoot(unittest.TestCase):
self.assertEqual(len(app.threadlocal_manager.pushed), 1)
pushed = app.threadlocal_manager.pushed[0]
self.assertEqual(pushed['registry'], dummy_registry)
- self.assertEqual(pushed['request'].environ, {})
+ self.assertEqual(pushed['request'].registry, app.registry)
self.assertEqual(len(app.threadlocal_manager.popped), 0)
closer()
self.assertEqual(len(app.threadlocal_manager.popped), 1)
diff --git a/repoze/bfg/tests/test_traversal.py b/repoze/bfg/tests/test_traversal.py
index a15716d4c..be62939e5 100644
--- a/repoze/bfg/tests/test_traversal.py
+++ b/repoze/bfg/tests/test_traversal.py
@@ -390,11 +390,11 @@ class FindModelTests(unittest.TestCase):
return find_model(context, name)
def _registerTraverser(self, traverser):
- import zope.component
- sm = zope.component.getSiteManager()
+ from repoze.bfg.threadlocal import get_current_registry
+ reg = get_current_registry()
from repoze.bfg.interfaces import ITraverser
from zope.interface import Interface
- sm.registerAdapter(traverser, (Interface,), ITraverser)
+ reg.registerAdapter(traverser, (Interface,), ITraverser)
def test_list(self):
model = DummyContext()
@@ -402,7 +402,7 @@ class FindModelTests(unittest.TestCase):
self._registerTraverser(traverser)
result = self._callFUT(model, [''])
self.assertEqual(result, model)
- self.assertEqual(model.environ['PATH_INFO'], '/')
+ self.assertEqual(model.request.environ['PATH_INFO'], '/')
def test_generator(self):
model = DummyContext()
@@ -412,7 +412,7 @@ class FindModelTests(unittest.TestCase):
yield ''
result = self._callFUT(model, foo())
self.assertEqual(result, model)
- self.assertEqual(model.environ['PATH_INFO'], '/')
+ self.assertEqual(model.request.environ['PATH_INFO'], '/')
def test_self_string_found(self):
model = DummyContext()
@@ -420,7 +420,7 @@ class FindModelTests(unittest.TestCase):
self._registerTraverser(traverser)
result = self._callFUT(model, '')
self.assertEqual(result, model)
- self.assertEqual(model.environ['PATH_INFO'], '')
+ self.assertEqual(model.request.environ['PATH_INFO'], '')
def test_self_tuple_found(self):
model = DummyContext()
@@ -428,7 +428,7 @@ class FindModelTests(unittest.TestCase):
self._registerTraverser(traverser)
result = self._callFUT(model, ())
self.assertEqual(result, model)
- self.assertEqual(model.environ['PATH_INFO'], '')
+ self.assertEqual(model.request.environ['PATH_INFO'], '')
def test_relative_string_found(self):
model = DummyContext()
@@ -437,7 +437,7 @@ class FindModelTests(unittest.TestCase):
self._registerTraverser(traverser)
result = self._callFUT(model, 'baz')
self.assertEqual(result, baz)
- self.assertEqual(model.environ['PATH_INFO'], 'baz')
+ self.assertEqual(model.request.environ['PATH_INFO'], 'baz')
def test_relative_tuple_found(self):
model = DummyContext()
@@ -446,7 +446,7 @@ class FindModelTests(unittest.TestCase):
self._registerTraverser(traverser)
result = self._callFUT(model, ('baz',))
self.assertEqual(result, baz)
- self.assertEqual(model.environ['PATH_INFO'], 'baz')
+ self.assertEqual(model.request.environ['PATH_INFO'], 'baz')
def test_relative_string_notfound(self):
model = DummyContext()
@@ -454,7 +454,7 @@ class FindModelTests(unittest.TestCase):
traverser = make_traverser({'context':baz, 'view_name':'bar'})
self._registerTraverser(traverser)
self.assertRaises(KeyError, self._callFUT, model, 'baz')
- self.assertEqual(model.environ['PATH_INFO'], 'baz')
+ self.assertEqual(model.request.environ['PATH_INFO'], 'baz')
def test_relative_tuple_notfound(self):
model = DummyContext()
@@ -462,7 +462,7 @@ class FindModelTests(unittest.TestCase):
traverser = make_traverser({'context':baz, 'view_name':'bar'})
self._registerTraverser(traverser)
self.assertRaises(KeyError, self._callFUT, model, ('baz',))
- self.assertEqual(model.environ['PATH_INFO'], 'baz')
+ self.assertEqual(model.request.environ['PATH_INFO'], 'baz')
def test_absolute_string_found(self):
root = DummyContext()
@@ -474,7 +474,7 @@ class FindModelTests(unittest.TestCase):
result = self._callFUT(model, '/')
self.assertEqual(result, root)
self.assertEqual(root.wascontext, True)
- self.assertEqual(root.environ['PATH_INFO'], '/')
+ self.assertEqual(root.request.environ['PATH_INFO'], '/')
def test_absolute_tuple_found(self):
root = DummyContext()
@@ -486,7 +486,7 @@ class FindModelTests(unittest.TestCase):
result = self._callFUT(model, ('',))
self.assertEqual(result, root)
self.assertEqual(root.wascontext, True)
- self.assertEqual(root.environ['PATH_INFO'], '/')
+ self.assertEqual(root.request.environ['PATH_INFO'], '/')
def test_absolute_string_notfound(self):
root = DummyContext()
@@ -497,7 +497,7 @@ class FindModelTests(unittest.TestCase):
self._registerTraverser(traverser)
self.assertRaises(KeyError, self._callFUT, model, '/')
self.assertEqual(root.wascontext, True)
- self.assertEqual(root.environ['PATH_INFO'], '/')
+ self.assertEqual(root.request.environ['PATH_INFO'], '/')
def test_absolute_tuple_notfound(self):
root = DummyContext()
@@ -508,7 +508,7 @@ class FindModelTests(unittest.TestCase):
self._registerTraverser(traverser)
self.assertRaises(KeyError, self._callFUT, model, ('',))
self.assertEqual(root.wascontext, True)
- self.assertEqual(root.environ['PATH_INFO'], '/')
+ self.assertEqual(root.request.environ['PATH_INFO'], '/')
class ModelPathTests(unittest.TestCase):
@@ -662,11 +662,11 @@ class TraversalContextURLTests(unittest.TestCase):
return TraversalContextURL
def _registerTraverser(self, traverser):
- import zope.component
- sm = zope.component.getSiteManager()
+ from repoze.bfg.threadlocal import get_current_registry
+ reg = get_current_registry()
from repoze.bfg.interfaces import ITraverser
from zope.interface import Interface
- sm.registerAdapter(traverser, (Interface,), ITraverser)
+ reg.registerAdapter(traverser, (Interface,), ITraverser)
def test_class_conforms_to_IContextURL(self):
from zope.interface.verify import verifyClass
@@ -774,7 +774,7 @@ class TraversalContextURLTests(unittest.TestCase):
self._registerTraverser(traverser)
context_url = self._makeOne(context, request)
self.assertEqual(context_url.virtual_root(), traversed_to)
- self.assertEqual(context.environ['PATH_INFO'], '/one')
+ self.assertEqual(context.request.environ['PATH_INFO'], '/one')
def test_empty_names_not_ignored(self):
bar = DummyContext()
@@ -849,20 +849,18 @@ class TestVirtualRoot(unittest.TestCase):
return virtual_root(model, request)
def test_registered(self):
- from zope.component import getSiteManager
from repoze.bfg.interfaces import IContextURL
from zope.interface import Interface
- sm = getSiteManager()
- sm.registerAdapter(DummyContextURL, (Interface,Interface),
- IContextURL)
+ request = _makeRequest()
+ request.registry.registerAdapter(DummyContextURL, (Interface,Interface),
+ IContextURL)
context = DummyContext()
- request = DummyRequest()
result = self._callFUT(context, request)
self.assertEqual(result, '123')
def test_default(self):
context = DummyContext()
- request = DummyRequest()
+ request = _makeRequest()
request.environ['PATH_INFO'] = '/'
result = self._callFUT(context, request)
self.assertEqual(result, context)
@@ -879,18 +877,26 @@ class TraverseTests(unittest.TestCase):
return traverse(context, name)
def _registerTraverser(self, traverser):
- import zope.component
- sm = zope.component.getSiteManager()
+ from repoze.bfg.threadlocal import get_current_registry
+ reg = get_current_registry()
from repoze.bfg.interfaces import ITraverser
from zope.interface import Interface
- sm.registerAdapter(traverser, (Interface,), ITraverser)
+ reg.registerAdapter(traverser, (Interface,), ITraverser)
+
+ def test_request_has_registry(self):
+ from repoze.bfg.threadlocal import get_current_registry
+ model = DummyContext()
+ traverser = make_traverser({'context':model, 'view_name':''})
+ self._registerTraverser(traverser)
+ self._callFUT(model, [''])
+ self.assertEqual(model.request.registry, get_current_registry())
def test_list(self):
model = DummyContext()
traverser = make_traverser({'context':model, 'view_name':''})
self._registerTraverser(traverser)
self._callFUT(model, [''])
- self.assertEqual(model.environ['PATH_INFO'], '/')
+ self.assertEqual(model.request.environ['PATH_INFO'], '/')
def test_generator(self):
model = DummyContext()
@@ -899,21 +905,21 @@ class TraverseTests(unittest.TestCase):
def foo():
yield ''
self._callFUT(model, foo())
- self.assertEqual(model.environ['PATH_INFO'], '/')
+ self.assertEqual(model.request.environ['PATH_INFO'], '/')
def test_self_string_found(self):
model = DummyContext()
traverser = make_traverser({'context':model, 'view_name':''})
self._registerTraverser(traverser)
self._callFUT(model, '')
- self.assertEqual(model.environ['PATH_INFO'], '')
+ self.assertEqual(model.request.environ['PATH_INFO'], '')
def test_self_tuple_found(self):
model = DummyContext()
traverser = make_traverser({'context':model, 'view_name':''})
self._registerTraverser(traverser)
self._callFUT(model, ())
- self.assertEqual(model.environ['PATH_INFO'], '')
+ self.assertEqual(model.request.environ['PATH_INFO'], '')
def test_relative_string_found(self):
model = DummyContext()
@@ -921,7 +927,7 @@ class TraverseTests(unittest.TestCase):
traverser = make_traverser({'context':baz, 'view_name':''})
self._registerTraverser(traverser)
self._callFUT(model, 'baz')
- self.assertEqual(model.environ['PATH_INFO'], 'baz')
+ self.assertEqual(model.request.environ['PATH_INFO'], 'baz')
def test_relative_tuple_found(self):
model = DummyContext()
@@ -929,7 +935,7 @@ class TraverseTests(unittest.TestCase):
traverser = make_traverser({'context':baz, 'view_name':''})
self._registerTraverser(traverser)
self._callFUT(model, ('baz',))
- self.assertEqual(model.environ['PATH_INFO'], 'baz')
+ self.assertEqual(model.request.environ['PATH_INFO'], 'baz')
def test_absolute_string_found(self):
root = DummyContext()
@@ -940,7 +946,7 @@ class TraverseTests(unittest.TestCase):
self._registerTraverser(traverser)
self._callFUT(model, '/')
self.assertEqual(root.wascontext, True)
- self.assertEqual(root.environ['PATH_INFO'], '/')
+ self.assertEqual(root.request.environ['PATH_INFO'], '/')
def test_absolute_tuple_found(self):
root = DummyContext()
@@ -951,7 +957,7 @@ class TraverseTests(unittest.TestCase):
self._registerTraverser(traverser)
self._callFUT(model, ('',))
self.assertEqual(root.wascontext, True)
- self.assertEqual(root.environ['PATH_INFO'], '/')
+ self.assertEqual(root.request.environ['PATH_INFO'], '/')
def test_empty_sequence(self):
root = DummyContext()
@@ -962,7 +968,7 @@ class TraverseTests(unittest.TestCase):
self._registerTraverser(traverser)
self._callFUT(model, [])
self.assertEqual(model.wascontext, True)
- self.assertEqual(model.environ['PATH_INFO'], '')
+ self.assertEqual(model.request.environ['PATH_INFO'], '')
def test_default_traverser(self):
model = DummyContext()
@@ -999,8 +1005,8 @@ def make_traverser(result):
def __init__(self, context):
self.context = context
context.wascontext = True
- def __call__(self, environ):
- self.context.environ = environ
+ def __call__(self, request):
+ self.context.request = request
return result
return DummyTraverser
@@ -1040,3 +1046,9 @@ class DummyRoute:
if self.raise_exc:
raise self.raise_exc
return self.result
+
+def _makeRequest(environ=None):
+ from repoze.bfg.registry import Registry
+ request = DummyRequest()
+ request.registry = Registry()
+ return request
diff --git a/repoze/bfg/tests/test_url.py b/repoze/bfg/tests/test_url.py
index 6754f6f34..a27fb96fd 100644
--- a/repoze/bfg/tests/test_url.py
+++ b/repoze/bfg/tests/test_url.py
@@ -13,64 +13,62 @@ class ModelURLTests(unittest.TestCase):
from repoze.bfg.url import model_url
return model_url(model, request, *elements, **kw)
- def _registerContextURL(self):
+ def _registerContextURL(self, reg):
from repoze.bfg.interfaces import IContextURL
from zope.interface import Interface
- from zope.component import getSiteManager
class DummyContextURL(object):
def __init__(self, context, request):
pass
def __call__(self):
return 'http://example.com/context/'
- sm = getSiteManager()
- sm.registerAdapter(DummyContextURL, (Interface, Interface),
- IContextURL)
+ reg.registerAdapter(DummyContextURL, (Interface, Interface),
+ IContextURL)
def test_root_default(self):
- self._registerContextURL()
+ request = _makeRequest()
+ self._registerContextURL(request.registry)
root = DummyContext()
- request = DummyRequest()
result = self._callFUT(root, request)
self.assertEqual(result, 'http://example.com/context/')
def test_extra_args(self):
- self._registerContextURL()
+ request = _makeRequest()
+ self._registerContextURL(request.registry)
context = DummyContext()
- request = DummyRequest()
result = self._callFUT(context, request, 'this/theotherthing', 'that')
self.assertEqual(
result,
'http://example.com/context/this%2Ftheotherthing/that')
def test_unicode_in_element_names(self):
- self._registerContextURL()
+ request = _makeRequest()
+ self._registerContextURL(request.registry)
uc = unicode('La Pe\xc3\xb1a', 'utf-8')
context = DummyContext()
- request = DummyRequest()
result = self._callFUT(context, request, uc)
self.assertEqual(result,
'http://example.com/context/La%20Pe%C3%B1a')
def test_element_names_url_quoted(self):
- self._registerContextURL()
+ request = _makeRequest()
+ self._registerContextURL(request.registry)
context = DummyContext()
- request = DummyRequest()
result = self._callFUT(context, request, 'a b c')
self.assertEqual(result, 'http://example.com/context/a%20b%20c')
def test_with_query_dict(self):
- self._registerContextURL()
+ request = _makeRequest()
+ self._registerContextURL(request.registry)
context = DummyContext()
- request = DummyRequest()
uc = unicode('La Pe\xc3\xb1a', 'utf-8')
result = self._callFUT(context, request, 'a', query={'a':uc})
self.assertEqual(result,
'http://example.com/context/a?a=La+Pe%C3%B1a')
def test_with_query_seq(self):
- self._registerContextURL()
+ request = _makeRequest()
+ self._registerContextURL(request.registry)
context = DummyContext()
- request = DummyRequest()
uc = unicode('La Pe\xc3\xb1a', 'utf-8')
result = self._callFUT(context, request, 'a', query=[('a', 'hi there'),
('b', uc)])
@@ -78,43 +76,43 @@ class ModelURLTests(unittest.TestCase):
'http://example.com/context/a?a=hi+there&b=La+Pe%C3%B1a')
def test_anchor_is_after_root_when_no_elements(self):
- self._registerContextURL()
+ request = _makeRequest()
+ self._registerContextURL(request.registry)
context = DummyContext()
- request = DummyRequest()
result = self._callFUT(context, request, anchor='a')
self.assertEqual(result,
'http://example.com/context/#a')
def test_anchor_is_after_elements_when_no_qs(self):
- self._registerContextURL()
+ request = _makeRequest()
+ self._registerContextURL(request.registry)
context = DummyContext()
- request = DummyRequest()
result = self._callFUT(context, request, 'a', anchor='b')
self.assertEqual(result,
'http://example.com/context/a#b')
def test_anchor_is_after_qs_when_qs_is_present(self):
- self._registerContextURL()
+ request = _makeRequest()
+ self._registerContextURL(request.registry)
context = DummyContext()
- request = DummyRequest()
result = self._callFUT(context, request, 'a',
query={'b':'c'}, anchor='d')
self.assertEqual(result,
'http://example.com/context/a?b=c#d')
def test_anchor_is_encoded_utf8_if_unicode(self):
- self._registerContextURL()
+ request = _makeRequest()
+ self._registerContextURL(request.registry)
context = DummyContext()
- request = DummyRequest()
uc = unicode('La Pe\xc3\xb1a', 'utf-8')
result = self._callFUT(context, request, anchor=uc)
self.assertEqual(result,
'http://example.com/context/#La Pe\xc3\xb1a')
def test_anchor_is_not_urlencoded(self):
- self._registerContextURL()
+ request = _makeRequest()
+ self._registerContextURL(request.registry)
context = DummyContext()
- request = DummyRequest()
result = self._callFUT(context, request, anchor=' /#')
self.assertEqual(result,
'http://example.com/context/# /#')
@@ -124,7 +122,7 @@ class ModelURLTests(unittest.TestCase):
root = DummyContext()
root.__name__ = ''
root.__parent__ = None
- request = DummyRequest()
+ request = _makeRequest()
request.environ = {}
result = self._callFUT(root, request)
self.assertEqual(result, 'http://example.com:5432/')
@@ -142,11 +140,9 @@ class TestRouteUrl(unittest.TestCase):
def test_with_elements(self):
from repoze.bfg.interfaces import IRoutesMapper
+ request = _makeRequest()
mapper = DummyRoutesMapper(result='/1/2/3')
- from zope.component import getSiteManager
- sm = getSiteManager()
- sm.registerUtility(mapper, IRoutesMapper)
- request = DummyRequest()
+ request.registry.registerUtility(mapper, IRoutesMapper)
result = self._callFUT('flub', request, 'extra1', 'extra2',
a=1, b=2, c=3, _query={'a':1},
_anchor=u"foo")
@@ -155,11 +151,9 @@ class TestRouteUrl(unittest.TestCase):
def test_no_elements(self):
from repoze.bfg.interfaces import IRoutesMapper
+ request = _makeRequest()
mapper = DummyRoutesMapper(result='/1/2/3')
- from zope.component import getSiteManager
- sm = getSiteManager()
- sm.registerUtility(mapper, IRoutesMapper)
- request = DummyRequest()
+ request.registry.registerUtility(mapper, IRoutesMapper)
result = self._callFUT('flub', request, a=1, b=2, c=3, _query={'a':1},
_anchor=u"foo")
self.assertEqual(result,
@@ -167,12 +161,10 @@ class TestRouteUrl(unittest.TestCase):
def test_it_generation_error(self):
from repoze.bfg.interfaces import IRoutesMapper
+ request = _makeRequest()
mapper = DummyRoutesMapper(raise_exc=KeyError)
- from zope.component import getSiteManager
- sm = getSiteManager()
- sm.registerUtility(mapper, IRoutesMapper)
+ request.registry.registerUtility(mapper, IRoutesMapper)
mapper.raise_exc = KeyError
- request = DummyRequest()
self.assertRaises(KeyError, self._callFUT, 'flub', request, a=1)
class TestStaticUrl(unittest.TestCase):
@@ -188,45 +180,37 @@ class TestStaticUrl(unittest.TestCase):
def test_notfound(self):
from repoze.bfg.interfaces import IRoutesMapper
- from zope.component import getSiteManager
+ request = _makeRequest()
mapper = DummyRoutesMapper(result='/1/2/3')
- sm = getSiteManager()
- sm.registerUtility(mapper, IRoutesMapper)
- request = DummyRequest()
+ request.registry.registerUtility(mapper, IRoutesMapper)
self.assertRaises(ValueError, self._callFUT, 'static/foo.css', request)
def test_abspath(self):
from repoze.bfg.interfaces import IRoutesMapper
- from zope.component import getSiteManager
+ request = _makeRequest()
mapper = DummyRoutesMapper(result='/1/2/3')
- sm = getSiteManager()
- sm.registerUtility(mapper, IRoutesMapper)
- request = DummyRequest()
+ request.registry.registerUtility(mapper, IRoutesMapper)
self.assertRaises(ValueError, self._callFUT, '/static/foo.css', request)
def test_found_rel(self):
from repoze.bfg.interfaces import IRoutesMapper
from repoze.bfg.static import StaticRootFactory
- from zope.component import getSiteManager
+ request = _makeRequest()
factory = StaticRootFactory('repoze.bfg.tests:fixtures')
routes = [DummyRoute('name', factory=factory)]
mapper = DummyRoutesMapper(result='/1/2/3', routes = routes)
- sm = getSiteManager()
- sm.registerUtility(mapper, IRoutesMapper)
- request = DummyRequest()
+ request.registry.registerUtility(mapper, IRoutesMapper)
url = self._callFUT('fixtures/minimal.pt', request)
self.assertEqual(url, 'http://example.com:5432/1/2/3')
def test_found_abs(self):
from repoze.bfg.interfaces import IRoutesMapper
from repoze.bfg.static import StaticRootFactory
- from zope.component import getSiteManager
+ request = _makeRequest()
factory = StaticRootFactory('repoze.bfg.tests:fixtures')
routes = [DummyRoute('name', factory=factory)]
mapper = DummyRoutesMapper(result='/1/2/3', routes = routes)
- sm = getSiteManager()
- sm.registerUtility(mapper, IRoutesMapper)
- request = DummyRequest()
+ request.registry.registerUtility(mapper, IRoutesMapper)
url = self._callFUT('repoze.bfg.tests:fixtures/minimal.pt', request)
self.assertEqual(url, 'http://example.com:5432/1/2/3')
@@ -259,3 +243,11 @@ class DummyRoute:
def __init__(self, name, factory=None):
self.name = name
self.factory = factory
+
+def _makeRequest(environ=None):
+ from repoze.bfg.registry import Registry
+ request = DummyRequest(environ)
+ request.registry = Registry()
+ return request
+
+
diff --git a/repoze/bfg/traversal.py b/repoze/bfg/traversal.py
index b46fb83c7..daf307c73 100644
--- a/repoze/bfg/traversal.py
+++ b/repoze/bfg/traversal.py
@@ -1,8 +1,5 @@
import urllib
-from zope.component import queryMultiAdapter
-from zope.component import queryAdapter
-
from zope.interface import implements
from zope.interface.interfaces import IInterface
@@ -14,7 +11,8 @@ from repoze.bfg.interfaces import VH_ROOT_KEY
from repoze.bfg.location import lineage
from repoze.bfg.encode import url_quote
-from repoze.bfg.request import FakeRequest
+from repoze.bfg.request import Request
+from repoze.bfg.threadlocal import get_current_registry
def find_root(model):
""" Find the root node in the graph to which ``model``
@@ -269,8 +267,10 @@ def traverse(model, path):
if path and path[0] == '/':
model = find_root(model)
- request = FakeRequest({'PATH_INFO':path})
- traverser = queryAdapter(model, ITraverser)
+ request = Request.blank(path)
+ reg = get_current_registry()
+ request.registry = reg
+ traverser = reg.queryAdapter(model, ITraverser)
if traverser is None:
traverser = ModelGraphTraverser(model)
@@ -347,7 +347,11 @@ def virtual_root(model, request):
is called with a ``model`` argument which is a context obtained
via URL dispatch, the model passed in will be returned
unconditonally."""
- urlgenerator = queryMultiAdapter((model, request), IContextURL)
+ try:
+ reg = request.registry
+ except AttributeError:
+ reg = get_current_registry() # b/c
+ urlgenerator = reg.queryMultiAdapter((model, request), IContextURL)
if urlgenerator is None:
urlgenerator = TraversalContextURL(model, request)
return urlgenerator.virtual_root()
diff --git a/repoze/bfg/url.py b/repoze/bfg/url.py
index a39069642..51e1b109e 100644
--- a/repoze/bfg/url.py
+++ b/repoze/bfg/url.py
@@ -2,9 +2,6 @@
import os
-from zope.component import getUtility
-from zope.component import queryMultiAdapter
-
from repoze.lru import lru_cache
from repoze.bfg.interfaces import IContextURL
@@ -13,8 +10,9 @@ from repoze.bfg.interfaces import IRoutesMapper
from repoze.bfg.encode import urlencode
from repoze.bfg.path import caller_package
from repoze.bfg.static import StaticRootFactory
-from repoze.bfg.traversal import TraversalContextURL
+from repoze.bfg.threadlocal import get_current_registry
from repoze.bfg.traversal import quote_path_segment
+from repoze.bfg.traversal import TraversalContextURL
def route_url(route_name, request, *elements, **kw):
"""Generates a fully qualified URL for a named BFG route.
@@ -89,7 +87,11 @@ def route_url(route_name, request, *elements, **kw):
due to missing replacement names. Extra replacement names are
ignored.
"""
- mapper = getUtility(IRoutesMapper)
+ try:
+ reg = request.registry
+ except AttributeError:
+ reg = get_current_registry() # b/c
+ mapper = reg.getUtility(IRoutesMapper)
path = mapper.generate(route_name, kw) # raises KeyError if generate fails
anchor = ''
@@ -195,8 +197,12 @@ def model_url(model, request, *elements, **kw):
will always follow the query element,
e.g. ``http://example.com?foo=1#bar``.
"""
+ try:
+ reg = request.registry
+ except AttributeError:
+ reg = get_current_registry() # b/c
- context_url = queryMultiAdapter((model, request), IContextURL)
+ context_url = reg.queryMultiAdapter((model, request), IContextURL)
if context_url is None:
context_url = TraversalContextURL(model, request)
model_url = context_url()
@@ -263,8 +269,13 @@ def static_url(path, request, **kw):
# to the package in which the caller's module is defined.
package = caller_package(level=2)
path = '%s:%s' % (package.__name__, path)
+
+ try:
+ reg = request.registry
+ except AttributeError:
+ reg = get_current_registry() # b/c
- mapper = getUtility(IRoutesMapper)
+ mapper = reg.getUtility(IRoutesMapper)
routes = mapper.get_routes()
for route in routes: