a
    ijj                     @  s   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	m
Z
 ddlmZ ddlmZ ddlmZ dd	 ZG d
d dejZG dd dejZG dd dejZG dd dejZdd ZdS )    )annotationsN)Iterator   )abc)only)ZipPathc                 C  s   t tj| S N)itercollectionsOrderedDictfromkeys)items r   Y/home/ghrups/robot-bench/.venv/lib/python3.9/site-packages/importlib_resources/readers.pyremove_duplicates   s    r   c                   @  s$   e Zd Zdd Zdd Zdd ZdS )
FileReaderc                 C  s   t |jj| _d S r   )pathlibPathpathparent)selfloaderr   r   r   __init__   s    zFileReader.__init__c                 C  s   t | j|S z{
        Return the file system path to prevent
        `resources.path()` from creating a temporary
        copy.
        strr   joinpathr   resourcer   r   r   resource_path   s    zFileReader.resource_pathc                 C  s   | j S r   r   r   r   r   r   files!   s    zFileReader.filesN)__name__
__module____qualname__r   r   r"   r   r   r   r   r      s   r   c                      s4   e Zd Zdd Z fddZdd Zdd Z  ZS )		ZipReaderc                 C  sH   |j dd| _ ||r<|d\}}}|  j |d 7  _ |j| _d S )N\/.)prefixreplace
is_package
rpartitionarchive)r   r   module_namer   r   r   r   &   s
    
zZipReader.__init__c              
     sF   zt  |W S  ty@ } zt|jd W Y d }~n
d }~0 0 d S Nr   )superopen_resourceKeyErrorFileNotFoundErrorargs)r   r   exc	__class__r   r   r4   -   s    zZipReader.open_resourcec                 C  s   |   |}| o| S )zf
        Workaround for `zipfile.Path.is_file` returning true
        for non-existent paths.
        )r"   r   is_fileexists)r   r   targetr   r   r   is_resource3   s    zZipReader.is_resourcec                 C  s   t | j| jS r   )r   r.   r*   r!   r   r   r   r"   ;   s    zZipReader.files)r#   r$   r%   r   r4   r>   r"   __classcell__r   r   r9   r   r&   %   s   r&   c                      sx   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	 fddZ
edd Zdd Zedd Zdd Z  ZS )MultiplexedPathz
    Given a series of Traversable objects, implement a merged
    version of the interface across all objects. Useful for
    namespace packages which may be multihomed at a single
    name.
    c                 G  sF   t ttt|| _| js&d}t|tdd | jD sBtdd S )Nz.MultiplexedPath must contain at least one pathc                 s  s   | ]}|  V  qd S r   is_dir.0r   r   r   r   	<genexpr>L       z+MultiplexedPath.__init__.<locals>.<genexpr>z)MultiplexedPath only supports directories)listmap_ensure_traversabler   _pathsr6   allNotADirectoryError)r   pathsmessager   r   r   r   G   s    zMultiplexedPath.__init__c                 C  sF   dd | j D }td}tjt||d|d}t| jdd |D S )Nc                 s  s    | ]}|  D ]
}|V  qqd S r   )iterdir)rD   r   childr   r   r   rE   P   rF   z*MultiplexedPath.iterdir.<locals>.<genexpr>r1   )keyc                 s  s   | ]\}}|V  qd S r   r   )rD   r1   Zlocsr   r   r   rE   S   rF   )rJ   operator
attrgetter	itertoolsgroupbysortedrH   _follow)r   childrenZby_namegroupsr   r   r   rO   O   s    
zMultiplexedPath.iterdirc                 C  s   t |  dd S Nz is not a filer6   r!   r   r   r   
read_bytesU   s    zMultiplexedPath.read_bytesc                 O  s   t |  dd S rZ   r[   r   r7   kwargsr   r   r   	read_textX   s    zMultiplexedPath.read_textc                 C  s   dS )NTr   r!   r   r   r   rB   [   s    zMultiplexedPath.is_dirc                 C  s   dS )NFr   r!   r   r   r   r;   ^   s    zMultiplexedPath.is_filec                   s8   zt  j| W S  tjy2   | jd j|  Y S 0 d S r2   )r3   r   r   ZTraversalErrorrJ   )r   Zdescendantsr9   r   r   r   a   s    zMultiplexedPath.joinpathc                 C  sb   t |d\}}}z
t|W S  ty\   z| | W  Y S  tyV   t| Y  Y S 0 Y n0 dS )z
        Construct a MultiplexedPath if needed.

        If children contains a sole element, return it.
        Otherwise, return a MultiplexedPath of the items.
        Unless one of the items is not a Directory, then return the first.
           N)rT   teer   
ValueErrorrL   next)clsrX   subdirsZone_dirZone_filer   r   r   rW   i   s    	
zMultiplexedPath._followc                 O  s   t |  dd S rZ   r[   r]   r   r   r   open|   s    zMultiplexedPath.openc                 C  s   | j d jS r2   )rJ   r1   r!   r   r   r   r1      s    zMultiplexedPath.namec                 C  s"   d dd | jD }d| dS )Nz, c                 s  s   | ]}d | d V  qdS )'Nr   rC   r   r   r   rE      rF   z+MultiplexedPath.__repr__.<locals>.<genexpr>zMultiplexedPath())joinrJ   )r   rM   r   r   r   __repr__   s    zMultiplexedPath.__repr__)r#   r$   r%   __doc__r   rO   r\   r_   rB   r;   r   classmethodrW   rf   propertyr1   rj   r?   r   r   r9   r   r@   ?   s   

r@   c                   @  s\   e Zd Zdd ZeddddZeddd	d
dZeddddZdd Z	dd Z
dS )NamespaceReaderc                 C  s0   dt |vrtdtttt| j| | _d S )NZNamespacePathzInvalid path)r   rb   r@   filterboolrH   _resolver   )r   namespace_pathr   r   r   r      s    zNamespaceReader.__init__zabc.Traversable | None)returnc                 C  s   dd |  |D }t|dS )a  
        Given an item from a namespace path, resolve it to a Traversable.

        path_str might be a directory on the filesystem or a path to a
        zipfile plus the path within the zipfile, e.g. ``/foo/bar`` or
        ``/foo/baz.zip/inner_dir`` or ``foo\baz.zip\inner_dir\sub``.

        path_str might also be a sentinel used by editable packages to
        trigger other behaviors (see python/importlib_resources#311).
        In that case, return None.
        c                 s  s   | ]}|  r|V  qd S r   rA   )rD   candr   r   r   rE      rF   z+NamespaceReader._resolve.<locals>.<genexpr>N)_candidate_pathsrc   )rd   path_strdirsr   r   r   rq      s    zNamespaceReader._resolver   zIterator[abc.Traversable])rv   rs   c                 c  s    t |V  | |E d H  d S r   )r   r   _resolve_zip_path)rd   rv   r   r   r   ru      s    z NamespaceReader._candidate_paths)rv   c              	   c  s   t ttd| D ]n}ttttt	J | |
 d  ddd }t| d |  |dV  W d    q1 sx0    Y  qd S )Nz[\\/]r'   r(   )reversedrG   refinditer
contextlibsuppressr6   IsADirectoryErrorrL   PermissionErrorendr+   r   startlstrip)rv   matchinnerr   r   r   rx      s    z!NamespaceReader._resolve_zip_pathc                 C  s   t | j|S r   r   r   r   r   r   r      s    zNamespaceReader.resource_pathc                 C  s   | j S r   r    r!   r   r   r   r"      s    zNamespaceReader.filesN)r#   r$   r%   r   rl   rq   ru   staticmethodrx   r   r"   r   r   r   r   rn      s   rn   c                 C  s(   t | ts| S tjdtdd t| S )zk
    Convert deprecated string arguments to traversables (pathlib.Path).

    Remove with Python 3.15.
    z<String arguments are deprecated. Pass a Traversable instead.r`   )
stacklevel)
isinstancer   warningswarnDeprecationWarningr   r   r    r   r   r   rI      s    
rI   )
__future__r   r
   r|   rT   rR   r   rz   r   collections.abcr    r   
_itertoolsr   Zcompat.py39r   r   TraversableResourcesr   r&   Traversabler@   rn   rI   r   r   r   r   <module>   s"   I3