From 6294c0ba14d1f19fc421960fb20e71a785d608c5 Mon Sep 17 00:00:00 2001 From: Evgeniy Alekseev Date: Mon, 13 Sep 2021 23:26:17 +0300 Subject: [PATCH] add ability to filter status response by package status --- src/ahriman/application/ahriman.py | 1 + src/ahriman/application/handlers/status.py | 8 +++-- .../handlers/test_handler_status.py | 33 +++++++++++++++---- 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/src/ahriman/application/ahriman.py b/src/ahriman/application/ahriman.py index 2ef8e021..c6c2d485 100644 --- a/src/ahriman/application/ahriman.py +++ b/src/ahriman/application/ahriman.py @@ -304,6 +304,7 @@ def _set_status_parser(root: SubParserAction) -> argparse.ArgumentParser: parser = root.add_parser("status", help="get package status", description="request status of the package", formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser.add_argument("--ahriman", help="get service status itself", action="store_true") + parser.add_argument("--status", help="filter packages by status", choices=BuildStatusEnum, type=BuildStatusEnum) parser.add_argument("package", help="filter status by package base", nargs="*") parser.set_defaults(handler=handlers.Status, lock=None, no_log=True, no_report=True, unsafe=True) return parser diff --git a/src/ahriman/application/handlers/status.py b/src/ahriman/application/handlers/status.py index 66e581b1..3b549a4e 100644 --- a/src/ahriman/application/handlers/status.py +++ b/src/ahriman/application/handlers/status.py @@ -19,7 +19,7 @@ # import argparse -from typing import Iterable, Tuple, Type +from typing import Callable, Iterable, Tuple, Type from ahriman.application.application import Application from ahriman.application.handlers.handler import Handler @@ -55,7 +55,11 @@ class Status(Handler): start=[]) else: packages = client.get(None) - for package, package_status in sorted(packages, key=lambda item: item[0].base): + + comparator: Callable[[Tuple[Package, BuildStatus]], str] = lambda item: item[0].base + filter_fn: Callable[[Tuple[Package, BuildStatus]], bool] =\ + lambda item: args.status is None or item[1].status == args.status + for package, package_status in sorted(filter(filter_fn, packages), key=comparator): print(package.pretty_print()) print(f"\t{package.version}") print(f"\t{package_status.pretty_print()}") diff --git a/tests/ahriman/application/handlers/test_handler_status.py b/tests/ahriman/application/handlers/test_handler_status.py index 045705d6..d1f35d95 100644 --- a/tests/ahriman/application/handlers/test_handler_status.py +++ b/tests/ahriman/application/handlers/test_handler_status.py @@ -4,7 +4,7 @@ from pytest_mock import MockerFixture from ahriman.application.handlers import Status from ahriman.core.configuration import Configuration -from ahriman.models.build_status import BuildStatus +from ahriman.models.build_status import BuildStatus, BuildStatusEnum from ahriman.models.package import Package @@ -16,11 +16,12 @@ def _default_args(args: argparse.Namespace) -> argparse.Namespace: """ args.ahriman = True args.package = [] + args.status = None return args def test_run(args: argparse.Namespace, configuration: Configuration, package_ahriman: Package, - mocker: MockerFixture) -> None: + package_python_schedule: Package, mocker: MockerFixture) -> None: """ must run command """ @@ -28,26 +29,46 @@ def test_run(args: argparse.Namespace, configuration: Configuration, package_ahr mocker.patch("pathlib.Path.mkdir") application_mock = mocker.patch("ahriman.core.status.client.Client.get_self") packages_mock = mocker.patch("ahriman.core.status.client.Client.get", - return_value=[(package_ahriman, BuildStatus())]) + return_value=[(package_ahriman, BuildStatus(BuildStatusEnum.Success)), + (package_python_schedule, BuildStatus(BuildStatusEnum.Failed))]) + pretty_print_mock = mocker.patch("ahriman.models.package.Package.pretty_print") Status.run(args, "x86_64", configuration, True) application_mock.assert_called_once() packages_mock.assert_called_once() + pretty_print_mock.assert_called() def test_run_with_package_filter(args: argparse.Namespace, configuration: Configuration, package_ahriman: Package, mocker: MockerFixture) -> None: """ - must run command + must run command with package filter """ args = _default_args(args) args.package = [package_ahriman.base] mocker.patch("pathlib.Path.mkdir") packages_mock = mocker.patch("ahriman.core.status.client.Client.get", - return_value=[(package_ahriman, BuildStatus())]) + return_value=[(package_ahriman, BuildStatus(BuildStatusEnum.Success))]) Status.run(args, "x86_64", configuration, True) - packages_mock.assert_called_once() + packages_mock.assert_called_with(package_ahriman.base) + + +def test_run_by_status(args: argparse.Namespace, configuration: Configuration, package_ahriman: Package, + package_python_schedule: Package, mocker: MockerFixture) -> None: + """ + must filter packages by status + """ + args = _default_args(args) + args.status = BuildStatusEnum.Failed + mocker.patch("pathlib.Path.mkdir") + mocker.patch("ahriman.core.status.client.Client.get", + return_value=[(package_ahriman, BuildStatus(BuildStatusEnum.Success)), + (package_python_schedule, BuildStatus(BuildStatusEnum.Failed))]) + pretty_print_mock = mocker.patch("ahriman.models.package.Package.pretty_print") + + Status.run(args, "x86_64", configuration, True) + pretty_print_mock.assert_called_once() def test_imply_with_report(args: argparse.Namespace, configuration: Configuration, mocker: MockerFixture) -> None: