a
    EáWbH   ã                   @   s&  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ddl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_modulezY
(?P<modulename>\w+(\.\w+)*)
(:(?P<objectname>\w+(\.\w+)*))?
\s*
(\[(?P<extras>.+)\])?
$
zC
(?P<dist_version>[^/\\]+)\.(dist|egg)-info
[/\\]entry_points.txt$
z0.4c                   @   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.9/site-packages/entrypoints.pyÚ__init__$   s    zBadEntryPoint.__init__c                 C   s
   d| j  S )Nz#Couldn't parse entry point spec: %rr   ©r   r	   r	   r
   Ú__str__'   s    zBadEntryPoint.__str__c               
   c   sB   z
d V  W n2 t y< }  zt t| ƒ¡ W Y d } ~ n
d } ~ 0 0 d S r   )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 r   )ÚgroupÚname)r   r   r   r	   r	   r
   r   4   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   8   s    zNoSuchEntryPoint.__str__N)r   r   r   r   r   r   r	   r	   r	   r
   r   2   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 r   )r   Úmodule_nameÚobject_nameÚextrasÚdistro)r   r   r   r   r    r!   r	   r	   r
   r   A   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__H   s    ÿzEntryPoint.__repr__c                 C   s4   t | jƒ}|}| jr0| j d¡D ]}t||ƒ}q |S )z:Load the object to which this entry point refers.
        Ú.)r   r   r   ÚsplitÚgetattr)r   ÚmodÚobjÚattrr	   r	   r
   ÚloadL   s    
zEntryPoint.loadc                 C   sR   t  |¡}|rF| ddd¡\}}}|du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_stringV   s    

zEntryPoint.from_string)NN)N)r   r   r   r   r"   r)   Úclassmethodr/   r	   r	   r	   r
   r   @   s
   

r   c                   @   s(   e Zd Zdd„ Zedd„ ƒZdd„ ZdS )ÚDistributionc                 C   s   || _ || _d S r   ©r   Úversion)r   r   r3   r	   r	   r
   r   j   s    zDistribution.__init__c                 C   s&   d}d|v r|  dd¡\}}| ||ƒS )z®Parse a distribution from a "name-version" string

        :param str name: The name-version string (entrypoints-0.3)
        Returns an :class:`Distribution` object
        Nú-é   )r$   )r-   r   r3   r	   r	   r
   Úfrom_name_versionn   s    zDistribution.from_name_versionc                 C   s   d| j | jf S )NzDistribution(%r, %r)r2   r   r	   r	   r
   r"   z   s    zDistribution.__repr__N)r   r   r   r   r0   r6   r"   r	   r	   r	   r
   r1   i   s   
r1   Úfirstc                 c   sü  | d u rt j} tƒ }| D ]Ü}| d¡ d¡rRt |¡}t | 	d¡d ¡}|dkrb|j
|v rbq| |j
¡ t |¡r²t |dd¡}t |¡r°tdd}| |g¡ ||fV  nžt |¡rLt |¡}z| d	¡}	W n tyì   Y qY n0 tdd}| |	¡2}
t |
¡}|j|t |dd¡d
 W d   ƒ n1 s<0    Y  ||fV  nút |¡rLt |¡Ò}| ¡ D ]¸}	t |	j¡}|sŒqr| d¡}t |¡}|dkrº|j
|v rºqr| |j
¡ tdd}| |	¡2}
t |
¡}|j|t ||	j¡d
 W d   ƒ n1 s0    Y  ||fV  qrW d   ƒ n1 sB0    Y  t  t! "t t! #|¡dd¡¡t! "t t! #|¡dd¡¡¡D ]p} t $t t %| ¡¡¡d }t |¡}|dkrÆ|j
|v rÆq„| |j
¡ tdd}| | g¡ ||fV  q„qd S )Nz/\z.eggr   r7   zEGG-INFOzentry_points.txt)ú=)Z
delimiterszEGG-INFO/entry_points.txt)ÚsourceZdist_versionz*.dist-infoz
*.egg-info)&ÚsysÚpathÚsetÚrstripÚendswithÚospÚbasenamer1   r6   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ÚescapeÚsplitextÚdirname)r;   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_distros~   s~    

ÿ







ÿ(


ÿ

8.þ

ÿ
rV   c              	   C   s|   t |dD ]b\}}| |v r
|||  v r
||  | }t ¡ " t |||¡W  d  ƒ   S 1 sb0    Y  q
t| |ƒ‚dS )z‡Find a single entry point.

    Returns an :class:`EntryPoint` object, or raises :exc:`NoSuchEntryPoint`
    if no match is found.
    ©r;   N)rV   r   r   r   r/   r   )r   r   r;   Úconfigr!   r   r	   r	   r
   Ú
get_singleÎ   s    
2rY   c                 C   s.   i }t | |dD ]}|j|vr|||j< q|S )zwFind a group of entry points with unique names.

    Returns a dictionary of names to :class:`EntryPoint` objects.
    rW   )Úget_group_allr   )r   r;   ÚresultZepr	   r	   r
   Úget_group_namedÜ   s
    
r\   c              
   C   sv   g }t |dD ]b\}}| |v r||   ¡ D ]D\}}t ¡ $ | t |||¡¡ W d  ƒ q*1 sd0    Y  q*q|S )zZFind all entry points in a group.

    Returns a list of :class:`EntryPoint` objects.
    rW   N)rV   Úitemsr   r   Úappendr   r/   )r   r;   r[   rX   r!   r   r   r	   r	   r
   rZ   ç   s    
6rZ   Ú__main__Zconsole_scripts)Nr7   )N)N)N)#r   Ú
contextlibr   rO   Ú	importlibr   rI   rM   Úos.pathr;   r?   r,   r:   r   rF   ZconfigparserÚcompileÚVERBOSEr*   rK   Ú__version__Ú	Exceptionr   r   ZConfigParserr   Úobjectr   r1   rV   rY   r\   rZ   r   Zpprintr	   r	   r	   r
   Ú<module>   s<   úý
)
P



