
    ` Iez1                         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Zd Zd Zd	 Zd
 Zd Zd Zd Zd ZddZddZy)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_.]c                    d}dD ]5  \  }}| j                  |      s| j                  |      }|s,| |d }| d| } 7 t        j                  t        |       }d}	 |t        j
                  t        |      r.|j                         }|t        j
                  t        |      r.|j                  d      r|dd }|j                  d      ry|r#|| | j                  |      t        |      z      z  }||z  }|r|S y# t        $ r Y yw xY w)z+Return the last valid object name in string )z[]()N.)
endswithrfindresplitSYMBOLSmatchpop
startswithlen
IndexError)txtlasttxt_end	startcharendcharpostokenstokens           A/usr/lib/python3/dist-packages/spyder_kernels/utils/dochelpers.pygetobjr$      s   G*  	7<< ))I&Ccd)$3i  XXgs#FEmrxx7JJLE mrxx7>>##2JEC S#))E*SZ799EL  s$   .C; 	C; $'C; -C; ;	DDc                 V    t        |       D cg c]  }t        |      s| c}S c c}w )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)
    )dirr   )objitems     r#   	getobjdirr)   6   s#     !X>T)=D>>>s   &&c                    t        j                  |       xs t        j                  |       xs d}	 t        |      }ddd|d}t	        |       r	 | j
                  }t        j                  |       rZt        |       }t        |       &dt        |       j                  j
                  z  |d<   nd|j
                  z  |d<   t        |       } n$t        | d      rd| j                  z  |d<   nd	|d<   | j
                  |d
<   t        j                  |       r|t        r9t        j                   |       \  }}}}t        j"                  ||||d       |d<   n$	 t        j$                  |       }	t+        |	      |d<   |dk(  r|dz   |d
<   |d   dd |d<   nyt)        |d         }
|
rd|
|d<   |d
   |d   z   }|d   j-                  d      }|d   j/                         }||k(  r-|d   j1                  |dd      j3                         |d<   nd|d<   |d   }
|
j1                  dd      j1                  dd      |d<   |S #  Y xY w# t        $ r
 ||d<   |cY S w xY w# t&        $ r t)        |d         }	|	sd}	Y w xY w)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.   zMethod of %s instancer-   zUnbound %s method
__module__zFunction of %s moduleFunctionr+   c                     dt        |       z   S )N=)repr)os    r#   <lambda>zgetdoc.<locals>.<lambda>y   s    T!W     )formatvaluer,   z(...)z<lambda>z lambda    r   

r   z(self)r   z(self, ()inspectgetdocgetcommentsr
   callable__name__AttributeErrorismethodr   r   	__class__r   hasattrr/   
isfunctionr   
getargspecformatargspec	signature
ValueErrorgetargspecfromtextstrr   stripreplacelstrip)r'   r.   docr+   imclassargsvarargsvarkwdefaultssigr,   rG   docstring_blocksfirst_blocks                 r#   r<   r<   ?   s     s#Ew':':3'?E2I"9-	
 !#C
 }	<<D C $S)G"3'35 3C 8 B B K KLF 2G4D4DDF$CS,'1CNNBCK$CKllFc"181C1CC1H.guh!(!6!6'5( 4"6I&!++C0C
 "%SIz!"Z/F!$Y"!5I([)9:G!(I  K#i.8	#&{#3#9#9&#A .q1779)+'*;'7'?'?5>A(GGMvx $ ")I i. 48@@CPIJU  	(CJ	8 " &,S-=>C%&s/   H5 H= I 5H:=III21I2c                    	 	 t        t        j                  |             }|S # t        $ rD t	        | d      r)t        t        j                  | j
                              }nt        |       }Y |S w xY w# t        t        f$ r Y yw xY w)z Wrapper around inspect.getsourcerB   N)r
   r;   	getsource	TypeErrorrC   rB   r<   IOError)r'   srcs     r#   rX   rX      s    	" !2!23!78C 
  	"sK($W%6%6s}}%EF Sk
	" w s-   # A3 A	A0,A3 /A00A3 3BBc                    t        | t              r| j                  dd      } d}|r||z   }nd}||z   }| sd} t        j                  ||       }d}|rt
        r|r|d   }|S |d   d   }|S ddg}|r$|D cg c]	  }||vs| }	}|	r|	d   }|S |d   }|S |D cg c]  }|d   j                         s| }
}|
r+|
D cg c]  }|d   |vs| }	}|	r
|	d   d   }|S |
d   d   }|S c c}w c c}w c c}w )	z;Get object signature from text (i.e. object documentation).r.   r   z	(\(.+?\))z(\w+)r   r8   z(*args, **kwargs)z(self, /, *args, **kwargs))
isinstancedictgetr   findallr   isidentifier)textobjnameargs_resignature_reidentifier_resigsrT   default_ipy_sigss	real_sigs
valid_sigss              r#   getsignaturefromtextrl      st   $xxR( G( $w. ::lD)D C %$q'CF JG +/q'!*CF J1 $, 
 (,J19I0IQJ	J#A,C  J q'C J *.EA11B1B1DaE
E#-!1=M1M!I ! !'l1o J )mA.J' K F!s$   5	C'?C'C,2C,>C1C1c                     | j                  d      }|d   j                         j                  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 `(x, y, k=1)`.
    r9   r   
r   )r   rK   rL   rl   )rb   blocksrV   s      r#   rI   rI      s<     ZZF)//#++D"5KR00r6   c                 p    t        | |      }|r(||j                  d      dz   d }|j                  d      S y)z/Get arguments from text (object documentation).r:   r8   r   ,N)rl   findr   )rb   rc   rG   argtxts       r#   getargsfromtextrt     s?    $T73I9>>#.226||C   r6   c                 \    | j                    t        | j                   | j                        S y)zGet arguments from object docN)__doc__rt   r?   )r'   s    r#   getargsfromdocrw   
  s&    
{{s{{CLL99 r6   c                 b   t        j                  |       st        j                  |       r| }nQt        j                  |       rt	        |       }n0t        j
                  |       rt        | d      rt        | d      }ng S t        |d      st        |      }||S t        |       S t        j                  |j                        \  }}}|st        |       S t        |      D ]-  \  }}t        |t              sddj                  |      z  ||<   / t        |      }|Dt        |      D ]6  \  }}||t!        |      z   t!        |      z
  xx   dt#        |      z   z  cc<   8 t        j
                  |       st        j                  |       rt!        |      dk(  ryd|v r|j%                  d       |S )	z:Get the names and default values of a function's arguments__init____code__Nz(%s), r2   r8   self)r;   rD   	isbuiltinrA   r   isclassrC   getattrrw   getargsrz   	enumerater]   listjoinr	   r   r3   remove)	r'   func_objrP   _i_argargrS   indexdefaults	            r#   r   r     s   #'"3"3C"8			#	 %		'#z":3
+	8Z(h'K "#&&!2!23JD!Qc""  o 2
sc4  499S>1DK2 !*H'1 	KNE7T"S]23sT']7JJ3	K sw//4t9> ~FKr6   c                    t        |       }|rd}d}t        |      D ][  \  }}|dg}|dxx   |z  cc<   |t        |      dz
  k  s*|dxx   |z  cc<   t        |d         dk\  s|sK|j                  d       ] t	        j
                  |       st	        j                  |       r*t        |      dk(  ryd|z   |v r|j                  d|z          |S y)z
    Get the names and default values of a function's arguments
    Return list with separators (', ') formatted for calltips
    r{   Nr   r   r8       r|   )r   r   r   appendr;   r~   rA   r   )r'   one_arg_per_linerP   septextlistr   r   s          r#   	getargtxtr   =  s    
 3<D#D/ 	(JE34RLCLs4y{"#x|$*.>OOB'	( ??37#3#3C#88}!czX%s
+! r6   c                 .   |
t               }| j                  d      }|j                  d      }t        |      dk(  ry|t        j
                  vr<||vr8|r5	 t        |t               |      }|t               vr|t               |<   |||<   ny|D ]E  }	 t        t        ||      |       }|r!|r	 t        |dz   |z   t               |       n y|d|z   z  }G y# t        $ r Y yw xY w# t        t        t        f$ r Y  yw xY w# t        t        f$ r Y  yw xY w)z_Return True if object is defined in namespace
    If namespace is None --> namespace = locals()r   r   FT)localsr   r   r   r   __dict__
__import__globals	ExceptionrC   evalr@   SyntaxErrorrY   ImportError)r'   force_import	namespace	attr_listbasemoduleattrattr_not_founds           r#   	isdefinedr   V  s5    H			#I==D
4yA~8$$$Y)>#D')Y?wy(&,GIdO"(	$  	!(dI)>!EEN !tCx}giC D %   Y7 		 $[1 ! !s6   3C C&.D	C#"C#&C>=C>DD)F)T)FN)rv   
__future__r   r;   r   spyder_kernels.py3compatr   r   r   r   r   r	   r
   r   r   r$   r)   r<   rX   rl   rI   rt   rw   r   r   r    r6   r#   <module>r      sg    3 %  	N N N
  :?cL >B	1!:*Z2"r6   