AnP/Python/Application/AnP.py
2026-05-28 07:24:34 +02:00

153 lines
5.9 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from typing import Self, Any, Optional, Sequence
import datetime
from re import Match as REMatch
from traceback import extract_tb as extract_traceback, format_stack as trace_format_stack
from Managers.I18NManager import I18NManager
from Managers.SettingsManager import SettingsManager
from Managers.PrintTypesManager import PrintTypesManager
from Managers.TerminalManager import TerminalManager
from Managers.ModelsManager import ModelsManager
from Managers.ControllersManager import ControllersManager
from Managers.DispatchesManager import DispatchesManager
from Managers.IndexesManager import IndexesManager
from Managers.RoutesManager import RoutesManager
from Managers.WebSocketsServerManager import WebSocketsServerManager
from Drivers.HTTPDriver import HTTPDriver
from Utils.Common import Common
from Utils.Patterns import RE
class AnP:
def __own_update(self:Self) -> None:
self.__end_print_types = [
print_type.upper() for print_type in Common.get_keys(self.settings.get("end_print_types", None, self.__end_print_types))
]
self.__root_projects_paths = Common.get_texts(self.settings.get("root_projects_paths", None, self.__root_projects_paths))
self.__print_format = self.settings.get("print_format", None, self.__print_format)
self.__exception_format = self.settings.get("exception_format", None, self.__exception_format)
def __init__(self:Self, inputs:Optional[dict[str, Any|None]|Sequence[Any|None]] = None) -> None:
self.__working:bool = True
self.settings:SettingsManager = SettingsManager(self, inputs)
self.i18n:I18NManager = I18NManager(self)
self.print_types:PrintTypesManager = PrintTypesManager(self)
self.__end_print_types:list[str] = ["UNKN", "EXCE", "ERRO"]
self.__root_projects_paths:list[str] = []
self.__print_format:str = "[{type}] {yyyy}{mm}{dd} {hh}{ii}{ss} [{line}]{file}({method}): {message}"
self.__exception_format:str = " '[{line}]{file}({method})'{lines}\n\n{exception_message}"
self.__own_update()
self.terminal:TerminalManager = TerminalManager(self)
self.models:ModelsManager = ModelsManager(self)
self.controllers:ControllersManager = ControllersManager(self)
self.dispatches:DispatchesManager = DispatchesManager(self)
self.indexes:IndexesManager = IndexesManager(self)
self.routes:RoutesManager = RoutesManager(self)
self.web_sockets_servers:WebSocketsServerManager = WebSocketsServerManager(self)
self.http_server:HTTPDriver = HTTPDriver(self)
def update(self:Self) -> None:
self.settings.update()
self.i18n.update()
self.print_types.update()
self.__own_update()
self.terminal.update()
self.models.update()
self.controllers.update()
self.dispatches.update()
self.indexes.update()
self.routes.update()
self.web_sockets_servers.update()
self.http_server.update()
def reset(self:Self) -> None:
self.settings.reset()
self.i18n.reset()
self.print_types.reset()
self.__own_update()
self.terminal.reset()
self.models.reset()
self.controllers.reset()
self.dispatches.reset()
self.indexes.reset()
self.routes.reset()
self.web_sockets_servers.reset()
self.http_server.reset()
def close(self:Self) -> None:
self.__working = False
self.web_sockets_servers.close()
self.http_server.close()
def working(self:Self) -> bool:
return self.__working
def print(self:Self,
_type:str,
message:str|Sequence[str],
inputs:Optional[dict[str, Any|None]|Sequence[Any|None]] = None,
i:int = 0
) -> None:
date:datetime.datetime = datetime.datetime.now()
own:dict[str, Any] = {
"raw_type" : _type,
"type": self.print_types.get(_type),
"message": self.i18n.get(message, inputs),
**Common.get_dictionary(inputs),
**Common.get_action_data(i + 1)
}
for key in ("year", "month", "day", "hour", "minute", "second"):
k:str = "i" if key == "minute" else key[0]
own[k] = own[key] = getattr(date, key)
own[k + k] = ("00" + str(own[key]))[-2:]
own["yyyy"] = ("0000" + str(own["year"]))[-4:]
for root_path in self.__root_projects_paths:
if own["file"].startswith(root_path):
own["file"] = own["file"][len(root_path):]
break
if any(own["type"].startswith(end_type) for end_type in self.__end_print_types) and "end" in own:
own["message"] += own["end"]
print(Common.string_variables(self.__print_format, own))
def exception(self:Self,
exception:Exception,
message:str|Sequence[str],
inputs:Optional[dict[str, Any|None]|Sequence[Any|None]] = None,
i:int = 0
) -> None:
lines:list[str] = extract_traceback(exception.__traceback__).format()
matches:REMatch = RE.EXCEPTION.match(lines[-1])
data:dict[str, Any|None] = {
**Common.get_dictionary(inputs),
"lines" : "",
"exception_message" : str(exception),
"method" : matches.group(3),
"line" : matches.group(2),
"file" : matches.group(1)
}
block:str
j:int
for root_path in self.__root_projects_paths:
if data["file"] and data["file"].startswith(root_path):
data["file"] = data["file"][len(root_path):]
for j, block in enumerate(trace_format_stack()[:-2] + lines):
if block:
data["lines"] += "\n " + str(j) + " - " + RE.NEW_LINE.split(block.strip())[0]
data["end"] = Common.string_variables(self.__exception_format, data)
message and self.print("exception", message, data, i + 2)