From 1be791a8ea0fdf022571b1c602323991dbe494e8 Mon Sep 17 00:00:00 2001 From: tutosrive Date: Mon, 16 Jun 2025 16:30:50 -0500 Subject: [PATCH] Update code quality, add first layer to can run in python versions old, as 3.7 | .8 | .9 --- src/PYMD/__init__.py | 4 +-- src/PYMD/_pymd.py | 6 ++-- src/PYMD/_returning.py | 12 ------- .../db_manage.py => database/Manager.py} | 11 +++++-- src/PYMD/{db_manager => database}/__init__.py | 0 src/PYMD/interface/_initialHelp.py | 2 +- src/PYMD/interface/_interface.py | 32 ++++++++++++++----- src/PYMD/interface/_lang.py | 8 +++-- src/PYMD/interface/_osl.py | 2 +- .../{_converter.py => logic/Converter.py} | 5 +-- src/PYMD/logic/__init__.py | 0 src/PYMD/models/Returning.py | 14 ++++++++ src/PYMD/models/__init__.py | 0 .../FilesManager.py} | 2 -- src/PYMD/utils/__init__.py | 0 15 files changed, 61 insertions(+), 37 deletions(-) delete mode 100644 src/PYMD/_returning.py rename src/PYMD/{db_manager/db_manage.py => database/Manager.py} (66%) rename src/PYMD/{db_manager => database}/__init__.py (100%) rename src/PYMD/{_converter.py => logic/Converter.py} (87%) create mode 100644 src/PYMD/logic/__init__.py create mode 100644 src/PYMD/models/Returning.py create mode 100644 src/PYMD/models/__init__.py rename src/PYMD/{_files_manager.py => utils/FilesManager.py} (97%) create mode 100644 src/PYMD/utils/__init__.py diff --git a/src/PYMD/__init__.py b/src/PYMD/__init__.py index 84e53f6..0759063 100644 --- a/src/PYMD/__init__.py +++ b/src/PYMD/__init__.py @@ -1,5 +1,5 @@ -from ._files_manager import FileManager -from ._converter import Converter +from src.PYMD.utils.FilesManager import FileManager +from src.PYMD.logic.Converter import Converter from ._pymd import Pymd #from ._interface import Interface diff --git a/src/PYMD/_pymd.py b/src/PYMD/_pymd.py index 1b86690..ecf7c28 100644 --- a/src/PYMD/_pymd.py +++ b/src/PYMD/_pymd.py @@ -1,14 +1,14 @@ -from .db_manager import db_manage +from .database import Manager from chromologger import Logger as Log +# Initial paths to files log:Log = Log('./logs/log_pymd') - filename:str = '../../data/test-docx2.docx' output:str = '../../converted/' class Pymd: @staticmethod def run_app(): - db_manage.database_config() + Manager.database_config() from .interface import run run() \ No newline at end of file diff --git a/src/PYMD/_returning.py b/src/PYMD/_returning.py deleted file mode 100644 index fa9b138..0000000 --- a/src/PYMD/_returning.py +++ /dev/null @@ -1,12 +0,0 @@ -class Returning: - """To standardize function returns, you can add information in text format (String) or a dictionary (dict)""" - def __init__(self, ok:bool = True, data_str:str | None = None, data_dict:str | None = None): - """Class constructor - - :param ok: Successful operation - :param data_str: String information - :param data_dict: Dictionary information - """ - self.ok = ok # Status (operation) - self.data_str = data_str # String information - self.data_dict = data_dict # Dictionary information \ No newline at end of file diff --git a/src/PYMD/db_manager/db_manage.py b/src/PYMD/database/Manager.py similarity index 66% rename from src/PYMD/db_manager/db_manage.py rename to src/PYMD/database/Manager.py index a6d4513..adac1b1 100644 --- a/src/PYMD/db_manager/db_manage.py +++ b/src/PYMD/database/Manager.py @@ -1,12 +1,17 @@ +from sqlite3 import Cursor +from typing import Optional from sqlazo import Database from chromologger import Logger as Log -log = Log('./log.log') +log: Log = Log('./log.log') def database_config(): - db = Database('./db_manager/config.db', False) + db: Database = Database('./database/config.db', False) # Query to validate that the table exists - validate_query = db.get_data_where('config_ui', 'id == 1') + validate_query: Optional[Cursor] = db.get_data_where('config_ui', 'id == 1') + + # Means that database don't have configs + # Create initial configs if validate_query is None: cols_config: list[str] = ['id INTEGER PRIMARY KEY', 'name TEXT NOT NULL', 'value TEXT NOT NULL'] db.create_table('config_ui', cols_config) diff --git a/src/PYMD/db_manager/__init__.py b/src/PYMD/database/__init__.py similarity index 100% rename from src/PYMD/db_manager/__init__.py rename to src/PYMD/database/__init__.py diff --git a/src/PYMD/interface/_initialHelp.py b/src/PYMD/interface/_initialHelp.py index 3f4cf03..c93f89a 100644 --- a/src/PYMD/interface/_initialHelp.py +++ b/src/PYMD/interface/_initialHelp.py @@ -17,7 +17,7 @@ def __init__(self, window, app): self.load_info() def load_info(self, lang_code: str=None): - __lang = self.__lang.lang_code if lang_code == None else lang_code + __lang = self.__lang.lang_code if lang_code is None else lang_code __info_md: str = "" # This is not a translator, just a file with open(f"./interface/translations/others/IH_{__lang}.srm", "r", encoding="utf-8") as lang: diff --git a/src/PYMD/interface/_interface.py b/src/PYMD/interface/_interface.py index 71b9943..ab800ab 100644 --- a/src/PYMD/interface/_interface.py +++ b/src/PYMD/interface/_interface.py @@ -1,4 +1,6 @@ import sys +from typing import Optional + from PySide6.QtWidgets import QApplication, QMainWindow, QFileDialog, QLabel, QMessageBox from PySide6.QtGui import QIcon, QCloseEvent from PySide6.QtCore import Qt, QLocale, QSize @@ -15,7 +17,7 @@ # Feature: Change focus order (the exit dialog focus is "ok", should be "cancel") -db = Database('./db_manager/config.db', False) +db = Database('./database/config.db', False) log:Log = Log('./logs/log_interface') app = QApplication(sys.argv) @@ -45,9 +47,6 @@ def __init__(self, parent=None): @property def get_app(self) -> QApplication: return app - def closeEvent(self, event: QCloseEvent) -> None: - if not self.__closed_ui: self.__exit(event) - def __listeners(self): """Catch events and set an action""" self.ui.explorer_btn.clicked.connect(self.__open_file) @@ -55,6 +54,7 @@ def __listeners(self): self.ui.action_open_file.triggered.connect(self.__open_file) self.ui.action_exit.triggered.connect(self.__exit) self.ui.action_about.triggered.connect(self.__about) + self.ui.action_language.triggered.connect(self.__language) self.ui.action_theme.triggered.connect(self.__theme) self.ui.action_OSL.triggered.connect(self.__osl) @@ -75,7 +75,7 @@ def __open_file(self): # Feature: Show progress bar # => Can be a Label image (hide initialHelp if all ok, continue else show initialHelp again) __converter:Converter = Converter(self.__filename.absolute().__str__()) - __content:str | None = __converter.convert_file().data_str + __content: Optional[str] = __converter.convert_file().data_str if __content is not None: self.__init_help.hide() @@ -113,16 +113,27 @@ def __extensions(self) -> str: for ex in FileManager.extensions(): __allow_extensions += f'*{ex} ' return __allow_extensions.strip() - def __exit(self, event_target: QCloseEvent | None = None): + def __exit(self, event_target: Optional[QCloseEvent] = None): __result:int = self.__box_dialog(self.tr('Close Program'),self.tr('Do you want to close this program?'),{'ok': self.tr('Accept')}).exec() if __result == 1024: + # Close via "Dialog" (CTRL + W) self.__closed_ui = True self.close() else: + # When close via "Window" (Title bar "X") if type(event_target) is QCloseEvent: event_target.ignore() + def closeEvent(self, event: QCloseEvent) -> None: + """Catch Close Event (Title bar "X") + + Args: + event (QCloseEvent): Close Event from title bar "X" + """ + if not self.__closed_ui: self.__exit(event) + def __about(self): + """Show about dialog""" About(self, self.current_lang) def __language(self): @@ -140,18 +151,23 @@ def __language(self): self.ui.retranslateUi(self) lang_manager.lang_dialog.retranslateUi(lang_manager) + # Update lang UI var self.current_lang = lang_manager.lang_code + # When initial info screen is visible if self.__init_help.info.isVisible(): self.__init_help.load_info(self.current_lang) - def __box_dialog(self, title:str = '', text:str = '', buttons_cancel_ok:dict | None = None, icon:QIcon | None = None) -> QMessageBox: - """Create a box dialog""" + def __box_dialog(self, title:str = '', text:str = '', buttons_cancel_ok: Optional[dict] = None, icon: Optional[QIcon] = None) -> QMessageBox: __icon: QIcon = icon if icon is not None else self.__icon_window __dialog: QMessageBox = QMessageBox() + # Standard dialog buttons __dialog.setStandardButtons(__dialog.StandardButton.Ok | __dialog.StandardButton.Cancel) + # If not give buttons labels __buttons_txt:list[str] = [self.tr('Ok'), self.tr('Cancel')] + + # Show and set window configs __dialog.setWindowIcon(__icon) __dialog.setWindowTitle(title) __dialog.setText(text) diff --git a/src/PYMD/interface/_lang.py b/src/PYMD/interface/_lang.py index c7e9902..ccae466 100644 --- a/src/PYMD/interface/_lang.py +++ b/src/PYMD/interface/_lang.py @@ -1,10 +1,12 @@ +from typing import Optional + from PySide6.QtCore import Qt, QTranslator, QLocale from PySide6.QtWidgets import QApplication, QMainWindow from .ui_dialog_language import Ui_Lang_Dialog from PySide6.QtWidgets import QDialog from sqlazo import Database -db = Database('./db_manager/config.db', False) +db = Database('./database/config.db', False) class LanguageManager(QDialog): def __init__(self, app:QApplication=None): @@ -14,8 +16,8 @@ def __init__(self, app:QApplication=None): self.lang_file:str = '' self.__translator:QTranslator = QTranslator(app) self.__app:QApplication = app - self.parent:QMainWindow | None = None - self.lang_dialog:Ui_Lang_Dialog | None = None + self.parent: Optional[QMainWindow] = None + self.lang_dialog: Optional[Ui_Lang_Dialog] = None def set_super_parent(self, parent): self.parent = parent diff --git a/src/PYMD/interface/_osl.py b/src/PYMD/interface/_osl.py index 874ffbb..9dde1ca 100644 --- a/src/PYMD/interface/_osl.py +++ b/src/PYMD/interface/_osl.py @@ -7,7 +7,7 @@ class OSL(QDialog): def __init__(self, parent=None, lang_manager=None): super().__init__(parent) self.__lang = lang_manager - self.__osl = Ui_dialog_osl() + self.__osl: Ui_dialog_osl = Ui_dialog_osl() self.__osl.setupUi(self) self.__load_initial_content() self.show() diff --git a/src/PYMD/_converter.py b/src/PYMD/logic/Converter.py similarity index 87% rename from src/PYMD/_converter.py rename to src/PYMD/logic/Converter.py index e0c8d2d..3ca4167 100644 --- a/src/PYMD/_converter.py +++ b/src/PYMD/logic/Converter.py @@ -1,5 +1,6 @@ +from typing import Optional +from ..models.Returning import Returning from markitdown import MarkItDown, DocumentConverterResult -from src.PYMD._returning import Returning from chromologger import Logger as Log from threading import Thread import asyncio @@ -7,7 +8,7 @@ log = Log('./logs/log_converter') # Initialize logger class Converter(MarkItDown): - def __init__(self,filename:str,ep:bool|None=None,eb:bool|None=None) -> None: + def __init__(self, filename:str, ep: Optional[bool] =None, eb: Optional[bool] =None) -> None: super().__init__(enable_plugins=ep, enable_builtins=eb) self.__fn:str = filename # Path to file + extension self.content:str = '' diff --git a/src/PYMD/logic/__init__.py b/src/PYMD/logic/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/PYMD/models/Returning.py b/src/PYMD/models/Returning.py new file mode 100644 index 0000000..cf38e38 --- /dev/null +++ b/src/PYMD/models/Returning.py @@ -0,0 +1,14 @@ +from typing import Optional + +class Returning: + """To standardize function returns, you can add information in text format (String) or a dictionary (dict)""" + def __init__(self, ok:bool = True, data_str: Optional[str] = None, data_dict: Optional[str] = None): + """Class constructor + + :param ok: Successful operation + :param data_str: String information + :param data_dict: Dictionary information + """ + self.ok: bool = ok # Status (operation) + self.data_str: Optional[str] = data_str # String information + self.data_dict: Optional[dict] = data_dict # Dictionary information \ No newline at end of file diff --git a/src/PYMD/models/__init__.py b/src/PYMD/models/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/PYMD/_files_manager.py b/src/PYMD/utils/FilesManager.py similarity index 97% rename from src/PYMD/_files_manager.py rename to src/PYMD/utils/FilesManager.py index 86b15d1..e2c58d4 100644 --- a/src/PYMD/_files_manager.py +++ b/src/PYMD/utils/FilesManager.py @@ -1,7 +1,5 @@ -from src.PYMD._converter import Converter from chromologger import Logger from chromolog import Print as Log -from src.PYMD._returning import Returning from pathlib import Path log = Logger('./logs/log_file_manager') diff --git a/src/PYMD/utils/__init__.py b/src/PYMD/utils/__init__.py new file mode 100644 index 0000000..e69de29