o
    Q `B                     @   s|  d Z ddlmZ ddlZddlZddlmZ ddlmZ ddl	m
Z
mZ ddlmZ dd	lmZmZ dd
lmZmZ ddlmZ ejrddlmZ ddlmZ ddlmZmZmZ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* ddl+m,Z, ddl-m.Z. ddl/m0Z0 ej1dddZ2ee2e%ge.e2 f Z3ej1ddddZ4ej1dddZ5ej6G dd deej7e4 Z8dS )z$Base class for filesystem wrappers.
    )unicode_literalsN   )errors)FS)	copy_filecopy_dir)Info)	move_filemove_dir)abspathnormpath)unwrap_errors)datetime)RLock)AnyAnyStrBinaryIOCallable
CollectionIteratorIterableIOListMappingOptionalTextTupleUnion)ResourceType)RawInfo)PermissionsSubFS)BoundWalker_Tr   )bound_FT)r%   Z	covariant_Wz
WrapFS[FS]c                       s  e Zd ZdZdZ fddZdd Zdd Zd	d
 Zdd Z	dd Z
			dlddZdmddZdd Zdd Z		dnddZdoddZdoddZdpd"d#Zd$d% Zd&d' Zd(d) Z		dqd*d+Zd,d- Zdqd.d/Zd0d1 Zdod2d3Zdod4d5Zdod6d7Zd8d9 Zdmd:d;Zd<d= Z						drd>d?Z d@dA Z!			dsdBdCZ"dtdEdFZ#dGdH Z$dIdJ Z%dKdL Z&dudNdOZ'dPdQ Z(dudRdSZ)dTdU Z*dVdW Z+dXdY Z,		dndZd[Z-	 	!				dvd\d]Z.	dmd^d_Z/d`da Z0dmdbdcZ1			dsdddeZ2dfdg Z3dhdi Z4e5djdk Z6  Z7S )wWrapFSzA proxy for a filesystem object.

    This class exposes an filesystem interface, where the data is
    stored on another filesystem(s), and is the basis for
    `~fs.subfs.SubFS` and other *virtual* filesystems.

    Nc                    s   || _ tt|   d S N)_wrap_fssuperr(   __init__)selfZwrap_fs	__class__ +/usr/lib/python3/dist-packages/fs/wrapfs.pyr,   ?   s   zWrapFS.__init__c                 C   s   d | jj| jS )Nz{}({!r}))formatr/   __name__r*   r-   r0   r0   r1   __repr__D   s   zWrapFS.__repr__c              	   C   sr   g }| }t |dr t|dd }|d ur|| |j}t |ds	|r2d|d|d d d }|S d|}|S )Nr*   	wrap_namez{}({})z, z{})hasattrgetattrappendr*   r2   join)r-   wraps_fsr6   _strr0   r0   r1   __str__H   s   



zWrapFS.__str__c                 C   s
   | j |fS )zEncode a path for proxied filesystem.

        Arguments:
            path (str): A path on the filesystem.

        Returns:
            (FS, str): a tuple of ``(<filesystem>, <new_path>)``

        r*   )r-   pathr0   r0   r1   delegate_pathW   s   
zWrapFS.delegate_pathc                 C   s   | j S )zGet the proxied filesystem.

        This method should return a filesystem for methods not
        associated with a path, e.g. `~fs.base.FS.getmeta`.

        r@   r4   r0   r0   r1   delegate_fsd   s   zWrapFS.delegate_fsc                 C   N   |    | |\}}t| |||W  d    S 1 s w   Y  d S r)   )checkrB   r   appendbytes)r-   rA   datar=   _pathr0   r0   r1   rF   n   
   

$zWrapFS.appendbytesutf-8 c                 C   sV   |    | |\}}t| |j|||||dW  d    S 1 s$w   Y  d S N)encodingr   newline)rE   rB   r   
appendtext)r-   rA   textrM   r   rN   r=   rH   r0   r0   r1   rO   u   s   	

$zWrapFS.appendtextc                 C   sz   |    | |\}}t| |j||dj}W d    n1 s"w   Y  tt|dkr9t|}d|d d< t|S )N)
namespaces/rK   Zbasicname)	rE   rB   r   getinforawr   r   dictr   )r-   rA   rQ   r=   rH   Zraw_infor0   r0   r1   rT      s   
zWrapFS.getinfoc                 C   N   |    | |\}}t| ||}W d    |S 1 s w   Y  |S r)   )rE   rB   r   listdir)r-   rA   r=   rH   Zdir_listr0   r0   r1   rX         

zWrapFS.listdirc                 C   s   |    |  }| S r)   )rE   rC   lock)r-   r=   r0   r0   r1   rZ      s   zWrapFS.lockFc                 C   sR   |    | |\}}t| |j|||dW  d    S 1 s"w   Y  d S N)permissionsrecreate)rE   rB   r   makedirr-   rA   r\   r]   r=   rH   r0   r0   r1   r^      s
   
$zWrapFS.makedirc                 C   x   |  |\}}|  |\}}t||||i |s#||r#t|t|||| W d    d S 1 s5w   Y  d S r)   )rB   r   existsr   DestinationExistsr	   r-   src_pathdst_pathZ	overwritesrc_fs	_src_pathdst_fs	_dst_pathr0   r0   r1   move   s   
"zWrapFS.movec                 C      |  |\}}|  |\}}t||||i' |s#||s#t|||js.t|t|||| W d    d S 1 s@w   Y  d S r)   )	rB   r   ra   r   ResourceNotFoundrT   is_dirDirectoryExpectedr
   r-   rd   re   createrf   rg   rh   ri   r0   r0   r1   movedir      

"zWrapFS.movedirrr7   c                 K   s\   |    | |\}}t| |j|f|dd|}W d    |S 1 s'w   Y  |S )Nr7   )mode	buffering)rE   rB   r   openbin)r-   rA   rt   ru   optionsr=   rH   Zbin_filer0   r0   r1   rv      s   

zWrapFS.openbinc                 C   N   |    | |\}}t| || W d    d S 1 s w   Y  d S r)   )rE   rB   r   remover-   rA   r=   rH   r0   r0   r1   ry      
   
"zWrapFS.removec                 C   j   |    tt|}|dkrt | |\}}t| || W d    d S 1 s.w   Y  d S NrR   )rE   r   r   r   RemoveRootErrorrB   r   	removedir)r-   rA   rH   r=   r0   r0   r1   r         
"zWrapFS.removedirc                 C   r|   r}   )rE   r   r   r   r~   rB   r   
removetree)r-   Zdir_pathrH   r=   r0   r0   r1   r      r   zWrapFS.removetreec                 c   sb    |    | |\}}t| |j|||dD ]}|V  qW d    d S 1 s*w   Y  d S )N)rQ   page)rE   rB   r   scandir)r-   rA   rQ   r   r=   rH   infor0   r0   r1   r      s   
"zWrapFS.scandirc                 C   s"   |    | |\}}|||S r)   )rE   rB   setinfo)r-   rA   r   r=   rH   r0   r0   r1   r      s   zWrapFS.setinfoc                 C   sT   |    | |\}}t| |j|||d W d    d S 1 s#w   Y  d S )N)accessedmodified)rE   rB   r   settimes)r-   rA   r   r   r=   rH   r0   r0   r1   r      s
   
"zWrapFS.settimesc                 C   rx   r)   )rE   rB   r   touchrz   r0   r0   r1   r      r{   zWrapFS.touchc                 C   r`   r)   )rB   r   ra   r   rb   r   rc   r0   r0   r1   copy  s   
"zWrapFS.copyc                 C   rk   r)   )	rB   r   ra   r   rl   rT   rm   rn   r   ro   r0   r0   r1   copydir  rr   zWrapFS.copydirc                 C   P   |    | |\}}t| |j||dW  d    S 1 s!w   Y  d S )N)wipe)rE   rB   r   rp   )r-   rA   r   r=   rH   r0   r0   r1   rp     
   
$zWrapFS.createc                 C   rW   r)   )rE   rB   r   desc)r-   rA   r=   rH   r   r0   r0   r1   r     rY   zWrapFS.descc                 K   \   |    | |\}}t| |j||fd|i| W d    d S 1 s'w   Y  d S N
chunk_size)rE   rB   r   downloadr-   rA   filer   rw   r=   rH   r0   r0   r1   r   &  
   
"zWrapFS.downloadc                 C   rW   r)   )rE   rB   r   ra   )r-   rA   r=   rH   ra   r0   r0   r1   ra   -  rY   zWrapFS.existsc              
   c   sr    |    | |\}}	t|j|	||||||d}
t| |
D ]}|V  q!W d    d S 1 s2w   Y  d S )N)exclude_dirsexclude_filesfilesdirsrQ   r   )rE   rB   iter	filterdirr   )r-   rA   r   r   r   r   rQ   r   r=   rH   Z
iter_filesr   r0   r0   r1   r   5  s&   
"zWrapFS.filterdirc                 C   rW   r)   )rE   rB   r   	readbytes)r-   rA   r=   rH   Z_bytesr0   r0   r1   r   Q  rY   zWrapFS.readbytesc                 C   sV   |    | |\}}t| |j||||d}W d    |S 1 s$w   Y  |S rL   )rE   rB   r   readtext)r-   rA   rM   r   rN   r=   rH   Z_textr0   r0   r1   r   Y  s   

zWrapFS.readtextstandardc                 C   s   |    |  j|d}|S )N)	namespace)rE   rC   getmeta)r-   r   metar0   r0   r1   r   i  s   zWrapFS.getmetac                 C   rW   r)   )rE   rB   r   getsize)r-   rA   r=   rH   sizer0   r0   r1   r   o  rY   zWrapFS.getsizec                 C   rW   r)   )rE   rB   r   
getsyspath)r-   rA   r=   rH   Zsys_pathr0   r0   r1   r   w  rY   zWrapFS.getsyspathc                 C   rW   r)   )rE   rB   r   gettype)r-   rA   r=   rH   Z_typer0   r0   r1   r     rY   zWrapFS.gettyper   c                 C   r   N)purpose)rE   rB   r   geturl)r-   rA   r   r=   rH   r0   r0   r1   r     r   zWrapFS.geturlc                 C   rW   r)   )rE   rB   r   
hassyspath)r-   rA   r=   rH   Zhas_sys_pathr0   r0   r1   r     rY   zWrapFS.hassyspathc                 C   sR   |    | |\}}t| |j||d}W d    |S 1 s"w   Y  |S r   )rE   rB   r   hasurl)r-   rA   r   r=   rH   Zhas_urlr0   r0   r1   r     s   

zWrapFS.hasurlc                 C   rW   r)   )rE   rB   r   isdir)r-   rA   r=   rH   Z_isdirr0   r0   r1   r     rY   zWrapFS.isdirc                 C   rW   r)   )rE   rB   r   isfile)r-   rA   r=   rH   Z_isfiler0   r0   r1   r     rY   zWrapFS.isfilec                 C   rW   r)   )rE   rB   r   islink)r-   rA   r=   rH   _islinkr0   r0   r1   r     rY   zWrapFS.islinkc                 C   s&   |    | |\}}|j|||dS r[   )rE   rB   makedirsr_   r0   r0   r1   r     s   zWrapFS.makedirsc              
   K   sd   |    | |\}	}
t| |	j|
f||||||d|}W d    |S 1 s+w   Y  |S )N)rt   ru   rM   r   rN   line_buffering)rE   rB   r   open)r-   rA   rt   ru   rM   r   rN   r   rw   r=   rH   Z	open_filer0   r0   r1   r     s&   

zWrapFS.openc                 C   sb   ddl m} |p	|}| |jstj|dt| || |W  d    S 1 s*w   Y  d S )Nr   r!   )rA   )subfsr"   rT   rm   r   rn   r   )r-   rA   factoryr"   r0   r0   r1   opendir  s   
$zWrapFS.opendirc                 C   sP   |    | |\}}t| ||| W d    d S 1 s!w   Y  d S r)   )rE   rB   r   
writebytes)r-   rA   contentsr=   rH   r0   r0   r1   r     s
   
"zWrapFS.writebytesc                 K   r   r   )rE   rB   r   uploadr   r0   r0   r1   r     r   zWrapFS.uploadc                 C   sX   |    | |\}}t| |j|||||d W d    d S 1 s%w   Y  d S rL   )rE   rB   r   	writefile)r-   rA   r   rM   r   rN   r=   rH   r0   r0   r1   r     s   	

"zWrapFS.writefilec                 C   sX   |    | |\}}t| || W d    n1 sw   Y  tt|}|S r)   )rE   rB   r   validatepathr   r   rz   r0   r0   r1   r   	  s   
zWrapFS.validatepathc                 C   rD   r)   )rE   rB   r   hash)r-   rA   rS   r=   rH   r0   r0   r1   r     rI   zWrapFS.hashc                 C   s   | j j| S r)   )r*   Zwalker_classZbindr4   r0   r0   r1   walk  s   zWrapFS.walk)rJ   NrK   r)   )NF)F)rs   r7   )NN)NNNNNN)NNrK   )r   )r   )rs   r7   NNrK   F)8r3   
__module____qualname____doc__r6   r,   r5   r?   rB   rC   rF   rO   rT   rX   rZ   r^   rj   rq   rv   ry   r   r   r   r   r   r   r   r   rp   r   r   ra   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   propertyr   __classcell__r0   r0   r.   r1   r(   3   s    


	




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








	r(   )9r   Z
__future__r   typingZsixrK   r   baser   r   r   r   r   r   rj   r	   r
   rA   r   r   Zerror_toolsr   ZTYPE_CHECKINGr   Z	threadingr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zenumsr   r   r\   r    r   r"   r   r#   TypeVarr$   Z_OpendirFactoryr&   r'   Zpython_2_unicode_compatibleZGenericr(   r0   r0   r0   r1   <module>   s4    @