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 <jan@janware.com>
This commit is contained in:
Jan Lindemann 2026-04-16 11:23:05 +02:00
commit 888c0495ec
17 changed files with 50 additions and 38 deletions

View file

@ -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

View file

@ -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

View file

@ -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 = [

View file

@ -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 *

View file

@ -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):

View file

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

View file

@ -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):

View file

@ -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):

View file

@ -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):

View file

@ -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

View file

@ -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):

View file

@ -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

View file

@ -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):

View file

@ -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

View file

@ -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

View file

@ -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

View file

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