Ë žáf%î±'ãó—dZddlmZddlmZmZddlmZddl m Z m Z ddl mZmZddlZddlZddlZddlZddlZ ddlZd„Zgd ¢Z d d lmZd Zd ZdZdZdZdZ eduZ!dZ"edgd¢«Z#edgd¢«Z$edgd¢«Z%d„Z&d„Z'd„Z(d„Z)d„Z*d„Z+d„Z,död„Z-d÷d „Z.d!„Z/d"d#d$d%d&d'd(d)d*d+d,d-d.œ Z0e0fd/„Z1d0„Z2id1e%e#dd2d3d«e#dd2d3d«de#dd2d3d«e$dd3d«e$dd3d«dd4d5g¬«“d6e%dddde$dd3d«e$dd3d«dd¬«“d7e%e#d8d2d8d8«e#d8d9d8d8«e#d8d2d8d8«e#d8d2d8d8«e$d:d:d:«e$d:d:d:«d d¬«“d;e%e#dd?«e#d@d=dAdB«e#d@d=dAdB«e#dCd=dDdE«e$dFdFdF«e$dFdFdF«d d¬«“dGe%e#dHd=d>dI«e#d@d=dAdB«e#d@d=dAdB«e#dJd=dDdK«e$dFdFdF«e$dFdFdF«d d¬«“dLe%e#dMdNdOdP«e#dQdNdRdS«e#dQdNdRdS«e#dTdNdUdV«e$dWdWdW«e$dWdWdW«d d¬«“dXe%e#dYdNdZd[«e#d\dNd]d^«e#d@d=dAdB«e#d_dNd`da«e$dFdFdF«e$dFdFdF«d d¬«“dbe%e#dcdddedf«e#dgdddhdi«e#dgdddhdi«e#djdddkdl«e$dmdmdm«e$dmdmdm«d d¬«“dne%e#dodddpdq«e#drdddsdt«e#d@d=dAdB«e#dudddvdw«e$dFdFdF«e$dFdFdF«d d¬«“dxe%e#d8d2d8d8«e#d8d9d8d8«de#d8d2d8d8«e$d:d:d:«e$d:d:d:«d d¬«“dye%e#dd?«e#d@d=dAdB«de#dCd=dDdE«e$dFdFdF«e$dFdFdF«d d¬«“dze%e#dHd=d>dI«e#d@d=dAdB«de#dJd=dDdK«e$dFdFdF«e$dFdFdF«d d¬«“d{e%e#dMdNdOdP«e#dQdNdRdS«de#dTdNdUdV«e$dWdWdW«e$dWdWdW«d d¬«“d|e%e#dYdNdZd[«e#d\dNd]d^«de#d_dNd`da«e$dFdFdF«e$dFdFdF«d d¬«“d}e%e#dcdddedf«e#dgdddhdi«de#djdddkdl«e$dmdmdm«e$dmdmdm«d d¬«“d~e%e#dodddpdq«e#drdddsdt«de#dudddvdw«e$dFdFdF«e$dFdFdF«d d¬«“de%e#d:d2d:d:«e#d:d2d:d:«dde$d:d:d:«e$d:d:d:«d d4g¬«“id€e%e(e(dde$d:d:d:«e$d:d:d:«d d4g¬«“d�e%de#d:d2d8d:«dde$d:d:d:«e$d:d:d:«d d¬«“d‚e%dddde$dƒdƒdƒ«e$d:d:d:«d d¬«“d„e%de#dd2d8d«dde$dd:d«e$dd:d«d d¬«“d…e%e#d8d2d8d8«e#d8d2d8d8«de#d8d2d8d8«e$d:d:d:«e$d:d:d:«d d¬«“d†e%e#d8d2d8d8«e#d:d2d8d:«de#d8d2d8d8«e$d:d:d:«e$d:d:d:«d d¬«“d‡e%e#dd9d3d«e#dd9d3d«de#dd9d3d«e$dd3d«e$dd3d«dd¬«“dˆe%e#d‰dddŠ«e#d‹ddd«e#d‹ddd«e#dŒddd«ee)d�«ee)d:«dd¬«“dŽe%ddddee-dƒd�¬�«ee-dƒ«d d¬«“d‘e%dddde$d’d“d“«e$d”d•d–«d d¬«“d—e%e+dde#d˜ddd«ee,d™d «ee,dšd «dd4g¬«“d›e%e+dde#d˜ddd«ee,d™dœ«ee,dšdœ«dd4g¬«“d�e%e.e#džddd«de#dŸddd«e1e1d d¬«“d e%e.e#džddd«de#dŸddd«ee1i¬¡«ee1i¬¡«d d¬«“d¢e%ee.dœ¬£«e#d¤ddd«de#d¥ddd«e1e1d d¬«“d¦e%ee.dœ¬§«e#d¨ddd«de#d©ddd«e1e1d d¬«“dªe%dddde$dd«d«e$dd«d«dd¬«“¥e%dddde$d¬d­d:«e*d d¬«e%ee/d «dde#d®ddd«ee/dœ«ee/d «d d4g¬«d¯œ¥Z3e4e5e3jm«««Z7id6d6“d1d1“d7d7“d;d;“dGdG“dLdL“dXdX“dbdb“dndn“d€d€“d�d�“d‚d‚“d„d„“d…d…“d†d†“d‡d‡“Z8ejrd°«Z:ejrd±«Z;d²Ze<›dµ�Z?d¶e=›d·e>›d¸e<›d¹e?›dºe<›d»e>›d¼e?›d½�Z@ejre@ej‚«ZBejre@j‡d¾«ej‚«ZDd¿ZEejrdÀ«ZFdÁ„ZGd„ZHdÄZIdÄ„ZJeKfdÅ„ZLdÆ„ZMdødÇ„ZNdÈ„ZOdÉ„ZPdÊ„ZQdË„ZRdÌ„ZSdÍ„ZTd΄ZUdÏ„ZVeWfdЄZXdÑ„ZYdÒ„ZZdÓ„Z[eWfdÔ„Z\dÕ„Z] dùdÖ„Z^dׄZ_dødØ„Z`dúdÙ„Za dûdÚ„ZbdÛ„ZcdÜ„ZddÝ„ZedÞ„Zfdüdß„Zgdýdà„Zhdþdá„Zidâd1eee e edd ddddf dã„Zjdä„Zkdå„Zldæ„Zmdç„Zndè„Zodÿdé„Zpdê„Zq dÿdë„Zrdì„Zsdí„ZtGdî„dïeu«Zvdð„ZwGdñ„dòejð«Zydó„Zzdô„Z{e|dõk(rez«yy#e$rdZY� Œ²wxYw#e$rY� Œ°wxYw(zPretty-print tabular data.é)Ú namedtuple)ÚIterableÚSized)Úescape)ÚchainÚ zip_longest)ÚreduceÚpartialNcó6—t|tj«S©N)Ú isinstanceÚioÚIOBase)Úfs ú6/usr/lib/python3.12/site-packages/tabulate/__init__.pyÚ_is_filers€Ü �aœŸ™Ó #Ð#ó)ÚtabulateÚtabulate_formatsÚsimple_separated_formaté)ÚversionéFÚgÚÚdefaultÚÚLine)ÚbeginÚhlineÚsepÚendÚDataRow)rr!r"Ú TableFormat)Ú lineaboveÚlinebelowheaderÚlinebetweenrowsÚ linebelowÚ headerrowÚdatarowÚpaddingÚwith_header_hidecó¼—t|«}|tk(xs |tk(xr:t|«dk\xr |dtk(xst|«dk\xr |dtk(}|S)Nrrr)ÚtypeÚlistÚstrÚlenÚSEPARATING_LINE)ÚrowÚrow_typeÚis_sls rÚ_is_separating_liner6hsd€Ü�C‹y€HØ œÑ Ò 0 ¬S¡ò Ü ˆS‹�Q‰Ò 4˜3˜q™6¤_Ñ4ò 9Ü �‹H˜‰MÒ 7˜c !™f¬Ñ7ð ð €Lrcót—|}|dvr d|dz zdzS|dk(rdd|dz zzdzS|dk(r dd|dz zzSd|zS)z~Return a segment of a horizontal line with optional colons which indicate column's alignment (as in `pipe` output format).)ÚrightÚdecimalÚ-rÚ:ÚcenterrÚleft©)ÚalignÚcolwidthÚws rÚ_pipe_segment_with_colonsrBqsh€ð €AØ Ð$Ñ$Ø�q˜1‘u‘  Ñ$Ð$Ø �(Ò Ø�c˜Q ™U‘mÑ$ sÑ*Ð*Ø �&ŠØ�c˜Q ™U‘mÑ$Ð$à�Q‰wˆrcó®—|sdgt|«z}t||«D��cgc]\}}t||«‘Œ}}}ddj|«zdzScc}}w)znReturn a horizontal line with optional colons to indicate column's alignment (as in `pipe` output format).rÚ|)r1ÚziprBÚjoin)Ú colwidthsÚ colalignsÚarAÚsegmentss rÚ_pipe_line_with_colonsrKs_€ñ Ø�Dœ3˜y›>Ñ)ˆ ÜÑ >Ó @Ð@ùó s—%A&c󄇗|dxxdz cc<dddddœŠˆfd„t||«D«}ddj|«zdzS) NrrNz<.z>.z=.rMc3óN•K—|]\}}‰j|d«|z–—Œy­w)rN©rO)Ú.0rIÚvrSs €rÚ z*_textile_row_with_attrs..›s(øèø€Ð OÑ3N©4¨1¨aˆi�m‰m˜A˜rÓ" QÕ&Ñ3Nùsƒ"%rD)rErF)rRrGrHÚvaluesrSs @rÚ_textile_row_with_attrsr_˜sIø€Ø�ƒN�cуNب¸ÈÑN€IÛ O´3°yÀ+Ô3NÓ O€FØ �—‘˜&Ó!Ñ ! CÑ 'Ð'rcó—y)Nzr>)Úcolwidths_ignoreÚcolaligns_ignores rÚ _html_begin_table_without_headerrcŸs€à rc ó²—dddddœ}|r@t||«D��cgc](\}}dj||j|d«|«‘Œ*}}}nHt||«D��cgc]1\}}dj||j|d«t|««‘Œ3}}}djdj |«j ««} |dk(rd| ›d �} | Scc}}wcc}}w) Nrz style="text-align: right;"z style="text-align: center;"rMz<{0}{1}>{2}z {}Úthz
z )rEÚformatrOÚ htmlescaperFrP) ÚcelltagÚunsaferRrGrHrSrTrIrUÚrowhtmls rÚ_html_row_with_attrsrk¤s÷€àØ.Ø0Ø0ñ €Iñ ô˜K¨Ô3ô á3‘��1ð × &Ñ & w° · ± ¸aÀÓ0DÀaÕ HØ3ð ò ô˜K¨Ô3ô á3‘��1ð × &Ñ & w° · ± ¸aÀÓ0DÄjÐQRÃmÕ TØ3ð ñ ð×"Ñ" 2§7¡7Ð+<Ó#=×#DÑ#DÓ#FÓG€GØ�$‚Ø& w iÐ/BÐCˆØ €Nùó ùó  s ™-C Á6Cc óΗdddddœ}t||«D��cgc].\}}dj||j|d«||z|z«‘Œ0}}}dj|«dzScc}}w)NrzzrMz{}{} {} ú||)rErfrOrF) rhrRrGrHÚheaderrSrTrIrUs rÚ_moin_row_with_attrsro»s�€àØ/Ø1Ø1ñ €Iô˜  YÔ/ôá/‰DˆAˆqð ×ј' 9§=¡=°°BÓ#7¸À!¹ÀfÑ9LÕMØ/ðñð �7‰7Ð$Ó %¨Ñ ,Ð,ùó s—3A!c óÄ—dddddœ}dj|D�cgc]}|j|d«‘Œc}«}dj|sdnd|zd z|rd g«Sd g«Scc}w) NÚlÚrrTrMrÚ z\begin{tabular}{z\begin{longtable}{Ú}z\topruleú\hline)rFrO)rGrHÚbooktabsÚ longtablerSrIÚtabular_columns_fmts rÚ_latex_line_begin_tabularryÉs‰€Ø s°cÀcÑJ€IØŸ'™'Á)Ó"LÁ)¸Q 9§=¡=°°CÕ#8À)Ñ"LÓMÐØ �9‰9á(1Ñ Ð7LØ!ñ "àñ ñ$ˆKð  ó ðð *3ð  ó ðùò#Ms—AcóÄ—d„}t|«dk(r |dg|¢­ŽSt|«dk(r.|\}}}ddj|«z}|r|d||«dz|zS|Std«‚) z/handle header and data rows for asciidoc formatcó|—dddddœ}t||D�cgc]}||‘Œ c}«}|D��cgc]\}}dj||«‘Œ}}}ddj|«zdzg} g} |r| jd «| r| d dj| «zdzgz } d jdj| ««Scc}wcc}}w) NÚ<Ú>Ú^rMz{:d}{}zcols="Ú,Ú"rnz options="z [{}] |====)rErfrFÚappend) Ú is_headerrGrHrSÚcolalignÚasciidoc_alignmentsÚwidthr?Úasciidoc_column_specifiersÚ header_listÚ options_lists rÚmake_header_linez'_asciidoc_row..make_header_lineÙså€ð!¨3¸#È#ÑNˆ ä!Ø ¹IÓF¹I°˜  (Ó+¸IÑFó Ðñ?Rô& Ù>Q©l¨e°UˆH�O‰O˜E 5Õ )Ð>Qð #ñ& ð  3§8¡8Ð,FÓ#GÑHÈ3ÑNÐOˆ ðˆ á Ø × Ñ  Ô )á Ø ˜K¨#¯(©(°<Ó*@Ñ@À3ÑFÐGÑ GˆKð×#Ñ# C§H¡H¨[Ó$9Ó:Ð:ùò%Gùó& s ’ B3 ªB8rFérDTrszm _asciidoc_row() requires two (colwidths, colaligns) or three (cell_values, colwidths, colaligns) arguments) )r1rFÚ ValueError)r‚Úargsr‰rRrGrHÚ data_lines rÚ _asciidoc_rowrŽÖs‰€ò;ô4 ˆ4ƒy�A‚~ñ  Ð-¨Ò-Ð-ä ˆT‹�aŠð-1Ñ)ˆ �Y  ؘ#Ÿ(™( ;Ó/Ñ/ˆ á Ù# D¨)°YÓ?À$ÑFÈÑRÐ RàÐ ôð Ió ð rz\&z\%z\$z\#z\_z\^{}z\{z\}z\textasciitilde{}z\textbackslash{}z\ensuremath{<}z\ensuremath{>}) Ú&Ú%Ú$Ú#Ú_r~Ú{rtÚ~Ú\r|r}c 󚇗ˆfd„}|D�cgc]}djt||««‘Œ}}tddd«}t||«Scc}w)Ncó(•—‰j||«Sr rZ)rTÚescruless €rÚ escape_charz_latex_row..escape_charsø€Ø�|‰|˜A˜qÓ!Ð!rrr�ú\\)rFÚmapr#Ú_build_simple_row)rRrGrHr™ršÚcellÚescaped_valuesÚrowfmts ` rÚ _latex_rowr¡sQø€ô"ñCNÓNÁ+¸$�b—g‘gœc +¨tÓ4Õ5À+€NÐNÜ �R˜˜fÓ %€FÜ ˜^¨VÓ 4Ð4ùòOs‹"Acó°—d„}t|«}g}|r||d«|d<|D].}t|«}|r||d«|d<|j|«Œ0||fS)NcóT—t|ttf«r|j«sy|S)Nz..)r r0ÚbytesÚstrip©Úvals rÚ escape_emptyz._rst_escape_first_column..escape_empty%s €Ü �cœC¤˜<Ô (°·±´ØàˆJrr)r/r�)ÚrowsÚheadersr¨Ú new_headersÚnew_rowsr3Únew_rows rÚ_rst_escape_first_columnr®$sm€òô �w“-€KØ€HÙÙ% g¨a¡jÓ1ˆ �A‰ÛˆÜ�s“)ˆÙ Ù% c¨!¡fÓ-ˆG�A‰JØ�‰˜Õ ð ð �[Ð Ð rÚsimpler:z r%r(ÚplainÚgridÚ+Ú=rDÚ simple_gridu┌u─u┬uâ”�u├u┼u┤uâ””uâ”´u┘uâ”‚Ú rounded_griduâ•­uâ•®uâ•°uâ•¯Ú heavy_griduâ”�uâ”�u┳u┓u┣uâ•‹u┫uâ”—uâ”»uâ”›uâ”ƒÚ mixed_griduâ”�u┯u┑uâ”�u┿u┥u┕uâ”·uâ”™Ú double_griduâ•”uâ•�u╦uâ•—uâ• u╬uâ•£u╚uâ•©uâ•�uâ•‘Ú fancy_griduâ•’u╤uâ••u╞u╪uâ•¡u╘uâ•§uâ•›ÚoutlineÚsimple_outlineÚrounded_outlineÚ heavy_outlineÚ mixed_outlineÚdouble_outlineÚ fancy_outlineÚgithubÚpipeÚorgtblÚjirarmÚprestoÚprettyÚpsqlÚrstÚ mediawikiz.{| class="wikitable" style="text-align: left;"z |+ |-z|-z|}Ú!Úmoinmoinz''')rnÚyoutrackz|| z || z| z | z |Úhtmlz
reÚtdÚ unsafehtmlTÚlatexruz\hline \end{tabular}Ú latex_raw)r™Úlatex_booktabs)rvz\midrulez\bottomrule \end{tabular}Úlatex_longtable)rwz\hline \endheadz\hline \end{longtable}ÚtsvÚ z|_. z|_.z|====)ÚtextileÚasciidocz \r|\n|\r\ns | | z\x1bz\[z\]r›z. ( # terminal colors, etc z° # CSI [\x30-\x3f]* # parameter bytes [\x20-\x2f]* # intermediate bytes [\x40-\x7e] # final byte | # terminal hyperlinks z„8; # OSC opening (\w+=\w+:?)* # key=value params list (submatch 2) ; # delimiter ([^z5]+) # URI - anything but ESC (submatch 3) z # ST ([^z;]+) # link text - anything but ESC (submatch 4) z8;;z! # "closing" OSC sequence ) Úutf8zz>^(([+-]?[0-9]{1,3})(?:,([0-9]{3}))*)?(?(1)\.[0-9]*|\.[0-9]+)?$c óT—tddddtd|d«td|d«dd¬«S)zÖConstruct a simple TableFormat with columns separated by a separator. >>> tsv = simple_separated_format("\t") ; tabulate([["foo", 1], ["spam", 23]], tablefmt=tsv) == 'foo \t 1\nspam\t23' True Nrr)r)r*r+r,)r$r#)rQs rrrs;€ô Ø Ø Ø Ø Ü˜"˜i¨Ó,ܘ˜I rÓ*ØØô ð rcó”— |j«}tt j t |««S#ttf$rYŒ4wxYw)a° >>> _isnumber_with_thousands_separator(".") False >>> _isnumber_with_thousands_separator("1") True >>> _isnumber_with_thousands_separator("1.") True >>> _isnumber_with_thousands_separator(".1") True >>> _isnumber_with_thousands_separator("1000") False >>> _isnumber_with_thousands_separator("1,000") True >>> _isnumber_with_thousands_separator("1,0000") False >>> _isnumber_with_thousands_separator("1,000.1234") True >>> _isnumber_with_thousands_separator(b"1,000.1234") True >>> _isnumber_with_thousands_separator("+1,000.1234") True >>> _isnumber_with_thousands_separator("-1,000.1234") True )ÚdecodeÚUnicodeDecodeErrorÚAttributeErrorÚboolÚreÚmatchÚ _float_with_thousands_separators©Ústrings rÚ"_isnumber_with_thousands_separatorräsD€ð2 Ø—‘“ˆô ”—‘Ô9¸6ÓBÓ CÐCøô ¤Ð /ò Ù ð ús‚5µAÁAcó@— ||«y#ttf$rYywxYw)NTF)r‹Ú TypeError)Úconvrãs rÚ_isconvertiblerè9s(€ðÙ ˆVŒ ØøÜ œ Ð "òÙðús ‚ ‹œcóî—tt|«syt|ttf«rNt j t|««st jt|««r|j«dvSy)z» >>> _isnumber("123.45") True >>> _isnumber("123") True >>> _isnumber("spam") False >>> _isnumber("123e45678") False >>> _isnumber("inf") True F)Úinfz-infÚnanT) rèÚfloatr r0r¤ÚmathÚisinfÚisnanÚlowerrâs rÚ _isnumberrñAsS€ô œ% Ô (ØÜ �FœS¤%˜LÔ )Ü � ‰ ”5˜“=Ô!¤T§Z¡Z´°f³ Ô%>à�|‰|‹~Ð!7Ð7Ð7Ø rcóh—t|«|uxs$t|ttf«xr t ||«S)zG >>> _isint("123") True >>> _isint("123.45") False )r.r r¤r0rè)rãÚinttypes rÚ_isintrôWs7€ô ˆV‹ ˜Ðò ,Ü �fœu¤c˜lÓ +ò ,Ü ˜7 FÓ +ðrcó`—t|«tuxst|ttf«xr|dvS)zc >>> _isbool(True) True >>> _isbool("False") True >>> _isbool(1) False )ÚTrueÚFalse)r.rÞr r¤r0râs rÚ_isboolrøes3€ô �‹<œ4Ð ò Ü�6œE¤3˜<Ó(ÒH¨VÐ7HÐ-Hðrcó,—|r!t|ttf«r t|«}|€ t d«St |d«rtSt |«rtSt|«r|rtSt|«r|rtSt|t«rtStS)a%The least generic type (type(None), int, float, str, unicode). >>> _type(None) is type(None) True >>> _type("foo") is type("") True >>> _type("1") is type(1) True >>> _type('42') is type(42) True >>> _type('42') is type(42) True NÚ isoformat) r r0r¤Ú _strip_ansir.ÚhasattrrørÞrôÚintrñrì)rãÚ has_invisibleÚnumparses rÚ_typerssy€ñ œ F¬S´%¨LÔ9ܘVÓ$ˆà €~Ü�D‹zÐÜ �˜Ô %܈ Ü �ŒÜˆ Ü �Œ™H܈ Ü �6Ô ™x܈ Ü �FœEÔ "܈ äˆ rcóä—t|«s t|«rZt|«ry|jd«}|dkr|j «jd«n|}|dk\rt |«|z dz Syy)aSymbols after a decimal point, -1 if the string lacks the decimal point. >>> _afterpoint("123.45") 2 >>> _afterpoint("1001") -1 >>> _afterpoint("eggs") -1 >>> _afterpoint("123e45") 2 >>> _afterpoint("123,456.78") 2 éÿÿÿÿÚ.rÚer)rñrärôÚrfindrðr1)rãÚposs rÚ _afterpointr–sk€ô�ÔÔ>¸vÔFÜ �&Œ>Øà—,‘,˜sÓ#ˆCØ/2°Qªw�&—,‘,“.×&Ñ& sÔ+¸CˆCØ�aŠxܘ6“{ SÑ(¨1Ñ,Ð,ààrcó.—d|z}|j|«S)uLFlush right. >>> _padleft(6, 'Ñ�йца') == ' Ñ�йца' True z{0:>%ds}©rf©r…ÚsÚfmts rÚ_padleftr ³ó€ð �uÑ €CØ �:‰:�a‹=Ðrcó.—d|z}|j|«S)uLFlush left. >>> _padright(6, 'Ñ�йца') == 'Ñ�йца ' True z{0:<%ds}r r s rÚ _padrightr¾rrcó.—d|z}|j|«S)uNCenter string. >>> _padboth(6, 'Ñ�йца') == ' Ñ�йца ' True z{0:^%ds}r r s rÚ_padbothrÉrrcó—|Sr r>)Ú ignore_widthr s rÚ_padnonerÔs€Ø €Hrcóz—t|t«rtjd|«Stjd|«S)aÏRemove ANSI escape sequences, both CSI (color codes, etc) and OSC hyperlinks. CSI sequences are simply removed from the output, while OSC hyperlinks are replaced with the link text. Note: it may be desirable to show the URI instead but this is not supported. >>> repr(_strip_ansi('\x1B]8;;https://example.com\x1B\\This is a link\x1B]8;;\x1B\\')) "'This is a link'" >>> repr(_strip_ansi('\x1b[31mred\x1b[0m text')) "'red text'" z\4)r r0Ú _ansi_codesÚsubÚ_ansi_codes_bytes©r s rrûrûØs2€ô�!”SÔÜ�‰˜u aÓ(Ð(ä ×$Ñ$ U¨AÓ.Ð.rcó¸—t�trtj}nt}t |t t f«r|t|««S|t |««S)z”Visible width of a printed string. ANSI color codes are removed. >>> _visible_width('hello'), _visible_width("world") (5, 5) )ÚwcwidthÚWIDE_CHARS_MODEÚwcswidthr1r r0r¤rû)r Úlen_fns rÚ_visible_widthr ìsG€ôÐ�Ü×!Ñ!‰äˆÜ�!”cœ5�\Ô"Ù”k !“nÓ%Ð%á”c˜!“f‹~Ðrcó®—t|t«r#ttjt |««Sttjt |««Sr )r r0rÞrßÚsearchÚ_multiline_codesÚ_multiline_codes_bytesrs rÚ _is_multiliner%þs:€Ü�!”SÔÜ”B—I‘IÔ.°Ó2Ó3Ð3ä”B—I‘IÔ4°aÓ8Ó9Ð9rc óT—tt|tjd|«««S©z1Visible width of a potentially multiline content.ú[ ])ÚmaxrœrßÚsplit©Ú multiline_sÚ line_width_fns rÚ_multiline_widthr.s€ä Œs�=¤"§(¡(¨8°[Ó"AÓBÓ CÐCrcób‡—|rtŠn|rtjŠntŠ|rˆfd„}|S‰}|S)z2Return a function to calculate visible cell width.có•—t|‰«Sr )r.©r r-s €rÚz"_choose_width_fn..s ø€Ô-¨a°Ô?r©r rrr1©rþÚenable_widecharsÚ is_multilineÚwidth_fnr-s @rÚ_choose_width_fnr8 s9ø€áÜ&‰ Ù Ü×(Ñ(‰ äˆ ÙÛ?ˆð €Oð!ˆØ €Orcót—|dk(r-ts|D�cgc]}|j«‘Œ}}t}||fS|dk(r-ts|D�cgc]}|j«‘Œ}}t}||fS|dk(rx|r"|D�cgc]}t t |««‘Œ}}n|D�cgc] }t |«‘Œ}}t |«}t||«D��cgc]\}}|||z dzz‘Œ}}}t}||fS|s t}||fSts|D�cgc]}|j«‘Œ}}t}||fScc}wcc}wcc}wcc}wcc}}wcc}w)Nr8r<r9rN) ÚPRESERVE_WHITESPACEr¥r rrrûr)rErr)ÚstringsrSrþr ÚpadfnÚdecimalsÚ maxdecimalsÚdecss rÚ_align_column_choose_padfnr@s[€Ø�GÒÝ"Ù*1Ó2©' Q�q—w‘w•y¨'ˆGÐ2܈ð& �Eˆ>Ðð% �hÒ Ý"Ù*1Ó2©' Q�q—w‘w•y¨'ˆGÐ2܈ð �Eˆ>Ðð �iÒ Ù Ù=DÓE¹W¸œ ¤K°£NÕ3¸WˆHÑEá07Ó8±¨1œ  A�°ˆHÐ8ܘ(“mˆ ÜADÀWÈhÔAWÔXÑAW±g°a¸�1˜  dÑ*¨cÑ1Ó1ÐAWˆÑX܈ð �Eˆ>Ðñ ܈ð �Eˆ>Ðõ#Ù*1Ó2©' Q�q—w‘w•y¨'ˆGÐ2ÜˆØ �Eˆ>Ðùò)3ùò3ùòFùâ8ùãXùò 3s#�DÁD Á0D%ÂD*ÃD/Ã8D5cób‡—|rtŠn|rtjŠntŠ|rˆfd„}|S‰}|S)Ncó•—t|‰«Sr )Ú_align_column_multiline_widthr1s €rr2z/_align_column_choose_width_fn..;s ø€Ô:¸1¸mÔLrr3r4s @rÚ_align_column_choose_width_fnrD3s9ø€ÙÜ&‰ Ù Ü×(Ñ(‰ äˆ ÙÛLˆð €Oð!ˆØ €Orc óT—tt|tjd|«««Sr')r/rœrßr*r+s rrCrCAs€ä ”�M¤2§8¡8¨H°kÓ#BÓCÓ DÐDrcóŒ—g}|D]<}t|t«r|D]}|j|«ŒŒ,|j|«Œ>|Sr )r r/r�)Ú nested_listÚretÚitemÚsubitems rÚ _flat_listrKFsF€Ø €CÛˆÜ �dœDÔ !Û�Ø— ‘ ˜7Õ#ñ ð �J‰J�tÕ ð ð €Jrcó”—t|||«\}}t|||«}tt||««}t t t |««|«} |�r3|sG|sE|D� � cgc]6} dj | j«D� cgc] } || | «‘Œ c} «‘Œ8} } } | S|D� � cgc]/} tjd| «D� cgc] } t| «‘Œc} ‘Œ1} } } t|| «D����cgc]*\}}t||«D��cgc] \}}| ||z z ‘Œc}}‘Œ,}}}}}t||«D� �� �cgc]L\} }dj t| j«xs| |«D� �cgc]\} }||| «‘Œc}} «‘ŒN} } }} }| S|s|s|D� cgc] } || | «‘Œ } } | Sttt|««} t|| «D��cgc] \}}| ||z z ‘Œ}}}t||«D� �cgc]\} }||| «‘Œ} } }| Scc} wcc} } wcc} wcc} } wcc}}wcc}}}}wcc}} wcc}} }} wcc} wcc}}wcc}} w)ztring] -> [padded_string]rsr() r@rDr/rœr)rKrFÚ splitlinesrßr*r1rE)r;rSÚminwidthrþr5r6r<r7Ús_widthsÚmaxwidthÚmsr Úpadded_stringsÚs_lensÚmwÚmlrArqÚvisible_widthss rÚ _align_columnrWQsi€ô0°¸ÀMÓR�N€GˆUÜ,ØÐ'¨ó€Hô”C˜ 'Ó*Ó+€HÜ”3”z (Ó+Ó,¨hÓ7€HâÙ© ñ"ôá!�Bð— ‘ °r·}±}´ÓG±°!™5 ¨1Õ-°ÑGÕHØ!ð ñð6 Ðñ+JQÔQÉÀ2¤r§x¡x°¸"Ô'=Ó>Ñ'= !”s˜1•vÐ'=Ó>ȈFÑQô" (¨FÔ3öá3‘F�B˜ô14°B¸´ Ô<± ©¨¨1�˜Q ™UÓ#° Ô<Ø3ð óô" '¨>Ô:öá:‘F�B˜ð— ‘ ´3¸¿ ¹ »Ò8MÈ2ÐPRÔ3SÔTÑ3S©4¨1¨a™5  A�;Ð3SÒTÕUØ:ð óð Ðñ © Ù:AÓB¹'°Q™e H¨aÕ0¸'ˆNÐBð Ðô œ#œc 7Ó+Ó,ˆFÜ=@ÀÈ6Ô=RÔSÑ=R±T°Q¸˜h¨!¨a©%Ó0Ð=RˆNÑSô7:¸'À>Ô6RÔSÑ6R©d¨a°™e A q�kÐ6RˆNÑSØ Ðùò5Hùóùò ?ùÓQùã<ùõùóUùõùò CùóTùóTsrÁ"H Á?H H Â"HÂ?H ÃHÃ*H# ÄHÄH# Ä/4H1 Å#H+Å6 H1 ÆH9Ç H>Ç/IÈH ÈHÈH# È+H1 c ó—td«dtdtdtdtdt di}t tttttd«dœ}t |j|d«|j|d««}||S)NrrrrŠéé)rZrYrŠrrr)r.rÞrýrìr¤r0r)rO)Útype1Útype2ÚtypesÚinvtypesÚ moregenerics rÚ _more_genericr`‚sy€ä ˆT‹ �AÜ ˆaÜ ˆQÜ ˆqÜ ˆqÜ ˆQð  €Eô Ü Ü Ü Ü Ü �‹:ñ €Hô�e—i‘i  qÓ)¨5¯9©9°U¸AÓ+>Ó?€KØ �KÑ Ð rcój—|D�cgc]}t|||«‘Œ}}tt|t«Scc}w)u)The least generic type all column values are convertible to. >>> _column_type([True, False]) is bool True >>> _column_type(["1", "2"]) is int True >>> _column_type(["1", "2.3"]) is float True >>> _column_type(["1", "2.3", "four"]) is str True >>> _column_type(["four", 'пÑ�ть']) is str True >>> _column_type([None, "brux"]) is str True >>> _column_type([1, 2, None]) is int True >>> import datetime as dt >>> _column_type([dt.datetime(1991,2,19), dt.time(17,35)]) is str True )rr r`rÞ)r;rþrÿr r]s rÚ _column_typerb—s7€ñ,9@Ó @¹°1ŒU�1�m XÕ .¸€EÐ @Ü ”- ¬Ó -Ð-ùò As…0cóŽ—|€|S|tur|›S|tur t||«S|tur t|d«S|t urc|xrt|ttf«}|r2t|«}tt |«|«}|j||«Stt |«|«S|›S#tt f$rt|«cYSwxYw)u‘Format a value according to its type. Unicode is supported: >>> hrow = ['буква', 'цифра'] ; tbl = [['аз', 2], ['буки', 4]] ; good_result = '\u0431\u0443\u043a\u0432\u0430 \u0446\u0438\u0444\u0440\u0430\n------- -------\n\u0430\u0437 2\n\u0431\u0443\u043a\u0438 4' ; tabulate(tbl, headers=hrow) == good_result True Úascii) r0rýrfr¤rærÜrìr rûÚreplace) r§ÚvaltypeÚfloatfmtÚintfmtÚ missingvalrþÚis_a_colored_numberÚraw_valÚ formatted_vals rÚ_formatrm±sÑ€ð €{ØÐà”#�~Ø�ˆØ ”C‰Ü�c˜6Ó"Ð"Ø ”EÑ ð Ü�s˜GÓ$Ð $ð ”EÑ Ø+ÒM´ ¸3ÄÄeÀ Ó0MÐÙ Ü! #Ó&ˆGÜ"¤5¨£>°8Ó<ˆMØ—;‘;˜w¨ Ó6Ð 6äœ% ›* hÓ/Ð /à�ˆøôÔ-Ð.ò Ü�s“8ŠOð ús­ B'Â'CÃCc ó4—|rLtjt|«}|D�cgc]}t|||||««‘Œ}}dj |«St |«|z } || z }|dk(r t ||«S|dk(r t||«S|s|›St||«Scc}w)zIPad string header to width chars given known visible_width of the header.rsr=r<) rßr*r#Ú _align_headerrFr1rrr ) rnrSr…Ú visible_widthr6r7Ú header_linesÚhÚ padded_linesÚ ninvisibles rroroÕs³€ñÜ—x‘xÔ 0°&Ó9ˆ áEQó ÙEQÀŒM˜!˜Y¨©x¸«{Õ ;À\ð ð ð�y‰y˜Ó&Ð&ä�V“˜}Ñ,€JØ ˆZÑ€EØ�FÒܘ Ó'Ð'Ø �hÒ Ü˜˜vÓ&Ð&Ù Ø�Ð䘘vÓ&Ð&ùò s¡BcóÀ—t|«tk(rIg}g}t|«D]3\}}t|«r|j |«Œ#|j |«Œ5||fS|dfSr )r.r/Ú enumerater6r�)r©Úseparating_linesÚ sans_rowsÚindexr3s rÚ_remove_separating_linesrzìsg€Ü ˆDƒz”TÒØÐØˆ Ü# Dž/‰JˆE�3Ü" 3Ô'Ø ×'Ñ'¨Õ.à× Ñ  Õ%ð *ð Ð*Ð*Ð*à�TˆzÐrcóD—|r|D]}|j|t«Œyyr )Úinsertr2)r©rwrys rÚ_reinsert_separating_linesr}ús"€ÙÛ%ˆEØ �K‰K˜œÕ /ñ&ðrc óv—|�|dur|St|t«rGt|«t|«k7r0tddj t|«t|««z«‚t |«\}}g}t |«}|D]+}t|«}|j|gt|«z«Œ-|}t||«|S)zAdd a left-most index column.Fz2index must be as long as the number of data rows: zlen(index)={} len(rows)={}) r rr1r‹rfrzÚiterÚnextr�r/r})r©ryrxrwr¬Ú index_iterr3Úindex_vs rÚ_prepend_row_indexrƒs»€à €}˜ ™Øˆ Ü�%œÔ¤C¨£J´#°d³)Ò$;ÜØ @Ø*×1Ñ1´#°e³*¼cÀ$»iÓHñ Ió ð ô#;¸4Ó"@Ñ€IÐØ€HÜ�e“€JÛˆÜ�zÓ"ˆØ�‰˜˜ ¤D¨£IÑ-Õ.ðð €DܘtÐ%5Ô6Ø €Krcó8— t|«S#t$rYywxYw)zDA wrapper around standard bool() which doesn't throw on NumPy arraysF)rÞr‹r¦s rÚ_boolr…s#€ðÜ�C‹yÐøÜ òÙðús ‚ � ˜c óL — t|«d}d}t|d«�rBt|d«�r5t|jd«r0|j «}tt |j «Ž«}nÎt|d«r·t|«}|dvrn|jj�Xt|jjt«r|jj|dd n|jjg|dd |j}t|j«}|D�cgc] }t|«‘Œ}}n td «‚|dk(�rŠttt|««}�not|«}|dk(r|sg}�nY|dk(r:t|d «r.t|jd «r|jj}�n|dk(rXt|«d kDrJt|d t «r7t|d d «r(ttt|d j"««}�n½t|«d kD�r›t|d d«�r‹t|d d«�r{t%«} g}|dk(rJt|«d kDr|d ni} |j'| j ««| j)|«|dd}|D]>}|j «D])} | | vsŒ|j+| «| j-| «Œ+Œ@|dk(r|}n¥t|t.«r9|D� cgc]} |j1| | «‘Œ}} ttt|««}n\|dk(rJt|«d kDr9|D� cgc]}  j1| | «‘Œ}} ttt|««}ng}n |r td«‚|D�� cgc]!}|D� cgc]} |j1| «‘Œc} ‘Œ#}}} �n|dk(rAt|d«r5t|d«r)t|d«r|j2D� cgc]} | d ‘Œ }} nÍt4�†t|«d kDrxt5j6|d «r`t5j8|d «D� cgc]} | j‘Œ}} |dk(r|}|D��cgc]}|D�cgc]}t||«‘Œc}‘Œ}}}nA|dk(rfv}|dk(r|� tA||«}n˜t|tB«r|stA|t|««}npt|tD«r|s tA||«}nQ|dk(s tG|«r.|s,|€tt;t|«««}tA||«}n|dk(s tG|«s|s |r8t|«d kDr*t|«}t|d «}||kr dg||z z|z}||fS#t$rd}t|«}Y�ŒdwxYwcc}wcc} wcc} wcc} wcc} }wcc} wcc} wcc}wcc}}w)a Transform a supported data type to a list of lists, and a list of headers. Supported tabular data types: * list-of-lists or another iterable of iterables * list of named tuples (usually used with headers="keys") * list of dicts (usually used with headers="keys") * list of OrderedDicts (usually used with headers="keys") * list of dataclasses (Python 3.7+ only, usually used with headers="keys") * 2D NumPy arrays * NumPy record arrays (usually used with headers="keys") * dict of iterables (usually used with headers="keys") * pandas.DataFrame (usually used with headers="keys") The first row can be used as headers if headers="firstrow", column indices can be used as headers if headers="keys". If showindex="default", show row indices of the pandas.DataFrame. If showindex="always", show row indices for all types of data. If showindex="never", don't show row indices for all types of data. If showindex is an iterable, show its values as row indices. FTNÚkeysr^Ú__call__ry)rÚalwaysTrz7tabular data doesn't appear to be a dict or a DataFrameÚdtypeÚnamesÚ_fieldsÚfirstrowrz6headers for a list of dicts is not a dict or a keywordÚ descriptionÚfetchoneÚrowcountcó2—t|«r|St|«Sr )r6r/)rrs rr2z)_normalize_tabular_data..¿s€Ô#6°qÔ#9˜aÐF¼tÀA»wÐFrrr‰Úneverr)$rÞr‹r/rür^r‡Ú izip_longestryÚnamer rœr0ÚgetattrrŠr‹r1ÚtuplerŒÚsetÚextendÚupdater�ÚaddÚdictrOrŽÚ dataclassesÚ is_dataclassÚfieldsÚranger.r¤rƒrrr…)Ú tabular_datarªÚ showindexÚis_headers2bool_brokenryr‡r©Úvalsr3Ú uniq_keysÚ firstdictÚkÚcolumnÚfieldÚ field_namesrÚshowindex_is_a_strÚnhsÚncolss rÚ_normalize_tabular_datar­s.€ðB Ü ˆWŒ Ø!&Ðð €E܈|˜VÕ$¬°¸xÕ)Hä �<×&Ñ&¨ Ô 3à×$Ñ$Ó&ˆDÜܘl×1Ñ1Ó3Ð4ó‰Dô�\ 7Ô +ä˜ Ó%ˆDàÐ8Ñ8Ø ×&Ñ&×+Ñ+Ð7ä˜l×0Ñ0×5Ñ5´tÔ<Ø+×1Ñ1×6Ñ6�D˜˜!‘Hà ,× 2Ñ 2× 7Ñ 7Ð8�D˜˜!�HØ×&Ñ&ˆDä˜×+Ñ+Ó,ˆEÙ)-Ó.© #”D˜•I¨ˆDÑ.äÐVÓWÐ Wà �fÓ Üœ3œs D›>Ó*ŠGô�LÓ!ˆà �fÒ ¡TàŠGà �vÒ Ü˜  gÔ.ܘ ×*Ñ*¨GÔ4ð#×(Ñ(×.Ñ.ŠGà �vÒ Ü�D“ ˜A’ ܘ4 ™7¤EÔ*ܘ˜Q™ Ô+ôœ3œs D¨¡G§O¡OÓ4Ó5ŠGÜ �‹Y˜‹]œw t¨A¡w°Õ7¼GÀDÈÁGÈXÕ>> repr(_to_str(b'foo')) "'foo'" >>> repr(_to_str('foo')) "'foo'" >>> repr(_to_str(42)) "'42'" )ÚencodingÚerrors)r r¤rÛr0)r rºr»s rÚ_to_strr¼÷s*€ô(�!”UÔØ�x‰x °&ˆxÓ9Ð9Ü ˆq‹6€Mrr>cóì ‡0—|€g}t|||¬«\}}t|«\}}| �St|d«}t| t«rt | || «} n t | |d«} t | |«}t|| |¬«}| �Wt|d«}t| t«rt | || «} n t | |d«} t | |«}t|g| |¬«d}|dk(rt||«\}}t}|dk(rd}d} |tk(rdn|}|tk(rdn|}n|tk(rd n|}|tk(rd n|}d jttt|«tjd „|D««««}t j#|«du}t$duxrt&}t|t(«s,|t*vr$t-|«rt*j/||«}d}nd }t1|||«Š0t3t5|Ž«}t | t|««}t7||«D��cgc]\}}t9||¬«‘Œ}}}t|t:«rt|«|gz}nPt3|«}t|«t|«kr.|j=t|«t|«z t>gz«t|t:«rt|«|gz}nPt3|«}t|«t|«kr.|j=t|«t|«z t@gz«t|t:«rt|«|gz}nPt3|«}t|«t|«kr.|j=t|«t|«z tBgz«t7|||||«D��� �!�"�#cgc]&\}}} }!}"|D�#cgc]}#tE|#|| |!|"|«‘Œc}#‘Œ(}}"}!} }}}#|D�cgc]}|ttFfvr|n|‘Œ}$}| �*t| tH«sJ‚tK| «D] \}%}&|&|$|%<Œ |r|D�'cgc] }'‰0|'«|z‘Œc}'ndgt|«z}(t7||$|(«D��)�*cgc]\}})}*tM||)|*|||«‘Œ}})}}*|r©|xsdggt|«z}+|$xs|gt|«z},t7|(|+«D�*�cgc]#\}*}tO|*tOˆ0fd„|D«««‘Œ%}(}*}t7||,|(«D�'�)�*cgc]\}'})}*tQ|'|)|*‰0|'«|‰0«‘Œ}})}'}*t3t7|Ž«}-n2|D�cgc]}tOˆ0fd„|D««‘Œ}(}t3t7|Ž«}-t|t(«stRj/|tRd«}t| t:«r| nd}.t | t|-«|.«}/tU|-|«tW|||-|(|$||/¬«Scc}}wcc}#wcc}#}"}!} }}wcc}wcc}'wcc}*})}wcc}}*wcc}*})}'wcc}w)u‰JFormat a fixed width table for pretty printing. >>> print(tabulate([[1, 2.34], [-56, "8.999"], ["2", "10001"]])) --- --------- 1 2.34 -56 8.999 2 10001 --- --------- The first required argument (`tabular_data`) can be a list-of-lists (or another iterable of iterables), a list of named tuples, a dictionary of iterables, an iterable of dictionaries, an iterable of dataclasses (Python 3.7+), a two-dimensional NumPy array, NumPy record array, or a Pandas' dataframe. Table headers ------------- To print nice column headers, supply the second argument (`headers`): - `headers` can be an explicit list of column headers - if `headers="firstrow"`, then the first row of data is used - if `headers="keys"`, then dictionary keys or column indices are used Otherwise a headerless table is produced. If the number of headers is less than the number of columns, they are supposed to be names of the last columns. This is consistent with the plain-text format of R and Pandas' dataframes. >>> print(tabulate([["sex","age"],["Alice","F",24],["Bob","M",19]], ... headers="firstrow")) sex age ----- ----- ----- Alice F 24 Bob M 19 By default, pandas.DataFrame data have an additional column called row index. To add a similar column to all other types of data, use `showindex="always"` or `showindex=True`. To suppress row indices for all types of data, pass `showindex="never" or `showindex=False`. To add a custom row index column, pass `showindex=some_iterable`. >>> print(tabulate([["F",24],["M",19]], showindex="always")) - - -- 0 F 24 1 M 19 - - -- Column alignment ---------------- `tabulate` tries to detect column types automatically, and aligns the values properly. By default it aligns decimal points of the numbers (or flushes integer numbers to the right), and flushes everything else to the left. Possible column alignments (`numalign`, `stralign`) are: "right", "center", "left", "decimal" (only for `numalign`), and None (to disable alignment). Table formats ------------- `intfmt` is a format specification used for columns which contain numeric data without a decimal point. This can also be a list or tuple of format strings, one per column. `floatfmt` is a format specification used for columns which contain numeric data with a decimal point. This can also be a list or tuple of format strings, one per column. `None` values are replaced with a `missingval` string (like `floatfmt`, this can also be a list of values for different columns): >>> print(tabulate([["spam", 1, None], ... ["eggs", 42, 3.14], ... ["other", None, 2.7]], missingval="?")) ----- -- ---- spam 1 ? eggs 42 3.14 other ? 2.7 ----- -- ---- Various plain-text table formats (`tablefmt`) are supported: 'plain', 'simple', 'grid', 'pipe', 'orgtbl', 'rst', 'mediawiki', 'latex', 'latex_raw', 'latex_booktabs', 'latex_longtable' and tsv. Variable `tabulate_formats`contains the list of currently supported formats. "plain" format doesn't use any pseudographics to draw tables, it separates columns with a double space: >>> print(tabulate([["spam", 41.9999], ["eggs", "451.0"]], ... ["strings", "numbers"], "plain")) strings numbers spam 41.9999 eggs 451 >>> print(tabulate([["spam", 41.9999], ["eggs", "451.0"]], tablefmt="plain")) spam 41.9999 eggs 451 "simple" format is like Pandoc simple_tables: >>> print(tabulate([["spam", 41.9999], ["eggs", "451.0"]], ... ["strings", "numbers"], "simple")) strings numbers --------- --------- spam 41.9999 eggs 451 >>> print(tabulate([["spam", 41.9999], ["eggs", "451.0"]], tablefmt="simple")) ---- -------- spam 41.9999 eggs 451 ---- -------- "grid" is similar to tables produced by Emacs table.el package or Pandoc grid_tables: >>> print(tabulate([["spam", 41.9999], ["eggs", "451.0"]], ... ["strings", "numbers"], "grid")) +-----------+-----------+ | strings | numbers | +===========+===========+ | spam | 41.9999 | +-----------+-----------+ | eggs | 451 | +-----------+-----------+ >>> print(tabulate([["spam", 41.9999], ["eggs", "451.0"]], tablefmt="grid")) +------+----------+ | spam | 41.9999 | +------+----------+ | eggs | 451 | +------+----------+ "simple_grid" draws a grid using single-line box-drawing characters: >>> print(tabulate([["spam", 41.9999], ["eggs", "451.0"]], ... ["strings", "numbers"], "simple_grid")) ┌───────────┬───────────â”� │ strings │ numbers │ ├───────────┼───────────┤ │ spam │ 41.9999 │ ├───────────┼───────────┤ │ eggs │ 451 │ └───────────┴───────────┘ "rounded_grid" draws a grid using single-line box-drawing characters with rounded corners: >>> print(tabulate([["spam", 41.9999], ["eggs", "451.0"]], ... ["strings", "numbers"], "rounded_grid")) ╭───────────┬───────────╮ │ strings │ numbers │ ├───────────┼───────────┤ │ spam │ 41.9999 │ ├───────────┼───────────┤ │ eggs │ 451 │ ╰───────────┴───────────╯ "heavy_grid" draws a grid using bold (thick) single-line box-drawing characters: >>> print(tabulate([["spam", 41.9999], ["eggs", "451.0"]], ... ["strings", "numbers"], "heavy_grid")) â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�┳â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�┓ ┃ strings ┃ numbers ┃ ┣â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â•‹â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�┫ ┃ spam ┃ 41.9999 ┃ ┣â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â•‹â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�┫ ┃ eggs ┃ 451 ┃ â”—â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”»â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”› "mixed_grid" draws a grid using a mix of light (thin) and heavy (thick) lines box-drawing characters: >>> print(tabulate([["spam", 41.9999], ["eggs", "451.0"]], ... ["strings", "numbers"], "mixed_grid")) â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�┯â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�┑ │ strings │ numbers │ â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�┿â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�┥ │ spam │ 41.9999 │ ├───────────┼───────────┤ │ eggs │ 451 │ ┕â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”·â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”™ "double_grid" draws a grid using double-line box-drawing characters: >>> print(tabulate([["spam", 41.9999], ["eggs", "451.0"]], ... ["strings", "numbers"], "double_grid")) â•”â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�╦â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•— â•‘ strings â•‘ numbers â•‘ â• â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�╬â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•£ â•‘ spam â•‘ 41.9999 â•‘ â• â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�╬â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•£ â•‘ eggs â•‘ 451 â•‘ ╚â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•©â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•� "fancy_grid" draws a grid using a mix of single and double-line box-drawing characters: >>> print(tabulate([["spam", 41.9999], ["eggs", "451.0"]], ... ["strings", "numbers"], "fancy_grid")) â•’â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�╤â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•• │ strings │ numbers │ ╞â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�╪â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•¡ │ spam │ 41.9999 │ ├───────────┼───────────┤ │ eggs │ 451 │ ╘â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•§â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•› "outline" is the same as the "grid" format but doesn't draw lines between rows: >>> print(tabulate([["spam", 41.9999], ["eggs", "451.0"]], ... ["strings", "numbers"], "outline")) +-----------+-----------+ | strings | numbers | +===========+===========+ | spam | 41.9999 | | eggs | 451 | +-----------+-----------+ >>> print(tabulate([["spam", 41.9999], ["eggs", "451.0"]], tablefmt="outline")) +------+----------+ | spam | 41.9999 | | eggs | 451 | +------+----------+ "simple_outline" is the same as the "simple_grid" format but doesn't draw lines between rows: >>> print(tabulate([["spam", 41.9999], ["eggs", "451.0"]], ... ["strings", "numbers"], "simple_outline")) ┌───────────┬───────────â”� │ strings │ numbers │ ├───────────┼───────────┤ │ spam │ 41.9999 │ │ eggs │ 451 │ └───────────┴───────────┘ "rounded_outline" is the same as the "rounded_grid" format but doesn't draw lines between rows: >>> print(tabulate([["spam", 41.9999], ["eggs", "451.0"]], ... ["strings", "numbers"], "rounded_outline")) ╭───────────┬───────────╮ │ strings │ numbers │ ├───────────┼───────────┤ │ spam │ 41.9999 │ │ eggs │ 451 │ ╰───────────┴───────────╯ "heavy_outline" is the same as the "heavy_grid" format but doesn't draw lines between rows: >>> print(tabulate([["spam", 41.9999], ["eggs", "451.0"]], ... ["strings", "numbers"], "heavy_outline")) â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�┳â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�┓ ┃ strings ┃ numbers ┃ ┣â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â•‹â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�┫ ┃ spam ┃ 41.9999 ┃ ┃ eggs ┃ 451 ┃ â”—â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”»â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”› "mixed_outline" is the same as the "mixed_grid" format but doesn't draw lines between rows: >>> print(tabulate([["spam", 41.9999], ["eggs", "451.0"]], ... ["strings", "numbers"], "mixed_outline")) â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�┯â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�┑ │ strings │ numbers │ â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�┿â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�┥ │ spam │ 41.9999 │ │ eggs │ 451 │ ┕â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”·â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”™ "double_outline" is the same as the "double_grid" format but doesn't draw lines between rows: >>> print(tabulate([["spam", 41.9999], ["eggs", "451.0"]], ... ["strings", "numbers"], "double_outline")) â•”â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�╦â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•— â•‘ strings â•‘ numbers â•‘ â• â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�╬â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•£ â•‘ spam â•‘ 41.9999 â•‘ â•‘ eggs â•‘ 451 â•‘ ╚â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•©â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•� "fancy_outline" is the same as the "fancy_grid" format but doesn't draw lines between rows: >>> print(tabulate([["spam", 41.9999], ["eggs", "451.0"]], ... ["strings", "numbers"], "fancy_outline")) â•’â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�╤â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•• │ strings │ numbers │ ╞â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�╪â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•¡ │ spam │ 41.9999 │ │ eggs │ 451 │ ╘â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•§â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•› "pipe" is like tables in PHP Markdown Extra extension or Pandoc pipe_tables: >>> print(tabulate([["spam", 41.9999], ["eggs", "451.0"]], ... ["strings", "numbers"], "pipe")) | strings | numbers | |:----------|----------:| | spam | 41.9999 | | eggs | 451 | "presto" is like tables produce by the Presto CLI: >>> print(tabulate([["spam", 41.9999], ["eggs", "451.0"]], ... ["strings", "numbers"], "presto")) strings | numbers -----------+----------- spam | 41.9999 eggs | 451 >>> print(tabulate([["spam", 41.9999], ["eggs", "451.0"]], tablefmt="pipe")) |:-----|---------:| | spam | 41.9999 | | eggs | 451 | "orgtbl" is like tables in Emacs org-mode and orgtbl-mode. They are slightly different from "pipe" format by not using colons to define column alignment, and using a "+" sign to indicate line intersections: >>> print(tabulate([["spam", 41.9999], ["eggs", "451.0"]], ... ["strings", "numbers"], "orgtbl")) | strings | numbers | |-----------+-----------| | spam | 41.9999 | | eggs | 451 | >>> print(tabulate([["spam", 41.9999], ["eggs", "451.0"]], tablefmt="orgtbl")) | spam | 41.9999 | | eggs | 451 | "rst" is like a simple table format from reStructuredText; please note that reStructuredText accepts also "grid" tables: >>> print(tabulate([["spam", 41.9999], ["eggs", "451.0"]], ... ["strings", "numbers"], "rst")) ========= ========= strings numbers ========= ========= spam 41.9999 eggs 451 ========= ========= >>> print(tabulate([["spam", 41.9999], ["eggs", "451.0"]], tablefmt="rst")) ==== ======== spam 41.9999 eggs 451 ==== ======== "mediawiki" produces a table markup used in Wikipedia and on other MediaWiki-based sites: >>> print(tabulate([["strings", "numbers"], ["spam", 41.9999], ["eggs", "451.0"]], ... headers="firstrow", tablefmt="mediawiki")) {| class="wikitable" style="text-align: left;" |+ |- ! strings !! align="right"| numbers |- | spam || align="right"| 41.9999 |- | eggs || align="right"| 451 |} "html" produces HTML markup as an html.escape'd str with a ._repr_html_ method so that Jupyter Lab and Notebook display the HTML and a .str property so that the raw HTML remains accessible the unsafehtml table format can be used if an unescaped HTML format is required: >>> print(tabulate([["strings", "numbers"], ["spam", 41.9999], ["eggs", "451.0"]], ... headers="firstrow", tablefmt="html"))
strings numbers
spam 41.9999
eggs 451
"latex" produces a tabular environment of LaTeX document markup: >>> print(tabulate([["spam", 41.9999], ["eggs", "451.0"]], tablefmt="latex")) \begin{tabular}{lr} \hline spam & 41.9999 \\ eggs & 451 \\ \hline \end{tabular} "latex_raw" is similar to "latex", but doesn't escape special characters, such as backslash and underscore, so LaTeX commands may embedded into cells' values: >>> print(tabulate([["spam$_9$", 41.9999], ["\\emph{eggs}", "451.0"]], tablefmt="latex_raw")) \begin{tabular}{lr} \hline spam$_9$ & 41.9999 \\ \emph{eggs} & 451 \\ \hline \end{tabular} "latex_booktabs" produces a tabular environment of LaTeX document markup using the booktabs.sty package: >>> print(tabulate([["spam", 41.9999], ["eggs", "451.0"]], tablefmt="latex_booktabs")) \begin{tabular}{lr} \toprule spam & 41.9999 \\ eggs & 451 \\ \bottomrule \end{tabular} "latex_longtable" produces a tabular environment that can stretch along multiple pages, using the longtable package for LaTeX. >>> print(tabulate([["spam", 41.9999], ["eggs", "451.0"]], tablefmt="latex_longtable")) \begin{longtable}{lr} \hline spam & 41.9999 \\ eggs & 451 \\ \hline \end{longtable} Number parsing -------------- By default, anything which can be parsed as a number is a number. This ensures numbers represented as strings are aligned properly. This can lead to weird results for particular strings such as specific git SHAs e.g. "42992e1" will be parsed into the number 429920 and aligned as such. To completely disable number parsing (and alignment), use `disable_numparse=True`. For more fine grained control, a list column indices is used to disable number parsing only on those columns e.g. `disable_numparse=[0, 2]` would disable number parsing only on the first and third columns. Column Widths and Auto Line Wrapping ------------------------------------ Tabulate will, by default, set the width of each column to the length of the longest element in that column. However, in situations where fields are expected to reasonably be too long to look good as a single line, tabulate can help automate word wrapping long fields for you. Use the parameter `maxcolwidth` to provide a list of maximal column widths >>> print(tabulate( [('1', 'John Smith', 'This is a rather long description that might look better if it is wrapped a bit')], headers=("Issue Id", "Author", "Description"), maxcolwidths=[None, None, 30], tablefmt="grid" )) +------------+------------+-------------------------------+ | Issue Id | Author | Description | +============+============+===============================+ | 1 | John Smith | This is a rather long | | | | description that might look | | | | better if it is wrapped a bit | +------------+------------+-------------------------------+ Header column width can be specified in a similar way using `maxheadercolwidth` N)r¡r)r³rÈrÆTr<r9r=rÕc3ó<K—|]}tt|«–—Œy­wr )rœr¼)r[r3s rr]ztabulate..=sèø€ÐK¹]°c¤¤G¨S× 1¹]ùs‚F)rÿrc3ó.•K—|] }‰|«–—Œy­wr r>©r[Úclr7s €rr]ztabulate..ƒsøèø€Ð3±¨2™( 2Ÿ,±ùóƒc3ó.•K—|] }‰|«–—Œy­wr r>rÀs €rr]ztabulate..Œsøèø€Ð2±¨"™ "Ÿ±ùrÂr¯)Ú rowaligns),r­rzr1r rýr¯Ú_expand_numparser¸r®Ú MIN_PADDINGÚ_DEFAULT_ALIGNrFrrœr¼Ú from_iterablerr"rrr$Úmultiline_formatsr%rOr8r/r“rErbr0r˜Ú_DEFAULT_FLOATFMTÚ_DEFAULT_INTFMTÚ_DEFAULT_MISSINGVALrmrìrrvrWr)roÚ_table_formatsr}Ú _format_table)1r rªÚtablefmtrgrhÚnumalignÚstralignrir¡Údisable_numparserƒÚ maxcolwidthsÚrowalignÚmaxheadercolwidthsr²rwÚnum_colsr³Ú min_paddingÚ plain_textrþr5r6ÚcolsÚcolÚnpÚcoltypesÚ float_formatsÚ int_formatsÚ missing_valsrTÚctÚfl_fmtÚint_fmtÚmiss_vr\ÚalignsÚidxr?rrÚ minwidthsrIÚminwÚt_colsÚt_alignsr©Ú ra_defaultrÄr7s1 @rrrs9ø€ðZÐØˆ ä4Ø�g¨ôÑ€M�7ô'?¸}Ó&MÑ#€MÐ#àÐÜ�} QÑ'Ó(ˆÜ �l¤CÔ (Ü+¨L¸(ÀLÓQ‰Lä+¨L¸(ÀDÓIˆLä$Ð%5°xÓ@ˆ Ü/Ø ˜<°9ô ˆ ðÐ%Ü�} QÑ'Ó(ˆÜ Ð(¬#Ô .Ü!1Ø" HÐ.@ó"Ñ ô"2Ð2DÀhÐPTÓ!UÐ ä$Ð%5°xÓ@ˆ Ü)Ø ˆIÐ)°Yô à ñ ˆð �5ÒÜ!9¸-ÈÓ!Qш �wô €KØ�8ÒØˆ ØÐØ'¬>Ò9‘8¸xˆØ'¬>Ò9‘8¸x‰à (¬NÒ :‘9ÀˆØ%¬Ò7‘6¸Xˆð—‘Ü ä ”˜Ó !ô × Ñ ÑK¹]ÓKÓ Kó  ó€Jô ×&Ñ& zÓ2¸$Ð>€Mä dÐ*Ò>¬Ðä �x¤Ô -Ø Ô)Ñ )Ü ˜*Ô %ä$×(Ñ(¨°8Ó<ˆØ‰ àˆ Ü  Ð/?ÀÓN€Hô ” ˜mÐ,Ó -€DÜ Ð!1´3°t³9Ó=€IÜ>AÀ$È Ô>RÔSÑ>R±7°3¸” ˜S¨2Ö.Ð>R€HÑSÜ�(œCÔ Ü˜D› Ø ð% ñ ‰ ô˜X›ˆ Ü ˆ}Ó ¤ D£ Ò )Ø × Ñ ¤# d£)¬c°-Ó.@Ñ"@ÔEVÐDWÑ!WÔ XÜ�&œ#Ôܘ$“iØ ð# ñ ‰ ô˜6“lˆ Ü ˆ{Ó œc $›iÒ 'Ø × Ñ ¤ D£ ¬C° Ó,<Ñ <ÄÐ@QÑQÔ RÜ�*œcÔ"ܘ4“y J <Ñ/‰ ä˜JÓ'ˆ Ü ˆ|Ó œs 4›yÒ (Ø × Ñ ¤ T£¬S°Ó->Ñ!>ÔCVÐBWÑ WÔ Xô/2Ø �(˜M¨;¸ ô/ ÷ ð ñ/ Ñ *ˆAˆr�6˜7 FñJKÓKÉÀAŒ��B˜ ¨°Õ ?ÈÓKð/ ð õ ñFNÓ NÁX¸r˜"¤¤e  Ñ,‰h°(Ñ:ÀX€FÐ NØÐܘ(¤HÔ-Ð-Ð-Ü# HÖ-‰JˆC�؈F�3ŠKð.ñ9@©GÓ4©G q‰�!‹�{Ó "¨GÒ4ÀaÀSÌ3ÈtË9Á_ðô ˜d F¨IÔ6õ á6‰JˆAˆq�$ô �a˜˜D -Ð1AÀ<ÕPØ6ð ò ñ àÒ.˜2˜$˜¤# g£,Ñ.ˆØÒ6˜h˜Z¬#¨g«,Ñ6ˆô˜y¨&Ô1ô á1‘��aô �”cÓ3±Ó3Ó3Õ 4Ø1ð ñ ô " '¨8°YÔ?õ á?‘ ��1�dô ˜!˜Q ¡h¨q£k°<ÀÕ JØ?ð ò ô”C˜�JÓ‰á<@ÓA¹D°q”SÓ2±Ó2Õ2¸Dˆ ÐAÜ”C˜�JÓˆä �h¤ Ô ,Ü!×%Ñ% h´¸xÑ0HÓIˆä'¨´#Ô6‘¸D€JÜ  ¬3¨t«9°jÓA€IܘtÐ%5Ô6ä Ø�'˜4 ¨F°LÈIô ðùóITùò0 Lù÷ ùòOùò 5ùô ùó ùô ùò BsBÈV>ÎW Î$WÎ;W Ï WÐWÑ WÒ$(W$Ó !W*ÔW1×W cóX—t|t«rdg|z}|D]}d||<Œ |S| g|zS)aB Return a list of bools of length `column_count` which indicates whether number parsing should be used on each column. If `disable_numparse` is a list of indices, each of those indices are False, and everything else is True. If `disable_numparse` is a bool, then the returned list is all the same. TF)r r)rÒÚ column_countr³rys rrÅrÅ›sF€ôÐ"¤HÔ-Ø�F˜\Ñ)ˆ Û%ˆEØ$ˆI�eÒ ð&àÐà$Ð$Ð%¨ Ñ4Ð4rcóx—t|t«r%t|t«s||g|t|«z zzS|g|zS)aY Expands the `original` argument to return a return a list of length `num_desired`. If `original` is shorter than `num_desired`, it will be padded with the value in `default`. If `original` is not a list to begin with (i.e. scalar value) a list of length `num_desired` completely populated with `default will be returned )r rr0r1)ÚoriginalÚ num_desiredrs rr¯r¯¬s?€ô�(œHÔ%¬j¸Ä3Ô.Gؘ7˜) {´S¸³]Ñ'BÑCÑCÐCàˆy˜;Ñ&Ð&rcóL—|rd|z}|D�cgc] }||z|z‘Œ }}|S|Scc}w)NrNr>)Úcellsr+ÚpadržÚ padded_cellss rÚ_pad_rowrôºs;€Ù Ø�G‰mˆÙ5:Ó;±U¨T˜˜d™  SÓ(°Uˆ Ð;ØÐàˆ ùòÐ+A€KÐBÜ ””S˜+Ó&Ó '€Fô˜ iÔ0ôá0‰EˆB�ô   F¨A¨xÕ8Ø0ðñô;@À¼-ÔH¹-°Q¡KÓ0¡K˜b�B�q“E KÓ0¸-€KÑHۈܘR Ó%ˆ ܘ% ¨I°yÀ&ÕIðð €Lùò!5ùÚBùóùò1ùÓHs(…CšC ÁC C C ÂCÃCcóŒ—|syt|d«r |||«S|\}}}}|D�cgc]}||z‘Œ }}t||||f«Scc}w)z3Return a string which represents a horizontal line.Nrˆr÷) rGrHÚlinefmtrÚfillr!r"rArñs rÚ _build_linerüs^€á ØÜˆw˜ Ô#Ù�y )Ó,Ð,à 'шˆt�S˜#Ù#,Ó-¡9˜a�˜“ 9ˆÐ-Ü  ¨°°SÐ(9Ó:Ð:ùò.s¤ Acó>—|jt|||««|Sr )r�r)rúrGrHrs rÚ _append_liner s€Ø ‡L�L”˜Y¨ °7Ó;Ô<Ø €Lrcó&—eZdZdZd„Zed„«Zy)ÚJupyterHTMLStrzUWrap the string with a _repr_html_ method so that Jupyter displays the HTML tablecó—|Sr r>©Úselfs rÚ _repr_html_zJupyterHTMLStr._repr_html_ s€Øˆ rcó—|S)z>add a .str property so that the raw string is still accessibler>rs rr0zJupyterHTMLStr.str s €ðˆ rN)Ú__name__Ú __module__Ú __qualname__Ú__doc__rÚpropertyr0r>rrrr s „ñòðñóñrrc ó’—g}|r|jr |jng}|j} |j} |D� cgc] } | d| zz‘Œ } } |rd„} tt| ¬«}n t } t }| || «}|D�cgc] }| || «‘Œ }}|jrd|vrt|| ||j«|r4|||| || «|jrd|vrt|| ||j«|rv|jrjd|vrft|dd|«D]5\}}|||| ||j|¬ «t|| ||j«Œ7|||d| ||j|d¬ «n}|jxs8|jxs*|jxs|jxstd d d d «}|D]2}t|«rt|| ||«Œ|||| ||j«Œ4|jrd |vrt|| ||j«|s|r1d j!|«}|jt"k(r t%|«S|Sy cc} wcc}w) z1Produce a plain-text representation of the table.rcó—|Sr r>)r3r“s rr2z_format_table..# s€¡r)ròr%r&r'Nr)rÔrr(rs)r,r+r)r rrôrûr%rr&r'rEr*r(rr6rFrcr)r rªr©rGrHr6rÄrúÚhiddenròr)rAr Úpad_rowÚ append_rowÚpadded_headersr3Ú padded_rowsÚralignÚseparating_lineÚoutputs rrÎrÎ sU€à €EÙ&-°#×2FÒ2FˆS× !Ò !ÈR€FØ �+‰+€CØ— ‘ €Iá,5Ó6©I q�a˜!˜c™'“k¨I€MÐ6ÙÙ$ˆÜÔ2¸Ô<‰ äˆÜ&ˆ á˜W cÓ*€NÙ04Ó5±¨‘7˜3 Õ$°€KÐ5à ‡}‚}˜¨FÑ2Ü�U˜M¨9°c·m±mÔDáÙ�5˜.¨-¸ÀIÔNØ × Ò Ð#4¸FÑ#BÜ ˜  ¨y¸#×:MÑ:MÔ Ná�s×*Ò*Ð/@ÈÑ/Nä˜{¨3¨BÐ/°Ö;‰KˆC�Ù Ø�s˜M¨9°c·k±kÈFõ ô ˜  ¨y¸#×:MÑ:MÕ Nð <ñ Ø Ø ˜‰OØ Ø Ø �K‰Kؘr‘]ö  ð × Ñ ò $Ø×"Ñ"ò $à�}‰}ò $ð�}‰}ò $ô�B˜˜B Ó#ð óˆCô# 3Ô'ܘU M°9¸oÕNá˜5 # }°iÀÇÁÕMð ð ‡}‚}˜¨FÑ2Ü�U˜M¨9°c·m±mÔDá‘$Ø—‘˜5Ó!ˆØ �=‰=Ô<Ò <Ü! &Ó)Ð )àˆMàùò{7ùò6s »H?Á<Icó8—eZdZdZd„Zed„«Zd„Zd„Zd„Z y)r°a[A custom implementation of CPython's textwrap.TextWrapper. This supports both wide characters (Korea, Japanese, Chinese) - including mixed string. For the most part, the `_handle_long_word` and `_wrap_chunks` functions were copy pasted out of the CPython baseline, and updated with our custom length and line appending logic. cóf—g|_d|_tjj|g|¢­i|¤Žyr )Ú _active_codesÚ max_linesÚtextwrapÚ TextWrapperÚ__init__)rrŒÚkwargss rr3z_CustomTextWrap.__init__i s/€ØˆÔ؈ŒÜ×Ñ×%Ñ% dÐ<¨TÒ<°VÓ|dj«s+||kr&|j#||dj%|«z«�n*|r”|dj«rd||j |j «z|krC|j|j «|j#||dj%|«z« |S||j |d«z}|d=|rŒ”|rb|dj'«}|j |«|j |j «z|jkr||j z|d< |S|j#|||j j«z« |S|r�Œç|S)až_wrap_chunks(chunks : [string]) -> [string] Wrap a sequence of text chunks and return a list of lines of length 'self.width' or less. (If 'break_long_words' is false, some lines may be longer than this.) Chunks correspond roughly to words and the whitespace between them: each chunk is indivisible (modulo 'break_long_words'), but a line break can come between any two chunks. Chunks should not have internal whitespace; ie. a chunk is either all whitespace or a "word". Whitespace chunks will be removed from the beginning and end of lines, but apart from that whitespace is preserved. rzinvalid width %r (must be > 0)rz#placeholder too large for max widthrr)r…r‹r0Úsubsequent_indentÚinitial_indentr7Ú placeholderÚlstripÚreverseÚdrop_whitespacer¥r�rDrJÚsumrœr1rArFrP) rÚchunksrúÚindentrFrGr…Ú chunk_lenÚ prev_lines rÚ _wrap_chunksz_CustomTextWrap._wrap_chunks¹ st€ðˆØ �:‰:˜Š?ÜÐ=ÀÇ Á ÑJÓKÐ KØ �>‰>Ð %Ø�~‰~ Ò!Ø×/Ñ/‘à×,Ñ,�Ø�y‰y˜Ó  4§9¡9¨T×-=Ñ-=×-DÑ-DÓ-FÓ#GÑGÈ$Ï*É*ÒTÜ Ð!FÓGÐGð �‰ÔâðˆH؈GñØ×/Ñ/‘à×,Ñ,�ð—J‘J §¡¨6Ó!2Ñ2ˆEð×#Ò#¨¨r© ×(8Ñ(8Ó(:¸bÒ(@ÁUؘ2�JáØ ŸI™I f¨R¡jÓ1� ð˜YÑ&¨%Ò/Ø—O‘O F§J¡J£LÔ1ؘyÑ(‘Gðòñ˜$Ÿ)™) F¨2¡JÓ/°%Ò7Ø×&Ñ& v¨x¸À%ÔHÜœc $§)¡)¨XÓ6Ó7�ð×#Ò#©°X¸b±\×5GÑ5GÓ5IÈRÒ5Oؘ4Ÿ9™9 X¨b¡\Ó2Ñ2�ؘR�Lâà—N‘NÐ*ܘ5“z A‘~¨¯©Ò6á"Ø×/Ò/Ü ›K¨1Ò,Ø & q¡ §¡Ô 1à 5Ò(ð×&Ñ& u¨f°r·w±w¸xÓ7HÑ.HÖIá"à$ R™L×.Ñ.Ô0Ø '¨$¯)©)°D×4DÑ4DÓ*EÑ EÈÒ Nà$ŸO™O¨D×,<Ñ,<Ô=Ø ×.Ñ.¨u°f¸r¿w¹wÀxÓ?PÑ6PÔQØ!ðàˆ ð  4§9¡9¨X°b©\Ó#:Ñ:˜Ø$ R˜Lò#ñ!Ø(-¨b© ×(8Ñ(8Ó(:˜Ià $§ ¡ ¨)Ó 4°t·y±yÀ×AQÑAQÓ7RÑ RØ#'§:¡:ò!.ð-6¸×8HÑ8HÑ,H  b¡ Ø %ðˆ ð×*Ñ*¨5°&¸4×;KÑ;K×;RÑ;RÓ;TÑ2TÔUØàˆ óeðdˆ rN) rrr r!r3Ú staticmethodr7rArJrWr>rrr°r°a s1„ñò=ð ñ!óð!òò63óLmrr°c óð—ddl}ddl}ddl}|jtj «} |j|j dddgd¢«\}}g}t}t} d} d} d} d } D]—\}}|d vrd }Œ |d vr|} Œ|d vr|}Œ|dvr|} Œ"|dvr|j«} Œ7|dvr5|tvr*td|z«t|«|jd«|} Œp|dvr|} Œw|dvsŒ|t|«|jd«Œ™s |jgn|}| d k(r |jn t!| d«5}|D]Y}|d k(r |j}t#|«rt%||| | || || ¬«Œ3t!|«5}t%||| | || || ¬«ddd«Œ[ ddd«y#|j$r2}t|«t|«|jd«Yd}~�Œ…d}~wwxYw#1swYŒ³xYw#1swYyxYw)a Usage: tabulate [options] [FILE ...] Pretty-print tabular data. See also https://github.com/astanin/python-tabulate FILE a filename of the file with tabular data; if "-" or missing, read data from stdin. Options: -h, --help show this message -1, --header use the first row of data as a table header -o FILE, --output FILE print table to FILE (default: stdout) -s REGEXP, --sep REGEXP use a custom column separator (default: whitespace) -F FPFMT, --float FPFMT floating point number format (default: g) -I INTFMT, --int INTFMT integer point number format (default: "") -f FMT, --format FMT set output table format; supported formats: plain, simple, grid, fancy_grid, pipe, orgtbl, rst, mediawiki, html, latex, latex_raw, latex_booktabs, latex_longtable, tsv (default: simple) rNrz h1o:s:F:A:f:)Úhelprnr,zsep=zfloat=zint=zalign=zformat=rr¯z\s+r:)z-1z--headerr�)z-oz--output)z-Fz--float)z-Iz--int)z-Cz --colalign)z-fz--formatz"%s is not a supported table formatrŠ)z-sz--sep)z-hz--helprA)rªrÏr!rgrhÚfilerƒ)ÚgetoptÚsysr1ÚdedentÚ_mainr!ÚargvÚ GetoptErrorÚprintÚexitrÊrËr*rÚstdinÚstdoutÚopenrÚ _pprint_file)r\r]r1ÚusageÚoptsrŒrrªrgrhrƒrÏr!ÚoutfileÚoptÚvalueÚfilesÚoutrÚfobjs rr_r_) s€ó0ÛÛà ˆH�O‰OœEŸM™MÓ *€Eð Ø—]‘]Ø �H‰H�Q�RˆLØ Ú Wó ‰ ˆˆdð€GÜ €HÜ €FØ€HØ€HØ €CØ€GÛ‰ ˆˆUØ Ð$Ñ $Ø ‰GØ Ð&Ñ &؉GØ Ð%Ñ %؉HØ �OÑ #؉FØ Ð(Ñ (Ø—{‘{“}‰HØ Ð&Ñ &ØÔ,Ñ,ÜÐ:¸UÑBÔCÜ�e” Ø—‘˜” ؉HØ �OÑ #؉CØ Ð$Ò $Ü �%ŒLØ �H‰H�Q�Kð+ñ, $ˆS�Y‰Y‰K¨€EØ 3šˆ#�*Š*¬D°¸#Ó,>Ð >À3ÛˆAØ�CŠxØ—I‘I�ܘŒ{ÜØØ#Ø%ØØ%Ø!ØØ%ö ô˜!”W Ü ØØ 'Ø!)ØØ!)Ø%Ø Ø!)õ ÷�Wñ÷ ?Ð >øðE × Ñ òÜ ˆaŒÜ ˆeŒ Ø �‰�� Š ûðú÷d�Wú÷! ?Ð >ús<®%FÄ3AG,Å4G Æ G,ÆGÆ+'GÇGÇ G) Ç%G,Ç,G5c óê—|j«}|D� cgc]7} | j«sŒtj|| j ««‘Œ9} } t t | |||||¬«|¬«ycc} w)N)rgrhrƒ)r[)Ú readlinesr¥rßr*rPrbr) ÚfobjectrªrÏr!rgrhr[rƒr©rrÚtables rrgrg‹ sj€Ø × Ñ Ó €DÙ04Ó B±¨1¸¿¹½ ŒR�X‰X�c˜1Ÿ8™8›:Õ &°€EÐ BÜ ÜØ Ø Ø ØØØô  ðö ùò Cs •A0«&A0Ú__main__)r)FF)TT)rTFF)rT)FN)r)T)rØÚignorer )}r!Ú collectionsrÚcollections.abcrrrÍrrgÚ itertoolsrrr“Ú functoolsr r rrßrír1rœrÚ ImportErrorrÚ__all__rÚ __version__rÆr:rÊrËrÌrÇrr2rr#r$r6rBrKrWr_rcrkroryrŽÚLATEX_ESCAPE_RULESr¡r®rÍr/Úsortedr‡rrÉÚcompiler#r$Ú_escÚ_csiÚ_oscÚ_stÚ_ansi_escape_patÚVERBOSErÚencoderr;rárrärèrñrýrôrørrr rrrrûr r%r1r.r8r@rDrCrKrWr`rbrmrorzr}rƒr…r­r¸r¼rrÅr¯rôr�rørûrrrrr0rrÎr2r°r_rgrr>rrÚr‡s°ðÙ å"ß+Ý%ß8ß%Û Û Û ÛÛðÛò $ò F€ð Ý/ð € ðÐàÐØ€ØÐð€ð Ð%€ð€á�&Ò:Ó;€ñ �YÒ 7Ó 8€ñDØò ó € òò ò*ò Aò (òò ó. -ó ò2 ðl Ø Ø Ø Ø Ø Ø Ø Ø Ø Ø Ø ñ Ðð ‘;Ù�u˜e U¨EÓ2Ù˜U E¨5°%Ó8Ù˜U E¨5°%Ó8Ù�u˜e U¨EÓ2Ù˜% ¨Ó.Ù˜˜u eÓ,ØØô ð?nðR‘KÙ�u˜e U¨EÓ2Ù˜U E¨5°%Ó8Ù˜U E¨5°%Ó8Ù�u˜e U¨EÓ2Ù˜% ¨Ó.Ù˜˜u eÓ,ØØô ðSnðf‘+Ù�u˜e U¨EÓ2Ù˜U E¨5°%Ó8Ù˜U E¨5°%Ó8Ù�u˜e U¨EÓ2Ù˜% ¨Ó.Ù˜˜u eÓ,ØØô ðgnðz‘+Ù�u˜e U¨EÓ2Ù˜U E¨5°%Ó8Ù˜U E¨5°%Ó8Ù�u˜e U¨EÓ2Ù˜% ¨Ó.Ù˜˜u eÓ,ØØô ð{nðN‘;Ù�u˜e U¨EÓ2Ù˜U E¨5°%Ó8Ù˜U E¨5°%Ó8Ù�u˜e U¨EÓ2Ù˜% ¨Ó.Ù˜˜u eÓ,ØØô ðOnðb‘+Ù�u˜e U¨EÓ2Ù˜U E¨5°%Ó8Ù˜U E¨5°%Ó8Ù�u˜e U¨EÓ2Ù˜% ¨Ó.Ù˜˜u eÓ,ØØô ðcnðv‰{Ù�s˜C  cÓ*Ù˜S # s¨CÓ0ØÙ�s˜C  cÓ*Ù˜#˜s CÓ(Ù˜˜S #Ó&ØØô ðwnðJ‘kÙ�u˜e U¨EÓ2Ù˜U E¨5°%Ó8ØÙ�u˜e U¨EÓ2Ù˜% ¨Ó.Ù˜˜u eÓ,ØØô ðKnð^‘{Ù�u˜e U¨EÓ2Ù˜U E¨5°%Ó8ØÙ�u˜e U¨EÓ2Ù˜% ¨Ó.Ù˜˜u eÓ,ØØô ð_nðr‘[Ù�u˜e U¨EÓ2Ù˜U E¨5°%Ó8ØÙ�u˜e U¨EÓ2Ù˜% ¨Ó.Ù˜˜u eÓ,ØØô ðsnðF‘[Ù�u˜e U¨EÓ2Ù˜U E¨5°%Ó8ØÙ�u˜e U¨EÓ2Ù˜% ¨Ó.Ù˜˜u eÓ,ØØô ðGnðZ‘kÙ�u˜e U¨EÓ2Ù˜U E¨5°%Ó8ØÙ�u˜e U¨EÓ2Ù˜% ¨Ó.Ù˜˜u eÓ,ØØô ð[nðn‘[Ù�u˜e U¨EÓ2Ù˜U E¨5°%Ó8ØÙ�u˜e U¨EÓ2Ù˜% ¨Ó.Ù˜˜u eÓ,ØØô ðonðB ‰kÙ�s˜C  cÓ*Ù˜S # s¨CÓ0ØØÙ˜#˜s CÓ(Ù˜˜S #Ó&ØØ%˜ô ñCnðV ‰KØ(Ø.ØØÙ˜#˜s CÓ(Ù˜˜S #Ó&ØØ%˜ô ðWnðj ‰kØÙ˜S # s¨CÓ0ØØÙ˜#˜s CÓ(Ù˜˜S #Ó&ØØô ðknð~ ‰KØØØØÙ˜$  dÓ+Ù˜˜S #Ó&ØØô ðnðR ‰kØÙ˜R  c¨2Ó.ØØÙ˜"˜c 2Ó&Ù˜˜C Ó$ØØô ðSnðf ‰kÙ�s˜C  cÓ*Ù˜S # s¨CÓ0ØÙ�s˜C  cÓ*Ù˜#˜s CÓ(Ù˜˜S #Ó&ØØô ðgnðz ‰KÙ�s˜C  cÓ*Ù˜S # s¨CÓ0ØÙ�s˜C  cÓ*Ù˜#˜s CÓ(Ù˜˜S #Ó&ØØô ð{nðN ‰;Ù�r˜3  bÓ)Ù˜R  d¨BÓ/ØÙ�r˜3  bÓ)Ù˜"˜d BÓ'Ù˜˜D "Ó%ØØô ðOnðb‘ÙØ <Ø Ø Ø 'ó  ñ ˜T 2 r¨2Ó.Ù˜T 2 r¨2Ó.Ù�t˜R  RÓ(ÙÐ3°SÓ9ÙÐ1°3Ó7ØØôðcnð@‘ ØØØØÙÐ.°¸UÔCÙÐ,¨dÓ3ØØô ðAnðT‘ ØØØØÙ˜% ¨Ó0Ù˜˜e TÓ*ØØô ðUnðh ‰KØ2ØØÙÐ+¨R°°RÓ8ÙÐ.°°eÓ<ÙÐ,¨d°EÓ:ØØ%˜ô ðinð|‘+Ø2ØØÙÐ+¨R°°RÓ8ÙÐ.°°dÓ;ÙÐ,¨d°DÓ9ØØ%˜ô ð}nðP  ‰[Ø+Ù˜Y¨¨B°Ó3ØÙÐ0°"°b¸"Ó=ØØØØô ðQ nðd ‘Ø+Ù˜Y¨¨B°Ó3ØÙÐ0°"°b¸"Ó=Ù˜*¨rÔ2Ù˜ ¨RÔ0ØØô ðe nðx ‘kÙÐ3¸dÔCÙ˜[¨"¨b°"Ó5ØÙÐ5°r¸2¸rÓBØØØØô ðy nðL ‘{ÙÐ3¸tÔDÙÐ1°2°r¸2Ó>ØÙÐ2°B¸¸BÓ?ØØØØô ðM nð`  ‰;ØØØØÙ˜"˜d BÓ'Ù˜˜D "Ó%ØØô ña nñt ØØØØÙ˜& %¨Ó-Ø'ØØô ñÙ˜-¨Ó/ØØÙ�w  B¨Ó+Ù˜-¨Ó.Ù˜  uÓ-ØØ%˜ô òI n€ñb ™˜~×2Ñ2Ó4Ó5Ó6Ðð Ø ˆWðà ˆhðð ˆFðð�=ð ð �Nð ð �,ð ð�,ðð�=ðð�,ðð ˆFðð ˆhðð ˆFðð ˆhðð ˆhðð ˆFðð  ˆ5ð!Ðð:�2—:‘:˜mÓ,ÐØ#˜Ÿ™ MÓ2Ðð2€Ø ˆ&�€|€Ø ˆ&�€|€Ø ˆˆr€l€ð ð ˆð ð ˆð ð ˆ6ð Ø ˆð Ø ˆ6ð Ø ˆˆc�#�ððÐð$ˆb�j‰jÐ)¨2¯:©:Ó6€ Ø�B—J‘JÐ/×6Ñ6°vÓ>ÀÇ Á ÓKÐØ"Ðà#- 2§:¡:ØEó$Ð ò ò(DòBòð,ó ò ó òFò:òòò ò/ò(ò$:ð14óDò òò4 ð>AóEò ðØØØó .òb!ó*.ó4!ðJKOó'ò. ò0ò ò(ó{ó|ó:ð6 Ø Ø Ø Ø Ø Ø"ØØØ ØØ ØóH òV5ò" 'òò;ò 7óò 0ðTXóò, ;òô �Sô òDôNE�h×*Ñ*ôEòP_òD ð  ˆzÒÙ …GðøðWTò؃Gðûðò Úð ús#¼g(Ág6ç(g3ç2g3ç6g?ç>g?