diff options
| author | Chris McDonough <chrism@agendaless.com> | 2009-07-01 17:58:07 +0000 |
|---|---|---|
| committer | Chris McDonough <chrism@agendaless.com> | 2009-07-01 17:58:07 +0000 |
| commit | 88ac1b58af928fcf9283b3aa15283782181c880d (patch) | |
| tree | 2afce500a9295fb16e9b4069eb666944b63c417f | |
| parent | 9686fec0c85c2624853eeaf59e738e23b4981ebe (diff) | |
| download | pyramid-88ac1b58af928fcf9283b3aa15283782181c880d.tar.gz pyramid-88ac1b58af928fcf9283b3aa15283782181c880d.tar.bz2 pyramid-88ac1b58af928fcf9283b3aa15283782181c880d.zip | |
- Make it possible to pass strings in the form
"package_name:relative/path" to APIs like ``render_template``,
``render_template_to_response``, and ``get_template``. Sometimes
the package in which a caller lives is a direct namespace package,
so the module which is returned is semi-useless for navigating from.
| -rw-r--r-- | CHANGES.txt | 9 | ||||
| -rw-r--r-- | repoze/bfg/templating.py | 14 | ||||
| -rw-r--r-- | repoze/bfg/tests/test_templating.py | 48 |
3 files changed, 61 insertions, 10 deletions
diff --git a/CHANGES.txt b/CHANGES.txt index fb4d07abd..27cb3255f 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,3 +1,12 @@ +Next release +============ + +- Make it possible to pass strings in the form + "package_name:relative/path" to APIs like ``render_template``, + ``render_template_to_response``, and ``get_template``. Sometimes + the package in which a caller lives is a direct namespace package, + so the module which is returned is semi-useless for navigating from. + 1.0a8 (2009-07-01) ================== diff --git a/repoze/bfg/templating.py b/repoze/bfg/templating.py index 3287f0808..1f242b306 100644 --- a/repoze/bfg/templating.py +++ b/repoze/bfg/templating.py @@ -21,10 +21,16 @@ def renderer_from_cache(path, factory, level=3, **kw): sm.registerUtility(renderer, ITemplateRenderer, name=path) else: - # 'path' is a relative filename - package = caller_package(level=level) - spec = (package.__name__, path) - utility_name = '%s:%s' % spec # utility name must be a string + # 'path' is a relative filename or a package:relpath spec + if ':' in path: + # it's a package:relpath spec + spec = path.split(':', 1) + utility_name = path + else: + # it's a relpath only + package = caller_package(level=level) + spec = (package.__name__, path) + utility_name = '%s:%s' % spec # utility name must be a string renderer = queryUtility(ITemplateRenderer, name=utility_name) if renderer is None: # service unit tests here by trying the relative path diff --git a/repoze/bfg/tests/test_templating.py b/repoze/bfg/tests/test_templating.py index 361cf6f7e..6b317fb7d 100644 --- a/repoze/bfg/tests/test_templating.py +++ b/repoze/bfg/tests/test_templating.py @@ -45,13 +45,22 @@ class TestRendererFromCache(unittest.TestCase): result = self._callFUT('foo/bar', None) self.failUnless(renderer is result) - def test_relpath_notfound(self): - import os - here = os.path.dirname(__file__) - abspath = os.path.join(here, 'wont/exist') + def test_relpath_is_package_registered(self): renderer = {} + from repoze.bfg.interfaces import ITemplateRenderer + testing.registerUtility(renderer, ITemplateRenderer, name='foo:bar/baz') + result = self._callFUT('foo:bar/baz', None) + self.failUnless(renderer is result) + + def test_relpath_notfound(self): self.assertRaises(ValueError, self._callFUT, 'wont/exist', None) + def test_relpath_is_package_notfound(self): + from repoze.bfg import tests + module_name = tests.__name__ + self.assertRaises(ValueError, self._callFUT, + '%s:wont/exist' % module_name, None) + def test_relpath_alreadyregistered(self): from repoze.bfg.interfaces import ITemplateRenderer from repoze.bfg import tests @@ -63,6 +72,17 @@ class TestRendererFromCache(unittest.TestCase): result = self._callFUT('test_templating.py', None) self.failUnless(result is renderer) + def test_relpath_is_package_alreadyregistered(self): + from repoze.bfg.interfaces import ITemplateRenderer + from repoze.bfg import tests + module_name = tests.__name__ + relpath = 'test_templating.py' + spec = '%s:%s' % (module_name, relpath) + renderer = {} + testing.registerUtility(renderer, ITemplateRenderer, name=spec) + result = self._callFUT(spec, None) + self.failUnless(result is renderer) + def test_relpath_notyetregistered(self): import os from repoze.bfg.tests import test_templating @@ -78,7 +98,23 @@ class TestRendererFromCache(unittest.TestCase): self.assertEqual(factory.path, path) self.assertEqual(factory.kw, {}) - def test_relpath_notyetregistered_reload_resources_true(self): + def test_relpath_is_package_notyetregistered(self): + import os + from repoze.bfg import tests + module_name = tests.__name__ + relpath = 'test_templating.py' + renderer = {} + factory = DummyFactory(renderer) + spec = '%s:%s' % (module_name, relpath) + result = self._callFUT(spec, factory) + self.failUnless(result is renderer) + path = os.path.abspath(__file__) + if path.endswith('pyc'): # pragma: no cover + path = path[:-1] + self.assertEqual(factory.path, path) + self.assertEqual(factory.kw, {}) + + def test_reload_resources_true(self): from zope.component import queryUtility from repoze.bfg.interfaces import ISettings from repoze.bfg.interfaces import ITemplateRenderer @@ -92,7 +128,7 @@ class TestRendererFromCache(unittest.TestCase): self.assertEqual(queryUtility(ITemplateRenderer, name=spec), None) - def test_relpath_notyetregistered_reload_resources_false(self): + def test_reload_resources_false(self): from zope.component import queryUtility from repoze.bfg.interfaces import ISettings from repoze.bfg.interfaces import ITemplateRenderer |
