From 5cc96fa12138bcef767b8a7806a7473b1cf2caa4 Mon Sep 17 00:00:00 2001 From: RedDeadDepresso <94017243+RedDeadDepresso@users.noreply.github.com> Date: Fri, 20 Sep 2024 01:26:15 +0100 Subject: [PATCH] refactor: logger --- app/common/logger.py | 29 +++++++--------- app/common/script_manager.py | 64 ++++++++++++++++++++++++++++++++++++ app/common/signal_bus.py | 8 ++++- app/common/thread_manager.py | 45 ------------------------- app/view/main_window.py | 1 - modules/fc_kks.py | 2 +- modules/install_chara.py | 2 +- modules/remove_chara.py | 2 +- script.py | 2 +- util/config.py | 2 +- util/file_manager.py | 2 +- util/logger.py | 4 +++ 12 files changed, 93 insertions(+), 70 deletions(-) create mode 100644 app/common/script_manager.py delete mode 100644 app/common/thread_manager.py create mode 100644 util/logger.py diff --git a/app/common/logger.py b/app/common/logger.py index 7996e17..f3c6533 100644 --- a/app/common/logger.py +++ b/app/common/logger.py @@ -2,22 +2,20 @@ import logging import sys from typing import Union -from app.common.signal_bus import signalBus - class Logger: """ Logger class for logging """ - def __init__(self): + def __init__(self, signalBus=None): """ :param logger_signal: Logger Box signal """ # Init logger box signal, logs and logger # logger box signal is used to output log to logger box self.logs = "" - self.logger_signal = signalBus.loggerSignal + self.logger_signal = signalBus.loggerSignal if signalBus else None self.logger = logging.getLogger("KAFFIO_Logger") formatter = logging.Formatter("%(levelname)s |%(category)s | %(message)s ") handler1 = logging.StreamHandler(stream=sys.stdout) @@ -29,11 +27,11 @@ class Logger: # Status Color: Blue, Red, Green, Orange self.statusColor = ['#2d8cf0', '#00c12b', '#ed3f14', '#f90', '#f90', '#f90', '#f90', '#f90'] # Create a list with each status padded with spaces - paddedStatus = [self.align(s) for s in self.status] + self.paddedStatus = [self.align(s) for s in self.status] # Status HTML: status self.statusHtml = [ f'{status}' - for _color, status in zip(self.statusColor, paddedStatus)] + for _color, status in zip(self.statusColor, self.paddedStatus)] def __out__(self, category: str, message: str, level: int = 1, raw_print=False) -> None: """ @@ -53,8 +51,8 @@ class Logger: # If logger box is not None, output log to logger box # else output log to console + category = self.align(category) if self.logger_signal is not None: - category = self.align(category) message = message.replace('\n', '
').replace(' ', ' ') adding = (f'''
@@ -64,18 +62,18 @@ class Logger: self.logs += adding self.logger_signal.emit(adding) else: - print(f'{self.statusHtml[level - 1]} | {category} | {message}') + print(f'{self.paddedStatus[level - 1]} | {category} | {message}') def align(self, string, maxLength=8): - space = ' ' if self.logger_signal is not None else ' ' + space = ' ' return f"{string}{space * (maxLength - len(string))}" - def colorize(self, adding): - for i, s in enumerate(self.status): + def colorize(self, adding: str): + for i, s in enumerate(self.paddedStatus): if s in adding: adding = (f'''
- {adding} + {adding.replace(' ', ' ')}
''') self.logs += adding @@ -106,7 +104,7 @@ class Logger: """ self.__out__(category, message, 3) - def skipped(self, category: str, message: str) -> None: + def warning(self, category: str, message: str) -> None: """ :param message: log message @@ -114,7 +112,7 @@ class Logger: """ self.__out__(category, message, 4) - def warning(self, category: str, message: str) -> None: + def skipped(self, category: str, message: str) -> None: """ :param message: log message @@ -159,6 +157,3 @@ class Logger: '
', raw_print=True) else: print('--------------------------------------------------------------------') - - -logger = Logger() diff --git a/app/common/script_manager.py b/app/common/script_manager.py new file mode 100644 index 0000000..617448e --- /dev/null +++ b/app/common/script_manager.py @@ -0,0 +1,64 @@ +from PySide6.QtCore import QThread, QProcess, Signal, QObject +import os + +class ScriptManager(QObject): + def __init__(self, signalBus): + super().__init__() + self.signalBus = signalBus + self.logger = signalBus.logger + + self._process = None + self._line = '--------------------------------------------------------------------' + + self.__connectSignalToSlot() + + def __connectSignalToSlot(self): + self.signalBus.startSignal.connect(self.start) + self.signalBus.stopSignal.connect(self.stop) + + def start(self): + if self._process is not None: + self.stop() + else: + if os.path.exists("script.exe"): + args = ["script.exe"] + elif os.path.exists("script.py"): + args = ["python", "script.py"] + else: + self.logger.error("No valid script found to execute.") + return + + self._process = QProcess(self) + self._process.readyReadStandardOutput.connect(self.readOutput) + self._process.readyReadStandardError.connect(self.readError) + self._process.finished.connect(self.processFinished) + + if len(args) > 1: + self._process.start(args[0], args[1:]) + else: + self._process.start(args[0]) + + def readOutput(self): + if self._process is not None: + while self._process.canReadLine(): + line = str(self._process.readLine(), encoding='utf-8').strip() + if line == self._line: + self.logger.line() + else: + self.logger.colorize(line) + + def readError(self): + if self._process is not None: + while self._process.canReadLine(): + error_line = str(self._process.readLine(), encoding='utf-8').strip() + self.logger.colorize(f"Error: {error_line}", color='red') + + def processFinished(self): + """Slot called when the process finishes.""" + self.signalBus.stopSignal.emit() + + def stop(self): + if self._process is not None: + self._process.terminate() + self._process.waitForFinished() + self._process = None diff --git a/app/common/signal_bus.py b/app/common/signal_bus.py index eacd3c6..7850b62 100644 --- a/app/common/signal_bus.py +++ b/app/common/signal_bus.py @@ -1,7 +1,8 @@ # coding: utf-8 from PySide6.QtCore import QObject, Signal from qfluentwidgets import SettingCardGroup - +from app.common.logger import Logger +from app.common.script_manager import ScriptManager class SignalBus(QObject): """ Signal bus """ @@ -16,5 +17,10 @@ class SignalBus(QObject): stopSignal = Signal() loggerSignal = Signal(str) + def __init__(self, parent: QObject | None = None) -> None: + super().__init__(parent) + self.logger = Logger(self) + self.scriptManager = ScriptManager(self) + signalBus = SignalBus() \ No newline at end of file diff --git a/app/common/thread_manager.py b/app/common/thread_manager.py deleted file mode 100644 index 65344f8..0000000 --- a/app/common/thread_manager.py +++ /dev/null @@ -1,45 +0,0 @@ -import os -import subprocess -import threading - -from app.common.signal_bus import signalBus -from app.common.logger import logger - - -class ThreadManager: - def __init__(self): - super().__init__() - self._script = None - self._line = '--------------------------------------------------------------------' - - def start(self): - if self._script is not None: - self.stop() - else: - args = [] - if os.path.exists("script.exe"): - args = ["script.exe"] - elif os.path.exists("script.py"): - args = ["python", "script.py"] - self._script = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) - threading.Thread(target=self.readOutput).start() - - def readOutput(self): - while self._script is not None: - line = self._script.stdout.readline().decode('utf-8') - if not line: - signalBus.stopSignal.emit() - elif line == self._line: - logger.line() - else: - logger.colorize(line) - - def stop(self): - if self._script is not None: - self._script.terminate() - self._script = None - - -threadManager = ThreadManager() -signalBus.startSignal.connect(threadManager.start) -signalBus.stopSignal.connect(threadManager.stop) \ No newline at end of file diff --git a/app/view/main_window.py b/app/view/main_window.py index 2dc2188..540be7a 100644 --- a/app/view/main_window.py +++ b/app/view/main_window.py @@ -12,7 +12,6 @@ from .logger_interface import LoggerInterface from .setting_interface import SettingInterface from ..common.config import ZH_SUPPORT_URL, EN_SUPPORT_URL, cfg from ..common.signal_bus import signalBus -from ..common.thread_manager import threadManager from ..common import resource from ..components.navigation_checkbox import NavigationCheckBox from ..components.navigation_action_buttons import NavigationActionButtons diff --git a/modules/fc_kks.py b/modules/fc_kks.py index ecaf24a..ab2efeb 100644 --- a/modules/fc_kks.py +++ b/modules/fc_kks.py @@ -2,7 +2,7 @@ import os import re as regex import codecs import shutil -from app.common.logger import logger +from util.logger import logger class FilterConvertKKS: def __init__(self, config, file_manager): diff --git a/modules/install_chara.py b/modules/install_chara.py index 7a06aaa..df3ecce 100644 --- a/modules/install_chara.py +++ b/modules/install_chara.py @@ -1,6 +1,6 @@ import os import codecs -from app.common.logger import logger +from util.logger import logger class InstallChara: def __init__(self, config, file_manager): diff --git a/modules/remove_chara.py b/modules/remove_chara.py index 31d3126..ba0d801 100644 --- a/modules/remove_chara.py +++ b/modules/remove_chara.py @@ -1,6 +1,6 @@ import os import codecs -from app.common.logger import logger +from util.logger import logger class RemoveChara: diff --git a/script.py b/script.py index 1cb0866..3ae88df 100644 --- a/script.py +++ b/script.py @@ -5,7 +5,7 @@ try: pass from util.config import Config - from app.common.logger import logger + from util.logger import logger from util.file_manager import FileManager from modules.install_chara import InstallChara from modules.remove_chara import RemoveChara diff --git a/util/config.py b/util/config.py index 9bfab06..f70082b 100644 --- a/util/config.py +++ b/util/config.py @@ -1,7 +1,7 @@ import sys import json import os -from app.common.logger import logger +from util.logger import logger class Config: def __init__(self, config_file): diff --git a/util/file_manager.py b/util/file_manager.py index 23a0e37..77f661b 100644 --- a/util/file_manager.py +++ b/util/file_manager.py @@ -5,7 +5,7 @@ import patoolib import customtkinter import subprocess import time -from app.common.logger import logger +from util.logger import logger class FileManager: diff --git a/util/logger.py b/util/logger.py new file mode 100644 index 0000000..90db056 --- /dev/null +++ b/util/logger.py @@ -0,0 +1,4 @@ +from app.common.logger import Logger + + +logger = Logger() \ No newline at end of file