o
    Q `8%                     @   s<  d Z ddlmZ ddlmZ ddl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 ddlmZ ddlmZ ddlmZ ddlmZ ejrd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)abspath)forcedir)normpath)validate_open_mode)validate_openbin_mode)AnyBinaryIO
CollectionIteratorIOListMutableSequenceOptionalTextTupleUnion)ResourceType)InfoRawInfo)Permissions)SubFSMMountFS)Zboundc                   @   s   e Zd ZdZdS )
MountErrorz!Thrown when mounts conflict.
    N)__name__
__module____qualname____doc__ r&   r&   ,/usr/lib/python3/dist-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    zA virtual filesystem that maps directories on to other file-systems.

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

    TF )ZvirtualZ	read_onlyZunicode_pathsZcase_insensitiveZinvalid_path_charsc                    s&   t t|   || _t | _g | _d S N)superr    __init__
auto_closer	   
default_fsmounts)selfr,   	__class__r&   r'   r+   A   s   
zMountFS.__init__c                 C   s   d | jS )NzMountFS(auto_close={!r}))formatr,   r/   r&   r&   r'   __repr__H   s   zMountFS.__repr__c                 C   s   dS )Nz	<mountfs>r&   r3   r&   r&   r'   __str__L   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   
startswithr.   lenrstripr-   )r/   path_pathZ
is_mounted
mount_pathfsr&   r&   r'   	_delegateP   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   Zopenerr?   r   	TypeError
ValueErrorr   r
   r   r.   r7   r!   appendr-   makedirs)r/   r:   r=   r?   r;   r<   _r&   r&   r'   mountf   s   
	

zMountFS.mountc                    sF   | j r| jD ]\}}|  q| jd d = | j  tt|   d S r)   )r,   r.   closer-   r*   r    )r/   r;   r=   r0   r&   r'   rH      s   

zMountFS.closec                 C   s>   |  |s
t|| |\}}|| ju r| }dj||dS )Nz{path} on {fs})r=   r:   )existsr   ZResourceNotFoundr>   r-   r2   )r/   r:   r=   Zdelegate_pathr&   r&   r'   desc   s   


zMountFS.descNc                 C   $   |    | |\}}|j||dS )N)
namespaces)checkr>   getinfo)r/   r:   rL   r=   r;   r&   r&   r'   rN         zMountFS.getinfoc                 C       |    | |\}}||S r)   )rM   r>   listdirr/   r:   r=   r;   r&   r&   r'   rQ         
zMountFS.listdirc                 C   &   |    | |\}}|j|||dS )N)permissionsr@   )rM   r>   makedir)r/   r:   rU   r@   r=   r;   r&   r&   r'   rV      s   zMountFS.makedirrc                 K   s6   t | |   | |\}}|j|f|dd|S )NrX   )mode	buffering)r   rM   r>   openbin)r/   r:   rY   rZ   kwargsr=   r;   r&   r&   r'   r[      s   zMountFS.openbinc                 C   rP   r)   )rM   r>   removerR   r&   r&   r'   r]      rS   zMountFS.removec                 C   s:   |    t|}|dv rt|| |\}}||S )N) r6   )rM   r   r   ZRemoveRootErrorr>   	removedirrR   r&   r&   r'   r_      s   

zMountFS.removedirc                 C   rP   r)   )rM   r>   	readbytesrR   r&   r&   r'   r`      rS   zMountFS.readbytesc                 K   s&   |  |\}}|j||fd|i|S N
chunk_size)r>   downloadr/   r:   filerb   optionsr=   r;   r&   r&   r'   rc      s   zMountFS.downloadr^   c                 C   s(   |    | |\}}|j||||dS N)encodingr   newline)rM   r>   readtext)r/   r:   rh   r   ri   r=   r;   r&   r&   r'   rj      s   zMountFS.readtextc                 C   rP   r)   )rM   r>   getsizerR   r&   r&   r'   rk      rS   zMountFS.getsizec                 C   rP   r)   )rM   r>   
getsyspathrR   r&   r&   r'   rl      rS   zMountFS.getsyspathc                 C   rP   r)   )rM   r>   gettyperR   r&   r&   r'   rm      rS   zMountFS.gettyperc   c                 C   rK   N)purpose)rM   r>   geturlr/   r:   ro   r=   r;   r&   r&   r'   rp      rO   zMountFS.geturlc                 C   rK   rn   )rM   r>   hasurlrq   r&   r&   r'   rr      rO   zMountFS.hasurlc                 C   rP   r)   )rM   r>   isdirrR   r&   r&   r'   rs      rS   zMountFS.isdirc                 C   rP   r)   )rM   r>   isfilerR   r&   r&   r'   rt      rS   zMountFS.isfilec                 C   rT   )N)rL   page)rM   r>   scandir)r/   r:   rL   ru   r=   r;   r&   r&   r'   rv      s   zMountFS.scandirc                 C   "   |    | |\}}|||S r)   )rM   r>   setinfo)r/   r:   infor=   r;   r&   r&   r'   rx   	     zMountFS.setinfoc                 C   s0   |    | |\}}|| tt|}|S r)   )rM   r>   validatepathr
   r   rR   r&   r&   r'   r{     s
   
zMountFS.validatepathc           
      K   s<   t | |   | |\}}	|j|	f|||||d|S )N)rY   rZ   rh   r   ri   )r   rM   r>   open)
r/   r:   rY   rZ   rh   r   ri   rf   r=   r;   r&   r&   r'   r|     s   zMountFS.openc                 K   s.   |    | |\}}|j||fd|i|S ra   )rM   r>   uploadrd   r&   r&   r'   r}   /  s   zMountFS.uploadc                 C   rw   r)   )rM   r>   
writebytes)r/   r:   contentsr=   r;   r&   r&   r'   r~   5  rz   zMountFS.writebytesutf-8c                 C   s"   |  |\}}|j|||||dS rg   )r>   	writetext)r/   r:   r   rh   r   ri   r=   r;   r&   r&   r'   r   ;  s   	
zMountFS.writetext)Tr)   )NF)rW   rX   )NNr^   )rc   )NN)rW   rX   NNr^   )r   Nr^   )$r"   r#   r$   r%   Z_metar+   r4   r5   r>   rG   rH   rJ   rN   rQ   rV   r[   r]   r_   r`   rc   rj   rk   rl   rm   rp   rr   rs   rt   rv   rx   r{   r|   r}   r~   r   __classcell__r&   r&   r0   r'   r    0   sf    	

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


)/r%   Z
__future__r   r   r   typingZsixr   r^   r   baser   Zmemoryfsr	   r:   r
   r   r   rY   r   r   ZTYPE_CHECKINGr   r   r   r   r   r   r   r   r   r   r   Zenumsr   ry   r   r   rU   r   Zsubfsr   TypeVarr   	Exceptionr!   r    r&   r&   r&   r'   <module>   s.    4