App deps check

This commit is contained in:
2025-09-21 20:11:38 +02:00
parent eceff6128b
commit 073b35f71a
13 changed files with 147 additions and 22 deletions

View File

@@ -22,8 +22,16 @@ class ApplicationABC(ABC):
"""
@abstractmethod
def __init__(self, services: ServiceProviderABC):
def __init__(self, services: ServiceProviderABC, required_modules: list[str | object] = None):
self._services = services
self._required_modules = [
x.__name__ if not isinstance(x, str) else x
for x in required_modules
] if required_modules else []
@property
def required_modules(self) -> list[str]:
return self._required_modules
@classmethod
def extend(cls, name: str | Callable, func: Callable[[Self], Self]):

View File

@@ -6,6 +6,7 @@ from cpl.application.abc.application_extension_abc import ApplicationExtensionAB
from cpl.application.abc.startup_abc import StartupABC
from cpl.application.abc.startup_extension_abc import StartupExtensionABC
from cpl.application.host import Host
from cpl.core.errors import dependency_error
from cpl.dependency.service_collection import ServiceCollection
TApp = TypeVar("TApp", bound=ApplicationABC)
@@ -35,6 +36,18 @@ class ApplicationBuilder(Generic[TApp]):
def service_provider(self):
return self._services.build()
def validate_app_required_modules(self, app: ApplicationABC):
for module in app.required_modules:
if module in self._services.loaded_modules:
continue
dependency_error(
module,
ImportError(
f"Required module '{module}' for application '{app.__class__.__name__}' is not loaded. Load using 'add_module({module})' method."
),
)
def with_startup(self, startup: Type[StartupABC]) -> "ApplicationBuilder":
self._startup = startup
return self
@@ -62,4 +75,6 @@ class ApplicationBuilder(Generic[TApp]):
for extension in self._app_extensions:
Host.run(extension.run, self.service_provider)
return self._app(self.service_provider)
app = self._app(self.service_provider)
self.validate_app_required_modules(app)
return app