o
    2jU3                     @   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mZ ddl	m
Z
 ddlmZmZ ddlZddlmZ ddlmZmZmZmZmZ G dd	 d	ee
ZG d
d dZdedefddZdedeeef fddZedZdedefddZ dedefddZ!dedefddZ"de#e de#e#e  deeef fddZ$d edefd!d"Z%de#e de#e#e  d#e&de&fd$d%Z'd edefd&d'Z(e Z)dS )(z"Output framework for the `hf` CLI.    N)Sequence)Enum)Anycast)ConfirmationError)ANSI
StatusLinedisable_progress_barsis_agenttabulatec                   @   s$   e Zd ZdZdZdZdZdZdZdS )OutputFormatzGOutput format for CLI commands with auto detection of agent/human mode.agentautohumanjsonquietN)	__name__
__module____qualname____doc__r   r   r   r   r    r   r   V/var/www/html/whisper/venv/lib/python3.10/site-packages/huggingface_hub/cli/_output.pyr       s    r   c                   @   s  e Zd ZU dZeed< eed< d2ddZejfdeddfdd	Z	deddfd
dZ
defddZd3ddddedB dedB dedB ddfddZdddddeeeef  dee dB dedB deeef dB ddf
ddZdddededB ddfddZdededdfd d!Zd"d"d#d$ded%ed&ed'eddf
d(d)Zd3dedB defd*d+Zdeddfd,d-Zdeddfd.d/Zdeddfd0d1ZdS )4OutputzOutput sink for the `hf` CLI.

    Mode is resolved once at init time based on `is_agent()` auto-detection
    and can be overridden per-command via `set_mode()`.
    modeno_truncatereturnNc                 C   s   d| _ |   d S )NF)r   set_modeselfr   r   r   __init__4   s   zOutput.__init__c                 C   s:   |t jkrt rt jnt j}|| _|t jkrt  dS dS )zPOverride the output mode (called once at startup and again per '--format' flag).N)r   r   r
   r   r   r   r	   )r   r   r   r   r   r   8   s   


zOutput.set_modec                 C   s
   || _ dS )z2Toggle off cell truncation for human table output.Nr   )r   r   r   r   r   set_no_truncate@   s   
zOutput.set_no_truncatec                 C   s   | j tjkS N)r   r   r   r   r   r   r   is_quietD      zOutput.is_quiet)r   r   msgr   r   c                C   sx   |dur|dus|durt d|}t|}| j tjkr* |dur(t| dS dS tjkr:|dur8t| dS dS dS )z)Print a free-form text message to stdout.Nz&Cannot mix 'msg' with 'human'/'agent'.)
ValueError_strip_ansir   r   r   printr   )r   r%   r   r   r   r   r   textG   s   zOutput.text)headersid_key
alignmentsitemsr*   r+   r,   c                   s  s'| j   tjkrn tjkrn n  td dS tjkr%td dS dS  du r<td  }fdd|D   fddD }| j  tjkr dd  D }d	d |D }t||| j	d
}	i t
 ||pli }
dd |
 D }tttd|||d |	r| d dS dS  tjkr td  |D ]}tddd |D  qdS  tjkr ttjttd dS tjkr|pʈ d }D ]
}t||d qdS dS )a  Print tabular data to stdout.

        Args:
            items: List of dicts. Headers are auto-detected from keys if not provided.
            headers: Explicit column names. If None, derived from dict keys (all-None columns filtered).
            id_key: Key to print in quiet mode. If None, uses the first header.
            alignments: Optional mapping of header name to "left" or "right". Defaults to "left".
        zNo results found.z[]Nr   c                    s&   g | ] t  fd dD r qS )c                 3   s    | ]
}|  d uV  qd S r"   get.0itemcolr   r   	<genexpr>r   s    z*Output.table.<locals>.<listcomp>.<genexpr>)anyr1   )r-   r3   r   
<listcomp>r      & z Output.table.<locals>.<listcomp>c                    s   g | ]  fd dD qS )c                    s   g | ]}  |qS r   r.   r1   hr2   r   r   r8   s   s    +Output.table.<locals>.<listcomp>.<listcomp>r   r7   )r*   r<   r   r8   s   s    c                 S      g | ]}t |qS r   
_to_headerr:   r   r   r   r8   w       c                 S   s   g | ]	}d d |D qS )c                 S   r>   r   _format_table_value_humanr1   vr   r   r   r8   x   rA   r=   r   r1   rowr   r   r   r8   x       r    c                 S   s   i | ]	\}}t ||qS r   r?   r1   krE   r   r   r   
<dictcomp>}   rH   z Output.table.<locals>.<dictcomp>zlist[list[str | int]])r*   r,   z>Use `--no-truncate` or `--format json` to display full values.	c                 s       | ]}t |V  qd S r"   )_format_table_cell_agentrD   r   r   r   r5          zOutput.table.<locals>.<genexpr>default )r   r   r   r   r(   r   listkeys_truncate_columnsr   _infer_alignmentsr-   r   r   hintjoindumpsstrr   r/   )r   r-   r*   r+   r,   all_columnsrowsscreaming_headersformatted_rowsis_truncatedinferredscreaming_alignmentsrG   	quiet_keyr2   r   )r*   r-   r   tableX   sT   "zOutput.table)r+   datac                C   sp   t |rt|tst|}| jtjkr"|dur"t|	|d dS | jtj
kr*dnd}ttj||td dS )zPrint structured data as JSON in all modes (indented for human, compact otherwise).

        Accepts a dict or a dataclass.
        NrR      )indentrQ   )dataclassesis_dataclass
isinstancetype_dataclass_to_dictr   r   r   r(   r/   r   r   rY   rZ   )r   rd   r+   rf   r   r   r   dict   s   zOutput.dictmessagec                 K   s  | j  tjkr2 td| g}| D ]\}}|dur(|d| d|  qtd| dS  tj	krQ dd | D }t|rLd| dS | dS  tj
kri t|rdt
j|td	 dS d
 dS tjkrt| }|r}t|d  dS dS dS )z"Print a success summary to stdout.u   ✓ Nz  z: 
c                 S   s&   g | ]\}}|d ur| d| qS )N=r   rI   r   r   r   r8      r9   z!Output.result.<locals>.<listcomp> rP   rR   r   )r   r   r   r   greenr-   appendr(   rX   r   r   rY   rZ   r   rS   values)r   rm   rd   partsrJ   rE   rs   r   r   r   result   s&    $zOutput.resultFz--yes)rQ   yesconfirm_paramrQ   rv   rw   c                C   s<   |rdS | j tjkrt| d| dtj||dd dS )zV
        Ask for confirmation. Raises `ConfirmationError` in non-human modes.
        Nz Use z to skip confirmation.T)rQ   abort)r   r   r   r   typerconfirm)r   rm   rQ   rv   rw   r   r   r   rz      s
   zOutput.confirmc                 C   s(   t | jtjkd}|dur|| |S )zEReturn a status line that emits only in human mode (no-op otherwise).)enabledN)r   r   r   r   update)r   rm   statusr   r   r   r}      s   
zOutput.statusc                 C   B   | j tjkrttd| tjd dS td| tjd dS )z0Print a non-fatal warning to stderr (all modes).z	Warning: fileN)r   r   r   r(   r   yellowsysstderrr   rm   r   r   r   warning      zOutput.warningc                 C   r~   )z%Print an error to stderr (all modes).zError: r   N)r   r   r   r(   r   redr   r   r   r   r   r   error   r   zOutput.errorc                 C   sR   | j tjkrdS | j tjkrttd| tjd dS td| tjd dS )a:  Print a helpful hint to stderr (human: gray, json/agent: plain text).

        Suppressed in quiet mode. Kept in json mode (like agent) since agents
        commonly run with ``--format json`` and the next-command hints are useful
        there; hints go to stderr so they never pollute the parsed stdout.
        NzHint: r   )	r   r   r   r   r(   r   grayr   r   r   r   r   r   rW      s
   zOutput.hint)r   Nr"   )r   r   r   r   r   __annotations__boolr   r   r   r!   r#   rZ   r)   r   rl   r   rS   rc   ru   rz   r   r}   r   r   rW   r   r   r   r   r   *   s<   
 
0

 :(
r   rE   r   c                 C   sL   t | tjr
|  S t | trdd |  D S t | tr$dd | D S | S )z4Recursively serialize a value to be JSON-compatible.c                 S   "   i | ]\}}|d ur|t |qS r"   _serialize_value)r1   keyvalr   r   r   rK         " z$_serialize_value.<locals>.<dictcomp>c                 S   r>   r   r   r0   r   r   r   r8      rA   z$_serialize_value.<locals>.<listcomp>)ri   datetime	isoformatrl   r-   rS   )rE   r   r   r   r      s   

r   infoc                 C   s   dd t |  D S )z0Convert a dataclass to a json-serializable dict.c                 S   r   r"   r   rI   r   r   r   rK      r   z&_dataclass_to_dict.<locals>.<dictcomp>)rg   asdictr-   )r   r   r   r   rk      s   rk   z\033\[[0-9;]*mr)   c                 C   s   t d| S )NrR   )_ANSI_REsubr)   r   r   r   r'      r$   r'   c                 C   s   d |  S )Nrp   )rX   splitr   r   r   r   _single_line   s   r   namec                 C   s   t dd| }| S )zAConvert a camelCase or PascalCase string to SCREAMING_SNAKE_CASE.z([a-z])([A-Z])z\1_\2)rer   upper)r   sr   r   r   r@      s   r@   r*   r\   c                    s8   i }t | D ]\ }t fdd|D rd||< q|S )zNReturn ``{"col": "right"}`` for columns where every non-None value is numeric.c                 3   s>    | ]}|  d u pt |  ttfot |  t V  qd S r"   )ri   intfloatr   rF   cr   r   r5     s   < z$_infer_alignments.<locals>.<genexpr>right)	enumerateall)r*   r\   ru   r;   r   r   r   rV     s   rV   valuec                 C   s   | du rdS t | tr| rdS dS t | tjr| dS t | tr-td| r-| dd S t | tr6t| S t | trEd	dd	 | D S t | t
r]d
| v rVtt| d
 S tt| S tt| S )z/Convert a value to string for terminal display.NrR   u   ✔z%Y-%m-%dz^\d{4}-\d{2}-\d{2}T
   z, c                 s   rM   r"   rB   rD   r   r   r   r5     rO   z,_format_table_value_human.<locals>.<genexpr>r   )ri   r   r   strftimerZ   r   matchr   rS   rX   rl   r   rY   r   r   r   r   rC     s"   




rC   r   c                   s  |ssdS t }fddt|D }t jtd|d  }t||kr*dS |  dd D t |krbtfddt D  fd	d
dd}|dk rTn |  d8  < t |ks;d}D ]#}t|D ]\}	}
t |
 |	 krd}|
d |	 d  d ||	< qlqf|S )a  Truncate cells in-place to fit the current terminal width.

    Returns `True` if any cell was truncated, so the caller can emit a hint.
    `shutil.get_terminal_size` is cross-platform: it honors `$COLUMNS`, then
    queries the OS-native API, then falls back to `(80, 24)`.
    Fc                    s<   g | ] t t  g fd dttD R  qS )c                 3   s     | ]}t |   V  qd S r"   )len)r1   r)r   r\   r   r   r5   3  s    z/_truncate_columns.<locals>.<listcomp>.<genexpr>)maxr   ranger7   )r*   r\   r   r   r8   3  s   < z%_truncate_columns.<locals>.<listcomp>r      c                 S   s   g | ]	}t t|d qS )   )r   r   r:   r   r   r   r8   >  rH   c                 3   s$    | ]\}}| | kr|V  qd S r"   r   )r1   iw)
min_widthsr   r   r5   A  s   " z$_truncate_columns.<locals>.<genexpr>c                    s    |  S r"   r   )r   )capsr   r   <lambda>B  s    z#_truncate_columns.<locals>.<lambda>)r   rQ   TN   z...)	r   r   shutilget_terminal_sizecolumnsr   sumcopyr   )r*   r\   r   nnaturalbudgetwidest	truncatedrG   r   cellr   )r   r*   r   r\   r   rU   "  s8   

rU   c                 C   s    t | tjr
|  S tt| S )zHFormat a cell value for agent TSV output (ISO timestamps, tabs escaped).)ri   r   r   r   rZ   r   r   r   r   rN   R  s   rN   )*r   rg   r   r   r   r   r   collections.abcr   enumr   typingr   r   ry   huggingface_hub.errorsr   huggingface_hub.utilsr   r   r	   r
   r   rZ   r   r   objectr   rl   rk   compiler   r'   r   r@   rS   rV   rC   r   rU   rN   outr   r   r   r   <module>   sF   
 :
*	

0
