B
    M§a!  ã               @   sX  U d dl Z d dlZd dlZd dlZd dl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 d dlmZmZ e e¡ZdZdZdZdZde ¡ ejd  ejd ef Zd	d
„ Zeƒ ZdZd(dd„Zi Zeeef ed< G dd„ dƒZ d)dd„Z!d*dd„Z"dd„ Z#d+dd„Z$d,dd„Z%d-dd„Z&defdd„Z'd d!„ Z(d.d"d#„Z)d/d$d%„Z*d0d&d'„Z+dS )1é    N)ÚPath)ÚDictÚAnyiX  i ' é!   z
%s-%s%s-%sé   c              C   sd   t  ¡  ¡ dkr(tt d¡pdddƒ} n4t  ¡  ¡ dkrHtddddƒ} ntt d¡pVd	d
ƒ} |  ¡ S )NZwindowsZLOCALAPPDATAú~ZParsoÚdarwinÚLibraryZCachesZXDG_CACHE_HOMEz~/.cacheZparso)ÚplatformÚsystemÚlowerr   ÚosÚgetenvÚ
expanduser)Zdir_© r   ú*lib/python3.7/site-packages/parso/cache.pyÚ_get_default_cache_pathB   s    r   i€Q c             C   s   | pt } |  d¡S )zÈ
    The path where the cache lock is stored.

    Cache lock will prevent continous cache clearing and only allow garbage
    collection once a day (can be configured in _CACHE_CLEAR_THRESHOLD).
    zPARSO-CACHE-LOCK)Ú_default_cache_pathÚjoinpath)Ú
cache_pathr   r   r   Ú_get_cache_clear_lock_pathY   s    r   Úparser_cachec               @   s   e Zd Zddd„ZdS )Ú_NodeCacheItemNc             C   s,   || _ || _|d krt ¡ }|| _|| _d S )N)ÚnodeÚlinesÚtimeÚchange_timeÚ	last_used)Úselfr   r   r   r   r   r   Ú__init__h   s    z_NodeCacheItem.__init__)N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   g   s   r   c          	   C   sh   |  ¡ }|dkrdS y,t|  |j }||jkr>t ¡ |_|jS W n" tk
rb   t| |j||dS X dS )z0
    Returns a module or None, if it fails.
    N)r   )	Úget_last_modifiedr   Úpathr   r   r   r   ÚKeyErrorÚ_load_from_file_system)Úhashed_grammarÚfile_ior   Úp_timeÚmodule_cache_itemr   r   r   Úload_moduleq   s    


r+   c          	   C   s–   t | ||d}yP|tj |¡kr$d S t|dƒ(}t ¡  zt |¡}W d t 	¡  X W d Q R X W n t
k
rr   d S X t| ||ƒ t d|¡ |jS d S )N)r   Úrbzpickle loaded: %s)Ú_get_hashed_pathr   r$   ÚgetmtimeÚopenÚgcÚdisableÚpickleÚloadÚenableÚFileNotFoundErrorÚ_set_cache_itemÚLOGÚdebugr   )r'   r$   r)   r   Úfr*   r   r   r   r&   ‡   s    r&   c                sj   t dd„ t ¡ D ƒƒtkrVt ¡ t ‰ x.t ¡ D ]"\}}‡ fdd„| ¡ D ƒt|< q0W |t | i ¡|< d S )Nc             s   s   | ]}t |ƒV  qd S )N)Úlen)Ú.0Úvr   r   r   ú	<genexpr>   s    z"_set_cache_item.<locals>.<genexpr>c                s    i | ]\}}|j ˆ kr||“qS r   )r   )r;   r$   Z	node_item)Úcutoff_timer   r   ú
<dictcomp>£   s   z#_set_cache_item.<locals>.<dictcomp>)Úsumr   ÚvaluesÚ_CACHED_SIZE_TRIGGERr   Ú_CACHED_FILE_MINIMUM_SURVIVALÚitemsÚ
setdefault)r'   r$   r*   ÚkeyZpath_to_item_mapr   )r>   r   r6   œ   s    
r6   Tc       	      C   s¨   |j }y|d krd n| ¡ }W n tk
r:   d }d}Y nX t|||ƒ}t| ||ƒ |r¤|d k	r¤yt| |||d W n$ tk
r˜   t d| t	¡ Y nX t
|d d S )NF)r   z6Tried to save a file to %s, but got permission denied.)r$   r#   ÚOSErrorr   r6   Ú_save_to_file_systemÚPermissionErrorÚwarningsÚwarnÚWarningÚ_remove_cache_and_update_lock)	r'   r(   Úmoduler   Zpicklingr   r$   r)   Úitemr   r   r   Útry_to_save_module¬   s     
rP   c          	   C   s4   t t| ||ddƒ}t ||tj¡ W d Q R X d S )N)r   Úwb)r/   r-   r2   ÚdumpZHIGHEST_PROTOCOL)r'   r$   rO   r   r9   r   r   r   rH   Å   s    rH   c             C   s"   | d krt } t | ¡ t ¡  d S )N)r   ÚshutilZrmtreer   Úclear)r   r   r   r   Úclear_cacheÊ   s    
rU   c          
   C   sš   | d krt } |  ¡ sdS x|t | ¡D ]j}|  |¡}| ¡ s<q$xPt |¡D ]B}| ¡ jt	 t
 
¡ krHyt |j¡ W qH tk
rˆ   wHY qHX qHW q$W dS d S )NFT)r   Úexistsr   Úlistdirr   Úis_dirÚscandirÚstatÚst_atimeÚ_CACHED_FILE_MAXIMUM_SURVIVALr   Úremover$   rG   )r   Zinactivity_thresholdÚdirnameZversion_pathÚfiler   r   r   Úclear_inactive_cacheÑ   s    
r`   c             C   sZ   yt  | d ¡ W nD tk
rT   yt| dƒ}| ¡  W n ttfk
rN   dS X Y nX dS )NÚaFT)r   Úutimer5   r/   ÚcloserG   ÚIOError)r$   r_   r   r   r   Ú_touchç   s    
re   c             C   sf   t | d}ytj |¡}W n tk
r2   d }Y nX |d ksL|t t ¡ krbt|ƒsXdS t| d d S )N)r   F)	r   r   r$   r.   r5   Ú_CACHE_CLEAR_THRESHOLDr   re   r`   )r   Z	lock_pathZclear_lock_timer   r   r   rM   ó   s    

rM   c             C   s8   t |d}t t|ƒ d¡¡ ¡ }tj |d| |f ¡S )N)r   zutf-8z	%s-%s.pkl)	Ú_get_cache_directory_pathÚhashlibZsha256ÚstrÚencodeZ	hexdigestr   r$   Újoin)r'   r$   r   Ú	directoryZ	file_hashr   r   r   r-     s    
r-   c             C   s,   | d krt } |  t¡}| ¡ s(t |¡ |S )N)r   r   Ú_VERSION_TAGrV   r   Úmakedirs)r   rl   r   r   r   rg     s    

rg   )N)N)N)TN)N)N)N)N)N),r   r   Úsysrh   r0   rS   r
   ZloggingrJ   r2   Zpathlibr   Útypingr   r   Z	getLoggerr    r7   rC   r\   rB   Z_PICKLE_VERSIONZpython_implementationÚversion_inform   r   r   rf   r   r   ri   Ú__annotations__r   r+   r&   r6   rP   rH   rU   r`   re   rM   r-   rg   r   r   r   r   Ú<module>   sP    












