U ½šWù?ã@sdZddlZddlZddlZddlZddlmZmZmZm Z m Z m Z m Z m Z mZddlmZddlmZejdkr|dZd Znd Zd Zd d „ZGdd„deƒZd"dd„Zdd„Zdd„Zdd„ZGdd„deƒZd#dd„Zdd„Zeröddl 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_typeÚPY2ÚisattyÚ open_streamÚ strip_ansiÚterm_lenÚget_best_encodingÚWIN)Úecho)ÚClickExceptionÚntú Ú z [?25lz[?25h c Csšz t|ƒWStk r”zt|ƒj}Wntk r@YYdSXz ||ƒ}Wntk rfYYdSX|tks†t|ttfƒr†|dkrŒYdS|YSXdS)z%Returns the length hint of an object.Nr) ÚlenÚ TypeErrorÚtypeÚ__length_hint__ÚAttributeErrorÚNotImplementedÚ isinstanceÚintZlong)ÚobjZget_hintZhint©rú/_termui_impl.pyÚ _length_hints$     ÿþrc @s¬eZdZd+d d „Zd d „Zd d„Zdd„Zdd„Zedd„ƒZ edd„ƒZ edd„ƒZ dd„Z dd„Z dd„Zdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„Zd)d*„Zes¨eZ[dS),Ú ProgressBarNú#ú ú%(bar)sú TFécCs||_||_||_||_||_||_| |_| |_| p6d|_| dkrHt ƒ} | |_ | |_ ||_ |dk|_ |dkrtt|ƒ}|dkr”|dkrŒtdƒ‚t|ƒ}t|ƒ|_||_|dk |_d|_g|_t ¡|_|_d|_d|_d|_d|_d|_t|j ƒ |_d|_ dS)NÚrziterable or length is requiredF)!Ú fill_charÚ empty_charÚ bar_templateÚinfo_sepÚshow_etaÚ show_percentÚshow_posÚitem_show_funcÚlabelrÚfileÚcolorÚwidthÚ autowidthrrrÚiterÚlengthÚ length_knownÚposÚavgÚtimeÚstartÚlast_etaÚ eta_knownÚfinishedÚ max_widthÚenteredÚ current_itemrÚ is_hiddenÚ _last_line)ÚselfÚiterabler2r$r%r&r'r(r)r*r+r,r-r.r/rrrÚ__init__4sD    zProgressBar.__init__cCsd|_| ¡|S)NT)r<Úrender_progress©r@rrrÚ __enter__\szProgressBar.__enter__cCs | ¡dS©N)Ú render_finish)r@Úexc_typeÚ exc_valueÚtbrrrÚ__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|j t¡|j ¡dSrF)r>r-ÚwriteÚ AFTER_BARÚflushrDrrrrGjs zProgressBar.render_finishcCs$|jr dSt|jt|jƒpddƒS)Nçð?r)r:Úminr4Úfloatr2rDrrrÚpctpszProgressBar.pctcCs"|js dSt|jƒtt|jƒƒS©Ng)r5ÚsumrSrrDrrrÚtime_per_iterationvszProgressBar.time_per_iterationcCs"|jr|js|j|j|jSdSrU)r3r:rWr2r4rDrrrÚeta|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_eta‚s zProgressBar.format_etacCs"t|jƒ}|jr|d|j7}|S)Nz/%s)Ústrr4r3r2)r@r4rrrÚ format_pos’s zProgressBar.format_poscCsdt|jdƒdd…S)Nz% 4d%%édr)rrTrDrrrÚ format_pct˜szProgressBar.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 |¡dœ ¡S)Nrrg@gà?r#)r,ÚbarÚinfo)r)r3rrTr/r$r%r*r:ÚlistrWÚmathZcosr4ÚjoinÚappendr^r`r(r9r\r+r=r&r,r'Úrstrip)r@r)Z info_bitsZ bar_lengthraZ item_inforrrÚformat_progress_line›sH   ÿÿÿÿ      ýz ProgressBar.format_progress_linec Cs,ddlm}d}|jr$|jg}d}nÊg}|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|j ¡dS) Nr)Úget_terminal_sizeFTrrr#)r-r.Únl)Ztermuirir>r,r0r/r rhÚmaxrfÚ BEFORE_BARr;rer?r r-r.rP) r@rirjZbufZ old_widthZclutter_lengthZ new_widthZ clear_widthÚlineZline_lenrrrrCÀs>        zProgressBar.render_progresscCsz|j|7_|jr&|j|jkr&d|_t ¡|jdkrÚnextr1r=Ú StopIterationrqrCrp)r@Úrvrrrrrÿs     zProgressBar.next) Nrrr r!TNFNNNNr")Ú__name__Ú __module__Ú __qualname__rBrErKrMrGÚpropertyrTrWrXr\r^r`rhrCrorprqrrrÚ__next__rrrrr2sDý (   %) rc Cs&tƒ}ttjƒrt|ƒs$t|||ƒStj dd¡p4d ¡}|rZt rNt |||ƒSt |||ƒStj d¡dkrvt|||ƒSt s†tj   d¡r’t |d|ƒSttdƒr¶t d ¡d kr¶t |d |ƒSd dl}| ¡\}}t |¡z@ttdƒrt d |¡d krt |d |ƒW¢St|||ƒW¢St |¡XdS)z2Decide what method to use for paging through text.ZPAGERNr#ZTERM)ZdumbZemacsZos2zmore <Úsystemz(less) 2>/dev/nullrÚlessz more "%s"Zmore)rrÚsysÚstdinÚ _nullpagerÚosÚenvironÚgetÚstripr Ú_tempfilepagerÚ _pipepagerÚplatformÚ startswithÚhasattrrzÚtempfileÚmkstempÚcloseÚunlink)Útextr.ÚstdoutZ pager_cmdrˆÚfdÚfilenamerrrÚpagers,         rc Csddl}ttjƒ}| dd¡d ¡}|dkr€|ddkr€tj dd¡d  |dd…¡}|sld |d<d }nd |ks|d |kr€d }|sŒt|ƒ}|j |d |j |d}t |j ƒ}z"|j   | |d¡¡|j  ¡Wnttfk räYnXz | ¡Wntk rYqæXqqædS)zqPage through text by feeding it to another program. Invoking a pager through this might support colors. rNú/réÿÿÿÿr{ÚLESSr#rú-RTÚrÚR)Úshellr}ÚenvÚreplace)Ú subprocessÚdictrr€ÚrsplitÚsplitrrerÚPopenÚPIPEr r}rNÚencoderŠÚIOErrorÚKeyboardInterruptÚwait) rŒÚcmdr.ršr˜Z cmd_detailZ less_flagsÚcÚencodingrrrr„.s4   ÿ   r„c Cs|ddl}| ¡}|st|ƒ}ttjƒ}t|dƒd}| | |¡¡W5QRXzt   |d|d¡W5t   |¡XdS)zSimply print unformatted text. This is the ultimate fallback.N)rrN)ÚstreamrŒr.rrrr~lsr~c@s.eZdZd dd„Zdd„Zdd „Zd d „ZdS) ÚEditorNTú.txtcCs||_||_||_||_dSrF)Úeditorr˜Ú require_saveÚ extension)r@r­r˜r®r¯rrrrBuszEditor.__init__cCsb|jdk r|jSdD]}tj |¡}|r|Sqtr:dSdD]}t d|¡dkr>|Sq>dS)N)ZVISUALZEDITORZnotepad)ZvimZnanozwhich %s >/dev/null 2>&1rZvi)r­rr€rr rz)r@Úkeyrtr­rrrÚ get_editor|s    zEditor.get_editorc Cs¢ddl}| ¡}|jr.tj ¡}| |j¡nd}z8|jd||f|dd}| ¡}|dkrht d|ƒ‚Wn2t k rœ}zt d||fƒ‚W5d}~XYnXdS)Nrz%s "%s"T)r˜r—z%s: Editing failed!z%s: Editing failed: %s) ršr±r˜rr€Úcopyrpržr£r ÚOSError)r@rršr­r€r¥Z exit_codeÚerrrÚ edit_fileŠs  ÿzEditor.edit_filec Csúddl}|pd}|r&| d¡s&|d7}|jd|jd\}}z®trRd}| dd¡}nd}| |¡}t  |d ¡}|  |¡|  ¡tj   |¡}| |¡|jr²tj   |¡|kr²W¢._unquote_fileÚdarwinr½z-Wr”z /dev/nullÚw)Ústderrzexplorer /select,"%s"r¨r#zstart %s "" "%s"z/WAITÚ.zxdg-open)zhttp://zhttps://r)ršr|r…rfr½rŠržr£r r™rrzr»Údirnamer³r†Ú webbrowser) rÅr£ZlocateršrÆÚargsZnullr¥rÌrrrÚopen_urlÀsL      ÿ ÿ   rÎcCs |dkrtƒ‚|dkrtƒ‚dS)Núú)r¢ÚEOFError)ÚchrrrÚ_translate_ch_to_excósrÓcCsVt ¡}|rt |¡t|ƒtrRttjddƒ}|dk rF| |d¡}n | dd¡}|S)Nr¦r™Úcp1252) ÚmsvcrtZgetchZputcharrÓrÚgetattrr|r}r¿)r rtÚencrrrÚgetcharýs  rØc CsÌttjƒstdƒ}| ¡}ntj ¡}d}zpt |¡}z4t   |¡t |d¡}|rhttj ƒrhtj  |¡W5t |tj|¡tj   ¡|dk r–|  ¡XWntjk r°YnXt|ƒ| ttjƒd¡S)Nz/dev/ttyé r™)rr|r}r½ÚfilenoÚtermiosZ tcgetattrZ tcsetattrZ TCSADRAINrrPrŠÚttyZsetrawrr¾rNÚerrorrÓr¿r )r r©rŽZ old_settingsrÒrrrrØ s(       )N)FF)$Ú__doc__rr|r6rdZ_compatrrrrrrr r r Zutilsr Ú exceptionsr rÀrlrOrÚobjectrrr„rƒr~r«rÎrÓrÕrØrÜrÛrrrrÚs8 ,   a /M 3