U
    bs                  
   @   s  d Z ddlmZmZmZ ddlmZ ddlmZ ddl	Z	ddl
Z
ddlmZmZmZ ddlZddlmZ ddlZddlmZmZ dd	lmZ dd
lmZ zddlmZ ddlmZ W n( ek
r   ddlZddlmZ Y nX ddl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+ ddl,m-Z- ddl.m/Z/ ddl0m1Z1m2Z2 ddl3m4Z4 ddl5m6Z6 ddl7m8Z8 ddl9m:Z: ddl;m<Z< ddl=m>Z> ddl=m?Z? ddl@mAZA ddlBmCZD ddlEZEe
jFGdeeeeHddd d!ZIeeeId"ZJed#d$ZKd%ZLd&d' ZMdvd(d)ZNedwd+d,Z)dxd.d/ZOeePdd0d1d2ZQdyd4d5ZRdzd6d7ZSd{d8d9ZTd|eUd:d;d<ZVd=d> ZWd?d@ ZXedAdB ZYdCdD ZZdEdF Z[dGdH Z\dIdJ Z]d}dKdLZ^dMdN Z_eddOe"j`fdPdQZaeddOe"j`fdRdSZbeddOe"j`fdTdUZceddOe"j`fdVdWZdeddOe"j`fdXdYZee"j`fdZd[Zfd~d_d`ZgeddbdcZheddddeZieddfdgZjeddhdiZkeddjdkZleddldmZmeddndoZneddpdqZodrds ZpeEq dtdu ZrdS )z
Helpers for the tests
    )absolute_importdivisionprint_function)contextmanager)	lru_cacheN)dirnamejoinabspath)shlex_split_unicode)
gettempdirmkdtemp)uuid4)Path)mock)patch   )cli)contextreset_contextconda_tests_ctxt_mgmt_def_pol)encode_arguments)argvcapturedenv_var)
PrefixData_get_solver_class)
SubdirDatamake_feature_record)rm_rf)lexists)initialize_logging)History)ChannelPackageRecord)PrefixRecord)Resolve)mainZCONDA_TEST_DATA_DIRz..ZtestsdataZconda_format_repoz-test-conda-channels)suffixz6Using Anaconda Cloud api site https://api.anaconda.orgc                 C   s&   t r"| t r"| tt d   } | S N)expected_error_prefix
startswithlenlstrip)stderr r1   4lib/python3.8/site-packages/conda/testing/helpers.pystrip_expected@   s    r3   c              
   C   sb   z
| }W nF | k
rP } z(|r2||j d ks2tt| W Y dS d }~X Y nX td| d S )Nr   Tzdid not raise, gave %s)argsAssertionErrorprint	Exception)Z	exceptionfuncstringaer1   r1   r2   raisesF   s    
r<   Tc              	   c   sH   zt }|V  W 5 Q R X W 5 t |j|_| rB|jrBtd|j X d S )NzGot stderr output: %s)r3   r0   r7   common_io_captured)disallow_stderrcr1   r1   r2   r   Q   s    
r   Fc                 K   st   t | |\}}}|dr<td|tj}|rH| d }n|rH|sH|S zt| W S  t	k
rn    Y nX d S )NZrelaxedz\A.*?({.*})r   )
run_inprocess_conda_commandgetrematchDOTALLgroupsjsonloadsstrip
ValueError)commandr>   Zignore_stderrkwargsstdoutr0   	exit_coderC   r1   r1   r2   capture_json_with_argv]   s    
rN   )prefixreturnc              	   c   s0   t jd }z| t jd< d V  W 5 |t jd< X d S )NZCONDA_PREFIX)osenviron)rO   Z
old_prefixr1   r1   r2   set_active_prefixl   s
    


rS    c                 C   s8   d|   |  f d | }|   |  ks4t|d S )Nz%r != %rz

lowerr5   r:   boutputr1   r1   r2   assert_equalsw   s    rZ   c                 C   s.   |   |  ks*td||   |  f d S )Nz%s %r should not be found in %rrU   rW   r1   r1   r2   assert_not_in|   s
    r[   c                 C   s.   |   |  ks*td||   |  f d S )Nz%s %r cannot be found in %rrU   rW   r1   r1   r2   	assert_in   s    r\   )r>   c              
   C   s   t d | dr&| dd} tj}ntj}ttt| @ t	|,}t
  z
| }W n tk
rl   Y nX W 5 Q R X W 5 Q R X t|jtjd t|j |j|j|fS )Nr1   z	conda envenvrT   )file)r   r-   replaceconda_env_clir(   r   r   r   r
   r   r!   
SystemExitr6   r0   sysrL   )rJ   r>   Z	main_funcr?   rM   r1   r1   r2   r@      s    


r@   c                 C   s*   |  d\}}|d tj }d||gS )Nz::/)splitr   subdirr   )Zdist_stringZchannel_strZpackage_strr1   r1   r2   
add_subdir   s    rf   c                 C   sp   t | trdd |  D S t | tr4ttt| S t | trLttt| S t | trdttt| S tdd S )Nc                 S   s   i | ]\}}t ||qS r1   )rf   ).0kvr1   r1   r2   
<dictcomp>   s      z&add_subdir_to_iter.<locals>.<dictcomp>z/Unable to add subdir to object of unknown type.)	
isinstancedictitemslistmaprf   settupler7   )iterabler1   r1   r2   add_subdir_to_iter   s    



rs   c                  c   sN   t  } tt d d }t| |}zt| |V  W 5 t|rHt| X d S )N   )r   strr   r   r    r   rQ   makedirs)Z
tempdirdirr   rO   r1   r1   r2   tempdir   s    


rw   c                 C   s   |d }| d}| d}| d}|s>d|d |d f }|j}|d  D ]*\}	}
tj|
|	||||||d}|| |< qPd S )Ninfoarchplatformre   z%s-%spackages)fnry   rz   channelre   priorityauth)rA   r   rm   r%   from_objects)indexrepodatar}   r~   Zrepodata_infory   rz   re   r   r|   rx   recr1   r1   r2   supplement_index_with_repodata   s&    


r   c                 C   sD   t  }|  D ]}|jr||j q|D ]}t|}|| |< q*d S r+   )rp   valuestrack_featuresupdater   )r   Zall_featuresr   Zfeature_namer1   r1   r2   add_feature_records_legacy   s    r   c                 C   s~   | j }i }|D ]@}| }|jr*|j|d< d|krD|d |d< |d= |||j< q|d |d |d |d |d d	tji|d
S )
    This function is only temporary and meant to patch wrong / undesirable
    testing behaviour. It should end up being replaced with the new class-based,
    backend-agnostic solver tests.
    	timestampZfeaturesr   _cache_control_etag_mod_url_add_pipre   )r   r   r   r   r   rx   r{   )Z_internal_statedumpr   r|   r   re   )subdir_datar   stater{   pkgr)   r1   r1   r2   _export_subdir_data_to_repodata   s(    
 r   c              	   C   s   t t| j }|| j }|jddd t|d d2}tjt|||dd |	  t
|  W 5 Q R X |d }|jddd t|d d(}ti | |	  t
|  W 5 Q R X dS )	r   T)parentsexist_okrepodata.jsonwr   )indentnoarchN)r   EXPORTED_CHANNELS_DIRnamerz   mkdiropenrF   r   r   flushrQ   fsyncfileno)r}   r   r   basere   fr   r1   r1   r2   _sync_channel_to_disk  s    
r   c                 C   sX   |dkr(t | jdddf}tj|}|rTt t d|  }|tj|jdddf< dS )r   NTZwith_credentialsr   rc   )r#   urlr   _cache_rA   r   )r   r   Z	cache_keyZlocal_proxy_channelr1   r1   r2   4_alias_canonical_channel_name_cache_to_file_prefixed  s    r   c                 C   s$   t | | t||| td|_dS )r   infN)r   r   floatZ_mtime)r   r   r}   r   r1   r1   r2   _patch_for_local_exports+  s    
r   )maxsizec              	   C   s   t ttd&}t|}| tjtjd|d}W 5 Q R X td|  }t	|}t
ddtd |t| W 5 Q R X d|_|t	j|jdd	< d
d |jD }t| t||fd}td||| ||fS )N
index.jsonre   ry   rz   rx   r{   'https://conda.anaconda.org/channel-1/%s"CONDA_ADD_PIP_AS_PYTHON_DEPENDENCYfalseZstack_callbackTr   c                 S   s   i | ]
}||qS r1   r1   rg   precr1   r1   r2   rj   S  s      z!get_index_r_1.<locals>.<dictcomp>Zchannels	channel-1)r   r   TEST_DATA_DIRrF   loadr   	arch_namerz   r#   r   r   r   _process_raw_repodata_strdumps_loadedr   r   _package_recordsr   r'   r   re   Zfir{   r   r}   sdr   rr1   r1   r2   get_index_r_1=  s.    
	  r   c              	   C   s   t ttd&}t|}| tjtjd|d}W 5 Q R X td|  }t	|}t
ddtd |t| W 5 Q R X d|_|t	j|jdd	< d
d |jD }t||fd}td||| ||fS )Nzindex2.jsonr   r   z'https://conda.anaconda.org/channel-2/%sr   r   r   Tr   c                 S   s   i | ]
}||qS r1   r1   r   r1   r1   r2   rj   q  s      z!get_index_r_2.<locals>.<dictcomp>r   	channel-2r   r   r   rF   r   r   r   rz   r#   r   r   r   r   r   r   r   r   r   r'   r   r   r1   r1   r2   get_index_r_2[  s,    
	  r   c              	   C   s   t ttd&}t|}| tjtjd|d}W 5 Q R X td|  }t	|}t
ddtd |t| W 5 Q R X d|_|t	j|jdd	< d
d |jD }t||fd}td||| ||fS )Nzindex4.jsonr   r   z'https://conda.anaconda.org/channel-4/%sr   r   r   Tr   c                 S   s   i | ]
}||qS r1   r1   r   r1   r1   r2   rj     s      z!get_index_r_4.<locals>.<dictcomp>r   	channel-4r   r   r1   r1   r2   get_index_r_4x  s,    
	  r   c              	   C   s   t ttd&}t|}| tjtjd|d}W 5 Q R X td|  }t	|}t
ddtd |t| W 5 Q R X d|_|t	j|jdd	< d
d |jD }t||fd}td||| ||fS )Nzindex5.jsonr   r   z'https://conda.anaconda.org/channel-5/%sr   truer   Tr   c                 S   s   i | ]
}||qS r1   r1   r   r1   r1   r2   rj     s      z!get_index_r_5.<locals>.<dictcomp>r   	channel-5r   r   r1   r1   r2   get_index_r_5  s,    
	  r   c                 C   s@  | t jt jdddddgdddd	d
ddddgddddddg dddd	d
ddg ddddd
ddg dddd	d
ddg ddddd
ddddgdddd	d
ddddgddddd
dd }td!|  }t|}td"d#td$ |t	| W 5 Q R X d%|_
|tj|jd%d&< d'd( |jD }t||fd)}td*||| ||fS )+Nr   0r   zlibbar 2.0.*zlibfoo 1.0.*Z 11ec1194bcc56b9a53c127142a272772Zfoobarl   -MC1.0)buildbuild_numberdependsmd5r   r   versionzlibfoo 2.0.*Z f8eb5a7fa1ff6dead4e360631a6cd048z2.0)r   r   r   r   r   r   Z f51f4d48a541b7105b5e343704114f0fZlibbarl   KCZ 27f4e717ed263f909074f64d9cbf935dl   LCZ ad7c088566ffe2389958daedf8ff312cZlibfool   i6HCZ daf7af7086d8f22be49ae11bdc41f332l   SJCZ 18604cbe4f789fe853232eef4babd4f9Zquxl   WCzlibbar 1.0.*Z 892aa4b9ec64b67045a46866ef1ea488l   [C)zfoobar-1.0-0.tar.bz2zfoobar-2.0-0.tar.bz2zlibbar-1.0-0.tar.bz2zlibbar-2.0-0.tar.bz2zlibfoo-1.0-0.tar.bz2zlibfoo-2.0-0.tar.bz2zqux-1.0-0.tar.bz2zqux-2.0-0.tar.bz2r   z,https://conda.anaconda.org/channel-freeze/%sr   r   r   Tr   c                 S   s   i | ]
}||qS r1   r1   r   r1   r1   r2   rj     s      z+get_index_must_unfreeze.<locals>.<dictcomp>r   channel-freeze)r   r   rz   r#   r   r   r   r   rF   r   r   r   r   r   r'   r   )re   r   r}   r   r   r   r1   r1   r2   get_index_must_unfreeze  s    
	




P  r   c              	   C   s   t ttd&}t|}| tjtjd|d}W 5 Q R X td|  }t	|}t
ddt |t| W 5 Q R X d|_|t	j|jdd< d	d
 |jD }t| t||fd}td||| ||fS )Nr   r   r   r   r   r   Tr   c                 S   s   i | ]
}||qS r1   r1   r   r1   r1   r2   rj   (  s      z"get_index_cuda.<locals>.<dictcomp>r   r   )r   r   r   rF   r   r   r   rz   r#   r   r   r   r   r   r   r   r   r   r   r'   r   r   r1   r1   r2   get_index_cuda  s&    
	r   r:   r   r   c              
   K   s"   t f | ||pg ||||d|S )N)r   r   r   r   r   r   r}   r$   )r   r   r   r   r   r   r}   rK   r1   r1   r2   record1  s    
r   r1   c              
   c   s   | j } t| }dd |D |_dd |D }ttj td tjt	d|dJ t
ddtd	0 t | tt d
ftjf||d}|V  W 5 Q R X W 5 Q R X d S )Nc                 S   s   i | ]}|j t|qS r1   r   r&   r   rg   r   r1   r1   r2   rj   K  s     zget_solver.<locals>.<dictcomp>c                 S   s   i | ]}|j |qS r1   r   rg   specr1   r1   r2   rj   N  s      r   get_requested_specs_mapZreturn_valuer   r   r   
/channel-1specs_to_addspecs_to_remove)strpathr   _PrefixData__prefix_recordsr   r   re   r   r   objectr"   r   r   r   r#   r   Ztmpdirr   r   Zprefix_recordsZhistory_specsZpdZspec_mapZsolverr1   r1   r2   
get_solverG  s,    
r   c              
   c   s   | j } t| }dd |D |_dd |D }ttj td tjt	d|dJ t
ddtd	0 t | tt d
ftjf||d}|V  W 5 Q R X W 5 Q R X d S )Nc                 S   s   i | ]}|j t|qS r1   r   r   r1   r1   r2   rj   h  s     z get_solver_2.<locals>.<dictcomp>c                 S   s   i | ]}|j |qS r1   r   r   r1   r1   r2   rj   k  s      r   r   r   r   r   r   
/channel-2r   )r   r   r   r   r   re   r   r   r   r"   r   r   r   r#   r   r   r1   r1   r2   get_solver_2d  s,    
r   c              
   c   s   | j } t| }dd |D |_dd |D }ttj td tjt	d|dJ t
ddtd	0 t | tt d
ftjf||d}|V  W 5 Q R X W 5 Q R X d S )Nc                 S   s   i | ]}|j t|qS r1   r   r   r1   r1   r2   rj     s     z get_solver_4.<locals>.<dictcomp>c                 S   s   i | ]}|j |qS r1   r   r   r1   r1   r2   rj     s      r   r   r   r   r   r   
/channel-4r   )r   r   r   r   r   re   r   r   r   r"   r   r   r   r#   r   r   r1   r1   r2   get_solver_4  s,    
r   c              
   c   s   | j } t| }dd |D |_dd |D }ttj td tjt	d|dJ t
ddtd	0 t | tt d
ftjf||d}|V  W 5 Q R X W 5 Q R X d S )Nc                 S   s   i | ]}|j t|qS r1   r   r   r1   r1   r2   rj     s     z get_solver_5.<locals>.<dictcomp>c                 S   s   i | ]}|j |qS r1   r   r   r1   r1   r2   rj     s      r   r   r   r   r   r   z
/channel-5r   )r   r   r   r   r   re   r   r   r   r"   r   r   r   r#   r   r   r1   r1   r2   get_solver_5  s,    
r   c              
   c   s   | j } t| }dd |D |_dd |D }ttj ttj td td tj	t
d|dV tdd	td
< t | tt dtt dftjf||d}|V  W 5 Q R X W 5 Q R X d S )Nc                 S   s   i | ]}|j t|qS r1   r   r   r1   r1   r2   rj     s     z*get_solver_aggregate_1.<locals>.<dictcomp>c                 S   s   i | ]}|j |qS r1   r   r   r1   r1   r2   rj     s      r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   re   r   r   r   r   r"   r   r   r   r#   r   r   r1   r1   r2   get_solver_aggregate_1  s4    


r   c              
   c   s   | j } t| }dd |D |_dd |D }ttj ttj td td tj	t
d|dV tdd	td
< t | tt dtt dftjf||d}|V  W 5 Q R X W 5 Q R X d S )Nc                 S   s   i | ]}|j t|qS r1   r   r   r1   r1   r2   rj     s     z*get_solver_aggregate_2.<locals>.<dictcomp>c                 S   s   i | ]}|j |qS r1   r   r   r1   r1   r2   rj     s      r   r   r   r   r   r   r   r   r   r   r   r   r1   r1   r2   get_solver_aggregate_2  s4    


r   c              
   c   s   | j } t| }dd |D |_dd |D }ttj td tjt	d|dJ t
ddtd	0 t | tt d
ftjf||d}|V  W 5 Q R X W 5 Q R X d S )Nc                 S   s   i | ]}|j t|qS r1   r   r   r1   r1   r2   rj   	  s     z,get_solver_must_unfreeze.<locals>.<dictcomp>c                 S   s   i | ]}|j |qS r1   r   r   r1   r1   r2   rj     s      r   r   r   r   r   r   z/channel-freezer   )r   r   r   r   r   re   r   r   r   r"   r   r   r   r#   r   r   r1   r1   r2   get_solver_must_unfreeze  s,    
r   c              
   c   s   | j } t| }dd |D |_dd |D }ttj td tjt	d|dJ t
ddtd	0 t | tt d
ftjf||d}|V  W 5 Q R X W 5 Q R X d S )Nc                 S   s   i | ]}|j t|qS r1   r   r   r1   r1   r2   rj   (  s     z#get_solver_cuda.<locals>.<dictcomp>c                 S   s   i | ]}|j |qS r1   r   r   r1   r1   r2   rj   +  s      r   r   r   r   r   r   r   r   )r   r   r   r   r   re   r   r   r   r"   r   r   r   r#   r   r   r1   r1   r2   get_solver_cuda"  s,    
r   c                 C   s@   g }| D ].}|j j}|j j|j _||  ||j _qt|S r+   )r}   Z_Channel__canonical_namer   appenddist_strrq   )Zsolutionr   r   Zcanonical_namer1   r1   r2   convert_to_dist_strA  s    
r   c                   C   s   t  S r+   r   r1   r1   r1   r2   solver_classM  s    r   )N)T)TF)rT   )rT   )rT   )T)N)r:   r   Nr   r   r   N)r1   r1   r1   r1   )r1   r1   r1   r1   )r1   r1   r1   r1   )r1   r1   r1   r1   )r1   r1   r1   r1   )r1   r1   r1   r1   )r1   r1   r1   r1   )r1   r1   r1   r1   )s__doc__Z
__future__r   r   r   
contextlibr   	functoolsr   rF   rQ   os.pathr   r   r	   rB   Zconda.auxlib.compatr
   rb   Ztempfiler   r   Zuuidr   pathlibr   Zunittestr   Zunittest.mockr   ImportErrorrT   r   Zbase.contextr   r   r   Zcommon.compatr   Z	common.ior   r   r=   r   Zcore.prefix_datar   Z
core.solver   Zcore.subdir_datar   r   Zgateways.disk.deleter   Zgateways.disk.readr    Zgateways.loggingr!   historyr"   Zmodels.channelr#   Zmodels.recordsr%   r&   Zresolver'   Zconda_env.clir(   r`   ZpytestrR   rA   __file__r   ZCHANNEL_DIRr   r,   r3   r<   rN   ru   rS   rZ   r[   r\   boolr@   rf   rs   rw   r   r   r   r   r   r   re   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zfixturer   r1   r1   r1   r2   <module>   s    







"
b       
       #       #              