Config model options handling. Closes #185
All checks were successful
Build on push / prepare (push) Successful in 10s
Build on push / core (push) Successful in 19s
Build on push / query (push) Successful in 19s
Build on push / dependency (push) Successful in 25s
Build on push / translation (push) Successful in 17s
Build on push / database (push) Successful in 20s
Build on push / application (push) Successful in 21s
Build on push / mail (push) Successful in 20s
Build on push / auth (push) Successful in 14s

This commit is contained in:
2025-09-19 17:47:49 +02:00
parent 2be58f6577
commit 1a67318091
37 changed files with 260 additions and 334 deletions

View File

@@ -3,9 +3,9 @@ from typing import Callable, Self
from cpl.application.host import Host from cpl.application.host import Host
from cpl.core.console.console import Console from cpl.core.console.console import Console
from cpl.core.environment.environment import Environment from cpl.core.log import LogSettings
from cpl.core.log.logger_abc import LoggerABC
from cpl.core.log.log_level_enum import LogLevel from cpl.core.log.log_level_enum import LogLevel
from cpl.core.log.logger_abc import LoggerABC
from cpl.dependency.service_provider_abc import ServiceProviderABC from cpl.dependency.service_provider_abc import ServiceProviderABC
@@ -43,7 +43,10 @@ class ApplicationABC(ABC):
def with_logging(self, level: LogLevel = None): def with_logging(self, level: LogLevel = None):
if level is None: if level is None:
level = Environment.get("LOG_LEVEL", LogLevel, LogLevel.info) from cpl.core.configuration.configuration import Configuration
settings = Configuration.get(LogSettings)
level = settings.level if settings else LogLevel.info
logger = self._services.get_service(LoggerABC) logger = self._services.get_service(LoggerABC)
logger.set_level(level) logger.set_level(level)

View File

@@ -1,37 +1,17 @@
from typing import Optional from typing import Optional
from cpl.core.configuration.configuration_model_abc import ConfigurationModelABC from cpl.core.configuration.configuration_model_abc import ConfigurationModelABC
from cpl.core.environment import Environment
class KeycloakSettings(ConfigurationModelABC): class KeycloakSettings(ConfigurationModelABC):
def __init__( def __init__(
self, self,
url: str = Environment.get("KEYCLOAK_URL", str), src: Optional[dict] = None,
client_id: str = Environment.get("KEYCLOAK_CLIENT_ID", str),
realm: str = Environment.get("KEYCLOAK_REALM", str),
client_secret: str = Environment.get("KEYCLOAK_CLIENT_SECRET", str),
): ):
ConfigurationModelABC.__init__(self) ConfigurationModelABC.__init__(self, src, "KEYCLOAK")
self._url: Optional[str] = url self.option("url", str, required=True)
self._client_id: Optional[str] = client_id self.option("client_id", str, required=True)
self._realm: Optional[str] = realm self.option("realm", str, required=True)
self._client_secret: Optional[str] = client_secret self.option("client_secret", str, required=True)
@property
def url(self) -> Optional[str]:
return self._url
@property
def client_id(self) -> Optional[str]:
return self._client_id
@property
def realm(self) -> Optional[str]:
return self._realm
@property
def client_secret(self) -> Optional[str]:
return self._client_secret

View File

@@ -8,7 +8,6 @@ from cpl.core.configuration.configuration_model_abc import ConfigurationModelABC
from cpl.core.console.console import Console from cpl.core.console.console import Console
from cpl.core.console.foreground_color_enum import ForegroundColorEnum from cpl.core.console.foreground_color_enum import ForegroundColorEnum
from cpl.core.typing import D, T from cpl.core.typing import D, T
from cpl.core.utils.json_processor import JSONProcessor
class Configuration: class Configuration:
@@ -116,9 +115,7 @@ class Configuration:
if sub.__name__ != key and sub.__name__.replace("Settings", "") != key: if sub.__name__ != key and sub.__name__.replace("Settings", "") != key:
continue continue
configuration = JSONProcessor.process(sub, value) cls.set(sub, sub(value))
cls.set(sub, configuration)
@classmethod @classmethod
def set(cls, key: Any, value: T): def set(cls, key: Any, value: T):

View File

@@ -1,7 +1,81 @@
from abc import ABC from abc import ABC, abstractmethod
from typing import Optional, Type, Any
from cpl.core.typing import T
from cpl.core.utils.cast import cast
from cpl.core.utils.get_value import get_value
from cpl.core.utils.string import String
class ConfigurationModelABC(ABC): class ConfigurationModelABC(ABC):
r""" r"""
ABC for configuration model classes ABC for configuration model classes
""" """
@abstractmethod
def __init__(
self,
src: Optional[dict] = None,
env_prefix: Optional[str] = None,
readonly: bool = True,
):
ABC.__init__(self)
self._src = src or {}
self._options: dict[str, Any] = {}
self._env_prefix = env_prefix
self._readonly = readonly
def __setattr__(self, attr: str, value: Any):
if hasattr(self, "_readonly") and self._readonly:
raise AttributeError(f"Cannot set attribute: {attr}. {type(self).__name__} is read-only")
super().__setattr__(attr, value)
def __getattr__(self, attr: str) -> Any:
options = super().__getattribute__("_options")
if attr in options:
return options[attr]
return super().__getattribute__(attr)
def option(self, field: str, cast_type: Type[T], default=None, required=False, from_env=True):
value = None
field_variants = [
field,
String.first_to_upper(field),
String.first_to_lower(field),
String.to_camel_case(field),
String.to_snake_case(field),
String.first_to_upper(String.to_camel_case(field)),
]
value = None
for variant in field_variants:
if variant in self._src:
value = self._src[variant]
break
if value is None and from_env:
from cpl.core.environment import Environment
env_field = field.upper()
if self._env_prefix:
env_field = f"{self._env_prefix}_{env_field}"
value = Environment.get(env_field, cast_type)
if value is None and required:
raise ValueError(f"{field} is required")
elif value is None:
self._options[field] = default
return
self._options[field] = cast(value, cast_type)
def get(self, field: str, default=None) -> Optional[T]:
return get_value(self._src, field, self._options[field].type, default)
def to_dict(self) -> dict:
return {field: self.get(field) for field in self._options.keys()}

View File

@@ -5,49 +5,14 @@ from cpl.core.log.log_level_enum import LogLevel
class LogSettings(ConfigurationModelABC): class LogSettings(ConfigurationModelABC):
r"""Representation of logging settings"""
def __init__( def __init__(
self, self,
path: str = None, src: Optional[dict] = None,
filename: str = None,
console_log_level: LogLevel = None,
file_log_level: LogLevel = None,
): ):
ConfigurationModelABC.__init__(self) ConfigurationModelABC.__init__(self, src)
self._path: Optional[str] = path
self._filename: Optional[str] = filename
self._console: Optional[LogLevel] = console_log_level
self._level: Optional[LogLevel] = file_log_level
@property self.option("path", str, default="logs")
def path(self) -> str: self.option("filename", str, default="app.log")
return self._path self.option("console_level", LogLevel, default=LogLevel.info)
self.option("level", LogLevel, default=LogLevel.info)
@path.setter
def path(self, path: str) -> None:
self._path = path
@property
def filename(self) -> str:
return self._filename
@filename.setter
def filename(self, filename: str) -> None:
self._filename = filename
@property
def console(self) -> LogLevel:
return self._console
@console.setter
def console(self, console: LogLevel) -> None:
self._console = console
@property
def level(self) -> LogLevel:
return self._level
@level.setter
def level(self, level: LogLevel) -> None:
self._level = level

View File

@@ -3,3 +3,4 @@ from .credential_manager import CredentialManager
from .json_processor import JSONProcessor from .json_processor import JSONProcessor
from .pip import Pip from .pip import Pip
from .string import String from .string import String
from .get_value import get_value

View File

@@ -0,0 +1,64 @@
from enum import Enum
from typing import Type, Any
from cpl.core.typing import T
def _cast_enum(value: str, enum_type: Type[Enum]) -> Enum:
try:
return enum_type(value)
except ValueError:
pass
try:
return enum_type(value.lower())
except ValueError:
pass
try:
return enum_type(value.upper())
except ValueError:
pass
try:
return enum_type[value]
except KeyError:
pass
try:
return enum_type[value.lower()]
except KeyError:
pass
try:
return enum_type[value.upper()]
except KeyError:
pass
raise ValueError(f"Cannot cast value '{value}' to enum '{enum_type.__name__}'")
def cast(value: Any, cast_type: Type[T], list_delimiter: str = ",") -> T:
"""
Cast a value to a specified type.
:param Any value: Value to be casted.
:param Type[T] cast_type: A callable to cast the variable's value.
:param str list_delimiter: The delimiter to split the value into a list. Defaults to ",".
:return:
"""
if cast_type == bool:
return value.lower() in ["true", "1", "yes", "on"]
if issubclass(cast_type, Enum):
return _cast_enum(value, cast_type)
if (cast_type if not hasattr(cast_type, "__origin__") else cast_type.__origin__) == list:
if not (value.startswith("[") and value.endswith("]")) and list_delimiter not in value:
raise ValueError("List values must be enclosed in square brackets or use a delimiter.")
if value.startswith("[") and value.endswith("]"):
value = value[1:-1]
value = value.split(list_delimiter)
subtype = cast_type.__args__[0] if hasattr(cast_type, "__args__") else None
return [subtype(item) if subtype is not None else item for item in value]
return cast_type(value)

View File

@@ -6,8 +6,10 @@ from cpl.core.log.logger import Logger
_logger = Logger(__name__) _logger = Logger(__name__)
class CredentialManager: class CredentialManager:
r"""Handles credential encryption and decryption""" r"""Handles credential encryption and decryption"""
_secret: str = None _secret: str = None
@classmethod @classmethod

View File

@@ -1,7 +1,7 @@
from enum import Enum
from typing import Type, Optional from typing import Type, Optional
from cpl.core.typing import T from cpl.core.typing import T
from cpl.core.utils.cast import cast
def get_value( def get_value(
@@ -38,33 +38,6 @@ def get_value(
return value return value
try: try:
if cast_type == bool: cast(cast_type, value, list_delimiter)
return value.lower() in ["true", "1"]
if issubclass(cast_type, Enum):
try:
return cast_type(value)
except ValueError:
pass
try:
return cast_type[value]
except KeyError:
pass
return default
if (cast_type if not hasattr(cast_type, "__origin__") else cast_type.__origin__) == list:
if not (value.startswith("[") and value.endswith("]")) and list_delimiter not in value:
raise ValueError("List values must be enclosed in square brackets or use a delimiter.")
if value.startswith("[") and value.endswith("]"):
value = value[1:-1]
value = value.split(list_delimiter)
subtype = cast_type.__args__[0] if hasattr(cast_type, "__args__") else None
return [subtype(item) if subtype is not None else item for item in value]
return cast_type(value)
except (ValueError, TypeError): except (ValueError, TypeError):
return default return default

View File

@@ -17,7 +17,11 @@ class String:
Returns: Returns:
String converted to CamelCase String converted to CamelCase
""" """
return re.sub(r"(?<!^)(?=[A-Z])", "_", s).lower()
s = String.to_snake_case(s)
words = s.split('_')
return words[0] + ''.join(word.title() for word in words[1:])
# return re.sub(r"(?<!^)(?=[A-Z])", "_", s).lower()
@staticmethod @staticmethod
def to_snake_case(chars: str) -> str: def to_snake_case(chars: str) -> str:

View File

@@ -2,74 +2,23 @@ from typing import Optional
from cpl.core.configuration import Configuration from cpl.core.configuration import Configuration
from cpl.core.configuration.configuration_model_abc import ConfigurationModelABC from cpl.core.configuration.configuration_model_abc import ConfigurationModelABC
from cpl.core.environment import Environment
class DatabaseSettings(ConfigurationModelABC): class DatabaseSettings(ConfigurationModelABC):
r"""Represents settings for the database connection"""
def __init__( def __init__(
self, self,
host: str = Environment.get("DB_HOST", str), src: Optional[dict] = None,
port: int = Environment.get("DB_PORT", str, Configuration.get("DB_DEFAULT_PORT", 0)),
user: str = Environment.get("DB_USER", str),
password: str = Environment.get("DB_PASSWORD", str),
database: str = Environment.get("DB_DATABASE", str),
charset: str = Environment.get("DB_CHARSET", str, "utf8mb4"),
use_unicode: bool = Environment.get("DB_USE_UNICODE", bool, False),
buffered: bool = Environment.get("DB_BUFFERED", bool, False),
auth_plugin: str = Environment.get("DB_AUTH_PLUGIN", str, "caching_sha2_password"),
ssl_disabled: bool = Environment.get("DB_SSL_DISABLED", bool, False),
): ):
ConfigurationModelABC.__init__(self) ConfigurationModelABC.__init__(self, src, "DB")
self._host: Optional[str] = host self.option("host", str, required=True)
self._port: Optional[int] = port self.option("port", int, Configuration.get("DB_DEFAULT_PORT"), required=True)
self._user: Optional[str] = user self.option("user", str, required=True)
self._password: Optional[str] = password self.option("password", str, required=True)
self._database: Optional[str] = database self.option("database", str, required=True)
self._charset: Optional[str] = charset self.option("charset", str, "utf8mb4")
self._use_unicode: Optional[bool] = use_unicode self.option("use_unicode", bool, False)
self._buffered: Optional[bool] = buffered self.option("buffered", bool, False)
self._auth_plugin: Optional[str] = auth_plugin self.option("auth_plugin", str, "caching_sha2_password")
self._ssl_disabled: Optional[bool] = ssl_disabled self.option("ssl_disabled", bool, False)
@property
def host(self) -> Optional[str]:
return self._host
@property
def port(self) -> Optional[int]:
return self._port
@property
def user(self) -> Optional[str]:
return self._user
@property
def password(self) -> Optional[str]:
return self._password
@property
def database(self) -> Optional[str]:
return self._database
@property
def charset(self) -> Optional[str]:
return self._charset
@property
def use_unicode(self) -> Optional[bool]:
return self._use_unicode
@property
def buffered(self) -> Optional[bool]:
return self._buffered
@property
def auth_plugin(self) -> Optional[str]:
return self._auth_plugin
@property
def ssl_disabled(self) -> Optional[bool]:
return self._ssl_disabled

View File

@@ -2,7 +2,6 @@ from cpl.dependency import ServiceCollection as _ServiceCollection
from .abc.email_client_abc import EMailClientABC from .abc.email_client_abc import EMailClientABC
from .email_client import EMailClient from .email_client import EMailClient
from .email_client_settings import EMailClientSettings from .email_client_settings import EMailClientSettings
from .email_client_settings_name_enum import EMailClientSettingsNameEnum
from .email_model import EMail from .email_model import EMail
from .mail_logger import MailLogger from .mail_logger import MailLogger

View File

@@ -1,51 +1,17 @@
from typing import Optional
from cpl.core.configuration.configuration_model_abc import ConfigurationModelABC from cpl.core.configuration.configuration_model_abc import ConfigurationModelABC
class EMailClientSettings(ConfigurationModelABC): class EMailClientSettings(ConfigurationModelABC):
r"""Representation of mailing settings"""
def __init__( def __init__(
self, self,
host: str = None, src: Optional[dict] = None,
port: int = None,
user_name: str = None,
credentials: str = None,
): ):
ConfigurationModelABC.__init__(self) ConfigurationModelABC.__init__(self, src, "EMAIL")
self._host: str = host self.option("host", str, required=True)
self._port: int = port self.option("port", int, 587, required=True)
self._user_name: str = user_name self.option("user_name", str, required=True)
self._credentials: str = credentials self.option("credentials", str, required=True)
@property
def host(self) -> str:
return self._host
@host.setter
def host(self, host: str) -> None:
self._host = host
@property
def port(self) -> int:
return self._port
@port.setter
def port(self, port: int) -> None:
self._port = port
@property
def user_name(self) -> str:
return self._user_name
@user_name.setter
def user_name(self, user_name: str) -> None:
self._user_name = user_name
@property
def credentials(self) -> str:
return self._credentials
@credentials.setter
def credentials(self, credentials: str) -> None:
self._credentials = credentials

View File

@@ -1,8 +0,0 @@
from enum import Enum
class EMailClientSettingsNameEnum(Enum):
host = "Host"
port = "Port"
user_name = "UserName"
credentials = "Credentials"

View File

@@ -1,5 +1,5 @@
{ {
"ProjectSettings": { "Project": {
"Name": "database", "Name": "database",
"Version": { "Version": {
"Major": "0", "Major": "0",
@@ -22,7 +22,7 @@
"PythonPath": {}, "PythonPath": {},
"Classifiers": [] "Classifiers": []
}, },
"BuildSettings": { "Build": {
"ProjectType": "console", "ProjectType": "console",
"SourcePath": "src", "SourcePath": "src",
"OutputPath": "dist", "OutputPath": "dist",

View File

@@ -1,8 +1,8 @@
{ {
"LoggingSettings": { "Logging": {
"Path": "logs/", "Path": "logs/",
"Filename": "log_$start_time.log", "Filename": "log_$start_time.log",
"ConsoleLogLevel": "TRACE", "ConsoleLevel": "TRACE",
"FileLogLevel": "TRACE" "Level": "TRACE"
} }
} }

View File

@@ -1,19 +1,19 @@
{ {
"TimeFormatSettings": { "TimeFormat": {
"DateFormat": "%Y-%m-%d", "DateFormat": "%Y-%m-%d",
"TimeFormat": "%H:%M:%S", "TimeFormat": "%H:%M:%S",
"DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f", "DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f",
"DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S"
}, },
"LoggingSettings": { "Log": {
"Path": "logs/", "Path": "logs/",
"Filename": "log_$start_time.log", "Filename": "log_$start_time.log",
"ConsoleLogLevel": "TRACE", "ConsoleLevel": "TRACE",
"FileLogLevel": "TRACE" "Level": "TRACE"
}, },
"DatabaseSettings": { "Database": {
"AuthPlugin": "mysql_native_password", "AuthPlugin": "mysql_native_password",
"ConnectionString": "mysql+mysqlconnector://cpl:$credentials@localhost/cpl", "ConnectionString": "mysql+mysqlconnector://cpl:$credentials@localhost/cpl",
"Credentials": "Y3Bs", "Credentials": "Y3Bs",

View File

@@ -1,19 +1,19 @@
{ {
"TimeFormatSettings": { "TimeFormat": {
"DateFormat": "%Y-%m-%d", "DateFormat": "%Y-%m-%d",
"TimeFormat": "%H:%M:%S", "TimeFormat": "%H:%M:%S",
"DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f", "DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f",
"DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S"
}, },
"LoggingSettings": { "Log": {
"Path": "logs/", "Path": "logs/",
"Filename": "log_$start_time.log", "Filename": "log_$start_time.log",
"ConsoleLogLevel": "TRACE", "ConsoleLevel": "TRACE",
"FileLogLevel": "TRACE" "Level": "TRACE"
}, },
"DatabaseSettings": { "Database": {
"Host": "localhost", "Host": "localhost",
"User": "cpl", "User": "cpl",
"Port": 3306, "Port": 3306,

View File

@@ -1,15 +1,15 @@
{ {
"TimeFormatSettings": { "TimeFormat": {
"DateFormat": "%Y-%m-%d", "DateFormat": "%Y-%m-%d",
"TimeFormat": "%H:%M:%S", "TimeFormat": "%H:%M:%S",
"DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f", "DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f",
"DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S"
}, },
"LoggingSettings": { "Log": {
"Path": "logs/", "Path": "logs/",
"Filename": "log_$start_time.log", "Filename": "log_$start_time.log",
"ConsoleLogLevel": "ERROR", "ConsoleLevel": "ERROR",
"FileLogLevel": "WARN" "Level": "WARNING"
} }
} }

View File

@@ -1,15 +1,15 @@
{ {
"TimeFormatSettings": { "TimeFormat": {
"DateFormat": "%Y-%m-%d", "DateFormat": "%Y-%m-%d",
"TimeFormat": "%H:%M:%S", "TimeFormat": "%H:%M:%S",
"DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f", "DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f",
"DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S"
}, },
"LoggingSettings": { "Logging": {
"Path": "logs/", "Path": "logs/",
"Filename": "log_$start_time.log", "Filename": "log_$start_time.log",
"ConsoleLogLevel": "ERROR", "ConsoleLevel": "ERROR",
"FileLogLevel": "WARN" "Level": "WARN"
} }
} }

View File

@@ -1,5 +1,5 @@
{ {
"WorkspaceSettings": { "Workspace": {
"DefaultProject": "di", "DefaultProject": "di",
"Projects": { "Projects": {
"di": "src/di/di.json" "di": "src/di/di.json"

View File

@@ -1,5 +1,5 @@
{ {
"ProjectSettings": { "Project": {
"Name": "di", "Name": "di",
"Version": { "Version": {
"Major": "0", "Major": "0",
@@ -25,7 +25,7 @@
"PythonPath": {}, "PythonPath": {},
"Classifiers": [] "Classifiers": []
}, },
"BuildSettings": { "Build": {
"ProjectType": "console", "ProjectType": "console",
"SourcePath": "", "SourcePath": "",
"OutputPath": "../../dist", "OutputPath": "../../dist",

View File

@@ -1,8 +1,8 @@
{ {
"LoggingSettings": { "Logging": {
"Path": "logs/", "Path": "logs/",
"Filename": "log_$start_time.log", "Filename": "log_$start_time.log",
"ConsoleLogLevel": "TRACE", "ConsoleLevel": "TRACE",
"FileLogLevel": "TRACE" "Level": "TRACE"
} }
} }

View File

@@ -1,63 +1,20 @@
{ {
"TimeFormatSettings": { "TimeFormat": {
"DateFormat": "%Y-%m-%d", "DateFormat": "%Y-%m-%d",
"TimeFormat": "%H:%M:%S", "TimeFormat": "%H:%M:%S",
"DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f", "DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f",
"DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S"
}, },
"LoggingSettings": { "Logging": {
"Path": "logs/", "Path": "logs/",
"Filename": "log_$start_time.log", "Filename": "log_$start_time.log",
"ConsoleLogLevel": "TRACE", "ConsoleLevel": "TRACE",
"FileLogLevel": "TRACE" "Level": "TRACE"
}, },
"EMailClientSettings": { "EMailClient": {
"Host": "mail.sh-edraft.de", "Host": "mail.sh-edraft.de",
"Port": "587", "Port": "587",
"UserName": "dev-srv@sh-edraft.de", "UserName": "dev-srv@sh-edraft.de",
"Credentials": "RmBOQX1eNFYiYjgsSid3fV1nelc2WA==" "Credentials": "RmBOQX1eNFYiYjgsSid3fV1nelc2WA=="
},
"PublishSettings": {
"SourcePath": "../",
"DistPath": "../../dist",
"Templates": [
{
"TemplatePath": "../../publish_templates/all_template.txt",
"Name": "all",
"Description": "",
"LongDescription": "",
"CopyrightDate": "2020",
"CopyrightName": "sh-edraft.de",
"LicenseName": "MIT",
"LicenseDescription": ", see LICENSE for more details.",
"Title": "",
"Author": "Sven Heidemann",
"Version": {
"Major": 2020,
"Minor": 12,
"Micro": 9
}
},
{
"TemplatePath": "../../publish_templates/all_template.txt",
"Name": "sh_edraft",
"Description": "common python library",
"LongDescription": "Library to share common classes and models used at sh-edraft.de",
"CopyrightDate": "2020",
"CopyrightName": "sh-edraft.de",
"LicenseName": "MIT",
"LicenseDescription": ", see LICENSE for more details.",
"Title": "",
"Author": "Sven Heidemann",
"Version": {
"Major": 2020,
"Minor": 12,
"Micro": 9
}
}
],
"IncludedFiles": [],
"ExcludedFiles": [],
"TemplateEnding": "_template.txt"
} }
} }

View File

@@ -1,26 +1,26 @@
{ {
"TimeFormatSettings": { "TimeFormat": {
"DateFormat": "%Y-%m-%d", "DateFormat": "%Y-%m-%d",
"TimeFormat": "%H:%M:%S", "TimeFormat": "%H:%M:%S",
"DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f", "DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f",
"DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S"
}, },
"LoggingSettings": { "Logging": {
"Path": "logs/", "Path": "logs/",
"Filename": "log_$start_time.log", "Filename": "log_$start_time.log",
"ConsoleLogLevel": "TRACE", "ConsoleLevel": "TRACE",
"FileLogLevel": "TRACE" "Level": "TRACE"
}, },
"EMailClientSettings": { "EMailClient": {
"Host": "mail.sh-edraft.de", "Host": "mail.sh-edraft.de",
"Port": "587", "Port": "587",
"UserName": "dev-srv@sh-edraft.de", "UserName": "dev-srv@sh-edraft.de",
"Credentials": "RmBOQX1eNFYiYjgsSid3fV1nelc2WA==" "Credentials": "RmBOQX1eNFYiYjgsSid3fV1nelc2WA=="
}, },
"DatabaseSettings": { "Database": {
"Host": "localhost", "Host": "localhost",
"User": "sh_cpl", "User": "sh_cpl",
"Password": "MHZhc0Y2bjhKc1VUMWV0Qw==", "Password": "MHZhc0Y2bjhKc1VUMWV0Qw==",
@@ -31,7 +31,7 @@
"AuthPlugin": "mysql_native_password" "AuthPlugin": "mysql_native_password"
}, },
"TestSettings": { "Test": {
"Value": 20 "Value": 20
} }
} }

View File

@@ -1,15 +1,15 @@
{ {
"TimeFormatSettings": { "TimeFormat": {
"DateFormat": "%Y-%m-%d", "DateFormat": "%Y-%m-%d",
"TimeFormat": "%H:%M:%S", "TimeFormat": "%H:%M:%S",
"DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f", "DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f",
"DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S"
}, },
"LoggingSettings": { "Logging": {
"Path": "logs/", "Path": "logs/",
"Filename": "log_$start_time.log", "Filename": "log_$start_time.log",
"ConsoleLogLevel": "ERROR", "ConsoleLevel": "ERROR",
"FileLogLevel": "WARN" "Level": "WARN"
} }
} }

View File

@@ -1,5 +1,5 @@
{ {
"ProjectSettings": { "Project": {
"Name": "general", "Name": "general",
"Version": { "Version": {
"Major": "2021", "Major": "2021",
@@ -30,7 +30,7 @@
}, },
"Classifiers": [] "Classifiers": []
}, },
"BuildSettings": { "Build": {
"ProjectType": "console", "ProjectType": "console",
"SourcePath": "", "SourcePath": "",
"OutputPath": "dist", "OutputPath": "dist",

View File

@@ -1,5 +1,5 @@
{ {
"WorkspaceSettings": { "Workspace": {
"DefaultProject": "translation", "DefaultProject": "translation",
"Projects": { "Projects": {
"translation": "src/translation/translation.json" "translation": "src/translation/translation.json"

View File

@@ -1,16 +1,16 @@
{ {
"TimeFormatSettings": { "TimeFormat": {
"DateFormat": "%Y-%m-%d", "DateFormat": "%Y-%m-%d",
"TimeFormat": "%H:%M:%S", "TimeFormat": "%H:%M:%S",
"DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f", "DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f",
"DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S"
}, },
"LoggingSettings": { "Logging": {
"Path": "logs/", "Path": "logs/",
"Filename": "log_$start_time.log", "Filename": "log_$start_time.log",
"ConsoleLogLevel": "ERROR", "ConsoleLevel": "ERROR",
"FileLogLevel": "WARN" "Level": "WARN"
}, },
"Translation": { "Translation": {

View File

@@ -1,5 +1,5 @@
{ {
"ProjectSettings": { "Project": {
"Name": "translation", "Name": "translation",
"Version": { "Version": {
"Major": "0", "Major": "0",
@@ -25,7 +25,7 @@
"PythonPath": {}, "PythonPath": {},
"Classifiers": [] "Classifiers": []
}, },
"BuildSettings": { "Build": {
"ProjectType": "console", "ProjectType": "console",
"SourcePath": "", "SourcePath": "",
"OutputPath": "../../dist", "OutputPath": "../../dist",

View File

@@ -1,5 +1,5 @@
{ {
"ProjectSettings": { "Project": {
"Name": "unittests", "Name": "unittests",
"Version": { "Version": {
"Major": "2024", "Major": "2024",
@@ -23,7 +23,7 @@
"Classifiers": [], "Classifiers": [],
"DevDependencies": [] "DevDependencies": []
}, },
"BuildSettings": { "Build": {
"ProjectType": "unittest", "ProjectType": "unittest",
"SourcePath": "", "SourcePath": "",
"OutputPath": "../../dist", "OutputPath": "../../dist",

View File

@@ -1,5 +1,5 @@
{ {
"ProjectSettings": { "Project": {
"Name": "unittest_cli", "Name": "unittest_cli",
"Version": { "Version": {
"Major": "2024", "Major": "2024",
@@ -24,7 +24,7 @@
"Classifiers": [], "Classifiers": [],
"DevDependencies": [] "DevDependencies": []
}, },
"BuildSettings": { "Build": {
"ProjectType": "library", "ProjectType": "library",
"SourcePath": "", "SourcePath": "",
"OutputPath": "../../dist", "OutputPath": "../../dist",

View File

@@ -1,17 +1,17 @@
{ {
"TimeFormatSettings": { "TimeFormat": {
"DateFormat": "%Y-%m-%d", "DateFormat": "%Y-%m-%d",
"TimeFormat": "%H:%M:%S", "TimeFormat": "%H:%M:%S",
"DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f", "DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f",
"DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S"
}, },
"LoggingSettings": { "Logging": {
"Path": "logs/$date_now/", "Path": "logs/$date_now/",
"Filename": "bot.log", "Filename": "bot.log",
"ConsoleLogLevel": "TRACE", "ConsoleLevel": "TRACE",
"FileLogLevel": "TRACE" "Level": "TRACE"
}, },
"DatabaseSettings": { "Database": {
"Host": "localhost", "Host": "localhost",
"User": "local", "User": "local",
"Password": "bG9jYWw=", "Password": "bG9jYWw=",

View File

@@ -1,5 +1,5 @@
{ {
"ProjectSettings": { "Project": {
"Name": "unittest_core", "Name": "unittest_core",
"Version": { "Version": {
"Major": "2024", "Major": "2024",
@@ -23,7 +23,7 @@
"Classifiers": [], "Classifiers": [],
"DevDependencies": [] "DevDependencies": []
}, },
"BuildSettings": { "Build": {
"ProjectType": "library", "ProjectType": "library",
"SourcePath": "", "SourcePath": "",
"OutputPath": "../../dist", "OutputPath": "../../dist",

View File

@@ -1,5 +1,5 @@
{ {
"ProjectSettings": { "Project": {
"Name": "unittest_query", "Name": "unittest_query",
"Version": { "Version": {
"Major": "2024", "Major": "2024",
@@ -24,7 +24,7 @@
"Classifiers": [], "Classifiers": [],
"DevDependencies": [] "DevDependencies": []
}, },
"BuildSettings": { "Build": {
"ProjectType": "library", "ProjectType": "library",
"SourcePath": "", "SourcePath": "",
"OutputPath": "../../dist", "OutputPath": "../../dist",

View File

@@ -1,5 +1,5 @@
{ {
"ProjectSettings": { "Project": {
"Name": "unittest_shared", "Name": "unittest_shared",
"Version": { "Version": {
"Major": "2024", "Major": "2024",
@@ -23,7 +23,7 @@
"Classifiers": [], "Classifiers": [],
"DevDependencies": [] "DevDependencies": []
}, },
"BuildSettings": { "Build": {
"ProjectType": "library", "ProjectType": "library",
"SourcePath": "", "SourcePath": "",
"OutputPath": "../../dist", "OutputPath": "../../dist",

View File

@@ -1,5 +1,5 @@
{ {
"ProjectSettings": { "Project": {
"Name": "unittests_translation", "Name": "unittests_translation",
"Version": { "Version": {
"Major": "2024", "Major": "2024",
@@ -26,7 +26,7 @@
"PythonPath": {}, "PythonPath": {},
"Classifiers": [] "Classifiers": []
}, },
"BuildSettings": { "Build": {
"ProjectType": "unittest", "ProjectType": "unittest",
"SourcePath": "", "SourcePath": "",
"OutputPath": "../../dist", "OutputPath": "../../dist",