o
    wiH                      @   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rddl"Z"e""e d dS 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	   H/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/entrypoints.py__init__$      
zBadEntryPoint.__init__c                 C   s
   d| j  S )Nz#Couldn't parse entry point spec: %rr   r   r	   r	   r
   __str__'   r   zBadEntryPoint.__str__c               
   c   sD    zd V  W d S  t y! }  ztt|  W Y d } ~ d S d } ~ ww 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      || _ || _d S r   )groupname)r   r   r   r	   r	   r
   r   4      
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      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r| 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   sN   t |}|r#|ddd\}}}|durtd|}| |||||S t|)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.
        
modulename
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)NNr   )r   r   r   r   r'   r.   classmethodr6   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   r   r   r   version)r   r   r:   r	   r	   r
   r   j   r   zDistribution.__init__c                 C   s&   d}d|v 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)   )r4   r   r:   r	   r	   r
   from_name_versionn   s   
zDistribution.from_name_versionc                 C   s   d| j | jf S )NzDistribution(%r, %r)r9   r   r	   r	   r
   r'   z   r   zDistribution.__repr__N)r   r   r   r   r7   r=   r'   r	   r	   r	   r
   r8   i   s
    
r8   firstc                 c   s   | d u rt j} t }| D ]c}|ddrt|}t|	dd }|dkr1|j
|v r1q||j
 t|rYt|dd}t|rXtdd}||g ||fV  nt|rt|}z|d	}	W n	 tys   Y qw tdd}||	}
t|
}|j|t|ddd
 W d    n1 sw   Y  ||fV  nwt|rt|c}| D ]V}	t|	j}|sq|d}t|}|dkr|j
|v rq||j
 tdd}||	}
t|
}|j|t||	jd
 W d    n	1 sw   Y  ||fV  qW d    n	1 sw   Y  t t!"tt!#|ddt!"tt!#|ddD ]8} t$tt%| d }t|}|dkrY|j
|v rYq8||j
 tdd}|| g ||fV  q8qd S )Nz/\z.eggr   r>   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basenamer8   r=   r)   r   addisdirjoinisfiler    readzipfile
is_zipfileZipFilegetinfoKeyErroropenioTextIOWrapper	read_fileinfolistfile_in_zip_patternr2   filenamer   	itertoolschainglobiglobescapesplitextdirname)rD   repeated_distrodistro_names_seenfolderegg_namer&   ep_pathcpzinfoffuzfr5   distro_name_versionr	   r	   r
   iter_files_distros~   s   





















rn   c              	   C   sx   t |dD ]1\}}| |v r6|||  v r6||  | }t  t|||W  d     S 1 s1w   Y  qt| |)zFind a single entry point.

    Returns an :class:`EntryPoint` object, or raises :exc:`NoSuchEntryPoint`
    if no match is found.
    rD   N)rn   r   r   r"   r6   r   )r   r   rD   configr&   r   r	   r	   r
   
get_single   s   
$
rq   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.
    ro   )get_group_allr   )r   rD   resultepr	   r	   r
   get_group_named   s   

ru   c              
   C   sv   g }t |dD ]1\}}| |v r8||   D ]"\}}t  |t||| W d   n1 s2w   Y  qq|S )zZFind all entry points in a group.

    Returns a list of :class:`EntryPoint` objects.
    ro   N)rn   itemsr   r   appendr"   r6   )r   rD   rs   rp   r&   r   r   r	   r	   r
   rr      s   
rr   __main__console_scripts)Nr>   r   )#r   
contextlibr   r]   	importlibr   rU   r[   os.pathrD   rH   r3   rC   r   rO   configparsercompileVERBOSEr1   rY   __version__	Exceptionr   r   ConfigParserr    objectr"   r8   rn   rq   ru   rr   r   pprintr	   r	   r	   r
   <module>   s@    
)

P

