
    : e"                     d   d Z ddlZddlZddl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d	l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Z$d Z% edd          d             Z&	 d dZ'd Z(d Z)d Z* G d de+          Z, G d d          Z-dS )!z>Environment object describing the conda environment.yaml file.    N)chain)context)common)groupby_to_dict)unique)yaml_safe_dumpyaml_safe_load)
PrefixData)
deprecated)EnvironmentFileEmptyEnvironmentFileNotFound)download_text)CONDA_SESSION_SCHEMES)History)PackageType)	MatchSpec)PrefixGraph)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>3   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>4   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&   r0   s              @@r'   validate_keysrF      s   L"*tyy{{{Hyy{{  j  $$$LL ::j))L))Q..uuDL))Q..BvxTvBB	
 	
 	

   	 	C+++88NB''Dz+&&HDDDDFGGGGtGGGGGI 
 
c4   		Uc\\)\3   ^$++Au555EOr)   z23.9z24.3c                    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_directoryrQ   C   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>h   s    ===G===r)   )r   r   r   r   r   c                     | j         S r+   )package_typexs    r'   r(   z"from_environment.<locals>.<lambda>r   s    an r)   NrU   c                     | j         S r+   r   r[   s    r'   r(   z"from_environment.<locals>.<lambda>y       af r)   )rC   c                     | j         S r+   r^   r[   s    r'   r(   z"from_environment.<locals>.<lambda>   r_   r)   c                 P    g | ]#}d                      |j        |j        f          $S =)rK   r   versionr.   as     r'   rX   z$from_environment.<locals>.<listcomp>   s-    KKK!!&!)!455KKKr)   c                 \    g | ])}d                      |j        |j        |j        f          *S rb   )rK   r   rd   buildre   s     r'   rX   z$from_environment.<locals>.<listcomp>   s1    TTT1!&!)QW!=>>TTTr)   r#   c                 0    g | ]}|j          d |j         S )z==)r   rd   re   s     r'   rX   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sortedr7   r   NOARCH_GENERICNOARCH_PYTHONVIRTUAL_PYTHON_WHEELVIRTUAL_PYTHON_EGG_MANAGEABLEVIRTUAL_PYTHON_EGG_UNMANAGEABLEr5   channelcanonical_namer>   )r   r   	no_buildsignore_channelsfrom_historypdr   historyrD   precsgrouped_precsconda_precs	pip_precsr   r   precrz   s                    r'   from_environmentr   T   s    
F	5	5	5B++--I 	
&//99;;==GNN,<,<==='*++
 
 
 	
 +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-->222!   r)   c                    t          |           }|                    d          }|t          |          t          ||          }||                                D ]
\  }}|||<   t          |           t          di |S )z>Load and return a ``Environment`` from a given ``yaml string``r   NrU   )r	   r7   r   rF   items_expand_channelsrm   )yamlstrr@   r?   r   rC   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 rU   )rI   rJ   
expandvars)r.   ry   s     r'   rX   z$_expand_channels.<locals>.<listcomp>   s5       (/7##  r)   r   N)r7   )r?   s    r'   r   r      s9     3788J3K3K  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   rI   rJ   existsr   openreaddecodeUnicodeDecodeErrorr   )r   
url_schemer   fpyamlbs        r'   rH   rH      s%   q))!,J***))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'   r1   z%Dependencies.parse.<locals>.<genexpr>   s0      IIay||(E1IIIIIIr)   )r   updater,   r-   r5   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   r5   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                   D    e Zd Z	 	 	 	 	 	 ddZd Zd Zd	dZd	dZd ZdS )
rm   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+   )rn   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  s/    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   rU   r)   r'   rm   rm      s         ! ! ! !&U U U  $ $ $ $   $ $ $ $ $r)   rm   )FFF).__doc__r   rI   r;   	itertoolsr   conda.base.contextr   	conda.clir   conda.common.iteratorsr   rr   r   conda.common.serializer   r	   conda.core.prefix_datar
   conda.deprecationsr   conda.exceptionsr   r   "conda.gateways.connection.downloadr   !conda.gateways.connection.sessionr   conda.historyr   conda.models.enumsr   conda.models.match_specr   conda.models.prefix_graphr   r4   rF   rQ   r   r   r   rH   r-   r   rm   rU   r)   r'   <module>r      s)   E D  				 				       & & & & & &       = = = = = = ) ) ) ) ) ) A A A A A A A A - - - - - - ) ) ) ) ) ) J J J J J J J J < < < < < < C C C C C C ! ! ! ! ! ! * * * * * * - - - - - - 1 1 1 1 1 1H
% % %P FF, , ," HME E E EP    1 1 1     4   <0$ 0$ 0$ 0$ 0$ 0$ 0$ 0$ 0$ 0$r)   