U
    ǁ^                     @   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.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	   -/usr/lib/python3/dist-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   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   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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_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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| j | jf S )NzDistribution(%r, %r)r2   r   r	   r	   r
   r"   n   s    zDistribution.__repr__N)r   r   r   r   r"   r	   r	   r	   r
   r1   i   s   r1   firstc                 c   s  | d krt j} t }| D ]}|ddrNt|}d|krzt|dd d  }|dkrl|j	|krlq|
|j	 nd }t|rt|dd}t|rtdd	}||g ||fV  nt|r2t|}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|r2t|}| D ]}	t|	j}|sqn|d}d|krt|dd }|dkr|j	|krƐqn|
|j	 nd }tdd	}||	(}
t|
}|j|t||	jd W 5 Q R X ||fV  qnW 5 Q R X tt !t|ddt !t|ddD ]} t"tt#| d }d|krt|dd }|dkr|j	|krq^|
|j	 nd }tdd	}|| g ||fV  q^qd S )Nz/\z.egg-   r4   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basenamer1   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)r;   Zrepeated_distroZdistro_names_seenZfolderZegg_namer!   Zep_pathcpzinfofZfuZzfr.   Zdistro_name_versionr	   r	   r
   iter_files_distrosr   s    













"


rV   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)rV   r   r   r   r/   r   )r   r   r;   configr!   r   r	   r	   r
   
get_single   s    
&rY   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.
    rW   )get_group_allr   )r   r;   resultZepr	   r	   r
   get_group_named   s
    
r\   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.
    rW   )rV   itemsr   r   appendr   r/   )r   r;   r[   rX   r!   r   r   r	   r	   r
   rZ      s    
"rZ   __main__Zconsole_scripts)Nr4   )N)N)N)#r   
contextlibr   rO   	importlibr   rI   rM   os.pathr;   r?   r,   r:   r   rF   configparsercompileVERBOSEr*   rK   __version__	Exceptionr   r   ConfigParserr   objectr   r1   rV   rY   r\   rZ   r   Zpprintr	   r	   r	   r
   <module>   s<   
)	
X



