]> granicus.if.org Git - python/commitdiff
Patch #1006219: let inspect.getsource show '@' decorators and add tests for
authorJohannes Gijsbers <jlg@dds.nl>
Wed, 18 Aug 2004 12:40:31 +0000 (12:40 +0000)
committerJohannes Gijsbers <jlg@dds.nl>
Wed, 18 Aug 2004 12:40:31 +0000 (12:40 +0000)
this (which are rather ugly, but it'll have to do until test_inspect gets a
major overhaul and a conversion to unittest). Thanks Simon Percivall!

Lib/inspect.py
Lib/test/test_inspect.py
Misc/NEWS

index 42eda7725c68dab55ea2f0c732905a5c593d4505..3c47cd9b4484ce668cb2850186123e55d32236f9 100644 (file)
@@ -433,7 +433,7 @@ def findsource(object):
         if not hasattr(object, 'co_firstlineno'):
             raise IOError('could not find function definition')
         lnum = object.co_firstlineno - 1
-        pat = re.compile(r'^(\s*def\s)|(.*\slambda(:|\s))')
+        pat = re.compile(r'^(\s*def\s)|(.*\slambda(:|\s))|^(\s*@)')
         while lnum > 0:
             if pat.match(lines[lnum]): break
             lnum = lnum - 1
@@ -509,7 +509,8 @@ class BlockFinder:
 
     def tokeneater(self, type, token, (srow, scol), (erow, ecol), line):
         if not self.started:
-            if type == tokenize.NAME: self.started = 1
+            if '@' in line: pass
+            elif type == tokenize.NAME: self.started = 1
         elif type == tokenize.NEWLINE:
             self.last = srow
         elif type == tokenize.INDENT:
index 2f79fc3f1be5696b0bc0ebcf7e723cedff327a64..e3bf73a85c20b9c90a609c87d38308b879a6f4fd 100644 (file)
@@ -202,6 +202,47 @@ for fname in files_to_clean_up:
     except:
         pass
 
+# Test for decorators as well.
+
+source = r"""
+def wrap(foo=None):
+  def wrapper(func):
+    return func
+  return wrapper
+
+def replace(func):
+  def insteadfunc():
+    print 'hello'
+  return insteadfunc
+
+# two decorators, one with argument
+@wrap()
+@wrap(wrap)
+def wrapped():
+  pass
+
+@replace
+def gone():
+  pass"""
+
+file = open(TESTFN + "2", "w")
+file.write(source)
+file.close()
+files_to_clean_up = [TESTFN + "2", TESTFN + '2c', TESTFN + '2o']
+
+mod2 = imp.load_source("testmod3", TESTFN + "2")
+
+test(inspect.getsource(mod2.wrapped) == sourcerange(13, 16),
+     "inspect.getsource(mod.wrapped)")
+test(inspect.getsource(mod2.gone) == sourcerange(8, 9),
+     "inspect.getsource(mod.gone)")
+
+for fname in files_to_clean_up:
+    try:
+        os.unlink(fname)
+    except:
+        pass
+
 # Test classic-class method resolution order.
 class A:    pass
 class B(A): pass
index f5b2034750553c04104ecedafc9f077d2bc8847c..95d9f8db12fab5bcbb7b1ff5992f0f5c1e5a5869 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -44,6 +44,9 @@ Extension modules
 Library
 -------
 
+- Patch #1006219: let inspect.getsource handle '@' decorators. Thanks Simon
+  Percivall.
+
 - logging.handlers.SMTPHandler.date_time has been removed;
   the class now uses email.Utils.formatdate to generate the time stamp.