cengal.user_interface.console.cli_selector.versions.v_0.cli_selector
1#!/usr/bin/env python 2# coding=utf-8 3 4# Copyright © 2012-2024 ButenkoMS. All rights reserved. Contacts: <gtalk@butenkoms.space> 5# 6# Licensed under the Apache License, Version 2.0 (the "License"); 7# you may not use this file except in compliance with the License. 8# You may obtain a copy of the License at 9# 10# http://www.apache.org/licenses/LICENSE-2.0 11# 12# Unless required by applicable law or agreed to in writing, software 13# distributed under the License is distributed on an "AS IS" BASIS, 14# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15# See the License for the specific language governing permissions and 16# limitations under the License. 17 18 19__all__ = ['cli_selector', 'acli_selector'] 20 21 22""" 23Module Docstring 24Docstrings: http://www.python.org/dev/peps/pep-0257/ 25""" 26 27__author__ = "ButenkoMS <gtalk@butenkoms.space>" 28__copyright__ = "Copyright © 2012-2024 ButenkoMS. All rights reserved. Contacts: <gtalk@butenkoms.space>" 29__credits__ = ["ButenkoMS <gtalk@butenkoms.space>", ] 30__license__ = "Apache License, Version 2.0" 31__version__ = "4.4.1" 32__maintainer__ = "ButenkoMS <gtalk@butenkoms.space>" 33__email__ = "gtalk@butenkoms.space" 34# __status__ = "Prototype" 35__status__ = "Development" 36# __status__ = "Production" 37 38 39from cengal.parallel_execution.asyncio.ainput import ainput 40 41from enum import IntEnum 42from typing import Dict, Type, Optional 43 44 45class CliSelectorTerminatedByUser(Exception): 46 pass 47 48 49def cli_selector( 50 variants_type: Type[IntEnum], 51 variant_type_name_per_variant_type: Dict[IntEnum, str], 52 prompt: str, 53 default_index: int = 1, 54 header: Optional[str] = None, 55 result_template: Optional[str] = None, 56 ): 57 if 1 > default_index: 58 default_index = 1 59 60 variants_num: int = len(variants_type) 61 if 1 > variants_num: 62 raise ValueError('Empty variants_type') 63 64 if default_index > variants_num: 65 default_index = variants_num 66 67 default_index_str = str(default_index) 68 69 if header is not None: 70 print(header) 71 72 for variant_type, variant_type_name in variant_type_name_per_variant_type.items(): 73 print(f'{variant_type.value}. {variant_type_name}') 74 75 result = None 76 while not isinstance(result, variants_type): 77 try: 78 result = variants_type(int((input(prompt)).strip() or default_index_str)) 79 except ValueError: 80 pass # Try again. 81 except KeyboardInterrupt: 82 continue # Control-C pressed. Try again. 83 except EOFError: 84 raise CliSelectorTerminatedByUser() from None # Control-D pressed. 85 86 if result_template is not None: 87 print(result_template.format(result)) 88 89 return result 90 91 92async def acli_selector( 93 variants_type: Type[IntEnum], 94 variant_type_name_per_variant_type: Dict[IntEnum, str], 95 prompt: str, 96 default_index: int = 1, 97 header: Optional[str] = None, 98 result_template: Optional[str] = None, 99 ): 100 if 1 > default_index: 101 default_index = 1 102 103 variants_num: int = len(variants_type) 104 if 1 > variants_num: 105 raise ValueError('Empty variants_type') 106 107 if default_index > variants_num: 108 default_index = variants_num 109 110 default_index_str = str(default_index) 111 112 if header is not None: 113 print(header) 114 115 for variant_type, variant_type_name in variant_type_name_per_variant_type.items(): 116 print(f'{variant_type.value}. {variant_type_name}') 117 118 result = None 119 while not isinstance(result, variants_type): 120 try: 121 result = variants_type(int((await ainput(prompt)).strip() or default_index_str)) 122 except ValueError: 123 pass # Try again. 124 except KeyboardInterrupt: 125 continue # Control-C pressed. Try again. 126 except EOFError: 127 raise CliSelectorTerminatedByUser() from None # Control-D pressed. 128 129 if result_template is not None: 130 print(result_template.format(result)) 131 132 return result
def
cli_selector( variants_type: Type[enum.IntEnum], variant_type_name_per_variant_type: Dict[enum.IntEnum, str], prompt: str, default_index: int = 1, header: Union[str, NoneType] = None, result_template: Union[str, NoneType] = None):
50def cli_selector( 51 variants_type: Type[IntEnum], 52 variant_type_name_per_variant_type: Dict[IntEnum, str], 53 prompt: str, 54 default_index: int = 1, 55 header: Optional[str] = None, 56 result_template: Optional[str] = None, 57 ): 58 if 1 > default_index: 59 default_index = 1 60 61 variants_num: int = len(variants_type) 62 if 1 > variants_num: 63 raise ValueError('Empty variants_type') 64 65 if default_index > variants_num: 66 default_index = variants_num 67 68 default_index_str = str(default_index) 69 70 if header is not None: 71 print(header) 72 73 for variant_type, variant_type_name in variant_type_name_per_variant_type.items(): 74 print(f'{variant_type.value}. {variant_type_name}') 75 76 result = None 77 while not isinstance(result, variants_type): 78 try: 79 result = variants_type(int((input(prompt)).strip() or default_index_str)) 80 except ValueError: 81 pass # Try again. 82 except KeyboardInterrupt: 83 continue # Control-C pressed. Try again. 84 except EOFError: 85 raise CliSelectorTerminatedByUser() from None # Control-D pressed. 86 87 if result_template is not None: 88 print(result_template.format(result)) 89 90 return result
async def
acli_selector( variants_type: Type[enum.IntEnum], variant_type_name_per_variant_type: Dict[enum.IntEnum, str], prompt: str, default_index: int = 1, header: Union[str, NoneType] = None, result_template: Union[str, NoneType] = None):
93async def acli_selector( 94 variants_type: Type[IntEnum], 95 variant_type_name_per_variant_type: Dict[IntEnum, str], 96 prompt: str, 97 default_index: int = 1, 98 header: Optional[str] = None, 99 result_template: Optional[str] = None, 100 ): 101 if 1 > default_index: 102 default_index = 1 103 104 variants_num: int = len(variants_type) 105 if 1 > variants_num: 106 raise ValueError('Empty variants_type') 107 108 if default_index > variants_num: 109 default_index = variants_num 110 111 default_index_str = str(default_index) 112 113 if header is not None: 114 print(header) 115 116 for variant_type, variant_type_name in variant_type_name_per_variant_type.items(): 117 print(f'{variant_type.value}. {variant_type_name}') 118 119 result = None 120 while not isinstance(result, variants_type): 121 try: 122 result = variants_type(int((await ainput(prompt)).strip() or default_index_str)) 123 except ValueError: 124 pass # Try again. 125 except KeyboardInterrupt: 126 continue # Control-C pressed. Try again. 127 except EOFError: 128 raise CliSelectorTerminatedByUser() from None # Control-D pressed. 129 130 if result_template is not None: 131 print(result_template.format(result)) 132 133 return result