o
    iN                     @   s  d Z ddlZ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mZ ddlmZ er>ddlmZ dd	lmZmZ d
ddedefddZdddededee fddZded dedee fddZdddededee fddZ				d=d eeed!f e
f d"eed!f d#eded$eed!f d%eed!f dee fd&d'Zd(edefd)d*Z d+edefd,d-Z!dddedee fd.d/Z"dddedefd0d1Z#d2eed!f d3ddedee fd4d5Z$d6e	defd7d8Z%dddedefd9d:Z&d3ddedefd;d<Z'dS )>zZsh completion script generator.

Generates static zsh completion scripts using the compsys framework.
No runtime Python dependency.
    N)dedent)indent)TYPE_CHECKING)CompletionActionCompletionDataclean_choice_textextract_completion_dataget_completion_actionstrip_markup)docstring_parse)App)ArgumentArgumentCollectionappr   	prog_namereturnc              	   C   s   |rt d|std|dt| }d| dd| dddg}|t|d	|| jr0t| jnd	| jr9t| jnd	d
 |ddg d	|d S )a  Generate zsh completion script.

    Parameters
    ----------
    app : App
        The Cyclopts application to generate completion for.
    prog_name : str
        Program name (alphanumeric with hyphens/underscores).

    Returns
    -------
    str
        Complete zsh completion script.

    Raises
    ------
    ValueError
        If prog_name contains invalid characters.
    z^[a-zA-Z0-9_-]+$zInvalid prog_name: z0. Must be alphanumeric with hyphens/underscores.z	#compdef  _z() {z  local line state )r   
help_flagsversion_flags}
)
rematch
ValueErrorr   extend_generate_completion_for_pathr   tupler   join)r   r   completion_datalinesr   r   ]/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/cyclopts/completion/zsh.pygenerate_completion_script   s0   

r#   	argumentsr   
indent_strc                 C   s4   t d| d| d}t||}dd |dD S )aA  Generate dynamic completion for the 'run' command.

    Parameters
    ----------
    arguments : ArgumentCollection
        Arguments for run command.
    indent_str : str
        Indentation string.
    prog_name : str
        Program name.

    Returns
    -------
    list[str]
        Zsh completion code lines.
    a          local script_path
        local -a completions
        local -a remaining_words

        # If completing first argument (the script path), suggest files
        if [[ $CURRENT -eq 2 ]]; then
          _files
          return
        fi

        # Get absolute path to the script file
        script_path=${words[2]}
        script_path=${script_path:a}
        if [[ -f $script_path ]]; then
          remaining_words=(${words[3,-1]})
          local result
          local cmd

          if command -v z$ &>/dev/null; then
            cmd="a  "
          else
            return
          fi
          # Call back into cyclopts to get dynamic completions from the script
          result=$($cmd _complete run "$script_path" "${remaining_words[@]}" 2>/dev/null)
          if [[ -n $result ]]; then
            # Parse and display completion results
            completions=()
            while IFS= read -r line; do
              completions+=($line)
            done <<< $result
            _describe 'command' completions
          fi
        fic                 S   s   g | ]}|  qS r   )rstrip).0liner   r   r"   
<listcomp>   s    z4_generate_run_command_completion.<locals>.<listcomp>r   )r   textwrap_indentsplit)r$   r%   r   templateindentedr   r   r"    _generate_run_command_completionP   s   

$r.   positional_argsr   help_formatc                 C   sF  g }dd | D }dd | D }|D ]L}d|j pd }t||}|jdd}|r;dd |D }	d	|	}
d
|
 d}ntt|j}|rPd| d| d| dnd| d| d}|| q|D ]?}t||}|jdd}|rdd |D }	d	|	}
d
|
 d}ntt|j}|rd| d| dnd| d}|| qa|S )a  Generate positional argument specs for nested command context.

    In nested contexts (after *::arg:->args), word indexing is shifted:
    - words[1] = subcommand name
    - words[2] = first positional argument
    - words[3] = second positional argument, etc.

    Parameters
    ----------
    positional_args : list[Argument]
        Positional arguments to generate specs for.
    help_format : str
        Help text format.

    Returns
    -------
    list[str]
        List of zsh positional argument specs.
    c                 S   s   g | ]}|  r|qS r   is_var_positionalr'   argr   r   r"   r)          z5_generate_nested_positional_specs.<locals>.<listcomp>c                 S   s   g | ]}|  s|qS r   r1   r3   r   r   r"   r)      r5      r   Tforcec                 S      g | ]}t t|qS r   _escape_completion_choicer   r'   cr   r   r"   r)      r5    ()':c                 S   r9   r   r:   r<   r   r   r"   r)      r5   '*:)index_get_description_from_argumentget_choicesr   _map_completion_action_to_zshr	   hintappend)r/   r0   specsvariadic_argsnon_variadic_argsr4   posdescchoicesescaped_choiceschoices_stractionspecr   r   r"   !_generate_nested_positional_specs   s2   

.

"rT   argumentc           	   	   C   s   g }t | |}| jdd}|rKdd |D }|| d || d |D ]}|| d| d| d	 q(|| d
 || d |S t| j}|tjkr_|| d |S |tjkrl|| d |S )aY  Generate _describe-based completion for a single positional argument.

    Parameters
    ----------
    argument : Argument
        Argument to generate completion for.
    help_format : str
        Help text format.
    indent_str : str
        Indentation string.

    Returns
    -------
    list[str]
        Zsh completion code lines.
    Tr7   c                 S   r9   r   r:   r<   r   r   r"   r)      r5   z1_generate_describe_completion.<locals>.<listcomp>zlocal -a choicesz	choices=(z  'rB   rA   r@   z_describe 'argument' choices_files_directories)rE   rF   rI   r	   rH   r   FILESDIRECTORIES)	rU   r0   r%   r!   rN   rO   rP   choicerR   r   r   r"   _generate_describe_completion   s&   




r[      cycloptsr   r    .command_pathr   r   r   c              	   C   s  | | }|j }|j}d| }	g }
|dkr#|dkr#|
t||	| |
S g }g }dd |D }dd |D }|jdd d	 |D ]}t||j}|| q?t }|D ] }td
d |j	D rrt
|j	|j|j}|| ||j	 qR|D ]}|dr||vrd| d}|| qu|D ]}|dr||vrd| d}|| qtdd |D }|r|s|rt||j}n|D ]}t||j}|| q|| }|r|d |d |r|rdnd}|
|	 d| d |dd D ]}|
|	 d| d q|
|	 d|d   |
d |r|
|	 d |
|	 d g }|D ]#}|j	D ]}|dsKt|j|j}|d| d| d q0q+|
|	 d |
|	 d |D ]}|
|	 d |  qa|
|	 d! |
|	 d" |
|	 d# |
|	 d$ |
|	 d% |D ]?}|j	D ]8}|drq||f }|| v r|
|	 d | d& t| ||d' |||}|
| |
|	 d( qq|
|	 d) |
|	 d# |
|	 d* |
S )+a  Generate completion code for a specific command path.

    Parameters
    ----------
    completion_data : dict
        Extracted completion data.
    command_path : tuple[str, ...]
        Command path.
    indent : int
        Indentation level.
    prog_name : str
        Program name.
    help_flags : tuple[str, ...]
        Help flags.
    version_flags : tuple[str, ...]
        Version flags.

    Returns
    -------
    list[str]
        Zsh code lines.
    r>   )runr]   c                 S   s    g | ]}|j d ur|jr|qS )N)rD   showr3   r   r   r"   r)   ,  s     z1_generate_completion_for_path.<locals>.<listcomp>c                 S   s   g | ]}|  s|jr|qS r   )is_positional_onlyr`   r3   r   r   r"   r)   -  s    c                 S   s
   | j pdS )Nr   )rD   )ar   r   r"   <lambda>0  s   
 z/_generate_completion_for_path.<locals>.<lambda>)keyc                 s   s    | ]}| d V  qdS -N)
startswith)r'   namer   r   r"   	<genexpr>:  s    z0_generate_completion_for_path.<locals>.<genexpr>rf   rA   z![Display this message and exit.]'z[Display application version.]'c                 s   s(    | ]}|j D ]	}|d  V  qqdS re   )namesrg   )r'   registered_commandcmd_namer   r   r"   ri   L  s    z'1: :->cmds'z'*::arg:->args'z-C r   z_arguments \Nz  z \zcase $state inz  cmds)rB   z    local -a commandsz    commands=(z      z    )z,    _describe -t commands 'command' commandsz    ;;z  args)z    case $words[1] inr@      z
        ;;z    esacesac)commandsr$   r   r.   sort_generate_keyword_specsr0   setanyrj   #_generate_keyword_specs_for_commandr   updaterg   rI   rT   _generate_positional_spec_safe_get_description_from_appr   )r    r^   r   r   r   r   datarq   r$   r%   r!   
args_specspositional_specsr/   keyword_argsrU   rJ   flag_command_namesrk   flagrS   has_non_flag_commandsc_flagcmd_listrl   rN   cmdsub_path	sub_linesr   r   r"   r      s   










r   rZ   c                 C   s   |  dd} |  dd} |  dd} |  dd} |  d	d
} |  dd} |  dd} |  dd} |  dd} |  dd} |  dd} |  dd} |  dd} |  dd} | S )a{  Escape special characters in a completion choice value for zsh.

    Choice should already be cleaned via clean_choice_text() before calling this function.
    This function only applies zsh-specific escaping.

    Parameters
    ----------
    choice : str
        Cleaned choice value.

    Returns
    -------
    str
        Escaped choice value safe for zsh completion.
    rm   \\rA   '\''`\`$\$"\"r>   z\ r?   z\(r@   z\)[\[]\];z\;|z\|&z\&rB   \:replace)rZ   r   r   r"   r;     s   r;   textc                 C   sd   |  dd} |  dd} |  dd} |  dd} |  d	d
} |  dd} |  dd} |  dd} | S )zEscape special characters in description text for zsh.

    Parameters
    ----------
    text : str
        Cleaned description text.

    Returns
    -------
    str
        Escaped description safe for zsh completion.
    rm   r   r   r   r   r   r   r   rA   r   rB   r   r   r   r   r   r   )r   r   r   r"   _escape_zsh_description  s   r   c              
   C   s"  g }t | |}|  }d}| jdd}|r*dd |D }d|}d| d}d	}ntt| j}| jjD ]?}	|		d
s=q5|rK|sKd|	 d| d}
n$|r`d|	 d| d|	
d
 d| d	}
nd|	 d| d|	
d
 d}
||
 q5| jD ]}	|		d
sqxd|	 d| d}
||
 qx|S )a  Generate zsh _arguments specs for a keyword argument.

    Parameters
    ----------
    argument : Argument
        Argument object from ArgumentCollection.
    help_format : str
        Help text format.

    Returns
    -------
    list[str]
        List of zsh argument specs.
    r   Tr7   c                 S   r9   r   r:   r<   r   r   r"   r)     r5   z+_generate_keyword_specs.<locals>.<listcomp>r>   r?   r@   Frf   rA   r   ]'z]:rB   )rE   is_flagrF   r   rG   r	   rH   	parameterrh   rg   lstriprI   	negatives)rU   r0   rJ   rN   r   rR   rO   rP   rQ   rh   rS   r   r   r"   rs     s4   


&

rs   c                 C   s   t | |}| jdd}|r dd |D }d|}d| d}ntt| j}|  r<|r6d| d	| d
S d| d
S | jdu rJtd| j	 d| jd }|r]d
| d	| d	| d
S d
| d	| d
S )a  Generate zsh _arguments spec for a positional argument.

    Parameters
    ----------
    argument : Argument
        Positional argument object.
    help_format : str
        Help text format.

    Returns
    -------
    str
        Zsh positional argument spec.
    Tr7   c                 S   r9   r   r:   r<   r   r   r"   r)     r5   z-_generate_positional_spec.<locals>.<listcomp>r>   r?   r@   rC   rB   rA   NzPositional-only argument z missing indexr6   )
rE   rF   r   rG   r	   rH   r2   rD   r   rj   )rU   r0   rN   rO   rP   rQ   rR   rM   r   r   r"   rx     s   

"

.rx   rj   cmd_appc                 C   sB   g }t ||}| D ]}|drd| d| d}|| q	|S )ad  Generate zsh _arguments specs for a command that looks like a flag.

    Parameters
    ----------
    names : tuple[str, ...]
        Registered names for the command.
    cmd_app : App
        Command app with flag-like names.
    help_format : str
        Help text format.

    Returns
    -------
    list[str]
        List of zsh argument specs.
    rf   rA   r   r   )ry   rg   rI   )rj   r   r0   rJ   rN   rh   rS   r   r   r"   rv   *  s   


rv   rR   c                 C   s    | t jkrdS | t jkrdS dS )a  Map shell-agnostic completion action to zsh-specific completion command.

    Parameters
    ----------
    action : CompletionAction
        Shell-agnostic completion action.

    Returns
    -------
    str
        Zsh completion command (e.g., "_files", "_directories", or "").
    rV   rW   r   )r   rX   rY   )rR   r   r   r"   rG   F  s
   

rG   c                 C   s   t | jjpd|d}t|S )aH  Extract plain text description from Argument, escaping zsh special chars.

    Parameters
    ----------
    argument : Argument
        Argument object with parameter help text.
    help_format : str
        Help text format.

    Returns
    -------
    str
        Escaped plain text description (truncated to 80 chars).
    r   format)r
   r   helpr   )rU   r0   r   r   r   r"   rE   Z  s   rE   c                 C   sV   | j sdS zt| j d}|jpd}W n ty    t| j }Y nw t||d}t|S )a/  Extract plain text description from App, escaping zsh special chars.

    Parameters
    ----------
    cmd_app : App
        Command app with help text.
    help_format : str
        Help text format.

    Returns
    -------
    str
        Escaped plain text description (truncated to 80 chars).
    r   	plaintextr   )r   r   short_description	Exceptionstrr
   r   )r   r0   parsedr   r   r   r"   ry   m  s   ry   )r\   r]   r   r   )(__doc__r   textwrapr   r   r*   typingr   cyclopts.completion._baser   r   r   r   r	   r
   cyclopts.help.helpr   r]   r   cyclopts.argumentr   r   r   r#   listr.   rT   r[   dictr   intr   r;   r   rs   rx   rv   rG   rE   ry   r   r   r   r"   <module>   s     5
=
C
2



 !6&%