U
    |eO                     @  sb   d Z ddlmZ ddlZddlZddlZddlmZ ddlm	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.    )annotationsN)OrderedDict)fs_is_case_sensitivez@^(?P<impl>[a-zA-Z]+)?(?P<version>[0-9.]+)?(?:-(?P<arch>32|64))?$c                   @  sT   e Zd ZdZddddZedd Zdd	 Zed
d Z	dd Z
ddddZdS )
PythonSpecz2Contains specification about a Python Interpreter.None)returnc                 C  s.   || _ || _|| _|| _|| _|| _|| _d S N)str_specimplementationmajorminormicroarchitecturepath)selfr	   r
   r   r   r   r   r    r   @/tmp/pip-unpacked-wheel-tuxcr54r/virtualenv/discovery/py_spec.py__init__   s    zPythonSpec.__init__c                 C  sP  d\}}}}}}t j|r$|}nd}tt|}	|	r2dd }
z|	 }|d }|d k	rtdd |dD }t	|d	krt
t	|d	kr|\}}}nVt	|d
kr|\}}n@t	|dkr|d }tt|d }|dkrtt|dd  }d}W n t
k
r   Y n$X |d }|dkr&d }|
|d }|s<|}| |||||||S )N)NNNNNNFc                 S  s   | d k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>   pythonpyarch)osr   isabsrematchPATTERN	groupdicttuplesplitlen
ValueErrorr   str)clsZstring_specr"   r   r   r   r%   r   okr)   r   groupsr   versionsZversion_datar   r   r   from_string_spec   sB    

zPythonSpec.from_string_specc              	   c  s   t  }| jr8d|| j< t r8d|| j < d|| j < d|d< | j| j| jf}t	t
 |d |d  }W 5 Q R X | D ]P\}}tt|ddD ]6}|d| }| ddd |D  }||fV  qqd S )	NFTr#   r   r   c                 s  s   | ]}t |V  qd S r   )r0   r   r   r   r   r   X   s     z,PythonSpec.generate_names.<locals>.<genexpr>)r   r
   r   lowerupperr   r   r   
contextlibsuppressr/   indexitemsranger.   join)r   Zimplsr   r"   r)   atZcur_verspecr   r   r   generate_namesF   s    
zPythonSpec.generate_namesc                 C  s   | j d k	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k	r>|j | j kr>dS |jdk	rX|j| jkrXdS t| j| j| jf|j|j|jfD ]&\}}|dk	rz|dk	rz||krz dS qzdS )z]Called when there's a candidate metadata spec to see if compatible - e.g. PEP-514 on Windows.FNT)	rC   r   r
   r7   r   zipr   r   r   )r   r@   Zourreqr   r   r   	satisfies_   s    *zPythonSpec.satisfiesr0   c                   s2   t  j}d}| dd fdd|D  dS )N)r
   r   r   r   r   r   (z, c                 3  s0   | ](}t  |d k	r| dt  | V  qd S )N=)getattr)r   krB   r   r   r   p   s      z&PythonSpec.__repr__.<locals>.<genexpr>))type__name__r>   )r   nameparamsr   rB   r   __repr__m   s    
zPythonSpec.__repr__N)rM   
__module____qualname____doc__r   classmethodr5   rA   propertyrC   rF   rP   r   r   r   r   r      s   	
*
r   )rS   
__future__r   r9   r&   r(   collectionsr   Zvirtualenv.infor   compiler*   r   __all__r   r   r   r   <module>   s   
e