
    lKjpP                        d Z ddl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 erddlmZ ddd	ed
efdZded
efdZdee   ded
ee   fdZded
efdZded
efdZdeeedf   ef   d	eddd
ee   fdZdeeedf   ef   d
ee   fdZdeeedf   ef   d	eddd
ee   f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Zded
ee   fdZd
efdZd ee   ded
ee   fd!Zy)"zBash completion script generator.

Generates static bash completion scripts using COMPREPLY and compgen.
Targets bash 3.2+ with no external dependencies.
    N)TYPE_CHECKING)is_iterable_type)CompletionActionCompletionDataclean_choice_textescape_for_shell_patternextract_completion_dataget_completion_action)Appappr   	prog_namereturnc                    |rt        j                  d|      st        d|d      |j                  dd      }t	        |       }d| ddd| d	d
dg}|j                  t        |||              |j                  dg       |j                  d       |j                  d| d|        |j                  d       dj                  |      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liness        i/Users/ahmed/devFolder/Ultron/claude-voice/.venv/lib/python3.12/site-packages/cyclopts/completion/bash.pygenerate_completion_scriptr"      s    ( BHH%8)D.ym;klmm!!#s+I-c2O !,!

I;e
E 
LL3OYPSTU	LL#	LL	LL=1YK89	LL99U    choicec                     | j                  dd      } | j                  dd      } | j                  dd      } | j                  dd      } | S )	a1  Escape a choice for embedding inside a bash double-quoted string.

    Choices live inside ``local -a _c=("..." "...")`` arrays in the generated
    script (not as ``compgen -W`` whitespace-split tokens), so the only
    characters the shell still interprets are ``\``, ``"``, ``$`` and
    backtick.
    \z\\"z\"$z\$`z\`r   )r$   s    r!   _escape_bash_choicer+   E   sI     ^^D&)F^^C'F^^C'F^^C'FMr#   choicesindentc                     | D cg c]  }t        |       }}dj                  d |D              }| d| d| d| d| d| dgS c c}w )	a  Emit bash that prefix-matches ``$cur`` against an array of choices.

    Avoids ``compgen -W`` whitespace tokenization, which mangles choices
    containing spaces, single quotes, or characters re-parsed by the
    surrounding ``$(...)`` (e.g. backticks).

    Parameters
    ----------
    choices : list[str]
        Raw choice strings (already cleaned via ``clean_choice_text``).
    indent : str
        Indentation prefix.

    Returns
    -------
    list[str]
        Bash code lines.
    r   c              3   (   K   | ]
  }d | d   yw)r'   N ).0cs     r!   	<genexpr>z*_emit_choice_completion.<locals>.<genexpr>h   s     4GqAaS(Gs   zlocal -a _c=()COMPREPLY=()zfor _x in "${_c[@]}"; doz0  [[ "$_x" == "${cur}"* ]] && COMPREPLY+=("$_x")done)r+   r   )r,   r-   r2   escaped
array_bodys        r!   _emit_choice_completionr9   T   sz    & 077w!"1%wG74G44J(-
|1-(,(,-(DE($  8s   A
textc                 N    | j                  dd      } | j                  dd      } | S )z*Escape description text for bash comments.r   r   r*   )r:   s    r!   _escape_bash_descriptionr=   r   s'    <<c"D<<c"DKr#   actionc                 T    | t         j                  k(  ry| t         j                  k(  ryy)zMap 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>   s    r!   _map_completion_action_to_bashrB   y   s+     !'''	#//	/r#   r   .c                     g }|j                  d       |j                  d       |j                  d       |j                  t        |              |j                  d       |j                  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    s       r!   r   r      sh    * E	LL45	LL78	LL	LL1/BC	LL	LL+OYLMLr#   c                 	   t               }t               }| j                         D ]  }|j                  D ]h  }|j                         r|j                  j
                  s+|j                  j
                  D ]%  }|j                  d      s|j                  |       ' j |j                  D ]6  }|j                  D ]%  }|j                  d      r|j                  |       ' 8  g }|j                  d       |r0dj                  t        |            }	|j                  d|	 d       n|j                  d       |j                  d       |j                  d       |r0dj                  t        |            }
|j                  d	|
 d       n|j                  d
       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d        |j                  d!       |j                  d"       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d#       |j                  d$       |j                  d%       |j                  d&       |j                  d'       |j                  d(       |j                  d)       |j                  d       |j                  d       |j                  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)r   z  local options_with_values=''z  local options_with_values=''r   zK  # Build list of all valid command names (to distinguish from positionals)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   r   sorted)r   options_with_valuesall_commandsdataargumentrM   registered_commandcmd_namer    opts_strcmds_strs              r!   rD   rD      s   0 %5L&&(H##%(*<*<*A*A$..33Ds++//5 4 ' #'--.44**3/ $$X. 5 #0 ) E	LLWX 88F#6784XJa@A56	LL	LL^_88F<01-hZq9:./	LL	LLQR	LL)*	LL()	LL78	LL45	LL67	LL$%	LL!"	LL	LL12	LL=>	LLMN	LL&'	LL	LL	LLYZ	LLFG	LL./	LL	LL	LL	LL	LLNO	LL-.	LL78	LL!	LL&'	LL78	LL45	LL67	LL$%	LL!"	LL	LL12	LLMN	LL&'	LL	LL	LL*+	LLDE	LL23	LL*+	LL	LLDE	LL12	LL	LL	LLLr#   c                 2   g }|j                   rt        |j                         nd}|j                  rt        |j                        nd}|j                  d       |j                  d       t	        d | j                         D              }t        |dz         D ]=  }| j                         D cg c]  }t        |      |k(  s| }	}|	s3|j                  d| d       |dk(  r|j                  t        | dd	||             n|j                  d
       t        |	      D ]o  }|D 
cg c]  }
t        |
       }}
dj                  |      }|j                  d| d       |j                  t        | |d||             |j                  d       q |j                  d       |j                  d       |j                  d       |j                  d       @ |j                  d       |j                  d       |j                  d       |S c c}w c c}
w )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.
    r0   z4  # Determine command level and generate completionsz  case "${#cmd_path[@]}" inc              3   2   K   | ]  }t        |        y w)N)len)r1   paths     r!   r3   z-_generate_completion_logic.<locals>.<genexpr>9  s     A*@$CI*@s          r4   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]   r   _generate_completions_for_pathrR   r   r   )r   r   r   r    ra   rc   	max_depthdepthr^   relevant_pathscmdescaped_pathpath_strs                r!   rE   rE     s   * E*-..s~~&bJ030A0AE#++,rM	LLGH	LL./A/*>*>*@AAIy1}%+:+?+?+AX+A4SYRWEW$+AXtE7!_%A:LL7XWacpqrLL9:~.IMN# 8 =N88L1y
"562?D,Xbdqr ^, / LL&LL(LL&Z 1 &4 
LL	LL	LLL; Y  Os   /HH(Hcommand_pathra   rc   c                 X   || vr| dgS | |   }g }g }|j                   D cg c]"  }|j                         r|j                  s!|$ }	}|	D ]x  }
|
j                  j                  xs g D ]%  }|j                  d      s|j                  |       ' |
j                  D ]%  }|j                  d      s|j                  |       ' z g }|j                  D ]6  }|j                  D ]%  }|j                  d      s|j                  |       ' 8 |D ]/  }|j                  d      s||vs||vs|j                  |       1 |D ]/  }|j                  d      s||vs||vs|j                  |       1 |j                  |       g }|j                  D ]6  }|j                  D ]%  }|j                  d      r|j                  |       ' 8 |j                   D cg c]  }|j                  |j                  s|  }}|j                  d        |j                  | d       |r|j                  t        || d             n|j                  | d       |j                  | d       t        |j                         }|r-t        |j                   ||| d      }|j                  |       nV|r|j                  t        || d             n5|r|j                  t!        || d             n|j                  | d       |j                  | d	       |S c c}w c c}w )
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.
    r5   r   c                 6    | j                   | j                   S dS )Nr   )index)as    r!   <lambda>z0_generate_completions_for_path.<locals>.<lambda>  s    !''2Eqww'L1'Lr#   )keyzif [[ ${cur} == -* ]]; then  z  COMPREPLY=()elsefi)rJ   is_positional_onlyshowrL   rM   rN   r   	negativesrP   rQ   r   rq   sortr9   _check_if_prev_needs_value#_generate_value_completion_for_prev_generate_positional_completion)r   rn   r-   ra   rc   rU   r    optionsargkeyword_argsrV   rM   flag_commandsrW   flagrP   rX   positional_argsneeds_value_completionvalue_completion_liness                       r!   rg   rg   [  s   6 ?*(,'((<(DEG#'>>_>C9O9O9QVYV^V^C>L_ &&++1r1Ds#t$ 2 &&Ds#t$ ' ! M"mm&,,Ds#$$T* - ,
 ??3D$7D<UNN4   ??3D$7D<UNN4   NN=!H"mm*00H&&s+) 1 ,
 '+nn[ns		8MRURZRZsnO[LM	LLF889:,WmDEx~./	LLF84!7G!DNNHo&}"
 	+,	,X&}EF	4_PRmTUx~./	LLF82L{ `B \s"   L"L"L"L'/L'<L'c                 V   g }dt         dt        t            fd}d}t        |       D ]  \  }}|j                         s|} n |,t        |       D ]  \  }}t	        |j
                        s|} n || n| d| }|dn| |   }|s||j                   |||             |S t        |      dk(  r||j                   ||d   |             |S |j                  | d       t        |      D ]K  \  }	}
|j                  | d|	 d	       |j                   ||
| d
             |j                  | d       M |j                  | d       ||j                   ||| d
             n|j                  | d       |j                  | d       |j                  | 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.
    body_indentr   c                     | j                  d      }|r$|D cg c]  }t        |       }}t        ||      S t        t	        | j
                              }|r	| d| dgS | dgS c c}w )NTforcezCOMPREPLY=( $(compgen  -- "${cur}") )r5   )get_choicesr   r9   rB   r
   hint)rV   r   r,   r2   cleanedcompgen_flags         r!   	_emit_onez2_generate_positional_completion.<locals>._emit_one  s    &&T&25<=W(+WG=*7K@@56KHMM6Z["m#9,GXYZZ-|,-- >s   A(Nr_   r   zcase ${positional_count} inru   r4   r`       ;;  *)    COMPREPLY=()esac)	strlist	enumerateis_var_positionalr   r   r   r]   r   )r   r-   r    r   rest_idxir   head
rest_owneridxrV   s              r!   r~   r~     s    E. .c .  HO,3  "H - 0FAs) 1 '.?OIX4ND!)x/HJJ* 	Yz623$ L# 
TaJ.YtAw/0 L 	x<=>&t_MCLLF82cU!,-LL8xt_=>LLF86*+ - 	xt_%!LL:&?@LLF8#345xv&'xt_%Lr#   c                     | D ]F  }|j                         r|j                  j                  xs g D ]  }|j                  d      s  y H y)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)rK   rL   rM   rN   )rJ   rV   rM   s      r!   r|   r|     sL     ! **//525??3' 6 
 r#   rP   c           	         g }|j                  | d       |j                  | d       |j                  | d       |j                  | d       |j                  | d       d}| D ]  }|j                         r|j                  j                  xs g D cg c]  }|j	                  d      s| }}|sQd}|j                  d	      }	t        |j                        }
|D ]  }|j                  | d
| d       |	r7|	D cg c]  }t        |       }}|j                  t        || d             n9t        |
      }|r|j                  | d| d       n|j                  | d       |j                  | d          |r|j                  | d       |r|j                  t        || d             n5|r|j                  t        || d             n|j                  | d       |j                  | d       |j                  | d       |S g }|r|j                  t        ||             |S |r|j                  t        ||             |S |j                  | d       |S c c}w c c}w )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local _value_prev="${prev}"z9if [[ "$_value_prev" == "=" && $COMP_CWORD -ge 2 ]]; thenz+  _value_prev="${COMP_WORDS[COMP_CWORD-2]}"rw   zcase "$_value_prev" inFr   Tr   ru   r4   r`   z    COMPREPLY=( $(compgen r   r   r   r   r   r5   )r   rK   rL   rM   rN   r   r
   r   r   r   r9   rB   r~   )rJ   rP   r   r-   r    	has_casesrV   rM   rQ   r,   r>   r2   r   r   s                 r!   r}   r}     s   & E
 
LLF889:	LLF8TUV	LLF8HIJ	LLF82	LLF8123I#+#5#5#:#:#@b#@Z#@$T__UXEY#@Z	&&T&2&x}}5DLLF82dV1-.9@AA,Q/A4WoNO=fELLF8+El^Sd!efLLF8+;!<=LLF86*+  6 xt_%LL0fXT?KLLL8VHTX/Z[LLF8#345xv&'xt_% L LL06BC L LL8&QR L LLF8<01LU [ Bs   I83I8I=) __doc__r   typingr   cyclopts.annotationsr   cyclopts.completion._baser   r   r   r   r	   r
   cycloptsr   r   r"   r+   r   r9   r=   rB   dictrb   r   rD   rE   rg   r~   boolr|   r}   r0   r#   r!   <module>r      s   
   1  *E *c *c *Z  T#Y  S	 <3 3 +;  (%S/>9: 
 
#Y	Djd5c?N;Z6[ j`deh`i jZ<%S/>9:<< 
< 
#Y	<~_%S/>9:_S/_ _ c3h	_
 c?_ 
#Y_DES ET#Y EPT *MT#Y Mad Mimnqir Mr#   