diff options
| author | Chris McDonough <chrism@agendaless.com> | 2008-08-18 04:06:35 +0000 |
|---|---|---|
| committer | Chris McDonough <chrism@agendaless.com> | 2008-08-18 04:06:35 +0000 |
| commit | e35dc1a58a4e91977dc9819c80259f09800a0b58 (patch) | |
| tree | e90fea96be6f491becd5399f177057f1feeadf68 /repoze | |
| parent | 0235914a7c520e20dafcfc251237deddedaf3d80 (diff) | |
| download | pyramid-e35dc1a58a4e91977dc9819c80259f09800a0b58.tar.gz pyramid-e35dc1a58a4e91977dc9819c80259f09800a0b58.tar.bz2 pyramid-e35dc1a58a4e91977dc9819c80259f09800a0b58.zip | |
- Generated application differences: ``make_app`` entry point
renamed to ``app`` in order to have a different name than the bfg
function of the same name, to prevent confusion.
- Add "options" processing to bfg's ``make_app`` to support runtime
options. A new API function named ``get_options`` was added to
the registry module. This function is typically used in an
application's ``app`` entry point. The Paste config file section
for the app can now supply the ``reload_templates`` option, which,
if true, will prevent the need to restart the appserver in order
for ``z3c.pt`` or XSLT template changes to be detected.
- Use only the module name in generated project's "test_suite" (run
all tests found in the package).
- Default port for generated apps changed from 5432 to 6543
(Postgres default port is 6543).
Diffstat (limited to 'repoze')
| -rw-r--r-- | repoze/bfg/__init__.py | 1 | ||||
| -rw-r--r-- | repoze/bfg/meta.zcml | 6 | ||||
| -rw-r--r-- | repoze/bfg/paster_template/+package+.ini_tmpl | 5 | ||||
| -rw-r--r-- | repoze/bfg/paster_template/+package+/run.py_tmpl | 12 | ||||
| -rw-r--r-- | repoze/bfg/paster_template/setup.py_tmpl | 4 | ||||
| -rw-r--r-- | repoze/bfg/registry.py | 24 | ||||
| -rw-r--r-- | repoze/bfg/router.py | 19 | ||||
| -rw-r--r-- | repoze/bfg/sampleapp/configure.zcml | 3 | ||||
| -rw-r--r-- | repoze/bfg/sampleapp/run.py | 2 | ||||
| -rw-r--r-- | repoze/bfg/tests/test_registry.py | 22 | ||||
| -rw-r--r-- | repoze/bfg/tests/test_zcml.py | 31 | ||||
| -rw-r--r-- | repoze/bfg/zcml.py | 27 |
12 files changed, 69 insertions, 87 deletions
diff --git a/repoze/bfg/__init__.py b/repoze/bfg/__init__.py index e677d851b..e603a8fac 100644 --- a/repoze/bfg/__init__.py +++ b/repoze/bfg/__init__.py @@ -1,5 +1,6 @@ try: from repoze.bfg.router import make_app # for import elsewhere + from repoze.bfg.registry import get_options # for import elsewhere except ImportError: # don't try so hard that we cause setup.py test to fail when the # right modules aren't installed. diff --git a/repoze/bfg/meta.zcml b/repoze/bfg/meta.zcml index 91b4f40e8..72e963ae6 100644 --- a/repoze/bfg/meta.zcml +++ b/repoze/bfg/meta.zcml @@ -10,12 +10,6 @@ handler=".zcml.view" /> - <meta:directive - name="settings" - schema=".zcml.ISettingsDirective" - handler=".zcml.settings" - /> - </meta:directives> </configure> diff --git a/repoze/bfg/paster_template/+package+.ini_tmpl b/repoze/bfg/paster_template/+package+.ini_tmpl index 9bb03718c..2d6c4d0a2 100644 --- a/repoze/bfg/paster_template/+package+.ini_tmpl +++ b/repoze/bfg/paster_template/+package+.ini_tmpl @@ -2,10 +2,11 @@ debug = true [app:main] -use = egg:{{project}}#make_app +use = egg:{{project}}#app +reload_templates = true [server:main] use = egg:PasteScript#cherrypy host = 0.0.0.0 -port = 5432 +port = 6543 numthreads = 4 diff --git a/repoze/bfg/paster_template/+package+/run.py_tmpl b/repoze/bfg/paster_template/+package+/run.py_tmpl index f8228d30a..b3c3d1ed7 100644 --- a/repoze/bfg/paster_template/+package+/run.py_tmpl +++ b/repoze/bfg/paster_template/+package+/run.py_tmpl @@ -1,13 +1,13 @@ -def make_app(global_config, **kw): +from repoze.bfg import make_app +from repoze.bfg import get_options + +def app(global_config, **kw): # paster app config callback - from repoze.bfg import make_app from {{project}}.models import get_root import {{ project}} - app = make_app(get_root, {{project}}) - return app + return make_app(get_root, {{project}}, options=get_options(kw)) if __name__ == '__main__': from paste import httpserver - app = make_app(None) - httpserver.serve(app, host='0.0.0.0', port='5432') + httpserver.serve(app(None), host='0.0.0.0', port='6543') diff --git a/repoze/bfg/paster_template/setup.py_tmpl b/repoze/bfg/paster_template/setup.py_tmpl index 278153de8..d2b4d575b 100644 --- a/repoze/bfg/paster_template/setup.py_tmpl +++ b/repoze/bfg/paster_template/setup.py_tmpl @@ -35,10 +35,10 @@ setup(name='{{project}}', tests_require=[ 'repoze.bfg', ], - test_suite="{{project}}.tests", + test_suite="{{project}}", entry_points = """\ [paste.app_factory] - make_app = {{project}}.run:make_app + app = {{project}}.run:app """ ) diff --git a/repoze/bfg/registry.py b/repoze/bfg/registry.py index e1887bbdd..e02e5124e 100644 --- a/repoze/bfg/registry.py +++ b/repoze/bfg/registry.py @@ -6,9 +6,12 @@ from zope.component.interfaces import ComponentLookupError from zope.component.interfaces import IComponentLookup from zope.component.registry import Components from zope.component import getSiteManager as original_getSiteManager - from zope.configuration import xmlconfig +from zope.interface import implements + +from repoze.bfg.interfaces import ISettings + class ThreadLocalRegistryManager(threading.local): registry = getGlobalSiteManager() def set(self, registry): @@ -28,7 +31,7 @@ def setRegistryManager(manager): # for unit tests registry_manager = manager return old_registry_manager -def makeRegistry(filename, package, lock=threading.Lock()): +def makeRegistry(filename, package, options=None, lock=threading.Lock()): # This is absurd and probably not worth it. We want to try to # push our ZCML-defined configuration into an app-local component # registry in order to allow more than one bfg app to live in the @@ -50,12 +53,21 @@ def makeRegistry(filename, package, lock=threading.Lock()): original_getSiteManager.sethook(getSiteManager) zope.component.getGlobalSiteManager = registry_manager.get xmlconfig.file(filename, package=package) + if options is None: + options = {} + settings = Settings(options) + registry.registerUtility(settings, ISettings) return registry finally: zope.component.getGlobalSiteManager = getGlobalSiteManager lock.release() registry_manager.clear() +class Settings(object): + implements(ISettings) + def __init__(self, options): + self.reload_templates = options.get('reload_templates', False) + def getSiteManager(context=None): if context is None: return registry_manager.get() @@ -65,6 +77,14 @@ def getSiteManager(context=None): except TypeError, error: raise ComponentLookupError(*error.args) +def asbool(s): + s = str(s).strip() + return s.lower() in ('t', 'true', 'y', 'yes', 'on', '1') + +def get_options(kw): + reload_templates = asbool(kw.get('reload_templates')) + return {'reload_templates':reload_templates} + from zope.testing.cleanup import addCleanUp try: addCleanUp(original_getSiteManager.reset) diff --git a/repoze/bfg/router.py b/repoze/bfg/router.py index d6b60f5ec..49ccd1ad6 100644 --- a/repoze/bfg/router.py +++ b/repoze/bfg/router.py @@ -74,16 +74,21 @@ def isResponse(ob): isinstance(ob.status, basestring) ) : return True -def make_app(root_policy, package=None, filename='configure.zcml'): +def make_app(root_policy, package=None, filename='configure.zcml', + options=None): """ Create a view registry based on the application's ZCML. and return a Router object, representing a ``repoze.bfg`` WSGI - application. 'root_policy' must be a callable that accepts a WSGI - environment and returns a graph root object. 'package' is the - dotted-Python-path packagename of the application, 'filename' is - the filesystem path to a ZCML file (optionally relative to the - package path) that should be parsed to create the view registry.""" + application. ``root_policy`` must be a callable that accepts a + WSGI environment and returns a graph root object. ``package`` is + a Python module representing the application's package, + ``filename`` is the filesystem path to a ZCML file (optionally + relative to the package path) that should be parsed to create the + view registry. ``options``, if used, should be a dictionary + containing bfg-specific runtime options, with each key + representing the option and the key's value representing the + specific option value, e.g. ``{'reload_templates':True}``""" from repoze.bfg.registry import makeRegistry - registry = makeRegistry(filename, package) + registry = makeRegistry(filename, package, options) return Router(root_policy, registry) diff --git a/repoze/bfg/sampleapp/configure.zcml b/repoze/bfg/sampleapp/configure.zcml index d20d7d8f9..a5f27595e 100644 --- a/repoze/bfg/sampleapp/configure.zcml +++ b/repoze/bfg/sampleapp/configure.zcml @@ -4,9 +4,6 @@ <include package="repoze.bfg" /> - <bfg:settings - reload_templates="true"/> - <utility provides="repoze.bfg.interfaces.ISecurityPolicy" factory="repoze.bfg.security.RemoteUserACLSecurityPolicy" diff --git a/repoze/bfg/sampleapp/run.py b/repoze/bfg/sampleapp/run.py index 6c36c430e..df2ceca39 100644 --- a/repoze/bfg/sampleapp/run.py +++ b/repoze/bfg/sampleapp/run.py @@ -3,7 +3,7 @@ from repoze.bfg import sampleapp from repoze.bfg.sampleapp.models import get_root def main(): - app = make_app(get_root, sampleapp) + app = make_app(get_root, sampleapp, options={'reload_templates':True}) from paste import httpserver httpserver.serve(app, host='0.0.0.0', port='5432') diff --git a/repoze/bfg/tests/test_registry.py b/repoze/bfg/tests/test_registry.py index 0d051c131..de8481fd8 100644 --- a/repoze/bfg/tests/test_registry.py +++ b/repoze/bfg/tests/test_registry.py @@ -23,15 +23,37 @@ class TestMakeRegistry(unittest.TestCase, PlacelessSetup): old = repoze.bfg.registry.setRegistryManager(dummyregmgr) registry = makeRegistry('configure.zcml', fixtureapp, + options={'reload_templates':True}, lock=dummylock) from zope.component.registry import Components self.failUnless(isinstance(registry, Components)) self.assertEqual(dummylock.acquired, True) self.assertEqual(dummylock.released, True) self.assertEqual(dummyregmgr.registry, registry) + from zope.component import getUtility + from repoze.bfg.interfaces import ISettings + settings = getUtility(ISettings) + self.assertEqual(settings.reload_templates, True) finally: repoze.bfg.registry.setRegistryManager(old) +class TestGetOptions(unittest.TestCase): + def _getFUT(self): + from repoze.bfg.registry import get_options + return get_options + + def test_it(self): + get_options = self._getFUT() + self.assertEqual(get_options({}), + {'reload_templates':False}) + self.assertEqual(get_options({'reload_templates':'false'}), + {'reload_templates':False}) + self.assertEqual(get_options({'reload_templates':'t'}), + {'reload_templates':True}) + self.assertEqual(get_options({'reload_templates':'1'}), + {'reload_templates':True}) + + class TestThreadLocalRegistryManager(unittest.TestCase, PlacelessSetup): def setUp(self): PlacelessSetup.setUp(self) diff --git a/repoze/bfg/tests/test_zcml.py b/repoze/bfg/tests/test_zcml.py index 407eaf24e..663022796 100644 --- a/repoze/bfg/tests/test_zcml.py +++ b/repoze/bfg/tests/test_zcml.py @@ -114,37 +114,6 @@ class TestViewDirective(unittest.TestCase, PlacelessSetup): self.assertEqual(regadapt['args'][4], '') self.assertEqual(regadapt['args'][5], None) -class TestSettingsDirective(unittest.TestCase, PlacelessSetup): - def setUp(self): - PlacelessSetup.setUp(self) - - def tearDown(self): - PlacelessSetup.tearDown(self) - - def _getFUT(self): - from repoze.bfg.zcml import settings - return settings - - def test_defaults(self): - context = DummyContext() - settings = self._getFUT() - settings(context) - actions = context.actions - from repoze.bfg.interfaces import ISettings - from zope.component.zcml import handler - self.assertEqual(len(actions), 1) - action = actions[0] - self.assertEqual(action['discriminator'], ('settings', ISettings)) - self.assertEqual(action['callable'], handler) - self.assertEqual(len(action['args']), 5) - self.assertEqual(action['args'][0], 'registerUtility') - settings = action['args'][1] - self.assertEqual(settings.reload_templates, False) - self.failUnless(ISettings.providedBy(settings), settings) - self.assertEqual(action['args'][2], ISettings) - self.assertEqual(action['args'][3], '') - self.assertEqual(action['args'][4], context.info) - class TestSampleApp(unittest.TestCase, PlacelessSetup): def setUp(self): PlacelessSetup.setUp(self) diff --git a/repoze/bfg/zcml.py b/repoze/bfg/zcml.py index bb37c6581..343abc1d7 100644 --- a/repoze/bfg/zcml.py +++ b/repoze/bfg/zcml.py @@ -2,44 +2,17 @@ from zope.component.zcml import handler from zope.component.interface import provideInterface from zope.configuration.exceptions import ConfigurationError from zope.configuration.fields import GlobalObject -from zope.configuration.fields import Bool from zope.interface import Interface -from zope.interface import implements from zope.schema import TextLine from repoze.bfg.interfaces import IRequest from repoze.bfg.interfaces import IViewPermission from repoze.bfg.interfaces import IView -from repoze.bfg.interfaces import ISettings from repoze.bfg.security import ViewPermissionFactory -def _handler(*arg, **kw): - import pdb; pdb.set_trace() - return handler(*arg, **kw) - -class Settings(object): - implements(ISettings) - def __init__(self, reload_templates=False): - self.reload_templates = reload_templates - -def settings(_context, reload_templates=False): - settings = Settings(reload_templates=reload_templates) - _context.action( - discriminator = ('settings', ISettings), - callable = handler, - args = ('registerUtility', settings, ISettings, '', _context.info), - ) - -class ISettingsDirective(Interface): - reload_templates = Bool( - title=u"Reload templates when they change", - description=(u"Specifies whether templates should be reloaded when" - "a change is made"), - default=False) - def view(_context, permission=None, for_=None, |
