示例#1
0
def get_module_members(module):
    """returns an iterable which gives the names of the module which should be exposed"""
    module_all = safe_getattr(module, "__all__", None)
    if module_all:
        return frozenset(module_all)

    return BuiltinScraper.safe_dir(module)
示例#2
0
def get_module_members(module):
    """returns an iterable which gives the names of the module which should be exposed"""
    module_all = safe_getattr(module, '__all__', None)
    if module_all:
        return frozenset(module_all)

    return BuiltinScraper.safe_dir(module)
示例#3
0
def generate_member_table(obj, is_hidden=False, from_type=False, extra_types=None):
    """Generates a table of members of `obj`.

    `is_hidden` determines whether all the members are hidden from IntelliSense.

    `from_type` determines whether method descriptors are retained (True) or
    ignored (False).

    `extra_types` is a sequence of ``(type_name, object)`` pairs to add as types
    to this table. These types are always hidden.
    """

    sentinel = object()
    members = []
    for name in BuiltinScraper.safe_dir(obj):
        member = safe_getattr(obj, name, sentinel)
        if member is not sentinel:
            members.append((name, member))

    dependencies = {}
    table = {}
    if extra_types:
        for name, member in extra_types:
            member_kind, member_value = generate_member(member, is_hidden=True, from_type=from_type)
            if member_kind == "typeref":
                actual_name = type_to_typeref(member)
                if actual_name not in dependencies:
                    dependencies[actual_name] = member
            table[name] = {"kind": member_kind, "value": member_value}

    for name, member in members:
        member_kind, member_value = generate_member(member, is_hidden, from_type)
        if member_kind == "typeref":
            actual_name = type_to_typeref(member)
            if actual_name not in dependencies:
                dependencies[actual_name] = member
        table[name] = {"kind": member_kind, "value": member_value}

    if dependencies:
        obj_mod, obj_name = type_to_typeref(obj)

        def needs_type_info(other_mod, other_name):
            if obj_mod != other_mod:
                if other_mod == builtin_name:
                    # Never embed builtins (unless obj_mod is builtins, in
                    # which case the first comparison failed)
                    return False

                # Always embed external types
                return True

            # We know obj_mod == other_mod at this point

            if not obj_name:
                # Writing ourselves in the expected place
                return True
            elif obj_name.startswith(other_name + "."):
                # Always write references to outer types
                return False
            elif other_name and other_name.startswith(obj_name + "."):
                # Always write type info for inner types
                return True

            # Otherwise, use a typeref
            return False

        for (dep_mod, dep_name), dep_obj in dependencies.items():
            if needs_type_info(dep_mod, dep_name):
                table[dep_name] = {"kind": "type", "value": generate_type(dep_obj, is_hidden=dep_name not in table)}

    return table
示例#4
0
def generate_member_table(obj,
                          is_hidden=False,
                          from_type=False,
                          extra_types=None):
    '''Generates a table of members of `obj`.

    `is_hidden` determines whether all the members are hidden from IntelliSense.

    `from_type` determines whether method descriptors are retained (True) or
    ignored (False).

    `extra_types` is a sequence of ``(type_name, object)`` pairs to add as types
    to this table. These types are always hidden.
    '''

    sentinel = object()
    members = []
    for name in BuiltinScraper.safe_dir(obj):
        member = safe_getattr(obj, name, sentinel)
        if member is not sentinel:
            members.append((name, member))

    dependencies = {}
    table = {}
    if extra_types:
        for name, member in extra_types:
            member_kind, member_value = generate_member(member,
                                                        is_hidden=True,
                                                        from_type=from_type)
            if member_kind == 'typeref':
                actual_name = type_to_typeref(member)
                if actual_name not in dependencies:
                    dependencies[actual_name] = member
            table[name] = {'kind': member_kind, 'value': member_value}

    for name, member in members:
        member_kind, member_value = generate_member(member, is_hidden,
                                                    from_type)
        if member_kind == 'typeref':
            actual_name = type_to_typeref(member)
            if actual_name not in dependencies:
                dependencies[actual_name] = member
        table[name] = {'kind': member_kind, 'value': member_value}

    if dependencies:
        obj_mod, obj_name = type_to_typeref(obj)

        def needs_type_info(other_mod, other_name):
            if obj_mod != other_mod:
                if other_mod == builtin_name:
                    # Never embed builtins (unless obj_mod is builtins, in
                    # which case the first comparison failed)
                    return False

                # Always embed external types
                return True

            # We know obj_mod == other_mod at this point

            if not obj_name:
                # Writing ourselves in the expected place
                return True
            elif obj_name.startswith(other_name + '.'):
                # Always write references to outer types
                return False
            elif other_name and other_name.startswith(obj_name + '.'):
                # Always write type info for inner types
                return True

            # Otherwise, use a typeref
            return False

        for (dep_mod, dep_name), dep_obj in list(dependencies.items()):
            if needs_type_info(dep_mod, dep_name):
                table[dep_name] = {
                    'kind':
                    'type',
                    'value':
                    generate_type(dep_obj, is_hidden=dep_name not in table),
                }

    return table