B
    uf                 @  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m	Z	 d dl
mZ d dlmZmZ d dlmZ erd 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Union)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 }yt |  W n tk
r`   Y nX t 	| ||}yt 
|d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!   `/home/ankuromar296_gmail_com/myenv/lib/python3.7/site-packages/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   y|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)r4   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)   )r1   r9   hashedpartsr!   r!   r"   _fnb   s    
z_FileCacheMixin._fnzbytes | None)keyr   c          	   C  sB   |  |}yt|d
}| S Q R X W n tk
r<   d S X d S )Nrb)r@   r   readFileNotFoundError)r1   rA   r9   fhr!   r!   r"   geti   s    
z_FileCacheMixin.getbyteszint | datetime | None)rA   valueexpiresr   c             C  s   |  |}| || d S )N)r@   _write)r1   rA   rH   rI   r9   r!   r!   r"   setr   s    
z_FileCacheMixin.set)r<   datar   c          
   C  sp   yt t j|| j W n tk
r.   Y nX | |d ( t|| j}|	| W dQ R X W dQ R X dS )z:
        Safely write the data to the given path.
        z.lockN)
r   makedirsr<   dirnamer,   r   r-   r#   r+   write)r1   r<   rL   rE   r!   r!   r"   rJ   x   s    z_FileCacheMixin._write)rA   suffixr   c             C  s<   |  || }| js8yt| W n tk
r6   Y nX d S )N)r@   r*   r   r   rD   )r1   rA   rP   r9   r!   r!   r"   _delete   s    z_FileCacheMixin._delete)Fr%   r&   N)N)__name__
__module____qualname____doc__r3   staticmethodr7   r@   rF   rK   rJ   rQ   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   r   c             C  s   |  |d d S )N )rQ   )r1   rA   r!   r!   r"   delete   s    zFileCache.deleteN)rR   rS   rT   rU   rY   r!   r!   r!   r"   rW      s   rW   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] | None)rA   r   c             C  s2   |  |d }y
t|dS  tk
r,   d S X d S )Nz.bodyrB   )r@   r   rD   )r1   rA   r9   r!   r!   r"   get_body   s
    
zSeparateBodyFileCache.get_bodyrG   r(   )rA   bodyr   c             C  s   |  |d }| || d S )Nz.body)r@   rJ   )r1   rA   r\   r9   r!   r!   r"   set_body   s    zSeparateBodyFileCache.set_bodyc             C  s   |  |d |  |d d S )NrX   z.body)rQ   )r1   rA   r!   r!   r"   rY      s    zSeparateBodyFileCache.deleteN)rR   rS   rT   rU   r[   r]   rY   r!   r!   r!   r"   rZ      s   rZ   )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@   )r^   r_   rA   r!   r!   r"   url_to_file_path   s    
ra   )
__future__r   r5   r   textwrapr   typingr   r   r   pathlibr   Zcachecontrol.cacher   r	   Zcachecontrol.controllerr
   r   r/   r   r#   r$   rW   rZ   ra   r!   r!   r!   r"   <module>   s   )R
