Source code for warg.modules
from pathlib import Path
import importlib
import logging
import pkgutil
from types import ModuleType
from typing import Any, Generator, Union
from warg import ensure_in_sys_path
_logger = logging.getLogger(__name__)
__all__ = ["iter_import_module", "get_submodules", "get_submodules_by_path"]
[docs]
def iter_import_module(module_name: str, *module_paths: Union[str, Path]) -> Generator[ModuleType, Any, None]:
_logger.info(f"Found {module_name} in {module_paths}")
# Ensure paths are strings for pkgutil
module_str_paths = [str(p) for p in module_paths]
yield from (
importlib.import_module(module_info.name)
for module_info in pkgutil.iter_modules(module_str_paths, prefix=f"{module_name}.")
)
[docs]
def get_submodules(module: ModuleType) -> Generator[ModuleType, Any, None]:
_logger.info(f"Found {module.__path__} {module.__name__}")
yield from iter_import_module(module.__name__, *module.__path__)
[docs]
def get_submodules_by_path(module_path: Path) -> Generator[ModuleType, Any, None]:
a = module_path.resolve(strict=True)
assert a.exists(), f"{a} does not exist"
ensure_in_sys_path(module_path.parent)
yield from iter_import_module(a.stem, a)
if __name__ == "__main__":
_logger.warning(list(get_submodules_by_path(Path(__file__).parent)))