a
    ¬[ôa¾Ä  ã                   @   s`  d Z ddlZddlZddlZddlZddlZddlZddlZddlZej	d dkZ
e
rxeZeZeZeZeZddlmZ nejZejZeZddlmZ e
r´ej	d dkr´ddlmZ nddlmZ dZdZdZdZdZ d	Z!d
Z"dZ#e $d¡Z%dd„ Z&G dd„ de'ƒZ(dd„ Z)dd„ Z*d"dd„Z+dd„ Z,G dd„ deƒZ-dd„ Z.dd„ Z/dd „ Z0e1d!kr\e0ƒ  dS )#z0.7.2é    Né   )Ú
HTMLParseré   é   )Úescapeé
   é   é   é   z\[[0-9;]*mc                 C   s,   |   d¡}t|ƒ}tdd„ |D ƒƒ}||fS )NÚ
c                 S   s   g | ]}t |ƒ‘qS © ©Ú_str_block_width)Ú.0Úliner   r   ú,/home/zeyad/Desktop/Ninja/lib/prettytable.pyÚ
<listcomp>)   ó    z_get_size.<locals>.<listcomp>)ÚsplitÚlenÚmax)ÚtextÚlinesÚheightÚwidthr   r   r   Ú	_get_size&   s    
r   c                   @   sB  e Zd ZdÍdd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zer@dd„ Z	ndd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ ZeeeƒZd5d6„ Zd7d8„ Z eee ƒZ!d9d:„ Z"d;d<„ Z#ee"e#ƒZ$d=d>„ Z%d?d@„ Z&ee%e&ƒZ'dAdB„ Z(dCdD„ Z)ee(e)ƒZ*dEdF„ Z+dGdH„ Z,ee+e,ƒZ-dIdJ„ Z.dKdL„ Z/ee.e/ƒZ0dMdN„ Z1dOdP„ Z2ee1e2ƒZ3dQdR„ Z4dSdT„ Z5ee4e5ƒZ6dUdV„ Z7dWdX„ Z8ee7e8ƒZ9dYdZ„ Z:d[d\„ Z;ee:e;ƒZ<d]d^„ Z=d_d`„ Z>ee=e>ƒZ?dadb„ Z@dcdd„ ZAee@eAƒZBdedf„ ZCdgdh„ ZDeeCeDƒZEdidj„ ZFdkdl„ ZGeeFeGƒZHdmdn„ ZIdodp„ ZJeeIeJƒZKdqdr„ ZLdsdt„ ZMeeLeMƒZNdudv„ ZOdwdx„ ZPeeOePƒZQdydz„ ZRd{d|„ ZSeeReSƒZTd}d~„ ZUdd€„ ZVeeUeVƒZWdd‚„ ZXdƒd„„ ZYeeXeYƒZZd…d†„ Z[d‡dˆ„ Z\ee[e\ƒZ]d‰dŠ„ Z^d‹dŒ„ Z_ee^e_ƒZ`ddŽ„ Zadd„ ZbeeaebƒZcd‘d’„ Zdd“d”„ ZeeedeeƒZfd•d–„ Zgd—d˜„ ZheegehƒZid™dš„ Zjd›dœ„ Zkddž„ ZldŸd „ Zmd¡d¢„ Znd£d¤„ Zod¥d¦„ Zpd§d¨„ ZqdÎd«d¬„Zrd­d®„ Zsd¯d°„ Ztd±d²„ Zud³d´„ Zvdµd¶„ Zwd·d¸„ Zxd¹dº„ Zyd»d¼„ Zzd½d¾„ Z{d¿dÀ„ Z|dÁdÂ„ Z}dÃdÄ„ Z~dÅdÆ„ ZdÇdÈ„ Z€dÉdÊ„ ZdËdÌ„ Z‚dS )ÏÚPrettyTableNc                 K   sV  |  dd¡| _g | _i | _i | _i | _g | _|r8|| _ng | _d 	¡ | _
| j
 d 	¡ ¡ | j
 d 	¡ ¡ | j
D ]&}||v rŒ|  ||| ¡ qnd||< qn|d p d| _|d	 p®d| _|d
 p¼d| _|d dv rØ|d | _nd| _|d pèd| _|d dv r|d | _nd| _|d pt| _|d p(t| _|d p8d| _|d dv rV|d | _nd| _|d pldd„ | _|d p|i | _|d pŒi | _|d pœd| _|d p¬d| _|d p¼d| _|d pÒ|  d¡| _ |d  pè|  d!¡| _!|d" pþ|  d#¡| _"|d$ dv r|d$ | _#nd| _#|d% p.d| _$|d& p>d| _%|d' pNi | _&dS )(aá  Return a new PrettyTable instance

        Arguments:

        encoding - Unicode encoding scheme used to decode any encoded input
        field_names - list or tuple of field names
        fields - list or tuple of field names to include in displays
        start - index of first data row to include in output
        end - index of last data row to include in output PLUS ONE (list slice style)
        header - print a header showing field names (True or False)
        header_style - stylisation to apply to field names in header ("cap", "title", "upper", "lower" or None)
        border - print a border around the table (True or False)
        hrules - controls printing of horizontal rules after rows.  Allowed values: FRAME, HEADER, ALL, NONE
        vrules - controls printing of vertical rules between columns.  Allowed values: FRAME, ALL, NONE
        int_format - controls formatting of integer data
        float_format - controls formatting of floating point data
        padding_width - number of spaces on either side of column data (only used if left and right paddings are None)
        left_padding_width - number of spaces on left hand side of column data
        right_padding_width - number of spaces on right hand side of column data
        vertical_char - single character string used to draw vertical lines
        horizontal_char - single character string used to draw horizontal lines
        junction_char - single character string used to draw line junctions
        sortby - name of field to sort rows by
        sort_key - sorting key function, applied to data points before sorting
        valign - default valign for each row (None, "t", "m" or "b")
        reversesort - True or False to sort in descending or ascending orderÚencodingÚcp1252zZstart end fields header border sortby reversesort sort_key attributes format hrules vruleszLint_format float_format padding_width left_padding_width right_padding_widthzQvertical_char horizontal_char junction_char header_style valign xhtml print_emptyNÚstartr   ÚendÚfieldsÚheader©TFTÚheader_styleÚborderÚhrulesÚvrulesÚsortbyÚreversesortFÚsort_keyc                 S   s   | S ©Nr   ©Úxr   r   r   Ú<lambda>p   r   z&PrettyTable.__init__.<locals>.<lambda>Ú
int_formatÚfloat_formatÚpadding_widthr   Úleft_padding_widthÚright_padding_widthÚvertical_charú|Úhorizontal_charú-Újunction_charú+Úprint_emptyÚformatÚxhtmlÚ
attributes)'Úgetr   Ú_field_namesÚ_alignÚ_valignÚ
_max_widthÚ_rowsÚfield_namesÚ_widthsr   Ú_optionsÚextendÚ_validate_optionÚ_startÚ_endÚ_fieldsÚ_headerÚ_header_styleÚ_borderÚFRAMEÚ_hrulesÚALLÚ_vrulesÚ_sortbyÚ_reversesortÚ	_sort_keyÚ_int_formatÚ_float_formatÚ_padding_widthÚ_left_padding_widthÚ_right_padding_widthÚ_unicodeÚ_vertical_charÚ_horizontal_charÚ_junction_charÚ_print_emptyÚ_formatÚ_xhtmlÚ_attributes)ÚselfrD   ÚkwargsÚoptionr   r   r   Ú__init__/   s`    


zPrettyTable.__init__c                 C   s.   t |tƒst|ƒ}t |tƒs*t|| jdƒ}|S )NÚstrict)Ú
isinstanceÚ
basestringÚstrÚunicoder   )rc   Úvaluer   r   r   r[   ‚   s
    

zPrettyTable._unicodec                 C   sª   |t |ƒ }|dkr ||d  S |dkr4|d | S |d rŠt |ƒd rh|d d | |d d d  S |d d d | |d d  S n|d d | |d d  S d S )NÚlú Úrr   r   r   )rc   r   r   ÚalignÚexcessr   r   r   Ú_justify‰   s     "zPrettyTable._justifyc                 C   sP   |dkrt | jƒS |dkrD| jr*t | jƒS | jr>t | jd ƒS dS nt|ƒ‚d S )NÚrowcountÚcolcountr   )r   rC   r?   ÚAttributeError)rc   Únamer   r   r   Ú__getattr__—   s    

zPrettyTable.__getattr__c                 C   sœ   t ƒ }| j|_| jD ]}t|d| t| d| ƒƒ qt|dt| dƒƒ t|tƒrl| j| D ]}| |¡ qZn,t|t	ƒrˆ| | j| ¡ nt
dt|ƒ ƒ‚|S )NÚ_r@   z0Index %s is invalid, must be an integer or slice)r   rD   rF   ÚsetattrÚgetattrrh   ÚslicerC   Úadd_rowÚintÚ	Exceptionrj   )rc   ÚindexÚnewÚattrÚrowr   r   r   Ú__getitem__¤   s    


zPrettyTable.__getitem__c                 C   s   |   ¡ S r+   )Ú__unicode__©rc   r   r   r   Ú__str__·   s    zPrettyTable.__str__c                 C   s   |   ¡  | j¡S r+   )r„   Úencoder   r…   r   r   r   r†   ¼   s    c                 C   s   |   ¡ S r+   )Ú
get_stringr…   r   r   r   r„   ¿   s    zPrettyTable.__unicode__c                 C   s2  |dv r|   |¡ n|dv r.|  ||¡ n |dv rD|  ||¡ nê|dv rZ|  ||¡ nÔ|dv rp|  ||¡ n¾|dv r†|  ||¡ n¨|dv rœ|  ||¡ n’|dv r²|  ||¡ n||d	v rÆ|  |¡ nh|d
v rÜ|  	||¡ nR|dv rò|  
||¡ n<|dv r
|  ||¡ n$|dv r"|  ||¡ ntd| ƒ‚d S )NrD   )r   r    Ú	max_widthr1   r2   r3   r;   r(   r*   r&   r'   r!   )r"   r%   r)   r<   r:   r$   r/   r0   )r4   r6   r8   r=   zUnrecognised option: %s!)Ú_validate_field_namesÚ_validate_nonnegative_intÚ_validate_field_nameÚ_validate_functionÚ_validate_hrulesÚ_validate_vrulesÚ_validate_all_field_namesÚ_validate_true_or_falseÚ_validate_header_styleÚ_validate_int_formatÚ_validate_float_formatÚ_validate_single_charÚ_validate_attributesr~   )rc   re   Úvalr   r   r   rH   Â   s6    

zPrettyTable._validate_optionc              	   C   sà   | j rNzt|ƒt| j ƒksJ ‚W n, tyL   tdt|ƒt| j ƒf ƒ‚Y n0 | jr¤zt|ƒt| jd ƒkspJ ‚W n0 ty¢   tdt|ƒt| jd ƒf ƒ‚Y n0 zt|ƒtt|ƒƒks¾J ‚W n tyÚ   tdƒ‚Y n0 d S )NzJField name list has incorrect number of values, (actual) %d!=%d (expected)r   zField names must be unique!)r?   r   ÚAssertionErrorr~   rC   Úset©rc   r—   r   r   r   rŠ   à   s     $z!PrettyTable._validate_field_namesc                 C   s0   z|dv sJ ‚W n t y*   tdƒ‚Y n0 d S )N)ÚcapÚtitleÚupperÚlowerNz;Invalid header style, use cap, title, upper, lower or None!©r˜   r~   rš   r   r   r   r’   ò   s
    z"PrettyTable._validate_header_stylec                 C   s4   z|dv sJ ‚W n t y.   td| ƒ‚Y n0 d S )N)rm   Úcro   z'Alignment %s is invalid, use l, c or r!rŸ   rš   r   r   r   Ú_validate_alignú   s    zPrettyTable._validate_alignc                 C   s4   z|dv sJ ‚W n t y.   td| ƒ‚Y n0 d S )N)ÚtÚmÚbNz-Alignment %s is invalid, use t, m, b or None!rŸ   rš   r   r   r   Ú_validate_valign   s
    zPrettyTable._validate_valignc              	   C   sB   zt |ƒdksJ ‚W n( ty<   td||  |¡f ƒ‚Y n0 d S )Nr   zInvalid value for %s: %s!)r}   r˜   r~   r[   ©rc   rv   r—   r   r   r   r‹     s    z%PrettyTable._validate_nonnegative_intc                 C   s4   z|dv sJ ‚W n t y.   td| ƒ‚Y n0 d S )Nr#   z-Invalid value for %s!  Must be True or False.rŸ   r¦   r   r   r   r‘     s    z#PrettyTable._validate_true_or_falsec                 C   sT   |dkrd S z$t |ƒttfv s"J ‚| ¡ s.J ‚W n tyN   td| ƒ‚Y n0 d S )NÚ z8Invalid value for %s!  Must be an integer format string.)Útyperj   rk   Úisdigitr˜   r~   r¦   r   r   r   r“     s    z PrettyTable._validate_int_formatc                 C   s¦   |dkrd S zvt |ƒttfv s"J ‚d|v s.J ‚| d¡}t|ƒdksHJ ‚|d dksd|d  ¡ sdJ ‚|d dks€|d  ¡ s€J ‚W n ty    td| ƒ‚Y n0 d S )Nr§   Ú.r   r   r   z5Invalid value for %s!  Must be a float format string.)r¨   rj   rk   r   r   r©   r˜   r~   )rc   rv   r—   Úbitsr   r   r   r”     s    
 z"PrettyTable._validate_float_formatc                 C   s6   zt |dƒsJ ‚W n ty0   td| ƒ‚Y n0 d S )NÚ__call__z*Invalid value for %s!  Must be a function.)Úhasattrr˜   r~   r¦   r   r   r   r   *  s    zPrettyTable._validate_functionc                 C   s<   z|t tttfv sJ ‚W n ty6   td| ƒ‚Y n0 d S )Nz:Invalid value for %s!  Must be ALL, FRAME, HEADER or NONE.)rQ   rO   ÚHEADERÚNONEr˜   r~   r¦   r   r   r   rŽ   0  s    ýzPrettyTable._validate_hrulesc                 C   s:   z|t ttfv sJ ‚W n ty4   td| ƒ‚Y n0 d S )Nz3Invalid value for %s!  Must be ALL, FRAME, or NONE.)rQ   rO   r¯   r˜   r~   r¦   r   r   r   r   9  s    zPrettyTable._validate_vrulesc                 C   s>   z|| j v s|d u sJ ‚W n ty8   td| ƒ‚Y n0 d S )NzInvalid field name: %s!)r?   r˜   r~   r¦   r   r   r   rŒ   ?  s
    z PrettyTable._validate_field_namec                 C   s:   z|D ]}|   ||¡ qW n ty4   tdƒ‚Y n0 d S )Nz)fields must be a sequence of field names!)rŒ   r˜   r~   )rc   rv   r—   r-   r   r   r   r   G  s
    z%PrettyTable._validate_all_field_namesc                 C   s8   zt |ƒdksJ ‚W n ty2   td| ƒ‚Y n0 d S )Nr   z4Invalid value for %s!  Must be a string of length 1.)r   r˜   r~   r¦   r   r   r   r•   O  s    z!PrettyTable._validate_single_charc                 C   s2   zt |tƒsJ ‚W n ty,   tdƒ‚Y n0 d S )Nz4attributes must be a dictionary of name/value pairs!)rh   Údictr˜   r~   r¦   r   r   r   r–   U  s    z PrettyTable._validate_attributesc                 C   s   | j S r+   )r?   r…   r   r   r   Ú_get_field_names[  s    zPrettyTable._get_field_namesc                    s  ‡ fdd„|D ƒ}ˆ   d|¡ ˆ jr2ˆ jd d … }|ˆ _ˆ jrˆ|rˆt||ƒD ]\}}ˆ j| ˆ j|< qL|D ]}|ˆ jvrjˆ j |¡ qjnˆ jD ]}dˆ j|< qŽˆ jrî|rît||ƒD ]\}}ˆ j| ˆ j|< q²|D ]}|ˆ jvrÐˆ j |¡ qÐnˆ jD ]}dˆ j|< qôd S )Nc                    s   g | ]}ˆ   |¡‘qS r   )r[   ©r   r-   r…   r   r   r   _  r   z0PrettyTable._set_field_names.<locals>.<listcomp>rD   r    r¢   )rH   r?   r@   ÚzipÚpoprA   )rc   r—   Ú	old_namesÚold_nameÚnew_nameÚfieldr   r…   r   Ú_set_field_names^  s*    





zPrettyTable._set_field_namesc                 C   s   | j S r+   )r@   r…   r   r   r   Ú
_get_align~  s    zPrettyTable._get_alignc                 C   s$   |   |¡ | jD ]}|| j|< qd S r+   )r¡   r?   r@   ©rc   r—   r¸   r   r   r   Ú
_set_align  s    

zPrettyTable._set_alignc                 C   s   | j S r+   )rA   r…   r   r   r   Ú_get_valignˆ  s    zPrettyTable._get_valignc                 C   s$   |   |¡ | jD ]}|| j|< qd S r+   )r¥   r?   rA   r»   r   r   r   Ú_set_valign‹  s    

zPrettyTable._set_valignc                 C   s   | j S r+   )rB   r…   r   r   r   Ú_get_max_width’  s    zPrettyTable._get_max_widthc                 C   s&   |   d|¡ | jD ]}|| j|< qd S )Nr‰   )rH   r?   rB   r»   r   r   r   Ú_set_max_width•  s    
zPrettyTable._set_max_widthc                 C   s   | j S )zList or tuple of field names to include in displays

        Arguments:

        fields - list or tuple of field names to include in displays)rK   r…   r   r   r   Ú_get_fieldsœ  s    zPrettyTable._get_fieldsc                 C   s   |   d|¡ || _d S )Nr!   )rH   rK   rš   r   r   r   Ú_set_fields¤  s    zPrettyTable._set_fieldsc                 C   s   | j S )z{Start index of the range of rows to print

        Arguments:

        start - index of first data row to include in output)rI   r…   r   r   r   Ú
_get_startª  s    zPrettyTable._get_startc                 C   s   |   d|¡ || _d S )Nr   )rH   rI   rš   r   r   r   Ú
_set_start²  s    zPrettyTable._set_startc                 C   s   | j S )z’End index of the range of rows to print

        Arguments:

        end - index of last data row to include in output PLUS ONE (list slice style))rJ   r…   r   r   r   Ú_get_end¸  s    zPrettyTable._get_endc                 C   s   |   d|¡ || _d S )Nr    )rH   rJ   rš   r   r   r   Ú_set_endÀ  s    zPrettyTable._set_endc                 C   s   | j S )z_Name of field by which to sort rows

        Arguments:

        sortby - field name to sort by)rS   r…   r   r   r   Ú_get_sortbyÆ  s    zPrettyTable._get_sortbyc                 C   s   |   d|¡ || _d S )Nr(   )rH   rS   rš   r   r   r   Ú_set_sortbyÎ  s    zPrettyTable._set_sortbyc                 C   s   | j S )z®Controls direction of sorting (ascending vs descending)

        Arguments:

        reveresort - set to True to sort by descending order, or False to sort by ascending order)rT   r…   r   r   r   Ú_get_reversesortÔ  s    zPrettyTable._get_reversesortc                 C   s   |   d|¡ || _d S )Nr)   )rH   rT   rš   r   r   r   Ú_set_reversesortÜ  s    zPrettyTable._set_reversesortc                 C   s   | j S )zªSorting key function, applied to data points before sorting

        Arguments:

        sort_key - a function which takes one argument and returns something to be sorted)rU   r…   r   r   r   Ú_get_sort_keyâ  s    zPrettyTable._get_sort_keyc                 C   s   |   d|¡ || _d S )Nr*   )rH   rU   rš   r   r   r   Ú_set_sort_keyê  s    zPrettyTable._set_sort_keyc                 C   s   | j S )z‹Controls printing of table header with field names

        Arguments:

        header - print a header showing field names (True or False))rL   r…   r   r   r   Ú_get_headerð  s    zPrettyTable._get_headerc                 C   s   |   d|¡ || _d S )Nr"   )rH   rL   rš   r   r   r   Ú_set_headerø  s    zPrettyTable._set_headerc                 C   s   | j S )zºControls stylisation applied to field names in header

        Arguments:

        header_style - stylisation to apply to field names in header ("cap", "title", "upper", "lower" or None))rM   r…   r   r   r   Ú_get_header_styleþ  s    zPrettyTable._get_header_stylec                 C   s   |   |¡ || _d S r+   )r’   rM   rš   r   r   r   Ú_set_header_style  s    
zPrettyTable._set_header_stylec                 C   s   | j S )z~Controls printing of border around table

        Arguments:

        border - print a border around the table (True or False))rN   r…   r   r   r   Ú_get_border  s    zPrettyTable._get_borderc                 C   s   |   d|¡ || _d S )Nr%   )rH   rN   rš   r   r   r   Ú_set_border  s    zPrettyTable._set_borderc                 C   s   | j S )z˜Controls printing of horizontal rules after rows

        Arguments:

        hrules - horizontal rules style.  Allowed values: FRAME, ALL, HEADER, NONE)rP   r…   r   r   r   Ú_get_hrules  s    zPrettyTable._get_hrulesc                 C   s   |   d|¡ || _d S )Nr&   )rH   rP   rš   r   r   r   Ú_set_hrules"  s    zPrettyTable._set_hrulesc                 C   s   | j S )z‘Controls printing of vertical rules between columns

        Arguments:

        vrules - vertical rules style.  Allowed values: FRAME, ALL, NONE)rR   r…   r   r   r   Ú_get_vrules(  s    zPrettyTable._get_vrulesc                 C   s   |   d|¡ || _d S )Nr'   )rH   rR   rš   r   r   r   Ú_set_vrules0  s    zPrettyTable._set_vrulesc                 C   s   | j S )zbControls formatting of integer data
        Arguments:

        int_format - integer format string)rV   r…   r   r   r   Ú_get_int_format6  s    zPrettyTable._get_int_formatc                 C   s   | j D ]}|| j|< qd S r+   )r?   rV   r»   r   r   r   Ú_set_int_format=  s    
zPrettyTable._set_int_formatc                 C   s   | j S )zrControls formatting of floating point data
        Arguments:

        float_format - floating point format string)rW   r…   r   r   r   Ú_get_float_formatC  s    zPrettyTable._get_float_formatc                 C   s   | j D ]}|| j|< qd S r+   )r?   rW   r»   r   r   r   Ú_set_float_formatJ  s    
zPrettyTable._set_float_formatc                 C   s   | j S )zœThe number of empty spaces between a column's edge and its content

        Arguments:

        padding_width - number of spaces, must be a positive integer)rX   r…   r   r   r   Ú_get_padding_widthP  s    zPrettyTable._get_padding_widthc                 C   s   |   d|¡ || _d S )Nr1   )rH   rX   rš   r   r   r   Ú_set_padding_widthX  s    zPrettyTable._set_padding_widthc                 C   s   | j S )z The number of empty spaces between a column's left edge and its content

        Arguments:

        left_padding - number of spaces, must be a positive integer)rY   r…   r   r   r   Ú_get_left_padding_width^  s    z#PrettyTable._get_left_padding_widthc                 C   s   |   d|¡ || _d S )Nr2   )rH   rY   rš   r   r   r   Ú_set_left_padding_widthf  s    z#PrettyTable._set_left_padding_widthc                 C   s   | j S )z¢The number of empty spaces between a column's right edge and its content

        Arguments:

        right_padding - number of spaces, must be a positive integer)rZ   r…   r   r   r   Ú_get_right_padding_widthl  s    z$PrettyTable._get_right_padding_widthc                 C   s   |   d|¡ || _d S )Nr3   )rH   rZ   rš   r   r   r   Ú_set_right_padding_widtht  s    z$PrettyTable._set_right_padding_widthc                 C   s   | j S )z¥The charcter used when printing table borders to draw vertical lines

        Arguments:

        vertical_char - single character string used to draw vertical lines)r\   r…   r   r   r   Ú_get_vertical_charz  s    zPrettyTable._get_vertical_charc                 C   s    |   |¡}|  d|¡ || _d S ©Nr4   )r[   rH   r\   rš   r   r   r   Ú_set_vertical_char‚  s    
zPrettyTable._set_vertical_charc                 C   s   | j S )z«The charcter used when printing table borders to draw horizontal lines

        Arguments:

        horizontal_char - single character string used to draw horizontal lines)r]   r…   r   r   r   Ú_get_horizontal_char‰  s    z PrettyTable._get_horizontal_charc                 C   s    |   |¡}|  d|¡ || _d S )Nr6   )r[   rH   r]   rš   r   r   r   Ú_set_horizontal_char‘  s    
z PrettyTable._set_horizontal_charc                 C   s   | j S )z¥The charcter used when printing table borders to draw line junctions

        Arguments:

        junction_char - single character string used to draw line junctions)r^   r…   r   r   r   Ú_get_junction_char˜  s    zPrettyTable._get_junction_charc                 C   s    |   |¡}|  d|¡ || _d S râ   )r[   rH   r^   rš   r   r   r   Ú_set_junction_char   s    
zPrettyTable._set_junction_charc                 C   s   | j S )z~Controls whether or not HTML tables are formatted to match styling options

        Arguments:

        format - True or False)r`   r…   r   r   r   Ú_get_format§  s    zPrettyTable._get_formatc                 C   s   |   d|¡ || _d S )Nr;   )rH   r`   rš   r   r   r   Ú_set_format¯  s    zPrettyTable._set_formatc                 C   s   | j S )zControls whether or not empty tables produce a header and frame or just an empty string

        Arguments:

        print_empty - True or False)r_   r…   r   r   r   Ú_get_print_emptyµ  s    zPrettyTable._get_print_emptyc                 C   s   |   d|¡ || _d S )Nr:   )rH   r_   rš   r   r   r   Ú_set_print_empty½  s    zPrettyTable._set_print_emptyc                 C   s   | j S )z§A dictionary of HTML attribute name/value pairs to be included in the <table> tag when printing HTML

        Arguments:

        attributes - dictionary of attributes)rb   r…   r   r   r   Ú_get_attributesÃ  s    zPrettyTable._get_attributesc                 C   s   |   d|¡ || _d S )Nr=   )rH   rb   rš   r   r   r   Ú_set_attributesË  s    zPrettyTable._set_attributesc                 C   sL   i }| j D ]<}||v r4|  ||| ¡ || ||< q
t| d| ƒ||< q
|S )Nrx   )rF   rH   rz   )rc   rd   Úoptionsre   r   r   r   Ú_get_optionsÑ  s    
zPrettyTable._get_optionsc                 C   sT   |t kr|  ¡  n>|tkr$|  ¡  n,|tkr6|  ¡  n|tkrH|  ¡  ntdƒ‚d S )NzInvalid pre-set style!)	ÚDEFAULTÚ_set_default_styleÚMSWORD_FRIENDLYÚ_set_msword_styleÚPLAIN_COLUMNSÚ_set_columns_styleÚRANDOMÚ_set_random_styler~   )rc   Ústyler   r   r   Ú	set_styleÜ  s    



zPrettyTable.set_stylec                 C   s@   d| _ d| _t| _t| _d| _d| _d| _d| _	d| _
d| _d S )NTr   r5   r7   r9   )r"   r%   rO   rP   rQ   rR   r1   r2   r3   r4   r6   r8   r…   r   r   r   rñ   è  s    zPrettyTable._set_default_stylec                 C   s.   d| _ d| _t| _d| _d| _d| _d| _d S )NTr   r5   )r"   r%   r¯   rP   r1   r2   r3   r4   r…   r   r   r   ró   ô  s    zPrettyTable._set_msword_stylec                 C   s"   d| _ d| _d| _d| _d| _d S )NTFr   r   é   )r"   r%   r1   r2   r3   r…   r   r   r   rõ   ý  s
    zPrettyTable._set_columns_stylec                 C   s‚   t  d¡| _t  d¡| _t  ttttf¡| _t  tttf¡| _	t  
dd¡| _t  
dd¡| _t  d¡| _t  d¡| _t  d¡| _d S )Nr#   r   é   z ~!@#$%^&*()_+|-=\{}[];':",./;<>?)ÚrandomÚchoicer"   r%   rQ   rO   r®   r¯   rP   rR   Úrandintr2   r3   r4   r6   r8   r…   r   r   r   r÷     s    ýzPrettyTable._set_random_stylec                 C   sf   | j r2t|ƒt| j ƒkr2tdt|ƒt| j ƒf ƒ‚| j sRdd„ tdt|ƒƒD ƒ| _| j t|ƒ¡ dS )zAdd a row to the table

        Arguments:

        row - row of data, should be a list with as many elements as the table
        has fieldsz>Row has incorrect number of values, (actual) %d!=%d (expected)c                 S   s   g | ]}d |d  ‘qS )zField %dr   r   )r   Únr   r   r   r     r   z'PrettyTable.add_row.<locals>.<listcomp>r   N)r?   r   r~   ÚrangerD   rC   ÚappendÚlist)rc   r‚   r   r   r   r|     s
    zPrettyTable.add_rowc                 C   s4   |t | jƒd kr(td|t | jƒf ƒ‚| j|= dS )z‚Delete a row to the table

        Arguments:

        row_index - The index of the row you want to delete.  Indexing starts at 0.r   z4Cant delete row at index %d, table only has %d rows!N)r   rC   r~   )rc   Ú	row_indexr   r   r   Údel_row  s    zPrettyTable.del_rowr    r¢   c                 C   s°   t | jƒdt |ƒfv r’|  |¡ |  |¡ | j |¡ || j|< || j|< tdt |ƒƒD ]6}t | jƒ|d k rz| j g ¡ | j|  || ¡ qXnt	dt |ƒt | jƒf ƒ‚dS )a­  Add a column to the table.

        Arguments:

        fieldname - name of the field to contain the new column of data
        column - column of data, should be a list with as many elements as the
        table has rows
        align - desired alignment for this column - "l" for left, "c" for centre and "r" for right
        valign - desired vertical alignment for new columns - "t" for top, "m" for middle and "b" for bottomr   r   z2Column length %d does not match number of rows %d!N)
r   rC   r¡   r¥   r?   r  r@   rA   r   r~   )rc   Ú	fieldnameÚcolumnrp   ÚvalignÚir   r   r   Ú
add_column)  s    




zPrettyTable.add_columnc                 C   s
   g | _ dS )z?Delete all rows from the table but keep the current field namesN)rC   r…   r   r   r   Ú
clear_rowsA  s    zPrettyTable.clear_rowsc                 C   s   g | _ g | _g | _dS )zWDelete all rows and field names from the table, maintaining nothing but styling optionsN)rC   r?   rE   r…   r   r   r   ÚclearE  s    zPrettyTable.clearc                 C   s
   t  | ¡S r+   )ÚcopyÚdeepcopyr…   r   r   r   r  K  s    zPrettyTable.copyc                 C   sd   t |tƒr.|| jv r.|  d| j|  | ¡}n,t |tƒrZ|| jv rZ|  d| j|  | ¡}|  |¡S )Nz%%%sdz%%%sf)rh   r}   rV   r[   ÚfloatrW   )rc   r¸   rl   r   r   r   Ú_format_valueN  s
    zPrettyTable._format_valuec                 C   s¦   |d rdd„ | j D ƒ}nt| jƒdg }|D ]l}t|ƒD ]^\}}| j| }|| jv r~t|| tt|ƒd | j| ƒƒ||< q:t|| t|ƒd ƒ||< q:q.|| _d S )Nr"   c                 S   s   g | ]}t |ƒd  ‘qS ©r   )r   )r   r¸   r   r   r   r   W  r   z/PrettyTable._compute_widths.<locals>.<listcomp>r   )	r?   r   rD   Ú	enumerater‰   r   Úminr   rE   )rc   Úrowsrî   Úwidthsr‚   r   rl   r  r   r   r   Ú_compute_widthsU  s    

(zPrettyTable._compute_widthsc                 C   sD   |d d ur|d }n|d }|d d ur4|d }n|d }||fS )Nr2   r1   r3   r   )rc   rî   ÚlpadÚrpadr   r   r   Ú_get_padding_widthsd  s    

zPrettyTable._get_padding_widthsc                    sn   t  | j|d |d … ¡}|d rj| j |d ¡‰ ‡ fdd„|D ƒ}|j|d |d d d	d„ |D ƒ}|S )
z—Return only those data rows that should be printed, based on slicing and sorting.

        Arguments:

        options - dictionary of option settings.r   r    r(   c                    s   g | ]}|ˆ  g| ‘qS r   r   ©r   r‚   ©Ú	sortindexr   r   r   x  r   z)PrettyTable._get_rows.<locals>.<listcomp>r)   r*   )ÚreverseÚkeyc                 S   s   g | ]}|d d… ‘qS )r   Nr   r  r   r   r   r   z  r   )r  r  rC   r?   r   Úsort)rc   rî   r  r   r  r   Ú	_get_rowso  s    zPrettyTable._get_rowsc                    s   ‡ fdd„t ˆ j|ƒD ƒS )Nc                    s   g | ]\}}ˆ   ||¡‘qS r   )r  )r   r¸   rl   r…   r   r   r   ~  r   z+PrettyTable._format_row.<locals>.<listcomp>)r³   r?   )rc   r‚   rî   r   r…   r   Ú_format_row}  s    zPrettyTable._format_rowc                    s   ‡ ‡fdd„|D ƒS )Nc                    s   g | ]}ˆ  |ˆ ¡‘qS r   )r   r  ©rî   rc   r   r   r     r   z,PrettyTable._format_rows.<locals>.<listcomp>r   )rc   r  rî   r   r!  r   Ú_format_rows€  s    zPrettyTable._format_rowsc                 K   sä   |   |¡}g }| jdkr,|d r(|d s,dS |  |¡}|  ||¡}|  ||¡ |  |¡| _|d rt| |  |¡¡ n$|d r˜|d t	t
fv r˜| | j¡ |D ]}| |  ||¡¡ qœ|d rÔ|d t
krÔ| | j¡ |  d¡ |¡S )a"  Return string representation of table in current state.

        Arguments:

        start - index of first data row to include in output
        end - index of last data row to include in output PLUS ONE (list slice style)
        fields - names of fields (columns) to include
        header - print a header showing field names (True or False)
        border - print a border around the table (True or False)
        hrules - controls printing of horizontal rules after rows.  Allowed values: ALL, FRAME, HEADER, NONE
        vrules - controls printing of vertical rules between columns.  Allowed values: FRAME, ALL, NONE
        int_format - controls formatting of integer data
        float_format - controls formatting of floating point data
        padding_width - number of spaces on either side of column data (only used if left and right paddings are None)
        left_padding_width - number of spaces on left hand side of column data
        right_padding_width - number of spaces on right hand side of column data
        vertical_char - single character string used to draw vertical lines
        horizontal_char - single character string used to draw horizontal lines
        junction_char - single character string used to draw line junctions
        sortby - name of field to sort rows by
        sort_key - sorting key function, applied to data points before sorting
        reversesort - True or False to sort in descending or ascending order
        print empty - if True, stringify just the header for an empty table, if False return an empty string r   r:   r%   r§   r"   r&   r   )rï   rs   r  r"  r  Ú_stringify_hruleÚ_hruler  Ú_stringify_headerrQ   rO   Ú_stringify_rowr[   Újoin)rc   rd   rî   r   r  Úformatted_rowsr‚   r   r   r   rˆ   ƒ  s"    

zPrettyTable.get_stringc                 C   sü   |d sdS |   |¡\}}|d ttfv r6|d g}n
|d g}| js^| |d ¡ d |¡S t| j| jƒD ]b\}}|d rŠ||d vrŠql| || | |d  ¡ |d tkrÀ| |d ¡ ql| |d ¡ ql|d tkrò| ¡  | |d ¡ d |¡S )Nr%   r§   r'   r8   r6   r!   )	r  rQ   rO   r?   r  r'  r³   rE   r´   )rc   rî   r  r  r«   r¸   r   r   r   r   r#  ®  s(    

zPrettyTable._stringify_hrulec              
   C   sà  g }|   |¡\}}|d rj|d ttfv r@| | j¡ | d¡ |d ttfv r`| |d ¡ n
| d¡ | jsš|d ttfv r| |d ¡ n
| d¡ t| j| jƒD ]Ð\}}|d rÆ||d vrÆq¨| jdkrÚ| 	¡ }nD| jd	krî| 
¡ }n0| jd
kr| ¡ }n| jdkr| ¡ }n|}| d| |  ||| j| ¡ d|  ¡ |d r¨|d tkrn| |d ¡ q¨| d¡ q¨|d r¨|d tkr¨| ¡  | |d ¡ |d rÖ|d tkrÖ| d¡ | | j¡ d |¡S )Nr%   r&   r   r'   r4   rn   r!   r›   rœ   r   rž   r§   )r  rQ   rO   r  r$  r?   r³   rE   rM   Ú
capitalizerœ   r   rž   rr   r@   r´   r¯   r'  )rc   rî   r«   r  r  r¸   r   r  r   r   r   r%  Ç  sJ    








*
zPrettyTable._stringify_headerc                 C   sø  t tdt|ƒƒ| j|| jƒD ]\\}}}}| d¡}g }|D ]&}	t|	ƒ|krVt |	|¡}	| 	|	¡ q:|}d 
|¡}|||< qd}
|D ]}t|ƒd }||
kr‚|}
q‚g }|  |¡\}}td|
ƒD ]F}| 	g ¡ |d r¼|d ttfv rô||  	| j¡ q¼||  	d¡ q¼t | j|| jƒD ],\}}}| j| }| d¡}|
t|ƒ }|r¦|dkr~dgt|d	 ƒ | dg|t|d	 ƒ   }n(|d
kr˜dg| | }n|dg|  }d}|D ]}|d rÎ||d vrÎq®||  	d| |  ||| j| ¡ d|  ¡ |d r4|d tkr&||  	| j¡ n||  	d¡ |d7 }q®qtd|
ƒD ]<}|d rN|d tkrN||  ¡  ||  	|d ¡ qN|d rÊ|d tkrÊ||
d   	d¡ ||
d   	| j¡ td|
ƒD ]}d 
|| ¡||< qÔd 
|¡S )Nr   r   r   r%   r'   rn   r£   r§   r   r¤   r!   r4   r&   )r³   r   r   r?   rE   r   r   ÚtextwrapÚfillr  r'  r   r  rQ   rO   r4   rA   r}   rr   r@   r´   r$  )rc   r‚   rî   r   r¸   rl   r   r   Ú	new_linesr   Ú
row_heightr    Úhr«   r  r  Úyr  ZdHeightrm   r   r   r   r&  ó  sj    (






.
.
zPrettyTable._stringify_rowc                 K   s,   |   |¡}|d r|  |¡}n
|  |¡}|S )a;  Return string representation of HTML formatted version of table in current state.

        Arguments:

        start - index of first data row to include in output
        end - index of last data row to include in output PLUS ONE (list slice style)
        fields - names of fields (columns) to include
        header - print a header showing field names (True or False)
        border - print a border around the table (True or False)
        hrules - controls printing of horizontal rules after rows.  Allowed values: ALL, FRAME, HEADER, NONE
        vrules - controls printing of vertical rules between columns.  Allowed values: FRAME, ALL, NONE
        int_format - controls formatting of integer data
        float_format - controls formatting of floating point data
        padding_width - number of spaces on either side of column data (only used if left and right paddings are None)
        left_padding_width - number of spaces on left hand side of column data
        right_padding_width - number of spaces on right hand side of column data
        sortby - name of field to sort rows by
        sort_key - sorting key function, applied to data points before sorting
        attributes - dictionary of name/value pairs to include as HTML attributes in the <table> tag
        xhtml - print <br/> tags if True, <br> tags if falser;   )rï   Ú_get_formatted_html_stringÚ_get_simple_html_string)rc   rd   rî   Ústringr   r   r   Úget_html_string4  s
    

zPrettyTable.get_html_stringc              	   C   s^  g }|d rd}nd}g }|  d¡ |d rT|d D ]}|  d||d | f ¡ q4|  d¡ |  d |¡¡ |d	 rÆ|  d
¡ | jD ]4}|d r ||d vr q†|  dt|ƒ d|¡ ¡ q†|  d¡ |  |¡}|  ||¡}|D ]b}	|  d
¡ t| j|	ƒD ]<\}}
|d r||d vrqú|  dt|
ƒ d|¡ ¡ qú|  d¡ qà|  d¡ |  d¡ |¡S )Nr<   ú<br/>ú<br>ú<tabler=   ú %s="%s"ú>r§   r"   ú    <tr>r!   z        <th>%s</th>r   ú	    </tr>z        <td>%s</td>ú</table>)	r  r'  r?   r   Úreplacer  r"  r³   r[   )rc   rî   r   Ú	linebreakÚopen_tagÚ	attr_namer¸   r  r(  r‚   Údatumr   r   r   r1  P  s:    







z#PrettyTable._get_simple_html_stringc                 C   s¼  g }|   |¡\}}|d r d}nd}g }| d¡ |d r|d tkr`|d tkr`| d¡ n¨|d tkr„|d tkr„| d	¡ n„|d tkr¨|d tkr¨| d
¡ n`|d tkrÀ| d¡ nH|d tkrØ| d¡ n0|d tkrð| d¡ n|d tkr| d¡ |d r<|d D ] }| d||d | f ¡ q| d¡ | d |¡¡ |d r¾| d¡ | jD ]B}|d r||d vrqp| d||t|ƒ d|¡f ¡ qp| d¡ |  |¡}	|  	|	|¡}
g }g }| jD ]>}| ddddœ| j
|  ¡ | dddd œ| j|  ¡ qâ|
D ]z}| d¡ t| j|||ƒD ]N\}}}}|d rl||d vrlqD| d!||||t|ƒ d|¡f ¡ qD| d¡ q&| d"¡ |  d¡ |¡S )#Nr<   r4  r5  r6  r%   r&   r'   z frame="box" rules="all"z frame="box"z frame="box" rules="cols"z frame="hsides"z frame="hsides" rules="rows"z frame="vsides"z frame="vsides" rules="cols"r=   r7  r8  r§   r"   r9  r!   zW        <th style="padding-left: %dem; padding-right: %dem; text-align: center">%s</th>r   r:  ÚleftÚrightÚcenter)rm   ro   r    ÚtopÚmiddleÚbottom)r¢   r£   r¤   zg        <td style="padding-left: %dem; padding-right: %dem; text-align: %s; vertical-align: %s">%s</td>r;  )r  r  rQ   rO   r'  r?   r   r<  r  r"  r@   rA   r³   r[   )rc   rî   r   r  r  r=  r>  r?  r¸   r  r(  ÚalignsÚvalignsr‚   r@  rp   r  r   r   r   r0  t  s‚    







$


þþþþ

ü
z&PrettyTable._get_formatted_html_string)N)r    r¢   )ƒÚ__name__Ú
__module__Ú__qualname__rf   r[   rr   rw   rƒ   Úpy3kr†   r„   rH   rŠ   r’   r¡   r¥   r‹   r‘   r“   r”   r   rŽ   r   rŒ   r   r•   r–   r±   r¹   ÚpropertyrD   rº   r¼   rp   r½   r¾   r  r¿   rÀ   r‰   rÁ   rÂ   r!   rÃ   rÄ   r   rÅ   rÆ   r    rÇ   rÈ   r(   rÉ   rÊ   r)   rË   rÌ   r*   rÍ   rÎ   r"   rÏ   rÐ   r$   rÑ   rÒ   r%   rÓ   rÔ   r&   rÕ   rÖ   r'   r×   rØ   r/   rÙ   rÚ   r0   rÛ   rÜ   r1   rÝ   rÞ   r2   rß   rà   r3   rá   rã   r4   rä   rå   r6   ræ   rç   r8   rè   ré   r;   rê   rë   r:   rì   rí   r=   rï   rù   rñ   ró   rõ   r÷   r|   r  r	  r
  r  r  r  r  r  r  r   r"  rˆ   r#  r%  r&  r3  r1  r0  r   r   r   r   r   -   s   
S
		

























	

+,A$r   c                 C   sì   d|   krdkrn ndS d|   kr0dkr8n ndS d|   krLdkrTn ndS t  t| ƒ¡rfd	S d
|   krzdks”n d|   krdkr˜n ndS d|   kr¬dkr´n ndS d|   krÈdkrÐn ndS | dv rÜdS | dv rèd	S dS )Né!   é~   r   i N  iÿŸ  r   i ¬  i¯×  r   i@0  iŸ0  i 0  iÿ0  iÿ  i`ÿ  i 0  i>0  )rú   é   éÿÿÿÿ)r   é   )ÚunicodedataÚ	combiningÚuni_chr)Úcharr   r   r   Ú_char_block_width·  s&    .rW  c              	   C   s   t ttttt d| ¡ƒƒƒS )Nr§   )ÚsumÚitermaprW  ÚordÚ_reÚsub)r—   r   r   r   r   Í  s    r   c                 K   s”   t  ¡  |  d¡¡}|  d¡ t  | |¡}tf i |¤Ž}|rD||_n.tr^dd„ t	|ƒD ƒ|_ndd„ | 	¡ D ƒ|_|D ]}| 
dd„ |D ƒ¡ qv|S )Ni   r   c                 S   s   g | ]}|  ¡ ‘qS r   ©Ústripr²   r   r   r   r   Ù  r   zfrom_csv.<locals>.<listcomp>c                 S   s   g | ]}|  ¡ ‘qS r   r]  r²   r   r   r   r   Û  r   c                 S   s   g | ]}|  ¡ ‘qS r   r]  r²   r   r   r   r   Ý  r   )ÚcsvÚSnifferÚsniffÚreadÚseekÚreaderr   rD   rL  Únextr|   )ÚfprD   rd   Údialectrd  Útabler‚   r   r   r   Úfrom_csvÑ  s    
ri  c                 K   sF   | j rBtf i |¤Ž}dd„ | j D ƒ|_|  ¡ D ]}| |¡ q.|S d S )Nc                 S   s   g | ]}|d  ‘qS r  r   )r   Úcolr   r   r   r   å  r   z"from_db_cursor.<locals>.<listcomp>)Údescriptionr   rD   Úfetchallr|   )Úcursorrd   rh  r‚   r   r   r   Úfrom_db_cursorâ  s    rn  c                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚTableHandlerc                 K   s>   t  | ¡ || _g | _g | _g | _d| _d | _d| _d| _	d S )Nr   r§   F)
r   rf   rd   ÚtablesÚlast_rowr  Úmax_row_widthÚactiveÚlast_contentÚis_last_row_header)rc   rd   r   r   r   rf   î  s    
zTableHandler.__init__c                 C   s   || _ |dkrd| _d S )NÚthT)rs  ru  )rc   ÚtagÚattrsr   r   r   Úhandle_starttagú  s    zTableHandler.handle_starttagc                 C   s   |dv r| j  ¡ }| j |¡ |dkrZ| j | j| jf¡ t| jt| jƒƒ| _g | _d| _|dkr€|  	| j¡}| j
 |¡ g | _d| _ d | _d S )N)rv  ÚtdÚtrFrh  rn   )rt  r^  rq  r  r  ru  r   rr  r   Úgenerate_tablerp  rs  )rc   rw  Ústripped_contentrh  r   r   r   Úhandle_endtagÿ  s    
zTableHandler.handle_endtagc                 C   s   |  j |7  _ d S r+   )rt  )rc   Údatar   r   r   Úhandle_data  s    zTableHandler.handle_datac                 C   s–   t f i | j¤Ž}| jD ]z}t|d ƒ| jk r\| jt|d ƒ }td|ƒD ]}|d  d¡ qH|d dkr‚|  |d ¡ |d |_q| 	|d ¡ q|S )zE
        Generates from a list of rows a PrettyTable object.
        r   r   r7   T)
r   rd   r  r   rr  r   r  Úmake_fields_uniquerD   r|   )rc   r  rh  r‚   Úappendsr  r   r   r   r|    s    
zTableHandler.generate_tablec                 C   sP   t dt|ƒƒD ]<}t |d t|ƒƒD ]$}|| || kr$||  d7  < q$qdS )zB
        iterates over the row and make each field unique
        r   r   ú'N)r   r   )rc   r!   r  Újr   r   r   r  &  s    zTableHandler.make_fields_uniqueN)	rI  rJ  rK  rf   ry  r~  r€  r|  r  r   r   r   r   ro  ì  s   ro  c                 K   s   t f i |¤Ž}| | ¡ |jS )zƒ
    Generates a list of PrettyTables from a string of HTML code. Each <table> in
    the HTML becomes one PrettyTable object.
    )ro  Úfeedrp  )Ú	html_coderd   Úparserr   r   r   Ú	from_html0  s    
rˆ  c                 K   sH   t | fi |¤Ž}zt|ƒdks"J ‚W n ty>   tdƒ‚Y n0 |d S )zf
    Generates a PrettyTables from a string of HTML code which contains only a
    single <table>
    r   zDMore than one <table> in provided HTML code!  Use from_html instead.r   )rˆ  r   r˜   r~   )r†  rd   rp  r   r   r   Úfrom_html_one:  s    r‰  c                  C   s    t g d¢ƒ} d| _d| _d| jd< d| _d| jd< |  g d	¢¡ |  g d
¢¡ |  g d¢¡ |  g d¢¡ |  g d¢¡ |  g d¢¡ |  g d¢¡ t| ƒ d S )N)ú	City nameÚAreaÚ
PopulationzAnnual RainfallrŒ  TZ04dr‹  z6.1frm   rŠ  )ZAdelaidei  is¬ g     Ä‚@)ZBrisbanei  i:X gš™™™™é‘@)ÚDarwinép   iDØ gÍÌÌÌÌÊš@)ZHobartiM  iô" g     \ƒ@)ZSydneyi
  iö*B g33333û’@)Z	Melbournei  iŒ: g333337„@)ZPerthi
  iQ¹ g33333+‹@)r   r(   r)   r/   r0   rp   r|   Úprintr,   r   r   r   ÚmainH  s    

r  Ú__main__)N)2Ú__version__r  r_  rü   ÚreÚsysr*  Ú	itertoolsrS  Úversion_inforL  rj   rk   ri   ÚmaprY  r³   ZiterzipÚchrrU  Úhtml.parserr   ÚimapÚizipÚunichrÚhtmlr   ZcgirO   rQ   r¯   r®   rð   rò   rô   rö   Úcompiler[  r   Úobjectr   rW  r   ri  rn  ro  rˆ  r‰  r  rI  r   r   r   r   Ú<module>   sj   
         

D
)
