o
    §iI  ã                   @   s¦  d Z ddlZddlmZ ddl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fdd„Zdeeedf ef deddd	ee fdd„Zdeeedf ef d	ee fdd„Zdeeedf ef dedd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 fd#d$„Zd	efd%d&„Zd'ee ded	ee fd(d)„ZdS )*zšBash completion script generator.

Generates static bash completion scripts using COMPREPLY and compgen.
Targets bash 3.2+ with no external dependencies.
é    N)ÚTYPE_CHECKING)ÚCompletionActionÚCompletionDataÚclean_choice_textÚextract_completion_dataÚget_completion_action)ÚAppÚappr   Ú	prog_nameÚreturnc                 C   s¤   |rt  d|¡std|›dƒ‚| dd¡}t| ƒ}d|› ddd|› d	d
dg}| t||| ƒ¡ | dg¡ | d¡ | d|› d|› ¡ | d¡ d |¡S )aƒ  Generate bash completion script.

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

    Returns
    -------
    str
        Complete bash 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# Bash completion for z# Generated by CycloptsÚ z() {z  local cur prevÚ}zcomplete -F _ú Ú
)	ÚreÚmatchÚ
ValueErrorÚreplacer   ÚextendÚ"_generate_completion_function_bodyÚappendÚjoin)r	   r
   Ú	func_nameÚcompletion_dataÚlines© r   ú^/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/cyclopts/completion/bash.pyÚgenerate_completion_script   s"   
ú	


r   Úchoicec                 C   s   |   dd¡S )z&Escape single quotes for bash strings.ú'z'\''©r   )r    r   r   r   Ú_escape_bash_choiceC   s   r#   Útextc                 C   s   |   dd¡} |   dd¡} | S )z*Escape description text for bash comments.r   r   úr"   )r$   r   r   r   Ú_escape_bash_descriptionH   s   r&   Úactionc                 C   s    | t jkrdS | t jkrdS dS )zÚMap completion action to bash compgen flags.

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

    Returns
    -------
    str
        Compgen flags ("-f", "-d", or "").
    z-fz-dr   )r   ÚFILESÚDIRECTORIES)r'   r   r   r   Ú_map_completion_action_to_bashO   s
   

r*   r   .c                 C   sP   g }|  d¡ |  d¡ |  d¡ | t| ƒ¡ |  d¡ | t| ||ƒ¡ |S )aR  Generate the body of the bash completion function.

    Parameters
    ----------
    completion_data : dict
        All extracted completion data.
    prog_name : str
        Program name.
    app : App
        Application instance.

    Returns
    -------
    list[str]
        Lines of bash code for the completion function body.
    z!  cur="${COMP_WORDS[COMP_CWORD]}"z$  prev="${COMP_WORDS[COMP_CWORD-1]}"r   )r   r   Ú _generate_command_path_detectionÚ_generate_completion_logic)r   r
   r	   r   r   r   r   r   c   s   



r   c                 C   s  t ƒ }t ƒ }|  ¡ D ]7}|jD ]}| ¡ s*|jjr*|jjD ]}| d¡r)| |¡ qq|jD ]}|j	D ]}| d¡s?| |¡ q3q.q
g }| 
d¡ |rcdd„ t|ƒD ƒ}	d |	¡}
| 
d|
› d¡ n| 
d¡ | 
d	¡ | 
d
¡ |rŒdd„ t|ƒD ƒ}d |¡}| 
d|› d¡ n| 
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$¡ | 
d%¡ | 
d¡ | 
d¡ | 
d¡ | 
d¡ | 
d¡ | 
d¡ | 
d¡ | 
d¡ | 
d¡ | 
d¡ | 
d¡ | 
d&¡ | 
d'¡ | 
d(¡ | 
d)¡ | 
d*¡ | 
d+¡ | 
d,¡ | 
d¡ | 
d¡ | 
d ¡ |S )-a[  Generate bash code to detect the current command path.

    This function generates two passes through COMP_WORDS:
    1. First pass builds cmd_path by identifying valid command names
    2. Second pass counts positionals (non-option words after the command path)

    The two-pass approach is necessary because we need to know the full command
    path length before we can correctly identify which words are positionals.

    Note: all_commands is built globally across all command levels. If a positional
    argument value happens to match a command name from a different level, it could
    be incorrectly classified (though this represents poor CLI design).

    Parameters
    ----------
    completion_data : dict
        All extracted completion data.

    Returns
    -------
    list[str]
        Lines of bash code for command path detection.
    r   zD  # Build list of options that take values (to skip their arguments)c                 S   ó   g | ]}t |ƒ‘qS r   ©r#   ©Ú.0Úoptr   r   r   Ú
<listcomp>¯   ó    z4_generate_command_path_detection.<locals>.<listcomp>r   z  local options_with_values='r!   z  local options_with_values=''r   zK  # Build list of all valid command names (to distinguish from positionals)c                 S   r-   r   r.   ©r0   Úcmdr   r   r   r2   ¸   r3   z  local all_commands='z  local all_commands=''z>  # Detect command path by collecting valid command words onlyz  local -a cmd_path=()z  local i skip_next=0z$  for ((i=1; i<COMP_CWORD; i++)); doz!    local word="${COMP_WORDS[i]}"z#    if [[ $skip_next -eq 1 ]]; thenz      skip_next=0z      continuez    fiz    if [[ $word =~ ^- ]]; thenz*      # Check if this option takes a valuez:      if [[ " $options_with_values " =~ " $word " ]]; thenz        skip_next=1z      fiz    elsezF      # Non-option word - only add to cmd_path if it's a valid commandz3      if [[ " $all_commands " =~ " $word " ]]; thenz        cmd_path+=("$word")z  donez;  # Count positionals (non-option words after command path)z  local positional_count=0z$  local cmd_path_len=${#cmd_path[@]}z  skip_next=0z  local cmd_depth=0z      # Non-option wordz1      if [[ $cmd_depth -lt $cmd_path_len ]]; thenz        # Still in command pathz        ((cmd_depth++))z
      elsez1        # Past command path, this is a positionalz        ((positional_count++)))ÚsetÚvaluesÚ	argumentsÚis_flagÚ	parameterÚnameÚ
startswithÚaddÚcommandsÚnamesr   Úsortedr   )r   Úoptions_with_valuesÚall_commandsÚdataÚargumentr;   Úregistered_commandÚcmd_namer   Úescaped_optsÚopts_strÚescaped_cmdsÚcmds_strr   r   r   r+   …   s    


€



€þÿ























































r+   c           
   
      sT  g }|j r
t|j ƒnd}|jrt|jƒnd}| d¡ | d¡ tdd„ |  ¡ D ƒƒ}t|d ƒD ]g‰ ‡ fdd„|  ¡ D ƒ}|sAq1| d	ˆ › d
¡ ˆ dkrZ| t| dd||ƒ¡ n9| d¡ t	|ƒD ] }d 
|¡}	| d|	› d¡ | t| |d||ƒ¡ | d¡ qc| d¡ | d¡ | d¡ | d¡ q1| d¡ | d¡ | d¡ |S )aM  Generate the main completion logic using case statements.

    Parameters
    ----------
    completion_data : dict
        All extracted completion data.
    prog_name : str
        Program name.
    app : App
        Application instance.

    Returns
    -------
    list[str]
        Lines of bash code for completion logic.
    r   z4  # Determine command level and generate completionsz  case "${#cmd_path[@]}" inc                 s   s    | ]}t |ƒV  qd S ©N©Úlen©r0   Úpathr   r   r   Ú	<genexpr>  s   € z-_generate_completion_logic.<locals>.<genexpr>é   c                    s   g | ]
}t |ƒˆ kr|‘qS r   rL   rN   ©Údepthr   r   r2     s    z._generate_completion_logic.<locals>.<listcomp>ú    ú)r   z      z      case "${cmd_path[@]}" inr   z	        "z")z
          z          ;;z
        *)z
      esacz      ;;z    *)z  esac)Ú
help_flagsÚtupleÚversion_flagsr   ÚmaxÚkeysÚranger   Ú_generate_completions_for_pathr@   r   )
r   r
   r	   r   rV   rX   Ú	max_depthÚrelevant_pathsrO   Úpath_strr   rR   r   r,   ò   s:   



ÿ





r,   Úcommand_pathÚindentrV   rX   c                 C   sv  || vr
|› dgS | | }g }g }dd„ |j D ƒ}|D ]%}	|	jjp#g D ]}
|
 d¡r0| |
¡ q$|	jD ]}
|
 d¡r@| |
¡ q4qg }|jD ]}|jD ]}
|
 d¡rX| |
¡ qLqG|D ]}| d¡rp||vrp||vrp| |¡ q\|D ]}| d¡r‡||vr‡||vr‡| |¡ qs| |¡ g }|jD ]}|jD ]}| d¡s£| |¡ q—q’dd„ |j D ƒ}|j	dd„ d | |› d	¡ |r×d
d„ |D ƒ}d 
|¡}| |› d|› d¡ n| |› d¡ | |› d¡ t|j ƒ}|rÿt|j |||› dƒ}| |¡ n2|rdd„ |D ƒ}d 
|¡}| |› d|› d¡ n|r)| t||› dƒ¡ n| |› d¡ | |› d¡ |S )aç  Generate completions for a specific command path.

    Parameters
    ----------
    completion_data : dict
        All extracted completion data.
    command_path : tuple[str, ...]
        Current command path.
    indent : str
        Indentation string.
    help_flags : tuple[str, ...]
        Help flag names.
    version_flags : tuple[str, ...]
        Version flag names.

    Returns
    -------
    list[str]
        Lines of bash code for completions at this command path.
    úCOMPREPLY=()c                 S   s   g | ]}|  ¡ s|jr|‘qS r   )Úis_positional_onlyÚshow©r0   Úargr   r   r   r2   Q  s    z2_generate_completions_for_path.<locals>.<listcomp>r   c                 S   s    g | ]}|j d ur|jr|‘qS rK   )Úindexrd   re   r   r   r   r2   r  s     c                 S   s   | j d ur| j S dS )Nr   )rg   )Úar   r   r   Ú<lambda>s  r3   z0_generate_completions_for_path.<locals>.<lambda>)Úkeyzif [[ ${cur} == -* ]]; thenc                 S   r-   r   r.   r/   r   r   r   r2   x  r3   r   z  COMPREPLY=( $(compgen -W 'ú' -- "${cur}") )z  COMPREPLY=()Úelseú  c                 S   r-   r   r.   r4   r   r   r   r2   ˆ  r3   Úfi)r8   r:   r;   r<   r   Ú	negativesr>   r?   r   Úsortr   Ú_check_if_prev_needs_valueÚ#_generate_value_completion_for_prevÚ_generate_positional_completion)r   r`   ra   rV   rX   rC   r   ÚoptionsÚkeyword_argsrD   r;   Úflag_commandsrE   Úflagr>   rF   Úpositional_argsÚescaped_optionsÚoptions_strÚneeds_value_completionÚvalue_completion_linesÚescaped_commandsÚcommands_strr   r   r   r\   /  s~   

€


€þ



€þ
€
€




€þ

ÿ
r\   c           
      C   s¨  g }t | ƒdkrO| d jdd}t| d jƒ}|r2dd„ |D ƒ}d |¡}| |› d|› d	¡ |S t|ƒ}|rE| |› d
|› d¡ |S | |› d¡ |S | |› d¡ t| ƒD ]V\}}	|	jdd}t|	jƒ}| |› d|› d¡ |rdd„ |D ƒ}d |¡}| |› d|› d	¡ nt|ƒ}|r¡| |› d|› d¡ n| |› d¡ | |› d¡ q[| |› d¡ | |› d¡ | |› d¡ | |› d¡ |S )aE  Generate position-aware positional argument completion.

    Parameters
    ----------
    positional_args : list
        List of positional arguments sorted by index.
    indent : str
        Indentation string.

    Returns
    -------
    list[str]
        Lines of bash code for position-aware positional completion.
    rQ   r   T©Úforcec                 S   ó   g | ]}t t|ƒƒ‘qS r   ©r#   r   ©r0   Úcr   r   r   r2   «  ó    z3_generate_positional_completion.<locals>.<listcomp>r   úCOMPREPLY=( $(compgen -W 'rk   zCOMPREPLY=( $(compgen ú -- "${cur}") )rb   zcase ${positional_count} inrm   rU   c                 S   r   r   r‚   rƒ   r   r   r   r2   ½  r…   ú    COMPREPLY=( $(compgen -W 'ú    COMPREPLY=( $(compgen ú    COMPREPLY=()ú    ;;ú  *)Úesac)rM   Úget_choicesr   Úhintr   r   r*   Ú	enumerate)
rx   ra   r   Úchoicesr'   Úescaped_choicesÚchoices_strÚcompgen_flagÚidxrD   r   r   r   rs   •  sD   
!áåè

rs   c                 C   s:   | D ]}|  ¡ s|jjpg D ]}| d¡r  dS qqdS )a  Check if any options take values, requiring prev-word completion logic.

    Parameters
    ----------
    arguments : ArgumentCollection
        Arguments to check.

    Returns
    -------
    bool
        True if any option (starts with -) takes a value (is not a flag).
    r   TF)r9   r:   r;   r<   )r8   rD   r;   r   r   r   rq   Ñ  s   
ÿ€rq   r>   c                 C   sø  g }|  |› d¡ d}| D ]n}| ¡ rqdd„ |jjpg D ƒ}|s#qd}|jdd}t|jƒ}	|D ]I}
|  |› d|
› d¡ |rYd	d„ |D ƒ}d
 |¡}|  |› d|› d¡ nt|	ƒ}|rk|  |› d|› d¡ n|  |› d¡ |  |› d¡ q2q|rÉ|  |› d¡ |r¡dd„ |D ƒ}d
 |¡}|  |› d|› d¡ n|r¯| 	t
||› dƒ¡ n|  |› d¡ |  |› d¡ |  |› d¡ |S g }|rædd„ |D ƒ}d
 |¡}|  |› d|› d¡ |S |rò| 	t
||ƒ¡ |S |  |› d¡ |S )aº  Generate value completion based on previous word.

    Parameters
    ----------
    arguments : ArgumentCollection
        Arguments with potential values.
    commands : list[str]
        Available commands at this level.
    positional_args : list
        List of positional arguments sorted by index.
    indent : str
        Indentation string.

    Returns
    -------
    list[str]
        Lines of bash code for value completion.
    zcase "${prev}" inFc                 S   s   g | ]	}|  d ¡r|‘qS )r   )r<   )r0   r;   r   r   r   r2     s    z7_generate_value_completion_for_prev.<locals>.<listcomp>Tr   rm   rU   c                 S   r   r   r‚   rƒ   r   r   r   r2     r…   r   rˆ   rk   r‰   r‡   rŠ   r‹   rŒ   c                 S   r-   r   r.   r4   r   r   r   r2     r3   rT   r   c                 S   r-   r   r.   r4   r   r   r   r2   (  r3   r†   rb   )r   r9   r:   r;   rŽ   r   r   r   r*   r   rs   )r8   r>   rx   ra   r   Ú	has_casesrD   r?   r‘   r'   r;   r’   r“   r”   r}   r~   r   r   r   rr   æ  s^   

ò
ö
ûþrr   )Ú__doc__r   Útypingr   Úcyclopts.completion._baser   r   r   r   r   Úcycloptsr   Ústrr   r#   r&   r*   ÚdictrW   Úlistr   r+   r,   r\   rs   Úboolrq   rr   r   r   r   r   Ú<module>   sZ    -ÿþý
ü&"mÿþý
ü=ÿ
þý
ü
û
úf<"