From 719a379e204104a8955b5691a6152e45d978d4ff Mon Sep 17 00:00:00 2001 From: dev Date: Tue, 6 Mar 2012 00:47:41 +0100 Subject: fixed issue #461 - config.add_view() raises an AttributeError for __text__ if the View is an instancemethod. added wrapper adding the __text__ attribute if it isnt present yet. --- pyramid/config/views.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/pyramid/config/views.py b/pyramid/config/views.py index 0f70c604f..7d0a5a971 100644 --- a/pyramid/config/views.py +++ b/pyramid/config/views.py @@ -139,7 +139,18 @@ class ViewDeriver(object): self.http_cached_view( self.decorated_view( self.rendered_view( - self.mapped_view(view))))))))) + self.mapped_view( + self.text_wrapped_view(view)))))))))) + @wraps_view + def text_wrapped_view(self, view): + # wraps the view and adds __text__ attribute + # intended for instancemethods + if hasattr(view, '__text__'): + return view + def text_wrapper(context, request): + return view(context, request) + text_wrapper.__text__ = '' + return text_wrapper @wraps_view def mapped_view(self, view): -- cgit v1.2.3 From df3bea9e129fdfe0d55fa3f69d64cbbed6a9eea7 Mon Sep 17 00:00:00 2001 From: hlv Date: Tue, 6 Mar 2012 11:52:36 +0100 Subject: corrected bugfix #461 - tests explicitly for instancemethods now testcase added --- pyramid/config/views.py | 16 ++++++++-------- pyramid/tests/test_config/test_views.py | 8 ++++++++ 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/pyramid/config/views.py b/pyramid/config/views.py index 7d0a5a971..f984e46f2 100644 --- a/pyramid/config/views.py +++ b/pyramid/config/views.py @@ -143,14 +143,14 @@ class ViewDeriver(object): self.text_wrapped_view(view)))))))))) @wraps_view def text_wrapped_view(self, view): - # wraps the view and adds __text__ attribute - # intended for instancemethods - if hasattr(view, '__text__'): - return view - def text_wrapper(context, request): - return view(context, request) - text_wrapper.__text__ = '' - return text_wrapper + if inspect.ismethod(view): + if hasattr(view, '__text__'): + return view + def text_wrapper(context, request): + return view(context, request) + text_wrapper.__text__ = '' + return text_wrapper + return view @wraps_view def mapped_view(self, view): diff --git a/pyramid/tests/test_config/test_views.py b/pyramid/tests/test_config/test_views.py index 7bfe174b7..13c00c2b6 100644 --- a/pyramid/tests/test_config/test_views.py +++ b/pyramid/tests/test_config/test_views.py @@ -218,6 +218,14 @@ class TestViewsConfigurationMixin(unittest.TestCase): result = wrapper(None, None) self.assertEqual(result, 'OK') + def test_add_view_as_instancemethod(self): + from pyramid.renderers import null_renderer + class View: + def index(self, context, request): pass + view = View() + config=self._makeOne(autocommit=True) + config.add_view(view=view.index, renderer=null_renderer) + def test_add_view_as_instance_requestonly(self): from pyramid.renderers import null_renderer class AView: -- cgit v1.2.3 From 4a6f532316421ef85caefc706e191d6977e71feb Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Sun, 11 Mar 2012 21:05:04 -0700 Subject: - ``config.add_view()`` raised AttributeError involving ``__text__``. See https://github.com/Pylons/pyramid/issues/461 Fixes #461. --- CHANGES.txt | 9 +++++++++ pyramid/config/views.py | 9 +++++---- pyramid/tests/test_config/test_views.py | 6 +++++- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 8076bc35d..abdb3d80a 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,3 +1,12 @@ +Next release +============ + +Bug Fixes +--------- + +- ``config.add_view()`` raised AttributeError involving + ``__text__``. See https://github.com/Pylons/pyramid/issues/461 + 1.3b2 (2012-03-02) ================== diff --git a/pyramid/config/views.py b/pyramid/config/views.py index f984e46f2..432db79cf 100644 --- a/pyramid/config/views.py +++ b/pyramid/config/views.py @@ -140,15 +140,16 @@ class ViewDeriver(object): self.decorated_view( self.rendered_view( self.mapped_view( - self.text_wrapped_view(view)))))))))) + self.text_wrapped_view( + view)))))))))) + @wraps_view def text_wrapped_view(self, view): + # if the method is an instance method, we need to wrap it in order + # to be able to assign a __text__ value to it later. see #461. if inspect.ismethod(view): - if hasattr(view, '__text__'): - return view def text_wrapper(context, request): return view(context, request) - text_wrapper.__text__ = '' return text_wrapper return view diff --git a/pyramid/tests/test_config/test_views.py b/pyramid/tests/test_config/test_views.py index 13c00c2b6..8877c011e 100644 --- a/pyramid/tests/test_config/test_views.py +++ b/pyramid/tests/test_config/test_views.py @@ -221,10 +221,14 @@ class TestViewsConfigurationMixin(unittest.TestCase): def test_add_view_as_instancemethod(self): from pyramid.renderers import null_renderer class View: - def index(self, context, request): pass + def index(self, context, request): + return 'OK' view = View() config=self._makeOne(autocommit=True) config.add_view(view=view.index, renderer=null_renderer) + wrapper = self._getViewCallable(config) + result = wrapper(None, None) + self.assertEqual(result, 'OK') def test_add_view_as_instance_requestonly(self): from pyramid.renderers import null_renderer -- cgit v1.2.3