8000 fix: duplicate subparsers being added to argparse · python-gitlab/python-gitlab@d64b159 · GitHub
[go: up one dir, main page]

Skip to content

Commit d64b159

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 d64b159

File tree

1 file changed

+11
-5
lines changed

1 file changed

+11
-5
lines changed

gitlab/v4/cli.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -200,11 +200,15 @@ 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+
action_parsers: Dict[str, argparse.ArgumentParser] = {}
205+
206+
for action_name in ACTIONS:
204207
if not hasattr(mgr_cls, action_name):
205208
continue
206209

207210
sub_parser_action = sub_parser.add_parser(action_name)
211+
action_parsers[action_name] = sub_parser_action
208212
sub_parser_action.add_argument("--sudo", required=False)
209213
if mgr_cls._from_parent_attrs:
210214
for x in mgr_cls._from_parent_attrs:
@@ -268,6 +272,9 @@ def _populate_sub_parser_by_class(
268272
if cls.__name__ in cli.custom_actions:
269273
name = cls.__name__
270274
for action_name in cli.custom_actions[name]:
275+
if action_name in action_parsers:
276+
continue
277+
271278
sub_parser_action = sub_parser.add_parser(action_name)
272279
# Get the attributes for URL/path construction
273280
if mgr_cls._from_parent_attrs:
@@ -326,16 +333,15 @@ def extend_parser(parser: argparse.ArgumentParser) -> argparse.ArgumentParser:
326333
subparsers.required = True
327334

328335
# populate argparse for all Gitlab Object
329-
classes = []
336+
classes = set()
330337
for cls in gitlab.v4.objects.__dict__.values():
331338
if not isinstance(cls, type):
332339
continue
333340
if issubclass(cls, gitlab.base.RESTManager):
334341
if cls._obj_cls is not None:
335-
classes.append(cls._obj_cls)
336-
classes.sort(key=operator.attrgetter("__name__"))
342+
classes.add(cls._obj_cls)
337343

338-
for cls in classes:
344+
for cls in sorted(classes, key=operator.attrgetter("__name__")):
339345
arg_name = cli.cls_to_what(cls)
340346
object_group = subparsers.add_parser(arg_name)
341347

0 commit comments

Comments
 (0)
0