From 30f6799ddfe7980ae9c78a697f53fd3f095bdb07 Mon Sep 17 00:00:00 2001 From: Jan Lindemann Date: Fri, 5 Jun 2026 07:22:54 +0200 Subject: [PATCH] lib.init.detect_modules(): Renovate signature - Remove package_name and package_path from the prototype of detect_modules(). They can and should be deduced from namespace['__name__'] and namespace['__path__'], respectively. - Make prefix default to None, which signifies "Don't filter by prefix". - Add an optional extend_namespace parameter, which will make the function append the module's __name__ to its __path__. This defaults to True, thereby adding a side effect to the function. Which is always wanted in the case for all callers of this function. Signed-off-by: Jan Lindemann --- src/python/jw/pkg/cmds/__init__.py | 2 -- src/python/jw/pkg/cmds/pkg/__init__.py | 2 -- src/python/jw/pkg/cmds/platform/__init__.py | 2 -- src/python/jw/pkg/cmds/projects/__init__.py | 2 -- .../jw/pkg/cmds/projects/check/__init__.py | 2 -- src/python/jw/pkg/lib/init.py | 28 +++++++++++++------ 6 files changed, 20 insertions(+), 18 deletions(-) diff --git a/src/python/jw/pkg/cmds/__init__.py b/src/python/jw/pkg/cmds/__init__.py index d4f3a76e..95ef74f8 100644 --- a/src/python/jw/pkg/cmds/__init__.py +++ b/src/python/jw/pkg/cmds/__init__.py @@ -1,8 +1,6 @@ from ..lib.init import detect_modules __all__ = detect_modules( - package_name = __name__, - package_path = __path__, namespace = globals(), prefix = 'Cmd', skip = {'Cmd'}, diff --git a/src/python/jw/pkg/cmds/pkg/__init__.py b/src/python/jw/pkg/cmds/pkg/__init__.py index b1f52bd0..6d94ae0d 100644 --- a/src/python/jw/pkg/cmds/pkg/__init__.py +++ b/src/python/jw/pkg/cmds/pkg/__init__.py @@ -1,8 +1,6 @@ from ...lib.init import detect_modules __all__ = detect_modules( - package_name = __name__, - package_path = __path__, namespace = globals(), prefix = 'Cmd', skip = {'Cmd'}, diff --git a/src/python/jw/pkg/cmds/platform/__init__.py b/src/python/jw/pkg/cmds/platform/__init__.py index b1f52bd0..6d94ae0d 100644 --- a/src/python/jw/pkg/cmds/platform/__init__.py +++ b/src/python/jw/pkg/cmds/platform/__init__.py @@ -1,8 +1,6 @@ from ...lib.init import detect_modules __all__ = detect_modules( - package_name = __name__, - package_path = __path__, namespace = globals(), prefix = 'Cmd', skip = {'Cmd'}, diff --git a/src/python/jw/pkg/cmds/projects/__init__.py b/src/python/jw/pkg/cmds/projects/__init__.py index b1f52bd0..6d94ae0d 100644 --- a/src/python/jw/pkg/cmds/projects/__init__.py +++ b/src/python/jw/pkg/cmds/projects/__init__.py @@ -1,8 +1,6 @@ from ...lib.init import detect_modules __all__ = detect_modules( - package_name = __name__, - package_path = __path__, namespace = globals(), prefix = 'Cmd', skip = {'Cmd'}, diff --git a/src/python/jw/pkg/cmds/projects/check/__init__.py b/src/python/jw/pkg/cmds/projects/check/__init__.py index 1e695f4e..64c733e7 100644 --- a/src/python/jw/pkg/cmds/projects/check/__init__.py +++ b/src/python/jw/pkg/cmds/projects/check/__init__.py @@ -1,8 +1,6 @@ from ....lib.init import detect_modules __all__ = detect_modules( - package_name = __name__, - package_path = __path__, namespace = globals(), prefix = 'Cmd', skip = {'Cmd'}, diff --git a/src/python/jw/pkg/lib/init.py b/src/python/jw/pkg/lib/init.py index 74e14449..4d8f2d5a 100644 --- a/src/python/jw/pkg/lib/init.py +++ b/src/python/jw/pkg/lib/init.py @@ -1,33 +1,45 @@ from __future__ import annotations +import pkgutil +from importlib import import_module from typing import TYPE_CHECKING if TYPE_CHECKING: from collections.abc import MutableMapping - from typing import Any, Iterable + from typing import Any def detect_modules( - package_name: str, - package_path: Iterable[str], namespace: MutableMapping[str, Any], - prefix: str, + prefix: str | None = None, skip: set[str] | None = None, + *, + extend_namespace: bool = True, ) -> list[str]: - import importlib - import pkgutil + package_name = namespace.get("__name__") + package_path = namespace.get("__path__") + + if not isinstance(package_name, str): + raise TypeError("namespace must contain string __name__") + + if package_path is None: + raise TypeError("namespace must be a package namespace with __path__") + + if extend_namespace: + package_path = pkgutil.extend_path(package_path, package_name) + namespace["__path__"] = package_path ret: list[str] = [] skip = skip or set() for _finder, module_name, _ispkg in pkgutil.iter_modules(package_path): - if not module_name.startswith(prefix): + if prefix is not None and not module_name.startswith(prefix): continue if module_name in skip: continue - module = importlib.import_module(f'.{module_name}', package_name) + module = import_module(f".{module_name}", package_name) cls = getattr(module, module_name) namespace[module_name] = cls -- 2.54.0