o
    e(                     @  sl   d Z ddlmZ ddlZddlmZ i Zi Zdadd Z	dd Z
d	d
ddZdddZdd Zdd ZdS )zNContains methods that generate documentation for Gradio functions and classes.    )annotationsN)Callablec                 C  s   | a | tvrg t| < d S d S N)documentation_groupclasses_to_document)m r   KD:\Projects\ConvertPro\env\Lib\site-packages\gradio_client/documentation.pyset_documentation_group   s   r
   c           
      C  s   t | j}dd |dD }d }t|D ]\}}|d| d s,|d| d r. nq|d us>J d| d| j |d	|}|d	|d
 }t|d
 |D ]}|| drrJ d| d| j d||  d ||  qSd	||d
 | }	|	S )Nc                 S  s   g | ]}|  qS r   )strip).0liner   r   r	   
<listcomp>   s    z-extract_instance_attr_doc.<locals>.<listcomp>
zself.:z =zCould not find z in z"""   z-Found another attribute before docstring for : z
 start: )
inspect	getsource__init__split	enumerate
startswith__name__indexrangejoin)
clsattrcodelinesir   
start_lineend_linejZ
doc_stringr   r   r	   extract_instance_attr_doc   s0   
r&   F)inheritc                   s    fdd}|S )a  
    Defines the @document decorator which adds classes or functions to the Gradio
    documentation at www.gradio.app/docs.

    Usage examples:
    - Put @document() above a class to document the class and its constructor.
    - Put @document("fn1", "fn2") above a class to also document methods fn1 and fn2.
    - Put @document("*fn3") with an asterisk above a class to document the instance attribute methods f3.
    c                   s"   rd t | < tt |  f | S r   )classes_inherit_documentationr   r   append)r   fnsr'   r   r	   	inner_doc6   s   zdocument.<locals>.inner_docr   )r'   r+   r,   r   r*   r	   document+   s   r-   fnr   return(tuple[str, list[dict], dict, str | None]c                 C  s,  t | pd}|d}t | }g i g g f\}}}}d}	|D ]}
|
 }
|
dkr,d}	q|
drOd}	d|
v rNd	|
v rN|
dd
 d	d }||jkrNd}	q|
dkrVd}	q|	dkrf||
 rb|
nd q|
dsu|
 dksut	|
 |
ds|
 dksJ d| j d|
 |
dd }
|	dkr|

d}|dksJ d| j d|
 |
d| }|
|d d }|||< q|	dkr||
 q|	dkr||
 qd|}g }|j D ]r\}}|drq|dv r||vrq||j||d}||v r||= |jt jjkr,|j}t|tkrd| d }|jjdkr'|jj d}||d< n|d  durId!|d  v r>d"|d!< d#|d  v rId"|d#< || qt|dksfJ d| j d$d|  t|dkrpi }nt|d
kr|j|d d%}ni }t|dkrd|nd}||||fS )&a  
    Generates documentation for any function.
    Parameters:
        fn: Function to document
    Returns:
        description: General description of fn
        parameters: A list of dicts for each parameter, storing data for the parameter name, annotation and doc
        return: A dict storing data for the returned annotation and doc
        example: Code for an example use of the fn
     r   descriptionzParameters:	parameterzExample:example()r   r   ignorezReturns:r/   <br>    Documentation format for  has format error in line:    Nr      r   _)kwargsargs)name
annotationdoc"builtinsz()defaultrD   r@   TrA   z# documents nonexistent parameters: )rC   rD   )r   getdocr   	signaturerstripr   r   r)   r   printr   r   
parametersitemsrC   getrG   	Parameteremptytypestr	__class__
__module__lenkeysreturn_annotation)r.   r   doc_strZ	doc_linesrI   r2   rL   returnsZexamplesmoder   cZcolon_indexr3   parameter_docdescription_docparameter_docs
param_nameparamrG   return_docsexamples_docr   r   r	   document_fn@   s   











rc   c                 C  s  t | }|d u rdi dfS i }g }d}|dD ]u}| }|dr5d|vr5|d d  }g ||< q|dd dr_|ds_|d |d  }||dd	 d  }|||< q|dkro||	 rk|nd
 q|ds|	 rJ d| j
 d| || |dd   qd|v rd|d }|d= nd }| D ]\}	}
t|
trd
|
||	< qd|dd
}|||fS )Nr1   r2   r   r   r   r=   r   r9   r>   r8   r:   r;   r<   r4   )r   rH   r   rJ   endswithlowerr   r   r)   r   r   r   rM   
isinstancelistreplace)r   rX   tagsZdescription_linesrZ   r   tagvaluer4   keyvalr2   r   r   r	   document_cls   sD   





rn   c                  C  s  i } t  D ]\}}g | |< |D ]\}}t|r|n|j}t||\}}}}t|\}	}
}||j|	|
|||g d}|D ]V}|d}|rS|dd  }t	| |j
}nt	||}t|spt|}i }i }d}d|j d| }nt||\}}}}d }|rt||}|d |||i ||||d q<| | | |tv r|d t|< qqt  D ]O\}}t|D ]F\}\}}tD ]=}t|rt||r||krt| D ](}t|}zt||d	 |d
< W n ttfy   Y nw | | | d | qqqq| S )N)classrB   r2   ri   rL   rY   r4   r+   *r   r1   zgr..r+   )r.   rB   r2   ri   rL   rY   r4   override_signaturerB   r2   )r   rM   r   
isfunctionr   rc   rn   r   r   getattr__call__callablerR   r&   r)   r(   r   isclass
issubclassdict
ValueErrorAssertionError)ZdocumentationrZ   Z
class_listr   r+   Zfn_to_documentr?   r\   Z
return_docZcls_descriptionZcls_tagsZcls_exampleZcls_documentationfn_nameZinstance_attribute_fnr.   r]   r^   ra   rb   rr   r"   Zsuper_classZinherited_fnr   r   r	   generate_documentation   s   



6r}   )r.   r   r/   r0   )__doc__
__future__r   r   typingr   r   r(   r   r
   r&   r-   rc   rn   r}   r   r   r   r	   <module>   s    
[$