From 1f5816ad023f4acb40ec154d9a456216ad3a1ab9 Mon Sep 17 00:00:00 2001 From: Brant Knudson Date: Wed, 13 Apr 2016 15:51:52 -0500 Subject: [PATCH] Add tests for decorated argspec preservation Tests are added that show that several of the decorators, when used on functions, lose the argspec. This causes the documentation to be generated incorrectly since the args aren't shown for decorated functions. The tests show that some of the decorators work as expected. Change-Id: Id024f5110082a88c30e71e991764320b3aed07aa --- debtcollector/tests/test_deprecation.py | 57 ++++++++++++++++++++++--- 1 file changed, 52 insertions(+), 5 deletions(-) diff --git a/debtcollector/tests/test_deprecation.py b/debtcollector/tests/test_deprecation.py index 03871a0..3298aea 100644 --- a/debtcollector/tests/test_deprecation.py +++ b/debtcollector/tests/test_deprecation.py @@ -12,6 +12,7 @@ # License for the specific language governing permissions and limitations # under the License. +import inspect import warnings import debtcollector @@ -28,6 +29,10 @@ def blip_blop(blip=1, blop=1): return (blip, blop) +def blip_blop_unwrapped(blip=1, blop=1): + return (blip, blop) + + @renames.renamed_kwarg('blip', 'blop', category=PendingDeprecationWarning) def blip_blop_2(blip=1, blop=1): return (blip, blop) @@ -43,6 +48,10 @@ def blip_blop_blip(type='cat'): return "The %s meowed quietly" % type +def blip_blop_blip_unwrapped(type='cat'): + return "The %s meowed quietly" % type + + class WoofWoof(object): @property def bark(self): @@ -67,14 +76,14 @@ class WoofWoof(object): class KittyKat(object): @moves.moved_method('supermeow') - def meow(self): - return self.supermeow() + def meow(self, volume=11): + return self.supermeow(volume) @moves.moved_method('supermeow', category=PendingDeprecationWarning) - def maow(self): - return self.supermeow() + def maow(self, volume=11): + return self.supermeow(volume) - def supermeow(self): + def supermeow(self, volume=11): return 'supermeow' @@ -99,6 +108,10 @@ def crimson_lightning(fake_input=None): return fake_input +def crimson_lightning_unwrapped(fake_input=None): + return fake_input + + @removals.remove(category=PendingDeprecationWarning) def crimson_lightning_to_remove(fake_input=None): return fake_input @@ -343,6 +356,11 @@ class MovedMethodTest(test_base.TestCase): self.assertEqual('supermeow', c.supermeow()) self.assertEqual(0, len(capture)) + def test_keeps_argspec(self): + # FIXME(blk): This should be assertEqual! + self.assertNotEqual(inspect.getargspec(KittyKat.supermeow), + inspect.getargspec(KittyKat.meow)) + class RenamedKwargTest(test_base.TestCase): def test_basics(self): @@ -397,6 +415,13 @@ class RenamedKwargTest(test_base.TestCase): self.assertEqual(2, blip_blop_3(blop=2)) self.assertEqual(0, len(capture)) + def test_argspec(self): + # The decorated function keeps its argspec. + + # FIXME(bknudson): This isn't working right, should be assertEqual! + self.assertNotEqual(inspect.getargspec(blip_blop_unwrapped), + inspect.getargspec(blip_blop)) + class UpdatedArgsTest(test_base.TestCase): def test_basic(self): @@ -415,6 +440,11 @@ class UpdatedArgsTest(test_base.TestCase): blip_blop_blip(type='kitten')) self.assertEqual(0, len(capture)) + def test_argspec_preserved(self): + # FIXME(bknudson): This should be assertEqual! + self.assertNotEqual(inspect.getargspec(blip_blop_blip_unwrapped), + inspect.getargspec(blip_blop_blip)) + class RemovalTests(test_base.TestCase): def test_function_args(self): @@ -423,6 +453,12 @@ class RemovalTests(test_base.TestCase): def test_function_noargs(self): self.assertTrue(red_comet()) + def test_function_keeps_argspec(self): + # The decorated function keeps its argspec. + self.assertEqual( + inspect.getargspec(crimson_lightning_unwrapped), + inspect.getargspec(crimson_lightning)) + def test_deprecated_kwarg(self): @removals.removed_kwarg('b') @@ -441,6 +477,17 @@ class RemovalTests(test_base.TestCase): self.assertEqual(2, f()) self.assertEqual(0, len(capture)) + def test_removed_kwarg_keeps_argspec(self): + @removals.removed_kwarg('b') + def f(b=2): + return b + + def f_unwrapped(b=2): + return b + + self.assertEqual(inspect.getargspec(f_unwrapped), + inspect.getargspec(f)) + def test_pending_deprecated_kwarg(self): @removals.removed_kwarg('b', category=PendingDeprecationWarning)