
    ob%                     L   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*                  rHd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jT                  dd      Z+ G d de,      Z- G d de      Z.y)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                       e Zd ZdZy)
MountErrorzThrown when mounts conflict.N)__name__
__module____qualname____doc__     ,/usr/lib/python3/dist-packages/fs/mountfs.pyr$   r$   '   s    &r*   r$   c                       e Zd ZdZddddddZd$ fd	Zd Zd Zd	 Zd
 Z	 fdZ
d Zd%dZd Zd&dZd'dZd Zd Zd Zd%dZ	 	 	 d(dZd Zd Zd Zd)dZd)dZd Zd Z	 	 d*dZd Zd Z	 	 	 	 	 d+d Zd%d!Z d" Z!	 	 	 d,d#Z" xZ#S )-r!   zDA virtual filesystem that maps directories on to other file-systems.TF )virtual	read_onlyunicode_pathscase_insensitiveinvalid_path_charsc                 d    t         t        |           || _        t	               | _        g | _        y)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)selfr6   	__class__s     r+   r5   zMountFS.__init__6   s)     	gt%'$"*r*   c                 8    dj                  | j                        S )NzMountFS(auto_close={!r}))formatr6   r9   s    r+   __repr__zMountFS.__repr__D   s    )00AAr*   c                      y)Nz	<mountfs>r)   r=   s    r+   __str__zMountFS.__str__H   s    r*   c                     t        t        t        |                  }|j                  }| j                  D ].  \  }} ||      s||t        |      d j                  d      fc S  | 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   
startswithr8   lenrstripr7   )r9   path_path
is_mounted
mount_pathfss         r+   	_delegatezMountFS._delegateL   sv     $01%%
"kk 	@NJ*%5Z!23::3???	@ $$r*   c                    t        |t              rddlm}  ||      }t        |t              st        d      || u rt        d      t        t        t        |                  }| j                  D ]!  \  }}|j                  |      st        d       | j                  j                  ||f       | j                  j                  |d       y)	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   openerrM   r	   	TypeError
ValueErrorr   r   r   r8   rC   r$   appendr7   makedirs)r9   rF   rJ   rM   rG   rI   _s          r+   mountzMountFS.mountb   s     b)$'B"b!JKK:344$01![[ 	HMJ
+ !FGG	H 	E2;'   6r*   c                     | j                   r3| j                  D ]  \  }}|j                           | j                  d d = | j                  j                          t        t
        |           y N)r6   r8   closer7   r4   r!   )r9   rG   rJ   r:   s      r+   rY   zMountFS.close~   sT     ??![[ 	r
Agt"$r*   c                     | j                  |      st        j                  |      | j                  |      \  }}|| j                  u r| }dj                  ||      S )Nz{path} on {fs})rJ   rF   )existsr   ResourceNotFoundrK   r7   r<   )r9   rF   rJ   delegate_paths       r+   desczMountFS.desc   sY    {{4 ))$// NN40M B&&"=&AAr*   c                 p    | j                          | j                  |      \  }}|j                  ||      S )N)
namespaces)checkrK   getinfo)r9   rF   r`   rJ   rG   s        r+   rb   zMountFS.getinfo   s0    

NN4(	Ezz%Jz77r*   c                 l    | j                          | j                  |      \  }}|j                  |      S rX   )ra   rK   listdirr9   rF   rJ   rG   s       r+   rd   zMountFS.listdir   ,    

NN4(	Ezz%  r*   c                 r    | j                          | j                  |      \  }}|j                  |||      S )N)permissionsrN   )ra   rK   makedir)r9   rF   rh   rN   rJ   rG   s         r+   ri   zMountFS.makedir   s2    

NN4(	Ezz%[8zLLr*   c                     t        |       | j                          | j                  |      \  }} |j                  |f|dd|S )N)mode	buffering)r   ra   rK   openbin)r9   rF   rl   rm   kwargsrJ   rG   s          r+   rn   zMountFS.openbin   sB    d#

NN4(	Erzz%CdbCFCCr*   c                 l    | j                          | j                  |      \  }}|j                  |      S rX   )ra   rK   removere   s       r+   rq   zMountFS.remove   ,    

NN4(	Eyyr*   c                     | j                          t        |      }|dv rt        j                  |      | j	                  |      \  }}|j                  |      S )N) rB   )ra   r   r   RemoveRootErrorrK   	removedirre   s       r+   rv   zMountFS.removedir   sN    

~9((..NN4(	E||E""r*   c                 l    | j                          | j                  |      \  }}|j                  |      S rX   )ra   rK   	readbytesre   s       r+   rx   zMountFS.readbytes   s,    

NN4(	E||E""r*   c                 V    | j                  |      \  }} |j                  ||fd|i|S N
chunk_size)rK   downloadr9   rF   filer{   optionsrJ   rG   s          r+   r|   zMountFS.download   s1    NN4(	Er{{5$I:IIIr*   c                 t    | j                          | j                  |      \  }}|j                  ||||      S N)encodingr   newline)ra   rK   readtext)r9   rF   r   r   r   rJ   rG   s          r+   r   zMountFS.readtext   s6     	

NN4(	E{{58FG{TTr*   c                 l    | j                          | j                  |      \  }}|j                  |      S rX   )ra   rK   getsizere   s       r+   r   zMountFS.getsize   rf   r*   c                 l    | j                          | j                  |      \  }}|j                  |      S rX   )ra   rK   
getsyspathre   s       r+   r   zMountFS.getsyspath   s,    

NN4(	E}}U##r*   c                 l    | j                          | j                  |      \  }}|j                  |      S rX   )ra   rK   gettypere   s       r+   r   zMountFS.gettype   rf   r*   c                 p    | j                          | j                  |      \  }}|j                  ||      S N)purpose)ra   rK   geturlr9   rF   r   rJ   rG   s        r+   r   zMountFS.geturl   0    

NN4(	Eyyy00r*   c                 p    | j                          | j                  |      \  }}|j                  ||      S r   )ra   rK   hasurlr   s        r+   r   zMountFS.hasurl   r   r*   c                 l    | j                          | j                  |      \  }}|j                  |      S rX   )ra   rK   isdirre   s       r+   r   zMountFS.isdir   s+    

NN4(	Exxr*   c                 l    | j                          | j                  |      \  }}|j                  |      S rX   )ra   rK   isfilere   s       r+   r   zMountFS.isfile   rr   r*   c                 r    | j                          | j                  |      \  }}|j                  |||      S )N)r`   page)ra   rK   scandir)r9   rF   r`   r   rJ   rG   s         r+   r   zMountFS.scandir   s4     	

NN4(	Ezz%JTzBBr*   c                 n    | j                          | j                  |      \  }}|j                  ||      S rX   )ra   rK   setinfo)r9   rF   inforJ   rG   s        r+   r   zMountFS.setinfo  s.    

NN4(	Ezz%&&r*   c                     | j                          | j                  |      \  }}|j                  |       t        t	        |            }|S rX   )ra   rK   validatepathr   r   re   s       r+   r   zMountFS.validatepath  s<    

NN4(	E
x~&r*   c           	          t        |       | j                          | j                  |      \  }}	 |j                  |	f|||||d|S )N)rl   rm   r   r   r   )r   ra   rK   open)
r9   rF   rl   rm   r   r   r   r   rJ   rG   s
             r+   r   zMountFS.open  s[     	4 

NN4(	Erww

 
 	
r*   c                 v    | j                          | j                  |      \  }} |j                  ||fd|i|S rz   )ra   rK   uploadr}   s          r+   r   zMountFS.upload+  s:    

NN4(	EryyGGwGGr*   c                 n    | j                          | j                  |      \  }}|j                  ||      S rX   )ra   rK   
writebytes)r9   rF   contentsrJ   rG   s        r+   r   zMountFS.writebytes1  s.    

NN4(	E}}UH--r*   c                 V    | j                  |      \  }}|j                  |||||      S r   )rK   	writetext)r9   rF   r   r   r   r   rJ   rG   s           r+   r   zMountFS.writetext7  s7     NN4(	E||8hvw  
 	
r*   )TrX   )NF)rrk   )NNrt   )r|   )NN)r   rk   NNrt   )zutf-8Nrt   )$r%   r&   r'   r(   _metar5   r>   r@   rK   rV   rY   r^   rb   rd   ri   rn   rq   rv   rx   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__)r:   s   @r+   r!   r!   +   s    N !"EB%,78%B8!MD ##J 
U!$!11  		C' 
0H. 
r*   )/r(   
__future__r   r   r   typingsixr   rt   r   baser	   memoryfsr
   rl   r   r   rF   r   r   r   TYPE_CHECKINGr   r   r   r   r   r   r   r   r   r   r   enumsr   r   r   r   rh   r   subfsr   TypeVarr    	Exceptionr$   r!   r)   r*   r+   <module>r      s    I H      ; - -	    $#(s),A' 'X
b X
r*   