Source code for arsenal.debug.edit

import os
import inspect


[docs]def find_filename(obj, verbose=False): """Return the full filename of an instance. """ if verbose: print('[find_filename] %r' % (obj,)) if not isinstance(obj, str): # Return the name of the Python source file in which an object was defined. # This will fail with a TypeError if the object is a built-in module, class, # or function. try: f = inspect.getsourcefile(obj) except TypeError as e: if verbose: print('[find_filename] inspect.getsourcefile raised TypeError:', e) return None if verbose: print('[find_filename] found filename', f) # don't visit *.pyc files f = os.path.splitext(f) if f[1] == ".pyc": f = (f[0], ".py") f = ''.join(f) if not os.path.isabs(f): f = os.path.join(os.getcwd(), f) if os.path.isfile(f): return f
[docs]def edit(obj, verbose=True): """ Set the synchronize with editor hook with a callable object. - obj: introspection is used to retrieve relevant source code for the object; strings are treated as a filenames. - line : the line number to scroll to. - column : the column number to scroll to. """ filename = find_filename(obj, verbose=verbose) if not filename: if verbose: print('[edit] no file found for %r' % (obj,)) return try: # Return a list of source lines and starting line number for an object. # The argument may be a module, class, method, function, traceback, frame, # or code object. The source code is returned as a list of the lines # corresponding to the object and the line number indicates where in the # original source file the first line of code was found. An IOError is raised # if the source code cannot be retrieved. _, line = inspect.getsourcelines(obj) except IOError: line = 0 emacs(filename, line=line)
[docs]def emacs(filename, line=0, column=0): # emacsclient -n +%d:%d "%s" 2>/dev/null os.system('visit +%d:%d "%s" 2>/dev/null' % (line, column, filename))
if __name__ == '__main__': # TODO: look at misc.find_object import sys X = {} if len(sys.argv) == 2: exec('import %s as THING' % sys.argv[1], X) elif len(sys.argv) == 3: grab = '.'.join(['THING'] + sys.argv[2].split('.')[1:]) exec("""from %s import %s as THING; THING=%s""" % (sys.argv[1], sys.argv[2].split('.')[0], grab), X) else: print('%s <module> or %s <module> <object>' % (sys.argv[0], sys.argv[0])) sys.exit(1) edit(X['THING'])