From 78835ecc9cb0c0b9ffebdcf7a81d537aa4a0b313 Mon Sep 17 00:00:00 2001 From: Jan Lindemann Date: Tue, 17 Feb 2026 11:51:40 +0100 Subject: [PATCH] jw.pkg.cmds.distro.Cmd: Add property util Provide a property .util from Cmd, instanciated on demand from to the respective distribution directory's Util class. Signed-off-by: Jan Lindemann --- src/python/jw/pkg/cmds/distro/Cmd.py | 36 +++++++++++++++++++++------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/src/python/jw/pkg/cmds/distro/Cmd.py b/src/python/jw/pkg/cmds/distro/Cmd.py index 9911c19d..4a446b7a 100644 --- a/src/python/jw/pkg/cmds/distro/Cmd.py +++ b/src/python/jw/pkg/cmds/distro/Cmd.py @@ -4,12 +4,17 @@ import os, importlib from ..Cmd import Cmd as Base from ..CmdDistro import CmdDistro +from .backend.Util import Util class Cmd(Base): # export + from .backend.Backend import Backend + def __init__(self, parent: CmdDistro, name: str, help: str) -> None: super().__init__(parent, name, help) - self.__backend = None + self.__backend_path: str|None = None + self.__util: Util|None = None + self.__backend: Backend|None = None @property def distro_id(self) -> str: @@ -20,9 +25,8 @@ class Cmd(Base): # export return self.parent.interactive @property - def _backend(self): - if self.__backend is None: - class_name = self.__class__.__name__[3:] # Get rid of "Cmd" + def _backend_path(self): + if self.__backend_path is None: backend_id = self.parent.distro_id.lower().replace('-', '_') match backend_id: case 'ubuntu' | 'raspbian' | 'kali': @@ -31,14 +35,28 @@ class Cmd(Base): # export backend_id = 'redhat' case 'opensuse_tumbleweed': backend_id = 'suse' - module_name = ( + self.__backend_path = ( os.path.splitext(__name__)[0] + '.backend.' + backend_id + '.' - + class_name ) - module = importlib.import_module(module_name) - cls = getattr(module, class_name) - self.__backend = cls(self) + return self.__backend_path + + def _instantiate(self, name: str, *args, **kwargs): + module = importlib.import_module(self._backend_path + name) + cls = getattr(module, name) + return cls(self, *args, **kwargs) + + @property + def util(self) -> Util: + if self.__util is None: + self.__util = self._instantiate('Util') + return self.__util + + @property + def _backend(self) -> Backend: + if self.__backend is None: + name = self.__class__.__name__[3:] # Get rid of "Cmd" + self.__backend = self._instantiate(name) return self.__backend