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()