U
    bw                     @   sL   d dl Z d dlZd dlmZ d dlmZ ddlmZ dZG dd de	Z
dS )	    N)EnvironmentFileNotDownloadednormalized_version   )envr   c                   @   s   e Zd ZdZdZdZdZdZdZdZ	dZ
dddZdd Zdd Zd	d
 Zdd Zedd Zedd Zedd Zedd Zedd Zedd Zdd ZdS )BinstarSpecz
    spec = BinstarSpec('darth/deathstar')
    spec.can_handle() # => True / False
    spec.environment # => YAML string
    spec.msg # => Error messages
    :raises: EnvironmentFileNotDownloaded
    Nc                 K   s   || _ d| _d S )NF)namequiet)selfr   kwargs r   6lib/python3.8/site-packages/conda_env/specs/binstar.py__init__"   s    zBinstarSpec.__init__c                 C   s   |   }|S )N)_can_handle)r
   resultr   r   r   
can_handle&   s    zBinstarSpec.can_handlec                 C   s2   |   r.| jdkrd| _dS | jdk	o,|  S dS )ze
        Validates loader can process environment definition.
        :return: True or False
        NzAnaconda Client is required to interact with anaconda.org or an Anaconda API. Please run `conda install anaconda-client -n base`.F)
valid_namebinstarmsgpackagevalid_packager
   r   r   r   r   *   s    
zBinstarSpec._can_handlec                 C   s@   t dt| jdk	rdS | jdkr,d| _nd| jd| _dS )z?
        Validates name
        :return: True or False
        z^(.+)/(.+)$NTzCan't process without a namezInvalid name z, try the format: user/packageF)rematchstrr   r   r   r   r   r   r   9   s    
zBinstarSpec.valid_namec                 C   s   t | jdkS )z`
        Returns True if package has an environment file
        :return: True or False
        r   )len	file_datar   r   r   r   r   F   s    zBinstarSpec.valid_packagec              	   C   sB   | j d kr<ztd}| | _ W n ttfk
r:   Y nX | j S )Nzbinstar_client.utils)_binstar	importlibimport_moduleZget_server_apiAttributeErrorModuleNotFoundError)r
   Zbinstar_utilsr   r   r   r   M   s    

zBinstarSpec.binstarc                 C   s&   | j d kr dd | jd D | _ | j S )Nc                 S   s   g | ]}|d  t kr|qS )type)ENVIRONMENT_TYPE.0datar   r   r   
<listcomp>Z   s   z)BinstarSpec.file_data.<locals>.<listcomp>files)
_file_datar   r   r   r   r   r   W   s
    
zBinstarSpec.file_datac                    s   | j dkrdd | jD }t|dd dd   fdd| jd	 D }| j| j| j |d
 d }|dkrzt| j| j|j	| _ t
| j S )z7
        :raises: EnvironmentFileNotDownloaded
        Nc                 S   s"   g | ]}t |d  |d  dqS )version)
normalizedoriginalr   )r%   dr   r   r   r'   e   s   z+BinstarSpec.environment.<locals>.<listcomp>c                 S   s   | d S )Nr+   r   )xr   r   r   <lambda>g       z)BinstarSpec.environment.<locals>.<lambda>)keyr,   c                    s   g | ]}|d   kr|qS )r*   r   r$   Zlatest_versionr   r   r'   h   s   r(   r   basename)_environmentr   maxr   r   Zdownloadusernamepackagenamer   textr   Z	from_yaml)r
   Zversionsr   Zreqr   r2   r   environment_   s    


zBinstarSpec.environmentc                 C   sL   | j d krFz| j| j| j| _ W n" tk
rD   d| j| _Y nX | j S )Nz_{} was not found on anaconda.org.
You may need to be logged in. Try running:
    anaconda login)	_packager   r   r6   r7   
IndexErrorformatr   r   r   r   r   r   r   r   s    
zBinstarSpec.packagec                 C   s   | j d kr|  d | _ | j S )Nr   )	_usernameparser   r   r   r   r6   }   s    
zBinstarSpec.usernamec                 C   s   | j d kr|  d | _ | j S )N   )_packagenamer>   r   r   r   r   r7      s    
zBinstarSpec.packagenamec                 C   s   | j ddS )z#Parse environment definition handle/r?   )r   splitr   r   r   r   r>      s    zBinstarSpec.parse)N)__name__
__module____qualname____doc__r4   r=   r@   r:   r)   r   r   r   r   r   r   r   propertyr   r   r9   r   r6   r7   r>   r   r   r   r   r      s4   

	





r   )r   r   Zconda.exceptionsr   Zconda.models.versionr    r   r#   objectr   r   r   r   r   <module>   s   