U
    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 )NwindowsLOCALAPPDATA~ZParsodarwinLibraryZCachesXDG_CACHE_HOMEz~/.cacheparso)platformsystemlowerr   osgetenv
expanduser)Zdir_ r   \/mounts/lovelace/software/anaconda3/envs/rescript/lib/python3.8/site-packages/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    

r1   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   fr0   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#   )rA   r*   	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*   r0   keyZpath_to_item_mapr   rE   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    picklingr   r*   r/   itemr   r   r   try_to_save_module   s"    

rX   c              	   C   s4   t t| ||dd}t||tj W 5 Q R X d S )Nr   wb)r5   r3   r9   dumpHIGHEST_PROTOCOL)r-   r*   rW   r   r?   r   r   r   rO      s    rO   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*   rN   )r   Zinactivity_thresholddirnameZversion_pathfiler   r   r   clear_inactive_cache   s    
rj   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;   r5   closerN   IOError)r*   ri   r   r   r   _touch   s    
ro   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*   r4   r;   _CACHE_CLEAR_THRESHOLDr!   ro   rj   )r   Z	lock_pathZclear_lock_timer   r   r   rT      s    

rT   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   r3     s    
r3   c                 C   s,   | d krt } | t}| s(t| |S r   )r   r   _VERSION_TAGr`   r   makedirs)r   rx   r   r   r   rq     s    

rq   )N)N)N)TN)N)N)N)N)N),r!   r   sysrr   r6   r\   r   loggingrQ   r9   pathlibr   typingr   r   	getLoggerr&   r=   rJ   rf   rI   Z_PICKLE_VERSIONpython_implementationversion_infory   r   r   rp   r   r   rt   __annotations__r   r1   r,   r<   rX   rO   r_   rj   ro   rT   r3   rq   r   r   r   r   <module>   sT    





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