B
    b_ 8                 @   s   d Z 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mZm	Z	m
Z
 dddZdd	d
Zdd Zdd ZdddZdddZdd ZdddZdd Zdd ZdS ) zqProvides a variety of introspective-type support functions for
things like call tips and command auto completion.z(Patrick K. O'Brien <pobrien@orbtech.com>    N)BytesIOPY3string_types    c             C   sP   g }t | dd}y |dk	r&t||}nt|}W n   Y nX t||||}|S )zsReturn list of auto-completion options for command.

    The list of options will be based on the locals namespace..)
terminatorN)getRootevalgetAttributeNames)commandlocalsincludeMagicincludeSingleincludeDouble
attributesrootobj r   /lib/python3.7/site-packages/wx/py/introspect.pygetAutoCompleteList   s    r   c                s  g }i }t  s@ddddddddd	d
dg}| fdd|D 7 }|ry|  7 }W n   Y nX t dry0x*  D ]}||krxt |rx||7 }qxW W n   Y nX tt }|dkr|t 7 }nht }	t xV|	 D ]J\\}
}}}t j	|
kr|dkr||7 }q| fdd|D 7 }qW x|D ]}d||< q:W t
|}dd |D }|jdd d |stdd |}|stdd |}|S )z?Return list of unique attributes, including inherited, for obj.	__bases__	__class____dict____name__Zfunc_closureZ	func_codeZfunc_defaultsZ	func_dictZfunc_docZfunc_globalsZ	func_namec                s   g | ]}t  |r|qS r   )hasattr).0attr)r   r   r   
<listcomp>+   s    z%getAttributeNames.<locals>.<listcomp>	trait_getz<type 'array'>dirc                s"   g | ]}|krt  |r|qS r   )r   )r   r   )r   obj_dirr   r   r   H   s    Nc             S   s   g | ]}t |tkr|qS r   )typestr)r   Z	attributer   r   r   r   Q   s    c             S   s   |   S )N)upper)xr   r   r   <lambda>S       z#getAttributeNames.<locals>.<lambda>)keyc             S   s   | d dkp| dd dkS )Nr   _r      r   )itemr   r   r   r&   U   s   c             S   s   | d d dkS )Nr*   __r   )r+   r   r   r   r&   X   r'   )hasattrAlwaysReturnsTrueZ_getAttributeNamesr   r   r#   r"   r    getAllAttributeNamesitemsr   listsortfilter)r   r   r   r   r   dictZspecial_attrsiZstr_typeattrdictZobj_type_nameZ	techniquecountZattrlistr+   r   )r   r!   r   r   !   sP      



r   c             C   s
   t | dS )NZbogu5_123_aTTri8ute)r   )r   r   r   r   r-   [   s    r-   c             C   s  i }yt | j}W n tk
r*   d}Y nX t| }~t| }|||dt|f< yt| j}W n tk
rr   Y nX |||dt|f< y
| j}W n   Y nX || krn|t	| y
| j
}W n   Y n8X t|trx(|D ] }t |t krq|t	| qW |S )zReturn dict of all attributes, including inherited, for an object.

    Recursively walk through a class and all base classes.
    Z	anonymousr    r   )r"   r   	Exceptionr    lensortedr   r   updater.   r   
isinstancetuple)r   r5   r(   Z
wakeupcallr   klassbasesbaser   r   r   r.   ^   s>    



r.   c             C   s  d}t | dd}y |dk	r&t||}nt|}W n
   |S d}t|\}}y
|j}W n tk
rj   Y nX d}d}t|rnt|rtst	|nt
|}tj| }|r |d}	t|	dkrd}n0|	d	 dd
 dkrndd|	dd   }|| }d}
t|r2yt|}
W n   Y nX |
r|
dd	  }||ksr|dt|d  |d krxd}n|d7 }|
d}|d	 }d|dd }d|||f }n|}||dd | f}|S )zFor a command, return a tuple of object name, argspec, tip text.

    The call tip information will be based on the locals namespace.)r   r   r   ()r   Nr   ,r   z()r   r*   z(*
z

z%s%s

%s)r	   r
   getBaseObjectr   AttributeErrorinspect	isbuiltinZ
isfunctionr   Z
getargspecZgetfullargspecZformatargspecsplitr8   joinlstripcallableZgetdocstrip)r   r   Zcalltipr   r   namedropSelfZtip1ZargspecZtempdoc	firstlineZ	docpiecesZtip2Ztip3Ztipr   r   r   
getCallTip   s^    




(
rQ   c             C   sn  |  dd } | tjr,| ttjd } |  } t| |} |dkrt| }|rj|d d tj	krj|d= |r|d d tj
kr|d= |sdS |dkr|d d dks|d d tjk	rdS |r| |rdt| }| d| } |  } t| }|  d}d}d}d}d}d}	x$|D ]}
|
d }|
d }|
d	 }|tj	tj
fkrNqtrf|tjkrf|}P |tjtjtjfkr|dkr|r||
d
 d  dkrd}P |tjtjtjfks|tjkr|dkr|rd}P n|
d d }n<t|dkr*|dkr*||	kr |dkr P n|| }nP |}|}qW |dkrLt|}||d }||	krj|| }|S )a  Return the rightmost root portion of an arbitrary Python command.

    Return only the root portion that can be eval()'d without side
    effects.  The command would normally terminate with a '(' or
    '.'. The terminator and anything after the terminator will be
    dropped.rB   rC   Nr   r   r   r   )z[]z()z{}       r*   z[({])}z[({)rH   
startswithsysZps2r8   rJ   rtrimTerminus	getTokenstokenize	ENDMARKERNEWLINEOPendswithrstripreverser   ENCODINGNAMESTRINGNUMBER)r   r   tokenssizelinestartprefixZ
laststringZlastlineZ
emptyTypestokenZ	tokentypeZtokenstringr   r   r   r   r	      sz    
"




r	   c                s   t | tr.y| d} W n tk
r,   Y nX t| }g  yDts\ fdd}t|j| n xt|jD ]} 	| qjW W n tj
k
r   Y nX  S )z(Return list of token tuples for command.zutf-8c                 s     |  d S )N)append)args)rd   r   r   eaterE  s    zgetTokens.<locals>.eater)r;   r   encodeUnicodeEncodeErrorr   r   rY   Ztokenize_loopreadlinerj   
TokenError)r   frl   tr   )rd   r   rX   2  s     
rX   c             C   s4   |r0|  |}t|dkr0||dd | } | S )z@Return command minus anything that follows the final terminator.r   NrC   )rH   r8   rI   )r   r   piecesr   r   r   rW   Q  s
    
rW   c             C   s   t | rd}nt | rTy| jdkr,d}nd}| j} W q tk
rP   d}Y qX nbt | r~t| }|dk	rx|} d}qd}n8t| ry| j	j} d}W q tk
r   d}Y qX nd}| |fS )z8Return base object and dropSelf indicator for an object.r   Nr   )
rF   rG   Zismethod__self____func__rE   ZisclassgetConstructorrK   __call__)r   rN   constructorr   r   r   rD   Y  s0    




rD   c             C   sF   y| j jS  tk
r@   x"| jD ]}t|}|dk	r |S q W Y nX dS )z@Return constructor for class object, or None if there isn't one.N)__init__ru   rE   r   rv   )r   r?   rx   r   r   r   rv     s    rv   )r   Nr   r   r   )r   r   r   )r   N)N)N)__doc__
__author__rV   rF   rY   typesZwxZsixr   r   r   r   r   r-   r.   rQ   r	   rX   rW   rD   rv   r   r   r   r   <module>   s&    
 
99
B
Y
'