o
    f                     @  sB   d Z ddlmZ ddlZddlZedZG dd dZdgZdS )zOA Python specification is an abstract requirement definition of an interpreter.    )annotationsNz@^(?P<impl>[a-zA-Z]+)?(?P<version>[0-9.]+)?(?:-(?P<arch>32|64))?$c                   @  sP   e Zd ZdZdddZed ddZd!ddZedd Z	dd Z
d"ddZdS )#
PythonSpecz2Contains specification about a Python Interpreter.str_specstrimplementation
str | Nonemajor
int | NoneminormicroarchitecturepathreturnNonec                 C  s.   || _ || _|| _|| _|| _|| _|| _d S N)r   r   r   r
   r   r   r   )selfr   r   r   r
   r   r   r    r   R/var/www/html/dev/env/lib/python3.10/site-packages/virtualenv/discovery/py_spec.py__init__   s   

zPythonSpec.__init__string_specc                 C  sD  d\}}}}}}t j|r|}nd}tt|}	|	rdd }
z[|	 }|d }|d urwtdd |dD }t	|d	kr@t
t	|d	krL|\}}}n+t	|d
krW|\}}n t	|dkrw|d }tt|d }|dkrwtt|dd  }d}W n	 t
y   Y nw |d }|dv rd }|
|d }|s|}| |||||||S )N)NNNNNNFc                 S  s   | d u rd S t | S r   int)valr   r   r   _int_or_none*   s   z1PythonSpec.from_string_spec.<locals>._int_or_noneversionc                 s  s    | ]	}|rt |V  qd S r   r   ).0ir   r   r   	<genexpr>1   s    z.PythonSpec.from_string_spec.<locals>.<genexpr>.         r   	   Timpl>   pypythonarch)osr   isabsrematchPATTERN	groupdicttuplesplitlen
ValueErrorr   r   )clsr   r#   r   r
   r   r&   r   okr*   r   groupsr   versionsversion_datar   r   r   from_string_spec    sD   
zPythonSpec.from_string_specwindowsbool
re.Patternc             	   C  s   dj dd | j| j| jfD  }| jdu rdndt| j }|r$dnd}|s-| jdu r/d	nd}tjd
| d| d| | dtjdS )z>Generate a regular expression for matching against a filename.z{}(\.{}(\.{})?)?c                 s  s     | ]}|d u r
dn|V  qd S )Nz\d+r   )r   vr   r   r   r   N   s    z)PythonSpec.generate_re.<locals>.<genexpr>Nr%   zpython|z\.exe ?z	(?P<impl>z)(?P<v>)$)flags)	formatr   r
   r   r   r)   escapecompile
IGNORECASE)r   r7   r   r#   suffixversion_conditionalr   r   r   generate_reK   s    
	zPythonSpec.generate_rec                 C  s   | j d uotj | j S r   )r   r'   r(   r   r   r   r   is_abs`   s   zPythonSpec.is_absc                 C  s   |j r| j r| j|jkrdS |jdur|j | j krdS |jdur,|j| jkr,dS t| j| j| jf|j|j|jfD ]\}}|durP|durP||krP dS q=dS )z]Called when there's a candidate metadata spec to see if compatible - e.g. PEP-514 on Windows.FNT)	rH   r   r   lowerr   zipr   r
   r   )r   specourreqr   r   r   	satisfiesd   s   *zPythonSpec.satisfiesc                   s2   t  j}d}| dd fdd|D  dS )N)r   r   r
   r   r   r   (z, c                 3  s2    | ]}t  |d ur| dt  | V  qd S )N=)getattr)r   krG   r   r   r   u   s   0 z&PythonSpec.__repr__.<locals>.<genexpr>r=   )type__name__join)r   nameparamsr   rG   r   __repr__r   s   
$zPythonSpec.__repr__N)r   r   r   r   r   r	   r
   r	   r   r	   r   r	   r   r   r   r   )r   r   )r7   r8   r   r9   )r   r   )rT   
__module____qualname____doc__r   classmethodr6   rF   propertyrH   rN   rX   r   r   r   r   r      s    

*
r   )	r[   
__future__r   r'   r)   rB   r+   r   __all__r   r   r   r   <module>   s    
n