a
    
hC                     @   s  d 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
Z
ddlZddlmZmZ ddlmZ ddlmZ ddlmZ ddlmZmZmZ dd	lmZ ed
dZG dd deZdd ZG dd dedZ G dd de!Z"G dd de e"Z#dS )z.Storage providers backends for Memory caching.    N)ABCMetaabstractmethod)PicklingError   )numpy_pickle)concurrency_safe_rename)memstr_to_bytesmkdirp
rm_subdirs)format_timeCacheItemInfozpath size last_accessc                   @   s   e Zd ZdZdS )CacheWarningz:Warning to capture dump failures except for PicklingError.N)__name__
__module____qualname____doc__ r   r   ^/home/qiu/health_record_app/backend/venv/lib/python3.9/site-packages/joblib/_store_backends.pyr      s   r   c                 C   s,   t t }d||t }|| | |S )z>Writes an object into a unique file in a concurrency-safe way.z{}.thread-{}-pid-{})id	threadingcurrent_threadformatosgetpid)Zobject_to_writefilename
write_funcZ	thread_idtemporary_filenamer   r   r   concurrency_safe_write   s    
r   c                   @   sp   e Zd ZdZdZedd Zedd Zedd Zed	d
 Z	edd Z
edd Zede fddZdS )StoreBackendBasez^Helper Abstract Base Class which defines all methods that
    a StorageBackend must implement.Nc                 C   s   dS )a  Opens an item on the store and return a file-like object.

        This method is private and only used by the StoreBackendMixin object.

        Parameters
        ----------
        f: a file-like object
            The file-like object where an item is stored and retrieved
        mode: string, optional
            the mode in which the file-like object is opened allowed valued are
            'rb', 'wb'

        Returns
        -------
        a file-like object
        Nr   )selffmoder   r   r   
_open_item.   s    zStoreBackendBase._open_itemc                 C   s   dS )a  Checks if an item location exists in the store.

        This method is private and only used by the StoreBackendMixin object.

        Parameters
        ----------
        location: string
            The location of an item. On a filesystem, this corresponds to the
            absolute path, including the filename, of a file.

        Returns
        -------
        True if the item exists, False otherwise
        Nr   r   locationr   r   r   _item_existsA   s    zStoreBackendBase._item_existsc                 C   s   dS )a-  Moves an item from src to dst in the store.

        This method is private and only used by the StoreBackendMixin object.

        Parameters
        ----------
        src: string
            The source location of an item
        dst: string
            The destination location of an item
        Nr   )r   srcdstr   r   r   
_move_itemR   s    zStoreBackendBase._move_itemc                 C   s   dS )zCreates a location on the store.

        Parameters
        ----------
        location: string
            The location in the store. On a filesystem, this corresponds to a
            directory.
        Nr   r#   r   r   r   create_location`   s    z StoreBackendBase.create_locationc                 C   s   dS )zClears a location on the store.

        Parameters
        ----------
        location: string
            The location in the store. On a filesystem, this corresponds to a
            directory or a filename absolute path
        Nr   r#   r   r   r   clear_locationk   s    zStoreBackendBase.clear_locationc                 C   s   dS )zReturns the whole list of items available in the store.

        Returns
        -------
        The list of items identified by their ids (e.g filename in a
        filesystem).
        Nr   r   r   r   r   	get_itemsv   s    zStoreBackendBase.get_itemsr   c                 C   s   dS )a  Configures the store.

        Parameters
        ----------
        location: string
            The base location used by the store. On a filesystem, this
            corresponds to a directory.
        verbose: int
            The level of verbosity of the store
        backend_options: dict
            Contains a dictionary of named parameters used to configure the
            store backend.
        Nr   )r   r$   verbosebackend_optionsr   r   r   	configure   s    zStoreBackendBase.configure)r   r   r   r   r$   r   r"   r%   r(   r)   r*   r,   dictr/   r   r   r   r   r   (   s    







	r   )	metaclassc                   @   s   e Zd ZdZd&ddZd'ddZdd	 Zd
d Zdd Zdd Z	dd Z
dd Zdd Zd(ddZdd Zdd Zdd Zd)ddZd*d d!Zd"d# Zd$d% ZdS )+StoreBackendMixina  Class providing all logic for managing the store in a generic way.

    The StoreBackend subclass has to implement 3 methods: create_location,
    clear_location and configure. The StoreBackend also has to provide
    a private _open_item, _item_exists and _move_item methods. The _open_item
    method has to have the same signature as the builtin open and return a
    file-like object.
    r   Nc                 C   sL  t jj| jg|R  }|dkr|dur<dtt | nd}t j|d }|durd|v rddd	 |d  D }|d
|7 }d||}	|dk rt	d|	 nt	d|	| t
| dsdn| j}
t j|d}| |std| |
du r:| |d}t|}W d   n1 s.0    Y  ntj||
d}|S )z:Load an item from the store given its id as a list of str.r   Nz{: <16} r   Z
input_argsz, c                 s   s   | ]}d j | V  qdS )z{}={}N)r   .0itemr   r   r   	<genexpr>   s   z.StoreBackendMixin.load_item.<locals>.<genexpr>z({})z[Memory]{}: Loading {}
   z{0}...z{0} from {1}	mmap_mode
output.pklzANon-existing item (may have been cleared).
File %s does not existrb)r9   )r   pathjoinr$   r   r   timebasenameitemsprinthasattrr9   r%   KeyErrorr"   r   load)r   call_idr-   	timestampmetadata	full_pathZ	ts_string	signaturekwargsmsgr9   r   r    r6   r   r   r   	load_item   s:    



,zStoreBackendMixin.load_itemc              
      s   zjt jj jg|R  } |s, | t j|d}|dkrNtd|   fdd} ||| W n8 ty } z t	
d| dt W Y d}~n
d}~0 0 dS )	z;Dump an item in the store at the id given as a list of str.r:   r8   zPersisting in %sc                    s     |d`}ztj| | jd W n8 ty\ } z td| dt W Y d }~n
d }~0 0 W d    n1 sr0    Y  d S )Nwb)compresszjUnable to cache to disk: failed to pickle output. In version 1.5 this will raise an exception. Exception: .)r"   r   dumprN   r   warningswarnFutureWarning)to_writedest_filenamer    er+   r   r   r      s    z/StoreBackendMixin.dump_item.<locals>.write_funcz`Unable to cache to disk. Possibly a race condition in the creation of the directory. Exception: rO   N)r   r<   r=   r$   r%   r)   rA   _concurrency_safe_write	ExceptionrQ   rR   r   )r   rE   r6   r-   	item_pathr   r   rV   r   r+   r   	dump_item   s     

zStoreBackendMixin.dump_itemc                 C   s.   t jj| jg|R  }| |r*| | dS )z1Clear the item at the id, given as a list of str.Nr   r<   r=   r$   r%   r*   )r   rE   rY   r   r   r   
clear_item   s    
zStoreBackendMixin.clear_itemc                 C   s.   t jj| jg|R  }t j|d}| |S )z<Check if there is an item at the id, given as a list of str.r:   )r   r<   r=   r$   r%   )r   rE   rY   r   r   r   r   contains_item   s    zStoreBackendMixin.contains_itemc                 C   s   dt jj| jg|R  iS )zReturn information about item.r$   r   r<   r=   r$   r   rE   r   r   r   get_item_info   s    zStoreBackendMixin.get_item_infoc                 C   s   zjt jj| jg|R  }t j|d}| |d&}t| dW  d   W S 1 s^0    Y  W n   i  Y S 0 dS )z"Return actual metadata of an item.metadata.jsonr;   utf-8N)	r   r<   r=   r$   r"   jsonloadsreaddecode)r   rE   rY   r   r    r   r   r   get_metadata   s    8zStoreBackendMixin.get_metadatac                    s^   zLt jj jg|R  } | t j|d} fdd} ||| W n   Y n0 dS )z Store metadata of a computation.ra   c                    sF     |d&}|t| d W d    n1 s80    Y  d S )NrM   rb   )r"   writerc   dumpsencode)rT   rU   r    r+   r   r   r     s    z4StoreBackendMixin.store_metadata.<locals>.write_funcN)r   r<   r=   r$   r)   rW   )r   rE   rG   rY   r   r   r   r+   r   store_metadata   s    
z StoreBackendMixin.store_metadatac                 C   s    t jj| jg|R  }| |S )z,Check cached function is available in store.)r   r<   r=   r$   Zobject_existsr   rE   	func_pathr   r   r   contains_path  s    zStoreBackendMixin.contains_pathc                 C   s.   t jj| jg|R  }| |r*| | dS )z0Clear all items with a common path in the store.Nr[   rl   r   r   r   
clear_path  s    
zStoreBackendMixin.clear_pathc                 C   s   t jj| jg|R  }| |s*| | |dur|t j|d}| |d }||d W d   n1 sr0    Y  dS )&Store the code of the cached function.Nfunc_code.pyrM   rb   )	r   r<   r=   r$   r%   r)   r"   rh   rj   )r   rE   	func_coderm   r   r    r   r   r   store_cached_func_code  s    

z(StoreBackendMixin.store_cached_func_codec                 C   sn   t jj| jg|dR  }z@| |d }| dW  d   W S 1 sN0    Y  W n    Y n0 dS )rp   rq   r;   rb   N)r   r<   r=   r$   r"   re   rf   )r   rE   r   r    r   r   r   get_cached_func_code!  s    2z&StoreBackendMixin.get_cached_func_codec                 C   s   dt jj| jg|R  iS )z?Return information related to the cached function if it exists.r$   r^   r_   r   r   r   get_cached_func_info*  s    z&StoreBackendMixin.get_cached_func_infoc                 C   s   |  | j dS )zClear the whole store content.N)r*   r$   r+   r   r   r   clear.  s    zStoreBackendMixin.clearc              	   C   sX   |  |||}|D ]@}| jdkr.td| z| |j W q tyP   Y q0 qdS )zX
        Remove the store's oldest files to enforce item, byte, and age limits.
        r8   zDeleting item {0}N)_get_items_to_deleter-   rA   r   r*   r<   OSError)r   bytes_limititems_limit	age_limititems_to_deleter6   r   r   r   enforce_store_limits2  s    
z&StoreBackendMixin.enforce_store_limitsc                 C   sB  t |trt|}|  }|s"g S tdd |D }|durF|| }nd}|dur`t|| }nd}|durtdd |D }| dk rtdt	j	
 | }	nd}	|dkr|dkr|	du s||	krg S |jtdd g }
d}d}|D ]P}||kr ||kr |	du s|	|jk r  q>|
| ||j7 }|d	7 }q|
S )
zW
        Get items to delete to keep the store under size, file, & age limits.
        c                 s   s   | ]}|j V  qd S N)sizer4   r   r   r   r7   O      z9StoreBackendMixin._get_items_to_delete.<locals>.<genexpr>Nr   c                 s   s   | ]}|j V  qd S r~   )last_accessr4   r   r   r   r7   \  r   z(age_limit has to be a positive timedeltar   )keyr   )
isinstancestrr   r,   sumlenmintotal_seconds
ValueErrordatetimenowsortoperator
attrgetterr   appendr   )r   ry   rz   r{   r@   r   Zto_delete_sizeZto_delete_itemsZ
older_itemdeadliner|   Zsize_so_farZitems_so_farr6   r   r   r   rw   D  sZ    




z&StoreBackendMixin._get_items_to_deletec                 C   s   t |||}| || dS )z7Writes an object into a file in a concurrency-safe way.N)r   r(   )r   rT   r   r   r   r   r   r   rW     s    z)StoreBackendMixin._concurrency_safe_writec                 C   s   dj | jj| jdS )z/Printable representation of the store location.z#{class_name}(location="{location}"))
class_namer$   )r   	__class__r   r$   r+   r   r   r   __repr__  s    
zStoreBackendMixin.__repr__)r   NN)r   )N)NN)NN)r   r   r   r   rL   rZ   r\   r]   r`   rg   rk   rn   ro   rs   rt   ru   rv   r}   rw   rW   r   r   r   r   r   r2      s$   	
'


	

<r2   c                   @   sN   e Zd ZdZeeZeejj	Z
eeZdd Zdd Zdd Zdd
dZd	S )FileSystemStoreBackendz7A StoreBackend used with local or network file systems.c                 C   s&   || j krt| ntj|dd dS )zDelete location on store.T)ignore_errorsN)r$   r
   shutilrmtreer#   r   r   r   r*     s    

z%FileSystemStoreBackend.clear_locationc                 C   s   t | dS )zCreate object location on storeN)r	   r#   r   r   r   r)     s    z&FileSystemStoreBackend.create_locationc           	         s   g }t | jD ]\ }}tdt j }|rt j d}zt j|}W n< t	y   zt j }W n t	y   Y Y qY n0 Y n0 t
j
|}z( fdd|D }tdd |D }W n t	y   Y qY n0 |t || q|S )z7Returns the whole list of items available in the store.z[a-f0-9]{32}r:   c                    s   g | ]}t j |qS r   )r   r<   r=   r5   fndirpathr   r   
<listcomp>  r   z4FileSystemStoreBackend.get_items.<locals>.<listcomp>c                 s   s   | ]}t j|V  qd S r~   )r   r<   getsizer   r   r   r   r7     r   z3FileSystemStoreBackend.get_items.<locals>.<genexpr>)r   walkr$   rematchr<   r?   r=   getatimerx   r   fromtimestampr   r   r   )	r   r@   _	filenamesZis_cache_hash_dirZoutput_filenamer   Zfull_filenamesdirsizer   r   r   r,     s(    
z FileSystemStoreBackend.get_itemsr   Nc                 C   s   |du ri }|| _ tj| j s*t| j  tj|rRtj|dkrRtj|n|}ttj|dd$}|	d |	d W d   n1 s0    Y  |
dd| _|
d	}| jr|durtjd
dd || _|| _dS )zsConfigure the store backend.

        For this backend, valid store options are 'compress' and 'mmap_mode'
        NZjoblibz
.gitignorewz## Created by joblib automatically.
z*
rN   Fr9   zSCompressed items cannot be memmapped in a filesystem store. Option will be ignored.   )
stacklevel)r$   r   r<   existsr	   dirnamer?   openr=   rh   getrN   rQ   rR   r9   r-   )r   r$   r-   r.   Zcache_directoryfiler9   r   r   r   r/     s.    



(
z FileSystemStoreBackend.configure)r   N)r   r   r   r   staticmethodr   r"   r   r<   r   r%   r   r(   r*   r)   r,   r/   r   r   r   r   r     s    r   )$r   collectionsr   rc   r   r   os.pathr   r   r   r>   rQ   abcr   r   pickler   r3   r   Z	backportsr   Zdiskr   r	   r
   loggerr   
namedtupler   Warningr   r   r   objectr2   r   r   r   r   r   <module>   s0   	i |