U
    {±ËhÇ  ã                   @   s
  d dl m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m	Z	 d dl
Z
ddlmZ zd dlZe
jZW n ek
r„   e
jZY nX zd dlZejZdZW n ek
r¸   eZdZY nX dZd	Ze	ejjƒZe	d
d„ ƒZe	dd„ ƒZeG dd„ dƒƒZG dd„ dƒZdS )é    )Ú	dataclassNé   )Úsafe_makedirsÚcached_function)Ú__version__z.gzÚ z.zipi  @c              	   C   sn   t j | ¡}dt|ƒ|f  d¡}t |¡}t|dƒ*}| d¡}|r\| 	|¡ | d¡}qBW 5 Q R X | 
¡ S )Nz%d:%súUTF-8Úrbièý  )ÚosÚpathÚnormpathÚlenÚencodeÚhashlibÚsha256ÚopenÚreadÚupdateÚ	hexdigest)Úfilenamer   ÚprefixÚmÚfÚdata© r   ú6/tmp/pip-unpacked-wheel-fhl22ezh/Cython/Build/Cache.pyÚ	file_hash"   s    


r   c                  C   sr   dt jkrt jd S d} t jdkrFtjdkr:t j d¡} nt j d¡} | r`t j | ¡r`t	| dƒS t j t	dd	ƒ¡S )
zé
    Return the base directory containing Cython's caches.

    Priority:

    1. CYTHON_CACHE_DIR
    2. (OS X): ~/Library/Caches/Cython
       (posix not OS X): XDG_CACHE_HOME/cython if XDG_CACHE_HOME defined
    3. ~/.cython

    ZCYTHON_CACHE_DIRNÚposixÚdarwinz~/Library/CachesÚXDG_CACHE_HOMEZcythonú~z.cython)
r
   ÚenvironÚnameÚsysÚplatformr   Ú
expanduserÚgetÚisdirÚ	join_path)Úparentr   r   r   Úget_cython_cache_dir/   s    




r*   c                   @   s:   e Zd ZU dZeed< dZeed< dZeed< dd„ Z	dS )	ÚFingerprintFlagsÚcÚlanguageFÚpy_limited_apiÚ
np_pythranc                 C   s   t | j| j| jfƒS ©N)Ústrr-   r.   r/   )Úselfr   r   r   Úget_fingerprintT   s    z FingerprintFlags.get_fingerprintN)
Ú__name__Ú
__module__Ú__qualname__r-   r1   Ú__annotations__r.   Úboolr/   r3   r   r   r   r   r+   N   s   
r+   c                   @   sN   e Zd Zddd„Zeƒ fdd„Zdd„ Zdd	„ Zd
d„ Zdd„ Z	ddd„Z
dS )ÚCacheNc                 C   sN   |d krt tƒ dƒ| _n|| _|d k	r*|nt| _tj | j¡sJt | j¡ d S )NÚcompiler)r(   r*   r   ÚMAX_CACHE_SIZEÚ
cache_sizer
   ÚexistsÚmakedirs)r2   r   r<   r   r   r   Ú__init__Y   s    zCache.__init__c                 C   s¨   zŒt  t d¡¡}| t|ƒ d¡¡ t|ƒD ],}tj 	|¡d dkr.| t|ƒ d¡¡ q.| | 
¡  d¡¡ | | 
¡  d¡¡ | ¡ W S  tk
r¢   Y dS X dS )a;  
        Return a fingerprint of a cython file that is about to be cythonized.

        Fingerprints are looked up in future compilations. If the fingerprint
        is found, the cythonization can be skipped. The fingerprint must
        incorporate everything that has an influence on the generated code.
        r   é   )z.cz.cppz.hN)r   r   r   r   r   r   Úsortedr
   r   Úsplitextr3   r   ÚOSError)r2   r   ZdependenciesZcompilation_optionsÚflagsr   Úxr   r   r   Útransitive_fingerprintb   s    

zCache.transitive_fingerprintc                 C   s    t | jdtj |¡|f ƒ| S )Nz%s-%s)r(   r   r
   Úbasename)r2   ÚcfileÚfingerprintÚextr   r   r   Úfingerprint_file}   s    ÿzCache.fingerprint_filec                 C   sX   t j | j¡st| jƒ |  ||t¡}t j |¡r6|S |  ||t¡}t j |¡rT|S d S r0   )r
   r   r=   r   rK   Úgzip_extÚzip_ext)r2   Úc_filerI   Zgz_fingerprint_fileZzip_fingerprint_filer   r   r   Úlookup_cache‚   s    
zCache.lookup_cachec           	   
   C   sÈ   t j |¡d }|tkr^t  |d ¡ t|dƒ(}t|dƒ}t ||¡ W 5 Q R X W 5 Q R X nf|t	kr¶t  |d ¡ t j 
|¡}t |¡&}| ¡ D ]}| |t||ƒ¡ q’W 5 Q R X ntd|› ƒ‚d S )Nr@   r	   Úwbz"Unsupported cache file extension: )r
   r   rB   rL   ÚutimeÚ	gzip_openr   ÚshutilÚcopyfileobjrM   ÚdirnameÚzipfileÚZipFileÚnamelistÚextractr(   Ú
ValueError)	r2   rN   ÚcachedrJ   Úgr   rU   ÚzÚartifactr   r   r   Úload_from_cache   s    " zCache.load_from_cachec           
   
   C   s¾   |  ¡ }t|ƒdkr`|  ||t¡}t|dƒ,}t|d dƒ}t ||¡ W 5 Q R X W 5 Q R X nJ|  ||t¡}t	 
|d dt¡$}|D ]}	| |	tj |	¡¡ q†W 5 Q R X t |d |¡ d S )Nr@   r	   z.tmprP   Úw)Zget_generated_source_filesr   rK   rL   r   rR   rS   rT   rM   rV   rW   Úzipfile_compression_modeÚwriter
   r   rG   Úrename)
r2   rN   rI   Zcompilation_resultZ	artifactsrK   r   r\   Úzipr^   r   r   r   Ústore_to_cacheŸ   s     "  ÿ zCache.store_to_cacheç333333ë?c              	   C   s  z^t jdddtj | j¡gt jd}|j}|jdkr\dt| 	¡  
¡ d ƒ }|| jk r\W d S W n ttfk
rv   Y nX d}g }t | j¡D ]8}t| j|ƒ}t |¡}||j7 }| |j|j|f¡ qŒ|| jkrtt|ƒƒD ]0\}	}
}t |¡ ||
8 }|| j| k rÞ qqÞd S )NZduz-sz-k)Ústdoutr   i   )Ú
subprocessÚrunr
   r   ÚabspathÚPIPErg   Ú
returncodeÚintÚstripÚsplitr<   rC   rZ   Úlistdirr(   ÚstatÚst_sizeÚappendÚst_atimeÚreversedrA   Úunlink)r2   ZratioZcompleted_processrg   Z
total_sizeÚallÚfiler   ÚsÚtimeÚsizer   r   r   Úcleanup_cache¯   s2     ÿ





zCache.cleanup_cache)N)rf   )r4   r5   r6   r?   r+   rF   rK   rO   r_   re   r|   r   r   r   r   r9   X   s   

ÿ
r9   )Zdataclassesr   r#   r
   r   rS   rh   ZUtilsr   r   rV   r   r   ÚzlibÚZIP_DEFLATEDra   ÚImportErrorÚ
ZIP_STOREDÚgzipr   rR   rL   rM   r;   r   Újoinr(   r   r*   r+   r9   r   r   r   r   Ú<module>   s<   



	