U
    ={f                     @  s~   d Z ddlmZ ddlZddlZddlZddlmZ G dd dejZ	ddd	d
dZ
dddddZdddddddZdS )z4Utilities related to attribute docstring extraction.    )annotationsN)Anyc                      sV   e Zd Zdd fddZddd fdd	Zd
ddddZdddddZ  ZS )DocstringVisitorNone)returnc                   s    t    d | _i | _d | _d S N)super__init__targetattrsprevious_node_type)self	__class__ b/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/pydantic/_internal/_docs_extraction.pyr	      s    
zDocstringVisitor.__init__zast.ASTr   )noder   c                   s   t  |}t|| _|S r   )r   visittyper   )r   r   Znode_resultr   r   r   r      s    
zDocstringVisitor.visitzast.AnnAssignc                 C  s   t |jtjr|jj| _d S r   )
isinstancer
   astNameid)r   r   r   r   r   visit_AnnAssign   s    z DocstringVisitor.visit_AnnAssignzast.Exprc                 C  sR   t |jtjrNt |jjtrN| jtjkrNt|jj}| j	rH|| j
| j	< d | _	d S r   )r   valuer   Constantstrr   	AnnAssigninspectcleandocr
   r   )r   r   Z	docstringr   r   r   
visit_Expr   s    
zDocstringVisitor.visit_Expr)__name__
__module____qualname__r	   r   r   r    __classcell__r   r   r   r   r   
   s   r   z	list[str]r   )sourcer   c                 C  s(   t d| }|dr$d| }|S )N ) 	zdef dedent_workaround():
)textwrapdedentjoin
startswith)r%   dedent_sourcer   r   r   _dedent_source_lines'   s    

r.   z	type[Any]zlist[str] | None)clsr   c           	      C  s   t  }|rt |t | kr|j}zt |\}}W n tk
rL   Y nX t ||d d  }t|}zt	|}W n t
k
r   Y nHX |jd }t|tjr|jdkr|jd }t|tjr|j| jkr|S |j}qd S )N   r   Zdedent_workaround)r   currentframe	getmodulef_lineno
findsourceOSErrorgetblockr.   r   parseSyntaxErrorbodyr   FunctionDefnameClassDefr!   f_back)	r/   framelnumlines_Zblock_linesr-   Z
block_treestmtr   r   r   _extract_source_from_frame2   s(    

rC   Fboolzdict[str, str])r/   use_inspectr   c                 C  sf   |r2zt | \}}W q: tk
r.   i  Y S X nt| }|sBi S t|}t }|t| |j	S )aX  Map model attributes and their corresponding docstring.

    Args:
        cls: The class of the Pydantic model to inspect.
        use_inspect: Whether to skip usage of frames to find the object and use
            the `inspect` module instead.

    Returns:
        A mapping containing attribute names and their corresponding docstring.
    )
r   getsourcelinesr5   rC   r.   r   r   r   r7   r   )r/   rE   r%   rA   r-   visitorr   r   r   extract_docstrings_from_clsP   s    rH   )F)__doc__
__future__r   r   r   r)   typingr   NodeVisitorr   r.   rC   rH   r   r   r   r   <module>   s   