U
    ꥡcH                      @   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	   //tmp/pip-unpacked-wheel-2xdqr63s/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   s@   z
d V  W n0 t k
r: }  ztt|  W 5 d } ~ X Y nX 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   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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*   classmethodr1   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   r5   r	   r	   r
   r   j   s    zDistribution.__init__c                 C   s&   d}d|kr| dd\}}| ||S )zParse 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   r5   r	   r	   r
   from_name_versionn   s    zDistribution.from_name_versionc                 C   s   d| j | jf S )NzDistribution(%r, %r)r4   r   r	   r	   r
   r#   z   s    zDistribution.__repr__N)r   r   r   r   r2   r8   r#   r	   r	   r	   r
   r3   i   s   
r3   firstc                 c   s  | d krt j} t }| D ]}|ddr>t|}t|	dd }|dkrb|j
|krbq||j
 t|rt|dd}t|rtdd}||g ||fV  nt|rt|}z|d	}	W n tk
r   Y qY nX tdd}||	(}
t|
}|j|t|ddd
 W 5 Q R X ||fV  nt|rt|}| D ]}	t|	j}|sxq^|d}t|}|dkr|j
|krq^||j
 tdd}||	(}
t|
}|j|t||	jd
 W 5 Q R X ||fV  q^W 5 Q R 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qD||j
 tdd}|| g ||fV  qDqd S )Nz/\z.eggr   r9   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basenamer3   r8   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zfr0   Zdistro_name_versionr	   r	   r
   iter_files_distros~   s    









  




"


rd   c                 C   sp   t |dD ]V\}}| |kr
|||  kr
||  | }t   t|||W  5 Q R    S Q R X q
t| |dS )zFind a single entry point.

    Returns an :class:`EntryPoint` object, or raises :exc:`NoSuchEntryPoint`
    if no match is found.
    r?   N)rd   r   r   r   r1   r   )r   r   r?   configr"   r   r	   r	   r
   
get_single   s    
&rg   c                 C   s.   i }t | |dD ]}|j|kr|||j< q|S )zwFind a group of entry points with unique names.

    Returns a dictionary of names to :class:`EntryPoint` objects.
    re   )get_group_allr   )r   r?   resultepr	   r	   r
   get_group_named   s
    
rk   c                 C   sb   g }t |dD ]N\}}| |kr||   D ]0\}}t  |t||| W 5 Q R X q*q|S )zZFind all entry points in a group.

    Returns a list of :class:`EntryPoint` objects.
    re   )rd   itemsr   r   appendr   r1   )r   r?   ri   rf   r"   r   r   r	   r	   r
   rh      s    
"rh   __main__console_scripts)Nr9   )N)N)N)#r   
contextlibr   rX   	importlibr   rP   rV   os.pathr?   rC   r.   r>   r   rJ   configparsercompileVERBOSEr,   rT   __version__	Exceptionr   r   ConfigParserr   objectr   r3   rd   rg   rk   rh   r   pprintr	   r	   r	   r
   <module>   s<   
)
P



