U
    2Q\*                  	   @   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	Z	d dl
Z
ddlmZ ddlmZmZmZmZ eeZdaG dd deZG dd	 d	eZG d
d deZG dd deZG dd deZG dd deZedee
jeiZzFzd dl Z!W n e"k
r$   d dl#Z!Y nX eee!j$< eee!j%< [!W n e"e&fk
rX   Y nX dd Z'i Z(dd Z)e	*e+dZ,dd Z-dS )    )unicode_literalsN   )DistlibException)cached_propertyget_cache_basepath_to_cache_dirCachec                       s.   e Zd Zd fdd	Zdd Zdd Z  ZS )	ResourceCacheNc                    s0   |d krt jt td}tt| | d S )Nzresource-cache)ospathjoinr   strsuperr	   __init__)selfbase	__class__ 3/usr/lib/python3/dist-packages/distlib/resources.pyr      s    zResourceCache.__init__c                 C   s   dS )z
        Is the cache stale for the given resource?

        :param resource: The :class:`Resource` being cached.
        :param path: The path of the resource in the cache.
        :return: True if the cache is stale.
        Tr   r   resourcer   r   r   r   is_stale#   s    	zResourceCache.is_stalec              	   C   s   |j |\}}|dkr|}n~tj| j| ||}tj|}tj|sXt	| tj
|sjd}n| ||}|rt|d}||j W 5 Q R X |S )z
        Get a resource into the cache,

        :param resource: A :class:`Resource` instance.
        :return: The pathname of the resource in the cache.
        NTwb)finderget_cache_infor
   r   r   r   Zprefix_to_dirdirnameisdirmakedirsexistsr   openwritebytes)r   r   prefixr   resultr   Zstalefr   r   r   get.   s    
zResourceCache.get)N)__name__
__module____qualname__r   r   r&   __classcell__r   r   r   r   r	      s   r	   c                   @   s   e Zd Zdd ZdS )ResourceBasec                 C   s   || _ || _d S N)r   name)r   r   r-   r   r   r   r   I   s    zResourceBase.__init__N)r'   r(   r)   r   r   r   r   r   r+   H   s   r+   c                   @   s@   e Zd ZdZdZdd Zedd Zedd Zed	d
 Z	dS )Resourcez
    A class representing an in-package resource, such as a data file. This is
    not normally instantiated by user code, but rather by a
    :class:`ResourceFinder` which manages the resource.
    Fc                 C   s   | j | S )z
        Get the resource as a stream.

        This is not a property to make it obvious that it returns a new stream
        each time.
        )r   
get_streamr   r   r   r   	as_streamV   s    zResource.as_streamc                 C   s   t d krt a t | S r,   )cacher	   r&   r0   r   r   r   	file_path_   s    zResource.file_pathc                 C   s   | j | S r,   )r   	get_bytesr0   r   r   r   r"   f   s    zResource.bytesc                 C   s   | j | S r,   )r   get_sizer0   r   r   r   sizej   s    zResource.sizeN)
r'   r(   r)   __doc__is_containerr1   r   r3   r"   r6   r   r   r   r   r.   N   s   	

r.   c                   @   s   e Zd ZdZedd ZdS )ResourceContainerTc                 C   s   | j | S r,   )r   get_resourcesr0   r   r   r   	resourcesr   s    zResourceContainer.resourcesN)r'   r(   r)   r8   r   r;   r   r   r   r   r9   o   s   r9   c                   @   s   e Zd ZdZejdrdZndZdd Zdd Z	d	d
 Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZeejjZdd ZdS )ResourceFinderz4
    Resource finder for file system resources.
    java).pyc.pyoz.class)r>   r?   c                 C   s.   || _ t|dd | _tjt|dd| _d S )N
__loader____file__ )modulegetattrloaderr
   r   r   r   )r   rC   r   r   r   r      s    zResourceFinder.__init__c                 C   s   t j|S r,   )r
   r   realpathr   r   r   r   r   _adjust_path   s    zResourceFinder._adjust_pathc                 C   sB   t |trd}nd}||}|d| j tjj| }| |S )N   //r   )	
isinstancer"   splitinsertr   r
   r   r   rH   )r   resource_nameseppartsr$   r   r   r   
_make_path   s    

zResourceFinder._make_pathc                 C   s   t j|S r,   )r
   r   r   rG   r   r   r   _find   s    zResourceFinder._findc                 C   s
   d |j fS r,   )r   r   r   r   r   r   r      s    zResourceFinder.get_cache_infoc                 C   sD   |  |}| |sd }n&| |r0t| |}n
t| |}||_|S r,   )rQ   rR   _is_directoryr9   r.   r   )r   rN   r   r$   r   r   r   find   s    



zResourceFinder.findc                 C   s   t |jdS Nrb)r    r   rS   r   r   r   r/      s    zResourceFinder.get_streamc              
   C   s,   t |jd}| W  5 Q R  S Q R X d S rV   )r    r   read)r   r   r%   r   r   r   r4      s    zResourceFinder.get_bytesc                 C   s   t j|jS r,   )r
   r   getsizerS   r   r   r   r5      s    zResourceFinder.get_sizec                    s*   fdd t  fddt|jD S )Nc                    s   | dko|   j S )N__pycache__)endswithskipped_extensions)r%   r0   r   r   allowed   s    
z-ResourceFinder.get_resources.<locals>.allowedc                    s   g | ]} |r|qS r   r   ).0r%   )r]   r   r   
<listcomp>   s      z0ResourceFinder.get_resources.<locals>.<listcomp>)setr
   listdirr   rS   r   )r]   r   r   r:      s    zResourceFinder.get_resourcesc                 C   s   |  |jS r,   )rT   r   rS   r   r   r   r8      s    zResourceFinder.is_containerc                 c   s   |  |}|d k	r|g}|r|d}|V  |jr|j}|jD ]>}|sL|}nd||g}|  |}|jrv|| q>|V  q>qd S )Nr   rJ   )rU   popr8   r-   r;   r   append)r   rN   r   ZtodoZrnamer-   new_nameZchildr   r   r   iterator   s     



zResourceFinder.iteratorN)r'   r(   r)   r7   sysplatform
startswithr\   r   rH   rQ   rR   r   rU   r/   r4   r5   r:   r8   staticmethodr
   r   r   rT   re   r   r   r   r   r<   w   s"   r<   c                       s`   e Zd ZdZ fddZdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Z  ZS )ZipResourceFinderz6
    Resource finder for resources in .zip files.
    c                    sZ   t t| | | jj}dt| | _t| jdr>| jj| _nt	j
| | _t| j| _d S )Nr   _files)r   rj   r   rE   archivelen
prefix_lenhasattrrk   	zipimport_zip_directory_cachesortedindex)r   rC   rl   r   r   r   r      s    zZipResourceFinder.__init__c                 C   s   |S r,   r   rG   r   r   r   rH      s    zZipResourceFinder._adjust_pathc                 C   s   || j d  }|| jkrd}nX|r:|d tjkr:|tj }t| j|}z| j| |}W n tk
rt   d}Y nX |st	d|| j
j nt	d|| j
j |S )NTFz_find failed: %r %rz_find worked: %r %r)rn   rk   r
   rO   bisectrs   rh   
IndexErrorloggerdebugrE   r#   )r   r   r$   ir   r   r   rR      s    


zZipResourceFinder._findc                 C   s&   | j j}|jdt| d  }||fS )Nr   )rE   rl   r   rm   )r   r   r#   r   r   r   r   r      s    z ZipResourceFinder.get_cache_infoc                 C   s   | j |jS r,   )rE   get_datar   rS   r   r   r   r4      s    zZipResourceFinder.get_bytesc                 C   s   t | |S r,   )ioBytesIOr4   rS   r   r   r   r/      s    zZipResourceFinder.get_streamc                 C   s   |j | jd  }| j| d S )N   )r   rn   rk   r   r   r   r   r5      s    zZipResourceFinder.get_sizec                 C   s   |j | jd  }|r,|d tjkr,|tj7 }t|}t }t| j|}|t| jk r| j| |shq| j| |d  }|	|
tjdd  |d7 }qH|S )Nrt   r   r   )r   rn   r
   rO   rm   r`   ru   rs   rh   addrL   )r   r   r   plenr$   ry   sr   r   r   r:     s    

zZipResourceFinder.get_resourcesc                 C   sj   || j d  }|r*|d tjkr*|tj7 }t| j|}z| j| |}W n tk
rd   d}Y nX |S )Nrt   F)rn   r
   rO   ru   rs   rh   rv   )r   r   ry   r$   r   r   r   rT     s    

zZipResourceFinder._is_directory)r'   r(   r)   r7   r   rH   rR   r   r4   r/   r5   r:   rT   r*   r   r   r   r   rj      s   rj   c                 C   s   |t t| < d S r,   )_finder_registrytype)rE   finder_makerr   r   r   register_finder0  s    r   c                 C   s   | t krt |  }nv| tjkr$t|  tj|  }t|dd}|dkrJtdt|dd}tt|}|dkrxtd|  ||}|t | < |S )z
    Return a resource finder for a package.
    :param package: The name of the package.
    :return: A :class:`ResourceFinder` instance for the package.
    __path__Nz8You cannot get a finder for a module, only for a packager@   zUnable to locate finder for %r)	_finder_cacherf   modules
__import__rD   r   r   r&   r   )packager$   rC   r   rE   r   r   r   r   r   6  s    


r   Z	__dummy__c                 C   sR   d}t |  tj| }tt|}|rNt}tj	
| d|_||_||}|S )z
    Return a resource finder for a path, which should represent a container.

    :param path: The path.
    :return: A :class:`ResourceFinder` instance for the path.
    NrB   )pkgutilget_importerrf   path_importer_cacher&   r   r   _dummy_moduler
   r   r   rA   r@   )r   r$   rE   r   rC   r   r   r   finder_for_pathR  s    
r   ).Z
__future__r   ru   r{   Zloggingr
   r   Zshutilrf   typesrp   rB   r   utilr   r   r   r   Z	getLoggerr'   rw   r2   r	   objectr+   r.   r9   r<   rj   r   zipimporterr   _frozen_importlib_externalZ_fiImportError_frozen_importlibSourceFileLoader
FileFinderAttributeErrorr   r   r   
ModuleTyper   r   r   r   r   r   r   <module>   sN   
,!ZN  

