Compare commits
3 Commits
2025.09.25
...
2025.09.25
| Author | SHA1 | Date | |
|---|---|---|---|
| d05d947d54 | |||
| 0529269747 | |||
| e3e1703ff8 |
@@ -25,7 +25,11 @@ jobs:
|
||||
git tag
|
||||
DATE=$(date +'%Y.%m.%d')
|
||||
TAG_COUNT=$(git tag -l "${DATE}.*" | wc -l)
|
||||
BUILD_NUMBER=$(($TAG_COUNT + 1))
|
||||
if [ "$TAG_COUNT" -eq 0 ]; then
|
||||
BUILD_NUMBER=0
|
||||
else
|
||||
BUILD_NUMBER=$(($TAG_COUNT + 1))
|
||||
fi
|
||||
|
||||
VERSION_SUFFIX=${{ inputs.version_suffix }}
|
||||
if [ -n "$VERSION_SUFFIX" ] && [ "$VERSION_SUFFIX" = "dev" ]; then
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
from starlette.responses import JSONResponse
|
||||
|
||||
from cpl import api
|
||||
from cpl.api.api_module import ApiModule
|
||||
from cpl.api.application.web_app import WebApp
|
||||
from cpl.api_module import ApiModule
|
||||
from cpl.application import ApplicationBuilder
|
||||
from cpl.application.application_builder import ApplicationBuilder
|
||||
from cpl.auth.permission.permissions import Permissions
|
||||
from cpl.auth.schema import AuthUser, Role
|
||||
from cpl.core.configuration import Configuration
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from .error import APIError, AlreadyExists, EndpointNotImplemented, Forbidden, NotFound, Unauthorized
|
||||
from .logger import APILogger
|
||||
from .settings import ApiSettings
|
||||
|
||||
from .api_module import ApiModule
|
||||
|
||||
@@ -1,11 +1,6 @@
|
||||
from cpl.api.registry.policy import PolicyRegistry
|
||||
from cpl.api.registry.route import RouteRegistry
|
||||
from cpl.auth.auth_module import AuthModule
|
||||
from cpl.auth.permission.permission_module import PermissionsModule
|
||||
from cpl.core.errors import dependency_error
|
||||
from cpl.database.database_module import DatabaseModule
|
||||
from cpl.database.model.server_type import ServerType, ServerTypes
|
||||
from cpl.database.mysql.mysql_module import MySQLModule
|
||||
from cpl.dependency.module import Module, TModule
|
||||
|
||||
|
||||
@@ -17,6 +12,9 @@ class ApiModule(Module):
|
||||
|
||||
@staticmethod
|
||||
def register(collection: "ServiceCollection"):
|
||||
from cpl.api.registry.policy import PolicyRegistry
|
||||
from cpl.api.registry.route import RouteRegistry
|
||||
|
||||
collection.add_module(DatabaseModule)
|
||||
|
||||
collection.add_module(AuthModule)
|
||||
@@ -25,7 +25,7 @@ from cpl.api.registry.route import RouteRegistry
|
||||
from cpl.api.router import Router
|
||||
from cpl.api.settings import ApiSettings
|
||||
from cpl.api.typing import HTTPMethods, PartialMiddleware, PolicyResolver
|
||||
from cpl.api_module import ApiModule
|
||||
from cpl.api.api_module import ApiModule
|
||||
from cpl.application.abc.application_abc import ApplicationABC
|
||||
from cpl.auth.auth_module import AuthModule
|
||||
from cpl.auth.permission.permission_module import PermissionsModule
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
from .application_builder import ApplicationBuilder
|
||||
from .host import Host
|
||||
from .host import Host
|
||||
|
||||
@@ -77,4 +77,4 @@ class Host:
|
||||
if asyncio.iscoroutinefunction(func):
|
||||
return cls.get_loop().run_until_complete(func(*args, **kwargs))
|
||||
|
||||
return func(*args, **kwargs)
|
||||
return func(*args, **kwargs)
|
||||
|
||||
@@ -7,6 +7,7 @@ from cpl.auth.keycloak.keycloak_admin import KeycloakAdmin as _KeycloakAdmin
|
||||
from cpl.auth.keycloak.keycloak_client import KeycloakClient as _KeycloakClient
|
||||
from .keycloak_settings import KeycloakSettings
|
||||
from .logger import AuthLogger
|
||||
from .auth_module import AuthModule
|
||||
|
||||
|
||||
def _with_permissions(self: _ApplicationABC, *permissions: Type[Enum]) -> _ApplicationABC:
|
||||
@@ -17,5 +18,4 @@ def _with_permissions(self: _ApplicationABC, *permissions: Type[Enum]) -> _Appli
|
||||
return self
|
||||
|
||||
|
||||
|
||||
_ApplicationABC.extend(_ApplicationABC.with_permissions, _with_permissions)
|
||||
|
||||
@@ -1,19 +1,10 @@
|
||||
import os
|
||||
|
||||
from cpl.auth.keycloak.keycloak_admin import KeycloakAdmin as _KeycloakAdmin
|
||||
from cpl.auth.keycloak.keycloak_client import KeycloakClient as _KeycloakClient
|
||||
from cpl.database.database_module import DatabaseModule
|
||||
from cpl.database.model.server_type import ServerType, ServerTypes
|
||||
from cpl.database.service.migration_service import MigrationService
|
||||
from cpl.dependency.module import Module, TModule
|
||||
from cpl.dependency.service_collection import ServiceCollection
|
||||
from .schema._administration.api_key_dao import ApiKeyDao
|
||||
from .schema._administration.auth_user_dao import AuthUserDao
|
||||
from .schema._permission.api_key_permission_dao import ApiKeyPermissionDao
|
||||
from .schema._permission.permission_dao import PermissionDao
|
||||
from .schema._permission.role_dao import RoleDao
|
||||
from .schema._permission.role_permission_dao import RolePermissionDao
|
||||
from .schema._permission.role_user_dao import RoleUserDao
|
||||
|
||||
|
||||
class AuthModule(Module):
|
||||
@@ -23,8 +14,18 @@ class AuthModule(Module):
|
||||
|
||||
@staticmethod
|
||||
def register(collection: ServiceCollection):
|
||||
collection.add_singleton(_KeycloakClient)
|
||||
collection.add_singleton(_KeycloakAdmin)
|
||||
from cpl.auth.keycloak.keycloak_admin import KeycloakAdmin
|
||||
from cpl.auth.keycloak.keycloak_client import KeycloakClient
|
||||
from .schema._administration.api_key_dao import ApiKeyDao
|
||||
from .schema._administration.auth_user_dao import AuthUserDao
|
||||
from .schema._permission.api_key_permission_dao import ApiKeyPermissionDao
|
||||
from .schema._permission.permission_dao import PermissionDao
|
||||
from .schema._permission.role_dao import RoleDao
|
||||
from .schema._permission.role_permission_dao import RolePermissionDao
|
||||
from .schema._permission.role_user_dao import RoleUserDao
|
||||
|
||||
collection.add_singleton(KeycloakClient)
|
||||
collection.add_singleton(KeycloakAdmin)
|
||||
|
||||
collection.add_singleton(AuthUserDao)
|
||||
collection.add_singleton(ApiKeyDao)
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
from .permission_module import PermissionsModule
|
||||
from .permission_seeder import PermissionSeeder
|
||||
from .permissions import Permissions
|
||||
from .permissions_registry import PermissionsRegistry
|
||||
|
||||
@@ -14,6 +14,7 @@ def dependency_error(src: str, package_name: str, e: ImportError = None) -> None
|
||||
|
||||
exit(1)
|
||||
|
||||
|
||||
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})`.")
|
||||
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:
|
||||
Console.write_line("->", str(e))
|
||||
|
||||
exit(1)
|
||||
exit(1)
|
||||
|
||||
@@ -3,7 +3,9 @@ import os
|
||||
from cpl.application.abc import ApplicationABC as _ApplicationABC
|
||||
from . import mysql as _mysql
|
||||
from . import postgres as _postgres
|
||||
from .database_module import DatabaseModule
|
||||
from .table_manager import TableManager
|
||||
from .logger import DBLogger
|
||||
|
||||
|
||||
def _with_migrations(self: _ApplicationABC, *paths: str | list[str]) -> _ApplicationABC:
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
from .connection_abc import ConnectionABC
|
||||
from .data_access_object_abc import DataAccessObjectABC
|
||||
from .data_seeder_abc import DataSeederABC
|
||||
from .db_context_abc import DBContextABC
|
||||
from .db_join_model_abc import DbJoinModelABC
|
||||
from .db_model_abc import DbModelABC
|
||||
|
||||
@@ -14,7 +14,7 @@ from cpl.database.logger import DBLogger
|
||||
from cpl.database.model.server_type import ServerType, ServerTypes
|
||||
from cpl.database.postgres.sql_select_builder import SQLSelectBuilder
|
||||
from cpl.database.typing import T_DBM, Attribute, AttributeFilters, AttributeSorts
|
||||
from cpl.dependency import get_provider
|
||||
from cpl.dependency.context import get_provider
|
||||
|
||||
|
||||
class DataAccessObjectABC(ABC, Generic[T_DBM]):
|
||||
|
||||
@@ -2,7 +2,7 @@ from abc import abstractmethod
|
||||
from datetime import datetime
|
||||
from typing import Type
|
||||
|
||||
from cpl.database import TableManager
|
||||
from cpl.database.table_manager import TableManager
|
||||
from cpl.database.abc.data_access_object_abc import DataAccessObjectABC
|
||||
from cpl.database.abc.db_model_abc import DbModelABC
|
||||
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
from cpl.core.errors import module_dependency_error
|
||||
from cpl.database.model.server_type import ServerType
|
||||
from cpl.database.schema.executed_migration_dao import ExecutedMigrationDao
|
||||
from cpl.database.service.migration_service import MigrationService
|
||||
from cpl.database.service.seeder_service import SeederService
|
||||
from cpl.dependency.module import Module, TModule
|
||||
from cpl.dependency.service_collection import ServiceCollection
|
||||
|
||||
@@ -17,6 +14,10 @@ class DatabaseModule(Module):
|
||||
|
||||
@staticmethod
|
||||
def register(collection: ServiceCollection):
|
||||
from cpl.database.schema import ExecutedMigrationDao
|
||||
from cpl.database.service.migration_service import MigrationService
|
||||
from cpl.database.service.seeder_service import SeederService
|
||||
|
||||
collection.add_singleton(ExecutedMigrationDao)
|
||||
collection.add_singleton(MigrationService)
|
||||
collection.add_singleton(SeederService)
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
from .connection import DatabaseConnection
|
||||
from .db_context import DBContext
|
||||
from .mysql_module import MySQLModule
|
||||
from .mysql_pool import MySQLPool
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
from cpl.core.configuration.configuration import Configuration
|
||||
from cpl.database.abc.db_context_abc import DBContextABC
|
||||
from cpl.database.model.server_type import ServerTypes, ServerType
|
||||
from cpl.database.mysql.db_context import DBContext
|
||||
from cpl.dependency.module import Module, TModule
|
||||
from cpl.dependency.service_collection import ServiceCollection
|
||||
|
||||
@@ -13,6 +11,9 @@ class MySQLModule(Module):
|
||||
|
||||
@staticmethod
|
||||
def register(collection: ServiceCollection):
|
||||
from cpl.database.abc.db_context_abc import DBContextABC
|
||||
from cpl.database.mysql.db_context import DBContext
|
||||
|
||||
ServerType.set_server_type(ServerTypes(ServerTypes.MYSQL.value))
|
||||
Configuration.set("DB_DEFAULT_PORT", 3306)
|
||||
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
from .db_context import DBContext
|
||||
from .postgres_module import PostgresModule
|
||||
from .postgres_pool import PostgresPool
|
||||
from .sql_select_builder import SQLSelectBuilder
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
from cpl.core.configuration.configuration import Configuration
|
||||
from cpl.database.abc.db_context_abc import DBContextABC
|
||||
from cpl.database.database_module import DatabaseModule
|
||||
from cpl.database.model.server_type import ServerTypes, ServerType
|
||||
from cpl.database.postgres.db_context import DBContext
|
||||
from cpl.dependency.module import Module, TModule
|
||||
from cpl.dependency.service_collection import ServiceCollection
|
||||
|
||||
@@ -14,6 +12,9 @@ class PostgresModule(Module):
|
||||
|
||||
@staticmethod
|
||||
def register(collection: ServiceCollection):
|
||||
from cpl.database.abc.db_context_abc import DBContextABC
|
||||
from cpl.database.postgres.db_context import DBContext
|
||||
|
||||
ServerType.set_server_type(ServerTypes(ServerTypes.POSTGRES.value))
|
||||
Configuration.set("DB_DEFAULT_PORT", 5432)
|
||||
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
from .executed_migration import ExecutedMigration
|
||||
from .executed_migration_dao import ExecutedMigrationDao
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from cpl.database import TableManager
|
||||
from cpl.database.table_manager import TableManager
|
||||
from cpl.database.abc.data_access_object_abc import DataAccessObjectABC
|
||||
from cpl.database.schema.executed_migration import ExecutedMigration
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import glob
|
||||
import os
|
||||
|
||||
from cpl.database.abc import DBContextABC
|
||||
from cpl.database.abc.db_context_abc import DBContextABC
|
||||
from cpl.database.logger import DBLogger
|
||||
from cpl.database.model import Migration
|
||||
from cpl.database.model.migration import Migration
|
||||
from cpl.database.model.server_type import ServerType, ServerTypes
|
||||
from cpl.database.schema.executed_migration import ExecutedMigration
|
||||
from cpl.database.schema.executed_migration_dao import ExecutedMigrationDao
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
from .hosted_service import HostedService
|
||||
from .startup_task import StartupTask
|
||||
from .startup_task import StartupTask
|
||||
|
||||
@@ -6,4 +6,4 @@ class HostedService(ABC):
|
||||
async def start(self): ...
|
||||
|
||||
@abstractmethod
|
||||
async def stop(self): ...
|
||||
async def stop(self): ...
|
||||
|
||||
@@ -3,6 +3,7 @@ from typing import Type
|
||||
|
||||
TModule = Type["Module"]
|
||||
|
||||
|
||||
class Module(ABC):
|
||||
|
||||
@staticmethod
|
||||
|
||||
@@ -23,7 +23,9 @@ class ServiceProvider:
|
||||
type_args = list(typing.get_args(service_type))
|
||||
|
||||
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
|
||||
|
||||
descriptor_base_type = typing.get_origin(descriptor.base_type) or descriptor.base_type
|
||||
@@ -65,9 +67,7 @@ class ServiceProvider:
|
||||
implementations.append(descriptor.implementation)
|
||||
continue
|
||||
|
||||
implementation = self._build_service(
|
||||
descriptor, *args, origin_service_type=service_type, **kwargs
|
||||
)
|
||||
implementation = self._build_service(descriptor, *args, origin_service_type=service_type, **kwargs)
|
||||
if descriptor.lifetime in (ServiceLifetimeEnum.singleton, ServiceLifetimeEnum.scoped):
|
||||
descriptor.implementation = implementation
|
||||
|
||||
@@ -81,7 +81,9 @@ class ServiceProvider:
|
||||
parameter = param[1]
|
||||
if parameter.name != "self" and parameter.annotation != Parameter.empty:
|
||||
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:
|
||||
params.append(origin_service_type.__name__)
|
||||
@@ -104,7 +106,9 @@ class ServiceProvider:
|
||||
|
||||
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:
|
||||
service_type = type(descriptor.implementation)
|
||||
else:
|
||||
@@ -131,7 +135,11 @@ class ServiceProvider:
|
||||
yield scoped_provider
|
||||
|
||||
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
|
||||
|
||||
def get_service(self, service_type: Type[T], *args, **kwargs) -> Optional[T]:
|
||||
|
||||
@@ -3,6 +3,7 @@ from .abc.email_client_abc import EMailClientABC
|
||||
from .email_client import EMailClient
|
||||
from .email_client_settings import EMailClientSettings
|
||||
from .email_model import EMail
|
||||
from .mail_module import MailModule
|
||||
from .logger import MailLogger
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
from cpl.dependency import ServiceCollection
|
||||
from cpl.dependency.module import Module, TModule
|
||||
from cpl.mail.email_client import EMailClient
|
||||
from cpl.mail.abc.email_client_abc import EMailClientABC
|
||||
|
||||
|
||||
class MailModule(Module):
|
||||
@@ -9,7 +7,9 @@ class MailModule(Module):
|
||||
def dependencies() -> list[TModule]:
|
||||
return []
|
||||
|
||||
|
||||
@staticmethod
|
||||
def register(collection: ServiceCollection):
|
||||
collection.add_singleton(EMailClientABC, EMailClient)
|
||||
from cpl.mail.abc.email_client_abc import EMailClientABC
|
||||
from cpl.mail.email_client import EMailClient
|
||||
|
||||
collection.add_singleton(EMailClientABC, EMailClient)
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
from cpl.dependency import ServiceCollection as _ServiceCollection
|
||||
from .translate_pipe import TranslatePipe
|
||||
from .translation_module import TranslationModule
|
||||
from .translation_service import TranslationService
|
||||
from .translation_service_abc import TranslationServiceABC
|
||||
from .translation_settings import TranslationSettings
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
from cpl.dependency import ServiceCollection
|
||||
from cpl.dependency.module import Module, TModule
|
||||
from cpl.translation.translation_service import TranslationService
|
||||
from cpl.translation.translation_service_abc import TranslationServiceABC
|
||||
|
||||
|
||||
@@ -11,4 +10,6 @@ class TranslationModule(Module):
|
||||
|
||||
@staticmethod
|
||||
def register(collection: ServiceCollection):
|
||||
from cpl.translation.translation_service import TranslationService
|
||||
|
||||
collection.add_singleton(TranslationServiceABC, TranslationService)
|
||||
|
||||
Reference in New Issue
Block a user