From a7f13ff10e0eae01b958738e41d9d172af2916dd Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Mon, 1 Jun 2009 07:20:48 +0000 Subject: - It was not possible to register a custom ``IRoutesContextFactory`` for use as a default context factory as documented in the "Hooks" chapter. --- CHANGES.txt | 7 +++++++ repoze/bfg/router.py | 15 +++++++++++++-- repoze/bfg/tests/test_router.py | 32 ++++++++++++++++++++++++++++++++ repoze/bfg/tests/test_urldispatch.py | 20 +++----------------- repoze/bfg/urldispatch.py | 6 +----- 5 files changed, 56 insertions(+), 24 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 03dd1afc4..905f88304 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,6 +1,13 @@ Next Release ============ +Bug Fixes +--------- + +- It was not possible to register a custom ``IRoutesContextFactory`` + for use as a default context factory as documented in the "Hooks" + chapter. + Features -------- diff --git a/repoze/bfg/router.py b/repoze/bfg/router.py index b243ec5b0..51094229a 100644 --- a/repoze/bfg/router.py +++ b/repoze/bfg/router.py @@ -30,6 +30,8 @@ from repoze.bfg.interfaces import IView from repoze.bfg.interfaces import IViewPermission from repoze.bfg.interfaces import IAuthorizationPolicy from repoze.bfg.interfaces import IAuthenticationPolicy +from repoze.bfg.interfaces import IRoutesContext +from repoze.bfg.interfaces import IRoutesContextFactory from repoze.bfg.log import make_stream_logger @@ -350,8 +352,6 @@ def make_app(root_factory, package=None, filename='configure.zcml', registry.registerUtility(debug_logger, ILogger, 'repoze.bfg.debug') settings = Settings(options) registry.registerUtility(settings, ISettings) - mapper = RoutesRootFactory(root_factory) - registry.registerUtility(mapper, IRoutesMapper) if authentication_policy: registry.registerUtility(authentication_policy, IAuthenticationPolicy) @@ -359,8 +359,19 @@ def make_app(root_factory, package=None, filename='configure.zcml', authorization_policy = ACLAuthorizationPolicy() registry.registerUtility(authorization_policy, IAuthorizationPolicy) + mapper = RoutesRootFactory(root_factory) + registry.registerUtility(mapper, IRoutesMapper) + populateRegistry(registry, filename, package) + context_factory = registry.queryUtility( + IRoutesContextFactory, + default=mapper.default_context_factory) + + if IRoutesContext.implementedBy(context_factory): + mapper.decorate_context = False + mapper.default_context_factory = context_factory + if not authentication_policy: # deal with bw compat of <= 0.8 security policies (deprecated) secpol = registry.queryUtility(ISecurityPolicy) diff --git a/repoze/bfg/tests/test_router.py b/repoze/bfg/tests/test_router.py index 09c3f7c1f..d07efcc69 100644 --- a/repoze/bfg/tests/test_router.py +++ b/repoze/bfg/tests/test_router.py @@ -911,6 +911,38 @@ class MakeAppTests(unittest.TestCase): self.assertEqual(len(logger.messages), 1) self.failUnless('ISecurityPolicy' in logger.messages[0]) + def test_custom_default_context_factory_nodecorate(self): + from repoze.bfg.tests import routesapp + from zope.component import getGlobalSiteManager + from repoze.bfg.interfaces import IRoutesContextFactory + from repoze.bfg.interfaces import IRoutesMapper + class Dummy(object): + pass + gsm = getGlobalSiteManager() + gsm.registerUtility(Dummy, IRoutesContextFactory) + app = self._callFUT(None, routesapp, registry=gsm) + mapper = gsm.getUtility(IRoutesMapper) + self.assertEqual(mapper.default_context_factory, + Dummy) + self.assertEqual(mapper.decorate_context, True) + + def test_custom_default_context_factory_decorate(self): + from repoze.bfg.tests import routesapp + from zope.component import getGlobalSiteManager + from repoze.bfg.interfaces import IRoutesContextFactory + from repoze.bfg.interfaces import IRoutesMapper + from repoze.bfg.interfaces import IRoutesContext + from zope.interface import implements + class Dummy(object): + implements(IRoutesContext) + gsm = getGlobalSiteManager() + gsm.registerUtility(Dummy, IRoutesContextFactory) + app = self._callFUT(None, routesapp, registry=gsm) + mapper = gsm.getUtility(IRoutesMapper) + self.assertEqual(mapper.default_context_factory, + Dummy) + self.assertEqual(mapper.decorate_context, False) + class TestDefaultForbiddenView(unittest.TestCase): def _callFUT(self, context, request): from repoze.bfg.router import default_forbidden_view diff --git a/repoze/bfg/tests/test_urldispatch.py b/repoze/bfg/tests/test_urldispatch.py index 92564146e..2b4578f94 100644 --- a/repoze/bfg/tests/test_urldispatch.py +++ b/repoze/bfg/tests/test_urldispatch.py @@ -22,32 +22,18 @@ class RoutesRootFactoryTests(unittest.TestCase): klass = self._getTargetClass() return klass(get_root) - def test_init_custom_default_context_factory_dont_decorate(self): + def test_init_default_context_factory(self): from zope.component import getGlobalSiteManager from repoze.bfg.interfaces import IRoutesContextFactory + from repoze.bfg.urldispatch import DefaultRoutesContext class Dummy(object): pass gsm = getGlobalSiteManager() gsm.registerUtility(Dummy, IRoutesContextFactory) mapper = self._makeOne(None) - self.assertEqual(mapper.default_context_factory, - Dummy) + self.assertEqual(mapper.default_context_factory, DefaultRoutesContext) self.assertEqual(mapper.decorate_context, True) - def test_init_custom_default_context_factory_decorate(self): - from zope.component import getGlobalSiteManager - from repoze.bfg.interfaces import IRoutesContextFactory - from repoze.bfg.interfaces import IRoutesContext - from zope.interface import implements - class Dummy(object): - implements(IRoutesContext) - gsm = getGlobalSiteManager() - gsm.registerUtility(Dummy, IRoutesContextFactory) - mapper = self._makeOne(None) - self.assertEqual(mapper.default_context_factory, - Dummy) - self.assertEqual(mapper.decorate_context, False) - def test_no_route_matches(self): marker = () get_root = make_get_root(marker) diff --git a/repoze/bfg/urldispatch.py b/repoze/bfg/urldispatch.py index 7f1431819..612843cfa 100644 --- a/repoze/bfg/urldispatch.py +++ b/repoze/bfg/urldispatch.py @@ -55,11 +55,7 @@ class RoutesRootFactory(Mapper): kw['explicit'] = True Mapper.__init__(self, **kw) self._regs_created = False - context_factory = queryUtility(IRoutesContextFactory, - default=DefaultRoutesContext) - if IRoutesContext.implementedBy(context_factory): - self.decorate_context = False - self.default_context_factory = context_factory + self.default_context_factory = DefaultRoutesContext def has_routes(self): return bool(self.matchlist) -- cgit v1.2.3