diff --git a/jiracli/cli.py b/jiracli/cli.py index f6482ae..210f10b 100644 --- a/jiracli/cli.py +++ b/jiracli/cli.py @@ -2,7 +2,7 @@ import configparser import functools import os from pathlib import Path -from textwrap import indent, shorten, wrap +from textwrap import dedent, indent, shorten, wrap from typing import Any, Callable, Dict import click @@ -268,26 +268,34 @@ def link(): pass +def _format_links(client, issue): + lines = [] + issuelinks = getattr(issue.fields, 'issuelinks', []) + if issuelinks: + lines.append("Issue Links") + # TODO group by type? + for issuelink in issuelinks: + other_issue = getattr(issuelink, 'inwardIssue', getattr(issuelink, 'outwardIssue', None)) + summary = indent('\n'.join(wrap(other_issue.fields.summary, width=72)), prefix=' ' * 4) + lines.append(f" {issuelink.type} - {other_issue.key}\n{summary}") + + remote_links = client.remote_links(issue.id) + if remote_links: + if lines: + lines.append('') + lines.append("Remote Links:") + for link in remote_links: + # TODO tabulate? + lines.append(f" {link.object.title} => {link.object.url}") + + return '\n'.join(lines) + + @link.command('list') @pass_issue @pass_client def link_list(client, issue): - - issuelinks = getattr(issue.fields, 'issuelinks', []) - if issuelinks: - print("\nIssue Links") - # TODO group by type? - for issuelink in issuelinks: - other_issue = getattr(issuelink, 'inwardIssue', issuelink.outwardIssue) - summary = indent('\n'.join(wrap(other_issue.fields.summary, width=72)), prefix=' ' * 4) - print(f" {issuelink.type} - {other_issue.key}\n{summary}") - - remote_links = client.remote_links(issue.id) - if remote_links: - print("\nRemote Links:") - for link in remote_links: - # TODO tabulate? - print(f" {link.object.title} => {link.object.url}") + print(_format_links(client, issue)) def prompt(description: str, *, multiline_ok: bool = True, initial_content: str = '', empty_ok: bool = False) -> str: @@ -396,11 +404,58 @@ def label_edit(issue): @pass_issue def debug(issue): import IPython - IPython.embed + IPython.embed() @issue.command() @pass_issue -def show(issue): +@pass_client +def show(client, issue): """Show a lot of information about the issue""" - raise NotImplementedError + print(f"{issue.key} on {issue.fields.status} as {issue.fields.issuetype} assigned to {issue.fields.assignee}") + if getattr(issue.fields, 'parent', None): + parent = issue.fields.parent + print(f" parent: {parent.key} on {parent.fields.status} as {parent.fields.issuetype}") + summary = indent('\n'.join(wrap(parent.fields.summary, width=72)), prefix=' ' * 4) + print(f"{summary}") + print(indent(dedent(f"""\ + created: {issue.fields.created} + components: {', '.join(issue.fields.components)} + flagged: {getattr(issue.fields, 'flagged', False)} + labels: {', '.join(issue.fields.labels)} + priority: {issue.fields.priority} + reporter: {issue.fields.reporter}"""), + ' ' * 2)) + + def _header(s): + # print(f"\n {s}\n {'+' * len(s)}") + print(f"\n +++ {s} +++") + + summary = indent('\n'.join(wrap(issue.fields.summary, replace_whitespace=False)), prefix=' ' * 2) + _header('summary') + print(summary) + + description = indent('\n'.join(wrap(issue.fields.description or '', replace_whitespace=False)), prefix=' ' * 2) + _header('description') + print(description) + + _header('attachments') + for i, attachment in enumerate(issue.fields.attachment): + print(f" * {attachment.filename} by {attachment.author}") + print(f" {attachment.content}") + print(f" {attachment.mimeType} with {attachment.size} B") + + _header('links') + links = _format_links(client, issue) + if links: + print(indent(links, prefix=' ' * 2)) + + _header('comments') + for i, comment in enumerate(issue.fields.comment.comments): + if i != 0: + print('') + print(f" {comment.created} - {comment.author}") + body = indent('\n'.join(wrap(comment.body, replace_whitespace=False)), ' ' * 4) + print(body) + + print('')