a
    ij8:                     @  s   d Z ddlmZ ddlZddlZddlZddlZddlZddl	Z	ddl
ZddlZddlmZmZmZ ddlmZ ddlmZ ejrddlZG dd dejZG d	d
 d
eZG dd deZG dd deZdddddZe Ze Ze ZdS )z`os.path` API backend.    )annotationsN)IteratorNoReturnUnion)
stat_utils)PathLikec                   @  sH  e Zd ZdZejddddddZejddd	d
dZejddd	ddZejddd	ddZ	ejddd	ddZ
ejddddddddZejddddddddZejddd	ddZejddd	ddZejddddd d!Zejddddd"d#Zejddddd$d%d&Zejdd'd	d(d)Zd*S )+BackendzAbstract backend class.r   strtyping.IO[Union[str, bytes]]pathmodereturnc                 C  s   t dS )z!`open`. Encoding should be utf-8.NNotImplementedErrorselfr   r    r   Q/home/ghrups/robot-bench/.venv/lib/python3.9/site-packages/etils/epath/backend.pyopen'   s    zBackend.openboolr   r   c                 C  s   t d S Nr   r   r   r   r   r   exists0   s    zBackend.existsc                 C  s   t d S r   r   r   r   r   r   isdir4   s    zBackend.isdir	list[str]c                 C  s   t d S r   r   r   r   r   r   listdir8   s    zBackend.listdirc                 C  s   t d S r   r   r   r   r   r   glob<   s    zBackend.globFexist_okNoner   r    r   c                C  s   t d S r   r   r   r   r    r   r   r   makedirs@   s    zBackend.makedirsc                C  s   t d S r   r   r#   r   r   r   mkdirD   s    zBackend.mkdirc                 C  s   t d S r   r   r   r   r   r   rmtreeH   s    zBackend.rmtreec                 C  s   t d S r   r   r   r   r   r   removeL   s    zBackend.remover   dstr   c                 C  s   t d S r   r   r   r   r)   r   r   r   renameP   s    zBackend.renamec                 C  s   t d S r   r   r*   r   r   r   replaceT   s    zBackend.replacer   r)   	overwriter   c                 C  s   t d S r   r   r   r   r)   r.   r   r   r   copyX   s    zBackend.copystat_utils.StatResultc                 C  s   t d S r   r   r   r   r   r   stat\   s    zBackend.statN)__name__
__module____qualname____doc__abcabstractmethodr   r   r   r   r   r$   r%   r&   r'   r+   r,   r0   r2   r   r   r   r   r   $   s6   r   c                   @  s   e Zd ZdZddddddZddd	d
dZddd	ddZddd	ddZddd	ddZddddddddZ	ddddddddZ
ddd	ddZddd	ddZddddd d!Zddddd"d#Zddddd$d%d&Zdd'd	d(d)Zd*S )+_OsPathBackendz`os.path` backend.r   r	   r
   r   c                 C  s    d|v rd }nd}t |||dS )Nbzutf-8)encoding)r   )r   r   r   r;   r   r   r   r   d   s    z_OsPathBackend.openr   r   c                 C  s   t j|S r   )osr   r   r   r   r   r   r   o   s    z_OsPathBackend.existsc                 C  s   t j|S r   )r<   r   r   r   r   r   r   r   r   s    z_OsPathBackend.isdirr   c                 C  s   dd t |D S )Nc                 S  s   g | ]}| d s|qS ~)endswith.0pr   r   r   
<listcomp>w       z*_OsPathBackend.listdir.<locals>.<listcomp>)r<   r   r   r   r   r   r   u   s    z_OsPathBackend.listdirc                 C  s
   t |S r   )glob_libr   r   r   r   r   r   y   s    z_OsPathBackend.globFr   r!   r"   c                C  s   t j||d d S Nr   )r<   r$   r#   r   r   r   r$   |   s    z_OsPathBackend.makedirsc                C  s<   zt | W n( ty6   | |r0|r,q2 n Y n0 d S r   )r<   r%   FileExistsErrorr   r#   r   r   r   r%      s    
z_OsPathBackend.mkdirc                 C  s0   zt | W n ty*   | | Y n0 d S r   )shutilr&   NotADirectoryErrorr'   r   r   r   r   r&      s    z_OsPathBackend.rmtreec                 C  sX   zt | W nD ty*   t | Y n* tyR   | |rLt | n Y n0 d S r   )r<   r'   IsADirectoryErrorrmdirPermissionErrorr   r   r   r   r   r'      s    
z_OsPathBackend.remover(   c                 C  s0   |  |r td| d| dt|| d S )NzCannot rename . Destination  already exists.)r   rG   r<   r+   r*   r   r   r   r+      s
    
z_OsPathBackend.renamec                 C  s*   |  |rtd| dt|| d S )NCannot overwrite:  is a directory)r   rJ   r<   r,   r*   r   r   r   r,      s    
z_OsPathBackend.replacer-   c                 C  s2   |s"|  |r"t| d| dt|| d S )N already exists. Cannot copy .)r   rG   rH   copyfiler/   r   r   r   r0      s    z_OsPathBackend.copyr1   c                 C  sn   t |}t jdkrd }d }n,dd l}dd l}||jj}||j	j
}tjt|j|jt|j||dS )Nntr   is_directorylengthmtimeownergroup)r<   r2   namegrppwdgetpwuidst_uidpw_namegetgrgidst_gidgr_namer   
StatResultstat_libS_ISDIRst_modest_sizeintst_mtime)r   r   strY   rZ   r\   r]   r   r   r   r2      s    


z_OsPathBackend.statN)r3   r4   r5   r6   r   r   r   r   r   r$   r%   r&   r'   r+   r,   r0   r2   r   r   r   r   r9   a   s   r9   c                   @  s&  e Zd ZdZedd Zedd Zejdddd	d
dZ	dddddZ
dddddZdddddZdddddZddddddddZddddddddZddddd Zdddd!d"Zdddd#d$d%Zdddd#d&d'Zddddd(d)d*Zd+d,d-d.Zdd/dd0d1Zd2S )3
_TfBackendzTensorFlow backend.c              
   C  sF   zdd l }W n4 ty@ } zt| dd W Y d }~n
d }~0 0 |S )Nr   z?. To use epath.Path with gs://, TensorFlow should be installed.)
tensorflowImportError)r   rm   er   r   r   tf   s    z_TfBackend.tfc                 C  s
   | j jjS r   )rp   iogfile)r   r   r   r   rr      s    z_TfBackend.gfiler   r	   z&Iterator[typing.IO[Union[str, bytes]]]r   c                 c  sr   | j ||P}z
|V  W n4 | jjjyN } zt|d W Y d }~n
d }~0 0 W d    n1 sd0    Y  d S r   )rr   ZGFilerp   errorsNotFoundErrorFileNotFoundError)r   r   r   fro   r   r   r   r      s
    
z_TfBackend.openr   r   c                 C  s   | j |S r   )rr   r   r   r   r   r   r      s    z_TfBackend.existsc                 C  s   | j |S r   )rr   r   r   r   r   r   r      s    z_TfBackend.isdirr   c                 C  s   | j |S r   )rr   r   r   r   r   r   r      s    z_TfBackend.listdirc                 C  s   | j |S r   )rr   r   r   r   r   r   r      s    z_TfBackend.globFr   r!   r"   c             
   C  s   |s|  |rt| dz| j| W nT | jjjy } z6dt|v r^tt|d ntt|d W Y d }~n
d }~0 0 d S )NrN   not a directory)	r   rG   rr   r$   rp   rs   FailedPreconditionErrorr	   OSErrorr   r   r    ro   r   r   r   r$      s    z_TfBackend.makedirsc             
   C  s   |s|  |rt| dz| j| W n8 | jjjyd } ztt|d W Y d }~n$d }~0 0 | 	|std| dd S )NrN   zCannot create dir. z is not a directory)
r   rG   rr   r%   rp   rs   rt   ru   r	   r   rz   r   r   r   r%      s    $
z_TfBackend.mkdirc              
   C  sN   z| j | W n8 | jjjyH } ztt|d W Y d }~n
d }~0 0 d S r   )rr   r&   rp   rs   rt   ru   r	   r   r   ro   r   r   r   r&     s    z_TfBackend.rmtreec              
   C  s   z| j | W nn | jjjyH } ztt|d W Y d }~n@d }~0  | jjjy~ } ztt|d W Y d }~n
d }~0 0 d S r   )	rr   r'   rp   rs   rx   ry   r	   rt   ru   r{   r   r   r   r'     s    "z_TfBackend.remover(   c              
   C  sL   z| j || W n4 | jjjyF } z| | W Y d }~n
d }~0 0 d S r   rr   r+   rp   rs   OpError_reraise_errorr   r   r)   ro   r   r   r   r+     s    z_TfBackend.renamec              
   C  sP   z| j j||dd W n4 | jjjyJ } z| | W Y d }~n
d }~0 0 d S )NTr.   r|   r   r   r   r   r,     s    z_TfBackend.replacer-   c              
   C  sv   |r&|  |r&td| d| dd z| jj|||d W n4 | jjjyp } z| | W Y d }~n
d }~0 0 d S )NzCannot copy rM   rP   r   )r   rJ   rr   r0   rp   rs   r}   r~   )r   r   r)   r.   ro   r   r   r   r0      s    z_TfBackend.copyr   )r   c                 C  s   t |}t|| jjjrPd| v r.t|dd| v rFt|dn
t|dt|| jjj	rt |}d| v rt|dn
t
|dt|| jjjrt|dn dS )zReraise the TF error.rw   Nzis a directory)r	   
isinstancerp   rs   rx   lowerrI   rJ   ry   ZAlreadyExistsErrorrG   rt   ru   )r   ro   Ze_msgr   r   r   r~   *  s    


z_TfBackend._reraise_errorr1   c                 C  s*   | j |}tj|j|j|jd d d dS )Ni ʚ;rU   )rr   r2   r   rd   rV   rW   Z
mtime_nsec)r   r   rk   r   r   r   r2   ?  s    z_TfBackend.statN)r3   r4   r5   r6   propertyrp   rr   
contextlibcontextmanagerr   r   r   r   r   r$   r%   r&   r'   r+   r,   r0   r~   r2   r   r   r   r   rl      s(   
	

rl   c                   @  s"  e Zd ZdZe dddddZdddd	d
ZddddddZdddddZ	dddddZ
dddddZdddddZddddddddZdddddddd Zdddd!d"Zdddd#d$Zdddd%d&d'Zdddd%d(d)Zddddd*d+d,Zdd-dd.d/Zd0S )1_FileSystemSpecBackendz2FileSystemSpec backend entirely relying on fsspec.r	   zfsspec.AbstractFileSystem)r[   r   c              
   C  sF   zddl }W n. ty: } ztd|W Y d}~n
d}~0 0 ||S )zCaches the filesystem.r   Nz:To use epath.Path with gs://, fsspec should be installed.')fsspecrn   
filesystem)r   r[   r   ro   r   r   r   _get_filesystemM  s    z&_FileSystemSpecBackend._get_filesystemr   r   c                 C  s@   t |}|dr| dS |dr2| dS | dS dS )z5Returns the proper fsspec filsystem: GCS, S3 or file.zgs://Zgcszs3://Zs3fileN)r<   fspath
startswithr   r   r   r   r   fsX  s    




z_FileSystemSpecBackend.fsr
   r   c                 C  s   |  |j||dS )Nr   )r   r   r   r   r   r   r   b  s    z_FileSystemSpecBackend.openr   c                 C  s   |  ||S r   )r   r   r   r   r   r   r   e  s    z_FileSystemSpecBackend.existsc                 C  s   |  ||S r   )r   r   r   r   r   r   r   h  s    z_FileSystemSpecBackend.isdirr   c                 C  s"   |  |j|dd}dd |D S )NF)detailc                 S  s"   g | ]}| d stj|qS r=   )r?   r<   r   basenamer@   r   r   r   rC   m  rD   z2_FileSystemSpecBackend.listdir.<locals>.<listcomp>)r   r   )r   r   pathsr   r   r   r   k  s    z_FileSystemSpecBackend.listdirc                   s&   t |  fdd| ||D S )Nc                   s   g | ]} | qS r   r   r@   protocolr   r   rC   q  rD   z/_FileSystemSpecBackend.glob.<locals>.<listcomp>)_get_protocolr   r   r   r   r   r   r   o  s    z_FileSystemSpecBackend.globFr   r!   r"   c                C  s   |  |j||dS rF   )r   r$   r#   r   r   r   r$   s  s    z_FileSystemSpecBackend.makedirsc                C  sT   z|  |j|ddW S  tyN   |r8| |r8Y d S td|dd Y n0 d S )NF)Zcreate_parentsz0The operation failed because the specified path=rN   )r   r%   rG   r   r#   r   r   r   r%   v  s    
z_FileSystemSpecBackend.mkdirc                 C  s   |  |j|ddS )NT	recursive)r   rmr   r   r   r   r&     s    z_FileSystemSpecBackend.rmtreec              	   C  sB   z|  |j|ddW S  ttfy<   |  || Y S 0 d S )NFr   )r   r   rJ   
ValueErrorrK   r   r   r   r   r'     s    z_FileSystemSpecBackend.remover(   c                 C  s   |  |rt| d| d| |rR| |sR|  |rRtd| d| dtj|}|  |sxtd| dt|t| }}| |j	||dd	S )
Nz already exists. Cannot rename rR   zCannot rename a file (z) to a directory ()folder  does not existTr   )
r   rG   r   r<   r   dirnameru   r   r   r+   r   r   r)   Z
dst_folderr   r   r   r+     s    


z_FileSystemSpecBackend.renamec                 C  s   |  |rtd| d| |s4td| d|  |r\| |r\td| d| tj|}| |std| dt|t| }}| 	|j
||dd	S )
NrO   rP   zCannot replace: path r   zCannot replace a directory z by a file r   Tr   )r   rJ   r   ru   rI   r<   r   r   r   r   r+   r   r   r   r   r,     s    


z_FileSystemSpecBackend.replacer-   c              	   C  s  |s"|  |r"t| d| d| |}| |rP|sPtd| d| d|rn|rntd| d| dt|t| }}d}| j|d	d
Z}| j|dd
,}||}|sq|| qW d    n1 s0    Y  W d    n1 s0    Y  d S )NrQ   rR   zCannot copy to z. Path rP   zCannot overwrite rM   i   rbr   wb)	r   rG   r   rJ   r<   r   r   readwrite)r   r   r)   r.   Z
is_dir_dst	chunksizesrcdatar   r   r   r0     s&    

z_FileSystemSpecBackend.copyr1   c                 C  sP   |  ||}t|dd}tj|ddk|d||d|ddS )	NrX   g        type	directorysizerY   rZ   rU   )r   infori   getr   rd   )r   r   r   rX   r   r   r   r2     s    z_FileSystemSpecBackend.statN)r3   r4   r5   r6   	functools	lru_cacher   r   r   r   r   r   r   r$   r%   r&   r'   r+   r,   r0   r2   r   r   r   r   r   J  s"   


r   r   r	   r   c                 C  s.   t | } d| v r&| ddd d S dS dS )zExtract the protocol.z://   r    N)r<   r   split)r   r   r   r   r     s    
r   )r6   
__future__r   r7   r   r   r   rE   r<   rH   r2   re   typingr   r   r   Zetils.epathr   Zetils.epath.typingr   TYPE_CHECKINGr   ABCr   r9   rl   r   r   Z
tf_backendZ
os_backendZfsspec_backendr   r   r   r   <module>   s0   =b  	