o
    Ki"                     @   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 dededefddZdedefddZdd ZdedefddZdedede
e f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                   @   s4   e Zd ZdZdZedefddZed	ddZdS )
ProOutputFormatterConfigTcfgc                 C   s<   t jjd uodt jj v | _t j otdd u | _d S )NzUTF-8NO_COLOR)	sysstdoutencodingupperuse_utf8isattyosgetenv	use_color)clsr   r   r   r   init!   s   zProOutputFormatterConfig.initreturnNc                 C   s
   d| _ d S )NF)r!   )r"   r   r   r   disable_color*   s   
z&ProOutputFormatterConfig.disable_color)r$   N)	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*   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   r4   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   

r7   c                 C   st   | }t jsttd| }t js&t D ]
\}}|||}q|	dd
 }tj s8ttd|}|td}|S )Nr+   asciiignore)r   r!   r,   r-   r.   r   UTF8_ALTERNATIVESitemsr0   encodedecoder   r   r   r/   r1   )r'   outputcharalternativer   r   r   process_formatter_configH   s   
rA   	max_widthc                 C   sv   t | |kr	| gS |  }g }d}|D ]}t |t | |kr)||  |}q|d| 7 }q|r9||  |S )Nr+    )r4   splitappendstrip)r'   rB   wordswrapped_linescurrent_linewordr   r   r   	wrap_text[   s   rK   c                   @   s2   e Zd Zejddee defddZdd Z	dS )	ProOutputFormatterNline_lengthr$   c                 C   s   d S Nr   )selfrM   r   r   r   	to_stringq   s   zProOutputFormatter.to_stringc                 C   s   |   S rN   )rP   rO   r   r   r   __str__u   s   zProOutputFormatter.__str__rN   )
r   r   r   abcabstractmethodr   intstrrP   rR   r   r   r   r   rL   p   s    rL   c                	   @   s   e Zd ZdZ			ddeee  deeee   deee  fddZe	ded	e
d
efddZe	ded	e
d
efddZd
ee
 fddZddee
 d
efddZd
e
fddZde
d
eee  fddZdee d
efddZdS )Tablez  Nheadersrows	alignmentc                 C   s   |d ur|ng | _ |d ur|ng | _|  | _|d ur|ntjgt| j | _t| jt| jkr;td	t| j| jd | _
d S )Nz&'alignment' list should have length {})rX   rY   _get_column_sizescolumn_sizesr   r   r2   rZ   
ValueErrorr)   last_column_size)rO   rX   rY   rZ   r   r   r   __init__|   s   
zTable.__init__stringtotal_lengthr$   c                 C   s$   t | }||kr
| S | d||   S NrC   r4   ra   rb   
str_lengthr   r   r   ljust      zTable.ljustc                 C   s$   t | }||kr
| S d||  |  S rc   rd   re   r   r   r   rjust   rh   zTable.rjustc                    s   | j s
| js
td| jrtdd | jD rtdg }| j r&|| j  | jr/|| j t|d  t fdd|D sDtdg }tt|d D ]|t	fdd|D  qN|S )	Nz:Empty table not supported. Please provide headers or rows.c                 s   s    | ]	}t |d kV  qdS )r   Nr2   .0itemr   r   r   	<genexpr>       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 rN   rj   rk   )expected_lengthr   r   rn      ro   zQMixed lengths in table content. Please provide headers / rows of the same length.c                 3   s     | ]}t t|  V  qd S rN   )r4   rV   rk   )ir   r   rn      s    )
rX   rY   r^   anyrE   extendr2   allrangemax)rO   all_contentr]   r   )rp   rq   r   r\      s0   zTable._get_column_sizesrM   c                 C   s|   |d u rt  }| j}|  |kr| |}d}| jr*|tj| | j tj d 7 }|D ]}|| |7 }|d7 }q,t	|S )Nr+   
)
r7   rY   _get_line_lengthwrap_last_columnrX   r   BOLD	_fill_rowENDCrA   )rO   rM   rY   r>   rowr   r   r   rP      s(   


zTable.to_stringc                 C   s"   t | jt| jd t| j  S )N   )sumr]   r2   	SEPARATORrQ   r   r   r   ry      s   zTable._get_line_length
max_lengthc                 C   s   |t | jd d t| jd t| j   | _g }| jD ]B}t|d | jkr.|| qt|d | j}||d d |d g  |dd  D ]}dgt| jd  |g }|| qJq|S )Nr[   r   r   rC   )r   r]   r2   r   r_   rY   rE   rK   )rO   r   new_rowsr~   wrapped_last_column
extra_linenew_rowr   r   r   rz      s$   
zTable.wrap_last_columnr~   c                 C   s   d}t t|d D ]3}| j| tjkr%|| || | j| | j 7 }q
| j| tjkr=|| 	|| | j| | j 7 }q
| jd tjkrN||d 7 }|S | jd tjkra|| 	|d | j
7 }|S )Nr+   r   r[   )ru   r2   rZ   r   r   rg   r]   r   r   ri   r_   )rO   r~   r>   rq   r   r   r   r|      s"   zTable._fill_row)NNNrN   )r   r   r   r   r   r   rV   r   r`   staticmethodrU   rg   ri   r\   rP   ry   rz   r|   r   r   r   r   rW   y   s*    


 rW   c                   @   sP   e Zd ZdZdZ		ddee deee  fddZ	ddee
 d	efd
dZdS )Block   rC   Ntitlecontentc                 C   s"   || _ |d ur|| _d S g | _d S rN   )r   r   )rO   r   r   r   r   r   r`     s   zBlock.__init__rM   r$   c                 C   s   |d u rt  }|| j8 }d}| jr!|tjtj | j tj d 7 }| jD ]&}t|t	r2|j
|d}ndtt||d }|t|| j| j 7 }q$t|S )Nr+   rx   )rM   )r7   INDENT_SIZEr   r   r{   DISABLEGREYr}   r   
isinstancerL   rP   joinrK   rV   textwrapindentINDENT_CHARrA   )rO   rM   r>   rm   item_strr   r   r   rP     s0   


zBlock.to_string)NNrN   )r   r   r   r   r   r   rV   r   r   r`   rU   rP   r   r   r   r   r      s    

r   )"rS   r   r,   r   r   enumr   typingr   r   r   r   uaclient.configr   uaclient.messagesr   r.   r/   r1   r:   r   r   r#   rV   r*   rU   r4   r7   rA   rK   ABCrL   rW   r   r   r   r   r   <module>   s8    
	 