add ability to filter status response by package status

This commit is contained in:
Evgenii Alekseev 2021-09-13 23:26:17 +03:00
parent 2c74be31bd
commit 6294c0ba14
3 changed files with 34 additions and 8 deletions

View File

@ -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", parser = root.add_parser("status", help="get package status", description="request status of the package",
formatter_class=argparse.ArgumentDefaultsHelpFormatter) formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument("--ahriman", help="get service status itself", action="store_true") 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.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) parser.set_defaults(handler=handlers.Status, lock=None, no_log=True, no_report=True, unsafe=True)
return parser return parser

View File

@ -19,7 +19,7 @@
# #
import argparse import argparse
from typing import Iterable, Tuple, Type from typing import Callable, Iterable, Tuple, Type
from ahriman.application.application import Application from ahriman.application.application import Application
from ahriman.application.handlers.handler import Handler from ahriman.application.handlers.handler import Handler
@ -55,7 +55,11 @@ class Status(Handler):
start=[]) start=[])
else: else:
packages = client.get(None) 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(package.pretty_print())
print(f"\t{package.version}") print(f"\t{package.version}")
print(f"\t{package_status.pretty_print()}") print(f"\t{package_status.pretty_print()}")

View File

@ -4,7 +4,7 @@ from pytest_mock import MockerFixture
from ahriman.application.handlers import Status from ahriman.application.handlers import Status
from ahriman.core.configuration import Configuration 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 from ahriman.models.package import Package
@ -16,11 +16,12 @@ def _default_args(args: argparse.Namespace) -> argparse.Namespace:
""" """
args.ahriman = True args.ahriman = True
args.package = [] args.package = []
args.status = None
return args return args
def test_run(args: argparse.Namespace, configuration: Configuration, package_ahriman: Package, def test_run(args: argparse.Namespace, configuration: Configuration, package_ahriman: Package,
mocker: MockerFixture) -> None: package_python_schedule: Package, mocker: MockerFixture) -> None:
""" """
must run command must run command
""" """
@ -28,26 +29,46 @@ def test_run(args: argparse.Namespace, configuration: Configuration, package_ahr
mocker.patch("pathlib.Path.mkdir") mocker.patch("pathlib.Path.mkdir")
application_mock = mocker.patch("ahriman.core.status.client.Client.get_self") application_mock = mocker.patch("ahriman.core.status.client.Client.get_self")
packages_mock = mocker.patch("ahriman.core.status.client.Client.get", 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) Status.run(args, "x86_64", configuration, True)
application_mock.assert_called_once() application_mock.assert_called_once()
packages_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, def test_run_with_package_filter(args: argparse.Namespace, configuration: Configuration, package_ahriman: Package,
mocker: MockerFixture) -> None: mocker: MockerFixture) -> None:
""" """
must run command must run command with package filter
""" """
args = _default_args(args) args = _default_args(args)
args.package = [package_ahriman.base] args.package = [package_ahriman.base]
mocker.patch("pathlib.Path.mkdir") mocker.patch("pathlib.Path.mkdir")
packages_mock = mocker.patch("ahriman.core.status.client.Client.get", 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) 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: def test_imply_with_report(args: argparse.Namespace, configuration: Configuration, mocker: MockerFixture) -> None: