From 888c0495ec877e9eb10b7dced7ef032a2bd28af3 Mon Sep 17 00:00:00 2001 From: Jan Lindemann Date: Thu, 16 Apr 2026 11:23:05 +0200 Subject: [PATCH] lib.base: Add module Add lib.base to provide basic definitions. For now, move the definiions of Result, Input and InputMode from ExecContext into lib.base. Having to import them from the ExecContect module is too heavy-handed for those simple types. Signed-off-by: Jan Lindemann --- src/python/jw/pkg/App.py | 2 +- .../cmds/projects/CmdCanonicalizeRemotes.py | 4 +-- .../jw/pkg/cmds/projects/CmdListRepos.py | 2 +- src/python/jw/pkg/lib/Distro.py | 3 +- src/python/jw/pkg/lib/ExecContext.py | 24 ++------------- src/python/jw/pkg/lib/base.py | 30 +++++++++++++++++++ src/python/jw/pkg/lib/distros/arch/Distro.py | 2 +- .../jw/pkg/lib/distros/debian/Distro.py | 2 +- src/python/jw/pkg/lib/distros/suse/Distro.py | 2 +- src/python/jw/pkg/lib/ec/Local.py | 2 +- src/python/jw/pkg/lib/ec/SSHClient.py | 3 +- src/python/jw/pkg/lib/ec/ssh/AsyncSSH.py | 2 +- src/python/jw/pkg/lib/ec/ssh/Exec.py | 2 +- src/python/jw/pkg/lib/ec/ssh/Paramiko.py | 2 +- src/python/jw/pkg/lib/pm/dpkg.py | 2 +- src/python/jw/pkg/lib/pm/rpm.py | 2 +- src/python/jw/pkg/lib/util.py | 2 +- 17 files changed, 50 insertions(+), 38 deletions(-) create mode 100644 src/python/jw/pkg/lib/base.py diff --git a/src/python/jw/pkg/App.py b/src/python/jw/pkg/App.py index 3d14b23d..f22caf19 100644 --- a/src/python/jw/pkg/App.py +++ b/src/python/jw/pkg/App.py @@ -18,7 +18,7 @@ from enum import Enum, auto from .lib.App import App as Base from .lib.log import * from .lib.Distro import Distro -from .lib.ExecContext import InputMode +from .lib.base import InputMode # Meaning of pkg.requires.xxx variables # build: needs to be built and installed before this can be built diff --git a/src/python/jw/pkg/cmds/projects/CmdCanonicalizeRemotes.py b/src/python/jw/pkg/cmds/projects/CmdCanonicalizeRemotes.py index 3f10dda5..9ffa4560 100644 --- a/src/python/jw/pkg/cmds/projects/CmdCanonicalizeRemotes.py +++ b/src/python/jw/pkg/cmds/projects/CmdCanonicalizeRemotes.py @@ -6,13 +6,13 @@ from typing import TYPE_CHECKING from argparse import Namespace, ArgumentParser from ...lib.log import * -from ...lib.ExecContext import InputMode +from ...lib.base import InputMode from ..Cmd import Cmd from ..CmdProjects import CmdProjects from ...App import Scope if TYPE_CHECKING: - from ...lib.ExecContext import Result + from ...lib.base import Result class CmdCanonicalizeRemotes(Cmd): # export diff --git a/src/python/jw/pkg/cmds/projects/CmdListRepos.py b/src/python/jw/pkg/cmds/projects/CmdListRepos.py index e71d9528..f2a0dc7b 100644 --- a/src/python/jw/pkg/cmds/projects/CmdListRepos.py +++ b/src/python/jw/pkg/cmds/projects/CmdListRepos.py @@ -50,7 +50,7 @@ class CmdListRepos(Cmd): # export if ssh is not None: ssh.close() case 'https': - from jw.pkg.lib.ExecContext import InputMode + from jw.pkg.lib.base import InputMode cmd_input = InputMode.NonInteractive if re.match(r'https://github.com', args.base_url): curl_args = [ diff --git a/src/python/jw/pkg/lib/Distro.py b/src/python/jw/pkg/lib/Distro.py index e2987ea2..05ca946f 100644 --- a/src/python/jw/pkg/lib/Distro.py +++ b/src/python/jw/pkg/lib/Distro.py @@ -9,7 +9,8 @@ if TYPE_CHECKING: import abc, importlib -from .ExecContext import ExecContext, Result +from .ExecContext import ExecContext +from .base import Result from .Package import Package from .log import * diff --git a/src/python/jw/pkg/lib/ExecContext.py b/src/python/jw/pkg/lib/ExecContext.py index 05001741..164e1f98 100644 --- a/src/python/jw/pkg/lib/ExecContext.py +++ b/src/python/jw/pkg/lib/ExecContext.py @@ -4,34 +4,14 @@ from __future__ import annotations import abc, re, sys from enum import Enum, auto -from typing import NamedTuple, TypeAlias, TYPE_CHECKING +from typing import NamedTuple, TYPE_CHECKING if TYPE_CHECKING: from typing import Self, Type from types import TracebackType from .log import * - -class InputMode(Enum): - Interactive = auto() - NonInteractive = auto() - OptInteractive = auto() - Auto = auto() - -Input: TypeAlias = InputMode | bytes | str - -class Result(NamedTuple): - - stdout: str|None - stderr: str|None - status: int|None - - def decode(self, encoding='UTF-8', errors='replace') -> Result: - return Result( - self.stdout.decode(encoding, errors=errors) if self.stdout is not None else None, - self.stderr.decode(encoding, errors=errors) if self.stderr is not None else None, - self.status - ) +from .base import Input, InputMode, Result class ExecContext(abc.ABC): diff --git a/src/python/jw/pkg/lib/base.py b/src/python/jw/pkg/lib/base.py new file mode 100644 index 00000000..793bd09e --- /dev/null +++ b/src/python/jw/pkg/lib/base.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- + +from __future__ import annotations + +from enum import Enum, auto +from typing import NamedTuple, TypeAlias, TYPE_CHECKING + +if TYPE_CHECKING: + from typing import Type + +class InputMode(Enum): + Interactive = auto() + NonInteractive = auto() + OptInteractive = auto() + Auto = auto() + +Input: TypeAlias = InputMode | bytes | str + +class Result(NamedTuple): + + stdout: str|None + stderr: str|None + status: int|None + + def decode(self, encoding='UTF-8', errors='replace') -> Result: + return Result( + self.stdout.decode(encoding, errors=errors) if self.stdout is not None else None, + self.stderr.decode(encoding, errors=errors) if self.stderr is not None else None, + self.status + ) diff --git a/src/python/jw/pkg/lib/distros/arch/Distro.py b/src/python/jw/pkg/lib/distros/arch/Distro.py index c8bc5ecf..25072b8a 100644 --- a/src/python/jw/pkg/lib/distros/arch/Distro.py +++ b/src/python/jw/pkg/lib/distros/arch/Distro.py @@ -7,7 +7,7 @@ from ...Distro import Distro as Base if TYPE_CHECKING: from typing import Iterable - from ...ExecContext import Result + from ...base import Result from ...Package import Package class Distro(Base): diff --git a/src/python/jw/pkg/lib/distros/debian/Distro.py b/src/python/jw/pkg/lib/distros/debian/Distro.py index 5e147860..31112d32 100644 --- a/src/python/jw/pkg/lib/distros/debian/Distro.py +++ b/src/python/jw/pkg/lib/distros/debian/Distro.py @@ -11,7 +11,7 @@ from ...pm.dpkg import run_dpkg, run_dpkg_query, query_packages, list_files if TYPE_CHECKING: from typing import Iterable - from ...ExecContext import Result + from ...base import Result from ...Package import Package class Distro(Base): diff --git a/src/python/jw/pkg/lib/distros/suse/Distro.py b/src/python/jw/pkg/lib/distros/suse/Distro.py index cf33ed16..122bb7e1 100644 --- a/src/python/jw/pkg/lib/distros/suse/Distro.py +++ b/src/python/jw/pkg/lib/distros/suse/Distro.py @@ -8,7 +8,7 @@ from ...pm.rpm import run_rpm, query_packages, list_files if TYPE_CHECKING: from typing import Iterable - from ...ExecContext import Result + from ...base import Result from ...Package import Package class Distro(Base): diff --git a/src/python/jw/pkg/lib/ec/Local.py b/src/python/jw/pkg/lib/ec/Local.py index 1030a34d..cafda19a 100644 --- a/src/python/jw/pkg/lib/ec/Local.py +++ b/src/python/jw/pkg/lib/ec/Local.py @@ -3,7 +3,7 @@ import os, sys, subprocess, asyncio from ..ExecContext import ExecContext as Base -from ..ExecContext import Result +from ..base import Result from ..log import * from ..util import pretty_cmd diff --git a/src/python/jw/pkg/lib/ec/SSHClient.py b/src/python/jw/pkg/lib/ec/SSHClient.py index f34c7328..aea5b63b 100644 --- a/src/python/jw/pkg/lib/ec/SSHClient.py +++ b/src/python/jw/pkg/lib/ec/SSHClient.py @@ -7,7 +7,8 @@ from enum import Flag, auto from ..util import pretty_cmd from ..log import * -from ..ExecContext import ExecContext, Result +from ..base import Result +from ..ExecContext import ExecContext from urllib.parse import urlparse class SSHClient(ExecContext): diff --git a/src/python/jw/pkg/lib/ec/ssh/AsyncSSH.py b/src/python/jw/pkg/lib/ec/ssh/AsyncSSH.py index 52985c0a..f3c724e2 100644 --- a/src/python/jw/pkg/lib/ec/ssh/AsyncSSH.py +++ b/src/python/jw/pkg/lib/ec/ssh/AsyncSSH.py @@ -3,7 +3,7 @@ import os, sys, shlex, asyncio, asyncssh, shutil, signal from ...log import * -from ...ExecContext import Result +from ...base import Result from ..SSHClient import SSHClient as Base from .util import join_cmd diff --git a/src/python/jw/pkg/lib/ec/ssh/Exec.py b/src/python/jw/pkg/lib/ec/ssh/Exec.py index 61247e07..c434ff39 100644 --- a/src/python/jw/pkg/lib/ec/ssh/Exec.py +++ b/src/python/jw/pkg/lib/ec/ssh/Exec.py @@ -7,7 +7,7 @@ from ..SSHClient import SSHClient as Base from .util import join_cmd if TYPE_CHECKING: - from ...ExecContext import Result + from ...base import Result class Exec(Base): diff --git a/src/python/jw/pkg/lib/ec/ssh/Paramiko.py b/src/python/jw/pkg/lib/ec/ssh/Paramiko.py index c651bdd3..a381c5db 100644 --- a/src/python/jw/pkg/lib/ec/ssh/Paramiko.py +++ b/src/python/jw/pkg/lib/ec/ssh/Paramiko.py @@ -5,7 +5,7 @@ from typing import TYPE_CHECKING import paramiko # type: ignore # error: Library stubs not installed for "paramiko" from ...log import * -from ...ExecContext import Result +from ...base import Result from ..SSHClient import SSHClient as Base from .util import join_cmd diff --git a/src/python/jw/pkg/lib/pm/dpkg.py b/src/python/jw/pkg/lib/pm/dpkg.py index c65b269b..3ff2a9c0 100644 --- a/src/python/jw/pkg/lib/pm/dpkg.py +++ b/src/python/jw/pkg/lib/pm/dpkg.py @@ -7,7 +7,7 @@ from typing import Iterable, TYPE_CHECKING if TYPE_CHECKING: from ..ExecContext import ExecContext -from ..ExecContext import InputMode +from ..base import InputMode from ..util import run_cmd, run_sudo from ..Package import Package, meta_tags diff --git a/src/python/jw/pkg/lib/pm/rpm.py b/src/python/jw/pkg/lib/pm/rpm.py index 276511ab..54d1b94c 100644 --- a/src/python/jw/pkg/lib/pm/rpm.py +++ b/src/python/jw/pkg/lib/pm/rpm.py @@ -8,7 +8,7 @@ if TYPE_CHECKING: from ..ExecContext import ExecContext from ..util import run_cmd, run_sudo -from ..ExecContext import InputMode +from ..base import InputMode from ..Package import Package, meta_tags _meta_map: dict[str, str]|None = None diff --git a/src/python/jw/pkg/lib/util.py b/src/python/jw/pkg/lib/util.py index ec74e7cb..a0d3bef6 100644 --- a/src/python/jw/pkg/lib/util.py +++ b/src/python/jw/pkg/lib/util.py @@ -15,7 +15,7 @@ from urllib.parse import urlparse from enum import Enum, auto from .log import * -from .ExecContext import InputMode +from .base import InputMode class AskpassKey(Enum): Username = auto()