a
    ag                     @   sp   d dl Z d dlZd dlZd dlmZ d dlmZmZmZm	Z	m
Z
mZ d dlmZ d dlmZ G dd deZdS )    N)Path)IteratorListOptionalSequenceTupleUnion)	ByteStore)InvalidKeyExceptionc                   @   s   e Zd ZdZddddeeef ee ee e	ddddZ
eedd	d
ZeddddZee eee  dddZeeeef  ddddZee ddddZdee ee dddZdS )LocalFileStorea  BaseStore interface that works on the local file system.

    Examples:
        Create a LocalFileStore instance and perform operations on it:

        .. code-block:: python

            from langchain.storage import LocalFileStore

            # Instantiate the LocalFileStore with the root path
            file_store = LocalFileStore("/path/to/root")

            # Set values for keys
            file_store.mset([("key1", b"value1"), ("key2", b"value2")])

            # Get values for keys
            values = file_store.mget(["key1", "key2"])  # Returns [b"value1", b"value2"]

            # Delete keys
            file_store.mdelete(["key1"])

            # Iterate over keys
            for key in file_store.yield_keys():
                print(key)  # noqa: T201

    NF)
chmod_file	chmod_dirupdate_atime)	root_pathr   r   r   returnc                C   s$   t | | _|| _|| _|| _dS )an  Implement the BaseStore interface for the local file system.

        Args:
            root_path (Union[str, Path]): The root path of the file store. All keys are
                interpreted as paths relative to this root.
            chmod_file: (optional, defaults to `None`) If specified, sets permissions
                for newly created files, overriding the current `umask` if needed.
            chmod_dir: (optional, defaults to `None`) If specified, sets permissions
                for newly created dirs, overriding the current `umask` if needed.
            update_atime: (optional, defaults to `False`) If `True`, updates the
                filesystem access time (but not the modified time) when a file is read.
                This allows MRU/LRU cache policies to be implemented for filesystems
                where access time updates are disabled.
        N)r   absoluter   r   r   r   )selfr   r   r   r    r   k/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain/storage/file_system.py__init__(   s    zLocalFileStore.__init__)keyr   c              	   C   sz   t d|std| tj| j| }tjt| j|g}|t| jkrrtd| d| j d| d| t	|S )zGet the full path for a given key relative to the root path.

        Args:
            key (str): The key relative to the root path.

        Returns:
            Path: The full path for the given key.
        z^[a-zA-Z0-9_.\-/]+$zInvalid characters in key: zInvalid key: z*. Key should be relative to the full path.z vs. z and full path of )
rematchr
   ospathabspathr   
commonpathstrr   )r   r   	full_pathZcommon_pathr   r   r   _get_full_pathC   s    	zLocalFileStore._get_full_path)dirr   c                 C   s<   |  s8| |j |jdd | jdur8t|| j dS )aK  Makes a store directory path (including parents) with specified permissions

        This is needed because `Path.mkdir()` is restricted by the current `umask`,
        whereas the explicit `os.chmod()` used here is not.

        Args:
            dir: (Path) The store directory to make

        Returns:
            None
        T)exist_okN)exists_mkdir_for_storeparentmkdirr   r   chmod)r   r    r   r   r   r#   X   s
    
zLocalFileStore._mkdir_for_store)keysr   c                 C   sd   g }|D ]V}|  |}| rT| }|| | jr^t|t t|j	f q|d q|S )a  Get the values associated with the given keys.

        Args:
            keys: A sequence of keys.

        Returns:
            A sequence of optional values associated with the keys.
            If a key is not found, the corresponding value will be None.
        N)
r   r"   
read_bytesappendr   r   utimetimestatst_mtime)r   r'   valuesr   r   valuer   r   r   mgetj   s    


zLocalFileStore.mget)key_value_pairsr   c                 C   sJ   |D ]@\}}|  |}| |j || | jdurt|| j qdS )zSet the values for the given keys.

        Args:
            key_value_pairs: A sequence of key-value pairs.

        Returns:
            None
        N)r   r#   r$   write_bytesr   r   r&   )r   r1   r   r/   r   r   r   r   mset   s    	


zLocalFileStore.msetc                 C   s(   |D ]}|  |}| r|  qdS )zDelete the given keys and their associated values.

        Args:
            keys (Sequence[str]): A sequence of keys to delete.

        Returns:
            None
        N)r   r"   unlink)r   r'   r   r   r   r   r   mdelete   s    	
zLocalFileStore.mdelete)prefixr   c                 c   sF   |r|  |n| j}|dD ]"}| r|| j}t|V  qdS )zGet an iterator over keys that match the given prefix.

        Args:
            prefix (Optional[str]): The prefix to match.

        Returns:
            Iterator[str]: An iterator over keys that match the given prefix.
        *N)r   r   rglobis_filerelative_tor   )r   r6   prefix_pathfilerelative_pathr   r   r   
yield_keys   s
    	zLocalFileStore.yield_keys)N)__name__
__module____qualname____doc__r   r   r   r   intboolr   r   r#   r   r   bytesr0   r   r3   r5   r   r>   r   r   r   r   r      s"   
r   )r   r   r+   pathlibr   typingr   r   r   r   r   r   Zlangchain_core.storesr	   Zlangchain.storage.exceptionsr
   r   r   r   r   r   <module>   s    