From 4cbdf1432d63815d76e3792b58ffc8865009964e Mon Sep 17 00:00:00 2001 From: itdominator <1itdominator@gmail.com> Date: Fri, 15 Mar 2024 20:20:52 -0500 Subject: [PATCH] Made match mostly new template patterns --- src/__builtins__.py | 14 +++--- src/__main__.py | 51 +++++++++---------- src/app.py | 51 ++++++++++++------- src/core/window.py | 5 +- src/{utils => libs}/__init__.py | 0 src/{utils => libs}/debugging.py | 0 src/{utils => libs}/endpoint_registry.py | 0 src/{utils => libs}/event_system.py | 0 src/{utils => libs}/ipc_server.py | 8 +-- src/{utils => libs}/keybindings.py | 0 src/{utils => libs}/logger.py | 0 src/{utils => libs}/settings/__init__.py | 0 src/{utils => libs}/settings/settings.py | 12 ++--- src/libs/settings/start_check_mixin.py | 63 ++++++++++++++++++++++++ src/{utils => libs}/singleton.py | 0 src/utils/settings/start_check_mixin.py | 51 ------------------- 16 files changed, 143 insertions(+), 112 deletions(-) rename src/{utils => libs}/__init__.py (100%) rename src/{utils => libs}/debugging.py (100%) rename src/{utils => libs}/endpoint_registry.py (100%) rename src/{utils => libs}/event_system.py (100%) rename src/{utils => libs}/ipc_server.py (94%) rename src/{utils => libs}/keybindings.py (100%) rename src/{utils => libs}/logger.py (100%) rename src/{utils => libs}/settings/__init__.py (100%) rename src/{utils => libs}/settings/settings.py (95%) create mode 100644 src/libs/settings/start_check_mixin.py rename src/{utils => libs}/singleton.py (100%) delete mode 100644 src/utils/settings/start_check_mixin.py diff --git a/src/__builtins__.py b/src/__builtins__.py index 32770b2..1b6f792 100644 --- a/src/__builtins__.py +++ b/src/__builtins__.py @@ -5,11 +5,11 @@ import threading # Lib imports # Application imports -from utils.event_system import EventSystem -from utils.endpoint_registry import EndpointRegistry -from utils.keybindings import Keybindings -from utils.logger import Logger -from utils.settings import Settings +from libs.event_system import EventSystem +from libs.endpoint_registry import EndpointRegistry +from libs.keybindings import Keybindings +from libs.logger import Logger +from libs.settings import Settings @@ -35,7 +35,7 @@ def sizeof_fmt_def(num, suffix="B"): # NOTE: Just reminding myself we can add to builtins two different ways... # __builtins__.update({"event_system": Builtins()}) -builtins.app_name = "Mirage2" +builtins.APP_NAME = "Mirage2" builtins.keybindings = Keybindings() builtins.event_system = EventSystem() builtins.endpoint_registry = EndpointRegistry() @@ -47,4 +47,4 @@ builtins.logger = Logger(settings.get_home_config_path(), \ builtins.threaded = threaded_wrapper builtins.daemon_threaded = daemon_threaded_wrapper builtins.sizeof_fmt = sizeof_fmt_def -builtins.event_sleep_time = 0.05 +builtins.event_sleep_time = 0.05 \ No newline at end of file diff --git a/src/__main__.py b/src/__main__.py index bbb906f..8a97ee0 100644 --- a/src/__main__.py +++ b/src/__main__.py @@ -10,9 +10,6 @@ import tracemalloc tracemalloc.start() # Lib imports -import gi -gi.require_version('Gtk', '3.0') -from gi.repository import Gtk # Application imports from __builtins__ import * @@ -20,33 +17,37 @@ from app import Application +def main(args, unknownargs): + setproctitle(f'{APP_NAME}') + + if args.debug == "true": + settings_manager.set_debug(True) + + if args.trace_debug == "true": + settings_manager.set_trace_debug(True) + + settings.do_dirty_start_check() + Application(args, unknownargs) + + if __name__ == "__main__": ''' Set process title, get arguments, and create GTK main thread. ''' + parser = argparse.ArgumentParser() + # Add long and short arguments + parser.add_argument("--debug", "-d", default="false", help="Do extra console messaging.") + parser.add_argument("--trace-debug", "-td", default="false", help="Disable saves, ignore IPC lock, do extra console messaging.") + parser.add_argument("--no-plugins", "-np", default="false", help="Do not load plugins.") + + parser.add_argument("--file", "-f", default="default", help="JUST SOME FILE ARG.") + + # Read arguments (If any...) + args, unknownargs = parser.parse_known_args() + try: - setproctitle(f'{app_name}') faulthandler.enable() # For better debug info - - parser = argparse.ArgumentParser() - # Add long and short arguments - parser.add_argument("--debug", "-d", default="false", help="Do extra console messaging.") - parser.add_argument("--trace-debug", "-td", default="false", help="Disable saves, ignore IPC lock, do extra console messaging.") - parser.add_argument("--no-plugins", "-np", default="false", help="Do not load plugins.") - parser.add_argument("--file", "-f", default=None, help="Pass an Image file directly.") - - # Read arguments (If any...) - args, unknownargs = parser.parse_known_args() - - if args.debug == "true": - settings.set_debug(True) - - if args.trace_debug == "true": - settings.set_trace_debug(True) - - settings.do_dirty_start_check() - Application(args, unknownargs) - Gtk.main() + main(args, unknownargs) except Exception as e: traceback.print_exc() - quit() + quit() \ No newline at end of file diff --git a/src/app.py b/src/app.py index cf3bc37..d28ec3f 100644 --- a/src/app.py +++ b/src/app.py @@ -5,37 +5,54 @@ import os # Lib imports # Application imports -from utils.debugging import debug_signal_handler -from utils.ipc_server import IPCServer +from libs.debugging import debug_signal_handler +from libs.ipc_server import IPCServer from core.window import Window + class AppLaunchException(Exception): ... -class Application(IPCServer): +class Application: """ docstring for Application. """ def __init__(self, args, unknownargs): super(Application, self).__init__() + if not settings.is_trace_debug(): - try: - self.create_ipc_listener() - except Exception: - ... + self.load_ipc(args, unknownargs) - if not self.is_ipc_alive: - collection = unknownargs + [args.file] if args.file and os.path.isfile(args.file) else unknownargs - for arg in collection: - path = arg.replace("file://", "") - if os.path.isfile(path): - message = f"FILE|{path}" - self.send_ipc_message(message) + self.setup_debug_hook() + Window(args, unknownargs).main() - raise AppLaunchException(f"{app_name} IPC Server Exists: Will send path(s) to it and close...") + def load_ipc(self, args, unknownargs): + ipc_server = IPCServer() + self.ipc_realization_check(ipc_server) + + if not ipc_server.is_ipc_alive: + for arg in unknownargs + [args.new_tab,]: + if os.path.isfile(arg): + message = f"FILE|{arg}" + ipc_server.send_ipc_message(message) + + raise AppLaunchException(f"{APP_NAME} IPC Server Exists: Have sent path(s) to it and closing...") + + def ipc_realization_check(self, ipc_server): + try: + ipc_server.create_ipc_listener() + except Exception: + ipc_server.send_test_ipc_message() + + try: + ipc_server.create_ipc_listener() + except Exception as e: + ... + + def setup_debug_hook(self): try: # kill -SIGUSR2 from Linux/Unix or SIGBREAK signal from Windows signal.signal( @@ -44,6 +61,4 @@ class Application(IPCServer): ) except ValueError: # Typically: ValueError: signal only works in main thread - ... - - Window(args, unknownargs) + ... \ No newline at end of file diff --git a/src/core/window.py b/src/core/window.py index ea88962..37b28d8 100644 --- a/src/core/window.py +++ b/src/core/window.py @@ -42,7 +42,7 @@ class Window(Gtk.ApplicationWindow): def _setup_styling(self): - self.set_title(f"{app_name}") + self.set_title(f"{APP_NAME}") self.set_icon_from_file( settings.get_window_icon() ) self.set_gravity(5) # 5 = CENTER self.set_position(1) # 1 = CENTER, 4 = CENTER_ALWAYS @@ -98,3 +98,6 @@ class Window(Gtk.ApplicationWindow): settings.clear_pid() time.sleep(event_sleep_time) Gtk.main_quit() + + def main(self): + Gtk.main() \ No newline at end of file diff --git a/src/utils/__init__.py b/src/libs/__init__.py similarity index 100% rename from src/utils/__init__.py rename to src/libs/__init__.py diff --git a/src/utils/debugging.py b/src/libs/debugging.py similarity index 100% rename from src/utils/debugging.py rename to src/libs/debugging.py diff --git a/src/utils/endpoint_registry.py b/src/libs/endpoint_registry.py similarity index 100% rename from src/utils/endpoint_registry.py rename to src/libs/endpoint_registry.py diff --git a/src/utils/event_system.py b/src/libs/event_system.py similarity index 100% rename from src/utils/event_system.py rename to src/libs/event_system.py diff --git a/src/utils/ipc_server.py b/src/libs/ipc_server.py similarity index 94% rename from src/utils/ipc_server.py rename to src/libs/ipc_server.py index 662fc89..e56cd1a 100644 --- a/src/utils/ipc_server.py +++ b/src/libs/ipc_server.py @@ -13,17 +13,17 @@ from .singleton import Singleton class IPCServer(Singleton): - """ Create a listener so that other {app_name} instances send requests back to existing instance. """ + """ Create a listener so that other {APP_NAME} instances send requests back to existing instance. """ def __init__(self, ipc_address: str = '127.0.0.1', conn_type: str = "socket"): self.is_ipc_alive = False self._ipc_port = 4848 self._ipc_address = ipc_address self._conn_type = conn_type - self._ipc_authkey = b'' + bytes(f'{app_name}-ipc', 'utf-8') + self._ipc_authkey = b'' + bytes(f'{APP_NAME}-ipc', 'utf-8') self._ipc_timeout = 15.0 if conn_type == "socket": - self._ipc_address = f'/tmp/{app_name}-ipc.sock' + self._ipc_address = f'/tmp/{APP_NAME}-ipc.sock' elif conn_type == "full_network": self._ipc_address = '0.0.0.0' elif conn_type == "full_network_unsecured": @@ -111,4 +111,4 @@ class IPCServer(Singleton): except ConnectionRefusedError as e: print("Connection refused...") except Exception as e: - print(repr(e)) + print(repr(e)) \ No newline at end of file diff --git a/src/utils/keybindings.py b/src/libs/keybindings.py similarity index 100% rename from src/utils/keybindings.py rename to src/libs/keybindings.py diff --git a/src/utils/logger.py b/src/libs/logger.py similarity index 100% rename from src/utils/logger.py rename to src/libs/logger.py diff --git a/src/utils/settings/__init__.py b/src/libs/settings/__init__.py similarity index 100% rename from src/utils/settings/__init__.py rename to src/libs/settings/__init__.py diff --git a/src/utils/settings/settings.py b/src/libs/settings/settings.py similarity index 95% rename from src/utils/settings/settings.py rename to src/libs/settings/settings.py index 2756d49..997658b 100644 --- a/src/utils/settings/settings.py +++ b/src/libs/settings/settings.py @@ -21,8 +21,8 @@ class Settings(StartCheckMixin, Singleton): def __init__(self): self._SCRIPT_PTH = os.path.dirname(os.path.realpath(__file__)) self._USER_HOME = os.path.expanduser('~') - self._HOME_CONFIG_PATH = f"{self._USER_HOME}/.config/{app_name.lower()}" - self._USR_PATH = f"/usr/share/{app_name.lower()}" + self._HOME_CONFIG_PATH = f"{self._USER_HOME}/.config/{APP_NAME.lower()}" + self._USR_PATH = f"/usr/share/{APP_NAME.lower()}" self._USR_CONFIG_FILE = f"{self._USR_PATH}/settings.json" self._PLUGINS_PATH = f"{self._HOME_CONFIG_PATH}/plugins" @@ -31,10 +31,10 @@ class Settings(StartCheckMixin, Singleton): self._GLADE_FILE = f"{self._HOME_CONFIG_PATH}/Main_Window.glade" self._CSS_FILE = f"{self._HOME_CONFIG_PATH}/stylesheet.css" self._KEY_BINDINGS_FILE = f"{self._HOME_CONFIG_PATH}/key-bindings.json" - self._PID_FILE = f"{self._HOME_CONFIG_PATH}/{app_name.lower()}.pid" + self._PID_FILE = f"{self._HOME_CONFIG_PATH}/{APP_NAME.lower()}.pid" self._UI_WIDEGTS_PATH = f"{self._HOME_CONFIG_PATH}/ui_widgets" self._CONTEXT_MENU = f"{self._HOME_CONFIG_PATH}/contexct_menu.json" - self._WINDOW_ICON = f"{self._DEFAULT_ICONS}/{app_name.lower()}.png" + self._WINDOW_ICON = f"{self._DEFAULT_ICONS}/{APP_NAME.lower()}.png" if not os.path.exists(self._HOME_CONFIG_PATH): os.mkdir(self._HOME_CONFIG_PATH) @@ -65,7 +65,7 @@ class Settings(StartCheckMixin, Singleton): if not os.path.exists(self._CSS_FILE): raise MissingConfigError("Unable to find the application Stylesheet file.") if not os.path.exists(self._WINDOW_ICON): - self._WINDOW_ICON = f"{self._USR_PATH}/icons/{app_name.lower()}.png" + self._WINDOW_ICON = f"{self._USR_PATH}/icons/{APP_NAME.lower()}.png" if not os.path.exists(self._WINDOW_ICON): raise MissingConfigError("Unable to find the application icon.") if not os.path.exists(self._UI_WIDEGTS_PATH): @@ -186,4 +186,4 @@ class Settings(StartCheckMixin, Singleton): def save_settings(self): with open(self._CONFIG_FILE, 'w') as outfile: - json.dump(self._settings, outfile, separators=(',', ':'), indent=4) + json.dump(self._settings, outfile, separators=(',', ':'), indent=4) \ No newline at end of file diff --git a/src/libs/settings/start_check_mixin.py b/src/libs/settings/start_check_mixin.py new file mode 100644 index 0000000..9221e11 --- /dev/null +++ b/src/libs/settings/start_check_mixin.py @@ -0,0 +1,63 @@ +# Python imports +import os +import json +import inspect + +# Lib imports + +# Application imports + + + + +class StartCheckMixin: + def is_dirty_start(self) -> bool: + return self._dirty_start + + def clear_pid(self): + if not self.is_trace_debug(): + self._clean_pid() + + def do_dirty_start_check(self): + if self.is_trace_debug(): + pid = os.getpid() + self._print_pid(pid) + return + + if os.path.exists(self._PID_FILE): + with open(self._PID_FILE, "r") as f: + pid = f.readline().strip() + if pid not in ("", None): + if self.is_pid_alive( int(pid) ): + print("PID file exists and PID is alive... Letting downstream errors (sans debug args) handle app closure propigation.") + return + + self._write_new_pid() + + """ Check For the existence of a unix pid. """ + def is_pid_alive(self, pid): + print(f"PID Found: {pid}") + + try: + os.kill(pid, 0) + except OSError: + print(f"{APP_NAME} PID file exists but PID is irrelevant; starting dirty...") + self._dirty_start = True + return False + + return True + + def _write_new_pid(self): + pid = os.getpid() + self._write_pid(pid) + self._print_pid(pid) + + def _print_pid(self, pid): + print(f"{APP_NAME} PID: {pid}") + + def _clean_pid(self): + os.unlink(self._PID_FILE) + + def _write_pid(self, pid): + with open(self._PID_FILE, "w") as _pid: + _pid.write(f"{pid}") diff --git a/src/utils/singleton.py b/src/libs/singleton.py similarity index 100% rename from src/utils/singleton.py rename to src/libs/singleton.py diff --git a/src/utils/settings/start_check_mixin.py b/src/utils/settings/start_check_mixin.py deleted file mode 100644 index 688da36..0000000 --- a/src/utils/settings/start_check_mixin.py +++ /dev/null @@ -1,51 +0,0 @@ -# Python imports -import os -import json -import inspect - -# Lib imports - -# Application imports - - - - -class StartCheckMixin: - def is_dirty_start(self) -> bool: return self._dirty_start - def clear_pid(self): self._clean_pid() - - def do_dirty_start_check(self): - if not os.path.exists(self._PID_FILE): - self._write_new_pid() - else: - with open(self._PID_FILE, "r") as _pid: - pid = _pid.readline().strip() - if pid not in ("", None): - self._check_alive_status(int(pid)) - else: - self._write_new_pid() - - """ Check For the existence of a unix pid. """ - def _check_alive_status(self, pid): - print(f"PID Found: {pid}") - try: - os.kill(pid, 0) - except OSError: - print(f"{app_name} is starting dirty...") - self._dirty_start = True - self._write_new_pid() - return - - print("PID is alive... Let downstream errors (sans debug args) handle app closure propigation.") - - def _write_new_pid(self): - pid = os.getpid() - self._write_pid(pid) - print(f"{app_name} PID: {pid}") - - def _clean_pid(self): - os.unlink(self._PID_FILE) - - def _write_pid(self, pid): - with open(self._PID_FILE, "w") as _pid: - _pid.write(f"{pid}")