From 4140f8e8e69585d1a421757d1fc1944b6de6bf36 Mon Sep 17 00:00:00 2001 From: Alberto de Rodrigo Date: Mon, 30 Sep 2019 18:17:05 +0200 Subject: [PATCH] Improved the iter_parsers function of the argparse_to_json.py to allow the extraction to the sub parser recursively --- gooey/python_bindings/argparse_to_json.py | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/gooey/python_bindings/argparse_to_json.py b/gooey/python_bindings/argparse_to_json.py index f20b0ac..44b854b 100644 --- a/gooey/python_bindings/argparse_to_json.py +++ b/gooey/python_bindings/argparse_to_json.py @@ -19,7 +19,6 @@ from uuid import uuid4 from gooey.python_bindings.gooey_parser import GooeyParser from gooey.util.functional import merge, getin, identity, assoc - VALID_WIDGETS = ( 'FileChooser', 'MultiFileChooser', @@ -127,10 +126,24 @@ def assert_subparser_constraints(parser): "when subparsers are present.") -def iter_parsers(parser): - ''' Iterate over name, parser pairs ''' +def iter_parsers(parser, parents=()): + ''' + Recursively iterate over name, parser pairs + + If one of the child actions contains a sub_parser is going to be called recursively to iter_parsers + + :parser current parser to extract his actions + :parents tuple of previous actions parsers + :return a generator of all the actions and sub actions + ''' try: - return get_subparser(parser._actions).choices.items() + for name, sub_parser in get_subparser(parser._actions).choices.items(): + chain = parents + (name,) + if has_subparsers(sub_parser._actions): + yield from iter_parsers(sub_parser, parents=chain) + else: + yield ' '.join(chain), sub_parser + except: return iter([('::gooey/default', parser)]) @@ -256,7 +269,7 @@ def categorize(actions, widget_dict, options): elif is_standard(action): yield action_to_json(action, _get_widget(action, 'TextField'), options) - + elif is_file(action): yield action_to_json(action, _get_widget(action, 'FileSaver'), options)