From 877a3503c1333c58bceaaf027ef04301fd1408dd Mon Sep 17 00:00:00 2001 From: Michael Merickel Date: Thu, 12 Apr 2012 23:00:05 -0500 Subject: set_request_method works with methods and moar coverage --- pyramid/config/factories.py | 5 ++- pyramid/tests/test_config/test_factories.py | 58 ++++++++++++++++++++++++++++- 2 files changed, 61 insertions(+), 2 deletions(-) diff --git a/pyramid/config/factories.py b/pyramid/config/factories.py index 6f069b3d9..1583aa4b8 100644 --- a/pyramid/config/factories.py +++ b/pyramid/config/factories.py @@ -1,3 +1,5 @@ +import types + from zope.interface import implementer from pyramid.compat import iteritems_ @@ -202,6 +204,7 @@ class _RequestExtensions(object): def _set_request_extensions(event): request = event.request exts = request.registry.queryUtility(IRequestExtensions) - for name, method in iteritems_(exts.methods): + for name, fn in iteritems_(exts.methods): + method = types.MethodType(fn, request, request.__class__) setattr(request, name, method) request._set_properties(exts.descriptors) diff --git a/pyramid/tests/test_config/test_factories.py b/pyramid/tests/test_config/test_factories.py index 596f9796d..a95326772 100644 --- a/pyramid/tests/test_config/test_factories.py +++ b/pyramid/tests/test_config/test_factories.py @@ -129,8 +129,64 @@ class TestFactoriesMixin(unittest.TestCase): self.assertTrue('foo' in exts[0]) self.assertTrue('bar' in exts[1]) + def test_set_request_method_subscriber(self): + from zope.interface import implementer + from pyramid.interfaces import INewRequest + config = self._makeOne(autocommit=True) + def foo(r): return 'bar' + config.set_request_method(foo, name='foo') + @implementer(INewRequest) + class Event(object): + request = DummyRequest(config.registry) + event = Event() + config.registry.notify(event) + self.assertEqual('bar', event.request.foo()) + + def test_set_request_method_with_callable(self): + from pyramid.interfaces import IRequestExtensions + config = self._makeOne(autocommit=True) + callable = lambda x: None + config.set_request_method(callable, name='foo') + exts = config.registry.getUtility(IRequestExtensions) + self.assertTrue('foo' in exts.methods) + + def test_set_request_method_with_unnamed_callable(self): + from pyramid.interfaces import IRequestExtensions + config = self._makeOne(autocommit=True) + def foo(self): pass + config.set_request_method(foo) + exts = config.registry.getUtility(IRequestExtensions) + self.assertTrue('foo' in exts.methods) + + def test_set_multiple_request_methods_conflict(self): + from pyramid.exceptions import ConfigurationConflictError + config = self._makeOne() + def foo(self): pass + def bar(self): pass + config.set_request_method(foo, name='bar') + config.set_request_method(bar, name='bar') + self.assertRaises(ConfigurationConflictError, config.commit) + + def test_set_request_method_with_None_callable(self): + from pyramid.interfaces import IRequestExtensions + config = self._makeOne(autocommit=True) + config.set_request_method(name='foo') + exts = config.registry.queryUtility(IRequestExtensions) + self.assertTrue(exts is None) + + def test_set_request_method_with_None_callable_conflict(self): + from pyramid.exceptions import ConfigurationConflictError + config = self._makeOne() + def bar(self): pass + config.set_request_method(name='foo') + config.set_request_method(bar, name='foo') + self.assertRaises(ConfigurationConflictError, config.commit) + + def test_set_request_method_with_None_callable_and_no_name(self): + config = self._makeOne(autocommit=True) + self.assertRaises(AttributeError, config.set_request_method) + - class DummyRequest(object): extensions = None -- cgit v1.2.3