From 1e5ece07e8a0ce3ffa48d35a6b2f1c2c186e2ba3 Mon Sep 17 00:00:00 2001 From: Samuele Pedroni Date: Tue, 12 May 2009 12:36:43 +0200 Subject: [PATCH] - implement a general getfslineno helper in code/source.py with tests - not exposed yey --HG-- branch : trunk --- py/code/source.py | 20 ++++++++++++++++++++ py/code/testing/test_source.py | 20 ++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/py/code/source.py b/py/code/source.py index 6923012fe..515464a05 100644 --- a/py/code/source.py +++ b/py/code/source.py @@ -217,6 +217,26 @@ def compile_(source, filename=None, mode='exec', flags= return co +def getfslineno(obj): + try: + code = py.code.Code(obj) + except TypeError: + # fallback to + fn = (py.std.inspect.getsourcefile(obj) or + py.std.inspect.getfile(obj)) + fspath = fn and py.path.local(fn) or None + if fspath: + try: + _, lineno = findsource(obj) + except IOError: + lineno = None + else: + lineno = None + else: + fspath = code.path + lineno = code.firstlineno + return fspath, lineno + # # helper functions # diff --git a/py/code/testing/test_source.py b/py/code/testing/test_source.py index 0c2045478..2ed6f1fc7 100644 --- a/py/code/testing/test_source.py +++ b/py/code/testing/test_source.py @@ -355,3 +355,23 @@ def test_findsource___source__(): assert 'if 1:' in str(src) assert src[lineno] == " def x():" + +def test_getfslineno(): + from py.__.code.source import getfslineno + + def f(x): + pass + + fspath, lineno = getfslineno(f) + + assert fspath == py.path.local(__file__) + assert lineno == f.func_code.co_firstlineno-1 # see findsource + + class A(object): + pass + + fspath, lineno = getfslineno(A) + + _, A_lineno = py.std.inspect.findsource(A) + assert fspath == py.path.local(__file__) + assert lineno == A_lineno