a
    ijy&                     @  sp  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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mZ dd
lmZ edZdZedZ dddZ!ej"ej"ej#dZ$eej"ej%hZ&dZ'ej(ddddZ)G dd dej*Z+ddddddZ,e-eG dd de+Z.ej-G dd dej/e+Z0dS ) z#GPath wrapper around the gfile API.    )annotationsN)AnyClassVarIteratorOptionalTypeTypeVarUnion)epy)abstract_path)backend)register)
stat_utils)PathLike_P)zgs://zs3://)gss3z/gs/z/s3/)r   r   N)rwaboolreturnc                   C  s   t jdduS )z'Checks whether TensorFlow is installed.Z
tensorflowN)	importlibutil	find_spec r   r   O/home/ghrups/robot-bench/.venv/lib/python3.9/site-packages/etils/epath/gpath.py_is_tf_installed=   s    r   c                      s  e Zd ZU dZded< dddd fdd	Zdddd
ddZeddddZeddddZ	eddddZ
ddddZddddZddddZdd fddZddd d!Zddd"d#Zdd$d%d&d'Zddd%d(d)ZdQdddd+d,d-Zddd$d.d/d0ZdRd2ddd3d4d5d6Zd3dd7d8ZdSdd3d9d:d;ZdTdd3d9d<d=ZdUd?d?d@ddddAdBdCdDdEZddddFdGdHZddddFdIdJZdVdddddKdLdMZdNddOdPZ  ZS )W_GPath+Pathlib like api with gs://, s3:// support.zClassVar[types.ModuleType]_PATHzType[_P]r   r   )clspartsr   c                   sr   d dd |D }|trZ|jddd\}}| d}t| }t | |||dS t j| g|R  S d S )N/c                 s  s   | ]}t |V  qd S N)osfspath).0pr   r   r   	<genexpr>M       z!_GPath.__new__.<locals>.<genexpr>://   )maxsplit)join
startswith_URI_PREFIXESsplit_URI_MAP_ROOTsuper__new__replace)r"   r#   	full_pathprefix_
new_prefix	__class__r   r   r5   L   s    

z_GPath.__new__)selfr#   r   c                 G  s   t | | S )z'Create a new `Path` child of same type.)type)r=   r#   r   r   r   _newV   s    z_GPath._newzOptional[str]r   c                 C  s<   t | jdkr4| jd dkr4| jd tv r4| jd S d S d S )N   r   r$   r-   )lenr#   _URI_SCHEMESr=   r   r   r   _uri_scheme\   s    
z_GPath._uri_schemebackend_lib.Backendc              	   C  sn   z(t | j }t r$| jd ur$tjW S |W S  tyh   ddd t D }td| j d| dd Y n0 d S )Nz, c                 s  s   | ]}d | dV  qdS )`z://`Nr   )r(   kr   r   r   r*   r   r+   z"_GPath._backend.<locals>.<genexpr>zUnsuported scheme `z://` (supported: ))_PREFIX_TO_BACKENDrD   r   backend_lib
tf_backendKeyErrorr/   NotImplementedError)r=   r   	supportedr   r   r   _backendg   s    
z_GPath._backendstrc                 C  sJ   | j }|r.| jj| dg| jdd R  S | jrB| jj| j S dS dS )z/Returns the `__fspath__` string representation.r,   r@   N.)rD   r!   r/   r#   )r=   Z
uri_schemer   r   r   	_path_strw   s    $z_GPath._path_strc                 C  s   | j S r%   rR   rC   r   r   r   
__fspath__   s    z_GPath.__fspath__c                 C  s   | j S r%   rS   rC   r   r   r   __str__   s    z_GPath.__str__c                 C  s   t | j d| jdS )N(rH   )r>   __name__rR   rC   r   r   r   __repr__   s    z_GPath.__repr__c                   s   | j r| jS t  S r%   )rD   rR   r4   as_urirC   r;   r   r   rY      s    z_GPath.as_urir   c                 C  s   | j | jS )zReturns True if self exists.)rO   existsrR   rC   r   r   r   rZ      s    z_GPath.existsc                 C  s   | j | jS )z$Returns True if self is a directory.)rO   isdirrR   rC   r   r   r   is_dir   s    z_GPath.is_dirzIterator[_P])r=   r   c                 c  s&   | j | jD ]}| | |V  qdS )zIterates over the directory.N)rO   listdirrR   r?   )r=   fr   r   r   iterdir   s    z_GPath.iterdirc                 C  s   |  | j| jS )z<Returns a new path with expanded `~` and `~user` constructs.)r?   r!   
expanduserrR   rC   r   r   r   r`      s    z_GPath.expanduserF)r=   strictr   c                 C  s   |  | j| jS )zReturns the abolute path.)r?   r!   abspathrR   )r=   ra   r   r   r   resolve   s    z_GPath.resolve)r=   patternr   c                 c  sH   | j | j|}d|v r&td|| j|D ]}| |V  q2dS )z*Yielding all matching files (of any kind).z**ztRecursive `**` pattern not supported as this could trigger thoushands of RPC requests on GCS. Use `*` instead. Got: N)r!   r/   rR   rM   rO   globr?   )r=   rd   r^   r   r   r   re      s    z_GPath.glob  intNone)modeparentsexist_okr   c                 C  s>   |dkrt d|r(| jj| j|d n| jj| j|d dS )z*Create a new directory at this given path.rf   z>mkdir with custom `mode=` not supported. Please open an issue.)rk   N)rM   rO   makedirsrR   mkdir)r=   ri   rj   rk   r   r   r   rm      s    z_GPath.mkdirc                 C  sH   |   st| j dt|  r6td| j d| j| j dS )zRemove the empty directory.z is not a directory.z
Directory z is not emptyN)r\   NotADirectoryErrorrR   listr_   
ValueErrorrO   rmtreerC   r   r   r   rmdir   s
    z_GPath.rmdir)
missing_okr   c                 C  s0   z| j | j W n ty*   |s& Y n0 dS )zRemove the directory.N)rO   rq   rR   FileNotFoundErrorr=   rs   r   r   r   rq      s
    z_GPath.rmtreec                 C  s0   z| j | j W n ty*   |s& Y n0 dS )z"Remove this file or symbolic link.N)rO   removerR   rt   ru   r   r   r   unlink   s
    z_GPath.unlinkr   N)encodingerrorsr   ztyping.IO[Union[str, bytes]])ri   rx   ry   kwargsr   c                K  s   |rt d|r,| ds,td| |dd}|tvrTtd|dt |rlt dt| d	| j| j	|}t
t
jtttf  |}|S )
zOpens the file.z$`errors=` not supported in `open()`.)utf8zutf-8z$Only UTF-8 encoding supported. Not: b zmode=z is not one of zkwargs z` not supported in `open()`.)rM   lowerr0   rp   r6   _OPEN_MODESro   rO   openrR   typingcastIOr	   rP   bytes)r=   ri   rx   ry   rz   Zmode_without_bZgfiler   r   r   r      s    	z_GPath.open)r=   targetr   c                 C  s,   |  |}t| |}|| jt| |S )z-Rename file or directory to the given target.)r?   _get_backendrenamerR   r&   r'   r=   r   r   r   r   r   r      s    

z_GPath.renamec                 C  s,   |  |}t| |}|| jt| |S )z.Replace file or directory to the given target.)r?   r   r6   rR   r&   r'   r   r   r   r   r6      s    

z_GPath.replace)r=   dst	overwriter   c                 C  s0   |  |}t| |}|j| jt||d |S )z+Copy file or directory to the given target.)r   )r?   r   copyrR   r&   r'   )r=   r   r   r   r   r   r   r     s    

z_GPath.copyzstat_utils.StatResultc                 C  s   | j | jS )z(Returns metadata for the file/directory.)rO   statrR   rC   r   r   r   r     s    z_GPath.stat)F)rf   FF)F)F)r   )F)rW   
__module____qualname____doc____annotations__r5   r?   propertyrD   rO   rR   rT   rU   rX   rY   rZ   r\   r_   r`   rc   re   rm   rr   rq   rw   r   r   r6   r   r   __classcell__r   r   r;   r   r   C   sH   


   
 
r   rE   )p0p1r   c                 C  s*   | j tv r| j S |j tv r |j S | j S dS )zWhen composing with another backend, GCS win.

  To allow `Path('.').replace('gs://')`

  Args:
    p0: Path to compare
    p1: Path to compare

  Returns:
    GCS backend if one of the 2 path is GCS, else p0 backend.
  N)rO   _GCS_BACKENDS)r   r   r   r   r   r     s
    

r   c                   @  s   e Zd ZdZeZdS )
PosixGPathr    N)rW   r   r   r   	posixpathr!   r   r   r   r   r   *  s   r   c                   @  s   e Zd ZdZeZdS )WindowsGPathr    N)rW   r   r   r   ntpathr!   r   r   r   r   r   1  s   r   )1r   
__future__r   	functoolsimportlib.utilr   r   r&   pathlibr   typesr   r   r   r   r   r   r   r	   Zetilsr
   Zetils.epathr   r   rJ   r   r   Zetils.epath.typingr   r   r1   	frozensetrB   r3   Zfsspec_backendZ
os_backendrI   rK   r   r   cacher   Pathr   r   Zregister_path_clsr   PureWindowsPathr   r   r   r   r   <module>   sP   $ R