U
    \ShTn                     @  s  d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlmZmZmZmZ ddlmZ ddlmZmZmZmZmZmZ ddlmZ ddl
mZmZmZmZmZ dd	lm Z m!Z!m"Z"m#Z#m$Z$m%Z% dd
l&m'Z( ddl)m*Z* ddl+m,Z,m-Z- e*.e/Z0e1dej2Z3dddddZ4ddddddddZ5dddddZ6dddddZ7dddddZ8dddd d!Z9dd"dd#d$Z:dd%dd&d'Z;dd(dd)d*Z<dd(d+d,d-Z=dd(d+d.d/Z>dddd0d1Z?dd(dd2d3Z@dddd4d(d5d6d7ZAdddd4d(d5d8d9ZBdd(d+d:d;ZCdd(dd<d=ZDd>d(d?d@dAZEdd(ddBdCZFdd(ddDdEZGdd(ddFdGZHdd(ddHdIZIdd(ddJdKZJdd(ddLdMZKdd(ddNdOZLdd(ddPdQZMdd(ddRdSZNdd(ddTdUZOddVdddWdXdYZPddVdZd[d\ZQddVd(d]d^d_ZRG d`da daZSG dbdc dcZTG ddde deZUG dfdg dge"eVe f ZWdhd(didjdkZXdli fdhd(dmdndodpdqZYddnd%d%dndrdsdtZZddnd(d(d(dVdvdwdxZ[dVdndydzd{Z\dd}dVdnd~ddZ]ePdlddfddhd(dd4d4dddZ^dS )z&Helpers for inspecting Python modules.    )annotationsN)cached_propertypartialpartialmethodsingledispatchmethod)import_module)	Parameterisasyncgenfunctionisclassismethodismethoddescriptorismodule)StringIO)ClassMethodDescriptorTypeMethodDescriptorType
MethodType
ModuleTypeWrapperDescriptorType)AnyCallableDictMappingSequencecast)unparse)logging)
ForwardRefstringify_annotationz at 0x[0-9a-f]{8,16}(?=>)r   objreturnc                 C  s>   z t | dr| W S t| W S W n tk
r8   |  Y S X dS )z?Get an original object from wrapped object (wrapped functions).Z__sphinx_mock__N)hasattrinspectunwrap
ValueErrorr    r&   F/root/rtd-docs/venv/lib/python3.8/site-packages/sphinx/util/inspect.pyr#   +   s    
r#   stopzCallable | None)r   r)   r    c                C  s^   |r|| r| S t | r | j} q t| r<t| dr<| j} q t| sLt| rT| j} q | S q dS )zx
    Get an original object from wrapped object (unwrapping partials, wrapped
    functions, and other decorators).
    __wrapped__N)		ispartialfuncr"   	isroutiner!   r*   isclassmethodisstaticmethod__func__)r   r)   r&   r&   r'   
unwrap_all8   s    r1   zSequence[str] | Nonec                 C  sH   t | dd}|dkrdS t|ttfr<tdd |D r<|S t|dS )zGet __all__ attribute of the module as dict.

    Return None if given *obj* does not have __all__.
    Raises ValueError if given *obj* have invalid __all__.
    __all__Nc                 s  s   | ]}t |tV  qd S N
isinstancestr.0er&   r&   r'   	<genexpr>T   s     zgetall.<locals>.<genexpr>)safe_getattrr5   listtupleallr$   )r   r2   r&   r&   r'   getallJ   s     r?   zMapping[str, Any]c                 C  s"   t | dd}t|tr|S i S dS )z,Get __annotations__ from given *obj* safely.__annotations__Nr;   r5   r   )r   r@   r&   r&   r'   getannotationsZ   s    
rB   c                 C  s"   t | dd}t|tr|S i S dS )z(Get __globals__ from given *obj* safely.__globals__NrA   )r   rC   r&   r&   r'   
getglobalsc   s    
rD   ztuple[type, ...]c                 C  s"   t | dd}t|tr|S dS dS )z$Get __mro__ from given *obj* safely.__mro__Nr&   )r;   r5   r=   )r   rE   r&   r&   r'   getmrol   s    
rF   ztuple[Any, ...] | Nonec                 C  sF   t | sdS t| di }|d}t|tr>t|dkr>|S dS dS )z%Get __orig_bases__ from *obj* safely.N__dict____orig_bases__r   )r"   r
   r;   getr5   r=   len)r   rG   rH   r&   r&   r'   getorigbasesu   s    

rK   zdict | Nonec                 C  sj   t | stt| dd}|dkr&dS t|tr4|S t|trF|diS t|ttfrbdd |D S t	dS )zGet __slots__ attribute of the class as dict.

    Return None if gienv *obj* does not have __slots__.
    Raises TypeError if given *obj* is not a class.
    Raises ValueError if given *obj* have invalid __slots__.
    	__slots__Nc                 S  s   i | ]
}|d qS r3   r&   r7   r&   r&   r'   
<dictcomp>   s      zgetslots.<locals>.<dictcomp>)
r"   r
   	TypeErrorr;   r5   dictr6   r<   r=   r$   )r   rL   r&   r&   r'   getslots   s    


rP   boolc                 C  sJ   t jdd dkrt| tjS t| dd}t| dd}|dkoD|dkS dS )z)Check the if object is a kind of NewType.N   )   
   
__module____qualname__typingzNewType.<locals>.new_type)sysversion_infor5   rW   NewTyper;   )r   rU   rV   r&   r&   r'   	isNewType   s
    r[   )xr    c                 C  s   t | ot| tjS )z(Check if the object is subclass of enum.)r"   r
   
issubclassenumEnumr\   r&   r&   r'   isenumclass   s    ra   c                 C  s   t | tjS )z)Check if the object is attribute of enum.)r5   r^   r_   r`   r&   r&   r'   isenumattribute   s    rb   c                 C  s   t | r| j} q | S )zfGet an original object from partial object.

    This returns given object itself if not partial.
    )r+   r,   r%   r&   r&   r'   	unpartial   s    rc   c                 C  s   t | ttfS )zCheck if the object is partial.)r5   r   r   r%   r&   r&   r'   r+      s    r+   
str | None)r   clsnamer    c                 C  sr   t | trdS t| r0| jdk	r0t| jr0dS |rn|rnt }t|D ]&}|j	||}||k	rFt
|  S qFdS )z#Check if the object is classmethod.TNF)r5   classmethodr"   r   __self__r
   objectrF   rG   rI   r.   )r   re   rf   placeholderbaseclsmethr&   r&   r'   r.      s    
r.   c                 C  sL   t | trdS |rH|rHt|d|gD ]"}|j|}|r$t |t  S q$dS )z$Check if the object is staticmethod.TrE   F)r5   staticmethodgetattrrG   rI   )r   re   rf   rk   rl   r&   r&   r'   r/      s    
r/   c                   s   t  fdddD S )z/Check if the object is some kind of descriptor.c                 3  s   | ]}t t |d V  qd S r3   )callabler;   )r8   itemr`   r&   r'   r:      s   zisdescriptor.<locals>.<genexpr>)__get____set__
__delete__)anyr`   r&   r`   r'   isdescriptor   s    ru   c                 C  s   t | dddkS )z)Check if the object is an abstractmethod.__isabstractmethod__FTr;   r%   r&   r&   r'   isabstractmethod   s    rx   r   )methodr    c                 C  s   t | dddk	S )z&Check if the method is a bound method.rh   Nrw   )ry   r&   r&   r'   isboundmethod   s    rz   c                 C  s*   z| j jdkW S  tk
r$   Y dS X dS )z6Check if the object is a function or method in cython.Zcython_function_or_methodFN)	__class____name__AttributeErrorr%   r&   r&   r'   is_cython_function_or_method   s    r~   c                 C  s   t | rdS t| rt| }t|s8t|s8t |r<dS t|rHdS t |rVdS t	|t
ttfrjdS t|jdkr|dS dS dS )z4Check if the object is an attribute like descriptor.TFZinstancemethod)r"   isdatadescriptorru   r#   
isfunction	isbuiltinr   r~   r
   r5   r   r   r   typer|   )r   Z	unwrappedr&   r&   r'   isattributedescriptor   s&    

r   c                 C  s*   t | o(t| do(t| do(| jjdkS )z/Check if the object is singledispatch function.dispatchregister	functools)r"   r   r!   r   rU   r%   r&   r&   r'   is_singledispatch_function  s    

r   c                 C  s
   t | tS )z-Check if the object is singledispatch method.)r5   r   r%   r&   r&   r'   is_singledispatch_method  s    r   c                 C  s   t t| S )z Check if the object is function.)r"   r   r1   r%   r&   r&   r'   r   #  s    r   c                 C  s   t t| S )zCheck if the object is builtin.)r"   r   r1   r%   r&   r&   r'   r   (  s    r   c                 C  s   t t| S )z(Check is any kind of function or method.)r"   r-   r1   r%   r&   r&   r'   r-   -  s    r-   c                 C  s&   ddddd}t | |d} t| S )z*Check if the object is coroutine-function.r   rQ   r   c                 S  s&   t | st| st| rdS t| dS )z2Check if the object is wrapped coroutine-function.Fr*   )r/   r.   r+   r!   r%   r&   r&   r'   iswrappedcoroutine4  s    z/iscoroutinefunction.<locals>.iswrappedcoroutiner(   )r1   r"   iscoroutinefunction)r   r   r&   r&   r'   r   2  s    r   c                 C  s   t | ttfS )z Check if the object is property.)r5   propertyr   r%   r&   r&   r'   
isproperty@  s    r   c                 C  sH   t | tjrdS ttdr*t | tjr*dS ttdrDt | tjrDdS dS )z$Check if the object is GenericAlias.TGenericAlias_SpecialGenericAliasF)r5   rW   _GenericAliasr!   typesr   r   r%   r&   r&   r'   isgenericaliasE  s    



r   r6   )r   rf   defargsr    c                 G  s   zt | |f| W S  tk
r| } zLz| j| W  W Y 8S  tk
rL   Y nX |rb|d  W Y S t||W 5 d}~X Y nX dS )z;A getattr() that turns all exceptions into AttributeErrors.r   N)rn   	ExceptionrG   r}   )r   rf   r   excr&   r&   r'   r;   R  s    r;   )ri   r    c              
     sJ  t  trNzt }W n tk
r*   Y qX  fdd|D }dd| S nt  trzt }W n tk
rx   Y qX dddd |D  S nft  trzt }W n tk
r   Y qX dddd |D  S n t  tj	r j
j d j S zt }W n* tk
r0 } z
t|W 5 d	}~X Y nX td
|}|ddS )zFA repr() implementation that returns text safe to use in reST context.c                 3  s&   | ]}d t |t  | f V  qdS )z%s: %sNobject_description)r8   keyri   r&   r'   r:   p  s   z%object_description.<locals>.<genexpr>z{%s}, c                 s  s   | ]}t |V  qd S r3   r   r8   r\   r&   r&   r'   r:   z  s     zfrozenset({%s})c                 s  s   | ]}t |V  qd S r3   r   r   r&   r&   r'   r:     s   .N 
 )r5   rO   sortedr   joinsetrN   	frozensetr^   r_   r{   r|   rf   reprr$   memory_address_resubreplace)ri   Zsorted_keysitemsZsorted_valuessr   r&   r   r'   r   h  s>    



r   )r   	attr_namer    c                   sp   z"t | }t fdd|D }W n tk
r8   Y dS X zt|d}W n tk
r^   Y dS X tt|d|kS )zIf attr_name is implemented at builtin class, return True.

        >>> is_builtin_class_method(int, '__init__')
        True

    Why this function needed? CPython implements int.__init__ by Descriptor
    but PyPy implements it by pure Python code.
    c                 3  s"   | ]} t |d i kr|V  qdS )rG   Nrw   )r8   cr   r&   r'   r:     s      z*is_builtin_class_method.<locals>.<genexpr>Fr|   N)rF   nextStopIterationr;   r}   rn   builtins)r   r   mrore   rf   r&   r   r'   is_builtin_class_method  s    	r   c                   @  s>   e Zd ZdZdddddZddd	d
dZddddZdS )DefaultValuezKA simple wrapper for default value of the parameters of overload functions.r6   None)valuer    c                 C  s
   || _ d S r3   r   )selfr   r&   r&   r'   __init__  s    zDefaultValue.__init__ri   rQ   otherr    c                 C  s
   | j |kS r3   r   r   r   r&   r&   r'   __eq__  s    zDefaultValue.__eq__r    c                 C  s   | j S r3   r   r   r&   r&   r'   __repr__  s    zDefaultValue.__repr__N)r|   rU   rV   __doc__r   r   r   r&   r&   r&   r'   r     s   r   c                   @  sZ   e Zd ZdZdddddZdddd	Zd
ddddZddddZddddZdS )TypeAliasForwardRefzPseudo typing class for autodoc_type_aliases.

    This avoids the error on evaluating the type inside `get_type_hints()`.
    r6   r   rf   r    c                 C  s
   || _ d S r3   rf   )r   rf   r&   r&   r'   r     s    zTypeAliasForwardRef.__init__r   c                 C  s   d S r3   r&   r   r&   r&   r'   __call__  s    zTypeAliasForwardRef.__call__r   rQ   r   c                 C  s
   | j |kS r3   r   r   r&   r&   r'   r     s    zTypeAliasForwardRef.__eq__intc                 C  s
   t | jS r3   )hashrf   r   r&   r&   r'   __hash__  s    zTypeAliasForwardRef.__hash__c                 C  s   | j S r3   r   r   r&   r&   r'   r     s    zTypeAliasForwardRef.__repr__N)	r|   rU   rV   r   r   r   r   r   r   r&   r&   r&   r'   r     s   r   c                   @  s2   e Zd ZdZddddddZddd	d
dZdS )TypeAliasModulez-Pseudo module class for autodoc_type_aliases.r6   dict[str, str]r   )modnamemappingr    c                 C  s   || _ || _d | _d S r3   )_TypeAliasModule__modname_TypeAliasModule__mapping_TypeAliasModule__module)r   r   r   r&   r&   r'   r     s    zTypeAliasModule.__init__r   r   c                   s   d td | j|g}|| jkr.t| j| S |d   fdd| j D }|r\t||S z
t|W S  tk
r   | j	d krt| j| _	t
| j	| Y S X d S )Nr   c                   s    i | ]\}}|  r||qS r&   
startswithr8   kvprefixr&   r'   rM     s     
  z/TypeAliasModule.__getattr__.<locals>.<dictcomp>)r   filterr   r   r   r   r   r   ImportErrorr   rn   )r   rf   fullnamenestedr&   r   r'   __getattr__  s    



zTypeAliasModule.__getattr__N)r|   rU   rV   r   r   r   r&   r&   r&   r'   r     s   r   c                   @  s0   e Zd ZdZdddddZddd	d
dZdS )TypeAliasNamespacezPseudo namespace class for autodoc_type_aliases.

    This enables to look up nested modules and classes like `mod1.mod2.Class`.
    r   r   )r   r    c                 C  s
   || _ d S r3   )_TypeAliasNamespace__mapping)r   r   r&   r&   r'   r     s    zTypeAliasNamespace.__init__r6   r   )r   r    c                   sN   || j krt| j | S |d   fdd| j  D }|rFt||S td S )Nr   c                   s    i | ]\}}|  r||qS r&   r   r   r   r&   r'   rM     s     
  z2TypeAliasNamespace.__getitem__.<locals>.<dictcomp>)r   r   r   r   KeyError)r   r   r   r&   r   r'   __getitem__  s    

zTypeAliasNamespace.__getitem__N)r|   rU   rV   r   r   r   r&   r&   r&   r'   r     s   r   r   )subjectr    c                 C  s.   t | }|ddkr*|dtjkr*dS dS )z<Check the function should be unwrapped on getting signature.r|   
contextlib__file__TF)rD   rI   r   r   )r   rC   r&   r&   r'   _should_unwrap  s    r   FrO   zinspect.Signature)r   bound_methodtype_aliasesr    c                 C  s6  z&t | rt| }ntj| dd}W n tk
rD   t| }Y nX t|j }|j}zt|}t	
| d|}t|D ]<\}}	|	j|krz||	j }
t|
tr|
j}
|	j|
d||< qzd|krt|d tr|d j}n|d }W n tk
r   Y nX |r&t| rnt|dkr&|d tj||ddS )	z|Return a Signature object for the given *subject*.

    :param bound_method: Specify *subject* is a bound method or not
    T)follow_wrappedN
annotationr    r   F)return_annotation__validate_parameters__)r   r"   	signaturer$   r<   
parametersvaluesr   r   rW   get_type_hints	enumeraterf   r5   r   r   r   r   rJ   pop	Signature)r   r   r   r   r   r   localnsr   iparamr   r&   r&   r'   r     s>    



r   )sigglobalnsr   r    c           	        s   ddddddd ddddd fdd	}|d
kr8i }|d
krD|}t | j }t|D ],\}}|jrZ||j||}|j|d||< qZ| j}|r||||}| j||dS )z;Evaluate unresolved type annotations in a signature object.r   rO   r   )refr   r   r    c                 S  s2   t jdd dkr"| ||t S | ||S dS )zEvaluate a forward reference.NrR   )rS   	   )rX   rY   	_evaluater   )r   r   r   r&   r&   r'   evaluate_forwardrefI  s    z/evaluate_signature.<locals>.evaluate_forwardref)r   r   r   r    c              	     sz   z\t | trZt| d} |||} t | tr: |||} n t | trZt| d} |||} W n ttfk
rt   Y nX | S )z$Evaluate unresolved type annotation.T)r5   r6   r   	NameErrorrN   )r   r   r   r   r   r&   r'   evaluateP  s    




z$evaluate_signature.<locals>.evaluateNr   )r   r   )r<   r   r   r   r   r   r   )	r   r   r   r   r   r   r   r   r   r&   r   r'   evaluate_signatureE  s    r   T)r   show_annotationshow_return_annotationunqualified_typehintsr    c                 C  s  |r
d}nd}g }d}| j  D ]"}|j|jkrF||jkrF|d |j|jkrn||j|jdfkrn|d t }|j|jkr|	d|j
  n*|j|jkr|	d|j
  n|	|j
 |r|j|jk	r|	d |	t|j| |j|jk	r0|r|j|jk	r|	d n
|	d	 |	t|j ||  |j}q |tjkr\|d d
|}	| jtjks|dks|dkrd|	 dS t| j|}
d|	 d|
 S dS )aN  Stringify a Signature object.

    :param show_annotation: If enabled, show annotations on the signature
    :param show_return_annotation: If enabled, show annotation of the return value
    :param unqualified_typehints: If enabled, show annotations as unqualified
                                  (ex. io.StringIO -> StringIO)
    Zsmartzfully-qualifiedN/*z**z: z = =r   F()z) -> )r   r   kindPOSITIONAL_ONLYappendKEYWORD_ONLYPOSITIONAL_OR_KEYWORDr   VAR_POSITIONALwriterf   VAR_KEYWORDr   emptyr   defaultr   getvaluer   r   r   )r   r   r   r   modeargsZ	last_kindr   argZconcatenated_argsr   r&   r&   r'   stringify_signatureu  sP    






r  )r   r    c                 C  s2   d|  d }t |}tt j|jd }t||S )z&Create a Signature object from string.zdef funcz: passr   )astparser   FunctionDefbodysignature_from_ast)r   codemodulefunctionr&   r&   r'   signature_from_str  s    
r  r   zast.FunctionDef)noder  r    c              	   C  sP  | j }t|j}g }t|dr8t|j}|t|j  }nd}t|j }tt||D ]}|dtj	 qTt|drt
|jD ]\\}}	|| tj	krtj	}
ntt|| |}
t|	j|ptj	}|t|	jtj|
|d q|t
|j D ]h\}}	|||  tj	krtj	}
ntt|||  |}
t|	j|p0tj	}|t|	jtj|
|d q|jrt|jj|pjtj	}|t|jjtj|d t
|jD ]d\}}	|j| dkrtj	}
ntt|j| |}
t|	j|ptj	}|t|	jtj|
|d q|jr.t|jj|ptj	}|t|jjtj|d t| j|p@tj	}tj||dS )z*Create a Signature object from AST *node*.posonlyargsr   )r  r   r   N)r   )r  r<   defaultsr!   rJ   r  rangeinsertr   r  r   r   ast_unparser   r  r  r  r  varargr	  
kwonlyargskw_defaultsr  kwargr  Zreturnsr"   r   )r  r  r  r  paramsr  positionals_r   r  r  r   r   r&   r&   r'   r    sf    




 
 
r  )r   
attrgetterallow_inheritedre   rf   r    c           	      C  sD  t fdddddd}|rp|rpt| ||rpt|D ]<}|j|}|r2t|dr2t|j}|dk	sf|s2|  S q2|| }t| r|| j	j
krt| jS |dkr@|r@|r,|r,t|D ],}t ||d}|dk	r||}|dk	r qq|dkr,t|D ]0}t ||d}|dk	rt|}|dk	r q,q|dkr@t| }|S )	zGet the docstring for the object.

    This tries to obtain the docstring for some kind of objects additionally:

    * partial functions
    * inherited docstring
    * inherited decorated methods
    r   r   rd   )r   r)  r    c                 S  s"   || dd }t |tr|S d S d S )Nr   r4   )r   r)  docr&   r&   r'   getdoc_internal	  s    
zgetdoc.<locals>.getdoc_internalr0   N)r;   r.   rF   rG   rI   r!   getdocr0   r+   r{   r   r,   r"   )	r   r)  r*  re   rf   r,  rk   rl   r+  r&   r&   r'   r-    s:    






r-  )NN)NN)NN)TTF)r   )_r   
__future__r   r  r   r   r^   r"   rerX   r   rW   r   r   r   r   r   	importlibr   r   r	   r
   r   r   r   ior   r   r   r   r   r   r   r   r   r   r   r   Zsphinx.pycode.astr   r!  Zsphinx.utilr   Zsphinx.util.typingr   r   	getLoggerr|   loggercompile
IGNORECASEr   r#   r1   r?   rB   rD   rF   rK   rP   r[   ra   rb   rc   r+   r.   r/   ru   rx   rz   r~   r   r   r   r   r   r-   r   r   r   r;   r   r   r   r   r   r6   r   r   r   r   r  r  r  r-  r&   r&   r&   r'   <module>   s     
			
(!8  0   >	@