diff options
| author | Chris McDonough <chrism@plope.com> | 2010-10-31 20:00:36 -0400 |
|---|---|---|
| committer | Chris McDonough <chrism@plope.com> | 2010-10-31 20:00:36 -0400 |
| commit | 04bcc2a67e866df226ec2f5ec1baa2754bbe354d (patch) | |
| tree | 49c1995408fd6775f3f3e15a3e998d5db2303c17 | |
| parent | 63824da50671728c2ae5cae501208e1fbda5812d (diff) | |
| download | pyramid-04bcc2a67e866df226ec2f5ec1baa2754bbe354d.tar.gz pyramid-04bcc2a67e866df226ec2f5ec1baa2754bbe354d.tar.bz2 pyramid-04bcc2a67e866df226ec2f5ec1baa2754bbe354d.zip | |
pass settings to renderer factory, as most template renderers need to look at at least one setting to determine how to do rendering
| -rw-r--r-- | CHANGES.txt | 3 | ||||
| -rw-r--r-- | docs/narr/views.rst | 11 | ||||
| -rw-r--r-- | pyramid/configuration.py | 16 | ||||
| -rw-r--r-- | pyramid/mako_templating.py | 4 | ||||
| -rw-r--r-- | pyramid/renderers.py | 16 | ||||
| -rw-r--r-- | pyramid/tests/test_configuration.py | 8 | ||||
| -rw-r--r-- | pyramid/tests/test_mako_templating.py | 12 | ||||
| -rw-r--r-- | pyramid/tests/test_renderers.py | 33 |
8 files changed, 59 insertions, 44 deletions
diff --git a/CHANGES.txt b/CHANGES.txt index 8dbbbfd66..b54f1a920 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -98,7 +98,8 @@ Backwards Incompatibilities (with BFG 1.3.X) specification or an absolute path. The dictonary contains the following keys: ``name`` (the ``renderer=`` value), ``package`` (the 'current package' when the renderer configuration statement was found), ``type``: the renderer - type, and ``registry``: the current registry. + type, ``registry``: the current registry, and ``settings``: the deployment + settings dictionary. Third-party ``repoze.bfg`` renderer implementations that must be ported to Pyramid will need to account for this. diff --git a/docs/narr/views.rst b/docs/narr/views.rst index 0070e7a73..7e3dfebf1 100644 --- a/docs/narr/views.rst +++ b/docs/narr/views.rst @@ -739,11 +739,12 @@ following interface: class RendererFactory: def __init__(self, info): - """ Constructor: ``info`` will be a dictionary containing the - following keys: ``name`` (the renderer name), ``package``: the - package that was 'current' at the time the renderer was registered, - ``type``: the renderer type name, and ``registry``: the current - registry. """ + """ Constructor: ``info`` will be a dictionary containing + the following keys: ``name`` (the renderer name), ``package`` + (the package that was 'current' at the time the renderer was + registered), ``type`` (the renderer type name), ``registry`` + (the current application registry) and ``settings`` (the + deployment settings dictionary).""" def __call__(self, value, system): """ Call a the renderer implementation with the value and diff --git a/pyramid/configuration.py b/pyramid/configuration.py index 3c2e3b6b5..bc4c6a7e3 100644 --- a/pyramid/configuration.py +++ b/pyramid/configuration.py @@ -327,16 +327,18 @@ class Configurator(object): def _fix_registry(self): """ Fix up a ZCA component registry that is not a - pyramid.registry.Registry by adding analogues of - ``has_listeners`` and ``notify`` through monkey-patching.""" + pyramid.registry.Registry by adding analogues of ``has_listeners``, + and ``notify`` through monkey-patching.""" - if not hasattr(self.registry, 'notify'): + _registry = self.registry + + if not hasattr(_registry, 'notify'): def notify(*events): - [ _ for _ in self.registry.subscribers(events, None) ] - self.registry.notify = notify + [ _ for _ in _registry.subscribers(events, None) ] + _registry.notify = notify - if not hasattr(self.registry, 'has_listeners'): - self.registry.has_listeners = True + if not hasattr(_registry, 'has_listeners'): + _registry.has_listeners = True # API diff --git a/pyramid/mako_templating.py b/pyramid/mako_templating.py index ec6119764..a414338af 100644 --- a/pyramid/mako_templating.py +++ b/pyramid/mako_templating.py @@ -5,7 +5,6 @@ from zope.interface import Interface from pyramid.interfaces import ITemplateRenderer from pyramid.exceptions import ConfigurationError -from pyramid.settings import get_settings from pyramid.resource import resolve_resource_spec from pyramid.resource import abspath_from_resource_spec @@ -15,7 +14,6 @@ from mako import exceptions class IMakoLookup(Interface): pass - class PkgResourceTemplateLookup(TemplateLookup): """TemplateLookup subclass that handles resource specification uri's""" @@ -56,9 +54,9 @@ class PkgResourceTemplateLookup(TemplateLookup): def renderer_factory(info): path = info['name'] registry = info['registry'] + settings = info['settings'] or {} lookup = registry.queryUtility(IMakoLookup) if lookup is None: - settings = get_settings() or {} reload_templates = settings.get('reload_templates', False) directories = settings.get('mako.directories') module_directory = settings.get('mako.module_directory') diff --git a/pyramid/renderers.py b/pyramid/renderers.py index 78084ae97..14380cd16 100644 --- a/pyramid/renderers.py +++ b/pyramid/renderers.py @@ -8,13 +8,13 @@ from pyramid.interfaces import IRendererGlobalsFactory from pyramid.interfaces import IRendererFactory from pyramid.interfaces import IResponseFactory from pyramid.interfaces import ITemplateRenderer +from pyramid.interfaces import ISettings from pyramid.compat import json from pyramid.decorator import reify from pyramid.path import caller_package from pyramid.path import package_path from pyramid.resource import resource_spec_from_abspath -from pyramid.settings import get_settings from pyramid.threadlocal import get_current_registry # API @@ -157,6 +157,8 @@ def template_renderer_factory(info, impl, lock=registry_lock): reg = info['registry'] spec = info['name'] package = info['package'] + settings = info['settings'] + isabs = os.path.isabs(spec) if (not isabs) and (not ':' in spec) and package: @@ -195,7 +197,7 @@ def template_renderer_factory(info, impl, lock=registry_lock): raise ValueError( 'Missing template resource: %s (%s)' % (spec, abspath)) renderer = impl(abspath) - if not _reload_resources(): + if settings and not settings.get('reload_resources'): # cache the template try: lock.acquire() @@ -205,17 +207,15 @@ def template_renderer_factory(info, impl, lock=registry_lock): return renderer -def _reload_resources(): - settings = get_settings() - return settings and settings.get('reload_resources') - def renderer_from_name(path, package=None): # XXX deprecate? return RendererHelper(name=path, package=package).get_renderer() class RendererHelper(object): def __init__(self, name=None, package=None, registry=None): + settings = None if registry is None: registry = get_current_registry() + settings = registry.queryUtility(ISettings) if name and '.' in name: rtype = os.path.splitext(name)[1] @@ -229,6 +229,7 @@ class RendererHelper(object): self.type = rtype self.factory = factory self.registry = registry + self.settings = settings @reify def renderer(self): @@ -239,7 +240,8 @@ class RendererHelper(object): 'name':self.name, 'type':self.type, 'package':self.package, - 'registry':self.registry + 'registry':self.registry, + 'settings':self.settings, }) def get_renderer(self): diff --git a/pyramid/tests/test_configuration.py b/pyramid/tests/test_configuration.py index 415d760ed..0ff65d309 100644 --- a/pyramid/tests/test_configuration.py +++ b/pyramid/tests/test_configuration.py @@ -1372,7 +1372,8 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(renderer.info, {'registry':config.registry, 'type': '.txt', 'name': 'pyramid.tests:fixtures/minimal.txt', - 'package': pyramid.tests}) + 'package': pyramid.tests, + 'settings':None}) def test_add_view_with_template_renderer_no_callable(self): import pyramid.tests @@ -1388,8 +1389,9 @@ class ConfiguratorTests(unittest.TestCase): {'registry':config.registry, 'type': '.txt', 'name': 'pyramid.tests:fixtures/minimal.txt', - 'package':pyramid.tests} - ) + 'package':pyramid.tests, + 'settings':None, + }) def test_add_view_with_request_type_as_iface(self): from zope.interface import directlyProvides diff --git a/pyramid/tests/test_mako_templating.py b/pyramid/tests/test_mako_templating.py index 37780d1ba..3b1c7fd24 100644 --- a/pyramid/tests/test_mako_templating.py +++ b/pyramid/tests/test_mako_templating.py @@ -22,14 +22,14 @@ class Test_renderer_factory(Base, unittest.TestCase): def test_no_directories(self): from pyramid.exceptions import ConfigurationError info = {'name':'helloworld.mak', 'package':None, - 'registry':self.config.registry} + 'registry':self.config.registry, 'settings':None} self.assertRaises(ConfigurationError, self._callFUT, info) def test_no_lookup(self): from pyramid.mako_templating import IMakoLookup - self.config.add_settings({'mako.directories':self.templates_dir}) + settings = {'mako.directories':self.templates_dir} info = {'name':'helloworld.mak', 'package':None, - 'registry':self.config.registry} + 'registry':self.config.registry, 'settings':settings} renderer = self._callFUT(info) lookup = self.config.registry.getUtility(IMakoLookup) self.assertEqual(lookup.directories, [self.templates_dir]) @@ -40,9 +40,9 @@ class Test_renderer_factory(Base, unittest.TestCase): def test_composite_directories_path(self): from pyramid.mako_templating import IMakoLookup twice = self.templates_dir + '\n' + self.templates_dir - self.config.add_settings({'mako.directories':twice}) + settings = {'mako.directories':twice} info = {'name':'helloworld.mak', 'package':None, - 'registry':self.config.registry} + 'registry':self.config.registry, 'settings':settings} self._callFUT(info) lookup = self.config.registry.getUtility(IMakoLookup) self.assertEqual(lookup.directories, [self.templates_dir]*2) @@ -52,7 +52,7 @@ class Test_renderer_factory(Base, unittest.TestCase): lookup = dict() self.config.registry.registerUtility(lookup, IMakoLookup) info = {'name':'helloworld.mak', 'package':None, - 'registry':self.config.registry} + 'registry':self.config.registry, 'settings':{}} renderer = self._callFUT(info) self.assertEqual(renderer.lookup, lookup) self.assertEqual(renderer.path, 'helloworld.mak') diff --git a/pyramid/tests/test_renderers.py b/pyramid/tests/test_renderers.py index 917bb7c40..018efa2d4 100644 --- a/pyramid/tests/test_renderers.py +++ b/pyramid/tests/test_renderers.py @@ -19,7 +19,7 @@ class TestTemplateRendererFactory(unittest.TestCase): abspath = '/wont/exist' testing.registerUtility({}, ITemplateRenderer, name=abspath) info = {'name':abspath, 'package':None, - 'registry':self.config.registry} + 'registry':self.config.registry, 'settings':{}} self.assertRaises(ValueError, self._callFUT, info, None) def test_abspath_alreadyregistered(self): @@ -29,7 +29,7 @@ class TestTemplateRendererFactory(unittest.TestCase): renderer = {} testing.registerUtility(renderer, ITemplateRenderer, name=abspath) info = {'name':abspath, 'package':None, - 'registry':self.config.registry} + 'registry':self.config.registry, 'settings':{}} result = self._callFUT(info, None) self.failUnless(result is renderer) @@ -40,7 +40,7 @@ class TestTemplateRendererFactory(unittest.TestCase): renderer = {} testing.registerUtility(renderer, ITemplateRenderer, name=abspath) info = {'name':abspath, 'package':None, - 'registry':self.config.registry} + 'registry':self.config.registry, 'settings':{}} result = self._callFUT(info, None) self.failUnless(result is renderer) @@ -50,7 +50,7 @@ class TestTemplateRendererFactory(unittest.TestCase): testing.registerUtility(renderer, ITemplateRenderer, name='foo/bar') spec = 'foo/bar' info = {'name':spec, 'package':None, - 'registry':self.config.registry} + 'registry':self.config.registry, 'settings':{}} result = self._callFUT(info, None) self.failUnless(renderer is result) @@ -62,13 +62,14 @@ class TestTemplateRendererFactory(unittest.TestCase): testing.registerUtility(renderer, ITemplateRenderer, name='pyramid.tests:bar/baz') info = {'name':spec, 'package':pyramid.tests, - 'registry':self.config.registry} + 'registry':self.config.registry, 'settings':{}} result = self._callFUT(info, None) self.failUnless(renderer is result) def test_spec_notfound(self): spec = 'pyramid.tests:wont/exist' - info = {'name':spec, 'package':None, 'registry':self.config.registry} + info = {'name':spec, 'package':None, 'registry':self.config.registry, + 'settings':{}} self.assertRaises(ValueError, self._callFUT, info, None) def test_spec_alreadyregistered(self): @@ -77,7 +78,8 @@ class TestTemplateRendererFactory(unittest.TestCase): module_name = tests.__name__ relpath = 'test_renderers.py' spec = '%s:%s' % (module_name, relpath) - info = {'name':spec, 'package':None, 'registry':self.config.registry} + info = {'name':spec, 'package':None, 'registry':self.config.registry, + 'settings':{}} renderer = {} testing.registerUtility(renderer, ITemplateRenderer, name=spec) result = self._callFUT(info, None) @@ -91,7 +93,8 @@ class TestTemplateRendererFactory(unittest.TestCase): renderer = {} factory = DummyFactory(renderer) spec = '%s:%s' % (module_name, relpath) - info = {'name':spec, 'package':None, 'registry':self.config.registry} + info = {'name':spec, 'package':None, 'registry':self.config.registry, + 'settings':{}} result = self._callFUT(info, factory) self.failUnless(result is renderer) path = os.path.abspath(__file__) @@ -111,7 +114,7 @@ class TestTemplateRendererFactory(unittest.TestCase): factory = DummyFactory(renderer) spec = 'test_renderers.py' info = {'name':spec, 'package':pyramid.tests, - 'registry':self.config.registry} + 'registry':self.config.registry, 'settings':{}} result = self._callFUT(info, factory) self.failUnless(result is renderer) spec = '%s:%s' % ('pyramid.tests', 'test_renderers.py') @@ -122,15 +125,13 @@ class TestTemplateRendererFactory(unittest.TestCase): def test_reload_resources_false(self): import pyramid.tests from pyramid.threadlocal import get_current_registry - from pyramid.interfaces import ISettings from pyramid.interfaces import ITemplateRenderer settings = {'reload_resources':False} - testing.registerUtility(settings, ISettings) renderer = {} factory = DummyFactory(renderer) spec = 'test_renderers.py' info = {'name':spec, 'package':pyramid.tests, - 'registry':self.config.registry} + 'registry':self.config.registry, 'settings':settings} result = self._callFUT(info, factory) self.failUnless(result is renderer) spec = '%s:%s' % ('pyramid.tests', 'test_renderers.py') @@ -151,7 +152,10 @@ class TestRendererFromName(unittest.TestCase): def test_it(self): from pyramid.threadlocal import get_current_registry + from pyramid.interfaces import ISettings registry = get_current_registry() + settings = {} + registry.registerUtility(settings, ISettings) from pyramid.interfaces import IRendererFactory import os here = os.path.dirname(os.path.abspath(__file__)) @@ -164,12 +168,16 @@ class TestRendererFromName(unittest.TestCase): 'type':'.pt', 'package':None, 'name':fixture, + 'settings':settings, }) def test_it_with_package(self): import pyramid from pyramid.threadlocal import get_current_registry + from pyramid.interfaces import ISettings registry = get_current_registry() + settings = {} + registry.registerUtility(settings, ISettings) from pyramid.interfaces import IRendererFactory import os here = os.path.dirname(os.path.abspath(__file__)) @@ -182,6 +190,7 @@ class TestRendererFromName(unittest.TestCase): 'type':'.pt', 'package':pyramid, 'name':fixture, + 'settings':settings, }) def test_it_no_renderer(self): |
