U
    nuf!                     @   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windowsLOCALAPPDATA~ZParsodarwinLibraryZCachesXDG_CACHE_HOMEz~/.cacheZparso)platformsystemlowerr   osgetenv
expanduser)dir_ r   //tmp/pip-unpacked-wheel-bhkpgl14/parso/cache.py_get_default_cache_pathB   s    r   iQ 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   sn   |  }|dkrdS z.t|  |j }||jkr@t |_|jW S W n& tk
rh   t| |j||d Y S X dS )z0
    Returns a module or None, if it fails.
    Nr   )	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    

r0   c              	   C   s   t | ||d}zR|tj|kr&W d S t|d(}t  zt	|}W 5 t  X W 5 Q R X W n t
k
rv   Y d S X t| || td| |jS d S )Nr   rbzpickle loaded: %s)_get_hashed_pathr   r)   getmtimeopengcdisableenablepickleloadFileNotFoundError_set_cache_itemLOGdebugr   )r,   r)   r.   r   fr/   r   r   r   r+      s    r+   c                    sf   t dd t D tkrRt t  t D ]"\}} fdd| D t|< q.|t| i |< d S )Nc                 s   s   | ]}t |V  qd S r   )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Z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   rC   r   r;      s    
r;   Tc           	      C   s   |j }z|d krd n| }W n tk
r:   d }d}Y nX t|||}t| || |r|d k	rzt| |||d W n$ tk
r   td| t	 Y nX t
|d d S )NFr   z6Tried to save a file to %s, but got permission denied.)r)   r(   OSErrorr   r;   _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"    

rU   c              	   C   s4   t t| ||dd}t||tj W 5 Q R X d S )Nr   wb)r4   r2   r8   dumpHIGHEST_PROTOCOL)r,   r)   rT   r   r>   r   r   r   rM      s    rM   c                 C   s"   | d krt } t|  t  d S r   )r   shutilrmtreer   clearr   r   r   r   clear_cache   s    
r\   c              
   C   s   | d krt } |  sdS t| D ]h}| |}| s:q"t|D ]D}| jt	 t

 krDzt|j W qD tk
r   Y qDY qDX qDq"dS )NFT)r   existsr   listdirr   is_dirscandirstatst_atime_CACHED_FILE_MAXIMUM_SURVIVALr    remover)   rL   )r   Zinactivity_thresholddirnameZversion_pathfiler   r   r   clear_inactive_cache   s    
rg   c                 C   s^   zt | d  W nH tk
rX   zt| d}|  W n ttfk
rR   Y Y dS X Y nX dS )NaFT)r   utimer:   r4   closerL   IOError)r)   rf   r   r   r   _touch   s    
rl   c                 C   sf   t | d}ztj|}W n tk
r2   d }Y nX |d ksL|t t krbt|sXdS t| d d S )Nr   F)	r   r   r)   r3   r:   _CACHE_CLEAR_THRESHOLDr    rl   rg   )r   Z	lock_pathZclear_lock_timer   r   r   rR      s    

rR   c                 C   s8   t |d}tt|d }tj|d| |f S )Nr   zutf-8z	%s-%s.pkl)	_get_cache_directory_pathhashlibsha256strencode	hexdigestr   r)   join)r,   r)   r   	directoryZ	file_hashr   r   r   r2     s    
r2   c                 C   s,   | d krt } | t}| s(t| |S r   )r   r   _VERSION_TAGr]   r   makedirs)r   ru   r   r   r   rn     s    

rn   )N)N)N)TN)N)N)N)N)N),r    r   sysro   r5   rY   r   loggingrO   r8   pathlibr   typingr   r   	getLoggerr%   r<   rH   rc   rG   Z_PICKLE_VERSIONpython_implementationversion_inforv   r   r   rm   r   r   rq   __annotations__r   r0   r+   r;   rU   rM   r\   rg   rl   rR   r2   rn   r   r   r   r   <module>   sT    





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