U
    祡c                     @   sD  d dl mZ d dlmZ d dlmZ d dlmZmZm	Z	m
Z
mZ ddlmZmZ ddlmZmZ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 ddlmZ ddlm Z  G dd de Z!e"dkr@d dl#Z#e Zdd e$e%e#& D Z'e!e'ddddZ(e)e( e*  de(_+e)e( de(_,e*  e)e( dS )    )defaultdict)chain)
itemgetter)DictIterableListOptionalTuple   )AlignAlignMethod)ConsoleConsoleOptionsRenderableTypeRenderResult	Constrain)Measurement)PaddingPaddingDimensions)Table)TextType)JupyterMixinc                   @   sz   e Zd ZdZdddddddddeee  eee e	e	e	e	ee
 ee dd
ddZedd	d
dZeeedddZdS )Columnsa  Display renderables in neat columns.

    Args:
        renderables (Iterable[RenderableType]): Any number of Rich renderables (including str).
        width (int, optional): The desired width of the columns, or None to auto detect. Defaults to None.
        padding (PaddingDimensions, optional): Optional padding around cells. Defaults to (0, 1).
        expand (bool, optional): Expand columns to full width. Defaults to False.
        equal (bool, optional): Arrange in to equal sized columns. Defaults to False.
        column_first (bool, optional): Align items from top to bottom (rather than left to right). Defaults to False.
        right_to_left (bool, optional): Start column from right hand side. Defaults to False.
        align (str, optional): Align value ("left", "right", or "center") or None for default. Defaults to None.
        title (TextType, optional): Optional title for Columns.
    Nr   r
   F)widthexpandequalcolumn_firstright_to_leftaligntitle)
renderablespaddingr   r   r   r   r   r    r!   returnc          
      C   sB   t |pg | _|| _|| _|| _|| _|| _|| _|| _|	| _	d S N)
listr"   r   r#   r   r   r   r   r    r!   )
selfr"   r#   r   r   r   r   r   r    r!    r(   0/tmp/pip-unpacked-wheel-qkhzhrww/rich/columns.py__init__   s    zColumns.__init__)
renderabler$   c                 C   s   | j | dS )zxAdd a renderable to the columns.

        Args:
            renderable (RenderableType): Any renderable object.
        N)r"   append)r'   r+   r(   r(   r)   add_renderable6   s    zColumns.add_renderable)consoleoptionsr$   c                 #   sN  j fdd	jD s"d S t	j\}}}}t||}j}tt}	t	}
t
jfddD 	jrtgt	 tttttt f  d	fdd}tj	jddd	}	j|_	j|_	jd k	r|	j|  }
t|
D ]}|j	jd
 qn|
dkr|	  d}||
D ]b\}}t|	| ||	|< t|	 |t	|	d   }||kr~t	|	d }
 qn|d |
 }q*qqtdfdd||
D }	jr·fdd|D }	jr	jt  fdd|D }	j}|j}tdt	||
D ]2}||||
  }|r8|d d d }||  q|V  d S )Nc                    s"   g | ]}t |tr |n|qS r(   )
isinstancestr.0r+   )
render_strr(   r)   
<listcomp>B   s   z,Columns.__rich_console__.<locals>.<listcomp>c                    s   g | ]} |j qS r(   )maximumr2   )r.   get_measurementr/   r(   r)   r5   O   s   )column_countr$   c                 3   s&  t }jrtt}|  g  }t|  D ]}||  d7  < q6|  d   } fddt|D }d }}t|D ]>}	|	|| |< ||  d8  < || r|d7 }q|d7 }d}qt|D ]}	|	dkr q||	 V  qntE d H  |  r"t |   D ]}
dV  qd S )Nr
   c                    s   g | ]}d g  qS )r(   )r3   _r8   r(   r)   r5   b   s     zFColumns.__rich_console__.<locals>.iter_renderables.<locals>.<listcomp>r   r9   )r   N)lenr   r&   zipranger   from_iterable)r8   Z
item_countZwidth_renderablesZcolumn_lengthsZcol_noZ	row_countcellsrowcolindexr:   )renderable_widthsr"   r'   r;   r)   iter_renderablesV   s0    

z2Columns.__rich_console__.<locals>.iter_renderablesTF)r#   Zcollapse_paddingZpad_edge)r   r
   r   c                    s   g | ]} |qS r(   r(   )r3   Z_renderable)get_renderabler(   r)   r5      s   c                    s&   g | ]}|d krd nt | d qS )Nr   r   r2   )rD   r(   r)   r5      s   c                    s"   g | ]}|d krd n |qS r%   r(   r2   )_Alignr    r(   r)   r5      s   r9   ) r4   r"   r   unpackr#   max	max_widthr   intr<   r   getr   r   r	   r   r   r   Zgridr   r!   r   r>   Z
add_columnclearsumvaluesr   r    r   r   add_row)r'   r.   r/   Z_toprightZ_bottomleftZwidth_paddingrJ   Zwidthsr8   rE   tabler:   Z	column_noZrenderable_widthZtotal_widthZ_renderablesr   rP   startrA   r(   )
rG   r    r.   r7   rF   r/   r4   rD   r"   r'   r)   __rich_console__>   s|    

!




zColumns.__rich_console__)Nr   )__name__
__module____qualname____doc__r   r   r   r   rK   boolr   r   r*   r-   r   r   r   rU   r(   r(   r(   r)   r      s8     
	 r   __main__Nc                 C   s   g | ]\}}| d | qS ) r(   )r3   isr(   r(   r)   r5      s     r5   r   F)r#   r   r   T)-collectionsr   	itertoolsr   operatorr   typingr   r   r   r   r	   r    r   r   r.   r   r   r   r   Z	constrainr   Zmeasurer   r#   r   r   rS   r   textr   Zjupyterr   r   rV   os	enumeratesortedlistdirfilescolumnsprintZruler   r   r(   r(   r(   r)   <module>   s2    


