Skip to content

Commit 433f35e

Browse files
fix: duplicate subparsers being added to argparse
Python 3.11 added an additional check in the argparse libary which detected duplicate subparsers being added. We had duplicate subparsers being added. Make sure we don't add duplicate subparsers. Closes: #2015
1 parent 6b47c26 commit 433f35e

1 file changed

Lines changed: 10 additions & 5 deletions

File tree

‎gitlab/v4/cli.py‎

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,9 @@ def _populate_sub_parser_by_class(
200200
mgr_cls_name = f"{cls.__name__}Manager"
201201
mgr_cls = getattr(gitlab.v4.objects, mgr_cls_name)
202202

203-
for action_name in ["list", "get", "create", "update", "delete"]:
203+
ACTIONS = ("list", "get", "create", "update", "delete")
204+
205+
for action_name in ACTIONS:
204206
if not hasattr(mgr_cls, action_name):
205207
continue
206208

@@ -268,6 +270,9 @@ def _populate_sub_parser_by_class(
268270
if cls.__name__ in cli.custom_actions:
269271
name = cls.__name__
270272
for action_name in cli.custom_actions[name]:
273+
if action_name in ACTIONS:
274+
# Don't attempt to add actions we have already added
275+
continue
271276
sub_parser_action = sub_parser.add_parser(action_name)
272277
# Get the attributes for URL/path construction
273278
if mgr_cls._from_parent_attrs:
@@ -326,16 +331,16 @@ def extend_parser(parser: argparse.ArgumentParser) -> argparse.ArgumentParser:
326331
subparsers.required = True
327332

328333
# populate argparse for all Gitlab Object
329-
classes = []
334+
classes = set()
330335
for cls in gitlab.v4.objects.__dict__.values():
331336
if not isinstance(cls, type):
332337
continue
333338
if issubclass(cls, gitlab.base.RESTManager):
334339
if cls._obj_cls is not None:
335-
classes.append(cls._obj_cls)
336-
classes.sort(key=operator.attrgetter("__name__"))
340+
classes.add(cls._obj_cls)
337341

338-
for cls in classes:
342+
for cls in sorted(classes, key=operator.attrgetter("__name__")):
343+
print(cls)
339344
arg_name = cli.cls_to_what(cls)
340345
object_group = subparsers.add_parser(arg_name)
341346

0 commit comments

Comments
 (0)