From 003e522b5784f50bc6f41168d0b087cc25d2aa4f Mon Sep 17 00:00:00 2001 From: Malthe Borch Date: Fri, 29 Aug 2008 18:24:03 +0000 Subject: Added event notification after WSGI application is created and configured. --- repoze/bfg/interfaces.py | 14 ++++++++++++++ repoze/bfg/router.py | 6 +++++- repoze/bfg/tests/test_router.py | 15 ++++++++++++++- 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/repoze/bfg/interfaces.py b/repoze/bfg/interfaces.py index 3a4c45373..d1a8fc63a 100644 --- a/repoze/bfg/interfaces.py +++ b/repoze/bfg/interfaces.py @@ -1,6 +1,9 @@ +from zope.interface import implements from zope.interface import Interface from zope.interface import Attribute +from zope.component.interfaces import IObjectEvent + class IRequest(Interface): """ Marker interface for a request object """ @@ -84,3 +87,14 @@ class ISettings(Interface): """ Runtime settings for repoze.bfg """ reload_templates = Attribute('Reload templates when they change') +class IWSGIApplicationCreatedEvent(IObjectEvent): + """ Event issued after the application has been created and + configured.""" + + app = Attribute(u"Published application") + +class WSGIApplicationCreatedEvent(object): + implements(IWSGIApplicationCreatedEvent) + + def __init__(self, app): + self.app = app diff --git a/repoze/bfg/router.py b/repoze/bfg/router.py index 49ccd1ad6..21ac17564 100644 --- a/repoze/bfg/router.py +++ b/repoze/bfg/router.py @@ -3,6 +3,7 @@ from zope.component import queryMultiAdapter from zope.component import queryUtility from zope.component.event import dispatch from zope.interface import directlyProvides +from zope.event import notify from webob import Request from webob.exc import HTTPNotFound @@ -15,6 +16,7 @@ from repoze.bfg.interfaces import IView from repoze.bfg.interfaces import IViewPermission from repoze.bfg.interfaces import ISecurityPolicy from repoze.bfg.interfaces import IRequest +from repoze.bfg.interfaces import WSGIApplicationCreatedEvent from repoze.bfg.registry import registry_manager @@ -89,6 +91,8 @@ def make_app(root_policy, package=None, filename='configure.zcml', specific option value, e.g. ``{'reload_templates':True}``""" from repoze.bfg.registry import makeRegistry registry = makeRegistry(filename, package, options) - return Router(root_policy, registry) + app = Router(root_policy, registry) + notify(WSGIApplicationCreatedEvent(app)) + return app diff --git a/repoze/bfg/tests/test_router.py b/repoze/bfg/tests/test_router.py index 381091d56..87dcbba66 100644 --- a/repoze/bfg/tests/test_router.py +++ b/repoze/bfg/tests/test_router.py @@ -264,7 +264,7 @@ class RouterTests(unittest.TestCase, PlacelessSetup): self.assertEqual(request_events[0].request.environ, environ) self.assertEqual(len(response_events), 1) self.assertEqual(response_events[0].response, response) - + class MakeAppTests(unittest.TestCase, PlacelessSetup): def setUp(self): PlacelessSetup.setUp(self) @@ -284,6 +284,19 @@ class MakeAppTests(unittest.TestCase, PlacelessSetup): self.assertEqual(app.registry.__name__, 'repoze.bfg.tests.fixtureapp') self.assertEqual(app.root_policy, rootpolicy) + def test_event(self): + def subscriber(event): + event.app.created = True + from zope.component import getGlobalSiteManager + from repoze.bfg.interfaces import IWSGIApplicationCreatedEvent + getGlobalSiteManager().registerHandler( + subscriber, (IWSGIApplicationCreatedEvent,)) + from repoze.bfg.tests import fixtureapp + make_app = self._getFUT() + rootpolicy = make_rootpolicy(None) + app = make_app(rootpolicy, fixtureapp) + assert app.created is True + class DummyContext: pass -- cgit v1.2.3