From 7bdc7d37d31985e916e1acdc8856ed3eca923e34 Mon Sep 17 00:00:00 2001
From: Peter Kessen
Date: Thu, 28 Jan 2016 20:26:04 +0100
Subject: [PATCH] Introduced input_select_items
alternative and more flexibile implementation to fulfil #1723
Added test case for new input method
---
beets/ui/__init__.py | 25 ++++++++++++++++++++++
test/test_ui_init.py | 50 ++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 75 insertions(+)
diff --git a/beets/ui/__init__.py b/beets/ui/__init__.py
index eaf79a0ce..d17e0b32c 100644
--- a/beets/ui/__init__.py
+++ b/beets/ui/__init__.py
@@ -367,6 +367,31 @@ def input_yn(prompt, require=False):
return sel == 'y'
+def input_select_items(prompt, items, rep):
+ """Prompts the user to use all, none or some of the items
+ Will return the list of items the user selected
+ prompt: prompt to use for all and for selective choice
+ items: full list of items
+ rep: function which represents an item to the user
+ is called with the item as argument
+ function is responsive for newline at input
+ """
+ out_items = []
+ choice = input_options(
+ ('y', 'n', 's'), False,
+ '%s (Yes/No/Selective)?' % prompt)
+ print()
+ if choice == 'y':
+ out_items = items
+ elif choice == 's':
+ for item in items:
+ rep(item)
+ if input_yn('%s (y/n)?' % prompt, True):
+ out_items.append(item)
+ print()
+ return out_items
+
+
# Human output formatting.
def human_bytes(size):
diff --git a/test/test_ui_init.py b/test/test_ui_init.py
index d692868be..6ab94f9ea 100644
--- a/test/test_ui_init.py
+++ b/test/test_ui_init.py
@@ -21,6 +21,56 @@ from test._common import unittest
from beets import ui
+class InputMethodsTest(_common.TestCase):
+ def setUp(self):
+ super(InputMethodsTest, self).setUp()
+ self.io.install()
+
+ def _print_helper(self, s):
+ print(s)
+
+ def _print_helper2(self, s, prefix):
+ print(prefix, s)
+
+ def test_input_select_items(self):
+ full_items = ['1', '2', '3', '4', '5']
+
+ # Test no
+ self.io.addinput('n')
+ items = ui.input_select_items(
+ "Prompt", full_items, self._print_helper)
+ self.assertEqual(items, [])
+
+ # Test yes
+ self.io.addinput('y')
+ items = ui.input_select_items(
+ "Prompt", full_items, self._print_helper)
+ self.assertEqual(items, full_items)
+
+ # Test selective 1
+ self.io.addinput('s')
+ self.io.addinput('n')
+ self.io.addinput('y')
+ self.io.addinput('n')
+ self.io.addinput('y')
+ self.io.addinput('n')
+ items = ui.input_select_items(
+ "Prompt", full_items, self._print_helper)
+ self.assertEqual(items, ['2', '4'])
+
+ # Test selective 2
+ self.io.addinput('s')
+ self.io.addinput('y')
+ self.io.addinput('y')
+ self.io.addinput('n')
+ self.io.addinput('y')
+ self.io.addinput('n')
+ items = ui.input_select_items(
+ "Prompt", full_items,
+ lambda s: self._print_helper2(s, "Prefix"))
+ self.assertEqual(items, ['1', '2', '4'])
+
+
class InitTest(_common.LibTestCase):
def setUp(self):
super(InitTest, self).setUp()