U W?@sdZddlZddlZddlZddlZddlmZmZmZm Z m Z m Z m Z m Z mZddlmZddlmZejdkr|dZd Znd Zd Zd d ZGdddeZd"ddZddZddZddZGdddeZd#ddZddZerddl Z dd Z!nddl"Z"ddl#Z#d!d Z!dS)$aY click._termui_impl ~~~~~~~~~~~~~~~~~~ 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. :copyright: (c) 2014 by Armin Ronacher. :license: BSD, see LICENSE for more details. N) _default_text_stdout range_typePY2isatty open_stream strip_ansiterm_lenget_best_encodingWIN)echo)ClickExceptionnt  z [?25lz[?25h c Csz t|WStk rzt|j}Wntk r@YYdSXz ||}Wntk rfYYdSX|tkst|ttfr|dkrYdS|YSXdS)z%Returns the length hint of an object.Nr) len TypeErrortype__length_hint__AttributeErrorNotImplemented isinstanceintZlong)objZget_hintZhintr/_termui_impl.py _length_hints$     rc @seZdZd+d d Zd d Zd dZddZddZeddZ eddZ eddZ ddZ ddZ ddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*ZeseZ[dS), ProgressBarN# %(bar)s TFcCs||_||_||_||_||_||_| |_| |_| p6d|_| dkrHt } | |_ | |_ ||_ |dk|_ |dkrtt|}|dkr|dkrtdt|}t||_||_|dk |_d|_g|_t|_|_d|_d|_d|_d|_d|_t|j  |_d|_ dS)Nrziterable or length is requiredF)! fill_char empty_char bar_templateinfo_sepshow_eta show_percentshow_positem_show_funclabelrfilecolorwidth autowidthrrriterlength length_knownposavgtimestartlast_eta eta_knownfinished max_widthentered current_itemr is_hidden _last_line)selfiterabler2r$r%r&r'r(r)r*r+r,r-r.r/rrr__init__4sD    zProgressBar.__init__cCsd|_||S)NT)r<render_progressr@rrr __enter__\szProgressBar.__enter__cCs |dSN) render_finish)r@exc_type exc_valuetbrrr__exit__aszProgressBar.__exit__cCs|jstd||S)Nz.You need to use progress bars in a with block.)r< RuntimeErrorrCrDrrr__iter__dszProgressBar.__iter__cCs$|jr dS|jt|jdSrF)r>r-write AFTER_BARflushrDrrrrGjs zProgressBar.render_finishcCs$|jr dSt|jt|jpddS)N?r)r:minr4floatr2rDrrrpctpszProgressBar.pctcCs"|js dSt|jtt|jSNg)r5sumrSrrDrrrtime_per_iterationvszProgressBar.time_per_iterationcCs"|jr|js|j|j|jSdSrU)r3r:rWr2r4rDrrreta|s zProgressBar.etacCsn|jrj|jd}|d}|d}|d}|d}|d}|d}|dkr\|}d||||fSd|||fSdS)Nr<rz%dd %02d:%02d:%02dz%02d:%02d:%02dr#)r9rX)r@tZsecondsZminutesZhoursZdaysrrr format_etas zProgressBar.format_etacCs"t|j}|jr|d|j7}|S)Nz/%s)strr4r3r2)r@r4rrr format_poss zProgressBar.format_poscCsdt|jdddS)Nz% 4d%%dr)rrTrDrrr format_pctszProgressBar.format_pctcCsH|j}g}|jrPt|j|j}|j|}||j|j|7}|dkr|j }nf|jrd|j|j}nRt |j|jprd}|j dkr|j|tt |j |j dd|j<d|}|jr|||r|||jr|jr|js|||jdk r(||j}|dk r(|||j|j||j|dS)Nrrg@g?r#)r,barinfo)r)r3rrTr/r$r%r*r:listrWmathZcosr4joinappendr^r`r(r9r\r+r=r&r,r'rstrip)r@r)Z info_bitsZ bar_lengthraZ item_inforrrformat_progress_linesH         z ProgressBar.format_progress_linec Cs,ddlm}d}|jr$|jg}d}ng}|jr|j}d|_t|}td|d|}||kr| t | d|j ||_ ||_|j}|j dk r|j }| t |}t|} |j dks|j | kr| |_ | || d|| d |}||j kr(||_ t||j|j|d|jdS) Nr)get_terminal_sizeFTrrr#)r-r.nl)Ztermuirir>r,r0r/r rhmaxrf BEFORE_BARr;rer?r r-r.rP) r@rirjZbufZ old_widthZclutter_lengthZ new_widthZ clear_widthlineZline_lenrrrrCs>        zProgressBar.render_progresscCsz|j|7_|jr&|j|jkr&d|_t|jdkrnextr1r= StopIterationrqrCrp)r@rvrrrrrs     zProgressBar.next) Nrrr r!TNFNNNNr")__name__ __module__ __qualname__rBrErKrMrGpropertyrTrWrXr\r^r`rhrCrorprqrrr__next__rrrrr2sD (   %) rc Cs&t}ttjrt|s$t|||Stjddp4d}|rZt rNt |||St |||Stjddkrvt|||St stj drt |d|Sttdrtd d krt |d |Sd dl}|\}}t|z@ttdrtd |d krt |d |WSt|||WSt|XdS)z2Decide what method to use for paging through text.ZPAGERNr#ZTERM)ZdumbZemacsZos2zmore <systemz(less) 2>/dev/nullrlessz more "%s"Zmore)rrsysstdin _nullpagerosenvirongetstripr _tempfilepager _pipepagerplatform startswithhasattrrztempfilemkstempcloseunlink)textr.stdoutZ pager_cmdrfdfilenamerrrpagers,         rc Csddl}ttj}|ddd}|dkr|ddkrtjddd |dd}|sld |d<d }nd |ks|d |krd }|st|}|j |d |j |d}t |j }z"|j ||d|j Wnttfk rYnXz |Wntk rYqXqqdS)zqPage through text by feeding it to another program. Invoking a pager through this might support colors. rN/rr{LESSr#r-RTrR)shellr}envreplace) subprocessdictrrrsplitsplitrrerPopenPIPEr r}rNencoderIOErrorKeyboardInterruptwait) rcmdr.rrZ cmd_detailZ less_flagscencodingrrrr.s4      rc Cs|ddl}|}|st|}ttj}t|dd}|||W5QRXzt |d|dW5t |XdS)zSimply print unformatted text. This is the ultimate fallback.N)rrN)streamrr.rrrr~lsr~c@s.eZdZd ddZddZdd Zd d ZdS) EditorNT.txtcCs||_||_||_||_dSrF)editorr require_save extension)r@rrrrrrrrBuszEditor.__init__cCsb|jdk r|jSdD]}tj|}|r|Sqtr:dSdD]}td|dkr>|Sq>dS)N)ZVISUALZEDITORZnotepad)ZvimZnanozwhich %s >/dev/null 2>&1rZvi)rrrrr rz)r@keyrtrrrr get_editor|s    zEditor.get_editorc Csddl}|}|jr.tj}||jnd}z8|jd||f|dd}|}|dkrht d|Wn2t k r}zt d||fW5d}~XYnXdS)Nrz%s "%s"T)rrz%s: Editing failed!z%s: Editing failed: %s) rrrrrcopyrprrr OSError)r@rrrrrZ exit_codeerrr edit_files  zEditor.edit_filec Csddl}|pd}|r&|ds&|d7}|jd|jd\}}ztrRd}|dd}nd}||}t |d }| || tj |}|||jrtj ||krW._unquote_filedarwinrz-Wrz /dev/nullw)stderrzexplorer /select,"%s"rr#zstart %s "" "%s"z/WAIT.zxdg-open)zhttp://zhttps://r)rr|rrfrrrrr rrrzrdirnamerr webbrowser) rrZlocaterrargsZnullrrrrropen_urlsL          rcCs |dkrt|dkrtdS)N)rEOFError)chrrr_translate_ch_to_excsrcCsVt}|rt|t|trRttjdd}|dk rF||d}n |dd}|S)Nrrcp1252) msvcrtZgetchZputcharrrgetattrr|r}r)r rtencrrrgetchars  rc Csttjstd}|}ntj}d}zpt|}z4t |t|d}|rhttj rhtj |W5t|tj|tj |dk r| XWntjk rYnXt||ttjdS)Nz/dev/tty r)rr|r}rfilenotermiosZ tcgetattrZ tcsetattrZ TCSADRAINrrPrttyZsetrawrrrNerrorrrr )r rrZ old_settingsrrrrr s(       )N)FF)$__doc__rr|r6rdZ_compatrrrrrrr r r Zutilsr exceptionsr rrlrOrobjectrrrrr~rrrrrrrrrrrs8 ,   a /M 3