
    \Zi_                       % S r SSKJr  SSKJrJrJrJr  SSKJ	r	  SSK
Jr  SSKJr  SSKJr  SS	KJrJr  SS
KJrJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJ r   SSK!J"r"  SSK#J$r$  \(       a4  SSK%J&r&  SSK'J(r(  SSKJ)r)J*r*  SSKJ+r+J,r,J-r-J.r.  SSK/J0r0  SSK1J2r2  \*" S5      r3\" \45      r5Sr6S\7S'   \ " S S5      5       r8\" SS 9 " S! S"5      5       r9g#)$z)EXPERIMENTAL Conda environment data model    )annotations)	dataclassfieldfieldsreplace)reduce)chain)	getLogger)TYPE_CHECKING   )	PLATFORMSUNKNOWN_CHANNEL)contextvalidate_channels)NULL)groupby_to_dict)
PrefixData)CondaValueError)History)!get_package_records_from_explicit   )	MatchSpec)	Namespace)Iterable)FinalTypeVar)ChannelPriorityDepsModifierSatSolverChoiceUpdateModifier)PathType)PackageRecordTpipr   EXTERNAL_PACKAGES_PYPI_KEYc                  z   \ rS rSr% Sr\" \S9rS\S'   Sr	S\S'   \" \S9r
S\S	'   \" \S9rS
\S'   SrS\S'   \" \S9rS\S'   \" \S9rS\S'   \" \S9rS\S'   SrS\S'   SrS\S'   \" \S9rS\S'   SrS\S'   SrS\S'         S!S jr      S"S jrS#S jr\S$S j5       r\S%S j5       r\S&S j5       rS rg)'EnvironmentConfig-   z
**Experimental** While experimental, expect both major and minor changes across minor releases.

Data model for a conda environment config.
default_factoryztuple[str, ...]aggressive_update_packagesNzChannelPriority | Nonechannel_prioritychannelstuple[dict[str, str], ...]channel_settingszDepsModifier | Nonedeps_modifierdisallowed_packagespinned_packagesrepodata_fnszSatSolverChoice | None
sat_solver
str | Nonesolvertrack_featureszUpdateModifier | Noneupdate_modifierzbool | Noneuse_only_tar_bz2c           	     ^    [        [        R                  S [        X5       5       5      5      $ )Nc              3  $   #    U  H  ov   M     g 7fN ).0items     8lib/python3.13/site-packages/conda/models/environment.py	<genexpr>?EnvironmentConfig._append_without_duplicates.<locals>.<genexpr>R   s     "I4HD44Hs   )tupledictfromkeysr	   )selffirstseconds      r@   _append_without_duplicates,EnvironmentConfig._append_without_duplicatesO   s#     T]]"IE%4H"IIJJ    c                n    [        S [        X5      5      n[        S UR                  5        5       5      $ )zMerge channel settings.

An individual channel setting is a dict that may have the key "channels". Settings
with matching "channels" should be merged together.
c                $    U R                  S5      $ )Nchannel)get)xs    r@   <lambda>;EnvironmentConfig._merge_channel_settings.<locals>.<lambda>^   s    aeeI&rK   c           	   3     #    U  H7  u  pU VVVs0 s H  o3R                  5         H  u  pEXE_M	     M      snnnv   M9     g s  snnnf 7fr<   )items)r>   rN   configsconfigkvs         r@   rA   <EnvironmentConfig._merge_channel_settings.<locals>.<genexpr>a   sB      
$D  !(CfLLNDAQTNQCC$D Ds   A%A
A)groupbyr	   rC   rT   )rF   rG   rH   grouped_channel_settingss       r@   _merge_channel_settings)EnvironmentConfig._merge_channel_settingsT   s>     $+&e(<$
   
$<$B$B$D
 
 	
rK   c                   Uc  U $ [        XR                  5      (       d  [        S5      eU R                  U R                  UR                  5      U l        UR
                  b  UR
                  U l        U R                  UR                  U R                  5      U l        U R                  U R                  UR                  5      U l        UR                  b  UR                  U l	        U R                  U R                  UR                  5      U l
        U R                  U R                  UR                  5      U l        U R                  U R                  UR                  5      U l        UR                  b  UR                  U l        UR                  b  UR                  U l        U R                  U R                  UR                  5      U l        UR                   b  UR                   U l        UR"                  b  UR"                  U l        U $ )a  
**Experimental** While experimental, expect both major and minor changes across minor releases.

Merges an EnvironmentConfig into this one. Merging rules are:
* Primitive types get clobbered if subsequent configs have a value, otherwise keep the last set value
* Lists get appended to and deduplicated
* Dicts get updated
* Special cases:
  * channel settings is a list of dicts, it merges inner dicts, keyed on "channel"
  * channels: last wins for priority (prepended so later config's channels take precedence)
z9Cannot merge EnvironmentConfig with non-EnvironmentConfig)
isinstance	__class__r   rI   r+   r,   r-   r\   r/   r0   r1   r2   r3   r4   r6   r7   r8   r9   )rF   others     r@   _mergeEnvironmentConfig._mergef   s    =K %00!K  +/*I*I++U-M-M+
' !!-$)$:$:D!77V $ < <!!5#9#9!
 *!&!4!4D#'#B#B$$e&?&?$
   $>>  %"7"7 
 !;;u11
 '#..DO<<#,,DK"==!5!5
   ,#(#8#8D !!-$)$:$:D!rK   c                    [        U 5       Vs1 s H  oR                  iM     nn[        R                  R	                  5        VVs0 s H  u  p4X2;   d  M  X4_M     nnnU " S0 UD6$ s  snf s  snnf )z
**Experimental** While experimental, expect both major and minor changes across minor releases.

Create an EnvironmentConfig from the current context
r=   )r   namer   environment_settingsrT   )clsr   field_nameskeyvaluerf   s         r@   from_contextEnvironmentConfig.from_context   sv     06c{;{ezz{; &::@@B 
B
! CJB 	  

 *)** < 
s   A&A+A+c                    [        USS5      n[        US[        5      nU(       d  U(       d  U " 5       $ U(       a  SOSnU(       a  [        U5      OSnU(       a  [        XE-   5      OUnU " US9$ )z
Build a sparse EnvironmentConfig from CLI args for channels only.

Used to override channels from the CLI when files are provided.
rN   N	use_local)localr=   r-   )getattrr   rC   r   )rg   argsrN   rn   ro   arg_channelsr-   s          r@   from_cli_channels#EnvironmentConfig.from_cli_channels   s`     $	40D+t4	y5L'
R)0uW~b>J$U%9:PUH%%rK   c                b    U(       d  g[        U5      S:X  a  US   $ [        S USS US   5      $ )aO  
**Experimental** While experimental, expect both major and minor changes across minor releases.

Merges a list of EnvironmentConfigs into a single one. Merging rules are:
* Primitive types get clobbered if subsequent configs have a value, otherwise keep the last set value
* Lists get appended to and deduplicated
* Dicts get updated
Nr   r   c                $    U R                  U5      $ r<   )rb   )resultrV   s     r@   rQ   )EnvironmentConfig.merge.<locals>.<lambda>   s    6==#8rK   )lenr   )rg   rU   s     r@   mergeEnvironmentConfig.merge   sB      w<11: 8'!"+wqz
 	
rK   )r+   r,   r/   r-   r0   r1   r2   r3   r4   r6   r7   r8   r9   )rG   Iterable[T]rH   r}   returnztuple[T, ...])rG   r.   rH   r.   r~   r.   )ra   r'   r~   r'   )r~   r'   )rr   r   r~   r'   )rU   r'   r~   r'   )__name__
__module____qualname____firstlineno____doc__r   rC   r+   __annotations__r,   r-   r/   r0   r1   r2   r3   r4   r6   r7   r8   r9   rI   r\   rb   classmethodrk   rt   r{   __static_attributes__r=   rK   r@   r'   r'   -   s9    382NN/3,3 %e <Ho<383O0O)-M&-+0+GG',U'CO_C$)%$@L/@)-J&-FJ&+E&BNOB-1O*1$(k(K K*5K	K

/
9S
	#
$BH + + & && 
 
rK   r'   T)kw_onlyc                     \ rS rSr% SrS\S'    \" \S9rS\S'    \" \	S9r
S\S	'    \" \S9rS
\S'    SrS\S'    SrS\S'    \" \S9rS\S'    \" \	S9rS\S'    \" \S9rS
\S'   S r\S 5       r\SSSSS.               SS jj5       r\ S      S!S jj5       r\ S      S"S jj5       r\S#S j5       rS$S jrSrg)%Environment   z
**Experimental** While experimental, expect both major and minor changes across minor releases.

Data model for a conda environment.
strplatformr)   r'   rV   zdict[str, list[str]]external_packageszlist[PackageRecord]explicit_packagesNr5   re   prefixlist[MatchSpec]requested_packageszdict[str, str]	variablesvirtual_packagesc                h   U R                   (       d  [        S5      eU R                   [        ;  a   [        SU R                    S[         S35      e[        U R                  5      S:  aG  [        [        S U R                   5       5      5      [        U R                  5      :w  a  [        S5      e[        U R                  5      S:  ai  [        U R                  5      S:  aO  [        S	 U R                   5       5      nU R                   H"  nUR                  U;  d  M  [        S
U S35      e   g g g )Nz!'Environment' needs a 'platform'.zInvalid platform 'z'. Valid platforms are .r   c              3  8   #    U  H  oR                   v   M     g 7fr<   re   r>   pkgs     r@   rA   ,Environment.__post_init__.<locals>.<genexpr>  s     ;$:S$:   z0Duplicate packages found in 'explicit_packages'.r   c              3  8   #    U  H  oR                   v   M     g 7fr<   r   r   s     r@   rA   r   %  s     (T=Sc=Sr   zRequested package 'z&' is not found in 'explicit_packages'.)r   r   r   rz   r   setr   re   )rF   explicit_package_namesrequested_packages      r@   __post_init__Environment.__post_init__  s   }}!"EFF ==	)!$T]]O3J9+UVW 
 t%%&*s;D$:$:;;0
''(0) ""TUU t&&'!+D4J4J0Ka0O%((TT=S=S(T%T"%)%<%<!$))1GG)-.?-@@fg  &= 1P+rK   c                   SnSnSnU Vs/ s H!  oUR                   (       d  M  UR                   PM#     nnU Vs/ s H!  oUR                  (       d  M  UR                  PM#     nnU(       a*  US   n[        U5      S:  a  [        R	                  SXb5        U(       a*  US   n[        U5      S:  a  [        R	                  SXs5        U Vs/ s H!  oUR
                  (       d  M  UR
                  PM#     nn[        [        U5      5      S:w  a  [        SU 35      eUS   n[        [        R                  S U 5       5      5      n	[        [        R                  S	 U 5       5      5      n
[        [        R                  S
 U 5       5      5      nU VVVs0 s H1  oUR                  =(       d    0 R                  5         H  u  pX_M	     M3     nnnn0 nU H  nUR                  =(       d    0 R                  5        H_  u  p[        U[        5      (       d  M  X;   a1  U Vs/ s H  nUX   ;  d  M  UPM     nnX   R                  U5        MR  [        U5      X'   Ma     M     [         R"                  " U Vs/ s H  oUR$                  c  M  UR$                  PM     sn6 nU " UUU
UUUU	UUS9	$ s  snf s  snf s  snf s  snnnf s  snf s  snf )a-  
**Experimental** While experimental, expect both major and minor changes across minor releases.

Merges multiple environments into a single environment following the rules:
* name, prefix: last wins (later env overrides earlier).
* platform: must match across all envs.
* requested_packages, explicit_packages, virtual_packages: union, deduplicated.
* variables: merged dict, last value wins per key.
* external_packages: concatenation per key (union of lists, deduplicated).
* config: EnvironmentConfig.merge (last wins for primitives, append for lists).
Nr   z,Several names passed %s. Picking last one %sz/Several prefixes passed %s. Picking last one %sz_Conda can not merge environments of different platforms. Received environments with platforms: r   c              3  N   #    U  H  nUR                     H  nUv   M	     M     g 7fr<   r   r>   envrequirements      r@   rA   $Environment.merge.<locals>.<genexpr>T  s*      'C#&#9#9K #9 '   #%c              3  N   #    U  H  nUR                     H  nUv   M	     M     g 7fr<   r   r   s      r@   rA   r   \  s*      'C#&#8#8K #8 'r   c              3  N   #    U  H  nUR                     H  nUv   M	     M     g 7fr<   )r   )r>   r   virtual_packages      r@   rA   r   d  s*      'C'*';';O  ';  'r   )	rV   r   r   re   r   r   r   r   r   )re   r   rz   logdebugr   r   r   listrD   rE   r   rT   r   r_   extendr'   r{   rV   )rg   environmentsre   r   r   r   namesprefixes	platformsr   r   r   rW   rX   r   r   r   new_pkgsrV   s                      r@   r{   Environment.merge,  s    %1>\cXX\>*6E,3**JCJJ,E9D5zA~		H%Vb\F8}q 		Ex .:J\c\\\S\\\	Js9~!#!99BE  Q<!MM ' 
 !MM ' 
  MM ' 
 )
(S8K7R7R7TVaAD7TAL 	 
 C..4";;=!!T**)/0TqC?P?S4SqHT%(//9+/7%( >   #(($0KLSJJjcjjLK
 //1-

 
	
E ?E K@
  U Ls?   J*J*J/J/	J4!J48J9K .K 4KKF)from_history	no_buildsignore_channelsr-   c                 ^^ [        USS9nUR                  5       n	/ n
0 nUR                  5       nU(       a  U R                  U5      n
/ nOUR	                  5       nU H  nU(       a  UR
                  OUR                  nU(       dG  UR                  (       a6  UR                  R                  (       a  UR                  R                   SU 3nU
R                  [        U5      5        M     U(       a4  U Vs/ s H  nUR                   SUR                   3PM      nnUU[        '   U Vs/ s H  nUR                  PM     snm[        U4S jUR                  5        5       5      n[        U=(       d    S5      nU(       d  / U4S jU 5       QUQ7n[        [         R#                  U5      5      n[$        R'                  5       n[)        UUS9nU " UUUUU	UU
US	9$ s  snf s  snf )
ak  
Create an Environment model from an existing conda prefix.

This method analyzes an installed conda environment and creates
an Environment model that can be used for exporting or other operations.

:param prefix: Path to the conda environment prefix
:param name: Name for the environment
:param platform: Target platform (e.g., 'linux-64', 'osx-64')
:param from_history: Use explicit specs from history instead of installed packages
:param no_builds: Exclude build strings from package specs
:param ignore_channels: Don't include channel information in package specs
:return: Environment model representing the prefix
T)interoperabilityz::z==c              3  L   >#    U  H  nUR                   T;  d  M  Uv   M     g 7fr<   r   )r>   r   python_precs_namess     r@   rA   *Environment.from_prefix.<locals>.<genexpr>  s'      !
1xx11 C1s   $	$r=   c              3  l   >#    U  H)  nUR                   R                  =m[        :w  d  M%  Tv   M+     g 7fr<   )rN   canonical_namer   )r>   conda_packager   s     r@   rA   r     s8       *5*7*?*?*N*NN&' #N)4s   $4	4rp   )r   r   re   rV   r   r   r   r   )r   get_environment_env_varsget_python_packagesr   get_conda_packagesspec_no_buildspecrN   re   appendr   versionr%   r   iter_recordsrC   rD   rE   r'   rk   r   )rg   r   re   r   r   r   r   r-   prefix_datar   r   r   python_precsconda_precs
conda_precspec_strpython_precpython_depsr   r   environment_channelsrV   r   r   s                         @@r@   from_prefixEnvironment.from_prefix  s   4 !$?88:	  "668 !$!1!1&!9K &88:K *
7@:33joo ("**"**//","4"4"9"9!:"XJGH")))H*=> *  (4'3 #''(;+>+>*?@'3   AL!"<= 3??,3chh,?  !
"//1!
 
  %X^4 	$ *5	$ &	$   %T]]3G%HI #//1 *>?/1/	
 		
S @s   7%G+G!c                ,    U R                  X5      u  p4U$ )aj  
Create an Environment model from command-line arguments.

This method will parse command-line arguments and create an
Environment object. This includes: reading files provided as
cli arguments, and pulling EnvironmentConfig from the context.

:param args: argparse Namespace containing command-line arguments
:return: An Environment object representing the cli
)from_cli_with_file_envs)rg   rr   add_default_packagesr   _s        r@   from_cliEnvironment.from_cli  s      ,,TH
rK   c           
     L   UR                    Vs/ s H  o3R                  S5      PM     nn/ n/ n/ n0 nUR                   Hi  n	[        R                  R                  U	[        R                  S9n
U
R                  U	5      nUR                  UR                  5        UR                  X'   Mk     U(       a  U Vs1 s H  n[        U5      R                  iM     nnUU VVs1 s H2  n/ UR                  QUR                  Q7  H  nUR                  iM     M4     snn-  n[        R                   H/  n[        U5      R                  U;  d  M  UR                  U5        M1     U HH  n[        U5      =nR                  S5      (       a  UR                  U5        M7  UR                  U5        MJ     [!        S U 5       5      =(       d    [#        U5      n[!        S U 5       5      =(       d    [#        U5      nU(       a  U(       a  [%        S5      e/ nU(       a  ['        U5      n[)        [        R*                  [,        R/                  5       S9n[)        UR                  [        R0                  [        R*                  UU[,        R3                  U5      S9nU(       a#  U R4                  " U6 nU R5                  UUU5      nOU R5                  UU5      n[7        US	S
5      (       a0  [9        U[9        UR:                  UR:                  R<                  S9S9nUU4$ s  snf s  snf s  snnf )a  
Create an Environment model from command-line arguments, with a map
of file path to Environment for each environment file specified.

:param args: argparse Namespace containing command-line arguments
:return: Tuple of (merged Environment, dict mapping file path to Environment)
z"')sourcere   urlc              3  8   #    U  H  oR                   v   M     g 7fr<   r   r>   r   s     r@   rA   6Environment.from_cli_with_file_envs.<locals>.<genexpr>=  s     KNS00Nr   c              3  8   #    U  H  oR                   v   M     g 7fr<   r   r   s     r@   rA   r   @  s     I.3...r   zCannot combine package names with explicit package lists. Package names (python, numpy) are resolved by the solver; explicit files and URLs are installed directly. Use only package names, or only explicit files/URLs.)r   rV   )re   r   r   r   r   rV   override_channelsFrp   )rV   )packagesstripfiler   plugin_managerget_environment_specifierenvironment_specifierenvironment_specr   r   r   re   r   r   create_default_packagesrO   anyboolr   r   r   subdirr'   rk   target_prefixrt   r{   rq   r   rV   r-   )rg   rr   r   packagespecsr   fetch_explicit_packagesenvs_from_filefpath_envs_mapfpath	spec_hookr   r   r   r   default_package
match_spechas_explicit	has_specsr   base_envcli_envfile_envmergeds                           r@   r   #Environment.from_cli_with_file_envs  s    6:]]C]'u%]C"$YYE..HH22 I I --e4D!!$((+$(HHN!   6;<edYt_))eE<))CLS22LS5K5KLC L ) E
 $+#B#B_-22%?LL1 $C D'o-
22599'..t4"))*5	  KNKK 
t#P
 I.II 
TN
	 I!G  " A'! ^^,=,J,J,L
 ((^^1/$66t<
 yy.1HYYx7;F YYx1F
 4,e44wv}}w~~?V?VWF ~%%i D& =s   L7L9L c                j    [        U 5      nUR                  5       n[        UR                  5       5      $ r<   )r   get_requested_specs_mapr   values)r   historyspec_maps      r@   r   Environment.from_historyo  s+    &/224HOO%&&rK   c                   XR                   :X  a  U $ SSKJn  [        R                  R                  5       nU R                  U R                  5      nU" U R                  R                  0 5       H?  nU nU" SU R                  R                  US4UUSS9nUR                  5       nSSS5        MA     [        U R                  U R                  UU R                  UWU R                  S9$ ! , (       d  f       M  = f)	zT
Given the current environment, extrapolate the environment for the given platform.
r   )	Repodatasz/env/does/not/existnoarchcreate)r   r-   subdirsspecs_to_addrepodata_fncommandN)r   re   r   rV   r   r   r   )r   cli.installr  r   r   get_cached_solver_backendr   r   rV   r3   r-   solve_final_stater   re   r   )	rF   r   r  solver_backendr   repodata_managerr  r6   r   s	            r@   extrapolateEnvironment.extrapolatev  s     }}$K+ //IIK!..t{{; )$++*B*BB G!['0![[11%x0!3 +$ %+$<$<$>! "! !H ;;;;1/"44
 	
 "!s   32C((
C7	r=   )r   r   re   r   r   r   r   r   r   r   r   r   r-   zlist[str] | Noner~   r   )F)rr   r   r   r   r~   r   )rr   r   r   r   r~   z*tuple[Environment, dict[str, Environment]])r   r!   r~   r   )r   r   r~   r   )r   r   r   r   r   r   r   r'   rV   rD   r   r   r   re   r   r   r   r   r   r   r{   r   r   r   staticmethodr   r  r   r=   rK   r@   r   r      s    MG %6G HFH /4D.I+IW-24-H*H
 D*FJ3*/*EE4 %d ;I~;A -2$,G)G4 [
 [
z  # %%)l
l
 l
 	l
 l
 l
 l
 #l
 
l
 l
\  &+ # 
	 $  &+`&`& #`& 
4	`& `&D ' '
rK   r   N):r   
__future__r   dataclassesr   r   r   r   	functoolsr   	itertoolsr	   loggingr
   typingr   base.constantsr   r   base.contextr   r   common.constantsr   common.iteratorsr   rZ   core.prefix_datar   
exceptionsr   r  r   miscr   r   r   argparser   collections.abcr   r   r   r   r   r   r    common.pathr!   recordsr"   r#   r   r   r%   r   r'   r   r=   rK   r@   <module>r'     s    0 " 9 9      7 5 # 9 ) (  4 !"(%  '&A %* E ) v
 v
 v
r 4m
 m
 m
rK   