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
from .PackageFilter import PackageFilter
from .ExecContext import ExecContext
from .base import Result, InputMode
from .Package import Package
@ -326,8 +327,16 @@ class Distro(abc.ABC):
async def _select_by_name(self, names: Iterable[str]) -> Iterable[Package]:
pass
async def select(self, names: Iterable[str] = []) -> Iterable[Package]:
return await self._select_by_name(names)
async def _select(self, names: Iterable[str], filter: PackageFilter) -> Iterable[Package]:
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