lib.Distro.select(): Add filter parameter

Add an optional "filter: PackageFilter|None" parameter to .select(),
and if it's not None, call a new version of ._select() with it.

._select() is not abstract anylonger. Its default implementation
filters the results of ._select_by_name(), can be reimplemented by
deriving classes for better performance, but doesn't have to.

Signed-off-by: Jan Lindemann <jan@janware.com>
This commit is contained in:
Jan Lindemann 2026-04-21 11:36:21 +02:00
commit fc6af091eb
Signed by: jan
GPG key ID: 3750640C9E25DD61

View file

@ -11,6 +11,7 @@ if TYPE_CHECKING:
import abc, importlib, re import abc, importlib, re
from .PackageFilter import PackageFilter
from .ExecContext import ExecContext from .ExecContext import ExecContext
from .base import Result, InputMode from .base import Result, InputMode
from .Package import Package from .Package import Package
@ -326,8 +327,16 @@ class Distro(abc.ABC):
async def _select_by_name(self, names: Iterable[str]) -> Iterable[Package]: async def _select_by_name(self, names: Iterable[str]) -> Iterable[Package]:
pass pass
async def select(self, names: Iterable[str] = []) -> Iterable[Package]: async def _select(self, names: Iterable[str], filter: PackageFilter) -> Iterable[Package]:
return await self._select_by_name(names) assert filter, "No filter in _select()"
return [p for p in await self._select_by_name(names) if filter.match(p)]
async def select(self, names: Iterable[str] = [], filter: PackageFilter|None=None) -> Iterable[Package]:
if not filter:
filter = self.__default_pkg_filter
if not filter:
return await self._select_by_name(names)
return await self._select(names, filter)
# -- install # -- install