B
    ¤dÝS?"  ã               @   s`   d dl Z d dlmZmZ d dlmZmZmZ G dd„ deƒZ	G dd„ deƒZ
G dd	„ d	eƒZdS )
é    N)Ú
exceptionsÚresourceobserver)ÚobjectdbÚmemorydbÚ	transformc               @   s¦   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd(dd„Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zd)dd„Zdd„ Zdd„ Zd*d d!„Zd"d#„ Zd$d%„ Zd&d'„ Zd
S )+ÚObjectInfoManagerzlStores object information

    It uses an instance of `objectdb.ObjectDB` for storing
    information.

    c             C   sL   || _ t |¡| _t |¡| _t |¡| _|  ¡  |j	 
dd¡rH|  ¡  d S )NZvalidate_objectdbF)Úprojectr   ZPyObjectToTextualÚ
to_textualZTextualToPyObjectÚto_pyobjectZDOITextualToPyObjectÚdoi_to_pyobjectÚ_init_objectdbZprefsÚgetÚ_init_validation)Úselfr   © r   ú6lib/python3.7/site-packages/rope/base/oi/objectinfo.pyÚ__init__   s    zObjectInfoManager.__init__c             C   sr   | j  ¡  dd ¡}d }|d k	rBt dt¡ |dkrB| j jd k	rBd}t| jƒ| _	t
j| j |d}t || j	¡| _d S )NZobjectdb_typez"objectdb_type" project config is deprecated;
Use "save_objectdb" instead in your project config file.
(".ropeproject/config.py" by default)
ZmemoryT)Úpersist)r   Z	get_prefsr   ÚwarningsÚwarnÚDeprecationWarningZ
ropefolderÚTextualValidationr
   Ú
validationr   ZMemoryDBr   ZObjectDB)r   Zdbtyper   Zdbr   r   r   r      s    z ObjectInfoManager._init_objectdbc             C   s’   | j  ¡  tj| j| j| jd}g }x<| j  ¡ D ].}| j |¡}|d k	r0|j	| j	kr0| 
|¡ q0W t ||¡| _| j  t| ƒ¡ | j	 | j¡ d S )N)ZchangedZmovedÚremoved)r   Zvalidate_filesr   ZResourceObserverÚ_resource_changedÚ_resource_movedZ	get_filesr
   Úpath_to_resourcer   ÚappendZFilteredResourceObserverÚobserverZadd_file_list_observerÚ_FileListObserverZadd_observer)r   r   ÚfilesÚpathÚresourcer   r   r   r   '   s    

z"ObjectInfoManager._init_validationc             C   s4   y| j  | j |¡¡ W n tjk
r.   Y nX d S )N)r   Zvalidate_filer	   Úresource_to_pathr   ZModuleSyntaxError)r   r"   r   r   r   r   6   s
    z#ObjectInfoManager._resource_changedNc             C   sJ   | j  |¡ |d k	rF| j |¡}| j |¡}| j ||¡ | j  |¡ d S )N)r   Úremove_resourcer	   r#   r   Z
file_movedÚadd_resource)r   r"   Znew_resourceÚoldÚnewr   r   r   r   =   s    z!ObjectInfoManager._resource_movedc             C   sŠ   |   ||¡}|d k	r|S |  |¡\}}|d kr2d S x@| j ||¡D ].}| ¡ }|rd|d dkrd|}P |d krB|}qBW |d k	r†|  |¡S d S )Nr   )ÚunknownÚnone)Úget_exact_returnedÚ
_get_scoper   Úget_callinfosÚget_returnedr
   )r   ÚpyobjectÚargsÚresultr!   ÚkeyÚ	call_infoÚreturnedr   r   r   r-   E   s    zObjectInfoManager.get_returnedc             C   sD   |   |¡\}}|d k	r@| j |||  ||¡¡}|d k	r@|  |¡S d S )N)r+   r   r-   Ú_args_to_textualr
   )r   r.   r/   r!   r1   r3   r   r   r   r*   V   s    z$ObjectInfoManager.get_exact_returnedc                s@   t |jddƒ}| |¡d t|ƒ… }t‡ fdd„|D ƒƒ}|S )NF)Úspecial_argsc                s   g | ]}ˆ   |¡‘qS r   )r	   )Ú.0Úarg)r   r   r   ú
<listcomp>a   s   z6ObjectInfoManager._args_to_textual.<locals>.<listcomp>)ÚlistÚget_param_namesZget_argumentsÚlenÚtuple)r   Ú
pyfunctionr/   Ú
parametersZ	argumentsZtextual_argsr   )r   r   r4   ^   s
    
z"ObjectInfoManager._args_to_textualc                sÐ   ˆ   |¡\}}|d krd S t|jddƒ}|}d g| }xxˆ j ||¡D ]f}| ¡ }xNt|d |… ƒD ]:\}	}
||	 }ˆ j |
|¡rf|
||	< ˆ j 	|
¡rf|d8 }qfW |dkrHP qHW ||k rÌ‡ fdd„|D ƒS d S )NF)r5   é   r   c                s   g | ]}ˆ   |¡‘qS r   )r
   )r6   Ú	parameter)r   r   r   r8   w   s   z;ObjectInfoManager.get_parameter_objects.<locals>.<listcomp>)
r+   r;   r:   r   r,   Úget_parametersÚ	enumerater   Úis_more_validÚis_value_valid)r   r.   r!   r1   Z	arg_countZunknownsr>   r2   r/   Úindexr7   r&   r   )r   r   Úget_parameter_objectse   s&    

z'ObjectInfoManager.get_parameter_objectsc       	      C   sn   |   |¡\}}|d krg S g }xJ| j ||¡D ]8}| ¡ }t|ƒ|kr.|  || ¡}|d k	r.| |¡ q.W |S )N)r+   r   r,   rA   r;   r
   r   )	r   r=   Zparameter_indexr!   r1   r0   r2   r/   r@   r   r   r   Úget_passed_objectsz   s    z$ObjectInfoManager.get_passed_objectsc                sh   ‡fdd„‰ ˆ |d ƒ}t ‡ fdd„|d D ƒƒ}ˆ |d ƒ}|d dkrdt|ƒd	krdˆ |||¡ d S )
Nc                s   ˆ   | ¡}ˆ  |¡S )N)r   r	   )Útextualr.   )r   r   r   Údoi_to_normalˆ   s    
z:ObjectInfoManager.doa_data_received.<locals>.doi_to_normalr   c                s   g | ]}ˆ |ƒ‘qS r   r   )r6   rH   )rI   r   r   r8   Œ   s    z7ObjectInfoManager.doa_data_received.<locals>.<listcomp>r?   é   Údefinedé   )r<   r;   Ú
_save_data)r   ÚdataÚfunctionr/   r3   r   )rI   r   r   Údoa_data_received‡   s    z#ObjectInfoManager.doa_data_receivedc                sH   ˆ   |¡}t‡ fdd„|D ƒƒ}d}|d k	r6ˆ   |¡}ˆ  |||¡ d S )Nc                s   g | ]}ˆ   |¡‘qS r   )r	   )r6   Zparam)r   r   r   r8   “   s   z5ObjectInfoManager.function_called.<locals>.<listcomp>)r(   )r	   r<   rM   )r   r=   Zparamsr3   Zfunction_textZparams_textZreturned_textr   )r   r   Úfunction_called‘   s    


z!ObjectInfoManager.function_calledc             C   s4   |   |j¡\}}|d k	r0| j ||||  |¡¡ d S )N)r+   r.   r   Zadd_pernamer	   )r   ÚscopeÚnamerN   r!   r1   r   r   r   Úsave_per_nameš   s    zObjectInfoManager.save_per_namec             C   s>   |   |j¡\}}|d k	r:| j |||¡}|d k	r:|  |¡S d S )N)r+   r.   r   Zget_pernamer
   )r   rR   rS   r!   r1   r0   r   r   r   Úget_per_nameŸ   s
    zObjectInfoManager.get_per_name©r(   c             C   s   | j  |d |d ||¡ d S )Nr?   rJ   )r   Zadd_callinfo)r   rO   r/   r3   r   r   r   rM   ¦   s    zObjectInfoManager._save_datac             C   s\   |  ¡  ¡ }|d krdS |  |¡}|d dkrX|d }t|ƒdkrL|d }nd}||fS dS )N)NNr   rK   r?   rL   rJ   Ú )Z
get_moduleZget_resourcer	   r;   )r   r.   r"   rH   r!   r1   r   r   r   r+   ©   s    

zObjectInfoManager._get_scopec             C   s   | j  ¡  d S )N)r   Úsync)r   r   r   r   rX   ·   s    zObjectInfoManager.syncc             C   s
   t | jƒS )N)Ústrr   )r   r   r   r   Ú__str__º   s    zObjectInfoManager.__str__)N)N)rV   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r-   r*   r4   rF   rG   rP   rQ   rT   rU   rM   r+   rX   rZ   r   r   r   r   r      s&   	


	
r   c               @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )r   c             C   s
   || _ d S )N)r
   )r   r
   r   r   r   r   À   s    zTextualValidation.__init__c             C   s&   |d ks|d dkrdS |   |¡d k	S )Nr   )r)   r(   F)r
   )r   Úvaluer   r   r   rD   Ã   s    z TextualValidation.is_value_validc             C   s   |d krdS |d dkS )NTr   )r(   r)   r   )r   r'   r&   r   r   r   rC   É   s    zTextualValidation.is_more_validc             C   s   | j  |¡d k	S )N)r
   r   )r   r!   r   r   r   Úis_file_validÎ   s    zTextualValidation.is_file_validc             C   s*   |dkrd|f}n
d||f}|   |¡d k	S )NrW   rK   )r
   )r   r!   r1   rH   r   r   r   Úis_scope_validÑ   s    

z TextualValidation.is_scope_validN)r[   r\   r]   r   rD   rC   r`   ra   r   r   r   r   r   ¾   s
   r   c               @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )r   c             C   s   || _ | j j| _| j j| _d S )N)Úobject_infor   r
   )r   rb   r   r   r   r   Û   s    
z_FileListObserver.__init__c             C   s$   | j  |¡}|d k	r | j |¡ d S )N)r
   r   r   r$   )r   r!   r"   r   r   r   r   à   s    z_FileListObserver.removedc             C   s$   | j  |¡}|d k	r | j |¡ d S )N)r
   r   r   r%   )r   r!   r"   r   r   r   Úaddedå   s    z_FileListObserver.addedN)r[   r\   r]   r   r   rc   r   r   r   r   r   Ù   s   r   )r   Z	rope.baser   r   Zrope.base.oir   r   r   Úobjectr   r   r   r   r   r   r   Ú<module>   s    8