def _parse_class(symbol, with_docstrings): docstring = {} attr = {} func = {} name = symbol.name + '(' name += ', '.join([ analyzer.expand_attribute(base) for base in symbol.bases]) name += ')' for sym in symbol.body: if sym.__class__ is ast.Assign: result = _parse_assign(sym) attr.update(result[0]) attr.update(result[1]) elif sym.__class__ is ast.FunctionDef: result = _parse_function(sym, with_docstrings) attr.update(result['attrs']) if with_docstrings: func[result['name']] = result['lineno'] docstring[result['lineno']] = result['docstring'] else: func[result['name']] = result['lineno'] if with_docstrings: docstring[symbol.lineno] = ast.get_docstring(symbol, clean=True) lineno = symbol.lineno for decorator in symbol.decorator_list: lineno += 1 return {'name': name, 'attributes': attr, 'functions': func, 'lineno': lineno, 'docstring': docstring}
def _parse_function(symbol, with_docstrings): docstring = '' attrs = {} func_name = symbol.name + '(' #We store the arguments to compare with default backwards defaults = [] for value in symbol.args.defaults: #TODO: In some cases we can have something like: a=os.path defaults.append(value) arguments = [] for arg in reversed(symbol.args.args): if arg.__class__ is not _ast.Name or arg.id == 'self': continue argument = arg.id if defaults: value = defaults.pop() arg_default = _map_type.get(value.__class__, None) if arg_default is None: if value.__class__ is _ast.Attribute: arg_default = analyzer.expand_attribute(value) elif value.__class__ is _ast.Name: arg_default = value.id else: arg_default = 'object' argument += '=' + arg_default arguments.append(argument) func_name += ', '.join(reversed(arguments)) if symbol.args.vararg is not None: if not func_name.endswith('('): func_name += ', ' func_name += '*' + symbol.args.vararg if symbol.args.kwarg is not None: if not func_name.endswith('('): func_name += ', ' func_name += '**' + symbol.args.kwarg func_name += ')' for sym in symbol.body: if sym.__class__ is ast.Assign: result = _parse_assign(sym) attrs.update(result[1]) if with_docstrings: docstring = ast.get_docstring(symbol, clean=True) lineno = symbol.lineno for decorator in symbol.decorator_list: lineno += 1 return {'name': func_name, 'lineno': lineno, 'attrs': attrs, 'docstring': docstring}