o
    f                     @   sx   d dl Z d dlZd dl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   )abcc                 C   s   t tj| S N)itercollectionsOrderedDictfromkeys)items r
   (/usr/lib/python3.10/importlib/readers.pyremove_duplicates      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   r6   !   s   zZipReader.open_resourcec                 C   s   |   |}| o| S r   )r#   r   is_fileexists)r   r   targetr
   r
   r   is_resource'   s   zZipReader.is_resourcec                 C   s   t | j| jS r   )zipfiler   r0   r.   r"   r
   r
   r   r#   -   r   zZipReader.files)r&   r'   r(   r   r6   r@   r#   __classcell__r
   r
   r;   r   r)      s
    r)   c                   @   sh   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
e
Zdd Zedd Zdd Zd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>>   s    z+MultiplexedPath.__init__.<locals>.<genexpr>z)MultiplexedPath only supports directories)	listmapr   r   r   _pathsr8   allNotADirectoryError)r   pathsmessager
   r
   r   r   9   s   zMultiplexedPath.__init__c                 c   sB    g }| j D ]}| D ]}|j|v rq||j |V  qqd S r   )rJ   iterdirr3   append)r   visitedr   filer
   r
   r   rO   A   s   

zMultiplexedPath.iterdirc                 C      t |  dNz is not a filer8   r"   r
   r
   r   
read_bytesJ      zMultiplexedPath.read_bytesc                 O   rS   rT   rU   r   r9   kwargsr
   r
   r   	read_textM   rW   zMultiplexedPath.read_textc                 C      dS )NTr
   r"   r
   r
   r   rD   P      zMultiplexedPath.is_dirc                 C   r[   )NFr
   r"   r
   r
   r   r=   S   r\   zMultiplexedPath.is_filec                 C   s.   |   D ]}|j|kr|  S q| jd | S r4   )rO   r3   rJ   )r   childrR   r
   r
   r   r   V   s
   
zMultiplexedPath.joinpathc                 O   rS   rT   rU   rX   r
   r
   r   open`   rW   zMultiplexedPath.openc                 C   s   | j d jS r4   )rJ   r3   r"   r
   r
   r   r3   c   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
   rE   r
   r
   r   rG   h   s    z+MultiplexedPath.__repr__.<locals>.<genexpr>zMultiplexedPath())joinrJ   )r   rM   r
   r
   r   __repr__g   s   zMultiplexedPath.__repr__N)r&   r'   r(   __doc__r   rO   rV   rZ   rD   r=   r   __truediv__r^   propertyr3   rb   r
   r
   r
   r   rC   1   s    	
rC   c                   @   r   )NamespaceReaderc                 C   s&   dt |vr
tdtt| | _d S )NNamespacePathzInvalid path)r   
ValueErrorrC   rH   r   )r   namespace_pathr
   r
   r   r   m   s   zNamespaceReader.__init__c                 C   r   r   r   r   r
   r
   r   r   r   r   zNamespaceReader.resource_pathc                 C   r    r   r!   r"   r
   r
   r   r#   z   r$   zNamespaceReader.filesNr%   r
   r
   r
   r   rf   l   s    rf   )r   rA   r    r   r   TraversableResourcesr   r)   TraversablerC   rf   r
   r
   r
   r   <module>   s    ;