From 62496478ae51b1535bf9a4b36b832acb705299a6 Mon Sep 17 00:00:00 2001 From: Evgeniy Alekseev Date: Wed, 27 Oct 2021 03:11:43 +0300 Subject: [PATCH] add update printer which will print current version if any --- .../application/application/repository.py | 5 +- .../application/formatters/update_printer.py | 53 +++++++++++++++++++ .../test_application_repository.py | 6 +++ .../application/formatters/conftest.py | 12 ++++- .../formatters/test_update_printer.py | 15 ++++++ 5 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 src/ahriman/application/formatters/update_printer.py create mode 100644 tests/ahriman/application/formatters/test_update_printer.py diff --git a/src/ahriman/application/application/repository.py b/src/ahriman/application/application/repository.py index 2e5cce94..5725b2df 100644 --- a/src/ahriman/application/application/repository.py +++ b/src/ahriman/application/application/repository.py @@ -23,6 +23,7 @@ from pathlib import Path from typing import Callable, Iterable, List from ahriman.application.application.properties import Properties +from ahriman.application.formatters.update_printer import UpdatePrinter from ahriman.core.build_tools.sources import Sources from ahriman.core.tree import Tree from ahriman.models.package import Package @@ -170,7 +171,9 @@ class Repository(Properties): if not no_manual: updates.extend(self.repository.updates_manual()) + local_versions = {package.base: package.version for package in self.repository.packages()} for package in updates: - log_fn(f"{package.base} = {package.version}") + UpdatePrinter(package, local_versions.get(package.base)).print( + verbose=True, log_fn=log_fn, separator=" -> ") return updates diff --git a/src/ahriman/application/formatters/update_printer.py b/src/ahriman/application/formatters/update_printer.py new file mode 100644 index 00000000..6659bceb --- /dev/null +++ b/src/ahriman/application/formatters/update_printer.py @@ -0,0 +1,53 @@ +# +# Copyright (c) 2021 ahriman team. +# +# This file is part of ahriman +# (see https://github.com/arcan1s/ahriman). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +from typing import List, Optional + +from ahriman.application.formatters.printer import Printer +from ahriman.models.package import Package +from ahriman.models.property import Property + + +class UpdatePrinter(Printer): + """ + print content of the package update + """ + + def __init__(self, remote: Package, local_version: Optional[str]) -> None: + """ + default constructor + :param remote: remote (new) package object + :param local_version: local version of the package if any + """ + self.content = remote + self.local_version = local_version or "N/A" + + def properties(self) -> List[Property]: + """ + convert content into printable data + :return: list of content properties + """ + return [Property(self.local_version, self.content.version, is_required=True)] + + def title(self) -> Optional[str]: + """ + generate entry title from content + :return: content title if it can be generated and None otherwise + """ + return self.content.base diff --git a/tests/ahriman/application/application/test_application_repository.py b/tests/ahriman/application/application/test_application_repository.py index 97208d5b..f5a9640e 100644 --- a/tests/ahriman/application/application/test_application_repository.py +++ b/tests/ahriman/application/application/test_application_repository.py @@ -201,6 +201,7 @@ def test_updates_all(application_repository: Repository, package_ahriman: Packag """ must get updates for all """ + mocker.patch("ahriman.core.repository.repository.Repository.packages", return_value=[]) updates_aur_mock = mocker.patch("ahriman.core.repository.update_handler.UpdateHandler.updates_aur", return_value=[package_ahriman]) updates_manual_mock = mocker.patch("ahriman.core.repository.update_handler.UpdateHandler.updates_manual") @@ -214,6 +215,7 @@ def test_updates_disabled(application_repository: Repository, mocker: MockerFixt """ must get updates without anything """ + mocker.patch("ahriman.core.repository.repository.Repository.packages", return_value=[]) updates_aur_mock = mocker.patch("ahriman.core.repository.update_handler.UpdateHandler.updates_aur") updates_manual_mock = mocker.patch("ahriman.core.repository.update_handler.UpdateHandler.updates_manual") @@ -226,6 +228,7 @@ def test_updates_no_aur(application_repository: Repository, mocker: MockerFixtur """ must get updates without aur """ + mocker.patch("ahriman.core.repository.repository.Repository.packages", return_value=[]) updates_aur_mock = mocker.patch("ahriman.core.repository.update_handler.UpdateHandler.updates_aur") updates_manual_mock = mocker.patch("ahriman.core.repository.update_handler.UpdateHandler.updates_manual") @@ -238,6 +241,7 @@ def test_updates_no_manual(application_repository: Repository, mocker: MockerFix """ must get updates without manual """ + mocker.patch("ahriman.core.repository.repository.Repository.packages", return_value=[]) updates_aur_mock = mocker.patch("ahriman.core.repository.update_handler.UpdateHandler.updates_aur") updates_manual_mock = mocker.patch("ahriman.core.repository.update_handler.UpdateHandler.updates_manual") @@ -250,6 +254,7 @@ def test_updates_no_vcs(application_repository: Repository, mocker: MockerFixtur """ must get updates without VCS """ + mocker.patch("ahriman.core.repository.repository.Repository.packages", return_value=[]) updates_aur_mock = mocker.patch("ahriman.core.repository.update_handler.UpdateHandler.updates_aur") updates_manual_mock = mocker.patch("ahriman.core.repository.update_handler.UpdateHandler.updates_manual") @@ -262,6 +267,7 @@ def test_updates_with_filter(application_repository: Repository, mocker: MockerF """ must get updates without VCS """ + mocker.patch("ahriman.core.repository.repository.Repository.packages", return_value=[]) updates_aur_mock = mocker.patch("ahriman.core.repository.update_handler.UpdateHandler.updates_aur") updates_manual_mock = mocker.patch("ahriman.core.repository.update_handler.UpdateHandler.updates_manual") diff --git a/tests/ahriman/application/formatters/conftest.py b/tests/ahriman/application/formatters/conftest.py index d6186288..4bdb75d9 100644 --- a/tests/ahriman/application/formatters/conftest.py +++ b/tests/ahriman/application/formatters/conftest.py @@ -5,6 +5,7 @@ from ahriman.application.formatters.aur_printer import AurPrinter from ahriman.application.formatters.configuration_printer import ConfigurationPrinter from ahriman.application.formatters.package_printer import PackagePrinter from ahriman.application.formatters.status_printer import StatusPrinter +from ahriman.application.formatters.update_printer import UpdatePrinter from ahriman.models.build_status import BuildStatus from ahriman.models.package import Package @@ -39,9 +40,18 @@ def package_ahriman_printer(package_ahriman: Package) -> PackagePrinter: @pytest.fixture -def status_printer(package_ahriman: Package) -> StatusPrinter: +def status_printer() -> StatusPrinter: """ fixture for build status printer :return: build status printer test instance """ return StatusPrinter(BuildStatus()) + + +@pytest.fixture +def update_printer(package_ahriman: Package) -> UpdatePrinter: + """ + fixture for build status printer + :return: build status printer test instance + """ + return UpdatePrinter(package_ahriman, None) diff --git a/tests/ahriman/application/formatters/test_update_printer.py b/tests/ahriman/application/formatters/test_update_printer.py new file mode 100644 index 00000000..37f8b199 --- /dev/null +++ b/tests/ahriman/application/formatters/test_update_printer.py @@ -0,0 +1,15 @@ +from ahriman.application.formatters.update_printer import UpdatePrinter + + +def test_properties(update_printer: UpdatePrinter) -> None: + """ + must return empty properties list + """ + assert update_printer.properties() + + +def test_title(update_printer: UpdatePrinter) -> None: + """ + must return non empty title + """ + assert update_printer.title() is not None