o
    ^i                     @   s\   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dZ	G dd deeZ
dS )
    N)AsyncFileSystemrunning_async   )ChainedFileSystemc                    s   t   fdd}|S )a  
    Wraps a synchronous function to make it awaitable.

    Parameters
    ----------
    func : callable
        The synchronous function to wrap.
    obj : object, optional
        The instance to bind the function to, if applicable.
    semaphore : asyncio.Semaphore, optional
        A semaphore to limit concurrent calls.

    Returns
    -------
    coroutine
        An awaitable version of the function.
    c               	      sz   r.4 I d H  t j g| R i |I d H W  d   I d H  S 1 I d H s)w   Y  t j g| R i |I d H S N)asyncio	to_thread)argskwargsfunc	semaphore ^/var/www/html/RAG/RAG_venv/lib/python3.10/site-packages/fsspec/implementations/asyn_wrapper.pywrapper   s   ,zasync_wrapper.<locals>.wrapper)	functoolswraps)r   objr   r   r   r   r   async_wrapper   s   r   c                       sV   e Zd ZdZdZdZ						d fdd	Zedd Zd	d
 Z	e
dd Z  ZS )AsyncFileSystemWrapperaX  
    A wrapper class to convert a synchronous filesystem into an asynchronous one.

    This class takes an existing synchronous filesystem implementation and wraps all
    its methods to provide an asynchronous interface.

    Parameters
    ----------
    sync_fs : AbstractFileSystem
        The synchronous filesystem instance to wrap.
    )asyncwrapperr   FNc                    sd   |d u rt  }t jdd|i| |d ur|| _n
tj|fi || _| jj| _|| _|   d S )Nasynchronousr   )	r   super__init__sync_fsfsspec
filesystemprotocolr   _wrap_all_sync_methods)selffsr   target_protocoltarget_optionsr   max_concurrent_tasksr
   	__class__r   r   r   8   s   

zAsyncFileSystemWrapper.__init__c                 C   s   d| j j S )Nasync_)r   fsid)r   r   r   r   r'   M   s   zAsyncFileSystemWrapper.fsidc                 C   s   dh}t | jD ]9}|ds||v rqt| j|}t|tr!qt| j|}t|rAt	|sAt
|| | jd}t| d| | qdS )zg
        Wrap all synchronous methods of the underlying filesystem with asynchronous versions.
        open_)r   r   N)dirr   
startswithinspectgetattr_static
isinstancepropertygetattrcallableiscoroutinefunctionr   r   setattr)r   excluded_methodsmethod_nameattrmethodasync_methodr   r   r   r   Q   s   
z-AsyncFileSystemWrapper._wrap_all_sync_methodsc                    s(   G  fddd| }d j  d|_ |S )a  
        Create a new class that can be used to instantiate an AsyncFileSystemWrapper
        with lazy instantiation of the underlying synchronous filesystem.

        Parameters
        ----------
        sync_fs_class : type
            The class of the synchronous filesystem to wrap.

        Returns
        -------
        type
            A new class that wraps the provided synchronous filesystem class.
        c                       s   e Zd Z fddZ  ZS )zJAsyncFileSystemWrapper.wrap_class.<locals>.GeneratedAsyncFileSystemWrapperc                    s   |i |}t  | d S r   )r   r   )r   r	   r
   r   )r%   sync_fs_classr   r   r   u   s   zSAsyncFileSystemWrapper.wrap_class.<locals>.GeneratedAsyncFileSystemWrapper.__init__)__name__
__module____qualname__r   __classcell__r   r9   r$   r   GeneratedAsyncFileSystemWrappert   s    r?   AsyncWrapper)r:   )clsr9   r?   r   r>   r   
wrap_classc   s   z!AsyncFileSystemWrapper.wrap_class)NNNNNN)r:   r;   r<   __doc__r   cachabler   r/   r'   r   classmethodrC   r=   r   r   r$   r   r   (   s     
r   )NN)r   r   r,   r   fsspec.asynr   r   chainedr   r   r   r   r   r   r   <module>   s    
