B
    öt\·  ã               @   s  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yd dl	Z
W n   d dl
Z
Y nX d dlmZ e e¡ZdZde ¡ ejd  ejd ef Zdd„ Zeƒ Zi ZG dd	„ d	eƒZdd
d„Zddd„Zddd„Zddd„Zddd„Zddd„Zddd„ZdS ) é    N)ÚFileNotFoundErroré   z
%s-%s%s-%sé   c              C   st   t  ¡  ¡ dkr,tj t d¡p"ddd¡} n<t  ¡  ¡ dkrPtj dddd¡} ntj t d¡pbd	d
¡} tj | ¡S )NZwindowsZLOCALAPPDATAú~ZParsoÚdarwinÚLibraryZCachesZXDG_CACHE_HOMEz~/.cacheZparso)ÚplatformÚsystemÚlowerÚosÚpathÚjoinÚgetenvÚ
expanduser)Zdir_© r   ú*lib/python3.7/site-packages/parso/cache.pyÚ_get_default_cache_path0   s    r   c               @   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)Úselfr   r   r   r   r   r   Ú__init__G   s
    z_NodeCacheItem.__init__)N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   F   s   r   c          	   C   sl   yt j |¡}W n tk
r$   dS X y t|  | }||jkrD|jS W n  tk
rf   t| |||dS X dS )z0
    Returns a module or None, if it fails.
    N)Ú
cache_path)	r   r   Úgetmtimer   Úparser_cacher   r   ÚKeyErrorÚ_load_from_file_system)Úhashed_grammarr   r   Úp_timeÚmodule_cache_itemr   r   r   Úload_moduleO   s    

r%   c          
   C   sÖ   t | ||d}yŒy|tj |¡kr&d S W n6 tk
r^ } z|jtjkrLt‚n‚ W d d }~X Y nX t|dƒ(}t	 
¡  zt |¡}W d t	 ¡  X W d Q R X W n tk
r®   d S X |t | i ¡|< t d|¡ |jS d S )N)r   Úrbzpickle loaded: %s)Ú_get_hashed_pathr   r   r   ÚOSErrorÚerrnoZENOENTr   ÚopenÚgcÚdisableÚpickleÚloadÚenabler   Ú
setdefaultÚLOGÚdebugr   )r"   r   r#   r   ÚeÚfr$   r   r   r   r!   `   s&    r!   Tc             C   sv   y|d krd n
t j |¡}W n tk
r8   d }d}Y nX t|||ƒ}|t | i ¡|< |rr|d k	rrt| |||d d S )NF)r   )r   r   r   r(   r   r   r0   Ú_save_to_file_system)r"   r   Úmoduler   Zpicklingr   r#   Úitemr   r   r   Úsave_module|   s    
r8   c          	   C   s4   t t| ||ddƒ}t ||tj¡ W d Q R X d S )N)r   Úwb)r*   r'   r-   ÚdumpZHIGHEST_PROTOCOL)r"   r   r7   r   r4   r   r   r   r5   ‰   s    r5   c             C   s"   | d krt } t | ¡ t ¡  d S )N)Ú_default_cache_pathÚshutilZrmtreer   Úclear)r   r   r   r   Úclear_cacheŽ   s    
r>   c             C   s4   t |d}t | d¡¡ ¡ }tj |d| |f ¡S )N)r   zutf-8z	%s-%s.pkl)Ú_get_cache_directory_pathÚhashlibZsha256ÚencodeZ	hexdigestr   r   r   )r"   r   r   Ú	directoryZ	file_hashr   r   r   r'   •   s    
r'   c             C   s4   | d krt } tj | t¡}tj |¡s0t |¡ |S )N)r;   r   r   r   Ú_VERSION_TAGÚexistsÚmakedirs)r   rB   r   r   r   r?   œ   s    
r?   )N)N)TN)N)N)N)N) r   r   Úsysr@   r+   r<   r   r)   ZloggingZcPickler-   Zparso._compatibilityr   Z	getLoggerr   r1   Z_PICKLE_VERSIONZpython_implementationÚversion_inforC   r   r;   r   Úobjectr   r%   r!   r8   r5   r>   r'   r?   r   r   r   r   Ú<module>   s>   

	
	





