o
    i>%                     @   s^   d Z ddlmZmZ erddlmZ ddlmZ ddlm	Z	 ddlm
Z
mZ G dd dZd	S )
z,Base utilities for documentation generation.    )TYPE_CHECKINGAny)App)	HelpPanel)CommandSpec)
format_docformat_usagec                   @   sZ  e Zd ZdZed&dddee dB deeeef fddZedee dB d	ed
edee fddZ	ed	eddddde
de
f
ddZeddde
dee fddZedddededB fddZedddedB fddZed'dedee dedefddZe	 d(d!eeedf  de
deeeeedf  f fd"d#Zed(ddde
fd$d%ZdS ))BaseDocGeneratorz>Base class for documentation generators with shared utilities.Nappr   command_chainreturnc                 C   sF   |s| j d }|}|}n|r|d n| j d }d|}|}|||fS )ad  Get app name, full command path, and title.

        Parameters
        ----------
        app : App
            The cyclopts App instance.
        command_chain : Optional[List[str]]
            Chain of parent commands leading to this app.

        Returns
        -------
        Tuple[str, str, str]
            (app_name, full_command, title)
        r    )namejoin)r
   r   app_namefull_commandtitle r   X/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/cyclopts/docs/base.pyget_app_info   s   


zBaseDocGenerator.get_app_infocommand_namer   c                 C   s   | r| |g S ||gS )ar  Build command chain for a subcommand.

        Parameters
        ----------
        command_chain : Optional[List[str]]
            Current command chain.
        command_name : str
            Name of the subcommand.
        app_name : str
            Name of the root app.

        Returns
        -------
        List[str]
            Updated command chain.
        r   )r   r   r   r   r   r   build_command_chain+   s   
z$BaseDocGenerator.build_command_chainsubapp
parent_appinclude_hiddenc                 C   s<   | |j v s
| |jv rdS t|t|sdS |s|jsdS dS )a  Check if a command should be skipped.

        Parameters
        ----------
        command_name : str
            Name of the command.
        subapp : App
            The subcommand App instance.
        parent_app : App
            The parent App instance.
        include_hidden : bool
            Whether to include hidden commands.

        Returns
        -------
        bool
            True if command should be skipped.
        TF)_help_flags_version_flags
isinstancetypeshow)r   r   r   r   r   r   r   should_skip_commandB   s   
z$BaseDocGenerator.should_skip_commandpanelr   c                 C   s   |r| j S dd | j D S )aK  Filter help panel entries based on visibility settings.

        Parameters
        ----------
        panel : HelpPanel
            The help panel to filter.
        include_hidden : bool
            Whether to include hidden entries.

        Returns
        -------
        List[Any]
            Filtered panel entries.
        c                 S   *   g | ]}|j rtd d |j D s|qS )c                 s   s,    | ]}| d p| dp|dkV  qdS )--help	--version-hN)
startswith.0nr   r   r   	<genexpr>w   s   * zBBaseDocGenerator.filter_help_entries.<locals>.<listcomp>.<genexpr>namesallr(   er   r   r   
<listcomp>t       z8BaseDocGenerator.filter_help_entries.<locals>.<listcomp>)entries)r!   r   r   r   r   filter_help_entriesa   s
   z$BaseDocGenerator.filter_help_entrieshelp_formatc                 C   s   t | |}|S )a  Extract app description.

        Parameters
        ----------
        app : App
            The App instance.
        help_format : str
            Help format type.

        Returns
        -------
        Optional[Any]
            The extracted description object, or None.
        )r   )r
   r4   descriptionr   r   r   extract_descriptionz   s   
z$BaseDocGenerator.extract_descriptionc                 C   s(   | j dur| j r| j S dS t| g }|S )zExtract usage string.

        Parameters
        ----------
        app : App
            The App instance.

        Returns
        -------
        Optional[Any]
            The extracted usage object, or None.
        N)usager   )r
   r7   r   r   r   extract_usage   s   

zBaseDocGenerator.extract_usage$
usage_textprefixc                 C   s   | sdS d| v r|  dd } |rd|nd}| dd}t|dkr7|r7| d| d|d  }| S |rD| d| }| S | d|  }| S )ap  Format usage line with proper command path.

        Parameters
        ----------
        usage_text : str
            Raw usage text.
        command_chain : List[str]
            Command chain for the app.
        prefix : str
            Prefix for the usage line (e.g., "$").

        Returns
        -------
        str
            Formatted usage line.
         zUsage:r   N   )replacestripr   splitlen)r:   r   r;   r   parts
usage_liner   r   r   format_usage_line   s   z"BaseDocGenerator.format_usage_lineFhelp_panels_with_groupsc                 C   sz  g g g g d}| D ]\}}|s|r|j sq	|jdkrG|s=dd |jD }|r<t|||j|j|jd}|d ||f q	|d ||f q	|jdkr|j}|dkr]|d	 ||f q	|rm|d
vrm|d ||f q	g }g }	|jD ]}
|
jo}|
jdu }|r||
 qt|	|
 qt|rt||d|j|jd}|d	 ||f |	rt||	d|j|jd}|d ||f q	|S )a  Categorize help panels by type.

        Parameters
        ----------
        help_panels_with_groups : List[Tuple[Any, HelpPanel]]
            List of (group, panel) tuples.
        include_hidden : bool
            Whether to include hidden panels.

        Returns
        -------
        Dict[str, List[Tuple[Any, HelpPanel]]]
            Categorized panels with keys: 'commands', 'arguments', 'options', 'grouped'.
        )commands	argumentsoptionsgroupedcommandc                 S   r"   )c                 s   s    | ]}|d v V  qdS ))r#   r$   r%   Nr   r'   r   r   r   r*      s    z@BaseDocGenerator.categorize_panels.<locals>.<listcomp>.<genexpr>r+   r.   r   r   r   r0      r1   z6BaseDocGenerator.categorize_panels.<locals>.<listcomp>)r2   r   r5   formatrF   	parameter	ArgumentsrG   )
ParametersOptionsrI   NrO   rH   )	r   rK   r2   r   r   r5   appendrequireddefault)rE   r   resultgroupr!   filtered_entries
panel_copyr   argsoptsentryis_positionalr   r   r   categorize_panels   sX   


z"BaseDocGenerator.categorize_panelsc                 c   sx    | j sdS | j  D ].\}}|| jv s|| jv rqt|tr$|| n|}t|t| s.q|s4|js4q||fV  qdS )a  Iterate through app commands, yielding valid resolved subapps.

        Automatically resolves CommandSpec instances to App instances.

        Parameters
        ----------
        app : App
            The App instance.
        include_hidden : bool
            Whether to include hidden commands.

        Yields
        ------
        Tuple[str, App]
            (command_name, resolved_subapp) for each valid command.
        N)		_commandsitemsr   r   r   r   resolver   r   )r
   r   r   app_or_specr   r   r   r   iterate_commands  s   
z!BaseDocGenerator.iterate_commands)N)r9   )F)__name__
__module____qualname____doc__staticmethodliststrtupler   r   boolr    r   r3   r6   r8   rD   dictr[   r`   r   r   r   r   r	      s6    ,( "#Gr	   N)rd   typingr   r   cyclopts.corer   cyclopts.helpr   cyclopts.command_specr   r   r   r	   r   r   r   r   <module>   s    