index : archinstall32 | |
Archlinux32 installer | gitolite user |
summaryrefslogtreecommitdiff |
author | Werner Llácer <wllacer@gmail.com> | 2022-01-12 23:24:38 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-12 23:24:38 +0100 |
commit | e8b6b1b334fffe5c5de8c2951a974b0126ffd2b0 (patch) | |
tree | 17c70f1d567676c494bafe4f53a7aae150c7be99 /archinstall/lib/menu/menu.py | |
parent | c6fdf775c8b601a9b94f7c12849276e0b6fe0bfe (diff) |
-rw-r--r-- | archinstall/lib/menu/menu.py | 33 |
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) |