WIP: dev into master #184

Draft
edraft wants to merge 121 commits from dev into master
10 changed files with 23 additions and 16 deletions
Showing only changes of commit 0529269747 - Show all commits

View File

@@ -1,4 +1,3 @@
from .error import APIError, AlreadyExists, EndpointNotImplemented, Forbidden, NotFound, Unauthorized from .error import APIError, AlreadyExists, EndpointNotImplemented, Forbidden, NotFound, Unauthorized
from .logger import APILogger from .logger import APILogger
from .settings import ApiSettings from .settings import ApiSettings

View File

@@ -1,2 +1,2 @@
from .application_builder import ApplicationBuilder from .application_builder import ApplicationBuilder
from .host import Host from .host import Host

View File

@@ -77,4 +77,4 @@ class Host:
if asyncio.iscoroutinefunction(func): if asyncio.iscoroutinefunction(func):
return cls.get_loop().run_until_complete(func(*args, **kwargs)) return cls.get_loop().run_until_complete(func(*args, **kwargs))
return func(*args, **kwargs) return func(*args, **kwargs)

View File

@@ -17,5 +17,4 @@ def _with_permissions(self: _ApplicationABC, *permissions: Type[Enum]) -> _Appli
return self return self
_ApplicationABC.extend(_ApplicationABC.with_permissions, _with_permissions) _ApplicationABC.extend(_ApplicationABC.with_permissions, _with_permissions)

View File

@@ -14,6 +14,7 @@ def dependency_error(src: str, package_name: str, e: ImportError = None) -> None
exit(1) exit(1)
def module_dependency_error(src: str, module: str, e: ImportError = None) -> None: def module_dependency_error(src: str, module: str, e: ImportError = None) -> None:
Console.error(f"'{module}' is required to use feature: {src}. Please initialize it with `add_module({module})`.") Console.error(f"'{module}' is required to use feature: {src}. Please initialize it with `add_module({module})`.")
tb = traceback.format_exc() tb = traceback.format_exc()
@@ -23,4 +24,4 @@ def module_dependency_error(src: str, module: str, e: ImportError = None) -> Non
elif e is not None: elif e is not None:
Console.write_line("->", str(e)) Console.write_line("->", str(e))
exit(1) exit(1)

View File

@@ -1,2 +1,2 @@
from .hosted_service import HostedService from .hosted_service import HostedService
from .startup_task import StartupTask from .startup_task import StartupTask

View File

@@ -6,4 +6,4 @@ class HostedService(ABC):
async def start(self): ... async def start(self): ...
@abstractmethod @abstractmethod
async def stop(self): ... async def stop(self): ...

View File

@@ -3,6 +3,7 @@ from typing import Type
TModule = Type["Module"] TModule = Type["Module"]
class Module(ABC): class Module(ABC):
@staticmethod @staticmethod

View File

@@ -23,7 +23,9 @@ class ServiceProvider:
type_args = list(typing.get_args(service_type)) type_args = list(typing.get_args(service_type))
for descriptor in self._service_descriptors: for descriptor in self._service_descriptors:
if typing.get_origin(service_type) is None and (descriptor.service_type == service_type or issubclass(descriptor.base_type, service_type)): if typing.get_origin(service_type) is None and (
descriptor.service_type == service_type or issubclass(descriptor.base_type, service_type)
):
return descriptor return descriptor
descriptor_base_type = typing.get_origin(descriptor.base_type) or descriptor.base_type descriptor_base_type = typing.get_origin(descriptor.base_type) or descriptor.base_type
@@ -65,9 +67,7 @@ class ServiceProvider:
implementations.append(descriptor.implementation) implementations.append(descriptor.implementation)
continue continue
implementation = self._build_service( implementation = self._build_service(descriptor, *args, origin_service_type=service_type, **kwargs)
descriptor, *args, origin_service_type=service_type, **kwargs
)
if descriptor.lifetime in (ServiceLifetimeEnum.singleton, ServiceLifetimeEnum.scoped): if descriptor.lifetime in (ServiceLifetimeEnum.singleton, ServiceLifetimeEnum.scoped):
descriptor.implementation = implementation descriptor.implementation = implementation
@@ -81,7 +81,9 @@ class ServiceProvider:
parameter = param[1] parameter = param[1]
if parameter.name != "self" and parameter.annotation != Parameter.empty: if parameter.name != "self" and parameter.annotation != Parameter.empty:
if typing.get_origin(parameter.annotation) == list: if typing.get_origin(parameter.annotation) == list:
params.append(self._get_services(typing.get_args(parameter.annotation)[0], service_type=origin_service_type)) params.append(
self._get_services(typing.get_args(parameter.annotation)[0], service_type=origin_service_type)
)
elif parameter.annotation == Source: elif parameter.annotation == Source:
params.append(origin_service_type.__name__) params.append(origin_service_type.__name__)
@@ -104,7 +106,9 @@ class ServiceProvider:
return params return params
def _build_service(self, descriptor: ServiceDescriptor, *args, origin_service_type: type = None, **kwargs) -> object: def _build_service(
self, descriptor: ServiceDescriptor, *args, origin_service_type: type = None, **kwargs
) -> object:
if descriptor.implementation is not None: if descriptor.implementation is not None:
service_type = type(descriptor.implementation) service_type = type(descriptor.implementation)
else: else:
@@ -131,7 +135,11 @@ class ServiceProvider:
yield scoped_provider yield scoped_provider
def get_hosted_services(self) -> list[Optional[T]]: def get_hosted_services(self) -> list[Optional[T]]:
hosted_services = [self.get_service(d.service_type) for d in self._service_descriptors if d.lifetime == ServiceLifetimeEnum.hosted] hosted_services = [
self.get_service(d.service_type)
for d in self._service_descriptors
if d.lifetime == ServiceLifetimeEnum.hosted
]
return hosted_services return hosted_services
def get_service(self, service_type: Type[T], *args, **kwargs) -> Optional[T]: def get_service(self, service_type: Type[T], *args, **kwargs) -> Optional[T]:

View File

@@ -9,7 +9,6 @@ class MailModule(Module):
def dependencies() -> list[TModule]: def dependencies() -> list[TModule]:
return [] return []
@staticmethod @staticmethod
def register(collection: ServiceCollection): def register(collection: ServiceCollection):
collection.add_singleton(EMailClientABC, EMailClient) collection.add_singleton(EMailClientABC, EMailClient)