From b9b012be5384b2087c0e5889332f2a530498581b Mon Sep 17 00:00:00 2001 From: Evgeniy Alekseev Date: Mon, 5 Jul 2021 22:08:04 +0300 Subject: [PATCH] handle `provides` list --- src/ahriman/application/application.py | 6 ++++-- src/ahriman/core/alpm/pacman.py | 10 ++++++---- src/ahriman/models/package_description.py | 3 +++ tests/ahriman/core/alpm/test_pacman.py | 7 +++++++ tests/ahriman/models/conftest.py | 1 + 5 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/ahriman/application/application.py b/src/ahriman/application/application.py index 8272143e..a88b85b0 100644 --- a/src/ahriman/application/application.py +++ b/src/ahriman/application/application.py @@ -65,8 +65,10 @@ class Application: """ known_packages: Set[str] = set() # local set - for package in self.repository.packages(): - known_packages.update(package.packages.keys()) + for base in self.repository.packages(): + for package, properties in base.packages.items(): + known_packages.add(package) + known_packages.update(properties.provides) known_packages.update(self.repository.pacman.all_packages()) return known_packages diff --git a/src/ahriman/core/alpm/pacman.py b/src/ahriman/core/alpm/pacman.py index 93fad400..edf3530b 100644 --- a/src/ahriman/core/alpm/pacman.py +++ b/src/ahriman/core/alpm/pacman.py @@ -18,7 +18,7 @@ # along with this program. If not, see . # from pyalpm import Handle # type: ignore -from typing import List, Set +from typing import Set from ahriman.core.configuration import Configuration @@ -40,13 +40,15 @@ class Pacman: for repository in configuration.getlist("alpm", "repositories"): self.handle.register_syncdb(repository, 0) # 0 is pgp_level - def all_packages(self) -> List[str]: + def all_packages(self) -> Set[str]: """ get list of packages known for alpm :return: list of package names """ result: Set[str] = set() for database in self.handle.get_syncdbs(): - result.update({package.name for package in database.pkgcache}) + for package in database.pkgcache: + result.add(package.name) # package itself + result.update(package.provides) # provides list for meta-packages - return list(result) + return result diff --git a/src/ahriman/models/package_description.py b/src/ahriman/models/package_description.py index 91d9ebe9..dbd9ff6f 100644 --- a/src/ahriman/models/package_description.py +++ b/src/ahriman/models/package_description.py @@ -38,6 +38,7 @@ class PackageDescription: :ivar groups: package groups :ivar installed_size: package installed size :ivar licenses: package licenses list + :ivar provides: list of provided packages :ivar url: package url """ @@ -50,6 +51,7 @@ class PackageDescription: groups: List[str] = field(default_factory=list) installed_size: Optional[int] = None licenses: List[str] = field(default_factory=list) + provides: List[str] = field(default_factory=list) url: Optional[str] = None @property @@ -89,4 +91,5 @@ class PackageDescription: groups=package.groups, installed_size=package.isize, licenses=package.licenses, + provides=package.provides, url=package.url) diff --git a/tests/ahriman/core/alpm/test_pacman.py b/tests/ahriman/core/alpm/test_pacman.py index 030fe1a4..ce14c7c3 100644 --- a/tests/ahriman/core/alpm/test_pacman.py +++ b/tests/ahriman/core/alpm/test_pacman.py @@ -8,3 +8,10 @@ def test_all_packages(pacman: Pacman) -> None: packages = pacman.all_packages() assert packages assert "pacman" in packages + + +def test_all_packages_with_provides(pacman: Pacman) -> None: + """ + package list must contain provides packages + """ + assert 'sh' in pacman.all_packages() diff --git a/tests/ahriman/models/conftest.py b/tests/ahriman/models/conftest.py index 80a7b8d8..2d268858 100644 --- a/tests/ahriman/models/conftest.py +++ b/tests/ahriman/models/conftest.py @@ -69,5 +69,6 @@ def pyalpm_package_description_ahriman(package_description_ahriman: PackageDescr type(mock).isize = PropertyMock(return_value=package_description_ahriman.installed_size) type(mock).licenses = PropertyMock(return_value=package_description_ahriman.licenses) type(mock).size = PropertyMock(return_value=package_description_ahriman.archive_size) + type(mock).provides = PropertyMock(return_value=package_description_ahriman.provides) type(mock).url = PropertyMock(return_value=package_description_ahriman.url) return mock