B
    .KcTv                 @   s  d 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 ddlmZ ddlmZmZmZmZmZ ddlmZ ddlmZmZ ddlmZmZmZ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% ddl&m'Z' ddl&m(Z) ej*dkr"ddlm+Z+m,Z,m-Z- n"e.e/j0Z+e.e1j2Z,e.e3j4d Z-e%5e6Z7e8dej9Z:eedddZ;ddeee edddZ<eeee1  dddZ=eee1ef dddZ>eee1ef dddZ?eeedf dd d!Z@eeeedf  dd"d#ZAeee dd$d%ZBeeCdd&d'ZDeeCd(d)d*ZEeeCd(d+d,ZFeedd-d.ZGeeCdd/d0ZHd|eeee1 eCd1d2d3ZId}eeee1 eCd1d4d5ZJeeCd(d6d7ZKeeCdd8d9ZLeeCd:d;d<ZMeeCdd=d>ZNeeCdd?d@ZOeeCddAdBZPeeCddCdDZQeeCddEdFZReeCddGdHZSeeCddIdJZTeeCddKdLZUeeCddMdNZVeeCddOdPZWeeCddQdRZXee1eedSdTdUZYee1dVdWdXZZee1eCdYdZd[Z[G d\d] d]Z\G d^d_ d_Z]G d`da daZ^G dbdc dcee1ef Z_eeCdddedfZ`dgi feeCeejadhdidjZbd~ejaee ee ejadkdldmZcdejaeCeCeCe1dodpdqZde1ejadrdsdtZede!jfe1ejadvdwdxZgeYdgddfeeeCeee1 ee1 dydzd{ZhdS )z&Helpers for inspecting Python modules.    N)partialpartialmethod)import_module)	Parameterisclassismethodismethoddescriptorismodule)StringIO)
MethodType
ModuleType)	AnyCallableDictMappingOptionalSequenceTupleTypecast)ast)unparse)logging)
ForwardRef)	stringify)      )ClassMethodDescriptorTypeMethodDescriptorTypeWrapperDescriptorTypefromkeysz at 0x[0-9a-f]{8,16}(?=>))objreturnc             C   s6   yt | dr| S t| S W n tk
r0   | S X dS )z?Get an original object from wrapped object (wrapped functions).Z__sphinx_mock__N)hasattrinspectunwrap
ValueError)r!    r'   2lib/python3.7/site-packages/sphinx/util/inspect.pyr%   $   s    
r%   )stop)r!   r)   r"   c            C   sj   xd|r|| r| S t | r"| j} qt| r>t| dr>| j} qt| rN| j} qt| r^| j} q| S qW dS )zx
    Get an original object from wrapped object (unwrapping partials, wrapped
    functions, and other decorators).
    __wrapped__N)		ispartialfuncr$   	isroutiner#   r*   isclassmethod__func__isstaticmethod)r!   r)   r'   r'   r(   
unwrap_all1   s    r1   c             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>O   s    zgetall.<locals>.<genexpr>)safe_getattrr3   listtupleallr&   )r!   r2   r'   r'   r(   getallE   s     r<   c             C   s"   t | dd}t|tr|S i S dS )z,Get __annotations__ from given *obj* safely.__annotations__N)r8   r3   r   )r!   r=   r'   r'   r(   getannotationsU   s    
r>   c             C   s"   t | dd}t|tr|S i S dS )z(Get __globals__ from given *obj* safely.__globals__N)r8   r3   r   )r!   r?   r'   r'   r(   
getglobals^   s    
r@   .c             C   s"   t | dd}t|tr|S dS dS )z$Get __mro__ from given *obj* safely.__mro__Nr'   )r8   r3   r:   )r!   rA   r'   r'   r(   getmrog   s    
rB   c             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   r8   getr3   r:   len)r!   rC   rD   r'   r'   r(   getorigbasesp   s    

rG   c             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 )Nr'   )r5   r6   r'   r'   r(   
<dictcomp>   s    zgetslots.<locals>.<dictcomp>)
r$   r   	TypeErrorr8   r3   dictr4   r9   r:   r&   )r!   rH   r'   r'   r(   getslots   s    


rL   c             C   sJ   t jdkrt| tjS t| dd}t| dd}|dkrB|dkrBdS dS dS )	z)Check the if object is a kind of NewType.)r   
   
__module__N__qualname__typingzNewType.<locals>.new_typeTF)sysversion_infor3   rP   ZNewTyper8   )r!   rN   rO   r'   r'   r(   	isNewType   s    
rS   )xr"   c             C   s   t | ot| tjS )z(Check if the object is subclass of enum.)r$   r   
issubclassenumEnum)rT   r'   r'   r(   isenumclass   s    rX   c             C   s   t | tjS )z)Check if the object is attribute of enum.)r3   rV   rW   )rT   r'   r'   r(   isenumattribute   s    rY   c             C   s   xt | r| j} qW | S )zfGet an original object from partial object.

    This returns given object itself if not partial.
    )r+   r,   )r!   r'   r'   r(   	unpartial   s    

rZ   c             C   s   t | ttfS )zCheck if the object is partial.)r3   r   r   )r!   r'   r'   r(   r+      s    r+   )r!   clsnamer"   c             C   sr   t | trdS t| r0| jdk	r0t| jr0dS |rn|rnt }x.t|D ]"}|j	||}||k	rHt
|S qHW dS )z#Check if the object is classmethod.TNF)r3   classmethodr$   r   __self__r   objectrB   rC   rE   r.   )r!   r[   r\   Zplaceholderbaseclsmethr'   r'   r(   r.      s    
r.   c             C   sT   t | trdS |rP|rPx8t|d|gD ]&}|j|}|r&t |trHdS dS q&W dS )z$Check if the object is staticmethod.TrA   F)r3   staticmethodgetattrrC   rE   )r!   r[   r\   r`   ra   r'   r'   r(   r0      s    

r0   c             C   s&   x dD ]}t t| |drdS qW dS )z/Check if the object is some kind of descriptor.)__get____set__
__delete__NTF)callabler8   )rT   itemr'   r'   r(   isdescriptor   s    
ri   c             C   s   t | dddkS )z)Check if the object is an abstractmethod.__isabstractmethod__FT)r8   )r!   r'   r'   r(   isabstractmethod   s    rk   )methodr"   c             C   s   t | dddk	S )z&Check if the method is a bound method.r^   N)r8   )rl   r'   r'   r(   isboundmethod   s    rm   c             C   s&   y| j jdkS  tk
r    dS X dS )z6Check if the object is a function or method in cython.Zcython_function_or_methodFN)	__class____name__AttributeError)r!   r'   r'   r(   is_cython_function_or_method   s    rq   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 ndS dS )z4Check if the object is an attribute like descriptor.TFZinstancemethodN)r$   Zisdatadescriptorri   r%   
isfunction	isbuiltinr   rq   r   r3   r   r   r   typero   )r!   Z	unwrappedr'   r'   r(   isattributedescriptor   s$    

ru   c             C   s6   t | r.t| dr.t| dr.| jjdkr.dS dS dS )z/Check if the object is singledispatch function.dispatchregister	functoolsTFN)r$   rr   r#   rv   rN   )r!   r'   r'   r(   is_singledispatch_function  s    


ry   c             C   s0   yddl m} t| |S  tk
r*   dS X dS )z-Check if the object is singledispatch method.r   )singledispatchmethodFN)rx   rz   r3   ImportError)r!   rz   r'   r'   r(   is_singledispatch_method$  s
    
r|   c             C   s   t t| S )z Check if the object is function.)r$   rr   r1   )r!   r'   r'   r(   rr   -  s    rr   c             C   s   t t| S )zCheck if the object is builtin.)r$   rs   r1   )r!   r'   r'   r(   rs   2  s    rs   c             C   s   t t| S )z(Check is any kind of function or method.)r$   r-   r1   )r!   r'   r'   r(   r-   7  s    r-   c             C   s<   t tddd}t| |d} t| dr4t| r4dS dS dS )	z*Check if the object is coroutine-function.)r!   r"   c             S   s2   t | st| st| rdS t| dr*dS dS dS )z2Check if the object is wrapped coroutine-function.Fr*   TN)r0   r.   r+   r#   )r!   r'   r'   r(   iswrappedcoroutine>  s
    
z/iscoroutinefunction.<locals>.iswrappedcoroutine)r)   __code__TFN)r   boolr1   r#   r$   iscoroutinefunction)r!   r}   r'   r'   r(   r   <  s
    r   c             C   s    t | drt| rdS dS dS )z*Check if the object is async-gen function.r~   TFN)r#   r$   isasyncgenfunction)r!   r'   r'   r(   r   R  s    r   c             C   s.   t jdkr$ddlm} t| |r$dS t| tS )z Check if the object is property.)r      r   )cached_propertyT)rQ   rR   rx   r   r3   property)r!   r   r'   r'   r(   
isproperty\  s
    

r   c             C   sV   t tdrt| tjrdS t tdr4t| tjr4dS t tdrNt| tjrNdS dS dS )z$Check if the object is GenericAlias._GenericAliasTGenericAlias_SpecialGenericAliasFN)r#   rP   r3   r   typesr   r   )r!   r'   r'   r(   isgenericaliasf  s    


r   )r!   r\   defargsr"   c             G   sn   yt | |f| S  tk
rh } z:y
| j| S  tk
r@   Y nX |rN|d S t||W dd}~X Y nX dS )z;A getattr() that turns all exceptions into AttributeErrors.r   N)rc   	ExceptionrC   rp   )r!   r\   r   excr'   r'   r(   r8   u  s    
r8   )r_   r"   c          
      sH  t  trNyt }W n tk
r*   Y qX  fdd|D }dd| S nt  tryt }W n tk
rx   Y qX dddd |D  S ndt  tryt }W n tk
r   Y qX dddd |D  S nt  tj	rd j
j jf S yt }W n* tk
r. } z
t|W d	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)r5   key)r_   r'   r(   r7     s   z%object_description.<locals>.<genexpr>z{%s}z, c             s   s   | ]}t |V  qd S )N)r   )r5   rT   r'   r'   r(   r7     s    zfrozenset({%s})c             s   s   | ]}t |V  qd S )N)r   )r5   rT   r'   r'   r(   r7     s   z%s.%sN 
 )r3   rK   sortedr   joinsetrJ   	frozensetrV   rW   rn   ro   r\   reprr&   memory_address_resubreplace)r_   Zsorted_keysitemsZsorted_valuessr   r'   )r_   r(   r     s:    



r   )r!   	attr_namer"   c                sl   y"t | }t fdd|D }W n tk
r6   dS X yt|d}W n tk
rZ   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 )rC   N)r8   )r5   c)r   r'   r(   r7     s    z*is_builtin_class_method.<locals>.<genexpr>Fro   N)rB   nextStopIterationr8   rp   rc   builtins)r!   r   mror[   r\   r'   )r   r(   is_builtin_class_method  s    	r   c               @   s>   e Zd ZdZeddddZeedddZed	d
dZ	dS )DefaultValuezKA simple wrapper for default value of the parameters of overload functions.N)valuer"   c             C   s
   || _ d S )N)r   )selfr   r'   r'   r(   __init__  s    zDefaultValue.__init__)otherr"   c             C   s
   | j |kS )N)r   )r   r   r'   r'   r(   __eq__  s    zDefaultValue.__eq__)r"   c             C   s   | j S )N)r   )r   r'   r'   r(   __repr__  s    zDefaultValue.__repr__)
ro   rN   rO   __doc__r4   r   r_   r   r   r   r'   r'   r'   r(   r     s   r   c               @   sZ   e Zd ZdZeddddZddddZeed	d
dZ	e
dddZe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()`.
    N)r\   r"   c             C   s
   || _ d S )N)r\   )r   r\   r'   r'   r(   r     s    zTypeAliasForwardRef.__init__)r"   c             C   s   d S )Nr'   )r   r'   r'   r(   __call__  s    zTypeAliasForwardRef.__call__)r   r"   c             C   s
   | j |kS )N)r\   )r   r   r'   r'   r(   r     s    zTypeAliasForwardRef.__eq__c             C   s
   t | jS )N)hashr\   )r   r'   r'   r(   __hash__  s    zTypeAliasForwardRef.__hash__c             C   s   | j S )N)r\   )r   r'   r'   r(   r     s    zTypeAliasForwardRef.__repr__)ro   rN   rO   r   r4   r   r   r   r   r   intr   r   r'   r'   r'   r(   r     s   r   c               @   s:   e Zd ZdZeeeef ddddZeedddZdS )	TypeAliasModulez-Pseudo module class for autodoc_type_aliases.N)modnamemappingr"   c             C   s   || _ || _d | _d S )N)_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 yt|S  tk
r   | j	d krt| j| _	t
| j	|S X d S )N.c                s    i | ]\}}|  r||qS r'   )
startswith)r5   kv)prefixr'   r(   rI     s    z/TypeAliasModule.__getattr__.<locals>.<dictcomp>)r   filterr   r   r   r   r   r   r{   r   rc   )r   r\   fullnamenestedr'   )r   r(   __getattr__  s    


zTypeAliasModule.__getattr__)	ro   rN   rO   r   r4   r   r   r   r   r'   r'   r'   r(   r     s   r   c               @   s8   e Zd ZdZeeef ddddZee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`.
    N)r   r"   c             C   s
   || _ d S )N)_TypeAliasNamespace__mapping)r   r   r'   r'   r(   r     s    zTypeAliasNamespace.__init__)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   )r5   r   r   )r   r'   r(   rI     s    z2TypeAliasNamespace.__getitem__.<locals>.<dictcomp>)r   r   r   r   KeyError)r   r   r   r'   )r   r(   __getitem__  s    

zTypeAliasNamespace.__getitem__)	ro   rN   rO   r   r   r4   r   r   r   r'   r'   r'   r(   r     s   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.ro   
contextlib__file__TF)r@   rE   r   r   )r   r?   r'   r'   r(   _should_unwrap%  s
    r   F)r   bound_methodtype_aliasesr"   c             C   sr  y^y&t | rt| }ntj| dd}W n tk
rF   t| }Y nX t|j }|j}W n, tk
r   t	| drg }t
j}n Y nX yt|}t| d|}xHt|D ]<\}}	|	j|kr||	j }
t|
tr|
j}
|	j|
d||< qW d|krt|d tr|d j}n|d }W n tk
r4   Y nX |rbt| rJnt|dkrb|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)Zfollow_wrapped_partialmethodN)
annotationr"   r   F)return_annotationZ__validate_parameters__)r   r$   	signaturer&   r9   
parametersvaluesr   
IndexErrorr#   r   emptyr   rP   get_type_hints	enumerater\   r3   r   r   r   r   rF   pop	Signature)r   r   r   r   r   r   localnsZannotationsiparamr   r'   r'   r(   r   0  sH    






r   )sigglobalnsr   r"   c       	         s   t tttddd ttttd fdd}|dkr8i }|dkrD|}t| j }x8t|D ],\}}|jr\||j||}|j|d||< q\W | j	}|r||||}| j||d	S )
z;Evaluate unresolved type annotations in a signature object.)refr   r   r"   c             S   s*   t jdkr| ||t S | ||S dS )zEvaluate a forward reference.)r   	   N)rQ   rR   Z	_evaluater   )r   r   r   r'   r'   r(   evaluate_forwardrefv  s    
z/evaluate_signature.<locals>.evaluate_forwardref)r   r   r   r"   c          	      sz   y\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)r3   r4   r   	NameErrorrJ   )r   r   r   r   )r   r'   r(   evaluate}  s    




z$evaluate_signature.<locals>.evaluateN)r   )r   r   )
r   r   r   r9   r   r   r   r   r   r   )	r   r   r   r   r   r   r   r   r   r'   )r   r(   evaluate_signaturer  s    r   T)r   show_annotationshow_return_annotationunqualified_typehintsr"   c       
      C   s  |r
d}nd}g }d}x2| j  D ]"}|j|jkrJ||jkrJ|d |j|jkrr||j|jdfkrr|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	r4|r|j|jk	r|	d n
|	d	 |	t|j ||  |j}q$W |tjkrb|d | jtjks|d
ks|d
krdd| S t| j|}	dd||	f 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 = =Fz(%s)z, z
(%s) -> %s)r   r   kindPOSITIONAL_ONLYappendKEYWORD_ONLYPOSITIONAL_OR_KEYWORDr
   VAR_POSITIONALwriter\   VAR_KEYWORDr   r   stringify_annotationdefaultr   getvaluer   r   r   )
r   r   r   r   modeargsZ	last_kindr   argr   r'   r'   r(   stringify_signature  sH    








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   )r   parser   FunctionDefZbodysignature_from_ast)r   codemoduleZfunctionr'   r'   r(   signature_from_str  s    
r   r   )noder   r"   c          	   C   s`  | j }t|j}g }t|dr8t|j}|t|j  }nd}t|j }x$tt||D ]}|dtj	 qVW t|drxjt
|jD ]\\}}	|| tj	krtj	}
ntt|| |}
t|	j|ptj	}|t|	jtj|
|d qW xvt
|j D ]h\}}	|||  tj	krtj	}
ntt|||  |}
t|	j|p:tj	}|t|	jtj|
|d qW |jrt|jj|pvtj	}|t|jjtj|d xrt
|jD ]d\}}	|j| dkrtj	}
ntt|j| |}
t|	j|ptj	}|t|	jtj|
|d qW |jr>t|jj|p"tj	}|t|jjtj|d t| j|pPtj	}tj||dS )z*Create a Signature object from AST *node*.posonlyargsr   )r   r   )r   N)r   )r   r9   defaultsr#   rF   r   rangeinsertr   r   r   r   ast_unparser   r   r   r   r   Zvarargr   Z
kwonlyargsZkw_defaultsr   Zkwargr   Zreturnsr$   r   )r   r   r   r   paramsr   positionals_r   r   r   r   r   r'   r'   r(   r     sT    






r   )r!   
attrgetterallow_inheritedr[   r\   r"   c       	      C   sP  t ftttt ddd}|rt|rtt| ||rtxDt|D ]8}|j|}|r8t	|dr8t
|j}|dk	sl|s8|S q8W || }t| r|| jjkrt
| jS |dkrL|rL|r8|r8x6t|D ]*}t ||d}|dk	r||}|dk	rP qW |dkr8x>t|D ]2}t ||d}|dk	rt
|}|dk	rP qW |dkrLt
| }|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  r"   c             S   s"   || dd }t |tr|S d S d S )Nr   )r3   r4   )r!   r  docr'   r'   r(   getdoc_internal3  s    
zgetdoc.<locals>.getdoc_internalr/   N)r8   r   r   r   r4   r.   rB   rC   rE   r#   getdocr/   r+   rn   r   r,   r$   )	r!   r  r  r[   r\   r  r`   ra   r  r'   r'   r(   r	  $  s:    







r	  )NN)NN)NN)TTF)r   )ir   r   r   rV   r$   rerQ   r   rP   rx   r   r   	importlibr   r   r   r   r   r	   ior
   r   r   r   r   r   r   r   r   r   r   r   Zsphinx.pycode.astr   r   r  Zsphinx.utilr   Zsphinx.util.typingr   r   r   rR   r   r   r   rt   r_   r   r4   r   rK   rC   Z	getLoggerro   Zloggercompile
IGNORECASEr   r%   r1   r<   r>   r@   rB   rG   rL   r   rS   rX   rY   rZ   r+   r.   r0   ri   rk   rm   rq   ru   ry   r|   rr   rs   r-   r   r   r   r   r8   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r	  r'   r'   r'   r(   <module>   s   ,


				

(!A .  ;	>