a =jg`@sLdZddlZddlZddlZddlZddlZddlZddlmZ ddl m Z ddl m Z ddlmZddlmZdd lmZdd lmZdd lmZdd lmZdd lmZddlmZddlmZddlmZddlmZedZejdkrdZ dZ!ndZ dZ!Gdddej"eZ#d6ej$e%ej&e'ddddZ(ej$e%e%ej&e'e'dddZ)ej$e%e%ej&e'e'dd d!Z*ej+ej$e%ej&e'dd"d#d$Z,Gd%d&d&Z-d7e%e'e'e.d(d)d*Z/e%ej&e0d+d,d-Z1erddl2Z2ej3ej4e.d.d/d0Z5e'e%d1d2d3Z6n:ddl7Z7ddl8Z8ej3ej4e.d.d4d0Z5e'e%d1d5d3Z6dS)8z This module contains implementations for the termui module. To keep the import time of Click down, some infrequently used functionality is placed in this module and only imported as needed. N)gettext)StringIO)which) TracebackType)_default_text_stdout)CYGWIN)get_best_encoding)isatty) open_stream) strip_ansi)term_len)WIN)ClickException)echoVnt  z [?25lz[?25h c@seZdZd6ejejeejeeeeee eje e ejej ejegejefejeejej eje eedd d d Z d dddZ ejejeejeejeddddZejedddZedddZddddZeedddZeedddZeedddZedd d!Zedd"d#Zedd$d%Zedd&d'Zedd(d)Zddd*d+Z edd,d-d.Z!d7eejedd/d0d1Z"ddd2d3Z#ejedd4d5Z$dS)8 ProgressBarN# %(bar)s TFr)iterablelength fill_char empty_char bar_templateinfo_sepshow_eta show_percentshow_positem_show_funclabelfilecolorupdate_min_stepswidthreturncCs@||_||_||_||_||_||_| |_| |_| p6d|_| durVt } | durVt } | |_ | |_ ||_ d|_||_|dk|_|durddlm}||d}|dkrd}|dur|durtdttjtt|}t||_||_d|_g|_||t|_|_d|_ d|_!d|_"d|_#d|_$t%|j  |_&d|_'dS)Nr) length_hintziterable or length is requiredF)(rrrr r!r"r#r$r%rrr&r'r(_completed_intervalsr) autowidthoperatorr, TypeErrortcastIterablerrangeiterrposavgtimestartlast_eta eta_knownfinished max_widthentered current_itemr is_hidden _last_line)selfrrrrrr r!r"r#r$r%r&r'r(r)r,rD||_t||j|jdd|jdS)Nr)r&r'rr+F)r&r'nl)shutilrArBr%rr&r'r/r)r r{maxget_terminal_sizecolumnsry BEFORE_BARr>rtrY) rCr}bufZ old_widthZclutter_lengthZ new_widthZ clear_widthlineline_lenrDrDrErHs@        zProgressBar.render_progress)n_stepsr*cCs|j|7_|jdur*|j|jkr*d|_t|jdkr@dSt|_|jrft|j|j}nt|j}|jdd|g|_|jdu|_dS)NTrZi)r7rr=r9r;r:r8r<)rCrsteprDrDrE make_steps zProgressBar.make_step)rr@r*cCsF|dur||_|j|7_|j|jkrB||j|d|_dS)aUpdate the progress bar by advancing a specified number of steps, and optionally set the ``current_item`` for this new position. :param n_steps: Number of steps to advance. :param current_item: Optional item to set as ``current_item`` for the updated position. .. versionchanged:: 8.0 Added the ``current_item`` optional parameter. .. versionchanged:: 8.0 Only render when the number of steps meets the ``update_min_steps`` threshold. Nr)r@r.r(rrH)rCrr@rDrDrEupdate)s  zProgressBar.updatecCsd|_d|_d|_dS)NFT)r<r@r=rIrDrDrEfinishCszProgressBar.finishccsj|jstd|jr"|jEdHnD|jD],}||_|jdkrD||V|dq(||dS)zReturn a generator which yields the items added to the bar during construction, and updates the progress bar *after* the yielded block returns. rQNrr) r?rRrAr6r@r.rHrr)rCrvrDrDrErSHs    zProgressBar.generator)NrrrrTNFNNNNrr)N)%__name__ __module__ __qualname__r2Optionalr4rrfrlboolCallableTextIOrFrJType BaseExceptionrrPIteratorrTrVrOpropertyr\r]rarbrjrmrprwr{rHrrrrSrDrDrDrEr'sr   E -r)rSr'r*c Cs"t}|durt}ttjr&t|s2t|||StjddpBd }|rrt rbt |||rrdSnt |||rrdStjddvrt|||St stj drt |d|rdSt |d|rdSd dl}|\}}t|z4t |d|rWt|dSt|||Wt|St|0dS) z2Decide what method to use for paging through text.NZPAGERr+TERM)dumbemacsZos2morelessr)rrr sysstdin _nullpagerosenvirongetstripr_tempfilepager _pipepagerplatform startswithtempfilemkstempcloseunlink)rSr'stdoutZ pager_cmdrfdfilenamerDrDrEpagerjs@           r)rScmdr'r*c Cs6t|}|durdSddl}ttj}|ddd}|dur|ddkrtjdd d |dd}|sd |d<d }nd |vsd|vrd }|j |gd |j |dd d}|j dusJz&|D]} |st | } |j | qWnttfyYn 0|j z |Wnty(Yn0q2qd S)zPage through text by feeding it to another program. Invoking a pager through this might support colors. Returns True if the command was found, False otherwise and thus another pager should be attempted. NFrrkrr-rLESSr+r-RTrRreplace)shellrenverrorstext)r subprocessdictrrrsplitsplitrrtPopenPIPErr rWOSErrorKeyboardInterruptrwait) rSrr' cmd_absoluterrZ cmd_detailZ less_flagscrrDrDrErsH $  rc Cst|}|durdSddl}ddl}|\}}d|}|sFt|}ttj} t |dd } | | | Wdn1s0Yz>z| ||gWnt yYn0Wt|t|nt|t|0dS)zPage through text by invoking a program on a temporary file. Returns True if the command was found, False otherwise and thus another pager should be attempted. NFrr+wbT)rrrrrtr r rrr rWencodecallrrrr) rSrr'rrrrrrencodingfrDrDrErs*    .    r)streamrSr'r*cCs$|D]}|st|}||qdS)z>Simply print unformatted text. This is the ultimate fallback.N)r rW)rrSr'rrDrDrErsrc@sxeZdZdejeejejeefeeddddZeddd Z edd d d Z ejej ejej d ddZ dS)EditorNT.txt)editorr require_save extensionr*cCs||_||_||_||_dSrN)rrrr)rCrrrrrDrDrErFszEditor.__init__rGcCs\|jdur|jSdD]}tj|}|r|Sqtr:dSdD]}t|dur>|Sq>dS)N)ZVISUALZEDITORZnotepad)zsensible-editorvimZnanovi)rrrrrr)rCkeyrrrDrDrE get_editors     zEditor.get_editor)rr*c Csddl}|}d}|jr0tj}||jzD|j|d|d|dd}|}|dkrrt t dj |dWn<t y}z$t t dj ||d |WYd}~n d}~00dS) Nrz ""T)rrz{editor}: Editing failed)rz{editor}: Editing failed: {e})re) rrrrrcopyrrrr_formatr)rCrrrrr exit_coderrDrDrE edit_files&  zEditor.edit_file)rr*c Csddl}|sd}nLt|ttfr&|}n8|r<|ds<|d7}trT|ddd}n |d}|jd|j d\}}z t |d }| |Wdn1s0Yt |t j|t j|d ft j|}|||jrt j||krWt |dSt|d }|}Wdn1s:0Yt|ttfrd|Wt |S|dddWt |St |0dS) Nrrz z utf-8-sigzutf-8zeditor-)prefixsuffixrrb)r isinstancebytes bytearrayendswithrrrrrrfdopenrWutimepathgetatimegetmtimerrropenreaddecode) rCrrdatarnamer timestamprrDrDrEedit3s> ($    (  z Editor.edit)NNTr) rrrr2rrlMappingrrFrrAnyStrrrDrDrDrErs rF)urlrlocater*c Csddl}ttddd}tjdkrdg}|r6|d|rD|d|||td d }z|j||d W|S|0nt r|r||}d d |g}n(dg}|r|d|d||z | |WSt yYdS0njt r`|r||}dt j|g}n dg}|r2|d||z | |WSt y^YdS0zJ|rt j||p|d}n||}|d|g}|r|WSWdSt y|dr|s|sddl}||YdSYdS0dS)Nr)rr*cSs*ddlm}|dr&||dd}|S)Nr)unquotezfile://) urllib.parserr)rrrDrDrE _unquote_filefs  zopen_url.._unquote_filedarwinrz-Wrz /dev/nullw)stderrZexplorerz/select,r:z/WAITr+Zcygstartz-w.zxdg-open)zhttp://zhttps://r)rrlrrryrrrrrrrrrrdirnamer webbrowser) rrrrrargsnullrrrDrDrEopen_urlcsl               r)chr*cCs6|dkrt|dkr ts t|dkr2tr2tdS)N)rrEOFError)rrDrDrE_translate_ch_to_excs  rrGccs dVdS)Nr-rDrDrDrDrE raw_terminalsr)rr*cCs6|r tj}ntj}|}|dvr*||7}t||S)N)à)msvcrtZgetwchegetwchr)rfuncrrDrDrEgetchars  r c csttjstd}|}ntj}d}zzt|}z>t||VWt |tj |tj |dur| n,t |tj |tj |dur| 0WntjyYn0dS)Nz/dev/tty)r rrrfilenotermios tcgetattrttyZsetraw tcsetattr TCSADRAINrrYrerror)rrZ old_settingsrDrDrErs(        cCsjtP}t|dttjd}|rsh                E ' B ' aG 0