o
    tBhc8                     @   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mZ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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   )concurrency_safe_rename)mkdirpmemstr_to_bytes
rm_subdirs)numpy_pickleCacheItemInfozpath size last_accessc                 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)object_to_writefilename
write_func	thread_idtemporary_filename r   m/var/www/html/riverr-enterprise-integrations-main/venv/lib/python3.10/site-packages/joblib/_store_backends.py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 )StoreBackendBasezaHelper Abstract Base Class which defines all methods that
       a StorageBackend must implement.Nc                 C      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'       zStoreBackendBase._open_itemc                 C   r   )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_exists:   r   zStoreBackendBase._item_existsc                 C   r   )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_itemK   r   zStoreBackendBase._move_itemc                 C   r   )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_locationY   r   z StoreBackendBase.create_locationc                 C   r   )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_locationd   r   zStoreBackendBase.clear_locationc                 C   r   )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_itemso   r   zStoreBackendBase.get_itemsr   c                 C   r   )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 dictionnary of named paremeters used to configure the
            store backend.
        Nr   )r   r!   verbosebackend_optionsr   r   r   	configurey   r   zStoreBackendBase.configure)__name__
__module____qualname____doc__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 Z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   s   t jj| jg|R  }|dkr#|dk rtd| ntd|| t| ds*dn| j}t j|d}| |s?t	d| |du ra| 
|d	}t|}W d   |S 1 sZw   Y  |S tj||d
}|S )zKLoad an item from the store given its path as a list of
           strings.r   
   z{0}...z{0} from {1}	mmap_modeN
output.pklzANon-existing item (may have been cleared).
File %s does not existrb)r5   )r   pathjoinr!   printr   hasattrr5   r"   KeyErrorr   r	   load)	r   r8   r*   msg	full_pathr5   r   r   itemr   r   r   	load_item   s,   

zStoreBackendMixin.load_itemc                    sz   z6t jj jg|R  } |s | t j|d}|dkr'td|   fdd} ||| W dS    Y dS )zLDump an item in the store at the path given as a list of
           strings.r6   r4   zPersisting in %sc                    sD     |d}tj| | jd W d    d S 1 sw   Y  d S )Nwb)compress)r   r	   dumprC   to_writedest_filenamer   r(   r   r   r      s
   "z/StoreBackendMixin.dump_item.<locals>.write_funcN)r   r8   r9   r!   r"   r&   r:   _concurrency_safe_write)r   r8   r@   r*   	item_pathr   r   r   r(   r   	dump_item   s   

zStoreBackendMixin.dump_itemc                 C   2   t jj| jg|R  }| |r| | dS dS )z7Clear the item at the path, given as a list of strings.Nr   r8   r9   r!   r"   r'   )r   r8   rI   r   r   r   
clear_item      
zStoreBackendMixin.clear_itemc                 C   s.   t jj| jg|R  }t j|d}| |S )zLCheck if there is an item at the path, given as a list of
           stringsr6   )r   r8   r9   r!   r"   )r   r8   rI   r   r   r   r   contains_item   s   
zStoreBackendMixin.contains_itemc                 C      dt jj| jg|R  iS )zReturn information about item.r!   r   r8   r9   r!   r   r8   r   r   r   get_item_info   s   
zStoreBackendMixin.get_item_infoc                 C   s|   z6t jj| jg|R  }t j|d}| |d}t| dW  d   W S 1 s/w   Y  W dS    i  Y S )z"Return actual metadata of an item.metadata.jsonr7   utf-8N)	r   r8   r9   r!   r   jsonloadsreaddecode)r   r8   rI   r   r   r   r   r   get_metadata   s   (zStoreBackendMixin.get_metadatac                    s\   z't jj jg|R  } | t j|d} fdd} ||| W dS    Y dS )z Store metadata of a computation.rT   c                    sH     |d}|t| d W d    d S 1 sw   Y  d S )NrB   rU   )r   writerV   dumpsencoderE   r(   r   r   r      s   "z4StoreBackendMixin.store_metadata.<locals>.write_funcN)r   r8   r9   r!   r&   rH   )r   r8   metadatarI   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   r8   r9   r!   object_existsr   r8   	func_pathr   r   r   contains_path   s   
zStoreBackendMixin.contains_pathc                 C   rK   )z0Clear all items with a common path in the store.NrL   ra   r   r   r   
clear_path   rN   zStoreBackendMixin.clear_pathc                 C   s   t jj| jg|R  }| |s| | |durAt j|d}| |d}||d W d   dS 1 s:w   Y  dS dS )&Store the code of the cached function.Nfunc_code.pyrB   rU   )	r   r8   r9   r!   r"   r&   r   r[   r]   )r   r8   	func_coderb   r   r   r   r   r   store_cached_func_code   s   

"z(StoreBackendMixin.store_cached_func_codec                 C   sl   |dg7 }t jj| jg|R  }z!| |d}| dW  d   W S 1 s*w   Y  W dS     )re   rf   r7   rU   N)r   r8   r9   r!   r   rX   rY   )r   r8   r   r   r   r   r   get_cached_func_code  s   
(z&StoreBackendMixin.get_cached_func_codec                 C   rP   )z?Return information related to the cached function if it exists.r!   rQ   rR   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   sR   |  |}|D ]}| jdkrtd| z| |j W q ty&   Y qw dS )z9Reduce store size to keep it under the given bytes limit.r4   zDeleting item {0}N)_get_items_to_deleter*   r:   r   r'   r8   OSError)r   bytes_limititems_to_deleter@   r   r   r   reduce_store_size  s   

z#StoreBackendMixin.reduce_store_sizec                 C   s   t |tr	t|}|  }tdd |D }|| }|dk r g S |jtdd g }d}|D ]}||kr8 |S || ||j	7 }q/|S )z9Get items to delete to keep the store under a size limit.c                 s   s    | ]}|j V  qd S N)size).0r@   r   r   r   	<genexpr>-  s    z9StoreBackendMixin._get_items_to_delete.<locals>.<genexpr>r   last_access)key)

isinstancestrr   r)   sumsortoperator
attrgetterappendrr   )r   rn   itemsrr   to_delete_sizero   size_so_farr@   r   r   r   rl   '  s"   

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   rF   r   r   r   r   r   r   rH   C  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__I  s   
zStoreBackendMixin.__repr__r   N)r   rq   )r-   r.   r/   r0   rA   rJ   rM   rO   rS   rZ   r_   rc   rd   rh   ri   rj   rk   rp   rl   rH   r   r   r   r   r   r3      s&    
	



r3   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| dS tj|dd dS )zDelete location on store.T)ignore_errorsN)r!   r   shutilrmtreer    r   r   r   r'   V  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 ]j\ }}tdt j }|rrt j d}zt j|}W n t	yD   zt j }W n
 t	yA   Y Y qw Y nw t
j
|}z fdd|D }tdd |D }W n	 t	yh   Y qw |t || q|S )z7Returns the whole list of items available in the store.z[a-f0-9]{32}r6   c                    s   g | ]	}t j |qS r   )r   r8   r9   rs   fndirpathr   r   
<listcomp>v  s    z4FileSystemStoreBackend.get_items.<locals>.<listcomp>c                 s   s    | ]	}t j|V  qd S rq   )r   r8   getsizer   r   r   r   rt   x  s    z3FileSystemStoreBackend.get_items.<locals>.<genexpr>)r   walkr!   rematchr8   basenamer9   getatimerm   datetimefromtimestampry   r}   r
   )	r   r~   _	filenamesis_cache_hash_diroutput_filenameru   full_filenamesdirsizer   r   r   r)   a  sB   


z FileSystemStoreBackend.get_itemsr   Nc                 C   sn   |du ri }|| _ tj| j st| j  |dd| _|d}| jr/|dur/tjddd || _	|| _
dS )zsConfigure the store backend.

        For this backend, valid store options are 'compress' and 'mmap_mode'
        NrC   Fr5   zSCompressed items cannot be memmapped in a filesystem store. Option will be ignored.   )
stacklevel)r!   r   r8   existsr   getrC   warningswarnr5   r*   )r   r!   r*   r+   r5   r   r   r   r,     s   


z FileSystemStoreBackend.configurer   )r-   r.   r/   r0   staticmethodopenr   r   r8   r   r"   r   r%   r'   r&   r)   r,   r   r   r   r   r   O  s    $r   )r0   r   r   os.pathr   rV   r   r   collectionsr{   r   abcr   r   	backportsr   diskr   r   r    r	   
namedtupler
   r   r   objectr3   r   r   r   r   r   <module>   s.    
i F