From 2029b2fe9c3f1ee0e15348a4e5ad8ae19cff8d39 Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Fri, 23 Sep 2011 04:42:46 -0400 Subject: only self-loathing makes me continue --- pyramid/compat.py | 4 ++++ pyramid/config/views.py | 7 +++++-- pyramid/tests/test_config/test_assets.py | 7 ++++--- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/pyramid/compat.py b/pyramid/compat.py index a03fc893d..64648911e 100644 --- a/pyramid/compat.py +++ b/pyramid/compat.py @@ -196,3 +196,7 @@ else: def is_nonstr_iter(v): return hasattr(v, '__iter__') +if PY3: # pragma: no cover + im_func = '__func__' +else: + im_func = 'im_func' diff --git a/pyramid/config/views.py b/pyramid/config/views.py index 51f13f69f..e186d2430 100644 --- a/pyramid/config/views.py +++ b/pyramid/config/views.py @@ -28,6 +28,7 @@ from pyramid.interfaces import PHASE1_CONFIG from pyramid import renderers from pyramid.compat import string_types from pyramid.compat import urlparse +from pyramid.compat import im_func from pyramid.exceptions import ConfigurationError from pyramid.exceptions import PredicateMismatch from pyramid.httpexceptions import HTTPForbidden @@ -417,6 +418,7 @@ class DefaultViewMapper(object): return _attr_view def requestonly(view, attr=None): + ismethod = False if attr is None: attr = '__call__' if inspect.isfunction(view): @@ -426,6 +428,7 @@ def requestonly(view, attr=None): fn = view.__init__ except AttributeError: return False + ismethod = hasattr(fn, '__call__') else: try: fn = getattr(view, attr) @@ -439,8 +442,8 @@ def requestonly(view, attr=None): args = argspec[0] - if hasattr(fn, 'im_func'): - # it's an instance method + if hasattr(fn, im_func) or ismethod: + # it's an instance method (or unbound method on py2) if not args: return False args = args[1:] diff --git a/pyramid/tests/test_config/test_assets.py b/pyramid/tests/test_config/test_assets.py index 73f0a12ad..876a921b4 100644 --- a/pyramid/tests/test_config/test_assets.py +++ b/pyramid/tests/test_config/test_assets.py @@ -273,12 +273,13 @@ class TestOverrideProvider(unittest.TestCase): self.assertEqual(result, 'value') def test_get_resource_stream_override_returns_value(self): - overrides = DummyOverrides('value') + from io import StringIO + overrides = DummyOverrides(StringIO('value')) import pyramid.tests.test_config self._registerOverrides(overrides) provider = self._makeOne(pyramid.tests.test_config) - with provider.get_resource_stream(None, 'test_assets.py') as result: - self.assertEqual(result, 'value') + with provider.get_resource_stream(None, 'test_assets.py') as stream: + self.assertEqual(stream.getvalue(), 'value') def test_get_resource_string_override_returns_value(self): overrides = DummyOverrides('value') -- cgit v1.2.3