B
    lz]rG                 @   st  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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/Z0dd Z1dd Z2dd Z3dd Z4dd Z5dd Z6d'd!d"Z7d(d#d$Z8d%d& Z9e:e/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_package_file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 )8r1   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)r1   r2   r,   r,   r,   r-   _reset_state>   s    zChannel._reset_stateNc             C   s.   || _ || _|| _|| _|| _|| _|| _d S )N)schemeauthlocationtokenr&   platformpackage_filename)selfr@   rA   rB   rC   r&   rD   rE   r,   r,   r-   __init__B   s    zChannel.__init__c             C   s   | j S )N)rB   )rF   r,   r,   r-   channel_locationL   s    zChannel.channel_locationc             C   s   | j S )N)r&   )rF   r,   r,   r-   channel_nameP   s    zChannel.channel_namec             C   s   | j S )N)rD   )rF   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)rI   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 t	| rx| drnt| } 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:)r1   r   r   r   
startswithr   rM   r   r   r   r    r   known_subdirscustom_multichannelsr5   rO   )r8   	_strippedrD   r,   r,   r-   r3   `   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@   rA   rB   rC   r&    r$   )hostport)r!   r1   striprB   rQ   replacer"   r   rW   rX   rL   pathr@   rA   rC   )
channel_aliasZchannel_urlr&   catest_urlr@   rA   rC   rB   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)rB   )r)   r9   )rF   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   rB   lstrip)rF   Z	multinamer%   channelZcnZ	that_namer,   )rF   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)rD   )rJ   )rF   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@   rA   )r)   b)rF   r,   r-   
<listcomp>   s    z Channel.urls.<locals>.<listcomp>c                s   g | ]}d  j |f qS )z%s://%s)r@   )r)   ro   )rF   r,   r-   rp      s    )r   rk   r   AssertionErrorrh   r   r1   r   urlsrB   rC   extendappendr&   r   rA   )rF   with_credentialsrk   rl   basesr,   )rn   rF   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   rB   rC   rs   rt   r&   rD   rE   nextr   rk   r   rA   r@   )rF   ru   rn   Zfirst_non_noarchr,   r,   r-   rL      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   rB   r&   )rF   r,   r,   r-   base_url   s    
zChannel.base_urlc             C   s   | j fS )N)ry   )rF   r,   r,   r-   	base_urls   s    zChannel.base_urlsc             C   s(   |  d}| jr$|r$|ddd }|S )NTrU   r$   r   )rL   rE   rsplit)rF   rL   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&   rJ   r   )rF   rn   r,   r,   r-   __str__   s    zChannel.__str__c             C   s   d| j rt| j| j n| j S )NzChannel("%s"))rJ   r   r&   )rF   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)r0   r1   rB   r&   	Exceptionlogdebug)rF   otherZ_otherer,   r,   r-   __eq__   s    
zChannel.__eq__c             C   s   t | j| jfS )N)hashrB   r&   )rF   r,   r,   r-   __hash__  s    zChannel.__hash__c             C   s   t | j| jfS )N)rd   rB   r&   )rF   r,   r,   r-   __nonzero__  s    zChannel.__nonzero__c             C   s   |   S )N)r   )rF   r,   r,   r-   __bool__  s    zChannel.__bool__c             C   s   | j S )N)__dict__)rF   r,   r,   r-   __json__  s    zChannel.__json__c             C   s   | j | jfS )N)ry   rh   )rF   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@   rA   rB   rC   r&   rD   rE   )r@   rA   rB   rC   r&   rD   rE   )rF   r,   r,   r-   dump  s    zChannel.dump)NNNNNNN)N)FN)F)r:   r;   r<   r=   r2   staticmethodr?   rG   propertyrH   rI   rJ   rM   rO   r3   r_   rh   rr   rL   ry   rz   r|   r}   r~   r   r   r   r   r   r   r   r,   r,   r,   r-   r1   2   s8   	 
	#

r1   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 )r5   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)   r9   r,   r,   r-   r.   .  s    z(MultiChannel.__init__.<locals>.<genexpr>c             3   s   | ]}|j  d V  qdS ))rD   N)update)r)   cd)rD   r,   r-   r.   /  s    c             s   s   | ]}t f |V  qd S )N)r1   )r)   r   r,   r,   r-   r.   0  s    )
r&   rB   r4   rd   	_channelsr@   rA   rC   rD   rE   )rF   r&   r%   rD   Zc_dictsr,   )rD   r-   rG   )  s    zMultiChannel.__init__c             C   s   | j S )N)rB   )rF   r,   r,   r-   rH   :  s    zMultiChannel.channel_locationc             C   s   | j S )N)r&   )rF   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)   r9   )rk   ru   r,   r-   r.   D  s    z$MultiChannel.urls.<locals>.<genexpr>)r   listr   from_iterable)rF   ru   rk   r   r,   )rk   ru   r-   rr   B  s    zMultiChannel.urlsc             C   s   d S )Nr,   )rF   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)   r9   r,   r,   r-   r.   L  s    z)MultiChannel.base_urls.<locals>.<genexpr>)r4   r   )rF   r,   r,   r-   rz   J  s    zMultiChannel.base_urlsc             C   s   d S )Nr,   )rF   ru   r,   r,   r-   rL   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)   r9   r,   r,   r-   r.   T  s    z$MultiChannel.dump.<locals>.<genexpr>)r&   r%   )r&   r4   r   )rF   r,   r,   r-   r   Q  s    zMultiChannel.dump)N)FN)F)r:   r;   r<   rG   r   rH   rh   rr   ry   rz   rL   r   r,   r,   r,   r-   r5   '  s   


r5   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   )rL   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@   rA   rB   rC   r&   rD   )r    r   rR   r   r&   rD   r\   r1   r@   rA   rB   rC   )rI   rT   rD   rg   r]   r,   )r   r-   rN   e  s    	rN   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   rL   sortedr   Zmigrated_custom_channelsitemsr!   r   r   rZ   rY   rN   rB   r@   rA   rC   re   rQ   r\   ra   r&   rb   rc   rq   r{   joinr   )r@   rW   rX   r[   r^   r&   rB   Z_schemeZ_authZ_tokensubnamerI   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   r1   )rL   r@   rA   rC   rD   rE   rW   rX   r[   ZqueryrH   rI   Zconfigured_schemeZconfigured_authZconfigured_tokenr,   r,   r-   rK     s    rK   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)r1   )r)   Zccr,   r,   r-   r.     s    z0prioritize_channels.<locals>.<genexpr>.<genexpr>N)r0   r5   r   )r)   r9   r,   r,   r-   r.     s   z&prioritize_channels.<locals>.<genexpr>c             s   s   | ]}t |V  qd S )N)r1   )r)   r9   r,   r,   r-   r.     s    r$   )r   r   	enumerater1   rr   rh   minr   )r%   ru   rk   resultZpriority_counterchnrg   rL   r,   r,   r-   prioritize_channels  s     r   c             C   s2   t  }x&| D ]}t|}|||| qW |S )N)r
   r1   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   rQ   )rL   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   r   Z
common.urlr   r   r   r   r   r   r    r!   r"   r:   r   typer#   objectr1   r5   rb   r   rN   r   rK   r   r   r   r   Zregister_reset_callabackr?   r,   r,   r,   r-   <module>   s4   , u1	@

