
F`Q                 @   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
 r e 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
 o 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 j$ d  Z% d d   Z& Gd d   d e'  Z( d d   Z) d d   Z* d d d  Z+ d d   Z, Gd d   d e  Z- d d   Z. d d   Z/ d d    Z0 e1 d! k re0   d S)"z0.7.2    N   )
HTMLParser      )escape
            z\[[0-9;]*mc             C   s>   |  j  d  } t |  } t d d   | D  } | | f S)N
c             S   s   g  |  ] } t  |   q S )_str_block_width).0liner   r   -/usr/lib/python3/dist-packages/prettytable.py
<listcomp>O   s   	 z_get_size.<locals>.<listcomp>)splitlenmax)textlinesZheightwidthr   r   r   	_get_sizeL   s    r   c               @   sd  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 d1 d2   Z d3 d4   Z e e e  Z d5 d6   Z d7 d8   Z  e e e   Z! d9 d:   Z" d; d<   Z# e e" e#  Z$ d= d>   Z% d? d@   Z& e e% e&  Z' dA dB   Z( dC dD   Z) e e( e)  Z* dE dF   Z+ dG dH   Z, e e+ e,  Z- dI dJ   Z. dK dL   Z/ e e. e/  Z0 dM dN   Z1 dO dP   Z2 e e1 e2  Z3 dQ dR   Z4 dS dT   Z5 e e4 e5  Z6 dU dV   Z7 dW dX   Z8 e e7 e8  Z9 dY dZ   Z: d[ d\   Z; e e: e;  Z< d] d^   Z= d_ d`   Z> e e= e>  Z? da db   Z@ dc dd   ZA e e@ eA  ZB de df   ZC dg dh   ZD e eC eD  ZE di dj   ZF dk dl   ZG e eF eG  ZH dm dn   ZI do dp   ZJ e eI eJ  ZK dq dr   ZL ds dt   ZM e eL eM  ZN du dv   ZO dw dx   ZP e eO eP  ZQ dy dz   ZR d{ d|   ZS e eR eS  ZT d} d~   ZU d d   ZV e eU eV  ZW d d   ZX d d   ZY e eX eY  ZZ d d   Z[ d d   Z\ e e[ e\  Z] d d   Z^ d d   Z_ e e^ e_  Z` d d   Za d d   Zb e ea eb  Zc d d   Zd d d   Ze e ed ee  Zf d d   Zg d d   Zh e eg eh  Zi d d   Zj d d   Zk d d   Zl d d   Zm d d   Zn d d   Zo d d   Zp d d   Zq d d d d  Zr d d   Zs d d   Zt d d   Zu d d   Zv d d   Zw d d   Zx d d   Zy d d   Zz 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 S)PrettyTableNc             K   s  | j  d d  |  _ g  |  _ i  |  _ i  |  _ i  |  _ g  |  _ | rT | |  _ n	 g  |  _ d j	   |  _
 |  j
 j d j	    |  j
 j d j	    x> |  j
 D]3 } | | k r |  j | | |  q d | | <q W| d p d |  _ | d	 p d |  _ | d
 pd |  _ | d d' k r2| d |  _ n	 d |  _ | d pHd |  _ | d d( k rn| d |  _ n	 d |  _ | d pt |  _ | d pt |  _ | d pd |  _ | d d) k r| d |  _ n	 d |  _ | d pd d   |  _ | d pi  |  _ | d pi  |  _ | d p%d |  _ | d p8d |  _ | d pKd |  _ | d pg|  j d  |  _  | d p|  j d   |  _! | d! p|  j d"  |  _" | d# d* k r| d# |  _# n	 d |  _# | d$ pd |  _$ | d% pd |  _% | d& pi  |  _& 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encodingzUTF-8zZstart 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headerTFheader_styleborderhrulesvrulessortbyreversesortsort_keyc             S   s   |  S)Nr   )xr   r   r   <lambda>   s    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)TF)TF)TF)TF)'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_formatZ_xhtml_attributes)selfr=   kwargsoptionr   r   r   __init__T   s^    										zPrettyTable.__init__c             C   sC   t  | t  s t |  } t  | t  s? t | |  j d  } | S)Nstrict)
isinstance
basestringstrunicoder   )r[   valuer   r   r   rT      s
    zPrettyTable._unicodec             C   s   | t  |  } | d k r( | | d S| d k r@ | d | S| d r t  |  d rz | d d | | d d d S| d d d | | d d Sn | d d | | d d Sd  S)Nl rr   r   )r   )r[   r   r   alignZexcessr   r   r   _justify   s    
 #zPrettyTable._justifyc             C   sl   | d k r t  |  j  S| d k r\ |  j r; t  |  j  S|  j rU t  |  j d  Sd Sn t |   d  S)NrowcountZcolcountr   )r   r<   r8   AttributeError)r[   namer   r   r   __getattr__   s    		zPrettyTable.__getattr__c             C   s   t    } |  j | _ x2 |  j D]' } t | d | t |  d |   q Wt | d t |  d   t | t  r xa |  j | D] } | j |  q Wn< t | t	  r | j |  j |  n t
 d t |    | S)N_r9   z0Index %s is invalid, must be an integer or slice)r   r=   r?   setattrgetattrr`   slicer<   add_rowint	Exceptionrb   )r[   indexnewattrrowr   r   r   __getitem__   s    	%zPrettyTable.__getitem__c             C   s
   |  j    S)N)__unicode__)r[   r   r   r   __str__   s    zPrettyTable.__str__c             C   s   |  j    j |  j  S)N)rz   encoder   )r[   r   r   r   r{      s    c             C   s
   |  j    S)N)
get_string)r[   r   r   r   rz      s    zPrettyTable.__unicode__c             C   s  | d k r |  j  |  n| d k r; |  j | |  nb| d	 k rZ |  j | |  nC| d
 k ry |  j | |  n$| d k r |  j | |  n| d k r |  j | |  n | d k r |  j | |  n | d k r |  j | |  n | d k r|  j |  n | d k r0|  j	 | |  nm | d k rO|  j
 | |  nN | d k rn|  j | |  n/ | d k r|  j | |  n t d |   d  S)Nr=   r   r   	max_widthr*   r+   r,   r4   r#   r%   r!   r"   r   r   r    r$   r5   r3   r   r(   r)   r-   r/   r1   r6   zUnrecognised option: %s!)zstartzendz	max_widthzpadding_widthzleft_padding_widthzright_padding_widthzformat)zheaderzborderzreversesortzxhtmlzprint_empty)zvertical_charzhorizontal_charzjunction_char)_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_attributesrt   )r[   r]   valr   r   r   rA      s6    zPrettyTable._validate_optionc             C   s%  |  j  rh y% t |  t |  j   k s- t  Wn7 t k
 rg t d t |  t |  j   f   Yn X|  j r y) t |  t |  j d  k s t  Wn; t k
 r t d t |  t |  j d  f   Yn Xy( t |  t t |   k s t  Wn t k
 r t d   Yn Xd  S)NzJField name list has incorrect number of values, (actual) %d!=%d (expected)r   zField names must be unique!)r8   r   AssertionErrorrt   r<   set)r[   r   r   r   r   r     s    	%*	).(z!PrettyTable._validate_field_namesc             C   s;   y | d k s t   Wn t  k
 r6 t d   Yn Xd  S)Ncaptitleupperlowerz;Invalid header style, use cap, title, upper, lower or None!)r   ztitlezupperzlowerN)r   rt   )r[   r   r   r   r   r   0  s    z"PrettyTable._validate_header_stylec             C   s?   y | d k s t   Wn" t  k
 r: t d |   Yn Xd  S)Nre   crg   z'Alignment %s is invalid, use l, c or r!)re   r   rg   )r   rt   )r[   r   r   r   r   _validate_align6  s    zPrettyTable._validate_alignc             C   s?   y | d k s t   Wn" t  k
 r: t d |   Yn Xd  S)Ntmbz-Alignment %s is invalid, use t, m, b or None!)r   r   r   N)r   rt   )r[   r   r   r   r   _validate_valign<  s    zPrettyTable._validate_valignc             C   sT   y t  |  d k s t  Wn1 t k
 rO t d | |  j |  f   Yn Xd  S)Nr   zInvalid value for %s: %s!)rs   r   rt   rT   )r[   rl   r   r   r   r   r   B  s    z%PrettyTable._validate_nonnegative_intc             C   s?   y | d k s t   Wn" t  k
 r: t d |   Yn Xd  S)NTFz-Invalid value for %s!  Must be True or False.)TF)r   rt   )r[   rl   r   r   r   r   r   H  s    z#PrettyTable._validate_true_or_falsec             C   sm   | d k r d  Sy4 t  |  t t f k s1 t  | j   sC t  Wn" t k
 rh t d |   Yn Xd  S)N z8Invalid value for %s!  Must be an integer format string.)typerb   rc   r   isdigitrt   )r[   rl   r   r   r   r   r   N  s    z PrettyTable._validate_int_formatc             C   s   | d k r d  Sy t  |  t t f k s1 t  d | k sC t  | j d  } t |  d k sj t  | d d k s | d j   s t  | d d k s | d j   s t  Wn" t k
 r t d |   Yn Xd  S)Nr   .r   r   r   z5Invalid value for %s!  Must be a float format string.)r   rb   rc   r   r   r   r   rt   )r[   rl   r   bitsr   r   r   r   W  s    &*z"PrettyTable._validate_float_formatc             C   sB   y t  | d  s t  Wn" t k
 r= t d |   Yn Xd  S)N__call__z*Invalid value for %s!  Must be a function.)hasattrr   rt   )r[   rl   r   r   r   r   r   d  s    zPrettyTable._validate_functionc             C   sK   y" | t  t t t f k s! t  Wn" t k
 rF t d |   Yn Xd  S)Nz:Invalid value for %s!  Must be ALL, FRAME, HEADER or NONE.)rJ   rH   HEADERNONEr   rt   )r[   rl   r   r   r   r   r   j  s    "zPrettyTable._validate_hrulesc             C   sH   y | t  t t f k s t  Wn" t k
 rC t d |   Yn Xd  S)Nz3Invalid value for %s!  Must be ALL, FRAME, or NONE.)rJ   rH   r   r   rt   )r[   rl   r   r   r   r   r   p  s    zPrettyTable._validate_vrulesc             C   sN   y% | |  j  k s$ | d  k s$ t  Wn" t k
 rI t d |   Yn Xd  S)NzInvalid field name: %s!)r8   r   rt   )r[   rl   r   r   r   r   r   v  s    %z PrettyTable._validate_field_namec             C   sJ   y% x | D] } |  j  | |  q
 WWn t k
 rE t d   Yn Xd  S)Nz)fields must be a sequence of field names!)r   r   rt   )r[   rl   r   r&   r   r   r   r   |  s
    z%PrettyTable._validate_all_field_namesc             C   sE   y t  |  d k s t  Wn" t k
 r@ t d |   Yn Xd  S)Nr   z4Invalid value for %s!  Must be a string of length 1.)r   r   rt   )r[   rl   r   r   r   r   r     s    z!PrettyTable._validate_single_charc             C   s>   y t  | t  s t  Wn t k
 r9 t d   Yn Xd  S)Nz4attributes must be a dictionary of name/value pairs!)r`   dictr   rt   )r[   rl   r   r   r   r   r     s    z PrettyTable._validate_attributesc             C   s   |  j  S)N)r8   )r[   r   r   r   _get_field_names  s    zPrettyTable._get_field_namesc                s    f d d   | D }   j  d |    j rE   j d  d   } |   _   j r | r x1 t | |  D]  \ } }   j |   j | <qm WxQ | D]% } |   j k r   j j |  q Wn! x   j D] } d   j | <q W  j r[| r[x1 t | |  D]  \ } }   j |   j | <qWxQ | D]% } |   j k r/  j j |  q/Wn! x   j D] } d   j | <qeWd  S)Nc                s   g  |  ] }   j  |   q Sr   )rT   )r   r&   )r[   r   r   r     s   	 z0PrettyTable._set_field_names.<locals>.<listcomp>r=   r   r   )rA   r8   r9   zippopr:   )r[   r   Z	old_namesZold_namenew_namefieldr   )r[   r   _set_field_names  s*    		zPrettyTable._set_field_namesc             C   s   |  j  S)N)r9   )r[   r   r   r   
_get_align  s    zPrettyTable._get_alignc             C   s2   |  j  |  x |  j D] } | |  j | <q Wd  S)N)r   r8   r9   )r[   r   r   r   r   r   
_set_align  s    zPrettyTable._set_alignc             C   s   |  j  S)N)r:   )r[   r   r   r   _get_valign  s    zPrettyTable._get_valignc             C   s2   |  j  |  x |  j D] } | |  j | <q Wd  S)N)r   r8   r:   )r[   r   r   r   r   r   _set_valign  s    zPrettyTable._set_valignc             C   s   |  j  S)N)r;   )r[   r   r   r   _get_max_width  s    zPrettyTable._get_max_widthc             C   s5   |  j  d |  x |  j D] } | |  j | <q Wd  S)Nr~   )rA   r8   r;   )r[   r   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)rD   )r[   r   r   r   _get_fields  s    zPrettyTable._get_fieldsc             C   s   |  j  d |  | |  _ d  S)Nr   )rA   rD   )r[   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)rB   )r[   r   r   r   
_get_start  s    zPrettyTable._get_startc             C   s   |  j  d |  | |  _ d  S)Nr   )rA   rB   )r[   r   r   r   r   
_set_start  s    zPrettyTable._set_startc             C   s   |  j  S)zEnd index of the range of rows to print

        Arguments:

        end - index of last data row to include in output PLUS ONE (list slice style))rC   )r[   r   r   r   _get_end  s    zPrettyTable._get_endc             C   s   |  j  d |  | |  _ d  S)Nr   )rA   rC   )r[   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)rL   )r[   r   r   r   _get_sortby  s    zPrettyTable._get_sortbyc             C   s   |  j  d |  | |  _ d  S)Nr#   )rA   rL   )r[   r   r   r   r   _set_sortby  s    zPrettyTable._set_sortbyc             C   s   |  j  S)zControls direction of sorting (ascending vs descending)

        Arguments:

        reveresort - set to True to sort by descending order, or False to sort by ascending order)rM   )r[   r   r   r   _get_reversesort  s    zPrettyTable._get_reversesortc             C   s   |  j  d |  | |  _ d  S)Nr$   )rA   rM   )r[   r   r   r   r   _set_reversesort  s    zPrettyTable._set_reversesortc             C   s   |  j  S)zSorting key function, applied to data points before sorting

        Arguments:

        sort_key - a function which takes one argument and returns something to be sorted)rN   )r[   r   r   r   _get_sort_key	  s    zPrettyTable._get_sort_keyc             C   s   |  j  d |  | |  _ d  S)Nr%   )rA   rN   )r[   r   r   r   r   _set_sort_key  s    zPrettyTable._set_sort_keyc             C   s   |  j  S)zControls printing of table header with field names

        Arguments:

        header - print a header showing field names (True or False))rE   )r[   r   r   r   _get_header  s    zPrettyTable._get_headerc             C   s   |  j  d |  | |  _ d  S)Nr   )rA   rE   )r[   r   r   r   r   _set_header  s    zPrettyTable._set_headerc             C   s   |  j  S)zControls stylisation applied to field names in header

        Arguments:

        header_style - stylisation to apply to field names in header ("cap", "title", "upper", "lower" or None))rF   )r[   r   r   r   _get_header_style!  s    zPrettyTable._get_header_stylec             C   s   |  j  |  | |  _ d  S)N)r   rF   )r[   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))rG   )r[   r   r   r   _get_border-  s    zPrettyTable._get_borderc             C   s   |  j  d |  | |  _ d  S)Nr    )rA   rG   )r[   r   r   r   r   _set_border4  s    zPrettyTable._set_borderc             C   s   |  j  S)zControls printing of horizontal rules after rows

        Arguments:

        hrules - horizontal rules style.  Allowed values: FRAME, ALL, HEADER, NONE)rI   )r[   r   r   r   _get_hrules9  s    zPrettyTable._get_hrulesc             C   s   |  j  d |  | |  _ d  S)Nr!   )rA   rI   )r[   r   r   r   r   _set_hrules@  s    zPrettyTable._set_hrulesc             C   s   |  j  S)zControls printing of vertical rules between columns

        Arguments:

        vrules - vertical rules style.  Allowed values: FRAME, ALL, NONE)rK   )r[   r   r   r   _get_vrulesE  s    zPrettyTable._get_vrulesc             C   s   |  j  d |  | |  _ d  S)Nr"   )rA   rK   )r[   r   r   r   r   _set_vrulesL  s    zPrettyTable._set_vrulesc             C   s   |  j  S)zbControls formatting of integer data
        Arguments:

        int_format - integer format string)rO   )r[   r   r   r   _get_int_formatQ  s    zPrettyTable._get_int_formatc             C   s%   x |  j  D] } | |  j | <q
 Wd  S)N)r8   rO   )r[   r   r   r   r   r   _set_int_formatW  s    zPrettyTable._set_int_formatc             C   s   |  j  S)zrControls formatting of floating point data
        Arguments:

        float_format - floating point format string)rP   )r[   r   r   r   _get_float_format]  s    zPrettyTable._get_float_formatc             C   s%   x |  j  D] } | |  j | <q
 Wd  S)N)r8   rP   )r[   r   r   r   r   r   _set_float_formatc  s    zPrettyTable._set_float_formatc             C   s   |  j  S)zThe number of empty spaces between a column's edge and its content

        Arguments:

        padding_width - number of spaces, must be a positive integer)rQ   )r[   r   r   r   _get_padding_widthi  s    zPrettyTable._get_padding_widthc             C   s   |  j  d |  | |  _ d  S)Nr*   )rA   rQ   )r[   r   r   r   r   _set_padding_widthp  s    zPrettyTable._set_padding_widthc             C   s   |  j  S)zThe number of empty spaces between a column's left edge and its content

        Arguments:

        left_padding - number of spaces, must be a positive integer)rR   )r[   r   r   r   _get_left_padding_widthu  s    z#PrettyTable._get_left_padding_widthc             C   s   |  j  d |  | |  _ d  S)Nr+   )rA   rR   )r[   r   r   r   r   _set_left_padding_width|  s    z#PrettyTable._set_left_padding_widthc             C   s   |  j  S)zThe number of empty spaces between a column's right edge and its content

        Arguments:

        right_padding - number of spaces, must be a positive integer)rS   )r[   r   r   r   _get_right_padding_width  s    z$PrettyTable._get_right_padding_widthc             C   s   |  j  d |  | |  _ d  S)Nr,   )rA   rS   )r[   r   r   r   r   _set_right_padding_width  s    z$PrettyTable._set_right_padding_widthc             C   s   |  j  S)zThe charcter used when printing table borders to draw vertical lines

        Arguments:

        vertical_char - single character string used to draw vertical lines)rU   )r[   r   r   r   _get_vertical_char  s    zPrettyTable._get_vertical_charc             C   s,   |  j  |  } |  j d |  | |  _ d  S)Nr-   )rT   rA   rU   )r[   r   r   r   r   _set_vertical_char  s    zPrettyTable._set_vertical_charc             C   s   |  j  S)zThe charcter used when printing table borders to draw horizontal lines

        Arguments:

        horizontal_char - single character string used to draw horizontal lines)rV   )r[   r   r   r   _get_horizontal_char  s    z PrettyTable._get_horizontal_charc             C   s,   |  j  |  } |  j d |  | |  _ d  S)Nr/   )rT   rA   rV   )r[   r   r   r   r   _set_horizontal_char  s    z PrettyTable._set_horizontal_charc             C   s   |  j  S)zThe charcter used when printing table borders to draw line junctions

        Arguments:

        junction_char - single character string used to draw line junctions)rW   )r[   r   r   r   _get_junction_char  s    zPrettyTable._get_junction_charc             C   s,   |  j  |  } |  j d |  | |  _ d  S)Nr-   )rT   rA   rW   )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)rY   )r[   r   r   r   _get_format  s    zPrettyTable._get_formatc             C   s   |  j  d |  | |  _ d  S)Nr4   )rA   rY   )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)rX   )r[   r   r   r   _get_print_empty  s    zPrettyTable._get_print_emptyc             C   s   |  j  d |  | |  _ d  S)Nr3   )rA   rX   )r[   r   r   r   r   _set_print_empty  s    zPrettyTable._set_print_emptyc             C   s   |  j  S)zA dictionary of HTML attribute name/value pairs to be included in the <table> tag when printing HTML

        Arguments:

        attributes - dictionary of attributes)rZ   )r[   r   r   r   _get_attributes  s    zPrettyTable._get_attributesc             C   s   |  j  d |  | |  _ d  S)Nr6   )rA   rZ   )r[   r   r   r   r   _set_attributes  s    zPrettyTable._set_attributesc             C   sf   i  } xY |  j  D]N } | | k rG |  j | | |  | | | | <q t |  d |  | | <q W| S)Nrn   )r?   rA   rp   )r[   r\   optionsr]   r   r   r   _get_options  s    zPrettyTable._get_optionsc             C   st   | t  k r |  j   nW | t k r2 |  j   n> | t k rK |  j   n% | t k rd |  j   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_stylert   )r[   Z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   r.   r0   r2   )r   r    rH   rI   rJ   rK   r*   r+   r,   r-   r/   r1   )r[   r   r   r   r     s    									zPrettyTable._set_default_stylec             C   sC   d |  _  d |  _ t |  _ d |  _ d |  _ d |  _ d |  _ d  S)NTr   r.   )r   r    r   rI   r*   r+   r,   r-   )r[   r   r   r   r     s    						zPrettyTable._set_msword_stylec             C   s1   d |  _  d |  _ d |  _ d |  _ d |  _ d  S)NTFr   r      )r   r    r*   r+   r,   )r[   r   r   r   r     s
    				zPrettyTable._set_columns_stylec             C   s   t  j d  |  _ t  j d  |  _ t  j t t t t f  |  _ t  j t t t f  |  _	 t  j
 d d  |  _ t  j
 d d  |  _ t  j d  |  _ t  j d  |  _ t  j d  |  _ d  S)NTFr      z ~!@#$%^&*()_+|-=\{}[];':",./;<>?)TF)TF)randomZchoicer   r    rJ   rH   r   r   rI   rK   Zrandintr+   r,   r-   r/   r1   )r[   r   r   r   r     s    zPrettyTable._set_random_stylec             C   s   |  j  rI t |  t |  j   k rI t d t |  t |  j   f   |  j  sw d d   t d t |   D |  _ |  j 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   4  s   	 z'PrettyTable.add_row.<locals>.<listcomp>r   N)r8   r   rt   ranger=   r<   appendlist)r[   rx   r   r   r   rr   (  s
    	$%	%zPrettyTable.add_rowc             C   sF   | t  |  j  d k r8 t d | t  |  j  f   |  j | =d S)zDelete 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   r<   rt   )r[   Z	row_indexr   r   r   del_row7  s    zPrettyTable.del_rowr   r   c             C   s   t  |  j  d t  |  f k r |  j |  |  j |  |  j j |  | |  j | <| |  j | <x t d t  |   D]G } t  |  j  | d k  r |  j j g   |  j | j | |  q{ Wn% 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   r<   r   r   r8   r   r9   r:   r   rt   )r[   	fieldnamecolumnrh   valignir   r   r   
add_columnC  s    !zPrettyTable.add_columnc             C   s   g  |  _  d S)z?Delete all rows from the table but keep the current field namesN)r<   )r[   r   r   r   
clear_rows\  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)r<   r8   r>   )r[   r   r   r   clearb  s    		zPrettyTable.clearc             C   s   t  j |   S)N)copydeepcopy)r[   r   r   r   r   n  s    zPrettyTable.copyc             C   s   t  | t  r? | |  j k r? |  j d |  j | |  } n< t  | t  r{ | |  j k r{ |  j d |  j | |  } |  j |  S)Nz%%%sdz%%%sf)r`   rs   rO   rT   floatrP   )r[   r   rd   r   r   r   _format_valueu  s
    !zPrettyTable._format_valuec             C   s   | d r# d d   |  j  D } n t |  j  d g } x | D] } x t |  D]} \ } } |  j | } | |  j k r t | | t t |  d |  j |   | | <qS t | | t |  d  | | <qS Wq@ W| |  _ d  S)Nr   c             S   s    g  |  ] } t  |  d   q S)r   )r   )r   r   r   r   r   r   ~  s   	 z/PrettyTable._compute_widths.<locals>.<listcomp>r   )	r8   r   r=   	enumerater~   r   minr   r>   )r[   rowsr   Zwidthsrx   ru   rd   r   r   r   r   _compute_widths|  s    
4)zPrettyTable._compute_widthsc             C   sX   | d d  k	 r | d } n
 | d } | d d  k	 rD | d } n
 | d } | | f S)Nr+   r*   r,   r   )r[   r   lpadrpadr   r   r   _get_padding_widths  s    

zPrettyTable._get_padding_widthsc                s   t  j |  j | d | d   } | d r |  j j | d      f d d   | D } | j d | d d | d	  d
 d   | D } | S)zReturn 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 Sr   r   )r   rx   )	sortindexr   r   r     s   	 z)PrettyTable._get_rows.<locals>.<listcomp>reverser$   keyr%   c             S   s    g  |  ] } | d  d   q S)r   Nr   )r   rx   r   r   r   r     s   	 )r   r   r<   r8   ru   sort)r[   r   r   r   )r   r   	_get_rows  s    $
zPrettyTable._get_rowsc                s#     f d d   t    j |  D S)Nc                s(   g  |  ] \ } }   j  | |   q Sr   )r   )r   r   rd   )r[   r   r   r     s   	 z+PrettyTable._format_row.<locals>.<listcomp>)r   r8   )r[   rx   r   r   )r[   r   _format_row  s    zPrettyTable._format_rowc                s      f d d   | D S)Nc                s"   g  |  ] }  j  |     q Sr   )r  )r   rx   )r   r[   r   r   r     s   	 z,PrettyTable._format_rows.<locals>.<listcomp>r   )r[   r   r   r   )r   r[   r   _format_rows  s    zPrettyTable._format_rowsc             K   s>  |  j  |  } g  } |  j d k r> | d s: | d r> d S|  j |  } |  j | |  } |  j | |  |  j |  |  _ | d r | j |  j |   n0 | d r | d t	 t
 f k r | j |  j  x' | D] } | j |  j | |   q W| d r(| d t
 k r(| j |  j  |  j d  j |  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   r3   r    r   r   r!   r   )r   rj   r  r  r   _stringify_hrule_hruler   _stringify_headerrJ   rH   _stringify_rowrT   join)r[   r\   r   r   r   formatted_rowsrx   r   r   r   r}     s"    %
 zPrettyTable.get_stringc             C   sJ  | d s d S|  j  |  \ } } | d t t f k rI | d g } n | d g } |  j s} | j | d  d j |  Sx t |  j |  j  D]{ \ } } | d r | | d k r q | j | | | | d  | d t k r | j | d  q | j | d  q W| d t k r=| j   | j | d  d j |  S)Nr    r   r"   r1   r/   r   )	r   rJ   rH   r8   r   r  r   r>   r   )r[   r   r   r   r   r   r   r   r   r   r    s(    
	"
zPrettyTable._stringify_hrulec             C   sw  g  } |  j  |  \ } } | d r | d t t f k rX | j |  j  | j d  | d t t f k r | j | d  n | j d  |  j s | d t t f k r | j | d  n | j d  x,t |  j |  j  D]\ } } | d r| | d k rq |  j d k r,| j	   } n` |  j d	 k rJ| j
   } nB |  j d
 k rh| j   } n$ |  j d k r| j   } n | } | j d | |  j | | |  j |  d |  | d r | d t k r| j | d  q | j d  q W| d r3| d t k r3| j   | j | d  | d rj| d t k rj| j d  | j |  j  d j |  S)Nr    r!   r   r"   r-   rf   r   r   r   r   r   r   )r   rJ   rH   r   r  r8   r   r>   rF   
capitalizer   r   r   ri   r9   r   r   r  )r[   r   r   r   r   r   r   r   r   r   r   r	    sJ    
	"3

zPrettyTable._stringify_headerc          	   C   s  x t  t d t |   |  j | |  j  D] \ } } } } | j d  } g  } x? | D]7 }	 t |	  | k r t j |	 |  }	 | j	 |	  qY W| } d j
 |  } | | | <q+ Wd }
 x0 | D]( } t |  d } | |
 k r | }
 q Wg  } |  j |  \ } } xl t d |
  D][ } | j	 g   | d r| d t t f k re| | j	 |  j  q| | j	 d  qWxt  |  j | |  j  D]l\ } } } |  j | } | j d  } |
 t |  } | rH| d k rd g t | d	  | d g | t | d	  } n1 | d
 k r7d g | | } n | d g | } d } x | D] } | d rx| | d k rxqU| | j	 d | |  j | | |  j |  d |  | d r| d t k r| | j	 |  j  n | | j	 d  | d 7} qUWqWxT t d |
  D]C } | d r| d t k r| | j   | | j	 | d  qW| d r| d t k r| |
 d j	 d  | |
 d j	 |  j  x. t d |
  D] } d j
 | |  | | <qWd j
 |  S)Nr   r   r   r    r"   rf   r   r   r   r   r   r-   r!   )r   r   r   r8   r>   r   r   textwrapZfillr   r  r   r   rJ   rH   r-   r:   rs   ri   r9   r   r  )r[   rx   r   ru   r   rd   r   r   Z	new_linesr   Z
row_heightr   hr   r   r   yr   ZdHeightre   r   r   r   r
  :  sj    =

(77
zPrettyTable._stringify_rowc             K   s>   |  j  |  } | d r+ |  j |  } n |  j |  } | 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 falser4   )r   _get_formatted_html_string_get_simple_html_string)r[   r\   r   stringr   r   r   get_html_string  s
    
zPrettyTable.get_html_stringc             C   s  g  } | d r d } n d } g  } | j  d  | d rp x1 | d D]% } | j  d | | d | f  qG W| j  d  | j  d j |   | d	 r| j  d
  xQ |  j D]F } | d r | | d k r q | j  d t |  j d |   q W| j  d  |  j |  } |  j | |  } x | D] }	 | j  d
  x` t |  j |	  D]L \ } }
 | d r| | d k rqY| j  d t |
  j d |   qYW| j  d  q3W| j  d  |  j d  j |  S)Nr5   z<br/>z<br>z<tabler6   z %s="%s">r   r   z    <tr>r   z        <th>%s</th>r   z	    </tr>z        <td>%s</td>z</table>)	r   r  r8   r   replacer  r  r   rT   )r[   r   r   	linebreakopen_tag	attr_namer   r   r  rx   datumr   r   r   r    s:    
	
#
''z#PrettyTable._get_simple_html_stringc             C   s  g  } |  j  |  \ } } | d r. d } n d } g  } | j d  | d r^| d t k r | d t k r | j d  n | d t k r | d t k r | j d	  n | d t k r | d t k r | j d
  n} | d t k r| j d  n] | d t k r!| j d  n= | d t k rA| j d  n | d t k r^| j d  | d rx1 | d D]% } | j d | | d | f  qsW| j d  | j d j |   | d r@| j d  xZ |  j D]O } | d r| | d k rq| j d | | t |  j d |  f  qW| j d  |  j |  }	 |  j	 |	 |  }
 g  } g  } xe |  j D]Z } | j d d d d d d i |  j
 |  | j d d  d! d" d# d$ i |  j |  qwWx |
 D] } | j d  x{ t |  j | | |  D]a \ } } } } | d r7| | d k r7q| j d% | | | | t |  j d |  f  qW| j d  qW| j d&  |  j d  j |  S)'Nr5   z<br/>z<br>z<tabler    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"r6   z %s="%s"r  r   r   z    <tr>r   zW        <th style="padding-left: %dem; padding-right: %dem; text-align: center">%s</th>r   z	    </tr>re   leftrg   rightr   centerr   topr   Zmiddler   Zbottomzg        <td style="padding-left: %dem; padding-right: %dem; text-align: %s; vertical-align: %s">%s</td>z</table>)r   r   rJ   rH   r  r8   r   r  r  r  r9   r:   r   rT   )r[   r   r   r   r   r  r  r  r   r   r  ZalignsZvalignsrx   r  rh   r   r   r   r   r    sd    
	
   
#
0*.+6z&PrettyTable._get_formatted_html_string)__name__
__module____qualname__r^   rT   ri   rm   ry   py3kr{   rz   rA   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   propertyr=   r   r   rh   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   r)   r   r   r*   r   r   r+   r   r   r,   r   r   r-   r   r   r/   r   r   r1   r   r   r4   r   r   r3   r   r   r6   r   r   r   r   r   r   rr   r   r   r   r   r   r   r   r   r  r  r  r}   r  r	  r
  r  r  r  r   r   r   r   r   R   s   ]	

=/L (r   c             C   s  d |  k o d k n r  d Sd |  k o7 d k n r@ d Sd |  k oW d k n r` d St  j t |    ry d	 Sd
 |  k o d k n s d |  k o d k n r d Sd |  k o d k n r d Sd |  k o d k n r d S|  d k rd S|  d k rd	 Sd S)N!   ~   r   i N  i  r   i   i  r   i@0  i0  i0  i0  i  i`  i 0  i>0  r         )r   r&  )r   r'  )unicodedataZ	combininguni_chr)charr   r   r   _char_block_width  s&    8r,  c             C   s(   t  t t t t t j d |      S)Nr   )sumitermapr,  ord_resub)r   r   r   r   r   /  s    r   c             K   s   t  j   j |  j d   } |  j d  t  j |  |  } t |   } | r[ | | _ nA t r d d   t	 |  D | _ n d d   | j	   D | _ x( | D]  } | j
 d d   | D  q W| S)Ni   r   c             S   s   g  |  ] } | j     q Sr   )strip)r   r&   r   r   r   r   B  s   	 zfrom_csv.<locals>.<listcomp>c             S   s   g  |  ] } | j     q Sr   )r2  )r   r&   r   r   r   r   D  s   	 c             S   s   g  |  ] } | j     q Sr   )r2  )r   r&   r   r   r   r   G  s   	 )csvZSnifferZsniffreadseekreaderr   r=   r"  nextrr   )fpr=   r\   Zdialectr6  tablerx   r   r   r   from_csv7  s    r:  c             K   sZ   |  j  rV t |   } d d   |  j  D | _ x! |  j   D] } | j |  q; W| Sd  S)Nc             S   s   g  |  ] } | d   q S)r   r   )r   colr   r   r   r   O  s   	 z"from_db_cursor.<locals>.<listcomp>)Zdescriptionr   r=   Zfetchallrr   )Zcursorr\   r9  rx   r   r   r   from_db_cursorK  s    	r<  c               @   sX   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   sY   t  j |   | |  _ g  |  _ g  |  _ g  |  _ d |  _ d  |  _ d |  _ d |  _	 d  S)Nr   r   F)
r   r^   r\   tableslast_rowr   max_row_widthactivelast_contentis_last_row_header)r[   r\   r   r   r   r^   V  s    							zTableHandler.__init__c             C   s"   | |  _  | d k r d |  _ d  S)NthT)rA  rC  )r[   tagZattrsr   r   r   handle_starttaga  s    	zTableHandler.handle_starttagc             C   s   | d k r+ |  j  j   } |  j j |  | d k r |  j j |  j |  j f  t |  j t |  j   |  _ g  |  _ d |  _ | d k r |  j	 |  j  } |  j
 j |  g  |  _ d |  _  d  |  _ d  S)NrD  tdZtrFr9  rf   )zthrG  )rB  r2  r?  r   r   rC  r   r@  r   generate_tabler>  rA  )r[   rE  Zstripped_contentr9  r   r   r   handle_endtagf  s    					zTableHandler.handle_endtagc             C   s   |  j  | 7_  d  S)N)rB  )r[   datar   r   r   handle_datax  s    zTableHandler.handle_datac             C   s   t  |  j   } x |  j D] } t | d  |  j k  rz |  j t | d  } x( t d |  D] } | d j d  q_ W| d d k r |  j | d  | d | _ q | j	 | d  q W| S)zE
        Generates from a list of rows a PrettyTable object.
        r   r   r0   T)
r   r\   r   r   r@  r   r   make_fields_uniquer=   rr   )r[   r   r9  rx   Zappendsr   r   r   r   rH  {  s    zTableHandler.generate_tablec             C   sj   xc t  d t |   D]L } xC t  | d t |   D]( } | | | | k r6 | | d 7<q6 Wq Wd S)zB
        iterates over the row and make each field unique
        r   r   'N)r   r   )r[   r   r   jr   r   r   rL    s     zTableHandler.make_fields_uniqueN)	r  r   r!  r^   rF  rI  rK  rH  rL  r   r   r   r   r=  T  s   r=  c             K   s    t  |   } | j |   | j S)z
    Generates a list of PrettyTables from a string of HTML code. Each <table> in
    the HTML becomes one PrettyTable object.
    )r=  Zfeedr>  )	html_coder\   parserr   r   r   	from_html  s    rQ  c             K   sT   t  |  |  } y t |  d k s* t  Wn t k
 rK t d   Yn X| 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   )rQ  r   r   rt   )rO  r\   r>  r   r   r   from_html_one  s    rR  c              C   s
  t  d d d d g  }  d |  _ d |  _ d |  j d <d |  _ d |  j d <|  j d	 d
 d d g  |  j d d d d g  |  j d d d d g  |  j d d d d g  |  j d d d d g  |  j d d d d  g  |  j d! d" d# d$ g  t |   d  S)%Nz	City nameZAreaZ
PopulationzAnnual RainfallTZ04dz6.1fre   ZAdelaidei  is g     Ă@ZBrisbanei  i:X g@ZDarwinp   iD gʚ@ZHobartiM  i" g     \@ZSydneyi
  i*B g33333@Z	Melbournei  i: g333337@ZPerthi
  iQ g33333+@)r   r#   r$   r(   r)   rh   rr   print)r&   r   r   r   main  s    			rU  __main__)2__version__r   r3  r   resysr  	itertoolsr)  version_infor"  rb   rc   ra   mapr.  r   Ziterzipchrr*  Zhtml.parserr   ZimapZizipZunichrZhtmlr   ZcgirH   rJ   r   r   r   r   r   r   compiler0  r   objectr   r,  r   r:  r<  r=  rQ  rR  rU  r  r   r   r   r   <module>    s`   		    !	B
