
\c           @@  sg  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 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 d d	 l m Z d d
 l m Z e rd d l m Z m Z m Z m Z m Z m Z n  e j  e!  Z" e j# d e j$  Z% e rAd   Z& n	 d   Z& y d d l' Z' Wn e( k
 rse) Z' n Xd   Z* d   Z+ d   Z, d   Z- e) e) d  Z. d   Z/ d   Z0 d   Z1 d   Z2 e) e2 d  Z3 d   Z4 d   Z5 d e6 f d     YZ7 d e6 f d     YZ8 e j9 d d  f k r9e j: Z; n d!   Z< d"   Z= d#   Z; e2 e d$  Z: d S(%   s   
    sphinx.util.inspect
    ~~~~~~~~~~~~~~~~~~~

    Helpers for inspecting Python modules.

    :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
    :license: BSD, see LICENSE for details.
i    (   t   absolute_importN(   t   OrderedDict(   t   partial(   t   PY2t   PY3t   StringIOt   binary_typet   string_typest
   itervalues(   t   builtins(   t   force_decode(   t   logging(   t   NoneType(   t   Anyt   Callablet   Dictt   Listt   Tuplet   Types    at 0x[0-9a-f]{8,16}(?=>)c         C@  s  t  |  t  rE t |  d  rE t |  d  rE t d j |     n  t j |   } g  } d } d } g  } d } i  } d } i  } | j | j	 k	 r | j | d <n  x.| j
 j   D]}	 |	 j }
 |	 j } |
 t j j k r | j |  n |
 t j j k r7| j |  |	 j |	 j	 k	 r| |	 j f 7} qnz |
 t j j k rR| } n_ |
 t j j k r| j |  |	 j |	 j	 k	 r|	 j | | <qn |
 t j j k r| } n  |	 j |	 j	 k	 r |	 j | | <q q W| sd } n  | sd } n  t j | | | | | | |  S(   sT   Like inspect.getfullargspec but supports bound methods, and wrapped
        methods.t   __new__t   __init__s,   can't compute signature for built-in type {}t   returnN(    (    (   t
   isinstancet   typet   is_builtin_class_methodt	   TypeErrort   formatt   inspectt	   signaturet   Nonet   return_annotationt   emptyt
   parameterst   valuest   kindt   namet	   Parametert   POSITIONAL_ONLYt   appendt   POSITIONAL_OR_KEYWORDt   defaultt   VAR_POSITIONALt   KEYWORD_ONLYt   VAR_KEYWORDt
   annotationt   FullArgSpec(   t   funct   sigt   argst   varargst   varkwt
   kwonlyargst   defaultst   annotationst
   kwdefaultst   paramR"   R#   (    (    s2   lib/python2.7/site-packages/sphinx/util/inspect.pyt
   getargspec.   sR    						c   	      C@  sw  t  j |   r |  j }  n  d d f } t |   t k r~ |  j } | d k rW i  } n  t |  j  | j	   f } |  j
 }  n  t  j |   s t d |    n  t  j |  j  \ } } } |  j } | d k r g  } n t |  } | d r | | d } n  | d raxT | d D]E } | j |  t |  } | | =y | | =Wqt k
 rYqXqWn  t  j | | | |  S(   s?   Like inspect.getargspec but supports functools.partial as well.i    s   %r is not a Python functioni   (    N(   R   t   ismethodt   __func__R   R   t   keywordsR   t   lenR0   t   keysR.   t
   isfunctionR   t   getargst   __code__t   __defaults__t   listt   indext
   IndexErrort   ArgSpec(	   R.   t   partsR;   R0   R1   R2   t   func_defaultst   argt   i(    (    s2   lib/python2.7/site-packages/sphinx/util/inspect.pyR8   j   s6    				

c         C@  s/   t  d k r t St j |   o. t |  t  j  S(   s(   Check if the object is subclass of enum.N(   t   enumR   t   FalseR   t   isclasst
   issubclasst   Enum(   t   x(    (    s2   lib/python2.7/site-packages/sphinx/util/inspect.pyt   isenumclass   s    c         C@  s    t  d k r t St |  t  j  S(   s)   Check if the object is attribute of enum.N(   RJ   R   RK   R   RN   (   RO   (    (    s2   lib/python2.7/site-packages/sphinx/util/inspect.pyt   isenumattribute   s    c         C@  s   t  |  t  S(   s   Check if the object is partial.(   R   R   (   t   obj(    (    s2   lib/python2.7/site-packages/sphinx/util/inspect.pyt	   ispartial   s    c         C@  sU   t  |  t  r t St j |   rQ t |  d d  r8 t St |  d d  rQ t Sn  t S(   s#   Check if the object is classmethod.t   im_selft   __self__N(   R   t   classmethodt   TrueR   R9   t   getattrR   RK   (   RR   (    (    s2   lib/python2.7/site-packages/sphinx/util/inspect.pyt   isclassmethod   s    c         C@  sx   t  |  t  r t S| rt | rt xR t | d | g  D]8 } | j j |  } | r5 t  | t  rf t St Sq5 q5 Wn  t S(   s$   Check if the object is staticmethod.t   __mro__(   R   t   staticmethodRW   RX   t   __dict__t   getRK   (   RR   t   clsR#   t   baseclst   meth(    (    s2   lib/python2.7/site-packages/sphinx/util/inspect.pyt   isstaticmethod   s    c         C@  s4   x- d D]% } t  t |  | d  d  r t Sq Wt S(   s/   Check if the object is some kind of descriptor.t   __get__t   __set__t
   __delete__t   __call__(   Rb   Rc   Rd   N(   t   hasattrt   safe_getattrR   RW   RK   (   RO   t   item(    (    s2   lib/python2.7/site-packages/sphinx/util/inspect.pyt   isdescriptor   s    c         C@  s+   t  j |   p* t |   o* t  j |  j  S(   s    Check if the object is function.(   R   R>   RS   R.   (   RR   (    (    s2   lib/python2.7/site-packages/sphinx/util/inspect.pyR>      s    c         C@  s+   t  j |   p* t |   o* t  j |  j  S(   s   Check if the object is builtin.(   R   t	   isbuiltinRS   R.   (   RR   (    (    s2   lib/python2.7/site-packages/sphinx/util/inspect.pyRj      s    c         G@  si   y t  |  | |  SWnN t k
 rd y |  j | SWn t k
 rF n X| rU | d St |   n Xd S(   s;   A getattr() that turns all exceptions into AttributeErrors.i    N(   RX   t	   ExceptionR\   t   AttributeError(   RR   R#   t   defargs(    (    s2   lib/python2.7/site-packages/sphinx/util/inspect.pyRg      s    c         C@  s   g  } xj t  |   D]\ } y | |  | d  } Wn t k
 rE q n X| sY | |  r | j | | f  q q W| j   | S(   s;   A version of inspect.getmembers() that uses safe_getattr().N(   t   dirR   Rl   R&   t   sort(   t   objectt	   predicatet   attr_gettert   resultst   keyt   value(    (    s2   lib/python2.7/site-packages/sphinx/util/inspect.pyt   safe_getmembers   s    
c         @  s-  t    t  r] y t    } Wn t k
 r2 q] X  f d   | D } d d j |  Sn  t    t  r y t    } Wn t k
 r q Xt r d n d } | d j d   | D  Sn  y t    } Wn t k
 r t	  n Xt  | t
  rt | d	  } n  t j d |  } | j d d  S(
   sF   A repr() implementation that returns text safe to use in reST context.c         3@  s/   |  ]% } d  t  |  t    |  f Vq d S(   s   %s: %sN(   t   object_description(   t   .0Rt   (   Rp   (    s2   lib/python2.7/site-packages/sphinx/util/inspect.pys	   <genexpr>  s   s   {%s}s   , s	   set([%s])c         s@  s   |  ] } t  |  Vq d  S(   N(   Rw   (   Rx   RO   (    (    s2   lib/python2.7/site-packages/sphinx/util/inspect.pys	   <genexpr>  s   t    s   
t    N(   R   t   dictt   sortedRk   t   joint   setR   R   t   reprt
   ValueErrorR   R
   R   t   memory_address_ret   subt   replace(   Rp   t   sorted_keyst   itemst   sorted_valuest   templatet   s(    (   Rp   s2   lib/python2.7/site-packages/sphinx/util/inspect.pyRw     s0    

c         C@  s   g  t  j |   D] } | | j k r | ^ q } | rA | d n t } t t t | d d   sf t St t t | d d   | k S(   s   If 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.
    i    t   __name__Ry   (	   R   t   getmroR\   Rp   Rf   R	   Rg   RK   RX   (   RR   t	   attr_namet   ct   classesR^   (    (    s2   lib/python2.7/site-packages/sphinx/util/inspect.pyR   %  s
    
1R$   c           B@  sD   e  Z d  Z d Z d Z d Z d Z d Z e   Z	 e e	 d  Z
 RS(   s!   Fake parameter class for python2.i    i   i   i   i   c         C@  s+   | |  _  | |  _ | |  _ |  j |  _ d  S(   N(   R#   R"   R(   R   R,   (   t   selfR#   R"   R(   (    (    s2   lib/python2.7/site-packages/sphinx/util/inspect.pyR   @  s    			(   R   t
   __module__t   __doc__R%   R'   R)   R*   R+   Rp   R   R   (    (    (    s2   lib/python2.7/site-packages/sphinx/util/inspect.pyR$   7  s   	t	   Signaturec           B@  s_   e  Z d  Z e e d  Z e d    Z e d    Z d   Z	 d   Z
 d   Z d   Z RS(   sk   The Signature object represents the call signature of a callable object and
    its return annotation.
    c         C@  s`  t  | t  rE t | d  rE t | d  rE t d j |    n  | |  _ | |  _ t |  _ t	 r y t
 j |  |  _ Wq t k
 r t | d  r d  |  _ t |  _ q   q Xn t |  |  _ y t j |  |  _ Wn t k
 r i  |  _ n X| r/t	 r#t
 j |  r#t |  _ q\t |  _ n- t	 rAt |  _ n t
 j |  oV| j |  _ d  S(   NR   R   s,   can't compute signature for built-in type {}t   _partialmethod(   R   R   R   R   R   t   subjectt
   has_retvalRK   t   partialmethod_with_noargsR   R   R   RD   Rf   R   RW   R8   t   argspect   typingt   get_type_hintsR5   Rk   R9   t   skip_first_argumentRU   (   R   R   t   bound_methodR   (    (    s2   lib/python2.7/site-packages/sphinx/util/inspect.pyR   M  s6    				
c         C@  s!  t  r  |  j r i  S|  j j Sn t   } t |  j j  t |  j j  } xi t	 |  j j  D]U \ } } | | k  r t
 |  | | <q^ |  j j | | } t
 | d | | | <q^ W|  j j r t
 |  j j t
 j  | |  j j <n  |  j j rt
 |  j j t
 j  | |  j j <n  | Sd  S(   NR(   (   R   R   R   R    R   R<   R   R0   R4   t	   enumerateR$   R1   R)   R;   R+   (   R   t   paramst   positionalsRI   RH   R(   (    (    s2   lib/python2.7/site-packages/sphinx/util/inspect.pyR      s$    		"c         C@  s7   t  r/ |  j r/ |  j r" |  j j St j j Sn d  Sd  S(   N(   R   R   R   R   R   R$   R   R   (   R   (    (    s2   lib/python2.7/site-packages/sphinx/util/inspect.pyR     s
    	
c         C@  s  g  } d  } x7t t |  j   D] \ } } |  j rI | d k rI q" n  t   } | j | j k r | | j | j	 d  f k r | j
 d  n  | j | j	 | j | j f k r| j | j  | j | j k	 rOt | j t  r&| j |  j k r&| j d  | j |  j |  j | j   qO| j d  | j |  j | j   n  | j | j k	 r&| j | j k r| j d  | j t | j   q| j d  | j t | j   q&nd | j | j k r| j d  | j | j  n2 | j | j k r&| j d  | j | j  n  | j
 | j    | j } q" Wt sa|  j t j j k rrd d j |  Sd	 |  j k r|  j |  j d	  } n |  j |  j  } d
 d j |  | f Sd  S(   Ni    t   *s   : t   =s    = s   **s   (%s)s   , R   s
   (%s) -> %s(   R   R   R   R    R   R   R"   R*   R'   R%   R&   t   writeR#   R,   R   R   R   R5   t   format_annotationR(   Rw   R)   R+   t   getvalueR   R   R   R$   R}   (   R   R0   t	   last_kindRI   R7   RH   R,   (    (    s2   lib/python2.7/site-packages/sphinx/util/inspect.pyt   format_args  sR    "	#c         C@  s   t  | t  r | St  | t j  r, | j S| s< t |  S| t k rL d St | d d  d k rk | j	 S| t
 k r{ d St j d k r |  j |  S|  j |  Sd S(	   s   Return formatted representation of a type annotation.

        Show qualified names for types and additional details for types from
        the ``typing`` module.

        Displaying complex types from ``typing`` relies on its private API.
        R   R   R	   s   ...i   i   N(   i   i   (   R   R   R   t   TypeVarR   R   R   RX   R   t   __qualname__t   Ellipsist   syst   version_infot   format_annotation_newt   format_annotation_old(   R   R,   (    (    s2   lib/python2.7/site-packages/sphinx/util/inspect.pyR     s    	
c         @  s  t  | d d  } | d k r t  | d d  r< | j } q t  | d d  rZ | j } q t  | d d  rx | j } q   j | j  } n1 t | d  r d | | j f } n t |  } t  | d d  r| d k rOt	 | j
  d	 k r| j
 d
 t k rd   j | j
 d  Sd j   f d   | j
 D  } d | | f Sq| d k rd j   f d   | j
 d  D  }   j | j
 d  } d | | | f Sd j   f d   | j
 D  } d | | f Sn  | S(   s   format_annotation() for py37+R   R   t   _nameR   t   __forward_arg__s   %s.%st   __args__t   Unioni   i   s   Optional[%s]i    s   , c         3@  s   |  ] }   j  |  Vq d  S(   N(   R   (   Rx   t   a(   R   (    s2   lib/python2.7/site-packages/sphinx/util/inspect.pys	   <genexpr>  s    s   %s[%s]R   c         3@  s   |  ] }   j  |  Vq d  S(   N(   R   (   Rx   R   (   R   (    s2   lib/python2.7/site-packages/sphinx/util/inspect.pys	   <genexpr>  s    is   %s[[%s], %s]c         3@  s   |  ] }   j  |  Vq d  S(   N(   R   (   Rx   R   (   R   (    s2   lib/python2.7/site-packages/sphinx/util/inspect.pys	   <genexpr>  s    N(   RX   R   R   R   R   R   t
   __origin__Rf   R   R<   R   R   R}   (   R   R,   t   modulet   qualnameR0   t   returns(    (   R   s2   lib/python2.7/site-packages/sphinx/util/inspect.pyR     s2    ("&"c         @  s   t  | d d'  } | d k r t  | d d'  r< | j } q t  | d d'  rZ | j } q t  | d d'  rx | j } q t  | d d'  r   j | j  } q t |  j d d  } n1 t	 | d  r d	 | | j f } n t |  } t	 t
 d
  rRt | t
 j  rRt	 | d  rR| j } d j   f d   | D  } d | | f St	 t
 d  r_t | t
 j  r_d' } t	 | d  r| j d' k st | j  d k r| j } q#d j   f d   | j d  D  }   j | j d  } d | | | f Sn t	 | d  r#| j } n  | d' k	 rd j   f d   | D  } d | | f Snt	 t
 d  rt | t
 j  rt	 | d  r| j } | d' k	 rt |  d k r| d t k rd   j | d  Sd j   f d   | D  } d | | f Sqnt	 t
 d  rt	 | d  r| j t
 j k r| j } | d' k	 rt |  d k r| d t k rd   j | d  Sd j   f d   | D  } d | Sqnet	 t
 d   rst | t
 j  rst  | d d'  d' k	 rst	 | d!  rs| j } | d' k r| S| t k r-d" } n)   f d#   | D }	 d$ d j |	  } d% | |   j | j  f St	 t
 d
  rt | t
 j  rt	 | d  rt	 | d&  r| j } | d' k	 rg  | D] }
   j |
  ^ q} | j r| j d"  n  d | d j |  f Sn  | S((   s%   format_annotation() for py36 or belowR   R   R   R   R   R   s   typing.Ry   s   %s.%st	   TupleMetat   __tuple_params__s   , c         3@  s   |  ] }   j  |  Vq d  S(   N(   R   (   Rx   t   p(   R   (    s2   lib/python2.7/site-packages/sphinx/util/inspect.pys	   <genexpr>5  s    s   %s[%s]t   GenericMetaR   i   c         3@  s   |  ] }   j  |  Vq d  S(   N(   R   (   Rx   RH   (   R   (    s2   lib/python2.7/site-packages/sphinx/util/inspect.pys	   <genexpr>C  s    is   %s[[%s], %s]t   __parameters__c         3@  s   |  ] }   j  |  Vq d  S(   N(   R   (   Rx   R   (   R   (    s2   lib/python2.7/site-packages/sphinx/util/inspect.pys	   <genexpr>J  s    t	   UnionMetat   __union_params__i   s   Optional[%s]i    c         3@  s   |  ] }   j  |  Vq d  S(   N(   R   (   Rx   R   (   R   (    s2   lib/python2.7/site-packages/sphinx/util/inspect.pys	   <genexpr>T  s    R   c         3@  s   |  ] }   j  |  Vq d  S(   N(   R   (   Rx   R   (   R   (    s2   lib/python2.7/site-packages/sphinx/util/inspect.pys	   <genexpr>^  s    s	   Union[%s]t   CallableMetat
   __result__s   ...c         3@  s   |  ] }   j  |  Vq d  S(   N(   R   (   Rx   R   (   R   (    s2   lib/python2.7/site-packages/sphinx/util/inspect.pys	   <genexpr>k  s    s   [%s]s
   %s[%s, %s]t   __tuple_use_ellipsis__N(   RX   R   R   R   R   R   R   R   R   Rf   R   R   R   R   R}   R   R<   R   R   R   R   R   R   R   R   R   R   R&   (   R   R,   R   R   R   t	   param_strR0   t   resultt   args_strt   formatted_argsR   t   param_strings(    (   R   s2   lib/python2.7/site-packages/sphinx/util/inspect.pyR     s    	$	"	"			"	(   R   R   R   RK   RW   R   t   propertyR    R   R   R   R   R   (    (    (    s2   lib/python2.7/site-packages/sphinx/util/inspect.pyR   H  s   4	9		#i   i   c         C@  s   t  j j |  j  } | d  k r% d  St |  d  r@ |  j } n0 x- |  j j d  d  D] } t	 | |  } qW Wt
 j |  s d  S| S(   Nt   im_classt   .i(   R   t   modulesR]   R   R   Rf   R   R   t   splitRX   R   RL   (   R.   R^   R#   (    (    s2   lib/python2.7/site-packages/sphinx/util/inspect.pyt
   _findclass  s    c         C@  s  t  j |   rj xT |  j D]I } | t k	 r y | j } Wn t k
 rN q n X| d  k	 rb | Sq q Wd  St  j |   r t |  d d   r |  j	 j
 } |  j } t  j |  r t t | | d   d  |  j	 k r | } qG| j } n_t  j |   st  j |   rC|  j
 } t |   } | d  k s<t | |  |  k rGd  Snt  j |   r|  j
 } |  j } t  j |  r| j d | |  j k r| } qG| j } n t |  t  r|  j } | j
 } t |  } | d  k st | |  |  k	 rGd  SnP t  j |   st  j |   rC|  j
 } |  j } t | |  |  k	 rGd  Sn d  SxN | j D]C } y t | |  j } Wn t k
 rqQn X| d  k	 rQ| SqQWd  S(   NRU   R:   R   (   R   RL   RZ   Rp   R   Rl   R   R9   RX   R:   R   RU   t	   __class__R>   R   Rj   R   R   R   t   fgett   ismethoddescriptort   isdatadescriptort   __objclass__(   RR   t   baset   docR#   R   R^   R.   (    (    s2   lib/python2.7/site-packages/sphinx/util/inspect.pyt   _finddoc  sd    !			!					!		c         C@  s|   y |  j  } Wn t k
 r! d SX| d k r\ y t |   } Wq\ t t f k
 rX d SXn  t | t  so d St j |  S(   s  Get the documentation string for an object.

        All tabs are expanded to spaces.  To clean up docstrings that are
        indented to line up with blocks of code, any whitespace than can be
        uniformly removed from the second line onwards is removed.N(	   R   Rl   R   R   R   R   t   strR   t   cleandoc(   Rp   R   (    (    s2   lib/python2.7/site-packages/sphinx/util/inspect.pyt   _getdoc  s    c         C@  sb   | |  d d  } t |   r= | |  j j k r= t |  j  S| d k r^ | r^ t |   } n  | S(   s   Get the docstring for the object.

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

    * partial functions
    * inherited docstring
    R   N(   R   RS   R   R   t   getdocR.   R   (   RR   t
   attrgettert   allow_inheritedR   (    (    s2   lib/python2.7/site-packages/sphinx/util/inspect.pyR     s    	(>   R   t
   __future__R    R   t   reR   R   t   collectionsR   t	   functoolsR   t   sixR   R   R   R   R   R   t	   six.movesR	   t   sphinx.utilR
   R   t   sphinx.util.pycompatR   RK   R   R   R   R   R   R   t	   getLoggerR   t   loggert   compilet
   IGNORECASER   R8   RJ   t   ImportErrorR   RP   RQ   RS   RY   Ra   Ri   R>   Rj   Rg   Rv   Rw   R   Rp   R$   R   R   R   R   R   R   (    (    (    s2   lib/python2.7/site-packages/sphinx/util/inspect.pyt   <module>
   sX   .1
<	 
										"	 8		=	