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