o
    i=                     @   sD  d Z ddlZddlmZ ddlmZmZmZmZm	Z	m
Z
 er$ddlmZ dd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deeedf ef d	ee fddZded	efddZdeeedf ef dedeedf deedf d	ee f
ddZdeeedf ef deedf dedeedf deedf d	ee fddZdedeedf ded ed	ee f
d!d"Zdeedf d	ee fd#d$Z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d ed(ed	ee f
d)d*Zd+eded ed(ed	ee f
d,d-Zdeedf ded	efd.d/Zd0dd(ed	efd1d2ZdS )3zFish completion script generator.

Generates static fish completion scripts using `complete -c COMMAND` statements.
Completions auto-load from ~/.config/fish/completions/PROGNAME.fish.
    N)TYPE_CHECKING)CompletionActionCompletionDataclean_choice_textextract_completion_dataget_completion_actionstrip_markup)Appappr	   	prog_namereturnc                 C   s   |rt d|std|dt| }d| ddg}tdd | D }|r6|t|| |d | j	r>t
| j	nd	}| jrHt
| jnd	}|t|||| d
|d
 S )a  Generate fish completion script.

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

    Returns
    -------
    str
        Complete fish 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# Fish completion for z# Generated by Cyclopts c                 s   s    | ]	}t |d kV  qdS )r   N)len).0path r   ^/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/cyclopts/completion/fish.py	<genexpr>6   s    z-generate_completion_script.<locals>.<genexpr>r   
)rematch
ValueErrorr   anykeysextend_generate_helper_functionsappend
help_flagstupleversion_flags_generate_completionsjoin)r
   r   completion_datalineshas_nested_commandsr   r   r   r   r   generate_completion_script   s   
r%   textc                 C   s   |  ddS )z&Escape single quotes for fish strings.'z'\'')replacer&   r   r   r   _escape_fish_stringC   s   r*   c                 C   s    |  dd} |  dd} t| S )z!Escape description text for fish.r    )r(   r*   r)   r   r   r   _escape_fish_descriptionH   s   r-   r"   .c           	      C   s   t  }| D ]!}|jD ]}| s'|jjr'|jjD ]}|dr&|| qqqd|  d}dd| ddg}|rPdd	d
 t	|D }|
d| d n|
d |g d |S )a3  Generate helper function for command path detection.

    Parameters
    ----------
    prog_name : str
        Program name.
    completion_data : dict
        Completion data used to identify options that take values.

    Returns
    -------
    list[str]
        Lines defining the helper function.
    -__fish__using_commandz6# Helper function to check exact command path sequencez	function z!    set -l cmd (commandline -opc)z    set -l subcommandsr+   c                 s       | ]}t |V  qd S Nr*   )r   optr   r   r   r   r       z-_generate_helper_functions.<locals>.<genexpr>z     set -l options_with_values 'r'   z!    set -l options_with_values '')z    set -l skip_next 0z;    # Extract non-option words (commands) from command linez!    for i in (seq 2 (count $cmd))z        set -l word $cmd[$i]z         if test $skip_next -eq 1z            set skip_next 0z            continue        endz)        if string match -qr -- '^-' $wordz>            # Check if this option takes a value (exact match)zF            if string match -q -- "* $word *" " $options_with_values "z                set skip_next 1z            endz        elsez*            # Non-option word is a commandz$            set -a subcommands $wordr6       endz8    # Check if subcommand sequence matches expected pathz2    if test (count $subcommands) -ne (count $argv)z        return 1r7   z"    for i in (seq 1 (count $argv))z-        if test $subcommands[$i] != $argv[$i]z            return 1r6   r7   z    return 0end)setvalues	argumentsis_flag	parametername
startswithaddr!   sortedr   r   )	r   r"   options_with_valuesdataargumentr>   	func_namer#   escaped_optsr   r   r   r   O   s.   



!r   actionc                 C   s    | t jkrdS | t jkrdS dS )a	  Map completion action to fish flags.

    Parameters
    ----------
    action : CompletionAction
        Completion action type.

    Returns
    -------
    str
        Fish completion flags ("-r -F" for files, "-r -a '(...)'" for directories, "" otherwise).
    z-r -Fz%-r -a '(__fish_complete_directories)'r   )r   FILESDIRECTORIES)rG   r   r   r   _map_completion_action_to_fish   s
   

rJ   r   r   c              	   C   sR   g }t |  D ]\}}|t| |||| |t|  tdkr&|d q|S )ak  Generate all fish completion commands.

    Parameters
    ----------
    completion_data : dict
        Extracted completion data.
    prog_name : str
        Program name.
    help_flags : tuple[str, ...]
        Help flags.
    version_flags : tuple[str, ...]
        Version flags.

    Returns
    -------
    list[str]
        Completion command lines.
    )keyr   )rA   itemsr   _generate_completions_for_pathmaxr   r   r   )r"   r   r   r   r#   command_path_datar   r   r   r       s   	
r    rO   c           	      C   s   || vrg S | | }g }t ||}|t|||| dd |jD }|s)|s)|rQ|t| |t|||| |t||||j |t|j	|||j |S )a  Generate completions for a specific command path.

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

    Returns
    -------
    list[str]
        Completion command lines.
    c                 S   s   g | ]}|  s|jr|qS r   )is_positional_onlyshow)r   argr   r   r   
<listcomp>   s    z2_generate_completions_for_path.<locals>.<listcomp>)
_get_condition_for_pathr    _generate_subcommand_completionsr;   _generate_option_section_header"_generate_help_version_completions!_generate_keyword_arg_completionshelp_format$_generate_command_option_completionscommands)	r"   rO   r   r   r   rC   r#   	conditionkeyword_argsr   r   r   rM      s   
rM   rC   r]   c                 C   s   dd | j D }|sg S g }|r|dd|  n|d | j D ]/}|jD ])}|dr1q)t|j| j}t|}	t	|}
|d| d| d|
 d	|	 d
	 q)q$|S )aT  Generate completions for subcommands.

    Parameters
    ----------
    data : CompletionData
        Completion data.
    command_path : tuple[str, ...]
        Command path.
    prog_name : str
        Program name.
    condition : str
        Fish condition.

    Returns
    -------
    list[str]
        Completion command lines.
    c                 S   s&   g | ]}|j D ]	}|d s|qqS )r.   )namesr?   )r   registered_commandr>   r   r   r   rT     s    
z4_generate_subcommand_completions.<locals>.<listcomp>z# Subcommands for: r+   z# Root-level commandsr.   complete -c z -a '' -d 'r'   )
r\   r   r!   r_   r?   _get_description_from_appr
   rZ   r-   r*   )rC   rO   r   r]   r\   r#   r`   cmd_namedescescaped_descescaped_cmdr   r   r   rV     s&   



&
rV   c                 C   s   | rdd |  gS dgS )zGenerate section header comment for options.

    Parameters
    ----------
    command_path : tuple[str, ...]
        Command path.

    Returns
    -------
    list[str]
        Comment line.
    z# Options for: r+   z# Root-level optionsr!   )rO   r   r   r   rW   9  s   rW   c              
   C   s   g }|D ];}| dr!|dd }|d|  d| d| d q| dr?t|dkr?|d	 }|d|  d| d
| d q|D ];}| dr_|dd }|d|  d| d| d qB| dr}t|dkr}|d	 }|d|  d| d
| d qB|S )ac  Generate completions for help and version flags.

    Parameters
    ----------
    prog_name : str
        Program name.
    condition : str
        Fish condition.
    help_flags : tuple[str, ...]
        Help flags.
    version_flags : tuple[str, ...]
        Version flags.

    Returns
    -------
    list[str]
        Completion command lines.
    --   Nra   r+    -l z$ -d 'Display this message and exit.'r.       -s z" -d 'Display application version.')r?   r   r   )r   r]   r   r   r#   flag	long_name
short_namer   r   r   rX   K  s$   
 
 rX   r^   rZ   c                 C   s  g }| D ]}t |jjpd|d}t|}| }|jdd}	t|j}
|jjp(g D ]}|	ds1q)|	drI|dd }d	| d
| d| g}nt
|dkr`|d }d	| d
| d| g}nq)|rm|d| d n6|	rdd |	D }d
|}|d| d| d nt|
}|r|| d| d n	|d| d |d
| q)|jD ]B}|	dsq|	dr|dd }|d	| d
| d| d| d	 qt
|dkr|d }|d	| d
| d| d| d	 qq|S )aQ  Generate completions for keyword arguments.

    Parameters
    ----------
    keyword_args : list
        Keyword arguments.
    prog_name : str
        Program name.
    condition : str
        Fish condition.
    help_format : str
        Help text format.

    Returns
    -------
    list[str]
        Completion command lines.
    r   formatT)forcer.   ri   rj   Nra   r+   rk   rl   rm   z-d 'r'   c                 S   s   g | ]}t t|qS r   )r*   r   )r   cr   r   r   rT     s    z5_generate_keyword_arg_completions.<locals>.<listcomp>z-x -a 'rb    -d 'z-r -d ')r   r=   helpr-   r<   get_choicesr   hintr>   r?   r   r   r!   rJ   	negatives)r^   r   r]   rZ   r#   rD   re   rf   r<   choicesrG   r>   ro   
line_partsrp   escaped_choiceschoices_straction_flagsr   r   r   rY   x  sP   






&$rY   r\   c                 C   s   g }| D ]R}|j D ]L}|dsq	t|j|}t|}|dr9|dd }	|d| d| d|	 d| d		 q	t|dkrU|d
 }
|d| d| d|
 d| d		 q	q|S )aj  Generate completions for commands that look like options.

    Parameters
    ----------
    commands : list
        List of RegisteredCommand tuples.
    prog_name : str
        Program name.
    condition : str
        Fish condition.
    help_format : str
        Help text format.

    Returns
    -------
    list[str]
        Completion command lines.
    r.   ri   rj   Nra   r+   rk   ru   r'   rl   rm   )r_   r?   rc   r
   r-   r   r   )r\   r   r]   rZ   r#   r`   rd   re   rf   ro   rp   r   r   r   r[     s    


&$r[   c                 C   s:   | sdS d| d}d dd | D }d| d| dS )	a  Generate fish condition string for a command path.

    Parameters
    ----------
    command_path : tuple[str, ...]
        Command path (empty for root).
    prog_name : str
        Program name.

    Returns
    -------
    str
        Fish condition flag.
    z-n __fish_use_subcommandr/   r0   r+   c                 s   r1   r2   r3   )r   cmdr   r   r   r     r5   z*_get_condition_for_path.<locals>.<genexpr>z-n 'r'   rh   )rO   r   rE   escaped_commandsr   r   r   rU     s
   rU   cmd_appc                 C   sZ   ddl m} | jsdS z|| jd}|jpd}W n ty&   t| j}Y nw t||dS )zExtract description from App.

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

    Returns
    -------
    str
        Description text.
    r   )docstring_parser   	plaintextrq   )cyclopts.help.helpr   rv   short_description	Exceptionstrr   )r   rZ   r   parsedr&   r   r   r   rc     s   rc   )__doc__r   typingr   cyclopts.completion._baser   r   r   r   r   r   cycloptsr	   r   r%   r*   r-   dictr   listr   rJ   r    rM   rV   rW   rX   rY   r[   rU   rc   r   r   r   r   <module>   s     	,
L


*



.

2


-
L
,