Source code for prompt_smart_menu.smart_menu

# -*- coding: utf-8 -*-
"""Build a command line menu declaratively."""

from collections import OrderedDict
from inspect import Parameter, signature
from typing import Callable, List, Tuple, Union

from prompt_smart_menu.helpers import InvalidArgError, Kwarg, NestedDict
from prompt_smart_menu.input_parser import InputParser


[docs]def is_list_of_strings(li: list) -> bool: """Return true if input is a list of strings.""" return all(isinstance(elem, str) for elem in li)
[docs]def is_list_of_dicts(li: list) -> bool: """Return true if input is a list of dicts.""" return all(isinstance(elem, dict) for elem in li)
[docs]def is_list_of_kwargs(li: list) -> bool: """Return true if input is a list of Kwargs.""" return all(isinstance(elem, Kwarg) for elem in li)
# def _help(self): # sig = signature(self._function) # if len(sig.parameters) != len(args): # pass
[docs]class PromptSmartMenu: """The main PromptSmartMenu class. Declare a menu's configuration as list of menu_node dicts. Initialize a PromptSmartMenu object with this configuration to generate a dict for auto-suggestion and to execute a command string against your menu. """ def __init__( self, menu_config: List[dict], parser: InputParser = InputParser(), validate_args: bool = False ) -> None: """Initialize with menu configuration. See documentation for instructions on building the menu_config dict. Args: menu_config (List[dict]): List of menu nodes. See documentation. parser (InputParser): The input parser for the menu's root. Note: parser is inherited by child nodes, unless overwritten. Default: InputParser that treats all arguments as strings. validate_args: (bool): If true, arguments are validated before calling an end-point function. Default: False """ if not is_list_of_dicts(menu_config): raise TypeError("menu_config takes a list of dictionaries.") if len(menu_config) == 0: raise ValueError("menu_config cannot be empty.") node = {'command': 'root', 'function': None, 'children': menu_config, 'parser': parser, 'validate_args': validate_args} self._root = MenuNode(**node)
[docs] def nested_completer_dict(self) -> dict: """Return a dict for `prompt_toolkit.NestedCompleter`.""" return self._root.get_menu()['root']
[docs] def run(self, input_string: str): """Run a command string against with your menu.""" return self._root.process_arg(input_string)