
    '<i>                     d   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lmZ ddd	ed
efdZded
efdZded
efdZd	edeeedf   ef   d
ee   fdZded
ef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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df   d	eded
ee   f
dZdeedf   d
ee   fdZd	ededeedf   deedf   d
ee   f
dZded	ededed
ee   f
d Zd!ed	ededed
ee   f
d"Zdeedf   d	ed
efd#Zd$d%ded
efd&Z y)'zFish 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)CommandSpecappr
   	prog_namereturnc                     |rt        j                  d|      st        d|d      t        |       }d| ddg}t	        d |j                         D              }|r,|j                  t        ||             |j                  d       | j                  rt        | j                        nd}| j                  rt        | j                        nd}|j                  t        ||||             d	j                  |      d	z   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              3   8   K   | ]  }t        |      d kD    yw)r   N)len).0paths     ~/home/jay/workspace/.worktrees/task-2057-dev2/scripts/.codegraph-venv/lib/python3.12/site-packages/cyclopts/completion/fish.py	<genexpr>z-generate_completion_script.<locals>.<genexpr>7   s     Oc$i!mOs    
)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#   s          r   generate_completion_scriptr)      s    ( BHH%8)D.ym;klmm-c2O !,!
E O8L8L8NOO/	?KLR*-..s~~&bJ030A0AE#++,rM	LL&	:}]^99Ud""    textc                 &    | j                  dd      S )z&Escape single quotes for fish strings.'z'\'')replacer+   s    r   _escape_fish_stringr0   D   s    <<W%%r*   c                 `    | j                  dd      } | j                  dd      } t        |       S )z!Escape description text for fish.r    )r.   r0   r/   s    r   _escape_fish_descriptionr4   I   s-    <<c"D<<c"Dt$$r*   r&   .c                 
   t               }|j                         D ]y  }|j                  D ]h  }|j                         r|j                  j
                  s+|j                  j
                  D ]%  }|j                  d      s|j                  |       ' j { d|  d}dd| ddg}|r7dj                  d	 t        |      D              }|j                  d
| d       n|j                  d       |j                  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 subcommandsr2   c              3   2   K   | ]  }t        |        y wNr0   )r   opts     r   r   z-_generate_helper_functions.<locals>.<genexpr>s   s     `S 3C 8`   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 $wordr>       endz8    # Check if subcommand sequence matches expected pathz2    if test (count $subcommands) -ne (count $argv)z        return 1r?   z"    for i in (seq 1 (count $argv))z-        if test $subcommands[$i] != $argv[$i]z            return 1r>   r?   z    return 0end)setvalues	argumentsis_flag	parametername
startswithaddr%   sortedr    r   )	r   r&   options_with_valuesdataargumentrF   	func_namer'   escaped_optss	            r   r   r   P   s   $ %&&( 6 	6H##%(*<*<*A*A$..33 6Ds++//56	66 )N3I@
I;+ 	E xx`FK^D_``7~QGH89	LL	
 B Lr*   actionc                 T    | t         j                  k(  ry| t         j                  k(  ryy)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)rO   s    r   _map_completion_action_to_fishrS      s+     !'''!---6r*   r!   r#   c           
          g }t        | j                               D ]W  \  }}|j                  t        | ||||             |t	        | j                         t              k7  sG|j                  d       Y |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   )rI   itemsr   _generate_completions_for_pathmaxr   r   r    )r&   r   r!   r#   r'   command_path_datas          r   r$   r$      s{    0 E%o&;&;&=> e*	
 33353??LL Lr*   rY   c                    || vrg S | |   }g }t        ||      }|j                  t        ||||             |j                  D cg c]"  }|j	                         r|j
                  s!|$ }	}|	s|s|r|j                  t        |             |j                  t        ||||             |j                  t        |	|||j                               |j                  t        |j                  |||j                               |S c c}w )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.
    )_get_condition_for_pathr    _generate_subcommand_completionsrC   is_positional_onlyshow_generate_option_section_header"_generate_help_version_completions!_generate_keyword_arg_completionshelp_format$_generate_command_option_completionscommands)
r&   rY   r   r!   r#   rK   r'   	conditionargkeyword_argss
             r   rW   rW      s    6 ?*	<(DE'i@I	LL1$iQZ[\#'>>_C9O9O9QVYV^V^C_L_z]4\BC7	9jZghi6|YPY[_[k[klm9$--T]_c_o_opqL `s   DD(DrK   rf   c                    | j                   D cg c]'  }|j                  D ]  }|j                  d      r| ) }}}|sg S g }|r$|j                  ddj	                  |              n|j                  d       | j                   D ]y  }|j                  D ]h  }|j                  d      rt        |j                  | j                        }	t        |	      }
t        |      }|j                  d| d| d| d|
 d	       j { |S c c}}w )	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.
    r6   z# Subcommands for: r2   z# Root-level commandscomplete -c z -a '' -d 'r-   )
re   namesrG   r    r%   _get_description_from_appr   rc   r4   r0   )rK   rY   r   rf   registered_commandrF   re   r'   cmd_namedescescaped_descescaped_cmds               r   r]   r]     s)   2 (,}}#ASAYAY9=aeapapqtauH  	E*388L+A*BCD,-"mm 	h*00 	hH""3',-?-C-CTEUEUVD3D9L-h7KLL<	{!I;eK=PVWcVddefg	h	h L/s
   %DDc                 6    | rddj                  |        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: r2   z# Root-level optionsr%   )rY   s    r   r`   r`   :  s*     !#((<"8!9:;;"##r*   c           
         g }|D ]u  }|j                  d      r!|dd }|j                  d|  d| d| d       5|j                  d      sGt        |      dk(  sV|d	   }|j                  d|  d| d
| d       w |D ]u  }|j                  d      r!|dd }|j                  d|  d| d| d       5|j                  d      sGt        |      dk(  sV|d	   }|j                  d|  d| d
| d       w |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.
    --   Nrj   r2    -l z$ -d 'Display this message and exit.'r6       -s z" -d 'Display application version.')rG   r    r   )r   rf   r!   r#   r'   flag	long_name
short_names           r   ra   ra   L  s(   0 E u??4 QRILL<	{!I;d9+Mqrs__S!c$i1naJLL<	{!I;d:,Nrstu  s??4 QRILL<	{!I;d9+Mopq__S!c$i1naJLL<	{!I;d:,Npqrs Lr*   rh   rc   c                 t   g }| D ]*  }t        |j                  j                  xs d|      }t        |      }|j	                         }|j                  d      }	t        |j                        }
|j                  j                  xs g D ]  }|j                  d      s|j                  d      r|dd }d	| d
| d| g}n!t        |      dk(  r|d   }d	| d
| d| g}nZ|r|j                  d| d       n|	rK|	D cg c]  }t        t        |             }}d
j                  |      }|j                  d| d| d       n:t        |
      }|r|j                  | d| d       n|j                  d| d       |j                  d
j                  |              |j                   D ]{  }|j                  d      s|j                  d      r$|dd }|j                  d	| d
| d| d| d	       Jt        |      dk(  sY|d   }|j                  d	| d
| d| d| d	       } - |S c c}w )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)forcer6   rv   rw   Nrj   r2   rx   ry   rz   z-d 'r-   z-x -a 'rk    -d 'z-r -d ')r	   rE   helpr4   rD   get_choicesr   hintrF   rG   r   r    r0   r   r%   rS   	negatives)rh   r   rf   rc   r'   rL   rp   rq   rD   choicesrO   rF   r|   
line_partsr}   cescaped_choiceschoices_straction_flagss                      r   rb   rb   y  sw   0 E  -iH..339r+N/5""$&&T&2&x}}5&&++1r 	/D??3't$ H	 ,YKq4	{ST
Ta!!W
 ,YKq4
|TU
!!Da"89V]"^QR#67H7K#L"^"^!hh7!!GK=|nA"NO=fE%%eL>&KL%%~Q&?@LL*-.5	/8 && 		iD??3't$ H	|I;a	{$ykQVWcVddefgTa!!W
|I;a	{$zlRWXdWeefgh		iI-i^ L/ #_s   H5re   c                 n   g }| D ]  }|j                   D ]  }|j                  d      st        |j                  |      }t	        |      }|j                  d      r$|dd }	|j                  d| d| d|	 d| d		       kt        |      dk(  sz|d
   }
|j                  d| d| d|
 d| d		         |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.
    r6   rv   rw   Nrj   r2   rx   r   r-   ry   rz   )rl   rG   rm   r   r4   r    r   )re   r   rf   rc   r'   rn   ro   rp   rq   r|   r}   s              r   rd   rd     s    0 E& i*00 	iH&&s+,-?-C-C[QD3D9L""4($QRL	|I;a	{$ykQVWcVddefgX!#%a[
|I;a	{$zlRWXdWeefgh	ii Lr*   c                 V    | syd| d}dj                  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_subcommandr7   r8   r2   c              3   2   K   | ]  }t        |        y wr:   r;   )r   cmds     r   r   z*_get_condition_for_path.<locals>.<genexpr>  s     QS 3C 8Qr=   z-n 'r-   rt   )rY   r   rM   escaped_commandss       r   r\   r\     sD     ))N3IxxQLQQ)A./q11r*   cmd_appzApp | CommandSpecc                     ddl m} 	  || j                  d      }|j                  xs d}t        ||      S # t        $ r t        | j                  xs d      }Y 1w xY w)zExtract description from App.

    Parameters
    ----------
    cmd_app : App | CommandSpec
        Command app or spec.
    help_format : str
        Help text format.

    Returns
    -------
    str
        Description text.
    r   )docstring_parse	plaintextr   r   )cyclopts.help.helpr   r   short_description	Exceptionstrr	   )r   rc   r   parsedr+   s        r   rm   rm     s_     3' {;''-2 [11  '7<<%2&'s   #8 "AA)!__doc__r   typingr   cyclopts.completion._baser   r   r   r   r   r	   cycloptsr
   cyclopts.command_specr   r   r)   r0   r4   dictr"   listr   rS   r$   rW   r]   r`   ra   rb   rd   r\   rm   r   r*   r   <module>r      s   
    1)#E )#c )#c )#X&c &c &
%3 %3 %II%S/>9:I 
#YIX+;  ('%S/>9:'' c3h' c?	'
 
#Y'T+%S/>9:+S/+ + c3h	+
 c?+ 
#Y+\/
/S// / 	/
 
#Y/d$%S/ $d3i $$*** c3h* c?	*
 
#Y*ZIII I 	I
 
#YIX))) ) 	)
 
#Y)X2%S/ 2c 2c 2.2': 2 2QT 2r*   