
    %d"                     &   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m	Z	 d dl
mZ d dl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 d dlmZ d dlmZ d dlmZm Z  dZ!d Z"d Z#ddZ$d Z%d Z&d Z' G d de(          Z) G d d          Z*dS )    )chainN)context)EnvironmentFileEmptyEnvironmentFileNotFound)common)yaml_safe_loadyaml_safe_dump)
PrefixData)download_text)CONDA_SESSION_SCHEMES)PackageType)	MatchSpec)PrefixGraph)History)groupby_to_dictunique)namedependenciesprefixchannels	variablesc                    g }| r|                                  ni }|                                 D ]5}|t          vr*|                    |           |                    |           6|r|                    d          }t          |          dk    rdnd}t          |          dk    rdnd}t          d                    |||                     |D ]}t          d	|            t                       |                     d
g           }t          j
        d          fdt          fd|D                       }	|D ]J}
t          |
t                    r3d|
v r/|	s-t          d           |d
                             dd            nK|S )z8Check for unknown keys, remove them and print a warning.filename   areiss zn
EnvironmentSectionNotValid: The following section{plural} on '{filename}' {verb} invalid and will be ignored:)r   pluralverbz - r   z[<>~\s=]c                 d    d                     |           d                              d          v S )Npipr   z::)split)depdepsplits    -lib/python3.11/site-packages/conda_env/env.py<lambda>zvalidate_keys.<locals>.<lambda>/   s+    (.."5"5a"8">">t"D"DD     c              3   X   K   | ]$}t          |t                     |          V  %d S N)
isinstancedict).0_is_pips     r&   	<genexpr>z validate_keys.<locals>.<genexpr>0   s:      GG!:a3F3FGFF1IIGGGGGGr(   r"   aE  Warning: you have pip-installed dependencies in your environment file, but you do not list pip itself as one of your conda dependencies.  Conda may not use the correct pip to install your packages, and they may end up in the wrong place.  Please add an explicit pip dependency.  I'm adding one for you, but still nagging you.r   )copykeys
VALID_KEYSappendpopgetlenprintformatrecompileanyr+   r,   insert)datakwargsinvalid_keysnew_datakeyr   r    r   deps	lists_pipr$   r%   r/   s              @@r&   validate_keysrE      s   L"*tyy{{{Hyy{{  j  	$$$LL 	::j))L))Q.8uuDL))Q.6B &tDD	F 	F 	F   	 	C+++88NB''Dz+&&HDDDDFGGGGtGGGGGI  sD!! 	esl 	9 	 5 6 6 6
 ^$++Au555EOr(   c                    ddg}	 |D ]A}	 t          t          j                            | |                    c S # t          $ r Y >w xY w| }t          j                            |           } | |k    rnmt	          |d                   )z=Load and return an ``Environment`` from a given ``directory``zenvironment.ymlzenvironment.yamlTr   )	from_fileospathjoinr   dirname)	directoryfilesfold_directorys       r&   load_from_directoryrP   =   s     23E	 	 	A i!;!;<<<<<*   !GOOI..	% 		 "%(
+
++s   ,:
AAFc                    t          |d          }|                                }|rjt          |                                          }d |                                D             }t          | |t          t          j                  ||          S t          t          |                                          j                  }	t          d |	          }
t          g |
                    dd          |
                    t           j        d          |
                    t           j        d          R d 	          }t          g |
                    t           j        d          |
                    t           j        d          |
                    t           j        d          R d
 	          }|rd |D             }nd |D             }|r!|                    dd |D             i           t          t          j                  }|s+|D ](}|j        j        }||vr|                    d|           )t          | ||||          S )af  
        Get environment object from prefix
    Args:
        name: The name of environment
        prefix: The path of prefix
        no_builds: Whether has build requirement
        ignore_channels: whether ignore_channels
        from_history: Whether environment file should be based on explicit specs in history

    Returns:     Environment object
    T)pip_interop_enabledc                 ,    g | ]}t          |          S  )str)r-   packages     r&   
<listcomp>z$from_environment.<locals>.<listcomp>`   s    ===G===r(   )r   r   r   r   r   c                     | j         S r*   )package_typexs    r&   r'   z"from_environment.<locals>.<lambda>e   s    an r(   NrT   c                     | j         S r*   r   rZ   s    r&   r'   z"from_environment.<locals>.<lambda>l       af r(   )rB   c                     | j         S r*   r]   rZ   s    r&   r'   z"from_environment.<locals>.<lambda>v   r^   r(   c                 P    g | ]#}d                      |j        |j        f          $S =)rJ   r   versionr-   as     r&   rW   z$from_environment.<locals>.<listcomp>z   s-    KKK!!&!)!455KKKr(   c                 \    g | ])}d                      |j        |j        |j        f          *S ra   )rJ   r   rc   buildrd   s     r&   rW   z$from_environment.<locals>.<listcomp>|   s1    TTT1!&!)QW!=>>TTTr(   r"   c                 0    g | ]}|j          d |j         S )z==)r   rc   rd   s     r&   rW   z$from_environment.<locals>.<listcomp>~   s*    $Q$Q$Q!%=%=!)%=%=$Q$Q$Qr(   r   )r
   get_environment_env_varsr   get_requested_specs_mapvaluesEnvironmentlistr   r   tupler   iter_recordsgraphgroupbysortedr6   r   NOARCH_GENERICNOARCH_PYTHONVIRTUAL_PYTHON_WHEELVIRTUAL_PYTHON_EGG_MANAGEABLEVIRTUAL_PYTHON_EGG_UNMANAGEABLEr4   channelcanonical_namer=   )r   r   	no_buildsignore_channelsfrom_historypdr   historyrC   precsgrouped_precsconda_precs	pip_precsr   r   precry   s                    r&   from_environmentr   N   s    
F	5	5	5B++--I ?&//99;;==GNN,<,<===4$wGWBXBX"(I? ? ? 	? +boo//00677E44e<<M	
tR((	
{92>>	
 {8"==	
 	

   K 	
{?DD	
{H"MM	
 {JBOO	
 	
   I  UKK{KKKTTTTT TU$Q$Qy$Q$Q$QRSSSG$%%H 3 	3 	3D!\8NX- 3>222D|hW]!*, , , ,r(   c                    t          |           }|                    d          }|t          |          t          ||          }||                                D ]
\  }}|||<   t          |           t          di |S )z>Load and return a ``Environment`` from a given ``yaml string``r   NrT   )r   r6   r   rE   items_expand_channelsrl   )yamlstrr?   r>   r   rB   values         r&   	from_yamlr      s    '""Dzz*%%H -"8,,,v&&D  ,,.. 	 	JCDIITr(   c                 L    d |                      dg           D             | d<   dS )zEExpands environment variables for the channels found in the yaml datac                 L    g | ]!}t           j                            |          "S rT   )rH   rI   
expandvars)r-   rx   s     r&   rW   z$_expand_channels.<locals>.<listcomp>   s(    \\\**733\\\r(   r   N)r6   )r>   s    r&   r   r      s/    \\488JXZC[C[\\\Dr(   c                    |                      dd          d         }|t          v rt          |           }nt          j                            |           st          |           t          | d          5 }|                                }	 |	                    d          }n%# t          $ r |	                    d          }Y nw xY wd d d            n# 1 swxY w Y   t          ||           S )Nz://r   r   rbzutf-8zutf-16)r   )r#   r   r   rH   rI   existsr   openreaddecodeUnicodeDecodeErrorr   )r   
url_schemer   fpyamlbs        r&   rG   rG      s'   q))!,J** 
1))W^^H%% 1%h///(D!! 	1RGGIIE1,,w//% 1 1 1,,x001		1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 Wx0000s6   4C
B C C?CCCCCc                   *     e Zd Z fdZd Zd Z xZS )Dependenciesc                 p     t                      j        |i | || _        |                                  d S r*   )super__init__rawparse)selfr   argsr?   	__class__s       r&   r   zDependencies.__init__   s7    $)&)))

r(   c                    | j         sd S |                     dg i           | j         D ]Z}t          |t                    r|                     |           -| d                             t          j        |                     [d| v rG| d         s| d= t          d | d         D                       s| d                             d           d S d S d S )Ncondar"   c              3   F   K   | ]}t          |          j        d k    V  dS )r"   N)r   r   )r-   r   s     r&   r0   z%Dependencies.parse.<locals>.<genexpr>   s0      IIay||(E1IIIIIIr(   )r   updater+   r,   r4   r   arg2specr<   )r   lines     r&   r   zDependencies.parse   s    x 	FWbM"""H 	< 	<D$%% <D!!!!W$$V_T%:%:;;;;D= 	,;  KII4=IIIII ,W$$U+++++		, 	,, ,r(   c                 b    | j                             |           |                                  d S r*   )r   r4   r   )r   package_names     r&   addzDependencies.add   s'    %%%

r(   )__name__
__module____qualname__r   r   r   __classcell__)r   s   @r&   r   r      sV            
, , ,&      r(   r   c                   <    e Zd Z	 	 ddZd Zd Zd	dZd	dZd ZdS )
rl   Nc                 |    || _         || _        || _        t          |          | _        || _        |g }|| _        d S r*   )r   r   r   r   r   r   r   )r   r   r   r   r   r   r   s          r&   r   zEnvironment.__init__   sF    	 (66" 	H r(   c                 z    t          t          t          j        || j        f                              | _        d S r*   )rm   r   r   from_iterabler   )r   r   s     r&   add_channelszEnvironment.add_channels   s/    VE$74=8Q$R$RSSTTr(   c                     g | _         d S r*   )r   )r   s    r&   remove_channelszEnvironment.remove_channels   s    r(   c                     d| j         i}| j        r
| j        |d<   | j        r| j        j        |d<   | j        r
| j        |d<   | j        r
| j        |d<   ||S |                    t          j        |                     d S )Nr   r   r   r   r   )	r   r   r   r   r   r   writejsondumps)r   streamds      r&   to_dictzEnvironment.to_dict   s    TY= 	* MAjM 	6 $ 1 5An> 	,!^AkN; 	&+AhK 	HTZ]]#####r(   c                 V    |                                  }t          ||          }||S d S r*   )r   r	   )r   r   r   outs       r&   to_yamlzEnvironment.to_yaml   s5    LLNNQ'' 	J	 	r(   c                     t          | j        d          5 }|                     |           d d d            d S # 1 swxY w Y   d S )Nwb)r   )r   r   r   )r   r   s     r&   savezEnvironment.save   s    $-&& 	$"LLL###	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$s   :>>)NNNNNNr*   )	r   r   r   r   r   r   r   r   r   rT   r(   r&   rl   rl      s        :>;?
! 
! 
! 
!U U U  $ $ $ $   $ $ $ $ $r(   rl   )FFF)+	itertoolsr   rH   r:   r   conda.base.contextr   conda.exceptionsr   r   	conda.clir   conda.common.serializer   r	   conda.core.prefix_datar
   "conda.gateways.connection.downloadr   !conda.gateways.connection.sessionr   conda.models.enumsr   conda.models.match_specr   conda.models.prefix_graphr   conda.historyr   conda.common.iteratorsr   rq   r   r3   rE   rP   r   r   r   rG   r,   r   rl   rT   r(   r&   <module>r      s         				 				  & & & & & & J J J J J J J J       A A A A A A A A - - - - - - < < < < < < C C C C C C * * * * * * - - - - - - 1 1 1 1 1 1 ! ! ! ! ! ! E E E E E E E E I
! ! !H, , ,"9, 9, 9, 9,x  ] ] ]
1 1 1"    4   <)$ )$ )$ )$ )$ )$ )$ )$ )$ )$r(   