B
    j]\w/                 @   s\  d Z ddlmZ ddlZddlZddlmZmZmZm	Z	m
Z
mZmZmZ dZd)ddZd	d
 Zdd Zdd Zdd ZeZdd Zdd Zdd Zdd Zd*ddZd+ddZedkrXG dd  d eZeeej eeej  eed!dd" eed# eed$dd" eed% eed& eed' eed( eee! eee! dS ),z,Utilities and wrappers around inspect module    )print_functionN)is_text_stringbuiltinsget_meth_funcget_meth_class_instget_meth_classget_func_defaultsto_text_stringPY2z[^\'\"a-zA-Z0-9_.]Fc             C   s   d}x@dD ]8\}}|  |r
| |}|r
| |d }| d| } q
W tt| }d}yxx |dksntt|rx| }qZW | dr|dd }|drdS |r|| | |t|  7 }||7 }|r|S W n t	k
r   dS X dS )z+Return the last valid object name in string )z[]z()N.)
endswithrfindresplitSYMBOLSmatchpop
startswithlen
IndexError)ZtxtZlastZtxt_endZ	startcharZendcharpostokenstoken r   >lib/python3.7/site-packages/spyder_kernels/utils/dochelpers.pygetobj   s.    



r   c             C   s   dd t | D S )z
    For standard objects, will simply return dir(obj)
    In special cases (e.g. WrapITK package), will return only string elements
    of result returned by dir(obj)
    c             S   s   g | ]}t |r|qS r   )r   ).0itemr   r   r   
<listcomp><   s    zgetobjdir.<locals>.<listcomp>)dir)objr   r   r   	getobjdir6   s    r#   c          
   C   s(  t | pt | pd}yt|}W n   Y nX ddd|d}t| r$y
| j}W n tk
rp   ||d< |S X t | rt| }t	| dk	rdt	| j
j |d< nd|j |d< t| } n"t| drd	| j |d< nd
|d< | j|d< t | rtr,t | \}}}}t j||||dd d|d< n:t | \}}}}}	}
}t j|||||	|
|dd d|d< |dkr|d |d< |d dd |d< nrt|d }|r||d< |d |d  }|d d}|d  }||kr|d |dd |d< nd|d< |d }|dddd|d< |S )ac  
    Return text documentation from an object. This comes in a form of
    dictionary with four keys:

    name:
      The name of the inspected object
    argspec:
      It's argspec
    note:
      A phrase describing the type of object (function or method) we are
      inspecting, and the module it belongs to.
    docstring:
      It's docstring
    r   )nameargspecnote	docstringr'   NzMethod of %s instancer&   zUnbound %s method
__module__zFunction of %s moduleZFunctionr$   c             S   s   dt |  S )N=)repr)or   r   r   <lambda>y   s    zgetdoc.<locals>.<lambda>)Zformatvaluer%   c             S   s   dt |  S )Nr)   )r*   )r+   r   r   r   r,      s    z<lambda>z lambda    r   z

r   z(...)z(self)z()z(self, ()inspectgetdocZgetcommentsr	   callable__name__AttributeErrorismethodr   r   	__class__r   hasattrr(   
isfunctionr
   Z
getargspecZformatargspecZgetfullargspecgetargspecfromtextr   stripreplacelstrip)r"   r'   docr$   ZimclassargsZvarargsZvarkwdefaultsZ
kwonlyargsZkwonlydefaultsZannotationsr%   	signatureZdocstring_blocksfirst_blockr   r   r   r0   ?   sh    








r0   c          	   C   sn   yPyt t| }W n8 tk
rL   t| dr@t t| j}nt| }Y nX |S  ttfk
rh   dS X dS )z Wrapper around inspect.getsourcer5   N)r	   r/   	getsource	TypeErrorr6   r5   r0   IOError)r"   srcr   r   r   rA      s    
rA   c             C   s|   t | tr| dd} |d }|d }d}| s2d} t|d | | }dd t|| | D }|| }|rt|d	 S dS d
S )zGet object signatures from text (object documentation)
    Return a list containing a single string in most cases
    Example of multiple signatures: PyQt5 objectsr'   r   z!\([^\)].+?(?<=[\w\]\}\'"])\)(?!,)z\([^\)]+(?<=[\w\]\}\'"])\)(?!,)z((%s\([^\)]+(\),\n.+)+(?<=[\w\]\}\'"])\))|c             S   s   g | ]}|d  qS )r   r   )r   gr   r   r   r       s    z(getsignaturefromtext.<locals>.<listcomp>r   N)
isinstancedictgetr   findall)textobjnameZ
oneline_reZmultiline_reZmultiline_end_parenleft_reZsigs_1Zsigs_2Zall_sigsr   r   r   getsignaturefromtext   s    
rM   c             C   s    |  d}|d  }t|dS )z
    Try to get the formatted argspec of a callable from the first block of its
    docstring
    
    This will return something like
    '(foo, bar, k=1)'
    z

r   r   )r   r9   rM   )rK   Zblocksr@   r   r   r   r8      s    
r8   c             C   s2   t | |}|r.||dd d }|dS dS )z.Get arguments from text (object documentation)r.   r-   r   ,N)rM   findr   )rK   rL   r?   Zargtxtr   r   r   getargsfromtext   s    
rP   c             C   s   | j dk	rt| j | jS dS )zGet arguments from object docN)__doc__rP   r2   )r"   r   r   r   getargsfromdoc   s    
rR   c       	      C   sZ  t | st | r| }n8t | r.t| }n$t | rNt| drNt| d}ng S t|dsxt|}|dk	rp|S t| S t 	|j
\}}}|st| S x0t|D ]$\}}t|trdd| ||< qW t|}|dk	rx<t|D ]0\}}||t| t|   dt| 7  < qW t | s0t | rVt|dkrBdS d|krV|d |S )	z:Get the names and default values of a function's arguments__init__	func_codeNz(%s)z, r)   r-   self)r/   r7   Z	isbuiltinr4   r   isclassr6   getattrrR   getargsrT   	enumeraterG   listjoinr   r   r*   remove)	r"   Zfunc_objr=   _i_argargr>   indexdefaultr   r   r   rX      s8    




,

rX   Tc             C   s   t | }|rd}d}xpt|D ]d\}}|dkr4dg}|d  |7  < |t|d k r|d  |7  < t|d dksx|r|d qW t| st| rt|dkrdS d| |kr|d|  |S dS )z
    Get the names and default values of a function's arguments
    Return list with separators (', ') formatted for calltips
    z, Nr   r   r-       rU   )rX   rY   r   appendr/   rV   r4   r\   )r"   Zone_arg_per_liner=   sepZtextlistr^   r_   r   r   r   	getargtxt  s$    re   c          
   C   s(  |dkrt  }| d}|d}t|dkr2dS |tjkr||kr|ry.t|t |}|t krl|t |< |||< W q tk
r   dS X ndS x|D ]}yt	t
||| }W n ttfk
r   dS X |r|ryt|d | t | W n ttfk
r   dS X ndS |d| 7 }qW dS )z_Return True if object is defined in namespace
    If namespace is None --> namespace = locals()Nr   r   FT)localsr   r   r   r   __dict__
__import__globals	Exceptionr6   evalSyntaxErrorr3   ImportError)r"   force_import	namespaceZ	attr_listbasemoduleattrZattr_not_foundr   r   r   	isdefined'  s<    




rs   __main__c               @   s   e Zd ZdddZdS )Test   c             C   s   d S )Nr   )rU   xyr   r   r   methodN  s    zTest.methodN)rv   )r2   r(   __qualname__ry   r   r   r   r   ru   M  s   ru   z
numpy.take)rn   rh   z.keysri   zglobals().keysz+scipy.signal.z4.)F)T)FN)"rQ   Z
__future__r   r/   r   Zspyder_kernels.py3compatr   r   r   r   r   r   r	   r
   r   r   r#   r0   rA   rM   Zgetsignaturesfromtextr8   rP   rR   rX   re   rs   r2   objectru   printrS   ry   sortedr   r   r   r   <module>	   s<   (
	a'

%
