diff --git a/tools/exekall/exekall/_utils.py b/tools/exekall/exekall/_utils.py index a805f087ed514d113451b76d2a148f228eca672f..dc71bc93e92748f12653320dff6dd346773c0c4f 100644 --- a/tools/exekall/exekall/_utils.py +++ b/tools/exekall/exekall/_utils.py @@ -1043,16 +1043,6 @@ def get_recursive_module_set(module_set, package_set, visited_module_set=None): """ visited_modules = set(visited_module_set) if visited_module_set else set() - def select_module(module): - # We only recurse into modules that are part of the given set - # of packages - return any( - # Either a submodule of one of the packages or one of the - # packages themselves - get_package(module) == package - for package in package_set - ) - def _get_recursive_module_set(modules, module_set, package_set): for module in modules: if not isinstance(module, types.ModuleType): @@ -1063,7 +1053,9 @@ def get_recursive_module_set(module_set, package_set, visited_module_set=None): else: visited_modules.add(module) - if select_module(module): + # We only recurse into modules that are part of the given set + # of packages + if get_package(module) in package_set: module_set.add(module) _get_recursive_module_set(vars(module).values(), module_set, package_set) diff --git a/tools/exekall/exekall/utils.py b/tools/exekall/exekall/utils.py index efd940d5b32363c02a7654f20305070ceb6abde1..655bbe7948e92f2e6c385c57eb03bf4915f35e4e 100644 --- a/tools/exekall/exekall/utils.py +++ b/tools/exekall/exekall/utils.py @@ -34,6 +34,8 @@ def get_callable_set(module_set, verbose=False): """ Get the set of callables defined in all modules of ``module_set``. + We ignore any callable that is defined outside of the modules' package. + :param module_set: Set of modules to scan. :type module_set: set(types.ModuleType) """ @@ -52,6 +54,7 @@ def get_callable_set(module_set, verbose=False): callable_set_ = _get_callable_set( module, visited_obj_set, + package_set=package_set, verbose=verbose, ) @@ -97,7 +100,7 @@ def _get_members(*args, **kwargs): warnings.simplefilter(action='ignore') return inspect.getmembers(*args, **kwargs) -def _get_callable_set(namespace, visited_obj_set, verbose): +def _get_callable_set(namespace, visited_obj_set, package_set, verbose): """ :param namespace: Module or class """ @@ -116,19 +119,26 @@ def _get_callable_set(namespace, visited_obj_set, verbose): predicate=callable ) ] + if isinstance(namespace, type): attributes.append(namespace) + def select(attr): + module = inspect.getmodule(attr) + return ( + # Module of builtins is None + module is None or + # skip internal classes that may end up being exposed as a global + module is not engine and + get_package(module) in package_set + ) + + visited_obj_set.update(attributes) attributes = [ attr for attr in attributes - if ( - id(attr) not in visited_obj_set and - # skip internal classes that may end up being exposed as a global - inspect.getmodule(attr) is not engine - ) + if id(attr) not in visited_obj_set and select(attr) ] - visited_obj_set.update(attributes) for callable_ in attributes: # Explore the class attributes as well for nested types @@ -148,7 +158,7 @@ def _get_callable_set(namespace, visited_obj_set, verbose): ) ): callable_pool.update( - _get_callable_set(callable_, visited_obj_set, verbose) + _get_callable_set(callable_, visited_obj_set, package_set, verbose) ) # Functions defined in a class are methods, and have to be wrapped so