U
    Jh"                     @   s.  d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlmZm	Z	m
Z
mZ d dlmZ d dlmZ dZdZdZd	d
ddZG dd deZG dd dZeje d eeedddZeedddZdd ZeedddZeee
e dddZG dd  d e jZG d!d" d"eZ G d#d$ d$eZ!dS )%    N)Enum)AnyDictListOptional)UAConfig)TxtColorz
\033\[.*?mz\033]8;;.+?\033\\+z]8;;\-x*)u   —u   ✘u   ✔c                   @   s   e Zd ZdZdZdS )ContentAlignmentlrN)__name__
__module____qualname__LEFTRIGHT r   r   8/usr/lib/python3/dist-packages/uaclient/cli/formatter.pyr      s   r   c                   @   s8   e Zd ZdZdZeedddZeddddZdS )	ProOutputFormatterConfigTcfgc                 C   s<   t jjd k	odt jj k| _t j o4tdd k| _d S )NzUTF-8ZNO_COLOR)	sysstdoutencodingupperuse_utf8isattyosgetenv	use_color)clsr   r   r   r   init!   s    zProOutputFormatterConfig.initNreturnc                 C   s
   d| _ d S )NF)r!   )r"   r   r   r   disable_color*   s    z&ProOutputFormatterConfig.disable_color)	r   r   r   r   r!   classmethodr   r#   r&   r   r   r   r   r      s   r   r   )texturlr%   c                 C   s   dj || dS )Nz]8;;{url}\{text}]8;;\)r)   r(   )format)r(   r)   r   r   r   create_link2   s    r+   )r(   r%   c                 C   s0   t td| }t td|}|td}t|S )N )resubCOLOR_FORMATTING_PATTERNLINK_START_PATTERNreplaceLINK_ENDlen)r(   resultr   r   r   real_len6   s    r5   c                   C   s   t j rt jS dS )Ni  )r   r   r   r   get_terminal_sizecolumnsr   r   r   r   _get_default_length@   s    

r8   c                 C   st   | }t jsttd| }t jsLt D ]\}}|||}q&|	dd
 }tj spttd|}|td}|S )Nr,   asciiignore)r   r!   r-   r.   r/   r   UTF8_ALTERNATIVESitemsr1   encodedecoder   r   r   r0   r2   )r(   outputcharZalternativer   r   r   process_formatter_configH   s    
rA   )r(   	max_widthr%   c                 C   sv   t | |kr| gS |  }g }d}|D ]8}t |t | |krR||  |}q&|d| 7 }q&|rr||  |S )Nr,    )r5   splitappendstrip)r(   rB   ZwordsZwrapped_linesZcurrent_lineZwordr   r   r   	wrap_text[   s    rG   c                   @   s0   e Zd Zejdee edddZdd Z	dS )ProOutputFormatterNline_lengthr%   c                 C   s   d S Nr   )selfrJ   r   r   r   	to_stringq   s    zProOutputFormatter.to_stringc                 C   s   |   S rK   )rM   rL   r   r   r   __str__u   s    zProOutputFormatter.__str__)N)
r   r   r   abcabstractmethodr   intstrrM   rO   r   r   r   r   rH   p   s   rH   c                   @   s   e Zd ZdZdeee  eeee   eee  dddZe	ee
edddZe	ee
edd	d
Zee
 dddZdee
 edddZe
dddZe
eee  dddZee edddZdS )Tablez  N)headersrows	alignmentc                 C   s   |d k	r|ng | _ |d k	r|ng | _|  | _|d k	r:|ntjgt| j | _t| jt| jkrvtd	t| j| jd | _
d S )Nz&'alignment' list should have length {})rU   rV   _get_column_sizescolumn_sizesr   r   r3   rW   
ValueErrorr*   last_column_size)rL   rU   rV   rW   r   r   r   __init__|   s    
zTable.__init__)stringtotal_lengthr%   c                 C   s$   t | }||kr| S | d||   S NrC   r5   r^   r_   Z
str_lengthr   r   r   ljust   s    zTable.ljustc                 C   s$   t | }||kr| S d||  |  S r`   ra   rb   r   r   r   rjust   s    zTable.rjustr$   c                    s   | j s| jstd| jr6tdd | jD r6tdg }| j rL|| j  | jr^|| j t|d  t fdd|D stdg }tt|d D ] |t	fdd|D  q|S )	Nz:Empty table not supported. Please provide headers or rows.c                 s   s   | ]}t |d kV  qdS )r   Nr3   .0itemr   r   r   	<genexpr>   s     z*Table._get_column_sizes.<locals>.<genexpr>z=Empty row not supported. Please provide content for each row.r   c                 3   s   | ]}t | kV  qd S rK   re   rf   )expected_lengthr   r   ri      s     zQMixed lengths in table content. Please provide headers / rows of the same length.c                 3   s   | ]}t t|  V  qd S rK   )r5   rS   rf   )ir   r   ri      s     )
rU   rV   r[   anyrE   extendr3   allrangemax)rL   Zall_contentrZ   r   )rj   rk   r   rY      s0    zTable._get_column_sizesrI   c                 C   s|   |d krt  }| j}|  |kr*| |}d}| jrT|tj| | j tj d 7 }|D ]}|| |7 }|d7 }qXt	|S )Nr,   
)
r8   rV   _get_line_lengthwrap_last_columnrU   r   BOLD	_fill_rowENDCrA   )rL   rJ   rV   r?   rowr   r   r   rM      s(    


zTable.to_stringc                 C   s"   t | jt| jd t| j  S )N   )sumrZ   r3   	SEPARATORrN   r   r   r   rr      s    zTable._get_line_length)
max_lengthr%   c                 C   s   |t | jd d t| jd t| j   | _g }| jD ]}t|d | jkr\|| q:t|d | j}||d d |d g  |dd  D ](}dgt| jd  |g }|| qq:|S )NrX   rx   r   rC   )ry   rZ   r3   rz   r\   rV   rE   rG   )rL   r{   Znew_rowsrw   Zwrapped_last_columnZ
extra_lineZnew_rowr   r   r   rs      s"    
zTable.wrap_last_column)rw   r%   c                 C   s   d}t t|d D ]f}| j| tjkrJ|| || | j| | j 7 }q| j| tjkr|| 	|| | j| | j 7 }q| jd tjkr||d 7 }n&| jd tjkr|| 	|d | j
7 }|S )Nr,   rx   rX   )ro   r3   rW   r   r   rc   rZ   rz   r   rd   r\   )rL   rw   r?   rk   r   r   r   ru      s    zTable._fill_row)NNN)N)r   r   r   rz   r   r   rS   r   r]   staticmethodrR   rc   rd   rY   rM   rr   rs   ru   r   r   r   r   rT   y   s$      

 rT   c                   @   sH   e Zd ZdZdZd
ee eee  dddZ	dee
 eddd	ZdS )Block   rC   Ntitlecontentc                 C   s   || _ |d k	r|ng | _d S rK   r   )rL   r   r   r   r   r   r]     s    zBlock.__init__rI   c                 C   s   |d krt  }|| j8 }d}| jrB|tjtj | j tj d 7 }| jD ]L}t|t	rd|j
|d}ndtt||d }|t|| j| j 7 }qHt|S )Nr,   rq   )rJ   )r8   INDENT_SIZEr   r   rt   ZDISABLEGREYrv   r   
isinstancerH   rM   joinrG   rS   textwrapindentINDENT_CHARrA   )rL   rJ   r?   rh   Zitem_strr   r   r   rM     s2    


 
zBlock.to_string)NN)N)r   r   r   r   r   r   rS   r   r   r]   rR   rM   r   r   r   r   r}      s     
r}   )"rP   r   r-   r   r   enumr   typingr   r   r   r   Zuaclient.configr   Zuaclient.messagesr   r/   r0   r2   r;   r   r   r#   rS   r+   rR   r5   r8   rA   rG   ABCrH   rT   r}   r   r   r   r   <module>   s6   
	 