diff --git a/jiramail/command.py b/jiramail/command.py index dec3a8a..6727bd7 100644 --- a/jiramail/command.py +++ b/jiramail/command.py @@ -28,6 +28,11 @@ def cmd_subs(cmdargs: argparse.Namespace) -> int: return jiramail.subs.main(cmdargs) +def cmd_info(cmdargs: argparse.Namespace) -> int: + import jiramail.info + return jiramail.info.main(cmdargs) + + def add_common_arguments(parser: argparse.ArgumentParser) -> None: parser.add_argument("-v", "--verbose", dest="verbose", action='count', default=0, @@ -124,6 +129,7 @@ def setup_parser() -> argparse.ArgumentParser: sp2_description = """\ receives updates based on saved queries. Saved queries aka substriptions are read from the configuration file. + """ sp2 = subparsers.add_parser("subs", description=sp2_description, @@ -133,6 +139,22 @@ def setup_parser() -> argparse.ArgumentParser: sp2.set_defaults(func=cmd_subs) add_common_arguments(sp2) + # jiramail info + sp3_description = """\ +retrieves issue information from the jira API. +""" + sp3 = subparsers.add_parser("info", + description=sp3_description, + help=sp3_description, + epilog=epilog, + add_help=False) + sp3.set_defaults(func=cmd_info) + + sp3.add_argument("--issue", + dest="issue", action="store", default=None, metavar="ISSUE-123", + help="specify the issue to export.") + add_common_arguments(sp3) + return parser diff --git a/jiramail/info.py b/jiramail/info.py new file mode 100644 index 0000000..314e0e1 --- /dev/null +++ b/jiramail/info.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: GPL-3.0-or-later +# Copyright (C) 2023 Alexey Gladkov + +__author__ = 'Alexey Gladkov ' + +import argparse +import re + +from typing import Optional, Any + +import jira +import jira.resources + +import jiramail + +logger = jiramail.logger + + +def get_issue_field(issue: jira.resources.Issue, name: str) -> Optional[Any]: + try: + return issue.get_field(field_name=name) + except AttributeError: + pass + field = jiramail.jserv.field_by_name(name.lower(), {}) + if field: + try: + return issue.get_field(field["id"]) + except AttributeError: + pass + return None + + +def main(cmdargs: argparse.Namespace) -> int: + config = jiramail.read_config() + + if isinstance(config, jiramail.Error): + logger.critical("%s", config.message) + return jiramail.EX_FAILURE + + try: + jiramail.jserv = jiramail.Connection(config.get("jira", {})) + except Exception as e: + logger.critical("unable to connect to jira: %s", e) + return jiramail.EX_FAILURE + + if cmdargs.issue: + issue = jiramail.jserv.jira.issue(cmdargs.issue) + + for field_id, field in jiramail.jserv.jira.editmeta(issue.key)["fields"].items(): + match field_id: + case "description" | "comment": + continue + + name = field.get("name", field_id) + value = get_issue_field(issue, field_id) + v_type = field.get("schema", {}).get("type", None) + i_type = field.get("schema", {}).get("items", None) + + if i_type: + v_type += " / " + i_type + + print("#", "=" * 79, sep="") + print("# Field :", str(name)) + print("# Type :", str(v_type)) + print("# ID :", str(field_id)) + print("#", "-" * 79, sep="") + if isinstance(value, list): + for n, item in enumerate(value): + print(f":[{n}]") + print(re.sub(r'^(.*)$', r'| \1', f"{item}", flags=re.M)) + elif value is None: + pass + else: + print(re.sub(r'^(.*)$', r'| \1', f"{value}", flags=re.M)) + print("*") + + return jiramail.EX_SUCCESS