From 65caef4fbd36e918ef60b7540c7d4be96dd7b3d6 Mon Sep 17 00:00:00 2001 From: Cyril Jouve Date: Sun, 8 Oct 2023 22:06:52 +0200 Subject: [PATCH] fix(cli): fix action display in --help when there are few actions fixes #2656 --- gitlab/cli.py | 17 ++++++++++++++--- tests/functional/cli/test_cli.py | 6 ++++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/gitlab/cli.py b/gitlab/cli.py index 4efb3b2ff..062b74bf2 100644 --- a/gitlab/cli.py +++ b/gitlab/cli.py @@ -3,6 +3,7 @@ import os import re import sys +import textwrap from types import ModuleType from typing import ( Any, @@ -50,11 +51,21 @@ def format_help(self) -> str: for line in result.splitlines(keepends=True): # All of our resources are on one line and wrapped inside braces. # For example: {application,resource1,resource2} + # except if there are fewer resources - then the line and help text + # are collapsed on the same line. + # For example: {list} Action to execute on the GitLab resource. # We then put each resource on its own line to make it easier to read. if line.strip().startswith("{"): - choices = line.strip().strip("{}").split(",") - choices_str = f"\n{indent}".join(choices) - line = f"{indent}{choices_str}\n" + choice_string, help_string = line.split("}", 1) + choice_list = choice_string.strip(" {").split(",") + help_string = help_string.strip() + + if help_string: + help_indent = len(max(choice_list, key=len)) * " " + choice_list.append(f"{help_indent} {help_string}") + + choices = "\n".join(choice_list) + line = f"{textwrap.indent(choices, indent)}\n" output += line return output diff --git a/tests/functional/cli/test_cli.py b/tests/functional/cli/test_cli.py index 40f18170f..c712622df 100644 --- a/tests/functional/cli/test_cli.py +++ b/tests/functional/cli/test_cli.py @@ -46,6 +46,12 @@ def test_resource_help_prints_actions_vertically(script_runner): assert ret.returncode == 0 +def test_resource_help_prints_actions_vertically_only_one_action(script_runner): + ret = script_runner.run(["gitlab", "event", "--help"]) + assert """action:\n list\n""" in ret.stdout + assert ret.returncode == 0 + + @pytest.mark.script_launch_mode("inprocess") @responses.activate def test_defaults_to_gitlab_com(script_runner, resp_get_project, monkeypatch):