#!/usr/bin/env python import py import inspect import types def report_strange_docstring(name, obj): if obj.__doc__ is None: print "%s misses a docstring" % (name, ) elif obj.__doc__ == "": print "%s has an empty" % (name, ) elif "XXX" in obj.__doc__: print "%s has an 'XXX' in its docstring" % (name, ) def find_code(method): return getattr(getattr(method, "im_func", None), "func_code", None) def report_different_parameter_names(name, cls): bases = cls.__mro__ for base in bases: for attr in dir(base): meth1 = getattr(base, attr) code1 = find_code(meth1) if code1 is None: continue if not callable(meth1): continue if not hasattr(cls, attr): continue meth2 = getattr(cls, attr) code2 = find_code(meth2) if not callable(meth2): continue if code2 is None: continue args1 = inspect.getargs(code1)[0] args2 = inspect.getargs(code2)[0] for a1, a2 in zip(args1, args2): if a1 != a2: print "%s.%s have different argument names %s, %s than the version in %s" % (name, attr, a1, a2, base) def find_all_exported(): stack = [(name, getattr(py, name)) for name in dir(py)[::-1] if not name.startswith("_") and name != "compat"] seen = {} exported = [] while stack: name, obj = stack.pop() if id(obj) in seen: continue else: seen[id(obj)] = True exported.append((name, obj)) if isinstance(obj, type) or isinstance(obj, type(py)): stack.extend([("%s.%s" % (name, s), getattr(obj, s)) for s in dir(obj) if len(s) <= 1 or not (s[0] == '_' and s[1] != '_')]) return exported if __name__ == '__main__': all_exported = find_all_exported() print "strange docstrings" print "==================" print for name, obj in all_exported: if callable(obj): report_strange_docstring(name, obj) print "\n\ndifferent parameters" print "====================" print for name, obj in all_exported: if isinstance(obj, type): report_different_parameter_names(name, obj)