def _gi_build_stub(parent):
    """
    Inspect the passed module recursively and build stubs for functions,
    classes, etc.
    """
    classes = {}
    functions = {}
    constants = {}
    methods = {}
    for name in dir(parent):
        if name.startswith("__"):
            continue

        # Check if this is a valid name in python
        if not re.match(_identifier_re, name):
            continue

        try:
            obj = getattr(parent, name)
        except:
            continue

        if inspect.isclass(obj):
            classes[name] = obj
        elif inspect.isfunction(obj) or inspect.isbuiltin(obj):
            functions[name] = obj
        elif inspect.ismethod(obj) or inspect.ismethoddescriptor(obj):
            methods[name] = obj
        elif (
            str(obj).startswith("<flags")
            or str(obj).startswith("<enum ")
            or str(obj).startswith("<GType ")
            or inspect.isdatadescriptor(obj)
        ):
            constants[name] = 0
        elif isinstance(obj, (int, str)):
            constants[name] = obj
        elif callable(obj):
            # Fall back to a function for anything callable
            functions[name] = obj
        else:
            # Assume everything else is some manner of constant
            constants[name] = 0

    ret = ""

    if constants:
        ret += "# %s constants\n\n" % parent.__name__
    for name in sorted(constants):
        if name[0].isdigit():
            # GDK has some busted constant names like
            # Gdk.EventType.2BUTTON_PRESS
            continue

        val = constants[name]

        strval = str(val)
        if isinstance(val, str):
            strval = '"%s"' % str(val).replace("\\", "\\\\")
        ret += "%s = %s\n" % (name, strval)

    if ret:
        ret += "\n\n"
    if functions:
        ret += "# %s functions\n\n" % parent.__name__
    for name in sorted(functions):
        ret += "def %s(*args, **kwargs):\n" % name
        ret += "    pass\n"

    if ret:
        ret += "\n\n"
    if methods:
        ret += "# %s methods\n\n" % parent.__name__
    for name in sorted(methods):
        ret += "def %s(self, *args, **kwargs):\n" % name
        ret += "    pass\n"

    if ret:
        ret += "\n\n"
    if classes:
        ret += "# %s classes\n\n" % parent.__name__
    for name, obj in sorted(classes.items()):
        base = "object"
        if issubclass(obj, Exception):
            base = "Exception"
        ret += "class %s(%s):\n" % (name, base)

        classret = _gi_build_stub(obj)
        if not classret:
            classret = "pass\n"

        for line in classret.splitlines():
            ret += "    " + line + "\n"
        ret += "\n"

    return ret
def _gi_build_stub ( parent ) : classes = { } functions = { } constants = { } methods = { } for name in dir ( parent ) : if name . startswith ( "__" ) : continue if not re . match ( _identifier_re , name ) : continue try : obj = getattr ( parent , name ) except : continue if inspect . isclass ( obj ) : classes [ name ] = obj elif inspect . isfunction ( obj ) or inspect . isbuiltin ( obj ) : functions [ name ] = obj elif inspect . ismethod ( obj ) or inspect . ismethoddescriptor ( obj ) : methods [ name ] = obj elif ( str ( obj ) . startswith ( "<flags" ) or str ( obj ) . startswith ( "<enum " ) or str ( obj ) . startswith ( "<GType " ) or inspect . isdatadescriptor ( obj ) ) : constants [ name ] = 0 elif isinstance ( obj , ( int , str ) ) : constants [ name ] = obj elif callable ( obj ) : functions [ name ] = obj else : constants [ name ] = 0 ret = "" if constants : ret += "# %s constants\n\n" % parent . __name__ for name in sorted ( constants ) : if name [ 0 ] . isdigit ( ) : continue val = constants [ name ] strval = str ( val ) if isinstance ( val , str ) : strval = '"%s"' % str ( val ) . replace ( "\\" , "\\\\" ) ret += "%s = %s\n" % ( name , strval ) if ret : ret += "\n\n" if functions : ret += "# %s functions\n\n" % parent . __name__ for name in sorted ( functions ) : ret += "def %s(*args, **kwargs):\n" % name ret += "    pass\n" if ret : ret += "\n\n" if methods : ret += "# %s methods\n\n" % parent . __name__ for name in sorted ( methods ) : ret += "def %s(self, *args, **kwargs):\n" % name ret += "    pass\n" if ret : ret += "\n\n" if classes : ret += "# %s classes\n\n" % parent . __name__ for name , obj in sorted ( classes . items ( ) ) : base = "object" if issubclass ( obj , Exception ) : base = "Exception" ret += "class %s(%s):\n" % ( name , base ) classret = _gi_build_stub ( obj ) if not classret : classret = "pass\n" for line in classret . splitlines ( ) : ret += "    " + line + "\n" ret += "\n" return ret
Inspect the passed module recursively and build stubs for functions,
    classes, etc.