U
    8h                     @  s   d dl mZ d dlZd dlZd dlmZ d dlmZmZ d dl	m
Z
 d dlmZmZ d dlmZ er|d dlmZ d d	lmZ d
dddddZG dd dZG dd deeZG dd deeZd
dd
dddZdS )    )annotationsN)dedent)IOTYPE_CHECKING)Path)	BaseCacheSeparateBodyBaseCache)CacheController)datetime)BaseFileLockstrintz	IO[bytes])filenamefmodereturnc                 C  s   t j}|t jt jB O }tt dr*|t jO }tt dr>|t jO }zt |  W n tk
r`   Y nX t 	| ||}zt 
|dW S    t |  Y nX d S )N
O_NOFOLLOWO_BINARYwb)osO_WRONLYO_CREATO_EXCLhasattrr   r   removeOSErroropenfdopenclose)r   r   flagsfd r    hC:\Users\jeffr\AppData\Local\Temp\pip-install-hfyjq797\pip\pip\_vendor\cachecontrol\caches\file_cache.py_secure_open_write   s     




r"   c                   @  s   e Zd ZdZd$ddddd	d
dddZedddddZdddddZdddddZd%dddd
dddZ	ddd
ddd Z
ddd
d!d"d#ZdS )&_FileCacheMixinz2Shared implementation for both FileCache variants.F    Nz
str | Pathboolr   ztype[BaseFileLock] | NoneNone)	directoryforeverfilemodedirmode
lock_classr   c                 C  sd   z|d krddl m} |}W n$ tk
r@   td}t|Y nX || _|| _|| _|| _|| _d S )Nr   )FileLockz
            NOTE: In order to use the FileCache you must have
            filelock installed. You can install it via pip:
              pip install cachecontrol[filecache]
            )	filelockr-   ImportErrorr   r(   r)   r*   r+   r,   )selfr(   r)   r*   r+   r,   r-   noticer    r    r!   __init__A   s    z_FileCacheMixin.__init__r   )xr   c                 C  s   t |   S N)hashlibsha224encode	hexdigest)r3   r    r    r!   r7   ^   s    z_FileCacheMixin.encode)namer   c                 C  s4   |  |}t|d d |g }tjj| jf| S )N   )r7   listr   pathjoinr(   )r0   r9   hashedpartsr    r    r!   _fnb   s    
z_FileCacheMixin._fnzbytes | Nonekeyr   c              
   C  sR   |  |}z,t|d}| W  5 Q R  W S Q R X W n tk
rL   Y d S X d S )Nrb)r@   r   readFileNotFoundError)r0   rB   r9   fhr    r    r!   geti   s    
 z_FileCacheMixin.getbyteszint | datetime | None)rB   valueexpiresr   c                 C  s   |  |}| || d S r4   r@   _write)r0   rB   rI   rJ   r9   r    r    r!   setr   s    
z_FileCacheMixin.set)r<   datar   c              
   C  sp   zt t j|| j W n tk
r.   Y nX | |d ( t|| j}|	| W 5 Q R X W 5 Q R X dS )z:
        Safely write the data to the given path.
        z.lockN)
r   makedirsr<   dirnamer+   r   r,   r"   r*   write)r0   r<   rN   rF   r    r    r!   rL   x   s    z_FileCacheMixin._write)rB   suffixr   c                 C  s<   |  || }| js8zt| W n tk
r6   Y nX d S r4   )r@   r)   r   r   rE   )r0   rB   rR   r9   r    r    r!   _delete   s    z_FileCacheMixin._delete)Fr$   r%   N)N)__name__
__module____qualname____doc__r2   staticmethodr7   r@   rG   rM   rL   rS   r    r    r    r!   r#   >   s       
 r#   c                   @  s    e Zd ZdZdddddZdS )	FileCachezc
    Traditional FileCache: body is stored in memory, so not suitable for large
    downloads.
    r   r'   rA   c                 C  s   |  |d d S )N rS   r0   rB   r    r    r!   delete   s    zFileCache.deleteN)rT   rU   rV   rW   r]   r    r    r    r!   rY      s   rY   c                   @  sB   e Zd ZdZdddddZdddd	d
dZdddddZdS )SeparateBodyFileCachezh
    Memory-efficient FileCache: body is stored in a separate file, reducing
    peak memory usage.
    r   zIO[bytes] | NonerA   c                 C  s6   |  |d }zt|dW S  tk
r0   Y d S X d S )N.bodyrC   )r@   r   rE   )r0   rB   r9   r    r    r!   get_body   s
    zSeparateBodyFileCache.get_bodyrH   r'   )rB   bodyr   c                 C  s   |  |d }| || d S )Nr_   rK   )r0   rB   ra   r9   r    r    r!   set_body   s    zSeparateBodyFileCache.set_bodyc                 C  s   |  |d |  |d d S )NrZ   r_   r[   r\   r    r    r!   r]      s    zSeparateBodyFileCache.deleteN)rT   rU   rV   rW   r`   rb   r]   r    r    r    r!   r^      s   r^   )url	filecacher   c                 C  s   t | }||S )z\Return the file cache path based on the URL.

    This does not ensure the file exists!
    )r	   	cache_urlr@   )rc   rd   rB   r    r    r!   url_to_file_path   s    
rf   )
__future__r   r5   r   textwrapr   typingr   r   pathlibr   Zpip._vendor.cachecontrol.cacher   r   Z#pip._vendor.cachecontrol.controllerr	   r
   r.   r   r"   r#   rY   r^   rf   r    r    r    r!   <module>   s   )R
