B
    M”3\F   ã               @   sB  d Z ddlmZ ddlZddlmZ ddlZddlZddlm	Z
 ddlZddlZddlZddlZejd dkrxddlZnddlmZ e dej¡Ze dej¡Zd	ZG d
d„ deƒZG dd„ deƒZG dd„ dejƒZG dd„ deƒZG dd„ deƒZddd„Zd dd„Z d!dd„Z!d"dd„Z"e#dkr>ddl$Z$e$ $e"dƒ¡ dS )#z7Discover and load entry points from installed packages.é    )ÚcontextmanagerN)Úimport_moduleé   )ÚconfigparserzY
(?P<modulename>\w+(\.\w+)*)
(:(?P<objectname>\w+(\.\w+)*))?
\s*
(\[(?P<extras>.+)\])?
$
zC
(?P<dist_version>[^/\\]+)\.(dist|egg)-info
[/\\]entry_points.txt$
z0.3c               @   s0   e Zd ZdZdd„ Zdd„ Zeedd„ ƒƒZdS )	ÚBadEntryPointz0Raised when an entry point can't be parsed.
    c             C   s
   || _ d S )N)Úepstr)Úselfr   © r	   ú*lib/python3.7/site-packages/entrypoints.pyÚ__init__'   s    zBadEntryPoint.__init__c             C   s
   d| j  S )Nz#Couldn't parse entry point spec: %r)r   )r   r	   r	   r
   Ú__str__*   s    zBadEntryPoint.__str__c           
   c   s@   y
d V  W n0 t k
r: }  zt t| ƒ¡ W d d } ~ X Y nX d S )N)r   ÚwarningsÚwarnÚstr)Úer	   r	   r
   Úerr_to_warnings-   s    
zBadEntryPoint.err_to_warningsN)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   Ústaticmethodr   r   r	   r	   r	   r
   r   $   s
   r   c               @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚNoSuchEntryPointzCRaised by :func:`get_single` when no matching entry point is found.c             C   s   || _ || _d S )N)ÚgroupÚname)r   r   r   r	   r	   r
   r   7   s    zNoSuchEntryPoint.__init__c             C   s   d  | j| j¡S )Nz'No {!r} entry point found in group {!r})Úformatr   r   )r   r	   r	   r
   r   ;   s    zNoSuchEntryPoint.__str__N)r   r   r   r   r   r   r	   r	   r	   r
   r   5   s   r   c               @   s   e Zd ZeeƒZdS )ÚCaseSensitiveConfigParserN)r   r   r   r   r   Zoptionxformr	   r	   r	   r
   r   ?   s   r   c               @   s4   e Zd Zd
dd„Zdd„ Zdd„ Zeddd	„ƒZdS )Ú
EntryPointNc             C   s"   || _ || _|| _|| _|| _d S )N)r   Úmodule_nameÚobject_nameÚextrasÚdistro)r   r   r   r   r   r    r	   r	   r
   r   D   s
    zEntryPoint.__init__c             C   s   d| j | j| j| jf S )NzEntryPoint(%r, %r, %r, %r))r   r   r   r    )r   r	   r	   r
   Ú__repr__K   s    zEntryPoint.__repr__c             C   s8   t | jƒ}|}| jr4x| j d¡D ]}t||ƒ}q"W |S )z:Load the object to which this entry point refers.
        Ú.)r   r   r   ÚsplitÚgetattr)r   ÚmodÚobjÚattrr	   r	   r
   ÚloadO   s    
zEntryPoint.loadc             C   sR   t  |¡}|rF| ddd¡\}}}|dk	r6t d|¡}| |||||ƒS t|ƒ‚dS )a‚  Parse an entry point from the syntax in entry_points.txt

        :param str epstr: The entry point string (not including 'name =')
        :param str name: The name of this entry point
        :param Distribution distro: The distribution in which the entry point was found
        :rtype: EntryPoint
        :raises BadEntryPoint: if *epstr* can't be parsed as an entry point.
        Z
modulenameZ
objectnamer   Nz,\s*)Úentry_point_patternÚmatchr   Úrer#   r   )Úclsr   r   r    Úmr%   r&   r   r	   r	   r
   Úfrom_stringY   s    

zEntryPoint.from_string)NN)N)r   r   r   r   r!   r(   Úclassmethodr.   r	   r	   r	   r
   r   C   s
   

r   c               @   s   e Zd Zdd„ Zdd„ ZdS )ÚDistributionc             C   s   || _ || _d S )N)r   Úversion)r   r   r1   r	   r	   r
   r   m   s    zDistribution.__init__c             C   s   d| j | jf S )NzDistribution(%r, %r))r   r1   )r   r	   r	   r
   r!   q   s    zDistribution.__repr__N)r   r   r   r   r!   r	   r	   r	   r
   r0   l   s   r0   Úfirstc             c   sú  | d krt j} tƒ }xÞ| D ]Ô}| d¡ d¡rRt |¡}d|kr~t| d¡d d… Ž }|dkrp|j	|krpq| 
|j	¡ nd }t |¡rÆt |dd¡}t |¡rÄtdd	}| |g¡ ||fV  nŠt |¡r:t |¡}y| d
¡}	W n tk
r   wY nX tdd	}| |	¡(}
t |
¡}|j|t |dd¡d W d Q R X ||fV  nèt |¡r:t |¡Ì}xÄ| ¡ D ]¸}	t |	j¡}|sŽqt| d¡}d|krÚt| dd¡Ž }|dkrÌ|j	|krÌqt| 
|j	¡ nd }tdd	}| |	¡(}
t |
¡}|j|t ||	j¡d W d Q R X ||fV  qtW W d Q R X x¶t t  !t |dd¡¡t  !t |dd¡¡¡D ]†} t "t t #| ¡¡¡d }d|krÈt| dd¡Ž }|dkrº|j	|krºqh| 
|j	¡ nd }tdd	}| | g¡ ||fV  qhW qW d S )Nz/\z.eggú-é   r2   zEGG-INFOzentry_points.txt)ú=)Z
delimiterszEGG-INFO/entry_points.txt)ÚsourceZdist_versioné   z*.dist-infoz
*.egg-infor   )$ÚsysÚpathÚsetÚrstripÚendswithÚospÚbasenamer0   r#   r   ÚaddÚisdirÚjoinÚisfiler   ÚreadÚzipfileZ
is_zipfileZZipFileZgetinfoÚKeyErrorÚopenÚioÚTextIOWrapperZ	read_fileZinfolistÚfile_in_zip_patternr*   Úfilenamer   Ú	itertoolsÚchainÚglobZiglobÚsplitextÚdirname)r9   Zrepeated_distroZdistro_names_seenZfolderZegg_namer    Zep_pathZcpÚzÚinfoÚfZfuZzfr-   Zdistro_name_versionr	   r	   r
   Úiter_files_distrosu   s€    












"


rS   c          
   C   sd   xTt |dD ]F\}}| |kr|||  kr||  | }t ¡  t |||¡S Q R X qW t| |ƒ‚dS )z‡Find a single entry point.

    Returns an :class:`EntryPoint` object, or raises :exc:`NoSuchEntryPoint`
    if no match is found.
    )r9   N)rS   r   r   r   r.   r   )r   r   r9   Úconfigr    r   r	   r	   r
   Ú
get_singleÍ   s    
rU   c             C   s2   i }x(t | |dD ]}|j|kr|||j< qW |S )zwFind a group of entry points with unique names.

    Returns a dictionary of names to :class:`EntryPoint` objects.
    )r9   )Úget_group_allr   )r   r9   ÚresultZepr	   r	   r
   Úget_group_namedÛ   s
    
rX   c             C   sj   g }x`t |dD ]R\}}| |krx@||   ¡ D ]0\}}t ¡  | t |||¡¡ W dQ R X q.W qW |S )zZFind all entry points in a group.

    Returns a list of :class:`EntryPoint` objects.
    )r9   N)rS   Úitemsr   r   Úappendr   r.   )r   r9   rW   rT   r    r   r   r	   r	   r
   rV   æ   s    
&rV   Ú__main__Zconsole_scripts)Nr2   )N)N)N)%r   Ú
contextlibr   rM   Ú	importlibr   rG   rK   Úos.pathr9   r=   r+   r8   r   rD   Úversion_infor   Z	backportsÚcompileÚVERBOSEr)   rI   Ú__version__Ú	Exceptionr   r   ZConfigParserr   Úobjectr   r0   rS   rU   rX   rV   r   Zpprintr	   r	   r	   r
   Ú<module>   s<   



)	
X



