o
    $¼"b¶  ã                   @   sx   d Z ddlmZmZ ddlZddlZddlZddlmZ ddl	m
Z
 ddlmZ e d¡ZejdkZG d	d
„ d
eƒZdS )zMA Python specification is an abstract requirement definition of a interpreteré    )Úabsolute_importÚunicode_literalsN)ÚOrderedDict)Úfs_is_case_sensitive)Ú
ensure_strz@^(?P<impl>[a-zA-Z]+)?(?P<version>[0-9.]+)?(?:-(?P<arch>32|64))?$Úwin32c                   @   sP   e Zd ZdZdd„ Zedd„ ƒZdd„ Zedd	„ ƒZ	d
d„ Z
dd„ Zdd„ ZdS )Ú
PythonSpecz1Contains specification about a Python Interpreterc                 C   s.   || _ || _|| _|| _|| _|| _|| _d S ©N)Ústr_specÚimplementationÚmajorÚminorÚmicroÚarchitectureÚpath)Úselfr
   r   r   r   r   r   r   © r   ú>/usr/lib/python3/dist-packages/virtualenv/discovery/py_spec.pyÚ__init__   s   
zPythonSpec.__init__c                 C   sL  d\}}}}}}t j |¡r|}n‹d}t t|¡}	|	r˜d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ks�|dkr’d}|
|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>-   s   € z.PythonSpec.from_string_spec.<locals>.<genexpr>Ú.é   é   é   r   é	   TÚimplÚpyÚpythonÚCPythonÚarch)Úosr   ÚisabsÚreÚmatchÚPATTERNÚ	groupdictÚtupleÚsplitÚlenÚ
ValueErrorr   Ústr)ÚclsÚstring_specr#   r   r   r   r'   r   Úokr+   r   Úgroupsr   ÚversionsÚversion_datar   r   r   Úfrom_string_spec   sD   
ÿzPythonSpec.from_string_specc              	   c   sÚ   � t ƒ }| jrd|| j< tƒ rd|| j ¡ < d|| j ¡ < d|d< | j| j| jf}z|d | d ¡… }W n	 t	y=   Y nw | 
¡ D ](\}}tt|ƒddƒD ]}|d|… }d |d dd	„ |D ƒ¡¡}||fV  qNqBd S )
NFTr%   éÿÿÿÿr   z{}{}r   c                 s   s   � | ]}t |ƒV  qd S r	   )r2   r   r   r   r   r   Z   s   € z,PythonSpec.generate_names.<locals>.<genexpr>)r   r   r   ÚlowerÚupperr   r   r   Úindexr1   ÚitemsÚranger0   ÚformatÚjoin)r   Úimplsr   r#   r+   ÚatÚcur_verÚspecr   r   r   Úgenerate_namesG   s*   €
ÿýÿzPythonSpec.generate_namesc                 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 WindowsFNT)	rH   r   r   r;   r   Úzipr   r   r   )r   rE   ÚourÚreqr   r   r   Ú	satisfiesa   s   *€zPythonSpec.satisfiesc                    s&   d  tˆ ƒjd ‡ fdd„dD ƒ¡¡S )Nz{}({})z, c                 3   s0   � | ]}t ˆ |ƒd urd |t ˆ |ƒ¡V  qd S )Nz{}={})Úgetattrr@   )r   ÚkrG   r   r   r   r   s   € þýz)PythonSpec.__unicode__.<locals>.<genexpr>)r   r   r   r   r   r   )r@   ÚtypeÚ__name__rA   rG   r   rG   r   Ú__unicode__o   s   þþzPythonSpec.__unicode__c                 C   s   t |  ¡ ƒS r	   )r   rQ   rG   r   r   r   Ú__repr__y   s   zPythonSpec.__repr__N)rP   Ú
__module__Ú__qualname__Ú__doc__r   Úclassmethodr9   rF   ÚpropertyrH   rL   rQ   rR   r   r   r   r   r      s    	
*

r   )rU   Ú
__future__r   r   r(   r*   ÚsysÚcollectionsr   Úvirtualenv.infor   Úvirtualenv.util.sixr   Úcompiler,   ÚplatformÚIS_WINÚobjectr   r   r   r   r   Ú<module>   s    

