_D='strict' _C=True _B=False _A=None import os,sys from._compat import _default_text_stderr,_default_text_stdout,_find_binary_writer,auto_wrap_for_ansi,binary_streams,filename_to_ui,get_filesystem_encoding,get_strerror,is_bytes,open_stream,should_strip_ansi,strip_ansi,text_streams,WIN from.globals import resolve_color_default echo_native_types=str,bytes,bytearray def _posixify(name):return'-'.join(name.split()).lower() def safecall(func): def A(*A,**B): try:return func(*A,**B) except Exception:pass return A def make_str(value): A=value if isinstance(A,bytes): try:return A.decode(get_filesystem_encoding()) except UnicodeError:return A.decode('utf-8','replace') return str(A) def make_default_short_help(help,max_length=45): F=help.split();D=0;A=[];C=_B for B in F: if B[-1:]=='.':C=_C E=1+len(B)if A else len(B) if D+E>max_length:A.append('...');C=_C else: if A:A.append(' ') A.append(B) if C:break D+=E return''.join(A) class LazyFile: def __init__(A,filename,mode='r',encoding=_A,errors=_D,atomic=_B): E=errors;D=encoding;C=mode;B=filename;A.name=B;A.mode=C;A.encoding=D;A.errors=E;A.atomic=atomic if B=='-':A._f,A.should_close=open_stream(B,C,D,E) else: if'r'in C:open(B,C).close() A._f=_A;A.should_close=_C def __getattr__(A,name):return getattr(A.open(),name) def __repr__(A): if A._f is not _A:return repr(A._f) return f"" def open(A): if A._f is not _A:return A._f try:B,A.should_close=open_stream(A.name,A.mode,A.encoding,A.errors,atomic=A.atomic) except OSError as C:from.exceptions import FileError as D;raise D(A.name,hint=get_strerror(C)) A._f=B;return B def close(A): if A._f is not _A:A._f.close() def close_intelligently(A): if A.should_close:A.close() def __enter__(A):return A def __exit__(A,exc_type,exc_value,tb):A.close_intelligently() def __iter__(A):A.open();return iter(A._f) class KeepOpenFile: def __init__(A,file):A._file=file def __getattr__(A,name):return getattr(A._file,name) def __enter__(A):return A def __exit__(A,exc_type,exc_value,tb):0 def __repr__(A):return repr(A._file) def __iter__(A):return iter(A._file) def echo(message=_A,file=_A,nl=_C,err=_B,color=_A): C=color;B=file;A=message if B is _A: if err:B=_default_text_stderr() else:B=_default_text_stdout() if A is not _A and not isinstance(A,echo_native_types):A=str(A) if nl: A=A or'' if isinstance(A,str):A+='\n' else:A+=b'\n' if A and is_bytes(A): D=_find_binary_writer(B) if D is not _A:B.flush();D.write(A);D.flush();return if A and not is_bytes(A): C=resolve_color_default(C) if should_strip_ansi(B,C):A=strip_ansi(A) elif WIN: if auto_wrap_for_ansi is not _A:B=auto_wrap_for_ansi(B) elif not C:A=strip_ansi(A) if A:B.write(A) B.flush() def get_binary_stream(name): A=binary_streams.get(name) if A is _A:raise TypeError(f"Unknown standard stream '{name}'") return A() def get_text_stream(name,encoding=_A,errors=_D): A=text_streams.get(name) if A is _A:raise TypeError(f"Unknown standard stream '{name}'") return A(encoding,errors) def open_file(filename,mode='r',encoding=_A,errors=_D,lazy=_B,atomic=_B): E=atomic;D=errors;C=encoding;B=filename if lazy:return LazyFile(B,mode,C,D,atomic=E) A,F=open_stream(B,mode,C,D,atomic=E) if not F:A=KeepOpenFile(A) return A def get_os_args():import warnings as A;A.warn("'get_os_args' is deprecated and will be removed in 8.1. Access 'sys.argv[1:]' directly instead.",DeprecationWarning,stacklevel=2);return sys.argv[1:] def format_filename(filename,shorten=_B): A=filename if shorten:A=os.path.basename(A) return filename_to_ui(A) def get_app_dir(app_name,roaming=_C,force_posix=_B): A=app_name if WIN: C='APPDATA'if roaming else'LOCALAPPDATA';B=os.environ.get(C) if B is _A:B=os.path.expanduser('~') return os.path.join(B,A) if force_posix:return os.path.join(os.path.expanduser(f"~/.{_posixify(A)}")) if sys.platform=='darwin':return os.path.join(os.path.expanduser('~/Library/Application Support'),A) return os.path.join(os.environ.get('XDG_CONFIG_HOME',os.path.expanduser('~/.config')),_posixify(A)) class PacifyFlushWrapper: def __init__(A,wrapped):A.wrapped=wrapped def flush(A): try:A.wrapped.flush() except OSError as B: import errno if B.errno!=errno.EPIPE:raise def __getattr__(A,attr):return getattr(A.wrapped,attr)