diff --git a/gooey/python_bindings/argparse_to_json.py b/gooey/python_bindings/argparse_to_json.py index de3b081..2a215a6 100644 --- a/gooey/python_bindings/argparse_to_json.py +++ b/gooey/python_bindings/argparse_to_json.py @@ -337,7 +337,7 @@ def action_to_json(action, widget, options): 'required': action.required, 'nargs': action.nargs or '', 'commands': action.option_strings, - 'choices': action.choices or [], + 'choices': list(action.choices) if action.choices else [], 'default': clean_default(action.default), 'dest': action.dest, }, diff --git a/gooey/tests/test_argparse_to_json.py b/gooey/tests/test_argparse_to_json.py index c700d0d..a6b6a83 100644 --- a/gooey/tests/test_argparse_to_json.py +++ b/gooey/tests/test_argparse_to_json.py @@ -1,168 +1,49 @@ +import json +import sys +import time import unittest -from gooey.python_bindings.argparse_to_json import * +from argparse import ArgumentParser +from concurrent import futures +from os import path +import wx +from gooey.gui import application +from gooey.gui.lang.i18n import _ +from gooey.gui.util.freeze import getResourcePath +from gooey.gui.util.quoting import quote +from gooey.gui.components.widgets import Dropdown +from python_bindings import argparse_to_json +import os +from pprint import pprint + +from util.functional import getin + + +class TestArgparse(unittest.TestCase): + """ + TODO: + """ + + def test_json_iterable_conversion(self): + """ + Issue #312 - tuples weren't being coerced to list during argparse + conversion causing downstream issues when concatenating + """ + # our original functionality accepted only lists as the choices arg + parser = ArgumentParser() + parser.add_argument("-foo", choices=[1, 2, 3]) + result = argparse_to_json.action_to_json(parser._actions[-1], "Dropdown", {}) + + choices = result['data']['choices'] + self.assertTrue(isinstance(choices, list)) + self.assertEqual(choices, [1, 2, 3]) + + # Now we allow tuples as well. + parser = ArgumentParser() + parser.add_argument("-foo", choices=(1, 2, 3)) + result = argparse_to_json.action_to_json(parser._actions[-1], "Dropdown", {}) + + choices = result['data']['choices'] + self.assertTrue(isinstance(choices, list)) + self.assertEqual(choices, [1, 2, 3]) -# I fixed all the tests! -# -# def test_parser_converts_to_correct_type(empty_parser, complete_parser, subparser): -# assert convert(subparser)['layout_type'] == 'column' -# assert convert(empty_parser)['layout_type'] == 'standard' -# assert convert(complete_parser)['layout_type'] == 'standard' -# -# -# def test_parser_without_subparser_recieves_root_entry(complete_parser): -# ''' -# Non-subparser setups should receive a default root key called 'primary' -# ''' -# result = convert(complete_parser) -# assert 'primary' in result['widgets'] -# -# -# def test_grouping_structure(complete_parser): -# ''' -# The output of the 'widgets' branch is now wrapped in another -# layer to facilitate interop with the subparser structure -# -# old: widgets: [] -# new: widgets: {'a': {}, 'b': {}, ..} -# ''' -# result = convert(complete_parser) -# groupings = result['widgets'] -# # should now be a dict rather than a list -# assert isinstance(groupings, dict) -# # make sure our expected root keys are there -# for name, group in groupings.items(): -# assert 'command' in group -# assert 'contents' in group -# # contents should be the old list of widget info -# assert isinstance(group['contents'], list) -# -# -# def test_subparser_uses_prog_value_if_available(): -# parser = argparse.ArgumentParser(description='qidev') -# parser.add_argument('--verbose', help='be verbose', dest='verbose', -# action='store_true', default=False) -# subs = parser.add_subparsers(help='commands', dest='command') -# # NO prog definition for the sub parser -# subs.add_parser('config', help='configure defaults for qidev') -# -# # The stock parser name supplied above (e.g. config) is -# # now in the converted doc -# result = convert(parser) -# assert 'config' in result['widgets'] -# -# # new subparser -# parser = argparse.ArgumentParser(description='qidev') -# parser.add_argument('--verbose', help='be verbose', dest='verbose', -# action='store_true', default=False) -# subs = parser.add_subparsers(help='commands', dest='command') -# # prog definition for the sub parser IS supplied -# subs.add_parser('config', prog="My Config", help='configure defaults for qidev') -# -# # Should've picked up the prog value -# result = convert(parser) -# assert 'My Config' in result['widgets'] -# -# -# def test_convert_std_parser(complete_parser): -# result = convert(complete_parser) -# # grab the first entry from the dict -# entry = result['widgets']['primary']['contents'][0] -# print(entry) -# assert 'type' in entry -# assert 'required' in entry -# assert 'data' in entry -# -# -# def test_convert_sub_parser(subparser): -# result = convert(subparser) -# assert result['layout_type'] == 'column' -# assert result['widgets'] -# assert isinstance(result['widgets'], dict) -# assert len(result['widgets']) == 3 -# -# -# def test_has_required(empty_parser, complete_parser, subparser): -# assert has_required(complete_parser._actions) -# assert not has_required(empty_parser._actions) -# assert not has_required(subparser._actions) -# -# -# def test_has_subparsers(subparser, complete_parser): -# assert has_subparsers(subparser._actions) -# assert not has_subparsers(complete_parser._actions) -# -# -# def test_is_required(complete_parser): -# required = list(filter(is_required, complete_parser._actions)) -# assert len(required) == 4 -# for action in required: -# print(action.dest.startswith('req')) -# -# -# def test_is_optional(complete_parser): -# optional = list(filter(is_optional, complete_parser._actions)) -# assert len(optional) == 10 -# for action in optional: -# assert 'req' not in action.dest -# -# -# def test_is_choice(empty_parser): -# empty_parser.add_argument('--dropdown', choices=[1, 2]) -# assert is_choice(get_action(empty_parser, 'dropdown')) -# -# empty_parser.add_argument('--storetrue', action='store_true') -# assert not is_choice(get_action(empty_parser, 'storetrue')) -# -# # make sure positionals are caught as well (issue #85) -# empty_parser.add_argument('positional', choices=[1, 2]) -# assert is_choice(get_action(empty_parser, 'positional')) -# -# -# def test_is_standard(empty_parser): -# empty_parser.add_argument('--count', action='count') -# assert not is_standard(get_action(empty_parser, 'count')) -# -# empty_parser.add_argument('--store', action='store') -# assert is_standard(get_action(empty_parser, 'store')) -# -# -# def test_is_counter(empty_parser): -# empty_parser.add_argument('--count', action='count') -# assert is_counter(get_action(empty_parser, 'count')) -# -# empty_parser.add_argument('--dropdown', choices=[1, 2]) -# assert not is_counter(get_action(empty_parser, 'dropdown')) -# -# -# def test_mutually(exclusive_group): -# target_arg = find_arg_by_option(exclusive_group, '-i') -# json_result = build_radio_group(exclusive_group) -# -# data = json_result['data'][0] -# assert 'RadioGroup' == json_result['type'] -# assert target_arg.choices == data['choices'] -# assert target_arg.help == data['help'] -# assert target_arg.option_strings == data['commands'] -# assert target_arg.dest == data['display_name'] -# -# -# def test_empty_mutex_group(): -# assert not build_radio_group(None) -# -# -# def test_as_json_invalid_widget(): -# with pytest.raises(UnknownWidgetType): -# action_to_json(None, 'InvalidWidget', None) -# -# -# def get_action(parser, dest): -# for action in parser._actions: -# if action.dest == dest: -# return action -# -# -# def find_arg_by_option(group, option_string): -# for arg in group: -# if option_string in arg.option_strings: -# return arg