CXCV/Python/Application/CXCV.py

137 lines
5.0 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from os.path import dirname as directory_name, abspath as path_absolute
ROOT_PATH:str = directory_name(path_absolute(__file__))
from typing import Self, Any, Optional
from datetime import datetime
from re import Match as REMatch
from Drivers.FilesDriver import FilesDriver
from Managers.SettingsManager import SettingsManager
from Managers.I18NManager import I18NManager
from Managers.TerminalManager import TerminalManager
from Managers.ModelsManager import ModelsManager
from Managers.DatabasesManager import DatabasesManager
from Managers.ControllersManager import ControllersManager
from Managers.ProceduresManager import ProceduresManager
from Controllers.LogsController import LogsController
from Utils.Utils import Utils
from Utils.Patterns import RE
class CXCV:
def __init__(self:Self,
inputs:Optional[dict[str, Any|None]|list[Any|None]|tuple[Any|None, ...]] = None
) -> None:
project_root_path:str = ROOT_PATH[:ROOT_PATH.index("/CXCV") + 6]
self.__print_format:str = "[{yyyy}-{mm}-{dd} {hh}:{ii}:{ss}] [{type}] {message}"
self.__exception_format:str = "\nException in '{file}({method})[{line}]'{lines}\n\n{exception_message}"
self.working:bool = True
self.files:FilesDriver = FilesDriver(self, ROOT_PATH)
self.settings:SettingsManager = SettingsManager(self, inputs)
self.__print_format = self.settings.get("print_format", None, self.__print_format)
self.__exception_format = self.settings.get("exception_format", None, self.__exception_format)
self.i18n:I18NManager = I18NManager(self)
self.terminal:TerminalManager = TerminalManager(self)
self.models:ModelsManager = ModelsManager(self)
self.databases:DatabasesManager = DatabasesManager(self)
self.controllers:ControllersManager = ControllersManager(self)
self.procedures:ProceduresManager = ProceduresManager(self)
self.terminal.start()
def close(self:Self) -> None:
self.working = False
def print(self:Self,
_type:str,
string:str,
inputs:Optional[dict[str, Any|None]|list[Any|None]|tuple[Any|None, ...]] = None,
i:int = 0
) -> None:
date:datetime = datetime.now()
own:dict[str, Any|None] = {
"raw_type" : _type,
"type" : _type.upper()[:4],
"i18n" : Utils.get_strings(string)[0],
"message" : self.i18n.get(string, inputs),
**Utils.get_action_data(i + 1),
**Utils.get_dictionary(inputs)
}
try:
own["file"] = own["file"][str(own["file"]).index("/CXCV/"):]
except Exception as exception:
pass
while len(own["type"]) < 4:
own["type"] = " " + own["type"] if len(own["type"]) % 2 else own["type"] + " "
for key in ("year", "month", "day", "hour", "minute", "second"):
k:str = key[0] if key != "minute" else "i"
own[k] = own[key] = getattr(date, key)
own[k + k] = ("00" + str(own[key] % 100))[-2:]
own["yyyy"] = ("0000" + str(own["year"]))[-4:]
if "end" in own:
own["message"] += own["end"]
print(Utils.string_variables(self.__print_format, own))
if not self.controllers:
return
controller:LogsController|None = self.controllers.get(
LogsController, "logs"
)
controller and own["type"] != "EXCE" and controller.set_log(own["i18n"], (
1 if own["type"] == "EXCE" else
2 if own["type"] == "WARN" else
3 if own["type"] == "ERRO" else
0), inputs or {}, i)
def exception(self,
exception:Exception,
message:Optional[str|list|tuple] = None,
inputs:Optional[dict[str, Any]|list|tuple] = None,
i:Optional[int] = 0
) -> None:
lines:list[str]|None = Utils.get_trace(exception)
line_matches:REMatch[str]|None = RE.EXCEPTION.match(lines[-1])
data:dict[str, Any|None] = {
**{key : value for subset in (inputs if isinstance(inputs, (list, tuple)) else (inputs,)) for key, value in (subset if isinstance(subset, dict) else {}).items()},
**Utils.get_action_data(1),
"lines" : "".join("\n " + RE.BREAK_LINES.split(line.strip())[0] for line in lines),
"exception_message" : str(exception),
"method" : line_matches.group(3),
"line" : line_matches.group(2),
"file" : line_matches.group(1)
}
data["end"] = Utils.string_variables(self.__exception_format, data)
if message:
self.print("exception", message, data, None, i + 1)
if not self.controllers:
return
controller:LogsController|None = self.controllers.get(
LogsController, "logs"
)
controller and controller.set_exception(exception, message, inputs or {}, None, i)