From 2e8be41111e37b8dd407ad1ced95d6973afd0843 Mon Sep 17 00:00:00 2001 From: Ryan Petrello Date: Thu, 22 Aug 2019 16:01:00 -0400 Subject: [PATCH] fix a formatting bug re: required arguments in the CLI --- awxkit/awxkit/cli/options.py | 26 ++++++++++++++++++++------ awxkit/test/cli/test_options.py | 22 +--------------------- 2 files changed, 21 insertions(+), 27 deletions(-) diff --git a/awxkit/awxkit/cli/options.py b/awxkit/awxkit/cli/options.py index 96a6aca3e9..88e1ef06b2 100644 --- a/awxkit/awxkit/cli/options.py +++ b/awxkit/awxkit/cli/options.py @@ -54,14 +54,22 @@ class ResourceOptionsParser(object): add_output_formatting_arguments(parser, {}) def build_query_arguments(self, method, http_method): + required_group = None + if filter( + lambda param: param.get('required', False) is True, + self.options.get(http_method, {}).values() + ): + if method in self.parser.choices: + required_group = self.parser.choices[method].add_argument_group('required arguments') + # put the required group first (before the optional args group) + self.parser.choices[method]._action_groups.reverse() + for k, param in self.options.get(http_method, {}).items(): required = ( method == 'create' and param.get('required', False) is True ) help_text = param.get('help_text', '') - if required: - help_text = '[REQUIRED] {}'.format(help_text) if method == 'list': help_text = 'only list {} with the specified {}'.format( @@ -98,10 +106,16 @@ class ResourceOptionsParser(object): elif param['type'] in meta_map: kwargs['metavar'] = meta_map[param['type']] - self.parser.choices[method].add_argument( - '--{}'.format(k), - **kwargs - ) + if required: + required_group.add_argument( + '--{}'.format(k), + **kwargs + ) + else: + self.parser.choices[method].add_argument( + '--{}'.format(k), + **kwargs + ) def handle_custom_actions(self): for _, action in CustomAction.registry.items(): diff --git a/awxkit/test/cli/test_options.py b/awxkit/test/cli/test_options.py index f0b22f1178..ff514ffb9a 100644 --- a/awxkit/test/cli/test_options.py +++ b/awxkit/test/cli/test_options.py @@ -98,26 +98,6 @@ class TestOptions(unittest.TestCase): self.parser.choices['create'].print_help(out) assert '--first_name TEXT Please specify your first name' in out.getvalue() - def test_creation_required_argument(self): - page = OptionsPage.from_json({ - 'actions': { - 'POST': { - 'username': { - 'type': 'string', - 'help_text': 'Please specify a username', - 'required': True - } - }, - } - }) - options = ResourceOptionsParser(page, self.parser) - options.build_query_arguments('create', 'POST') - assert 'create' in self.parser.choices - - out = StringIO() - self.parser.choices['create'].print_help(out) - assert '--username TEXT [REQUIRED] Please specify a username' in out.getvalue() - def test_creation_required_argument(self): page = OptionsPage.from_json({ 'actions': { @@ -136,7 +116,7 @@ class TestOptions(unittest.TestCase): out = StringIO() self.parser.choices['create'].print_help(out) - assert '--username TEXT [REQUIRED] Please specify a username' in out.getvalue() + assert '--username TEXT Please specify a username' def test_integer_argument(self): page = OptionsPage.from_json({