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.App import App as Base
from .lib.log import * from .lib.log import *
from .lib.Distro import Distro from .lib.Distro import Distro
from .lib.ExecContext import InputMode from .lib.base import InputMode
# Meaning of pkg.requires.xxx variables # Meaning of pkg.requires.xxx variables
# build: needs to be built and installed before this can be built # 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 argparse import Namespace, ArgumentParser
from ...lib.log import * from ...lib.log import *
from ...lib.ExecContext import InputMode from ...lib.base import InputMode
from ..Cmd import Cmd from ..Cmd import Cmd
from ..CmdProjects import CmdProjects from ..CmdProjects import CmdProjects
from ...App import Scope from ...App import Scope
if TYPE_CHECKING: if TYPE_CHECKING:
from ...lib.ExecContext import Result from ...lib.base import Result
class CmdCanonicalizeRemotes(Cmd): # export class CmdCanonicalizeRemotes(Cmd): # export

View file

@ -50,7 +50,7 @@ class CmdListRepos(Cmd): # export
if ssh is not None: if ssh is not None:
ssh.close() ssh.close()
case 'https': case 'https':
from jw.pkg.lib.ExecContext import InputMode from jw.pkg.lib.base import InputMode
cmd_input = InputMode.NonInteractive cmd_input = InputMode.NonInteractive
if re.match(r'https://github.com', args.base_url): if re.match(r'https://github.com', args.base_url):
curl_args = [ curl_args = [

View file

@ -9,7 +9,8 @@ if TYPE_CHECKING:
import abc, importlib import abc, importlib
from .ExecContext import ExecContext, Result from .ExecContext import ExecContext
from .base import Result
from .Package import Package from .Package import Package
from .log import * from .log import *

View file

@ -4,34 +4,14 @@ from __future__ import annotations
import abc, re, sys import abc, re, sys
from enum import Enum, auto from enum import Enum, auto
from typing import NamedTuple, TypeAlias, TYPE_CHECKING from typing import NamedTuple, TYPE_CHECKING
if TYPE_CHECKING: if TYPE_CHECKING:
from typing import Self, Type from typing import Self, Type
from types import TracebackType from types import TracebackType
from .log import * from .log import *
from .base import Input, InputMode, Result
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
)
class ExecContext(abc.ABC): 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: if TYPE_CHECKING:
from typing import Iterable from typing import Iterable
from ...ExecContext import Result from ...base import Result
from ...Package import Package from ...Package import Package
class Distro(Base): 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: if TYPE_CHECKING:
from typing import Iterable from typing import Iterable
from ...ExecContext import Result from ...base import Result
from ...Package import Package from ...Package import Package
class Distro(Base): class Distro(Base):

View file

@ -8,7 +8,7 @@ from ...pm.rpm import run_rpm, query_packages, list_files
if TYPE_CHECKING: if TYPE_CHECKING:
from typing import Iterable from typing import Iterable
from ...ExecContext import Result from ...base import Result
from ...Package import Package from ...Package import Package
class Distro(Base): class Distro(Base):

View file

@ -3,7 +3,7 @@
import os, sys, subprocess, asyncio import os, sys, subprocess, asyncio
from ..ExecContext import ExecContext as Base from ..ExecContext import ExecContext as Base
from ..ExecContext import Result from ..base import Result
from ..log import * from ..log import *
from ..util import pretty_cmd from ..util import pretty_cmd

View file

@ -7,7 +7,8 @@ from enum import Flag, auto
from ..util import pretty_cmd from ..util import pretty_cmd
from ..log import * from ..log import *
from ..ExecContext import ExecContext, Result from ..base import Result
from ..ExecContext import ExecContext
from urllib.parse import urlparse from urllib.parse import urlparse
class SSHClient(ExecContext): class SSHClient(ExecContext):

View file

@ -3,7 +3,7 @@
import os, sys, shlex, asyncio, asyncssh, shutil, signal import os, sys, shlex, asyncio, asyncssh, shutil, signal
from ...log import * from ...log import *
from ...ExecContext import Result from ...base import Result
from ..SSHClient import SSHClient as Base from ..SSHClient import SSHClient as Base
from .util import join_cmd from .util import join_cmd

View file

@ -7,7 +7,7 @@ from ..SSHClient import SSHClient as Base
from .util import join_cmd from .util import join_cmd
if TYPE_CHECKING: if TYPE_CHECKING:
from ...ExecContext import Result from ...base import Result
class Exec(Base): 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" import paramiko # type: ignore # error: Library stubs not installed for "paramiko"
from ...log import * from ...log import *
from ...ExecContext import Result from ...base import Result
from ..SSHClient import SSHClient as Base from ..SSHClient import SSHClient as Base
from .util import join_cmd from .util import join_cmd

View file

@ -7,7 +7,7 @@ from typing import Iterable, TYPE_CHECKING
if TYPE_CHECKING: if TYPE_CHECKING:
from ..ExecContext import ExecContext from ..ExecContext import ExecContext
from ..ExecContext import InputMode from ..base import InputMode
from ..util import run_cmd, run_sudo from ..util import run_cmd, run_sudo
from ..Package import Package, meta_tags from ..Package import Package, meta_tags

View file

@ -8,7 +8,7 @@ if TYPE_CHECKING:
from ..ExecContext import ExecContext from ..ExecContext import ExecContext
from ..util import run_cmd, run_sudo from ..util import run_cmd, run_sudo
from ..ExecContext import InputMode from ..base import InputMode
from ..Package import Package, meta_tags from ..Package import Package, meta_tags
_meta_map: dict[str, str]|None = None _meta_map: dict[str, str]|None = None

View file

@ -15,7 +15,7 @@ from urllib.parse import urlparse
from enum import Enum, auto from enum import Enum, auto
from .log import * from .log import *
from .ExecContext import InputMode from .base import InputMode
class AskpassKey(Enum): class AskpassKey(Enum):
Username = auto() Username = auto()