B
    '\eG                 @   sp  d dl mZmZmZmZ d dlmZ d dlmZ d dlm	Z	 ddl
mZ ddlmZmZmZ ddlmZmZmZ dd	lmZ dd
lmZmZmZmZmZ ddlmZmZ ddlm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( e	e)Z*G dd de+Z,ee,G dd de-Z.G dd de.Z/dd Z0dd Z1dd Z2dd Z3dd Z4dd Z5d'd!d"Z6d(d#d$Z7d%d& Z8e9e.j: d S ))    )absolute_importdivisionprint_functionunicode_literals)copy)chain)	getLogger   )
IndexedSet)concatconcatvdrop)DEFAULTS_CHANNEL_NAMEMAX_CHANNEL_PRIORITYUNKNOWN_CHANNEL)context)ensure_text_type
isiterable	iteritemsodictwith_metaclass)is_pathwin_path_backout)	Url
has_schemeis_urljoin_urlpath_to_urlsplit_conda_url_easy_partssplit_platformsplit_scheme_auth_tokenurlparsec                   s    e Zd ZdZ fddZ  ZS )ChannelTypezn
    This metaclass does basic caching and enables static constructor method usage with a
    single arg.
    c                s   t |dkrT|sT|d }t|tr&|S |tjkr:tj| S t| }tj|< |S nHd|kr|d }t fdd|d D }t||S tt j	||S d S )N   r   channelsnamec             3   s    | ]}t tjf |V  qd S )N)superr"   __call__).0Z_kwargs)	__class__cls 3lib/python3.7/site-packages/conda/models/channel.py	<genexpr>+   s   z'ChannelType.__call__.<locals>.<genexpr>)
len
isinstanceChannel_cache_
from_valuetupleMultiChannelr&   r"   r'   )r*   argskwargsvaluecr%   r$   )r)   )r*   r,   r'      s    



zChannelType.__call__)__name__
__module____qualname____doc__r'   __classcell__r+   r+   )r)   r,   r"      s   r"   c               @   s  e Zd ZdZi Zedd Zd4d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ed5ddZedd Zd6ddZd7ddZedd Zedd Zed d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zed0d1 Zd2d3 ZdS )8r0   z
    Channel:
    scheme <> auth <> location <> token <> channel <> subchannel <> platform <> package_filename

    Package Spec:
    channel <> subchannel <> namespace <> package_name

    c               C   s
   i t _d S )N)r0   r1   r+   r+   r+   r,   _reset_state>   s    zChannel._reset_stateNc             C   s.   || _ || _|| _|| _|| _|| _|| _d S )N)schemeauthlocationtokenr%   platformpackage_filename)selfr?   r@   rA   rB   r%   rC   rD   r+   r+   r,   __init__B   s    zChannel.__init__c             C   s   | j S )N)rA   )rE   r+   r+   r,   channel_locationL   s    zChannel.channel_locationc             C   s   | j S )N)r%   )rE   r+   r+   r,   channel_nameP   s    zChannel.channel_namec             C   s   | j S )N)rC   )rE   r+   r+   r,   subdirT   s    zChannel.subdirc             C   s   t | S )N)parse_conda_channel_url)urlr+   r+   r,   from_urlX   s    zChannel.from_urlc             C   s   t | S )N)_get_channel_for_name)rH   r+   r+   r,   from_channel_name\   s    zChannel.from_channel_namec             C   s   | dkrt tdS t| } t| r>| dr4t| } t | S t| rTt t| S | 	drz| drpt| } t | S t
| tj\}}|tjkrt|tj| |S t | S d S )N)Nz	<unknown>zNone:///<unknown>None)r%   zfile:z.tar.bz2)r0   r   r   r   
startswithr   rL   r   r   endswithr   r   known_subdirscustom_multichannelsr4   rN   )r7   	_strippedrC   r+   r+   r,   r2   `   s"    






zChannel.from_valuec       
      C   s   | }t |\}}}}|r4|r4t|||||ddS |r|jrd||jrd|j||jdd }}n$t|}	t|	j|	j	dj
}|	jpd}t|||||ddS t|j|j|j|j|r|dp|ddS d S )N/)r?   r@   rA   rB   r%    r#   )hostport)r    r0   striprA   rP   replacer!   r   rW   rX   rK   pathr?   r@   rB   )
channel_aliasZchannel_urlr%   catest_urlr?   r@   rB   rA   Z	url_partsr+   r+   r,   make_simple_channelx   s    


zChannel.make_simple_channelc                s  y j S  tk
r   Y nX x>ttjD ]0\}}x&|D ]} j|jkr6| } _ |S q6W q(W x<tjD ]2} jrdt jd|drd j } _ |S qdW t	 fddt
tjftjD r̈ j } _ |S  jrd jt j jf  } _ |S t j jd } _ |S d S )NrU   c             3   s   | ]}|j  j kV  qd S )N)rA   )r(   r8   )rE   r+   r,   r-      s    z)Channel.canonical_name.<locals>.<genexpr>z%s://%s)Z_Channel__canonical_nameAttributeErrorr   r   rS   r%   custom_channelstokenized_startswithsplitanyr   r\   migrated_channel_aliasesr?   r   rA   lstrip)rE   Z	multinamer$   channelZcnZ	that_namer+   )rE   r,   canonical_name   s0    

zChannel.canonical_nameFc                s   d krt jtstjtkr8tt|S j	g |rZj
rZ dj
g  j t   fdd} fdd| D }|rjrfdd|D S fdd|D S d S )	Ntc              3   s8    j r  j V   j dkr4dV  nxD ]
} | V  q&W d S )Nnoarch)rC   )rI   )rE   subdirsr+   r,   
_platforms   s    

z Channel.urls.<locals>._platformsc             3   s   | ]}t  |V  qd S )N)r   )r(   p)baser+   r,   r-      s    zChannel.urls.<locals>.<genexpr>c                s   g | ]}d  j  j|f qS )z
%s://%s@%s)r?   r@   )r(   b)rE   r+   r,   
<listcomp>   s    z Channel.urls.<locals>.<listcomp>c                s   g | ]}d  j |f qS )z%s://%s)r?   )r(   ro   )rE   r+   r,   rp      s    )r   rk   r   AssertionErrorrh   r   r0   r   urlsrA   rB   extendappendr%   r   r@   )rE   with_credentialsrk   rl   basesr+   )rn   rE   rk   r,   rr      s    

	
zChannel.urlsc             C   s   | j tkrd S | jg}|r0| jr0|d| jg || j | jrb|| j | jr|| j n t	dd t
jD d}|| t| }|r| jrd| j| j|f S d| j|f S d S )Nri   c             s   s   | ]}|d kr|V  qdS )rj   Nr+   )r(   sr+   r+   r,   r-      s    zChannel.url.<locals>.<genexpr>rj   z
%s://%s@%sz%s://%s)rh   r   rA   rB   rs   rt   r%   rC   rD   nextr   rk   r   r@   r?   )rE   ru   rn   Zfirst_non_noarchr+   r+   r,   rK      s     



zChannel.urlc             C   s&   | j tkrd S d| jt| j| jf S )Nz%s://%s)rh   r   r?   r   rA   r%   )rE   r+   r+   r,   base_url   s    
zChannel.base_urlc             C   s   | j fS )N)ry   )rE   r+   r+   r,   	base_urls   s    zChannel.base_urlsc             C   s(   |  d}| jr$|r$|ddd }|S )NTrU   r#   r   )rK   rD   rsplit)rE   rK   r+   r+   r,   
subdir_url   s    

zChannel.subdir_urlc             C   s&   | j p
| j}| jrt|| jS |S d S )N)ry   r%   rI   r   )rE   rn   r+   r+   r,   __str__   s    zChannel.__str__c             C   s   d| j rt| j| j n| j S )NzChannel("%s"))rI   r   r%   )rE   r+   r+   r,   __repr__   s    zChannel.__repr__c          
   C   sv   t |tr"| j|jko | j|jkS y t|}| j|jkoB| j|jkS  tk
rp } ztd| dS d }~X Y nX d S )Nz%rF)r/   r0   rA   r%   	Exceptionlogdebug)rE   otherZ_otherer+   r+   r,   __eq__   s    
zChannel.__eq__c             C   s   t | j| jfS )N)hashrA   r%   )rE   r+   r+   r,   __hash__  s    zChannel.__hash__c             C   s   t | j| jfS )N)rd   rA   r%   )rE   r+   r+   r,   __nonzero__  s    zChannel.__nonzero__c             C   s   |   S )N)r   )rE   r+   r+   r,   __bool__  s    zChannel.__bool__c             C   s   | j S )N)__dict__)rE   r+   r+   r,   __json__  s    zChannel.__json__c             C   s   | j | jfS )N)ry   rh   )rE   r+   r+   r,   url_channel_wtf  s    zChannel.url_channel_wtfc             C   s"   | j | j| j| j| j| j| jdS )N)r?   r@   rA   rB   r%   rC   rD   )r?   r@   rA   rB   r%   rC   rD   )rE   r+   r+   r,   dump  s    zChannel.dump)NNNNNNN)N)FN)F)r9   r:   r;   r<   r1   staticmethodr>   rF   propertyrG   rH   rI   rL   rN   r2   r_   rh   rr   rK   ry   rz   r|   r}   r~   r   r   r   r   r   r   r   r+   r+   r+   r,   r0   2   s8   	 
	#

r0   c               @   sb   e Zd ZdddZedd Zedd Zdd	d
Zedd Zedd Z	dddZ
dd ZdS )r4   Nc                sv   || _ d | _ rNtdd |D }t fdd|D  tdd |D | _n|| _d | _d | _d | _ | _d | _	d S )Nc             s   s   | ]}|  V  qd S )N)r   )r(   r8   r+   r+   r,   r-   .  s    z(MultiChannel.__init__.<locals>.<genexpr>c             3   s   | ]}|j  d V  qdS ))rC   N)update)r(   cd)rC   r+   r,   r-   /  s    c             s   s   | ]}t f |V  qd S )N)r0   )r(   r   r+   r+   r,   r-   0  s    )
r%   rA   r3   rd   	_channelsr?   r@   rB   rC   rD   )rE   r%   r$   rC   Zc_dictsr+   )rC   r,   rF   )  s    zMultiChannel.__init__c             C   s   | j S )N)rA   )rE   r+   r+   r,   rG   :  s    zMultiChannel.channel_locationc             C   s   | j S )N)r%   )rE   r+   r+   r,   rh   >  s    zMultiChannel.canonical_nameFc                s$   | j }tt fdd|D S )Nc             3   s   | ]}|  V  qd S )N)rr   )r(   r8   )rk   ru   r+   r,   r-   D  s    z$MultiChannel.urls.<locals>.<genexpr>)r   listr   from_iterable)rE   ru   rk   r   r+   )rk   ru   r,   rr   B  s    zMultiChannel.urlsc             C   s   d S )Nr+   )rE   r+   r+   r,   ry   F  s    zMultiChannel.base_urlc             C   s   t dd | jD S )Nc             s   s   | ]}|j V  qd S )N)ry   )r(   r8   r+   r+   r,   r-   L  s    z)MultiChannel.base_urls.<locals>.<genexpr>)r3   r   )rE   r+   r+   r,   rz   J  s    zMultiChannel.base_urlsc             C   s   d S )Nr+   )rE   ru   r+   r+   r,   rK   N  s    zMultiChannel.urlc             C   s   | j tdd | jD dS )Nc             s   s   | ]}|  V  qd S )N)r   )r(   r8   r+   r+   r,   r-   T  s    z$MultiChannel.dump.<locals>.<genexpr>)r%   r$   )r%   r3   r   )rE   r+   r+   r,   r   Q  s    zMultiChannel.dump)N)FN)F)r9   r:   r;   rF   r   rG   rh   rr   ry   rz   rK   r   r+   r+   r+   r,   r4   '  s   


r4   c             C   s   t dd t| |D S )Nc             s   s   | ]\}}||kV  qd S )Nr+   )r(   ri   swr+   r+   r,   r-   Y  s    z'tokenized_startswith.<locals>.<genexpr>)allzip)Ztest_iterableZstartswith_iterabler+   r+   r,   rb   X  s    rb   c             C   sT   t | t | } }| j|jks*| j|jkr.dS dd }t|| d||dS )NFc             S   s   | j dpdS )NrU   )r[   rY   )rK   r+   r+   r,   <lambda>`      z0tokenized_conda_url_startswith.<locals>.<lambda>rU   )r!   rW   rX   rb   rc   )r^   Zstartswith_urlZnorm_url_pathr+   r+   r,   tokenized_conda_url_startswith\  s    r   c                sn    fdd t | tj\}} |}|d k	rHt|}||_|rD||_|S tj}t|j|j	|j
|j||dS d S )Nc                s<   | t jkrt j|  S | ddd }|| kr0d S  |S d S )NrU   r#   r   )r   ra   r{   )r%   Z	test_name)_get_channel_for_name_helperr+   r,   r   f  s    

z;_get_channel_for_name.<locals>._get_channel_for_name_helper)r?   r@   rA   rB   r%   rC   )r   r   rR   r   r%   rC   r\   r0   r?   r@   rA   rB   )rH   rT   rC   rg   r]   r+   )r   r,   rM   e  s    	rM   c             C   s  |o| d}t|||dj}|sDt||dj dd | p<d d d fS xttj ddd dD ]j\}}t|\}}}}	t|t	||r^|
t	||dd	d}
t	||
}t|}|j||j|j|jfS q^W xLtjD ]B}||jr|
|jdd	d}tj}|j||j|j|jfS qW x|ttj dd
d dD ]`\}}t	|j|j}t|d|dr4|
|dd	d}
|jt	|j|
| |j|jfS q4W tj}|jrt|d|jdr|
|jdd	dpd }|j|| |j|jfS |d kr:|d kst|dd	\}}|s"d}d\}}}	|||||	fS d }|dd}|rx|d dkrxddtd	| }}t|||dj d|dpd | pd d d fS )NrU   )rW   rX   r[   )rW   rX   Tc             S   s   t | d S )Nr   )r.   )xr+   r+   r,   r     r   z-_read_channel_configuration.<locals>.<lambda>)reversekeyrV   r#   c             S   s   t | d S )Nr   )r.   )r   r+   r+   r,   r     r   )fileNNr   Zconda)rstripr   rK   sortedr   Zmigrated_custom_channelsitemsr    r   r   rZ   rY   rM   rA   r?   r@   rB   re   rP   r\   ra   r%   rb   rc   rq   r{   joinr   )r?   rW   rX   r[   r^   r%   rA   Z_schemeZ_authZ_tokensubnamerH   rg   Zmigrated_aliasr]   Zthat_test_urlZbump
path_partsr+   r+   r,   _read_channel_configuration  sR    "
"

"r   c          	   C   sj   t | tj\	}}}}}}}}}	t||||\}
}}}}|
d k	sJ|d k	sJtt|pRd|pX||
|p`||||S )NZhttps)r   r   rR   r   rq   r0   )rK   r?   r@   rB   rC   rD   rW   rX   r[   ZqueryrG   rH   Zconfigured_schemeZconfigured_authZconfigured_tokenr+   r+   r,   rJ     s    rJ   c               C   s   t jfS )N)r   Zlocal_build_rootr+   r+   r+   r,   get_conda_build_local_url  s    r   TNc             C   s|   t dd dd | D D } t }xTt| D ]H\}}t|}x6|||D ]&}||krXqJ|jt|td f||< qJW q,W |S )Nc             s   s.   | ]&}t |tr d d |jD n|fV  qdS )c             s   s   | ]}t |V  qd S )N)r0   )r(   Zccr+   r+   r,   r-     s    z0prioritize_channels.<locals>.<genexpr>.<genexpr>N)r/   r4   r   )r(   r8   r+   r+   r,   r-     s   z&prioritize_channels.<locals>.<genexpr>c             s   s   | ]}t |V  qd S )N)r0   )r(   r8   r+   r+   r,   r-     s    r#   )r   r   	enumerater0   rr   rh   minr   )r$   ru   rk   resultZpriority_counterchnrg   rK   r+   r+   r,   prioritize_channels  s     r   c             C   s2   t  }x&| D ]}t|}|||| qW |S )N)r
   r0   r   rr   )r$   rk   ru   r   r   rg   r+   r+   r,   all_channel_urls  s
    
r   c             C   s   t j pt|  p| dS )Nzfile:/)r   Zoffliner   rP   )rK   r+   r+   r,   offline_keep  s    r   )TN)NT);Z
__future__r   r   r   r   r   	itertoolsr   Zloggingr   Z_vendor.boltons.setutilsr
   Z_vendor.toolzr   r   r   Zbase.constantsr   r   r   Zbase.contextr   Zcommon.compatr   r   r   r   r   Zcommon.pathr   r   Z
common.urlr   r   r   r   r   r   r   r    r!   r9   r   typer"   objectr0   r4   rb   r   rM   r   rJ   r   r   r   r   Zregister_reset_callabackr>   r+   r+   r+   r,   <module>   s4   , u1	@

