Provide a subcommand to query the checks ran against a specific patch_id. Also allows formatting of the output, to make it easier to query whether a specific patch has seen any tests (and what their status is).
Signed-off-by: Olof Johansson <o...@lixom.net> --- pwclient/checks.py | 29 +++++++++++++++++++++++++++++ pwclient/parser.py | 13 +++++++++++++ pwclient/shell.py | 5 +++++ tests/fakes.py | 14 ++++++++++++++ tests/test_checks.py | 19 +++++++++++++++++++ 5 files changed, 80 insertions(+) diff --git a/pwclient/checks.py b/pwclient/checks.py index fcb8d07..767729d 100644 --- a/pwclient/checks.py +++ b/pwclient/checks.py @@ -5,6 +5,7 @@ # SPDX-License-Identifier: GPL-2.0-or-later import sys +import re from pwclient.xmlrpc import xmlrpclib @@ -29,6 +30,34 @@ def action_info(rpc, check_id): print("- %- 14s: %s" % (key, value)) +def action_get(rpc, patch_id, format_str=None): + checks_list = rpc.patch_check_get(patch_id) + checks = checks_list.get('checks', None) + if checks == None: + return + + if format_str: + format_field_re = re.compile("%{([a-z0-9_]+)}") + + def check_field(matchobj): + fieldname = matchobj.group(1) + + return str(check[fieldname]) + + for check in checks: + print(format_field_re.sub(check_field, format_str)) + else: + s = "Check information for patch id %d" % patch_id + print(s) + print('-' * len(s)) + out = [] + for check in checks: + cout = [] + for key, value in sorted(check.items()): + cout.append("- %- 14s: %s" % (key, value)) + out.append("\n".join(cout)) + print("\n\n".join(out)) + def action_create(rpc, patch_id, context, state, url, description): try: rpc.check_create(patch_id, context, state, url, description) diff --git a/pwclient/parser.py b/pwclient/parser.py index dc3934a..54c9bdd 100644 --- a/pwclient/parser.py +++ b/pwclient/parser.py @@ -111,6 +111,19 @@ installed locales. help="list all projects") projects_parser.set_defaults(subcmd='projects') + check_get_parser = subparsers.add_parser( + 'check-get', add_help=False, + help="get checks for a patch" + ) + check_get_parser.add_argument( + 'patch_id', metavar='PATCH_ID', action='store', type=int, + help="patch ID") + check_get_parser.add_argument( + '-f', '--format', metavar='FORMAT', + help=("print output in the given format. You can use tags matching " + "fields, e.g. %%{context}, %%{state}, or %%{msgid}.")) + check_get_parser.set_defaults(subcmd='check_get') + check_list_parser = subparsers.add_parser( 'check-list', add_help=False, help="list all checks" diff --git a/pwclient/shell.py b/pwclient/shell.py index 1f127ea..02165ba 100644 --- a/pwclient/shell.py +++ b/pwclient/shell.py @@ -211,6 +211,11 @@ def main(argv=sys.argv[1:]): rpc, patch_id, state=args.state, archived=args.archived, commit=args.commit_ref) + elif action == 'check_get': + patch_id = args.patch_id + format_str = args.format + checks.action_get(rpc, patch_id, format_str) + elif action == 'check_list': checks.action_list(rpc) diff --git a/tests/fakes.py b/tests/fakes.py index a2dcc8c..5a8761b 100644 --- a/tests/fakes.py +++ b/tests/fakes.py @@ -69,6 +69,20 @@ def fake_checks(): }, ] +def fake_patch_check(): + return { + 'checks': [{ + 'context': 'hello-world', + 'id': 1, + 'patch_id': 1, + 'state': 'success', + 'target_url': '', + 'user_id': 1 + }], + 'state': 'success', + 'total': 1 + } + def fake_states(): return [ diff --git a/tests/test_checks.py b/tests/test_checks.py index 625d375..1f4038e 100644 --- a/tests/test_checks.py +++ b/tests/test_checks.py @@ -6,6 +6,25 @@ from pwclient import xmlrpc from . import fakes +def test_action_check_get(capsys): + rpc = mock.Mock() + rpc.patch_check_get.return_value = fakes.fake_patch_check() + + checks.action_get(rpc, 1) + + captured = capsys.readouterr() + + assert captured.out == """\ +Check information for patch id 1 +-------------------------------- +- context : hello-world +- id : 1 +- patch_id : 1 +- state : success +- target_url : +- user_id : 1 +""" + def test_action_check_list(capsys): rpc = mock.Mock() rpc.check_list.return_value = fakes.fake_checks() -- 2.20.1 _______________________________________________ Patchwork mailing list Patchwork@lists.ozlabs.org https://lists.ozlabs.org/listinfo/patchwork