U
    祡c                  	   @   s  d dl mZmZmZ d dlmZmZmZmZm	Z	m
Z
mZmZmZ ddlmZmZ ddlmZmZ ddlmZ ddlmZmZ ddlmZ dd	lmZ dd
lmZ ddlm Z m!Z! ddl"m#Z# ddl$m%Z% ddl&m'Z'm(Z( ddl)m*Z*m+Z+ erddl,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2 eG dd dZ3eG dd dZ4G dd de	Z5G dd deZ6e7dkrd dl8m-Z- d dl9m:Z: d dl;m6Z6 ddl<m=Z= e=d~ e6dd d!d"Z>e>j?d#d$d%d&d' e>j?d(d)d* e>j?d+d!d,d- e>@d.d/d0 e>@d1d2d3 e>j@d4d5d6d7d&d8 e>@d9d:d; eAd<d=d>d?ZBe- Z,e: ZCeBd@ e,jDe>dAdB d&e>_EeBdC e,De> dDe>_FeBdE e,jDe>dAdB d<e>_FdFe>_EdGdHge>_GeBdI e,jDe>dAdB d<e>_FdFe>_EdGdHge>_Gde>_HeBdJ e,jDe>dAdB d<e>_FdFe>_EdGdHge>_Gd&e>_Id e>_HeBdK e,jDe>dAdB W 5 Q R X d<S )L    )	dataclassfieldreplace)	TYPE_CHECKINGDictIterableList
NamedTupleOptionalSequenceTupleUnion   )boxerrors)loop_first_last	loop_last)	pick_bool)ratio_distributeratio_reduce)VerticalAlignMethod)JupyterMixin)Measurement)PaddingPaddingDimensions)is_renderable)Segment)Style	StyleType)TextTextType)ConsoleConsoleOptionsJustifyMethodOverflowMethodRenderableTypeRenderResultc                   @   s  e Zd ZU dZdZded< dZded< dZeed< dZ	eed< dZ
eed< d	Zd
ed< dZded< dZded< dZee ed< dZee ed< dZee ed< dZee ed< dZeed< dZeed< eedZed ed< d dddZeed dd d!Zeedd"d#ZdS )$Columna
  Defines a column within a ~Table.

    Args:
        title (Union[str, Text], optional): The title of the table rendered at the top. Defaults to None.
        caption (Union[str, Text], optional): The table caption rendered below. Defaults to None.
        width (int, optional): The width in characters of the table, or ``None`` to automatically fit. Defaults to None.
        min_width (Optional[int], optional): The minimum width of the table, or ``None`` for no minimum. Defaults to None.
        box (box.Box, optional): One of the constants in box.py used to draw the edges (see :ref:`appendix_box`), or ``None`` for no box lines. Defaults to box.HEAVY_HEAD.
        safe_box (Optional[bool], optional): Disable box characters that don't display on windows legacy terminal with *raster* fonts. Defaults to True.
        padding (PaddingDimensions, optional): Padding for cells (top, right, bottom, left). Defaults to (0, 1).
        collapse_padding (bool, optional): Enable collapsing of padding around cells. Defaults to False.
        pad_edge (bool, optional): Enable padding of edge cells. Defaults to True.
        expand (bool, optional): Expand the table to fit the available space if ``True``, otherwise the table width will be auto-calculated. Defaults to False.
        show_header (bool, optional): Show a header row. Defaults to True.
        show_footer (bool, optional): Show a footer row. Defaults to False.
        show_edge (bool, optional): Draw a box around the outside of the table. Defaults to True.
        show_lines (bool, optional): Draw lines between every row. Defaults to False.
        leading (bool, optional): Number of blank lines between rows (precludes ``show_lines``). Defaults to 0.
        style (Union[str, Style], optional): Default style for the table. Defaults to "none".
        row_styles (List[Union, str], optional): Optional list of row styles, if more than one style is given then the styles will alternate. Defaults to None.
        header_style (Union[str, Style], optional): Style of the header. Defaults to "table.header".
        footer_style (Union[str, Style], optional): Style of the footer. Defaults to "table.footer".
        border_style (Union[str, Style], optional): Style of the border. Defaults to None.
        title_style (Union[str, Style], optional): Style of the title. Defaults to None.
        caption_style (Union[str, Style], optional): Style of the caption. Defaults to None.
        title_justify (str, optional): Justify method for title. Defaults to "center".
        caption_justify (str, optional): Justify method for caption. Defaults to "center".
        highlight (bool, optional): Highlight cell contents (if str). Defaults to False.
     r%   headerfooterheader_stylefooter_stylestyleleftr#   justifytopr   verticalellipsisr$   overflowNwidth	min_width	max_widthratioFno_wrapr   _index)default_factory_cellsreturnc                 C   s   t | g dS )zReturn a copy of this Column.r;   )r   self rA   ./tmp/pip-unpacked-wheel-qkhzhrww/rich/table.pycopyr   s    zColumn.copyc                 c   s   | j E dH  dS )z2Get all cells in the column, not including header.Nr>   r?   rA   rA   rB   cellsv   s    zColumn.cellsc                 C   s
   | j dk	S )z!Check if this column is flexible.N)r7   r?   rA   rA   rB   flexible{   s    zColumn.flexible) __name__
__module____qualname____doc__r)   __annotations__r*   r+   r   r,   r-   r/   r1   r3   r4   r
   intr5   r6   r7   r8   boolr9   r   listr;   r   rC   propertyr   rD   rE   rA   rA   rA   rB   r'   &   s*   
r'   c                   @   s.   e Zd ZU dZdZee ed< dZe	ed< dS )RowzInformation regarding a row.Nr-   Fend_section)
rF   rG   rH   rI   r-   r
   r   rJ   rP   rL   rA   rA   rA   rB   rO      s   
rO   c                   @   s*   e Zd ZU dZeed< ded< eed< dS )_CellzA single cell in a table.r-   r%   
renderabler1   N)rF   rG   rH   rI   r   rJ   r   rA   rA   rA   rB   rQ      s
   
rQ   c                   @   s  e Zd ZU dZee ed< ee ed< ddddej	ddddddddddd	dd
dddddddde
eef ee ee ee ee eej ee eeeeeeeeeeeee  ee ee ee ee ee ddeddddZeddddde
eef eeeed dddZeedddZejeddddZeedddZeedddZdeed d!d"Zdd#ed$d%d&Zeeeeeef dd'd(Z e jed d)d*d(Z dPdddd,d-d.dddddd/d0d0ee ee ee dd1d2ee ee ee ee edd3d4d5Z!ddd6ed0 ee edd7d8d9Z"ddd:d;Z#dd#d<d$d=d>Z$dd#ee d$d?d@Z%eee ee eee dAdBdCZ&deeee' dDdEdFZ(eedGdHdIZ)dd#eedJdKdLZ*dd#ee d<dMdNdOZ+dS )QTablea  A console renderable to draw a table.

    Args:
        *headers (Union[Column, str]): Column headers, either as a string, or :class:`~rich.table.Column` instance.
        title (Union[str, Text], optional): The title of the table rendered at the top. Defaults to None.
        caption (Union[str, Text], optional): The table caption rendered below. Defaults to None.
        width (int, optional): The width in characters of the table, or ``None`` to automatically fit. Defaults to None.
        min_width (Optional[int], optional): The minimum width of the table, or ``None`` for no minimum. Defaults to None.
        box (box.Box, optional): One of the constants in box.py used to draw the edges (see :ref:`appendix_box`), or ``None`` for no box lines. Defaults to box.HEAVY_HEAD.
        safe_box (Optional[bool], optional): Disable box characters that don't display on windows legacy terminal with *raster* fonts. Defaults to True.
        padding (PaddingDimensions, optional): Padding for cells (top, right, bottom, left). Defaults to (0, 1).
        collapse_padding (bool, optional): Enable collapsing of padding around cells. Defaults to False.
        pad_edge (bool, optional): Enable padding of edge cells. Defaults to True.
        expand (bool, optional): Expand the table to fit the available space if ``True``, otherwise the table width will be auto-calculated. Defaults to False.
        show_header (bool, optional): Show a header row. Defaults to True.
        show_footer (bool, optional): Show a footer row. Defaults to False.
        show_edge (bool, optional): Draw a box around the outside of the table. Defaults to True.
        show_lines (bool, optional): Draw lines between every row. Defaults to False.
        leading (bool, optional): Number of blank lines between rows (precludes ``show_lines``). Defaults to 0.
        style (Union[str, Style], optional): Default style for the table. Defaults to "none".
        row_styles (List[Union, str], optional): Optional list of row styles, if more than one style is given then the styles will alternate. Defaults to None.
        header_style (Union[str, Style], optional): Style of the header. Defaults to "table.header".
        footer_style (Union[str, Style], optional): Style of the footer. Defaults to "table.footer".
        border_style (Union[str, Style], optional): Style of the border. Defaults to None.
        title_style (Union[str, Style], optional): Style of the title. Defaults to None.
        caption_style (Union[str, Style], optional): Style of the caption. Defaults to None.
        title_justify (str, optional): Justify method for title. Defaults to "center".
        caption_justify (str, optional): Justify method for caption. Defaults to "center".
        highlight (bool, optional): Highlight cell contents (if str). Defaults to False.
    columnsrowsN)r   r   FTr   noneztable.headerztable.footercenter)titlecaptionr4   r5   r   safe_boxpaddingcollapse_paddingpad_edgeexpandshow_headershow_footer	show_edge
show_linesleadingr-   
row_stylesr+   r,   border_styletitle_stylecaption_styletitle_justifycaption_justify	highlightr#   )headersrX   rY   r4   r5   r   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   r-   rd   r+   r,   re   rf   rg   rh   ri   rj   r=   c                G   s   g | _ g | _|| _|| _|| _|| _|| _|| _t	|| _
|	| _|
| _|| _|| _|| _|| _|| _|| _|| _|pxd| _|pd| _|| _|| _|| _|| _|| _|| _t|pg | _| j j}|D ]0}t|t r| j!|d qt"| j |_#|| qd S )Nr(   )r)   )$rT   rU   rX   rY   r4   r5   r   rZ   r   unpack_paddingr]   _expandr_   r`   ra   rb   rc   r\   r-   r+   r,   re   rf   rg   rh   ri   rj   rM   rd   append
isinstancestr
add_columnlenr9   )r@   rX   rY   r4   r5   r   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   r-   rd   r+   r,   re   rf   rg   rh   ri   rj   rk   Zappend_columnr)   rA   rA   rB   __init__   sB    


zTable.__init__)r[   r\   r]   r^   )rk   r[   r\   r]   r^   r=   c                G   s   | |d||ddd||dS )a  Get a table with no lines, headers, or footer.

        Args:
            *headers (Union[Column, str]): Column headers, either as a string, or :class:`~rich.table.Column` instance.
            padding (PaddingDimensions, optional): Get padding around cells. Defaults to 0.
            collapse_padding (bool, optional): Enable collapsing of padding around cells. Defaults to True.
            pad_edge (bool, optional): Enable padding around edges of table. Defaults to False.
            expand (bool, optional): Expand the table to fit the available space if ``True``, otherwise the table width will be auto-calculated. Defaults to False.

        Returns:
            Table: A table instance.
        NF)r   r[   r\   r_   r`   ra   r]   r^   rA   )clsr[   r\   r]   r^   rk   rA   rA   rB   grid   s    z
Table.gridr<   c                 C   s   | j p| jdk	S )z-Setting a non-None self.width implies expand.N)rn   r4   r?   rA   rA   rB   r^     s    zTable.expand)r^   r=   c                 C   s
   || _ dS )zSet expand.N)rn   )r@   r^   rA   rA   rB   r^   !  s    c                 C   s4   d}| j r| jr|d7 }| j r0|t| jd 7 }|S )z'Get extra width to add to cell content.r      r   )r   ra   rs   rT   )r@   r4   rA   rA   rB   _extra_width&  s    zTable._extra_widthc                 C   s
   t | jS )zGet the current number of rows.)rs   rU   r?   rA   rA   rB   	row_count0  s    zTable.row_countr!   )consoleindexr=   c                 C   sR   t  }| jr,||| j|t| j  7 }| j| j}|dk	rN|||7 }|S )zGet the current row style.N)r   nullrd   	get_stylers   rU   r-   )r@   rz   r{   r-   	row_stylerA   rA   rB   get_row_style5  s    zTable.get_row_styler"   )rz   optionsr=   c                    s   j | jd k	r| jdk r(tddS | j}t| | | j  fdd| jD }tdd |D | }| jd krtdd |D | n| j}t||}|	| j
}|S )Nr   c                    s   g | ]}  |qS rA   )update_width.0column_measure_columnrz   r6   r   rA   rB   
<listcomp>P  s   z*Table.__rich_measure__.<locals>.<listcomp>c                 s   s   | ]}|j V  qd S N)Zminimumr   measurementrA   rA   rB   	<genexpr>U  s     z)Table.__rich_measure__.<locals>.<genexpr>c                 s   s   | ]}|j V  qd S r   maximumr   rA   rA   rB   r   X  s     )r6   r4   r   rx   sum_calculate_column_widthsr   r   rT   clampr5   )r@   rz   r   extra_widthZmeasurementsZminimum_widthZmaximum_widthr   rA   r   rB   __rich_measure__?  s2    

 
zTable.__rich_measure__c                 C   s   | j S )zGet cell padding.)rm   r?   rA   rA   rB   r[   `  s    zTable.padding)r[   r=   c                 C   s   t || _| S )zSet cell padding.)r   rl   rm   )r@   r[   rA   rA   rB   r[   e  s    r(   r.   r0   r2   )r+   r,   r-   r/   r1   r3   r4   r5   r6   r7   r8   r%   r   r$   )r)   r*   r+   r,   r-   r/   r1   r3   r4   r5   r6   r7   r8   r=   c                C   sF   t t| j|||pd|pd|p d||||	|
|||d}| j| dS )a  Add a column to the table.

        Args:
            header (RenderableType, optional): Text or renderable for the header.
                Defaults to "".
            footer (RenderableType, optional): Text or renderable for the footer.
                Defaults to "".
            header_style (Union[str, Style], optional): Style for the header, or None for default. Defaults to None.
            footer_style (Union[str, Style], optional): Style for the footer, or None for default. Defaults to None.
            style (Union[str, Style], optional): Style for the column cells, or None for default. Defaults to None.
            justify (JustifyMethod, optional): Alignment for cells. Defaults to "left".
            vertical (VerticalAlignMethod, optional): Vertical alignment, one of "top", "middle", or "bottom". Defaults to "top".
            overflow (OverflowMethod): Overflow method: "crop", "fold", "ellipsis". Defaults to "ellipsis".
            width (int, optional): Desired width of column in characters, or None to fit to contents. Defaults to None.
            min_width (Optional[int], optional): Minimum width of column, or ``None`` for no minimum. Defaults to None.
            max_width (Optional[int], optional): Maximum width of column, or ``None`` for no maximum. Defaults to None.
            ratio (int, optional): Flexible ratio for the column (requires ``Table.expand`` or ``Table.width``). Defaults to None.
            no_wrap (bool, optional): Set to ``True`` to disable wrapping of this column.
        r(   )r9   r)   r*   r+   r,   r-   r/   r1   r3   r4   r5   r6   r7   r8   N)r'   rs   rT   ro   )r@   r)   r*   r+   r,   r-   r/   r1   r3   r4   r5   r6   r7   r8   r   rA   rA   rB   rr   k  s"    %zTable.add_columnr-   rP   )renderablesr-   rP   r=   c                G   s   t ddddd}t|}| j}t|t|k rJ|dgt|t|  }t|D ]\}}|t|krt |d}	| jD ]}
||	td qv| j|	 n|| }	|dkr||	d qRt|r||	| qRt	
dt|j d	qR| jt||d
 dS )a  Add a row of renderables.

        Args:
            *renderables (None or renderable): Each cell in a row must be a renderable object (including str),
                or ``None`` for a blank cell.
            style (StyleType, optional): An optional style to apply to the entire row. Defaults to None.
            end_section (bool, optional): End a section and draw a line. Defaults to False.

        Raises:
            errors.NotRenderableError: If you add something that can't be rendered.
        r%   N)r   rR   r=   c                 S   s   | j | d S r   )r;   ro   )r   rR   rA   rA   rB   add_cell  s    zTable.add_row.<locals>.add_cell)r9   r(   zunable to render z1; a string or other renderable object is requiredr   )r'   rM   rT   rs   	enumeraterU   r   ro   r   r   ZNotRenderableErrortyperF   rO   )r@   r-   rP   r   r   Zcell_renderablesrT   r{   rR   r   _rA   rA   rB   add_row  s,    

zTable.add_rowc                 C   s   | j rd| j d _dS )z2Add a new section (draw a line after current row).TN)rU   rP   r?   rA   rA   rB   add_section  s    zTable.add_sectionr&   c                 #   s   | j stdV  d S |j}| jd k	r*| j}| j}|  ||| }t|| }|j|| j	d ddt
tddd fdd}| jr|| jt| jd	| jd
E d H  |  |E d H  | jr|| jt| jd| jd
E d H  d S )N
)r4   rj   heightrW   r#   r&   )textr-   r/   r=   c                    s4   t | tr j| |ddn| } j|j|ddS )NF)r-   rj   r/   )r   )rp   rq   Z
render_strrenderupdate)r   r-   r/   Zrender_textrz   render_optionsrA   rB   render_annotation  s     
z1Table.__rich_console__.<locals>.render_annotationztable.title)r-   r/   ztable.caption)rW   )rT   r   r6   r4   rx   r   r   r   r   rj   r    r   rX   r   Z
pick_firstrf   rh   _renderrY   rg   ri   )r@   rz   r   r6   r   widthstable_widthr   rA   r   rB   __rich_console__  sJ    

      zTable.__rich_console__c                    s  j }j} fdd|D }dd |D }jj}jrdd |D }t|rdd t||D }	fdd|D }
|t|	 }t|||
}t	|}t
|D ]"\}}|jr|	| t| ||< qt|}||krX|dd |D |}t|}||kr.|| }t|dgt| ||}t|} fd	dt||D }d
d |D }||k rjjsjdk	r|j| k rȈjdkr|ntj| |}t|| |}dd t||D }|S )zNCalculate the widths of each column, including padding, not including borders.c                    s   g | ]}  |qS rA   )r   r   rz   r   r@   rA   rB   r     s    z2Table._calculate_column_widths.<locals>.<listcomp>c                 S   s   g | ]}|j pd qS r   r   r   _rangerA   rA   rB   r     s     c                 S   s   g | ]}|j r|jpd qS r   )rE   r7   )r   colrA   rA   rB   r     s      c                 S   s    g | ]\}}|j rd n|jqS r   )rE   r   )r   r   r   rA   rA   rB   r     s   c                    s&   g | ]}|j r|jpd  |j qS r   )rE   r4   r9   r   )get_padding_widthrA   rB   r     s   c                 S   s   g | ]}|j d ko|j qS r   )r4   r8   r   rA   rA   rB   r   *  s     r   c                    s$   g | ]\}}  ||qS rA   )r   r   )r   r4   r   r   rA   rB   r   4  s   c                 S   s   g | ]}|j pd qS r   r   r   rA   rA   rB   r   8  s     Nc                 S   s   g | ]\}}|| qS rA   rA   )r   _widthpadrA   rA   rB   r   C  s     )r6   rT   _get_padding_widthrx   r^   anyzipr   r   iterr   rE   next_collapse_widthsr   rs   r5   min)r@   rz   r   r6   rT   Zwidth_rangesr   r   ratiosZfixed_widthsZflex_minimumZflexible_widthZflex_widthsZiter_flex_widthsr{   r   r   excess_widthZ
_max_widthZ
pad_widthsrA   )rz   r   r   r@   rB   r     sf    


zTable._calculate_column_widths)r   wrapabler6   r=   c           
         s   t |}|| }t|r|r|dkrtdd t||D  t fddt||D } | } fddt||D }t|r|sqt||gt| }	t|||	|}t |}|| }q|S )aM  Reduce widths so that the total is under max_width.

        Args:
            widths (List[int]): List of widths.
            wrapable (List[bool]): List of booleans that indicate if a column may shrink.
            max_width (int): Maximum width to reduce to.

        Returns:
            List[int]: A new list of widths.
        r   c                 s   s   | ]\}}|r|V  qd S r   rA   r   r4   Z
allow_wraprA   rA   rB   r   Y  s     z)Table._collapse_widths.<locals>.<genexpr>c                 3   s&   | ]\}}|r| kr|nd V  qdS )r   NrA   r   Z
max_columnrA   rB   r   \  s   c                    s$   g | ]\}}| kr|rd ndqS )r   r   rA   r   r   rA   rB   r   a  s   z*Table._collapse_widths.<locals>.<listcomp>)r   r   maxr   r   rs   r   )
ru   r   r   r6   Ztotal_widthr   Zsecond_max_columnZcolumn_differencer   Z
max_reducerA   r   rB   r   G  s*    

zTable._collapse_widths)rz   column_indexr   r=   c                 #   st  | j | j| jt}|dk|t| jd ki  tttttttf d fdd}g }|j	}|j
}| jr|| jpd||j }	||	|jf ||jpd}
|jD ]}||
|f q| jr|| jpd||j }|||jf |rBt}t|D ]:\}}\}}t||||||t|ddp6|jV  qn.|D ](\}}t||t|ddpf|jV  qFdS )	z3Get all the cells with padding and optional header.r   r   )	first_rowlast_rowr=   c                    s     | |f}|r|S \}}}}rJs8td|| }|sJtd|| }snrVd}r^d}| rfd}|rnd}||||f}| | |f< |S )Nr   )getr   )r   r   cachedr0   rightbottomr.   rm   Z_padding_cacher\   Zfirst_columnZlast_columnr]   r[   rA   rB   get_padding}  s*    z%Table._get_cells.<locals>.get_paddingr(   r1   N)r\   r]   r[   r   rs   rT   rL   r   rK   ro   r}   r_   r+   r)   r-   rD   r`   r,   r*   r   r   rQ   getattrr1   )r@   rz   r   r   Zany_paddingr   Z	raw_cells_appendr}   r+   Z
cell_stylecellr,   Z_Paddingfirstlastr-   rR   rA   r   rB   
_get_cellsn  sL    ,
zTable._get_cells)r   r=   c                 C   s2   | j \}}}}| jr*|dkr*td|| }|| S )zGet extra width from padding.r   )r[   r\   r   )r@   r   r   Z	pad_rightZpad_leftrA   rA   rB   r     s
    zTable._get_padding_width)rz   r   r   r=   c                 C   s   |j }|dk rtddS | |j}|jdk	rJt|j| |j| |S g }g }|j}|j}	tj}
| ||j|D ]&}|
|||j	\}}|| |	| qtt|rt
|nd|rt
|n||}||jdkrdn|j| |j dkrdn|j | }|S )z0Get the minimum and maximum width of the column.r   r   N)r6   r   r   r9   r4   Zwith_maximumro   r   r   rR   r   r   r5   )r@   rz   r   r   r6   Zpadding_widthZ
min_widthsZ
max_widthsZ
append_minZ
append_maxZget_render_widthr   Z_minZ_maxr   rA   rA   rB   r     s>    

 
zTable._measure_column)rz   r   r   r=   c           %   	   #   s   	jpd}| 	jpd }	fddt	jD }tt| }	jrj	jj|t		j
j
dnd }|r	js| n|}t }		j}
	j}	j}	j}	j}	j}t |r> |j| |j| |j|f |j| |j| |j|f |j| |j| |j|fg}|rB |||V  |	V  ng }	j}j tt|D ]\}\}}}|or||o||ss	j||  nd }dg }srt ! n||r|d n|t|||
D ]Z\}}}|j"||j#|j$|j%d d}j&|j'||j d}t(t)||*| qt(dd |D t+t+t  d	t,t t+t+t  d
 fdd fddt||||
D |d d < |r|r|r܈ |j-|d|d|V  |	V  ||rdn|rdnd \}}}|j./ r|n |j.j0|j } t1D ]R}!|r:|V  t2|D ]$\}"}#|#|! E d H  |"sB| V  qB|rt|V  |	V  q*n0t1D ]&}!|D ]}#|#|! E d H  q|	V  q|r|r|r |j-|d|d|V  |	V  |o|j3}$|rZ|s|s|$rZ|sZ|r"|t)|d ksZ|r.sZ|rR |j-|d|d| |V  n |j-|d|d|V  |	V  qZ|r|r |4||V  |	V  d S )Nr(   c                 3   s    | ]\}}  ||V  qd S r   )r   )r   r   r   )rz   r@   rA   rB   r     s   z Table._render.<locals>.<genexpr>)safer   )r4   r/   r8   r3   r   r-   c                 s   s   | ]}t |V  qd S r   )rs   )r   r   rA   rA   rB   r   @  s     r   )r   r1   r4   r-   r=   c                    sR   r
d}nrd}|dkr*  | ||S |dkrB | ||S  | ||S )Nr   r0   Zmiddle)Z	align_topZalign_middleZalign_bottom)r   r1   r4   r-   )_Segment
footer_row
header_row
row_heightrA   rB   
align_cellB  s    z!Table._render.<locals>.align_cellc              
      s8   g | ]0\}}}}  ||j||j |qS rA   )Z	set_shaper1   r-   )r   r4   Z_cellr   r   )r   r   r}   
max_heightr~   rA   rB   r   S  s   
z!Table._render.<locals>.<listcomp>Zfoot)Zedger   rw   headZmidrow)5r}   r-   re   r   rT   rM   r   r   
substituter   rZ   r_   Zget_plain_headed_boxr   liner`   ra   rb   rc   Z	head_leftZ
head_rightZhead_verticalZ	foot_leftZ
foot_rightZfoot_verticalZmid_leftZ	mid_rightZmid_verticalZget_topr   r   rU   r   r|   r   r/   r8   r3   Zrender_linesrR   r   rs   ro   r   rK   Zget_rowr   stripZbackground_styleranger   rP   Z
get_bottom)%r@   rz   r   r   Ztable_stylere   Z_column_cellsZ	row_cellsZ_boxnew_linerT   r_   r`   ra   rb   rc   Zbox_segmentsr   r{   r   r   Zrow_cellr   rD   r4   r   r   r   linesr.   r   Z_dividerdividerZline_noZ	last_cellZrendered_cellrP   rA   )
r   r   rz   r   r}   r   r   r   r~   r@   rB   r     s    













 " 


  
zTable._render)r(   r(   ),rF   rG   rH   rI   r   r'   rJ   rO   r   Z
HEAVY_HEADr   rq   r
   r    rK   ZBoxrL   r   r   r   rt   classmethodrv   rN   r^   setterrx   ry   r   r   r   r   r[   rr   r   r   r   r   r   rQ   r   r   r   r   rA   rA   rA   rB   rS      s8  


A
 	 !  :/ 1 @  '  I
)  rS   __main__)r!   )ReprHighlighter)rS   )timerzTable renderzStar Wars MovieszRich example tabler   )rX   rY   ri   ZReleasedZbright_cyanZcyanT)r+   r-   r8   ZTitleZmagentar   z
Box OfficeZgreen)r/   r-   zDec 20, 2019z Star Wars: The Rise of Skywalkerz$952,110,690zMay 25, 2018zSolo: A Star Wars Storyz$393,151,347zDec 15, 2017z!Star Wars Ep. V111: The Last Jediz$1,332,539,889zon blackr   zDec 16, 2016zRogue One: A Star Wars Storyz$1,332,439,889N)r   r=   c                 C   s"   t   t t|  t   d S r   )rz   printZrulerj   )r   rA   rA   rB   r)     s    r)   zExample TablerW   r   zexpand=True2   zwidth=50FZdimrV   zrow_styles=['dim', 'none']z%leading=1, row_styles=['dim', 'none']z+show_lines=True, row_styles=['dim', 'none'])JZdataclassesr   r   r   typingr   r   r   r   r	   r
   r   r   r   r(   r   r   Z_loopr   r   Z_pickr   Z_ratior   r   Zalignr   Zjupyterr   Zmeasurer   r[   r   r   protocolr   segmentr   r-   r   r   r   r   r    rz   r!   r"   r#   r$   r%   r&   r'   rO   rQ   rS   rF   Zrich.consoleZrich.highlighterr   Z
rich.tableZ_timerr   tablerr   r   rq   r)   rj   r   r^   r4   rd   rc   rb   rA   rA   rA   rB   <module>   s   , 
Z
      
   



