a
    h                     @   sN   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dZG dd deZdS )    N)AsyncFileSystemrunning_asyncc                    s   t   fdd}|S )aF  
    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.

    Returns
    -------
    coroutine
        An awaitable version of the function.
    c                     s   t j g| R i |I d H S N)asyncioZ	to_thread)argskwargsfunc Q/var/www/auris/lib/python3.9/site-packages/fsspec/implementations/asyn_wrapper.pywrapper   s    zasync_wrapper.<locals>.wrapper)	functoolswraps)r	   objr   r
   r   r   async_wrapper	   s    r   c                       sJ   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.
    )Zasyncwrapperr   FNc                    s^   |d u rt  }t jf d|i| |d ur4|| _ntj|fi || _| jj| _|   d S )Nasynchronous)r   super__init__sync_fsfsspec
filesystemprotocol_wrap_all_sync_methods)selffsr   Ztarget_protocolZtarget_optionsr   	__class__r
   r   r   1   s    
zAsyncFileSystemWrapper.__init__c                 C   s   d| j j S )NZasync_)r   fsid)r   r
   r
   r   r   C   s    zAsyncFileSystemWrapper.fsidc                 C   s   dh}t | jD ]n}|ds||v r(qt| j|}t|trBqt| j|}t|rt	|st
|| d}t| d| | qdS )zg
        Wrap all synchronous methods of the underlying filesystem with asynchronous versions.
        open_)r   N)dirr   
startswithinspectgetattr_static
isinstancepropertygetattrcallableiscoroutinefunctionr   setattr)r   Zexcluded_methodsmethod_nameattrmethodZasync_methodr
   r
   r   r   G   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   k   s    zSAsyncFileSystemWrapper.wrap_class.<locals>.GeneratedAsyncFileSystemWrapper.__init__)__name__
__module____qualname__r   __classcell__r
   r.   r   r   GeneratedAsyncFileSystemWrapperj   s   r4   ZAsyncZWrapper)r/   )clsr.   r4   r
   r3   r   
wrap_classY   s    z!AsyncFileSystemWrapper.wrap_class)NNNN)r/   r0   r1   __doc__r   Zcachabler   r&   r   r   classmethodr6   r2   r
   r
   r   r   r   !   s       
r   )N)	r   r   r#   r   Zfsspec.asynr   r   r   r   r
   r
   r
   r   <module>   s   
