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
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:
@@ -3,9 +3,9 @@ from typing import Callable, Self
|
||||
|
||||
from cpl.application.host import Host
|
||||
from cpl.core.console.console import Console
|
||||
from cpl.core.environment.environment import Environment
|
||||
from cpl.core.log.logger_abc import LoggerABC
|
||||
from cpl.core.log import LogSettings
|
||||
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
|
||||
|
||||
|
||||
@@ -43,7 +43,10 @@ class ApplicationABC(ABC):
|
||||
|
||||
def with_logging(self, level: LogLevel = 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.set_level(level)
|
||||
|
||||
@@ -1,37 +1,17 @@
|
||||
from typing import Optional
|
||||
|
||||
from cpl.core.configuration.configuration_model_abc import ConfigurationModelABC
|
||||
from cpl.core.environment import Environment
|
||||
|
||||
|
||||
class KeycloakSettings(ConfigurationModelABC):
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
url: str = Environment.get("KEYCLOAK_URL", str),
|
||||
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),
|
||||
src: Optional[dict] = None,
|
||||
):
|
||||
ConfigurationModelABC.__init__(self)
|
||||
ConfigurationModelABC.__init__(self, src, "KEYCLOAK")
|
||||
|
||||
self._url: Optional[str] = url
|
||||
self._client_id: Optional[str] = client_id
|
||||
self._realm: Optional[str] = realm
|
||||
self._client_secret: Optional[str] = client_secret
|
||||
|
||||
@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
|
||||
self.option("url", str, required=True)
|
||||
self.option("client_id", str, required=True)
|
||||
self.option("realm", str, required=True)
|
||||
self.option("client_secret", str, required=True)
|
||||
|
||||
@@ -8,7 +8,6 @@ from cpl.core.configuration.configuration_model_abc import ConfigurationModelABC
|
||||
from cpl.core.console.console import Console
|
||||
from cpl.core.console.foreground_color_enum import ForegroundColorEnum
|
||||
from cpl.core.typing import D, T
|
||||
from cpl.core.utils.json_processor import JSONProcessor
|
||||
|
||||
|
||||
class Configuration:
|
||||
@@ -116,9 +115,7 @@ class Configuration:
|
||||
if sub.__name__ != key and sub.__name__.replace("Settings", "") != key:
|
||||
continue
|
||||
|
||||
configuration = JSONProcessor.process(sub, value)
|
||||
|
||||
cls.set(sub, configuration)
|
||||
cls.set(sub, sub(value))
|
||||
|
||||
@classmethod
|
||||
def set(cls, key: Any, value: T):
|
||||
|
||||
@@ -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):
|
||||
r"""
|
||||
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()}
|
||||
|
||||
@@ -5,49 +5,14 @@ from cpl.core.log.log_level_enum import LogLevel
|
||||
|
||||
|
||||
class LogSettings(ConfigurationModelABC):
|
||||
r"""Representation of logging settings"""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
path: str = None,
|
||||
filename: str = None,
|
||||
console_log_level: LogLevel = None,
|
||||
file_log_level: LogLevel = None,
|
||||
src: Optional[dict] = None,
|
||||
):
|
||||
ConfigurationModelABC.__init__(self)
|
||||
self._path: Optional[str] = path
|
||||
self._filename: Optional[str] = filename
|
||||
self._console: Optional[LogLevel] = console_log_level
|
||||
self._level: Optional[LogLevel] = file_log_level
|
||||
ConfigurationModelABC.__init__(self, src)
|
||||
|
||||
@property
|
||||
def path(self) -> str:
|
||||
return self._path
|
||||
|
||||
@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
|
||||
self.option("path", str, default="logs")
|
||||
self.option("filename", str, default="app.log")
|
||||
self.option("console_level", LogLevel, default=LogLevel.info)
|
||||
self.option("level", LogLevel, default=LogLevel.info)
|
||||
|
||||
@@ -3,3 +3,4 @@ from .credential_manager import CredentialManager
|
||||
from .json_processor import JSONProcessor
|
||||
from .pip import Pip
|
||||
from .string import String
|
||||
from .get_value import get_value
|
||||
|
||||
64
src/cpl-core/cpl/core/utils/cast.py
Normal file
64
src/cpl-core/cpl/core/utils/cast.py
Normal 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)
|
||||
@@ -6,8 +6,10 @@ from cpl.core.log.logger import Logger
|
||||
|
||||
_logger = Logger(__name__)
|
||||
|
||||
|
||||
class CredentialManager:
|
||||
r"""Handles credential encryption and decryption"""
|
||||
|
||||
_secret: str = None
|
||||
|
||||
@classmethod
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
from enum import Enum
|
||||
from typing import Type, Optional
|
||||
|
||||
from cpl.core.typing import T
|
||||
from cpl.core.utils.cast import cast
|
||||
|
||||
|
||||
def get_value(
|
||||
@@ -38,33 +38,6 @@ def get_value(
|
||||
return value
|
||||
|
||||
try:
|
||||
if cast_type == bool:
|
||||
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)
|
||||
cast(cast_type, value, list_delimiter)
|
||||
except (ValueError, TypeError):
|
||||
return default
|
||||
|
||||
@@ -17,7 +17,11 @@ class String:
|
||||
Returns:
|
||||
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
|
||||
def to_snake_case(chars: str) -> str:
|
||||
|
||||
@@ -2,74 +2,23 @@ from typing import Optional
|
||||
|
||||
from cpl.core.configuration import Configuration
|
||||
from cpl.core.configuration.configuration_model_abc import ConfigurationModelABC
|
||||
from cpl.core.environment import Environment
|
||||
|
||||
|
||||
class DatabaseSettings(ConfigurationModelABC):
|
||||
r"""Represents settings for the database connection"""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
host: str = Environment.get("DB_HOST", str),
|
||||
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),
|
||||
src: Optional[dict] = None,
|
||||
):
|
||||
ConfigurationModelABC.__init__(self)
|
||||
ConfigurationModelABC.__init__(self, src, "DB")
|
||||
|
||||
self._host: Optional[str] = host
|
||||
self._port: Optional[int] = port
|
||||
self._user: Optional[str] = user
|
||||
self._password: Optional[str] = password
|
||||
self._database: Optional[str] = database
|
||||
self._charset: Optional[str] = charset
|
||||
self._use_unicode: Optional[bool] = use_unicode
|
||||
self._buffered: Optional[bool] = buffered
|
||||
self._auth_plugin: Optional[str] = auth_plugin
|
||||
self._ssl_disabled: Optional[bool] = ssl_disabled
|
||||
|
||||
@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
|
||||
self.option("host", str, required=True)
|
||||
self.option("port", int, Configuration.get("DB_DEFAULT_PORT"), required=True)
|
||||
self.option("user", str, required=True)
|
||||
self.option("password", str, required=True)
|
||||
self.option("database", str, required=True)
|
||||
self.option("charset", str, "utf8mb4")
|
||||
self.option("use_unicode", bool, False)
|
||||
self.option("buffered", bool, False)
|
||||
self.option("auth_plugin", str, "caching_sha2_password")
|
||||
self.option("ssl_disabled", bool, False)
|
||||
|
||||
@@ -2,7 +2,6 @@ from cpl.dependency import ServiceCollection as _ServiceCollection
|
||||
from .abc.email_client_abc import EMailClientABC
|
||||
from .email_client import EMailClient
|
||||
from .email_client_settings import EMailClientSettings
|
||||
from .email_client_settings_name_enum import EMailClientSettingsNameEnum
|
||||
from .email_model import EMail
|
||||
from .mail_logger import MailLogger
|
||||
|
||||
|
||||
@@ -1,51 +1,17 @@
|
||||
from typing import Optional
|
||||
|
||||
from cpl.core.configuration.configuration_model_abc import ConfigurationModelABC
|
||||
|
||||
|
||||
class EMailClientSettings(ConfigurationModelABC):
|
||||
r"""Representation of mailing settings"""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
host: str = None,
|
||||
port: int = None,
|
||||
user_name: str = None,
|
||||
credentials: str = None,
|
||||
self,
|
||||
src: Optional[dict] = None,
|
||||
):
|
||||
ConfigurationModelABC.__init__(self)
|
||||
ConfigurationModelABC.__init__(self, src, "EMAIL")
|
||||
|
||||
self._host: str = host
|
||||
self._port: int = port
|
||||
self._user_name: str = user_name
|
||||
self._credentials: str = credentials
|
||||
|
||||
@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
|
||||
self.option("host", str, required=True)
|
||||
self.option("port", int, 587, required=True)
|
||||
self.option("user_name", str, required=True)
|
||||
self.option("credentials", str, required=True)
|
||||
@@ -1,8 +0,0 @@
|
||||
from enum import Enum
|
||||
|
||||
|
||||
class EMailClientSettingsNameEnum(Enum):
|
||||
host = "Host"
|
||||
port = "Port"
|
||||
user_name = "UserName"
|
||||
credentials = "Credentials"
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"ProjectSettings": {
|
||||
"Project": {
|
||||
"Name": "database",
|
||||
"Version": {
|
||||
"Major": "0",
|
||||
@@ -22,7 +22,7 @@
|
||||
"PythonPath": {},
|
||||
"Classifiers": []
|
||||
},
|
||||
"BuildSettings": {
|
||||
"Build": {
|
||||
"ProjectType": "console",
|
||||
"SourcePath": "src",
|
||||
"OutputPath": "dist",
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"LoggingSettings": {
|
||||
"Logging": {
|
||||
"Path": "logs/",
|
||||
"Filename": "log_$start_time.log",
|
||||
"ConsoleLogLevel": "TRACE",
|
||||
"FileLogLevel": "TRACE"
|
||||
"ConsoleLevel": "TRACE",
|
||||
"Level": "TRACE"
|
||||
}
|
||||
}
|
||||
@@ -1,19 +1,19 @@
|
||||
{
|
||||
"TimeFormatSettings": {
|
||||
"TimeFormat": {
|
||||
"DateFormat": "%Y-%m-%d",
|
||||
"TimeFormat": "%H:%M:%S",
|
||||
"DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f",
|
||||
"DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S"
|
||||
},
|
||||
|
||||
"LoggingSettings": {
|
||||
"Log": {
|
||||
"Path": "logs/",
|
||||
"Filename": "log_$start_time.log",
|
||||
"ConsoleLogLevel": "TRACE",
|
||||
"FileLogLevel": "TRACE"
|
||||
"ConsoleLevel": "TRACE",
|
||||
"Level": "TRACE"
|
||||
},
|
||||
|
||||
"DatabaseSettings": {
|
||||
"Database": {
|
||||
"AuthPlugin": "mysql_native_password",
|
||||
"ConnectionString": "mysql+mysqlconnector://cpl:$credentials@localhost/cpl",
|
||||
"Credentials": "Y3Bs",
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
{
|
||||
"TimeFormatSettings": {
|
||||
"TimeFormat": {
|
||||
"DateFormat": "%Y-%m-%d",
|
||||
"TimeFormat": "%H:%M:%S",
|
||||
"DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f",
|
||||
"DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S"
|
||||
},
|
||||
|
||||
"LoggingSettings": {
|
||||
"Log": {
|
||||
"Path": "logs/",
|
||||
"Filename": "log_$start_time.log",
|
||||
"ConsoleLogLevel": "TRACE",
|
||||
"FileLogLevel": "TRACE"
|
||||
"ConsoleLevel": "TRACE",
|
||||
"Level": "TRACE"
|
||||
},
|
||||
|
||||
"DatabaseSettings": {
|
||||
"Database": {
|
||||
"Host": "localhost",
|
||||
"User": "cpl",
|
||||
"Port": 3306,
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
{
|
||||
"TimeFormatSettings": {
|
||||
"TimeFormat": {
|
||||
"DateFormat": "%Y-%m-%d",
|
||||
"TimeFormat": "%H:%M:%S",
|
||||
"DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f",
|
||||
"DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S"
|
||||
},
|
||||
|
||||
"LoggingSettings": {
|
||||
"Log": {
|
||||
"Path": "logs/",
|
||||
"Filename": "log_$start_time.log",
|
||||
"ConsoleLogLevel": "ERROR",
|
||||
"FileLogLevel": "WARN"
|
||||
"ConsoleLevel": "ERROR",
|
||||
"Level": "WARNING"
|
||||
}
|
||||
}
|
||||
@@ -1,15 +1,15 @@
|
||||
{
|
||||
"TimeFormatSettings": {
|
||||
"TimeFormat": {
|
||||
"DateFormat": "%Y-%m-%d",
|
||||
"TimeFormat": "%H:%M:%S",
|
||||
"DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f",
|
||||
"DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S"
|
||||
},
|
||||
|
||||
"LoggingSettings": {
|
||||
"Logging": {
|
||||
"Path": "logs/",
|
||||
"Filename": "log_$start_time.log",
|
||||
"ConsoleLogLevel": "ERROR",
|
||||
"FileLogLevel": "WARN"
|
||||
"ConsoleLevel": "ERROR",
|
||||
"Level": "WARN"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"WorkspaceSettings": {
|
||||
"Workspace": {
|
||||
"DefaultProject": "di",
|
||||
"Projects": {
|
||||
"di": "src/di/di.json"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"ProjectSettings": {
|
||||
"Project": {
|
||||
"Name": "di",
|
||||
"Version": {
|
||||
"Major": "0",
|
||||
@@ -25,7 +25,7 @@
|
||||
"PythonPath": {},
|
||||
"Classifiers": []
|
||||
},
|
||||
"BuildSettings": {
|
||||
"Build": {
|
||||
"ProjectType": "console",
|
||||
"SourcePath": "",
|
||||
"OutputPath": "../../dist",
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"LoggingSettings": {
|
||||
"Logging": {
|
||||
"Path": "logs/",
|
||||
"Filename": "log_$start_time.log",
|
||||
"ConsoleLogLevel": "TRACE",
|
||||
"FileLogLevel": "TRACE"
|
||||
"ConsoleLevel": "TRACE",
|
||||
"Level": "TRACE"
|
||||
}
|
||||
}
|
||||
@@ -1,63 +1,20 @@
|
||||
{
|
||||
"TimeFormatSettings": {
|
||||
"TimeFormat": {
|
||||
"DateFormat": "%Y-%m-%d",
|
||||
"TimeFormat": "%H:%M:%S",
|
||||
"DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f",
|
||||
"DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S"
|
||||
},
|
||||
"LoggingSettings": {
|
||||
"Logging": {
|
||||
"Path": "logs/",
|
||||
"Filename": "log_$start_time.log",
|
||||
"ConsoleLogLevel": "TRACE",
|
||||
"FileLogLevel": "TRACE"
|
||||
"ConsoleLevel": "TRACE",
|
||||
"Level": "TRACE"
|
||||
},
|
||||
"EMailClientSettings": {
|
||||
"EMailClient": {
|
||||
"Host": "mail.sh-edraft.de",
|
||||
"Port": "587",
|
||||
"UserName": "dev-srv@sh-edraft.de",
|
||||
"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"
|
||||
}
|
||||
}
|
||||
@@ -1,26 +1,26 @@
|
||||
{
|
||||
"TimeFormatSettings": {
|
||||
"TimeFormat": {
|
||||
"DateFormat": "%Y-%m-%d",
|
||||
"TimeFormat": "%H:%M:%S",
|
||||
"DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f",
|
||||
"DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S"
|
||||
},
|
||||
|
||||
"LoggingSettings": {
|
||||
"Logging": {
|
||||
"Path": "logs/",
|
||||
"Filename": "log_$start_time.log",
|
||||
"ConsoleLogLevel": "TRACE",
|
||||
"FileLogLevel": "TRACE"
|
||||
"ConsoleLevel": "TRACE",
|
||||
"Level": "TRACE"
|
||||
},
|
||||
|
||||
"EMailClientSettings": {
|
||||
"EMailClient": {
|
||||
"Host": "mail.sh-edraft.de",
|
||||
"Port": "587",
|
||||
"UserName": "dev-srv@sh-edraft.de",
|
||||
"Credentials": "RmBOQX1eNFYiYjgsSid3fV1nelc2WA=="
|
||||
},
|
||||
|
||||
"DatabaseSettings": {
|
||||
"Database": {
|
||||
"Host": "localhost",
|
||||
"User": "sh_cpl",
|
||||
"Password": "MHZhc0Y2bjhKc1VUMWV0Qw==",
|
||||
@@ -31,7 +31,7 @@
|
||||
"AuthPlugin": "mysql_native_password"
|
||||
},
|
||||
|
||||
"TestSettings": {
|
||||
"Test": {
|
||||
"Value": 20
|
||||
}
|
||||
}
|
||||
@@ -1,15 +1,15 @@
|
||||
{
|
||||
"TimeFormatSettings": {
|
||||
"TimeFormat": {
|
||||
"DateFormat": "%Y-%m-%d",
|
||||
"TimeFormat": "%H:%M:%S",
|
||||
"DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f",
|
||||
"DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S"
|
||||
},
|
||||
|
||||
"LoggingSettings": {
|
||||
"Logging": {
|
||||
"Path": "logs/",
|
||||
"Filename": "log_$start_time.log",
|
||||
"ConsoleLogLevel": "ERROR",
|
||||
"FileLogLevel": "WARN"
|
||||
"ConsoleLevel": "ERROR",
|
||||
"Level": "WARN"
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"ProjectSettings": {
|
||||
"Project": {
|
||||
"Name": "general",
|
||||
"Version": {
|
||||
"Major": "2021",
|
||||
@@ -30,7 +30,7 @@
|
||||
},
|
||||
"Classifiers": []
|
||||
},
|
||||
"BuildSettings": {
|
||||
"Build": {
|
||||
"ProjectType": "console",
|
||||
"SourcePath": "",
|
||||
"OutputPath": "dist",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"WorkspaceSettings": {
|
||||
"Workspace": {
|
||||
"DefaultProject": "translation",
|
||||
"Projects": {
|
||||
"translation": "src/translation/translation.json"
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
{
|
||||
"TimeFormatSettings": {
|
||||
"TimeFormat": {
|
||||
"DateFormat": "%Y-%m-%d",
|
||||
"TimeFormat": "%H:%M:%S",
|
||||
"DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f",
|
||||
"DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S"
|
||||
},
|
||||
|
||||
"LoggingSettings": {
|
||||
"Logging": {
|
||||
"Path": "logs/",
|
||||
"Filename": "log_$start_time.log",
|
||||
"ConsoleLogLevel": "ERROR",
|
||||
"FileLogLevel": "WARN"
|
||||
"ConsoleLevel": "ERROR",
|
||||
"Level": "WARN"
|
||||
},
|
||||
|
||||
"Translation": {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"ProjectSettings": {
|
||||
"Project": {
|
||||
"Name": "translation",
|
||||
"Version": {
|
||||
"Major": "0",
|
||||
@@ -25,7 +25,7 @@
|
||||
"PythonPath": {},
|
||||
"Classifiers": []
|
||||
},
|
||||
"BuildSettings": {
|
||||
"Build": {
|
||||
"ProjectType": "console",
|
||||
"SourcePath": "",
|
||||
"OutputPath": "../../dist",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"ProjectSettings": {
|
||||
"Project": {
|
||||
"Name": "unittests",
|
||||
"Version": {
|
||||
"Major": "2024",
|
||||
@@ -23,7 +23,7 @@
|
||||
"Classifiers": [],
|
||||
"DevDependencies": []
|
||||
},
|
||||
"BuildSettings": {
|
||||
"Build": {
|
||||
"ProjectType": "unittest",
|
||||
"SourcePath": "",
|
||||
"OutputPath": "../../dist",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"ProjectSettings": {
|
||||
"Project": {
|
||||
"Name": "unittest_cli",
|
||||
"Version": {
|
||||
"Major": "2024",
|
||||
@@ -24,7 +24,7 @@
|
||||
"Classifiers": [],
|
||||
"DevDependencies": []
|
||||
},
|
||||
"BuildSettings": {
|
||||
"Build": {
|
||||
"ProjectType": "library",
|
||||
"SourcePath": "",
|
||||
"OutputPath": "../../dist",
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
{
|
||||
"TimeFormatSettings": {
|
||||
"TimeFormat": {
|
||||
"DateFormat": "%Y-%m-%d",
|
||||
"TimeFormat": "%H:%M:%S",
|
||||
"DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f",
|
||||
"DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S"
|
||||
},
|
||||
"LoggingSettings": {
|
||||
"Logging": {
|
||||
"Path": "logs/$date_now/",
|
||||
"Filename": "bot.log",
|
||||
"ConsoleLogLevel": "TRACE",
|
||||
"FileLogLevel": "TRACE"
|
||||
"ConsoleLevel": "TRACE",
|
||||
"Level": "TRACE"
|
||||
},
|
||||
"DatabaseSettings": {
|
||||
"Database": {
|
||||
"Host": "localhost",
|
||||
"User": "local",
|
||||
"Password": "bG9jYWw=",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"ProjectSettings": {
|
||||
"Project": {
|
||||
"Name": "unittest_core",
|
||||
"Version": {
|
||||
"Major": "2024",
|
||||
@@ -23,7 +23,7 @@
|
||||
"Classifiers": [],
|
||||
"DevDependencies": []
|
||||
},
|
||||
"BuildSettings": {
|
||||
"Build": {
|
||||
"ProjectType": "library",
|
||||
"SourcePath": "",
|
||||
"OutputPath": "../../dist",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"ProjectSettings": {
|
||||
"Project": {
|
||||
"Name": "unittest_query",
|
||||
"Version": {
|
||||
"Major": "2024",
|
||||
@@ -24,7 +24,7 @@
|
||||
"Classifiers": [],
|
||||
"DevDependencies": []
|
||||
},
|
||||
"BuildSettings": {
|
||||
"Build": {
|
||||
"ProjectType": "library",
|
||||
"SourcePath": "",
|
||||
"OutputPath": "../../dist",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"ProjectSettings": {
|
||||
"Project": {
|
||||
"Name": "unittest_shared",
|
||||
"Version": {
|
||||
"Major": "2024",
|
||||
@@ -23,7 +23,7 @@
|
||||
"Classifiers": [],
|
||||
"DevDependencies": []
|
||||
},
|
||||
"BuildSettings": {
|
||||
"Build": {
|
||||
"ProjectType": "library",
|
||||
"SourcePath": "",
|
||||
"OutputPath": "../../dist",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"ProjectSettings": {
|
||||
"Project": {
|
||||
"Name": "unittests_translation",
|
||||
"Version": {
|
||||
"Major": "2024",
|
||||
@@ -26,7 +26,7 @@
|
||||
"PythonPath": {},
|
||||
"Classifiers": []
|
||||
},
|
||||
"BuildSettings": {
|
||||
"Build": {
|
||||
"ProjectType": "unittest",
|
||||
"SourcePath": "",
|
||||
"OutputPath": "../../dist",
|
||||
|
||||
Reference in New Issue
Block a user