summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris McDonough <chrism@plope.com>2012-11-14 00:50:16 -0500
committerChris McDonough <chrism@plope.com>2012-11-14 00:50:16 -0500
commite70753d54b0603f03f787c653040377e0b45d5f7 (patch)
treedb41f74fe6445acd18e6a74b74171504f7d46858
parent3563e7f4ee334f2e9edef3f2aa9336206b20a05c (diff)
parent23de5bafdc074a01541a2a3dd3fa9e20e5801d57 (diff)
downloadpyramid-e70753d54b0603f03f787c653040377e0b45d5f7.tar.gz
pyramid-e70753d54b0603f03f787c653040377e0b45d5f7.tar.bz2
pyramid-e70753d54b0603f03f787c653040377e0b45d5f7.zip
Merge branch 'master' of github.com:Pylons/pyramid
-rw-r--r--CHANGES.txt4
-rw-r--r--pyramid/tests/test_view.py29
-rw-r--r--pyramid/view.py5
3 files changed, 30 insertions, 8 deletions
diff --git a/CHANGES.txt b/CHANGES.txt
index e40312c34..16e3d8586 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -61,6 +61,10 @@ Bug Fixes
``physical_path`` predicate implementations; instead of raising an exception,
return False.
+- :func:`pyramid.view.render_view` was not functioning properly under
+ Python 3.x due to a byte/unicode discrepancy. See
+ http://github.com/Pylons/pyramid/issues/721
+
Deprecations
------------
diff --git a/pyramid/tests/test_view.py b/pyramid/tests/test_view.py
index 0af941e0d..a78b0cbab 100644
--- a/pyramid/tests/test_view.py
+++ b/pyramid/tests/test_view.py
@@ -224,12 +224,29 @@ class RenderViewToIterableTests(BaseTest, unittest.TestCase):
response = DummyResponse()
view = make_view(response)
def anotherview(context, request):
- return DummyResponse('anotherview')
+ return DummyResponse(b'anotherview')
view.__call_permissive__ = anotherview
self._registerView(request.registry, view, 'registered')
iterable = self._callFUT(context, request, name='registered',
secure=False)
- self.assertEqual(iterable, ['anotherview'])
+ self.assertEqual(iterable, [b'anotherview'])
+
+ def test_verify_output_bytestring(self):
+ from pyramid.request import Request
+ from pyramid.config import Configurator
+ from pyramid.view import render_view
+ from webob.compat import text_type
+ config = Configurator(settings={})
+ def view(request):
+ request.response.text = text_type('<body></body>')
+ return request.response
+
+ config.add_view(name='test', view=view)
+ config.commit()
+
+ r = Request({})
+ r.registry = config.registry
+ self.assertEqual(render_view(object(), r, 'test'), b'<body></body>')
def test_call_request_has_no_registry(self):
request = self._makeRequest()
@@ -261,7 +278,7 @@ class RenderViewTests(BaseTest, unittest.TestCase):
view = make_view(response)
self._registerView(request.registry, view, 'registered')
s = self._callFUT(context, request, name='registered', secure=True)
- self.assertEqual(s, '')
+ self.assertEqual(s, b'')
def test_call_view_registered_insecure_no_call_permissive(self):
context = self._makeContext()
@@ -270,7 +287,7 @@ class RenderViewTests(BaseTest, unittest.TestCase):
view = make_view(response)
self._registerView(request.registry, view, 'registered')
s = self._callFUT(context, request, name='registered', secure=False)
- self.assertEqual(s, '')
+ self.assertEqual(s, b'')
def test_call_view_registered_insecure_with_call_permissive(self):
context = self._makeContext()
@@ -278,11 +295,11 @@ class RenderViewTests(BaseTest, unittest.TestCase):
response = DummyResponse()
view = make_view(response)
def anotherview(context, request):
- return DummyResponse('anotherview')
+ return DummyResponse(b'anotherview')
view.__call_permissive__ = anotherview
self._registerView(request.registry, view, 'registered')
s = self._callFUT(context, request, name='registered', secure=False)
- self.assertEqual(s, 'anotherview')
+ self.assertEqual(s, b'anotherview')
class TestIsResponse(unittest.TestCase):
def setUp(self):
diff --git a/pyramid/view.py b/pyramid/view.py
index 835982e79..021d6ff79 100644
--- a/pyramid/view.py
+++ b/pyramid/view.py
@@ -3,6 +3,7 @@ import venusian
from zope.interface import providedBy
from zope.deprecation import deprecated
+
from pyramid.interfaces import (
IRoutesMapper,
IView,
@@ -116,7 +117,7 @@ def render_view(context, request, name='', secure=True):
configuration` that matches the :term:`view name` ``name``
registered against the specified ``context`` and ``request``
and unwind the view response's ``app_iter`` (see
- :ref:`the_response`) into a single string. This function will
+ :ref:`the_response`) into a single bytestring. This function will
return ``None`` if a corresponding :term:`view callable` cannot be
found (when no :term:`view configuration` matches the combination
of ``name`` / ``context`` / and ``request``). Additionally, this
@@ -136,7 +137,7 @@ def render_view(context, request, name='', secure=True):
iterable = render_view_to_iterable(context, request, name, secure)
if iterable is None:
return None
- return ''.join(iterable)
+ return b''.join(iterable)
class view_config(object):
""" A function, class or method :term:`decorator` which allows a