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