summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Merickel <michael@merickel.org>2012-04-12 23:00:05 -0500
committerMichael Merickel <michael@merickel.org>2012-04-12 23:00:05 -0500
commit877a3503c1333c58bceaaf027ef04301fd1408dd (patch)
tree0790a6fdfd2ddfc1c860b439efb85fbb76c5983e
parentb940e4f6f064a4b96ba1119d2fd349b63bfb77a3 (diff)
downloadpyramid-877a3503c1333c58bceaaf027ef04301fd1408dd.tar.gz
pyramid-877a3503c1333c58bceaaf027ef04301fd1408dd.tar.bz2
pyramid-877a3503c1333c58bceaaf027ef04301fd1408dd.zip
set_request_method works with methods and moar coverage
-rw-r--r--pyramid/config/factories.py5
-rw-r--r--pyramid/tests/test_config/test_factories.py58
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