B
    ,‹dH   ã               @   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   úX/work/yifan.wang/ringdown/master-ringdown-env/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	   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   Ú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	   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   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   ÚloadL   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.
        Ú
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 )N)r   Úversion)r   r   r1   r   r   r   r	   j   s    zDistribution.__init__c             C   s&   d}d|k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   r1   r   r   r   Úfrom_name_versionn   s    zDistribution.from_name_versionc             C   s   d| j | jf S )NzDistribution(%r, %r))r   r1   )r   r   r   r   r    z   s    zDistribution.__repr__N)r   r   r   r	   r/   r4   r    r   r   r   r   r0   i   s   r0   Úfirstc             c   sÈ  | d krt j} tƒ }x¬| D ]¢}| d¡ d¡r@t |¡}t | 	d¡d ¡}|dkrf|j
|krfq| |j
¡ 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|qb| d¡}t |¡}|dkrª|j
|krªqb| |j
¡ tdd}| |	¡(}
t |
¡}|j|t ||	j¡d
 W d Q R X ||fV  qbW W d Q R X x¬t  t! "t t! #|¡dd¡¡t! "t t! #|¡dd¡¡¡D ]p} t $t t %| ¡¡¡d }t |¡}|dkrŽ|j
|krŽqL| |j
¡ tdd}| | g¡ ||fV  qLW qW d S )Nz/\z.eggr   r5   zEGG-INFOzentry_points.txt)ú=)Ú
delimiterszEGG-INFO/entry_points.txt)ÚsourceÚdist_versionz*.dist-infoz
*.egg-info)&ÚsysÚpathÚsetÚrstripÚendswithÚospÚbasenamer0   r4   r"   r   ÚaddÚisdirÚjoinÚisfiler   ÚreadÚzipfileÚ
is_zipfileÚZipFileÚgetinfoÚKeyErrorÚopenÚioÚTextIOWrapperÚ	read_fileÚinfolistÚfile_in_zip_patternr*   Úfilenamer   Ú	itertoolsÚchainÚglobÚiglobÚescapeÚsplitextÚdirname)r;   Zrepeated_distroZdistro_names_seenÚfolderÚegg_namer   Zep_pathÚcpÚzÚinfoÚfZfuÚzfr-   Zdistro_name_versionr   r   r   Úiter_files_distros~   st    













" 


r`   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.
    )r;   N)r`   r   r   r   r.   r   )r   r   r;   Úconfigr   r   r   r   r   Ú
get_singleÎ   s    
rb   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.
    )r;   )Úget_group_allr   )r   r;   ÚresultÚepr   r   r   Úget_group_namedÜ   s
    
rf   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.
    )r;   N)r`   Úitemsr   r   Úappendr   r.   )r   r;   rd   ra   r   r   r   r   r   r   rc   ç   s    
&rc   Ú__main__Úconsole_scripts)Nr5   )N)N)N)#r   Ú
contextlibr   rT   Ú	importlibr   rL   rR   Úos.pathr;   r?   r+   r:   r   rF   ÚconfigparserÚcompileÚVERBOSEr)   rP   Ú__version__Ú	Exceptionr   r   ÚConfigParserr   Úobjectr   r0   r`   rb   rf   rc   r   Úpprintr   r   r   r   Ú<module>   s8   


)
P



