From 0d8ff5b39aefaf2a9b3fdd79894d855e59ed9a2e Mon Sep 17 00:00:00 2001 From: Wayne Witzel III Date: Fri, 3 Aug 2012 12:07:10 -0700 Subject: [PATCH 1/2] Tests for fixing issue #621 --- pyramid/tests/test_config/__init__.py | 8 ++++++ pyramid/tests/test_config/test_init.py | 26 +++++++++++++++++++ ...est_init.py:TestConfigurator_add_directive | 0 3 files changed, 34 insertions(+) create mode 100644 pyramid/tests/test_config/test_init.py:TestConfigurator_add_directive diff --git a/pyramid/tests/test_config/__init__.py b/pyramid/tests/test_config/__init__.py index 5b40a8c094..81d9f4965c 100644 --- a/pyramid/tests/test_config/__init__.py +++ b/pyramid/tests/test_config/__init__.py @@ -43,3 +43,11 @@ def dummy_extend(config, discrim): def dummy_extend2(config, discrim): config.action(discrim, None, config.registry) +from functools import partial +dummy_partial = partial(dummy_extend, discrim='partial') + +class DummyCallable(object): + def __call__(self, config, discrim): + config.action(discrim, None, config.package) +dummy_callable = DummyCallable() + diff --git a/pyramid/tests/test_config/test_init.py b/pyramid/tests/test_config/test_init.py index 37c3de275c..7a483355c3 100644 --- a/pyramid/tests/test_config/test_init.py +++ b/pyramid/tests/test_config/test_init.py @@ -1414,6 +1414,32 @@ def test_extend_with_dotted_name(self): self.assertEqual(action['callable'], None) self.assertEqual(action['args'], test_config) + def test_add_directive_with_partial(self): + from pyramid.tests import test_config + config = self.config + config.add_directive( + 'dummy_partial', 'pyramid.tests.test_config.dummy_partial') + self.assertTrue(hasattr(config, 'dummy_partial')) + config.dummy_partial() + after = config.action_state + action = after.actions[-1] + self.assertEqual(action['discriminator'], 'partial') + self.assertEqual(action['callable'], None) + self.assertEqual(action['args'], test_config) + + def test_add_directive_with_custom_callable(self): + from pyramid.tests import test_config + config = self.config + config.add_directive( + 'dummy_callable', 'pyramid.tests.test_config.dummy_callable') + self.assertTrue(hasattr(config, 'dummy_callable')) + config.dummy_callable('discrim') + after = config.action_state + action = after.actions[-1] + self.assertEqual(action['discriminator'], 'discrim') + self.assertEqual(action['callable'], None) + self.assertEqual(action['args'], test_config) + def test_extend_with_python_callable(self): from pyramid.tests import test_config config = self.config diff --git a/pyramid/tests/test_config/test_init.py:TestConfigurator_add_directive b/pyramid/tests/test_config/test_init.py:TestConfigurator_add_directive new file mode 100644 index 0000000000..e69de29bb2 From 0f0629faebdd1683bce1b69a5d7b099afc794a75 Mon Sep 17 00:00:00 2001 From: Wayne Witzel III Date: Fri, 3 Aug 2012 12:07:24 -0700 Subject: [PATCH 2/2] Fix for issue #621 --- pyramid/config/util.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/pyramid/config/util.py b/pyramid/config/util.py index 4e4c93be32..ade02e87fb 100644 --- a/pyramid/config/util.py +++ b/pyramid/config/util.py @@ -1,6 +1,8 @@ import re import traceback +from functools import update_wrapper + from zope.interface import implementer from pyramid.interfaces import IActionInfo @@ -59,9 +61,10 @@ def wrapper(self, *arg, **kw): finally: self._ainfo.pop() return result - wrapper.__name__ = wrapped.__name__ - wrapper.__doc__ = wrapped.__doc__ - wrapper.__docobj__ = wrapped # for sphinx + + if hasattr(wrapped, '__name__'): + update_wrapper(wrapper, wrapped) + wrapper.__docobj__ = wrapped return wrapper def make_predicates(xhr=None, request_method=None, path_info=None,