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

Skip to content

Commit e812380

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 e812380

File tree

1 file changed

+19
-8
lines changed

1 file changed

+19
-8
lines changed

gitlab/v4/cli.py

Lines changed: 19 additions & 8 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+
action_parsers: Dict[str, argparse.ArgumentParser] = {}
203204
for action_name in ["list", "get", "create", "update", "delete"]:
204205
if not hasattr(mgr_cls, action_name):
205206
continue
206207

207-
sub_parser_action = sub_parser.add_parser(action_name)
208+
sub_parser_action = sub_parser.add_parser(
209+
action_name, conflict_handler="resolve"
210+
)
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,7 +272,10 @@ 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]:
271-
sub_parser_action = sub_parser.add_parser(action_name)
275+
if action_name in action_parsers:
276+
sub_parser_action = action_parsers[action_name]
277+
else:
278+
sub_parser_action = sub_parser.add_parser(action_name)
272279
# Get the attributes for URL/path construction
273280
if mgr_cls._from_parent_attrs:
274281
for x in mgr_cls._from_parent_attrs:
@@ -298,13 +305,18 @@ def _populate_sub_parser_by_class(
298305
if mgr_cls.__name__ in cli.custom_actions:
299306
name = mgr_cls.__name__
300307
for action_name in cli.custom_actions[name]:
301-
sub_parser_action = sub_parser.add_parser(action_name)
308+
if action_name in action_parsers:
309+
sub_parser_action = action_parsers[action_name]
310+
else:
311+
sub_parser_action = sub_parser.add_parser(action_name)
302312
if mgr_cls._from_parent_attrs:
303313
for x in mgr_cls._from_parent_attrs:
304314
sub_parser_action.add_argument(
305315
f"--{x.replace('_', '-')}", required=True
306316
)
307-
sub_parser_action.add_argument("--sudo", required=False)
317+
sub_parser_action.sub_parser_action.add_argument(
318+
"--sudo", required=False
319+
)
308320

309321
required, optional, dummy = cli.custom_actions[name][action_name]
310322
for x in required:
@@ -326,16 +338,15 @@ def extend_parser(parser: argparse.ArgumentParser) -> argparse.ArgumentParser:
326338
subparsers.required = True
327339

328340
# populate argparse for all Gitlab Object
329-
classes = []
341+
classes = set()
330342
for cls in gitlab.v4.objects.__dict__.values():
331343
if not isinstance(cls, type):
332344
continue
333345
if issubclass(cls, gitlab.base.RESTManager):
334346
if cls._obj_cls is not None:
335-
classes.append(cls._obj_cls)
336-
classes.sort(key=operator.attrgetter("__name__"))
347+
classes.add(cls._obj_cls)
337348

338-
for cls in classes:
349+
for cls in sorted(classes, key=operator.attrgetter("__name__")):
339350
arg_name = cli.cls_to_what(cls)
340351
object_group = subparsers.add_parser(arg_name)
341352

0 commit comments

Comments
 (0)
0