summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2009-07-01 17:58:07 +0000
committerChris McDonough <chrism@agendaless.com>2009-07-01 17:58:07 +0000
commit88ac1b58af928fcf9283b3aa15283782181c880d (patch)
tree2afce500a9295fb16e9b4069eb666944b63c417f
parent9686fec0c85c2624853eeaf59e738e23b4981ebe (diff)
downloadpyramid-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.txt9
-rw-r--r--repoze/bfg/templating.py14
-rw-r--r--repoze/bfg/tests/test_templating.py48
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