Chris McDonough
2011-07-22 73c0aee5571bbdd7273033eda3a798d5597a76af
- Add a deprecation warning for non-API function
``pyramid.renderers.renderer_from_name`` which has seen use in the wild.

- Add a ``clone`` method to ``pyramid.renderers.RendererHelper`` for use by
the ``pyramid.view.view_config`` decorator.
5 files modified
63 ■■■■ changed files
CHANGES.txt 6 ●●●●● patch | view | raw | blame | history
pyramid/renderers.py 18 ●●●●● patch | view | raw | blame | history
pyramid/tests/test_renderers.py 23 ●●●●● patch | view | raw | blame | history
pyramid/tests/test_view.py 13 ●●●●● patch | view | raw | blame | history
pyramid/view.py 3 ●●●● patch | view | raw | blame | history
CHANGES.txt
@@ -7,6 +7,12 @@
- Remove ``compat`` code that served only the purpose of providing backwards
  compatibility with Python 2.4.
- Add a deprecation warning for non-API function
  ``pyramid.renderers.renderer_from_name`` which has seen use in the wild.
- Add a ``clone`` method to ``pyramid.renderers.RendererHelper`` for use by
  the ``pyramid.view.view_config`` decorator.
Documentation
-------------
pyramid/renderers.py
@@ -3,6 +3,7 @@
import threading
from zope.interface import implements
from zope.deprecation import deprecated
from pyramid.interfaces import IChameleonLookup
from pyramid.interfaces import IChameleonTranslate
@@ -335,9 +336,15 @@
            lock.release()
    return lookup(info)
# XXX deprecate
def renderer_from_name(path, package=None):
    return RendererHelper(name=path, package=package).renderer
deprecated(
    'renderer_from_name',
    'The "pyramid.renderers.renderer_from_name" function was never an API. '
    'However, its use has been observed "in the wild."  It will disappear in '
    'the next major release. To replace it, use the '
    '``pyramid.renderers.get_renderer`` API instead. ')
class RendererHelper(object):
    implements(IRendererInfo)
@@ -453,3 +460,12 @@
                response.cache_expires = cache_for
        return response
    def clone(self, name=None, package=None, registry=None):
        if name is None:
            name = self.name
        if package is None:
            package = self.package
        if registry is None:
            registry = self.registry
        return self.__class__(name=name, package=package, registry=registry)
pyramid/tests/test_renderers.py
@@ -341,11 +341,15 @@
class TestRendererFromName(unittest.TestCase):
    def setUp(self):
        from zope.deprecation import __show__
        __show__.off()
        self.config = cleanUp()
    def tearDown(self):
        cleanUp()
        from zope.deprecation import __show__
        __show__.on()
    def _callFUT(self, path, package=None):
        from pyramid.renderers import renderer_from_name
        return renderer_from_name(path, package)
@@ -687,6 +691,23 @@
        self.assertEqual(response.status, '406 You Lose')
        self.assertEqual(response.body, 'abc')
    def test_clone_noargs(self):
        helper = self._makeOne('name', 'package', 'registry')
        cloned_helper = helper.clone()
        self.assertEqual(cloned_helper.name, 'name')
        self.assertEqual(cloned_helper.package, 'package')
        self.assertEqual(cloned_helper.registry, 'registry')
        self.assertFalse(helper is cloned_helper)
    def test_clone_allargs(self):
        helper = self._makeOne('name', 'package', 'registry')
        cloned_helper = helper.clone(name='name2', package='package2',
                                     registry='registry2')
        self.assertEqual(cloned_helper.name, 'name2')
        self.assertEqual(cloned_helper.package, 'package2')
        self.assertEqual(cloned_helper.registry, 'registry2')
        self.assertFalse(helper is cloned_helper)
class Test_render(unittest.TestCase):
    def setUp(self):
        self.config = testing.setUp()
pyramid/tests/test_view.py
@@ -399,10 +399,17 @@
        # see https://github.com/Pylons/pyramid/pull/234
        from pyramid.interfaces import IRendererInfo
        import pyramid.tests
        outerself = self
        class DummyRendererHelper(object):
            implements(IRendererInfo)
            name = 'fixtures/minimal.pt'
            package = pyramid.tests
            def clone(self, name=None, package=None, registry=None):
                outerself.assertEqual(name, self.name)
                outerself.assertEqual(package, self.package)
                outerself.assertEqual(registry, context.config.registry)
                self.cloned = True
                return self
        renderer_helper = DummyRendererHelper()
        decorator = self._makeOne(renderer=renderer_helper)
        venusian = DummyVenusian()
@@ -414,10 +421,8 @@
        settings = call_venusian(venusian, context)
        self.assertEqual(len(settings), 1)
        renderer = settings[0]['renderer']
        self.assertFalse(renderer is renderer_helper)
        self.assertEqual(renderer.name, 'fixtures/minimal.pt')
        self.assertEqual(renderer.package, pyramid.tests)
        self.assertEqual(renderer.registry, context.config.registry)
        self.assertTrue(renderer is renderer_helper)
        self.assertTrue(renderer.cloned)
class Test_append_slash_notfound_view(BaseTest, unittest.TestCase):
    def _callFUT(self, context, request):
pyramid/view.py
@@ -1,6 +1,5 @@
import mimetypes
import venusian
import warnings
from zope.interface import providedBy
from zope.deprecation import deprecated
@@ -226,7 +225,7 @@
            elif IRendererInfo.providedBy(renderer):
                # create a new rendererinfo to clear out old registry on a
                # rescan, see https://github.com/Pylons/pyramid/pull/234
                renderer = RendererHelper(name=renderer.name,
                renderer = renderer.clone(name=renderer.name,
                                          package=info.module,
                                          registry=context.config.registry)
            settings['renderer'] = renderer