Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
path: root/archinstall/lib/menu/menu.py
diff options
context:
space:
mode:
authorWerner Llácer <wllacer@gmail.com>2022-01-12 23:24:38 +0100
committerGitHub <noreply@github.com>2022-01-12 23:24:38 +0100
commite8b6b1b334fffe5c5de8c2951a974b0126ffd2b0 (patch)
tree17c70f1d567676c494bafe4f53a7aae150c7be99 /archinstall/lib/menu/menu.py
parentc6fdf775c8b601a9b94f7c12849276e0b6fe0bfe (diff)
Restore generic_select function (#857)
* recreate generic_select and generic_multi_select functions * flake8 complains * Addressed some review issues -> Options checks propagated to Menu(() -> Options parameter inmutable at Menu() -> Some text adapted -> Sort will be handled by Menu() -> Better handling of default value * Solved the two problems found: lack of list(dict.[keys/values] and impact in copy() sideffects of renaming menu parameter options into p_options * Now the problem of the copy was with a generator * Add a log message whenever an "strange" object type is sent into Menu * Validation of types has been streamlined. Default values are now accesible to generic_select without restriction
Diffstat (limited to 'archinstall/lib/menu/menu.py')
-rw-r--r--archinstall/lib/menu/menu.py33
1 files changed, 29 insertions, 4 deletions
diff --git a/archinstall/lib/menu/menu.py b/archinstall/lib/menu/menu.py
index 65be4956..dfd47a7a 100644
--- a/archinstall/lib/menu/menu.py
+++ b/archinstall/lib/menu/menu.py
@@ -1,15 +1,20 @@
from archinstall.lib.menu.simple_menu import TerminalMenu
+from ..exceptions import RequirementError
+from ..output import log
+from collections.abc import Iterable
+import sys
+import logging
class Menu(TerminalMenu):
- def __init__(self, title, options, skip=True, multi=False, default_option=None, sort=True):
+ def __init__(self, title, p_options, skip=True, multi=False, default_option=None, sort=True):
"""
Creates a new menu
:param title: Text that will be displayed above the menu
:type title: str
- :param options: Options to be displayed in the menu to chose from;
+ :param p_options: Options to be displayed in the menu to chose from;
if dict is specified then the keys of such will be used as options
:type options: list, dict
@@ -25,9 +30,29 @@ class Menu(TerminalMenu):
:param sort: Indicate if the options should be sorted alphabetically before displaying
:type sort: bool
"""
+ # we guarantee the inmutability of the options outside the class.
+ # an unknown number of iterables (.keys(),.values(),generator,...) can't be directly copied, in this case
+ # we recourse to make them lists before, but thru an exceptions
+ # this is the old code, which is not maintenable with more types
+ # options = copy(list(p_options) if isinstance(p_options,(type({}.keys()),type({}.values()))) else p_options)
+ # We check that the options are iterable. If not we abort. Else we copy them to lists
+ # it options is a dictionary we use the values as entries of the list
+ # if options is a string object, each character becomes an entry
+ # if options is a list, we implictily build a copy to mantain immutability
+ if not isinstance(p_options,Iterable):
+ log(f"Objects of type {type(p_options)} is not iterable, and are not supported at Menu",fg="red")
+ log(f"invalid parameter at Menu() call was at <{sys._getframe(1).f_code.co_name}>",level=logging.WARNING)
+ raise RequirementError("Menu() requires an iterable as option.")
+
+ if isinstance(p_options,dict):
+ options = list(p_options.keys())
+ else:
+ options = list(p_options)
- if isinstance(options, dict):
- options = list(options)
+ if not options:
+ log(" * Menu didn't find any options to choose from * ", fg='red')
+ log(f"invalid parameter at Menu() call was at <{sys._getframe(1).f_code.co_name}>",level=logging.WARNING)
+ raise RequirementError('Menu.__init__() requires at least one option to proceed.')
if sort:
options = sorted(options)