53 lines
1.9 KiB
Python
53 lines
1.9 KiB
Python
import types
|
|
from typing import Type, Optional, Callable
|
|
|
|
from cpl_core.application.application_abc import ApplicationABC
|
|
from cpl_core.application.application_builder_abc import ApplicationBuilderABC
|
|
from cpl_core.application.application_extension_abc import ApplicationExtensionABC
|
|
from cpl_core.application.startup_abc import StartupABC
|
|
from cpl_core.configuration.configuration import Configuration
|
|
from cpl_core.console import Console
|
|
from cpl_core.dependency_injection.service_collection import ServiceCollection
|
|
|
|
|
|
class ApplicationBuilder(ApplicationBuilderABC):
|
|
r"""This is class is used to build a object of :class:`cpl_core.application.application_abc.ApplicationABC`
|
|
|
|
Parameter
|
|
---------
|
|
app: Type[:class:`cpl_core.application.application_abc.ApplicationABC`]
|
|
Application to build
|
|
"""
|
|
|
|
def __init__(self, app: Type[ApplicationABC]):
|
|
ApplicationBuilderABC.__init__(self)
|
|
self._app = app
|
|
self._startup: Optional[StartupABC] = None
|
|
|
|
self._configuration = Configuration()
|
|
self._environment = self._configuration.environment
|
|
self._services = ServiceCollection(self._configuration)
|
|
|
|
self._extensions: list[Callable] = []
|
|
|
|
def use_startup(self, startup: Type[StartupABC]):
|
|
self._startup = startup()
|
|
|
|
def use_extension(self, extension: Type[ApplicationExtensionABC]):
|
|
if extension not in self._extensions:
|
|
self._extensions.append(extension)
|
|
|
|
def build(self) -> ApplicationABC:
|
|
if self._startup is not None:
|
|
self._startup.configure_configuration(self._configuration, self._environment)
|
|
self._startup.configure_services(self._services, self._environment)
|
|
|
|
config = self._configuration
|
|
services = self._services.build_service_provider()
|
|
|
|
for ex in self._extensions:
|
|
extension = ex()
|
|
extension.run(config, services)
|
|
|
|
return self._app(config, services)
|