init.detect_modules(): Add base_types filter #80

Merged
Jan Lindemann merged 1 commit from jan/feature/20260824-init-detect-modules-add-base-types-filter into master 2026-08-24 14:32:12 +02:00 AGit
Showing only changes of commit 0407215530 - Show all commits

init.detect_modules(): Add base_types filter
All checks were successful
CI / Packaging - Kali Linux (pull_request) Successful in 4m10s
CI / Packaging - OpenSUSE Tumbleweed (pull_request) Successful in 4m29s
CI / Packaging test (pull_request) Successful in 0s
CI / Packaging - Kali Linux (push) Successful in 4m5s
CI / Packaging - OpenSUSE Tumbleweed (push) Successful in 4m3s
CI / Packaging test (push) Successful in 0s

Add a parameter "base_types" to detect_modules(), defaulting to None. If
it is not None, a module is only exported if its same-named object
inherits from one of the given types. Modules without a same-named class
are skipped instead of raising AttributeError, which covers helper
modules.

The return annotation becomes Sequence[str] instead of list[str] to
remove mutability for easier type checking.

Assisted-by: unsloth/Qwen3.8-27B-GGUF:Q4_K_M with pi.dev v0.84.2
Signed-off-by: Jan Lindemann <jan@janware.com>
Jan Lindemann 2026-08-23 14:06:01 +02:00
Signed by: Jan Lindemann
GPG key ID: 3750640C9E25DD61

View file

@ -6,16 +6,17 @@ from importlib import import_module
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
if TYPE_CHECKING: if TYPE_CHECKING:
from collections.abc import MutableMapping from collections.abc import Iterable, MutableMapping
from typing import Any from typing import Any, Sequence
def detect_modules( def detect_modules(
namespace: MutableMapping[str, Any], namespace: MutableMapping[str, Any],
prefix: str | None = None, prefix: str | None = None,
skip: set[str] | None = None, skip: set[str] | None = None,
*, *,
base_types: Iterable[type[Any]] | None = None,
extend_namespace: bool = True, extend_namespace: bool = True,
) -> list[str]: ) -> Sequence[str]:
package_name = namespace.get("__name__") package_name = namespace.get("__name__")
package_path = namespace.get("__path__") package_path = namespace.get("__path__")
@ -41,7 +42,11 @@ def detect_modules(
continue continue
module = import_module(f".{module_name}", package_name) module = import_module(f".{module_name}", package_name)
cls = getattr(module, module_name) cls = getattr(module, module_name, None)
if cls is None or not isinstance(cls, type):
continue
if base_types is not None and not issubclass(cls, tuple(base_types)):
continue
namespace[module_name] = cls namespace[module_name] = cls
ret.append(module_name) ret.append(module_name)