From 6fec211488f87f9207fda9c39b21e83c6359c727 Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Mon, 23 Nov 2009 04:51:35 +0000 Subject: - 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. ``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. Get rid of extraneous uses of ZCA threadlocal API. --- CHANGES.txt | 17 ++++++ TODO.txt | 7 +-- repoze/bfg/chameleon_text.py | 5 +- repoze/bfg/chameleon_zpt.py | 5 +- repoze/bfg/renderers.py | 19 +++---- repoze/bfg/request.py | 5 -- repoze/bfg/resource.py | 6 +-- repoze/bfg/scripting.py | 7 +-- repoze/bfg/settings.py | 6 ++- repoze/bfg/testing.py | 40 +++++++------- repoze/bfg/tests/test_paster.py | 4 +- repoze/bfg/tests/test_request.py | 18 ------- repoze/bfg/tests/test_scripting.py | 2 +- repoze/bfg/tests/test_traversal.py | 90 ++++++++++++++++++-------------- repoze/bfg/tests/test_url.py | 104 +++++++++++++++++-------------------- repoze/bfg/traversal.py | 18 ++++--- repoze/bfg/url.py | 25 ++++++--- 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 `_ 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 `_ 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 `_ 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: -- cgit v1.2.3