o
    ^e                     @   s   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 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S )    N   )abc)only)ZipPathc                 C   s   t tj| S N)itercollectionsOrderedDictfromkeys)items r   KD:\Projects\ConvertPro\env\Lib\site-packages\importlib_resources/readers.pyremove_duplicates   s   r   c                   @   $   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      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      zFileReader.resource_pathc                 C      | j S r   r   r   r   r   r   files      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   s4   | d\}}}|jdd| d | _|j| _d S )N.\/)
rpartitionprefixreplacearchive)r   r   module_namer   r   r   r   !   s   zZipReader.__init__c              
      s6   zt  |W S  ty } zt|jd d }~ww Nr   )superopen_resourceKeyErrorFileNotFoundErrorargs)r   r   exc	__class__r   r   r7   &   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_resource,   s   zZipReader.is_resourcec                 C   s   t | j| jS r   )r   r1   r/   r#   r   r   r   r$   4      zZipReader.files)r'   r(   r)   r   r7   rA   r$   __classcell__r   r   r<   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   sH   t ttjt|| _| jsd}t|tdd | jD s"t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>E       z+MultiplexedPath.__init__.<locals>.<genexpr>z)MultiplexedPath only supports directories)	listmapr   r   r   _pathsr9   allNotADirectoryError)r   pathsmessager   r   r   r   @   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)rG   r   childr   r   r   rH   I   s     z*MultiplexedPath.iterdir.<locals>.<genexpr>r4   )keyc                 s   s    | ]\}}|V  qd S r   r   )rG   r4   Zlocsr   r   r   rH   L   rI   )rL   operator
attrgetter	itertoolsgroupbysortedrK   _follow)r   childrenZby_namegroupsr   r   r   rQ   H   s   
zMultiplexedPath.iterdirc                 C      t |  dNz is not a filer9   r#   r   r   r   
read_bytesN   rB   zMultiplexedPath.read_bytesc                 O   r\   r]   r^   r   r:   kwargsr   r   r   	read_textQ   rB   zMultiplexedPath.read_textc                 C      dS )NTr   r#   r   r   r   rE   T      zMultiplexedPath.is_dirc                 C   rc   )NFr   r#   r   r   r   r>   W   rd   zMultiplexedPath.is_filec                    s4   zt  j| W S  tjy   | jd j|  Y S w r5   )r6   r   r   ZTraversalErrorrL   )r   Zdescendantsr<   r   r   r   Z   s
   zMultiplexedPath.joinpathc                 C   sZ   t |d\}}}zt|W S  ty,   z| | W  Y S  ty+   t| Y  Y S w w )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.
           )rV   teer   
ValueErrorrN   next)clsrZ   subdirsZone_dirZone_filer   r   r   rY   b   s   	
zMultiplexedPath._followc                 O   r\   r]   r^   r`   r   r   r   openu   rB   zMultiplexedPath.openc                 C   s   | j d jS r5   )rL   r4   r#   r   r   r   r4   x   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   rF   r   r   r   rH   }   s    z+MultiplexedPath.__repr__.<locals>.<genexpr>zMultiplexedPath())joinrL   )r   rO   r   r   r   __repr__|   s   zMultiplexedPath.__repr__)r'   r(   r)   __doc__r   rQ   r_   rb   rE   r>   r   classmethodrY   rk   propertyr4   ro   rC   r   r   r<   r   rD   8   s    

rD   c                   @   r   )NamespaceReaderc                 C   s&   dt |vr
tdtt| | _d S )NNamespacePathzInvalid path)r   rg   rD   rJ   r   )r   namespace_pathr   r   r   r      s   zNamespaceReader.__init__c                 C   r   r   r   r   r   r   r   r      r    zNamespaceReader.resource_pathc                 C   r!   r   r"   r#   r   r   r   r$      r%   zNamespaceReader.filesNr&   r   r   r   r   rs      s    rs   )r   rV   r   rT    r   
_itertoolsr   Z_compatr   r   TraversableResourcesr   r*   TraversablerD   rs   r   r   r   r   <module>   s    I