From 3d108cbcc71a2624533019c9eaec67fc8d98516b Mon Sep 17 00:00:00 2001 From: Jayson Messenger Date: Tue, 26 Jun 2018 12:15:42 -0400 Subject: [PATCH 1/3] Added `default` parameter to RadioList and radiolist_dialog Default index allows for pre-selecting an entry in a list, useful for dialogs with many values. --- prompt_toolkit/shortcuts/dialogs.py | 4 ++-- prompt_toolkit/widgets/base.py | 9 ++++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/prompt_toolkit/shortcuts/dialogs.py b/prompt_toolkit/shortcuts/dialogs.py index fa8d0554d1..742b7f4c7b 100644 --- a/prompt_toolkit/shortcuts/dialogs.py +++ b/prompt_toolkit/shortcuts/dialogs.py @@ -111,14 +111,14 @@ def message_dialog(title='', text='', ok_text='Ok', style=None, async_=False): def radiolist_dialog(title='', text='', ok_text='Ok', cancel_text='Cancel', - values=None, style=None, async_=False): + values=None, style=None, async_=False, default=0): """ Display a simple message box and wait until the user presses enter. """ def ok_handler(): get_app().exit(result=radio_list.current_value) - radio_list = RadioList(values) + radio_list = RadioList(values, default) dialog = Dialog( title=title, diff --git a/prompt_toolkit/widgets/base.py b/prompt_toolkit/widgets/base.py index a90709ba02..1e06d69018 100644 --- a/prompt_toolkit/widgets/base.py +++ b/prompt_toolkit/widgets/base.py @@ -497,16 +497,19 @@ class RadioList(object): List of radio buttons. Only one can be checked at the same time. :param values: List of (value, label) tuples. + :param default: Default index to select, defaults to 0 """ - def __init__(self, values): + def __init__(self, values, default=0): assert isinstance(values, list) assert len(values) > 0 assert all(isinstance(i, tuple) and len(i) == 2 for i in values) + assert 0 <= default < len(values) self.values = values - self.current_value = values[0][0] - self._selected_index = 0 + + self.current_value = values[default][0] + self._selected_index = default # Key bindings. kb = KeyBindings() From 0c96ec5035aff651687052aa5b35c894173474ad Mon Sep 17 00:00:00 2001 From: Jayson Messenger Date: Tue, 26 Jun 2018 16:14:44 -0400 Subject: [PATCH 2/3] Added in RadioList unit tests Only covers initialization --- tests/test_radiolist.py | 96 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 tests/test_radiolist.py diff --git a/tests/test_radiolist.py b/tests/test_radiolist.py new file mode 100644 index 0000000000..4b414ff4b8 --- /dev/null +++ b/tests/test_radiolist.py @@ -0,0 +1,96 @@ +from __future__ import unicode_literals + +from prompt_toolkit.widgets import RadioList + +import pytest + +def test_initial(): + values = [ + (1, 'some_text'), + ('fizz', 'some_more_text'), + ({'foo':'bar'}, 'even_more_text') + ] + radiolist = RadioList(values) + assert radiolist.current_value == 1 + assert radiolist._selected_index == 0 + +def test_default(): + values = [ + (1, 'some_text'), + ('fizz', 'some_more_text'), + ({'foo':'bar'}, 'even_more_text') + ] + radiolist = RadioList(values, 1) + assert radiolist.current_value == 'fizz' + assert radiolist._selected_index == 1 + +def test_bad_params(): + with pytest.raises(AssertionError): + radiolist = RadioList([]) + + with pytest.raises(AssertionError): + radiolist = RadioList(None) + + with pytest.raises(AssertionError): + values = ( + (1, 'some_text'), + ('fizz', 'some_more_text'), + ({'foo':'bar'}, 'even_more_text') + ) + radiolist = RadioList(values) + + with pytest.raises(AssertionError): + values = [ + (1, 'some_text', 'whoops'), + ('fizz', 'some_more_text'), + ({'foo':'bar'}, 'even_more_text') + ] + radiolist = RadioList(values) + + with pytest.raises(AssertionError): + values = [ + (1, 'some_text'), + ('fizz', ), + ({'foo':'bar'}, 'even_more_text') + ] + radiolist = RadioList(values) + + with pytest.raises(AssertionError): + values = [ + (1, 'some_text'), + ('fizz', 'some_more_text'), + [{'foo':'bar'}, 'even_more_text'] + ] + radiolist = RadioList(values) + + with pytest.raises(AssertionError): + values = [ + (1, 'some_text'), + ('fizz', 'some_more_text'), + ({'foo':'bar'}, 'even_more_text') + ] + radiolist = RadioList(values, 3) + + with pytest.raises(AssertionError): + values = [ + (1, 'some_text'), + ('fizz', 'some_more_text'), + ({'foo':'bar'}, 'even_more_text') + ] + radiolist = RadioList(values, -1) + + with pytest.raises(AssertionError): + values = [ + (1, 'some_text'), + ('fizz', 'some_more_text'), + ({'foo':'bar'}, 'even_more_text') + ] + radiolist = RadioList(values, None) + + with pytest.raises(AssertionError): + values = [ + (1, 'some_text'), + ('fizz', 'some_more_text'), + ({'foo':'bar'}, 'even_more_text') + ] + radiolist = RadioList(values, 'whoops') From a36425919ccf9d40e446c0a35303dd07eafa0801 Mon Sep 17 00:00:00 2001 From: Jayson Messenger Date: Tue, 26 Jun 2018 16:13:59 -0400 Subject: [PATCH 3/3] Added check for int type in RadioList Uncovered in unit tests --- prompt_toolkit/widgets/base.py | 1 + 1 file changed, 1 insertion(+) diff --git a/prompt_toolkit/widgets/base.py b/prompt_toolkit/widgets/base.py index 1e06d69018..eeee7aeb52 100644 --- a/prompt_toolkit/widgets/base.py +++ b/prompt_toolkit/widgets/base.py @@ -504,6 +504,7 @@ def __init__(self, values, default=0): assert len(values) > 0 assert all(isinstance(i, tuple) and len(i) == 2 for i in values) + assert isinstance(default, int) assert 0 <= default < len(values) self.values = values