summaryrefslogtreecommitdiff
path: root/repoze
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2009-09-17 06:14:27 +0000
committerChris McDonough <chrism@agendaless.com>2009-09-17 06:14:27 +0000
commit19473e78e61ad084f07a0f7820a75b6c64d93dcd (patch)
tree77de1251af1041601adae3017060c46eef4739d1 /repoze
parent550e16bb5936f5e22954992e50ac57f7f5cff4e0 (diff)
downloadpyramid-19473e78e61ad084f07a0f7820a75b6c64d93dcd.tar.gz
pyramid-19473e78e61ad084f07a0f7820a75b6c64d93dcd.tar.bz2
pyramid-19473e78e61ad084f07a0f7820a75b6c64d93dcd.zip
- Add a ``string`` renderer. This renderer converts a non-Response
return value of any view callble into a string. It is documented in the "Views" narrative chapter.
Diffstat (limited to 'repoze')
-rw-r--r--repoze/bfg/includes/configure.zcml5
-rw-r--r--repoze/bfg/renderers.py7
-rw-r--r--repoze/bfg/router.py4
-rw-r--r--repoze/bfg/tests/test_renderers.py22
4 files changed, 36 insertions, 2 deletions
diff --git a/repoze/bfg/includes/configure.zcml b/repoze/bfg/includes/configure.zcml
index 37cd4d75a..60119b2c9 100644
--- a/repoze/bfg/includes/configure.zcml
+++ b/repoze/bfg/includes/configure.zcml
@@ -33,4 +33,9 @@
name="json"
/>
+ <renderer
+ factory="repoze.bfg.renderers.string_renderer_factory"
+ name="string"
+ />
+
</configure>
diff --git a/repoze/bfg/renderers.py b/repoze/bfg/renderers.py
index 503131400..c5aed2906 100644
--- a/repoze/bfg/renderers.py
+++ b/repoze/bfg/renderers.py
@@ -22,6 +22,13 @@ def json_renderer_factory(name):
return json.dumps(value)
return _render
+def string_renderer_factory(name):
+ def _render(value):
+ if not isinstance(value, basestring):
+ value = str(value)
+ return value
+ return _render
+
# utility functions
def template_renderer_factory(path, impl, level=3):
diff --git a/repoze/bfg/router.py b/repoze/bfg/router.py
index d9502a435..e8497331b 100644
--- a/repoze/bfg/router.py
+++ b/repoze/bfg/router.py
@@ -114,8 +114,8 @@ class Router(object):
return response.app_iter
except AttributeError:
raise ValueError(
- 'Non-response object returned from view %s: %r' %
- (view_name, response))
+ 'Non-response object returned from view named %s '
+ '(and no renderer): %r' % (view_name, response))
provides = map(providedBy, (context, request))
view_callable = registry.adapters.lookup(
diff --git a/repoze/bfg/tests/test_renderers.py b/repoze/bfg/tests/test_renderers.py
index 6e33f4ce5..d1acc0285 100644
--- a/repoze/bfg/tests/test_renderers.py
+++ b/repoze/bfg/tests/test_renderers.py
@@ -178,7 +178,29 @@ class Test_json_renderer_factory(unittest.TestCase):
renderer = self._callFUT(None)
result = renderer({'a':1})
self.assertEqual(result, '{"a": 1}')
+
+class Test_string_renderer_factory(unittest.TestCase):
+ def _callFUT(self, name):
+ from repoze.bfg.renderers import string_renderer_factory
+ return string_renderer_factory(name)
+
+ def test_it_unicode(self):
+ renderer = self._callFUT(None)
+ value = unicode('La Pe\xc3\xb1a', 'utf-8')
+ result = renderer(value)
+ self.assertEqual(result, value)
+ def test_it_str(self):
+ renderer = self._callFUT(None)
+ value = 'La Pe\xc3\xb1a'
+ result = renderer(value)
+ self.assertEqual(result, value)
+
+ def test_it_other(self):
+ renderer = self._callFUT(None)
+ value = None
+ result = renderer(value)
+ self.assertEqual(result, 'None')
class DummyFactory:
def __init__(self, renderer):