o
    pf%                     @   s  d Z ddlmZmZmZ ddlZddlmZ ddlm	Z	 ddl
mZ ddlmZ dd	lmZmZ dd
lmZmZmZ ejrxddlmZmZmZmZmZmZmZmZmZmZm Z  ddl!m"Z" ddl#m$Z$m%Z% ddl&m'Z' ddl(m)Z) ej*dddZ+G dd de,Z-G dd deZ.dS )z0Manage other filesystems as a folder hierarchy.
    )absolute_importprint_functionunicode_literalsN)	text_type   )errors)FS)MemoryFS)validate_open_modevalidate_openbin_mode)abspathforcedirnormpath)IOAnyBinaryIO
CollectionIteratorListMutableSequenceOptionalTextTupleUnion)ResourceType)InfoRawInfo)Permissions)SubFSMMountFS)boundc                   @   s   e Zd ZdZdS )
MountErrorzThrown when mounts conflict.N)__name__
__module____qualname____doc__ r'   r'   C/home/ertert/spirit/venv/lib/python3.10/site-packages/fs/mountfs.pyr"   '   s    r"   c                       sN  e Zd ZdZddddddZdH fdd	Zdd	 Zd
d Zdd Zdd Z	 fddZ
dd ZdIddZdd ZdJddZdKddZdd  Zd!d" Zd#d$ ZdId%d&Z			'dLd(d)Zd*d+ Zd,d- Zd.d/ ZdMd1d2ZdMd3d4Zd5d6 Zd7d8 Z		dNd9d:Zd;d< Zd=d> Z					'dOd?d@ZdIdAdBZ dCdD Z!	E		'dPdFdGZ"  Z#S )Qr    zDA virtual filesystem that maps directories on to other file-systems.TF )virtual	read_onlyunicode_pathscase_insensitiveinvalid_path_charsc                    s&   t t|   || _t | _g | _dS )zCreate a new `MountFS` instance.

        Arguments:
            auto_close (bool): If `True` (the default), the child
                filesystems will be closed when `MountFS` is closed.

        N)superr    __init__
auto_closer	   
default_fsmounts)selfr1   	__class__r'   r(   r0   6   s   	
zMountFS.__init__c                 C   s   d | jS )NzMountFS(auto_close={!r}))formatr1   r4   r'   r'   r(   __repr__D   s   zMountFS.__repr__c                 C   s   dS )Nz	<mountfs>r'   r8   r'   r'   r(   __str__H   s   zMountFS.__str__c                 C   sV   t tt|}|j}| jD ]\}}||r%||t|d df  S q| j|fS )a#  Get the delegate FS for a given path.

        Arguments:
            path (str): A path.

        Returns:
            (FS, str): a tuple of ``(<fs>, <path>)`` for a mounted filesystem,
            or ``(None, None)`` if no filesystem is mounted on the
            given ``path``.

        N/)r   r   r   
startswithr3   lenrstripr2   )r4   path_path
is_mounted
mount_pathfsr'   r'   r(   	_delegateL   s   
zMountFS._delegatec                 C   s   t |trddlm} ||}t |tstd|| u r tdttt	|}| j
D ]\}}||r8tdq+| j
||f | jj|dd dS )	zMounts a host FS object on a given path.

        Arguments:
            path (str): A path within the MountFS.
            fs (FS or str): A filesystem (instance or URL) to mount.

        r   )open_fsz,fs argument must be an FS object or a FS URLzUnable to mount selfz#mount point overlaps existing mountT)recreateN)
isinstancer   openerrE   r   	TypeError
ValueErrorr   r   r   r3   r<   r"   appendr2   makedirs)r4   r?   rC   rE   r@   rB   _r'   r'   r(   mountb   s   
	

zMountFS.mountc                    sF   | j r| jD ]\}}|  q| jd d = | j  tt|   d S N)r1   r3   closer2   r/   r    )r4   r@   rC   r5   r'   r(   rP   ~   s   

zMountFS.closec                 C   s>   |  |s
t|| |\}}|| ju r| }dj||dS )Nz{path} on {fs})rC   r?   )existsr   ResourceNotFoundrD   r2   r7   )r4   r?   rC   delegate_pathr'   r'   r(   desc   s   


zMountFS.descNc                 C   $   |    | |\}}|j||dS )N)
namespaces)checkrD   getinfo)r4   r?   rV   rC   r@   r'   r'   r(   rX         zMountFS.getinfoc                 C       |    | |\}}||S rO   )rW   rD   listdirr4   r?   rC   r@   r'   r'   r(   r[         
zMountFS.listdirc                 C   &   |    | |\}}|j|||dS )N)permissionsrF   )rW   rD   makedir)r4   r?   r_   rF   rC   r@   r'   r'   r(   r`      s   zMountFS.makedirrc                 K   s6   t | |   | |\}}|j|f|dd|S )Nrb   )mode	buffering)r   rW   rD   openbin)r4   r?   rc   rd   kwargsrC   r@   r'   r'   r(   re      s   zMountFS.openbinc                 C   rZ   rO   )rW   rD   remover\   r'   r'   r(   rg      r]   zMountFS.removec                 C   s:   |    t|}|dv rt|| |\}}||S )N) r;   )rW   r   r   RemoveRootErrorrD   	removedirr\   r'   r'   r(   rj      s   

zMountFS.removedirc                 C   rZ   rO   )rW   rD   	readbytesr\   r'   r'   r(   rk      r]   zMountFS.readbytesc                 K   s&   |  |\}}|j||fd|i|S N
chunk_size)rD   downloadr4   r?   filerm   optionsrC   r@   r'   r'   r(   rn      s   zMountFS.downloadrh   c                 C   s(   |    | |\}}|j||||dS N)encodingr   newline)rW   rD   readtext)r4   r?   rs   r   rt   rC   r@   r'   r'   r(   ru      s   zMountFS.readtextc                 C   rZ   rO   )rW   rD   getsizer\   r'   r'   r(   rv      r]   zMountFS.getsizec                 C   rZ   rO   )rW   rD   
getsyspathr\   r'   r'   r(   rw      r]   zMountFS.getsyspathc                 C   rZ   rO   )rW   rD   gettyper\   r'   r'   r(   rx      r]   zMountFS.gettypern   c                 C   rU   N)purpose)rW   rD   geturlr4   r?   rz   rC   r@   r'   r'   r(   r{      rY   zMountFS.geturlc                 C   rU   ry   )rW   rD   hasurlr|   r'   r'   r(   r}      rY   zMountFS.hasurlc                 C   rZ   rO   )rW   rD   isdirr\   r'   r'   r(   r~      r]   zMountFS.isdirc                 C   rZ   rO   )rW   rD   isfiler\   r'   r'   r(   r      r]   zMountFS.isfilec                 C   r^   )N)rV   page)rW   rD   scandir)r4   r?   rV   r   rC   r@   r'   r'   r(   r      s   zMountFS.scandirc                 C   "   |    | |\}}|||S rO   )rW   rD   setinfo)r4   r?   inforC   r@   r'   r'   r(   r        zMountFS.setinfoc                 C   s0   |    | |\}}|| tt|}|S rO   )rW   rD   validatepathr   r   r\   r'   r'   r(   r     s
   
zMountFS.validatepathc           
      K   s<   t | |   | |\}}	|j|	f|||||d|S )N)rc   rd   rs   r   rt   )r
   rW   rD   open)
r4   r?   rc   rd   rs   r   rt   rq   rC   r@   r'   r'   r(   r     s   zMountFS.openc                 K   s.   |    | |\}}|j||fd|i|S rl   )rW   rD   uploadro   r'   r'   r(   r   +  s   zMountFS.uploadc                 C   r   rO   )rW   rD   
writebytes)r4   r?   contentsrC   r@   r'   r'   r(   r   1  r   zMountFS.writebytesutf-8c                 C   s"   |  |\}}|j|||||dS rr   )rD   	writetext)r4   r?   r   rs   r   rt   rC   r@   r'   r'   r(   r   7  s   	
zMountFS.writetext)TrO   )NF)ra   rb   )NNrh   )rn   )NN)ra   rb   NNrh   )r   Nrh   )$r#   r$   r%   r&   _metar0   r9   r:   rD   rN   rP   rT   rX   r[   r`   re   rg   rj   rk   rn   ru   rv   rw   rx   r{   r}   r~   r   r   r   r   r   r   r   r   __classcell__r'   r'   r5   r(   r    +   sf    

	

	



	



)/r&   
__future__r   r   r   typingsixr   rh   r   baser   memoryfsr	   rc   r
   r   r?   r   r   r   TYPE_CHECKINGr   r   r   r   r   r   r   r   r   r   r   enumsr   r   r   r   r_   r   subfsr   TypeVarr   	Exceptionr"   r    r'   r'   r'   r(   <module>   s$    4