_C=True _B=False _A=None import inspect,io,itertools,os,struct,sys from._compat import DEFAULT_COLUMNS,get_winterm_size,isatty,strip_ansi,WIN from.exceptions import Abort from.exceptions import UsageError from.globals import resolve_color_default from.types import Choice from.types import convert_type from.types import Path from.utils import echo from.utils import LazyFile visible_prompt_func=input _ansi_colors={'black':30,'red':31,'green':32,'yellow':33,'blue':34,'magenta':35,'cyan':36,'white':37,'reset':39,'bright_black':90,'bright_red':91,'bright_green':92,'bright_yellow':93,'bright_blue':94,'bright_magenta':95,'bright_cyan':96,'bright_white':97} _ansi_reset_all='\x1b[0m' def hidden_prompt_func(prompt):import getpass as A;return A.getpass(prompt) def _build_prompt(text,suffix,show_default=_B,default=_A,show_choices=_C,type=_A): B=default;A=text if type is not _A and show_choices and isinstance(type,Choice):A+=f" ({', '.join(map(str,type.choices))})" if B is not _A and show_default:A=f"{A} [{_format_default(B)}]" return f"{A}{suffix}" def _format_default(default): A=default if isinstance(A,(io.IOBase,LazyFile))and hasattr(A,'name'):return A.name return A def prompt(text,default=_A,hide_input=_B,confirmation_prompt=_B,type=_A,value_proc=_A,prompt_suffix=': ',show_default=_C,err=_B,show_choices=_C): F=hide_input;C=err;B=value_proc;A=default;E=_A def G(text): A=hidden_prompt_func if F else visible_prompt_func try:echo(text,nl=_B,err=C);return A('') except(KeyboardInterrupt,EOFError): if F:echo(_A,err=C) raise Abort() if B is _A:B=convert_type(type,A) I=_build_prompt(text,prompt_suffix,show_default,A,show_choices,type) while 1: while 1: D=G(I) if D:break elif A is not _A: if isinstance(B,Path):D=A;break return A try:E=B(D) except UsageError as J:echo(f"Error: {J.message}",err=C);continue if not confirmation_prompt:return E while 1: H=G('Repeat for confirmation: ') if H:break if D==H:return E echo('Error: the two entered values do not match',err=C) def confirm(text,default=_B,abort=_B,prompt_suffix=': ',show_default=_C,err=_B): C=default;D=_build_prompt(text,prompt_suffix,show_default,'Y/n'if C else'y/N') while 1: try:echo(D,nl=_B,err=err);B=visible_prompt_func('').lower().strip() except(KeyboardInterrupt,EOFError):raise Abort() if B in('y','yes'):A=_C elif B in('n','no'):A=_B elif B=='':A=C else:echo('Error: invalid input',err=err);continue break if abort and not A:raise Abort() return A def get_terminal_size(): import shutil as C if hasattr(C,'get_terminal_size'):return C.get_terminal_size() if get_winterm_size is not _A: D=get_winterm_size() if D==(0,0):return 79,24 else:return D def B(fd): try:import fcntl,termios as A;B=struct.unpack('hh',fcntl.ioctl(fd,A.TIOCGWINSZ,'1234')) except Exception:return return B A=B(0)or B(1)or B(2) if not A: try: E=os.open(os.ctermid(),os.O_RDONLY) try:A=B(E) finally:os.close(E) except Exception:pass if not A or not A[0]or not A[1]:A=os.environ.get('LINES',25),os.environ.get('COLUMNS',DEFAULT_COLUMNS) return int(A[1]),int(A[0]) def echo_via_pager(text_or_generator,color=_A): B=color;A=text_or_generator;B=resolve_color_default(B) if inspect.isgeneratorfunction(A):C=A() elif isinstance(A,str):C=[A] else:C=iter(A) D=(A if isinstance(A,str)else str(A)for A in C);from._termui_impl import pager;return pager(itertools.chain(D,'\n'),B) def progressbar(iterable=_A,length=_A,label=_A,show_eta=_C,show_percent=_A,show_pos=_B,item_show_func=_A,fill_char='#',empty_char='-',bar_template='%(label)s [%(bar)s] %(info)s',info_sep=' ',width=36,file=_A,color=_A):A=color;from._termui_impl import ProgressBar as B;A=resolve_color_default(A);return B(iterable=iterable,length=length,show_eta=show_eta,show_percent=show_percent,show_pos=show_pos,item_show_func=item_show_func,fill_char=fill_char,empty_char=empty_char,bar_template=bar_template,info_sep=info_sep,file=file,label=label,width=width,color=A) def clear(): if not isatty(sys.stdout):return if WIN:os.system('cls') else:sys.stdout.write('\x1b[2J\x1b[1;1H') def style(text,fg=_A,bg=_A,bold=_A,dim=_A,underline=_A,blink=_A,reverse=_A,reset=_C): D=reverse;C=blink;B=underline;A=[] if fg: try:A.append(f"[{_ansi_colors[fg]}m") except KeyError:raise TypeError(f"Unknown color {fg!r}") if bg: try:A.append(f"[{_ansi_colors[bg]+10}m") except KeyError:raise TypeError(f"Unknown color {bg!r}") if bold is not _A:A.append(f"[{1 if bold else 22}m") if dim is not _A:A.append(f"[{2 if dim else 22}m") if B is not _A:A.append(f"[{4 if B else 24}m") if C is not _A:A.append(f"[{5 if C else 25}m") if D is not _A:A.append(f"[{7 if D else 27}m") A.append(text) if reset:A.append(_ansi_reset_all) return''.join(A) def unstyle(text):return strip_ansi(text) def secho(message=_A,file=_A,nl=_C,err=_B,color=_A,**B): A=message if A is not _A:A=style(A,**B) return echo(A,file=file,nl=nl,err=err,color=color) def edit(text=_A,editor=_A,env=_A,require_save=_C,extension='.txt',filename=_A): B=filename;A=editor;from._termui_impl import Editor as C;A=C(editor=A,env=env,require_save=require_save,extension=extension) if B is _A:return A.edit(text) A.edit_file(B) def launch(url,wait=_B,locate=_B):from._termui_impl import open_url as A;return A(url,wait=wait,locate=locate) _getchar=_A def getchar(echo=_B): A=_getchar if A is _A:from._termui_impl import getchar as A return A(echo) def raw_terminal():from._termui_impl import raw_terminal as A;return A() def pause(info='Press any key to continue ...',err=_B): A=info if not isatty(sys.stdin)or not isatty(sys.stdout):return try: if A:echo(A,nl=_B,err=err) try:getchar() except(KeyboardInterrupt,EOFError):pass finally: if A:echo(err=err)