import sys import collect import trace def pytest_addoption(parser): parser.addoption( "--apigen-modules", dest="apigenmodules", action="append") def pytest_configure(config): modulenames = config.option.apigenmodules print 'modulenames:', modulenames config._tracer = None if not modulenames: print 'WARNING: apigen enabled, but no modules provided!' return # see if we need to import anything modules = [] for mn in modulenames: mod = sys.modules.get(mn) if mod is None: mod = __import__(mn) modules.append(mod) config._apigen_modules = modules config._apigen_tracer = t = trace.Tracer([m.__file__ for m in modules]) t.start() def pytest_unconfigure(config): t = config._apigen_tracer if t is None: return t.stop() c = collect.Collector() raw = c.collect([m.__name__ for m in config._apigen_modules]) tree = c.get_tree(raw) for item in tree: print item.__class__.__name__, item.name if item.callable: ci = t.callable_infos.get((item.filename, item.lineno)) if ci: for cd in ci.calldata: print print 'stack:\n', '\n'.join( ['%03d %s' % (s[1], s[2]) for s in cd.stack])