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