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)
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)
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
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