diff --git a/oslo_config/cfg.py b/oslo_config/cfg.py index 5b7ca5c6..8ed5ecf4 100644 --- a/oslo_config/cfg.py +++ b/oslo_config/cfg.py @@ -1718,10 +1718,13 @@ class _CachedArgumentParser(argparse.ArgumentParser): # option and then sort the values slice. for container, values in six.iteritems(self._args_cache): index = 0 + has_positional = False for index, argument in enumerate(values): if not argument['args'][0].startswith('-'): + has_positional = True break - values[:index] = sorted(values[:index], key=lambda x: x['args']) + size = index if has_positional else len(values) + values[:size] = sorted(values[:size], key=lambda x: x['args']) for argument in values: try: container.add_argument(*argument['args'], diff --git a/oslo_config/tests/test_cfg.py b/oslo_config/tests/test_cfg.py index 9470dcc6..2bd32651 100644 --- a/oslo_config/tests/test_cfg.py +++ b/oslo_config/tests/test_cfg.py @@ -146,8 +146,8 @@ class HelpTestCase(BaseTestCase): def test_print_sorted_help(self): f = moves.StringIO() - self.conf.register_cli_opt(cfg.StrOpt('zba')) self.conf.register_cli_opt(cfg.StrOpt('abc')) + self.conf.register_cli_opt(cfg.StrOpt('zba')) self.conf.register_cli_opt(cfg.StrOpt('ghi')) self.conf.register_cli_opt(cfg.StrOpt('deb')) self.conf([]) @@ -159,6 +159,20 @@ class HelpTestCase(BaseTestCase): list = [abc, deb, ghi, zba] self.assertEqual(sorted(list), list) + def test_print_sorted_help_with_positionals(self): + f = moves.StringIO() + self.conf.register_cli_opt(cfg.StrOpt('pst', positional=True)) + self.conf.register_cli_opt(cfg.StrOpt('abc')) + self.conf.register_cli_opt(cfg.StrOpt('zba')) + self.conf.register_cli_opt(cfg.StrOpt('ghi')) + self.conf([]) + self.conf.print_help(file=f) + zba = f.getvalue().find('--zba') + abc = f.getvalue().find('--abc') + ghi = f.getvalue().find('--ghi') + list = [abc, ghi, zba] + self.assertEqual(sorted(list), list) + class FindConfigFilesTestCase(BaseTestCase):