
    c)                       d Z ddlmZ ddlZddlmZmZ ddlZddlmZ ddl	m
Z
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 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(m)Z)m*Z* ddl+m,Z, ddl-m.Z.m/Z/m0Z0 ddl1m2Z2 ddl3m4Z4 ddl5m6c m7Z7 ddl8m6c m9Z9 ddl:m6c m;Z; ddl<m=Z> ddl?m@Z@ dZAdZBdZCdZDdZEeAeBeCeDeEfZF G d deG          ZHd  ZId)d!ZJd" ZKd# ZLd$ ZM G d% d&eG          ZN G d' d(eG          ZOdS )*z/Project class representing a project directory.    )absolute_importN)deepcopycopy)join)EnvSpec_anaconda_default_env_spec_find_importable_spec!_find_out_of_sync_importable_spec_empty_default_env_spec)RequirementsRegistry)EnvVarRequirement)CondaEnvRequirement)DownloadRequirement)ServiceRequirement)ProjectCommandall_known_command_attributes)ProjectFile)ProjectLockFile)0_list_relative_paths_for_unignored_project_files)__version__)CondaLockSet)_null_frontend_new_error_recorderFrontend)CommentedMap)	is_stringis_listis_dict)SimpleStatus)slugify)plugins)add_projectignore_if_noneconda_app_entryunixwindowsnotebook	bokeh_appc                   J    e Zd ZdZ	 	 	 	 	 	 	 ddZed             Zd Zd ZdS )	ProjectProblemz.A possibly-autofixable problem with a project.NFc	                     || _         ||| _        n)t          j                            |          d|| _        || _        || _        || _        || _        || _	        || _
        || _        dS )zCreate a project problem.Nz: )text_without_filenametextospathbasename
fix_promptfix_functionno_fix_functiononly_a_suggestionmaybe_filenamemaybe_line_numbermaybe_column_number)	selfr,   filenamer0   r1   r2   r3   line_numbercolumn_numbers	            8lib/python3.11/site-packages/anaconda_project/project.py__init__zProjectProblem.__init__7   s     &*" 	FDII$&G$4$4X$>$>$>$>EDI$(.!2&!,#0       c                     | j         duS )z&True if the problem can be auto-fixed.Nr1   r7   s    r;   can_fixzProjectProblem.can_fixN   s      ,,r=   c                 >    | j         |                      |          S dS )zPerform the auto-fix.Nr?   r7   projects     r;   fixzProjectProblem.fixS   s&     	$$W---4r=   c                 >    | j         |                      |          S dS )z&Take an action on deciding not to fix.N)r2   rC   s     r;   no_fixzProjectProblem.no_fixZ   s&     	''0004r=   )NNNNFNN)	__name__
__module____qualname____doc__r<   propertyrA   rE   rG    r=   r;   r)   r)   5   s~        88  "!%#(!#1 1 1 1. - - X-      r=   r)   c                     g }| D ]P}t          |t                    r|                    |           -|                    t          |                     Q|S )Nr,   )
isinstancer)   append)problemsnew_problemsps      r;   _make_problems_into_objectsrU   d   sg    L 8 8a(( 	8""""A 6 6 67777r=   c                 \    |                      t          ||j        ||                     d S )Nr,   r8   r0   r1   )rQ   r)   r8   )rR   	yaml_filer,   r0   r1   s        r;   _file_problemrY   n   s?    OOD9+=*copppr r r r rr=   c                     d|                                 v rt          ||          }|                                 D ]3}||vr-|                    t          d|z  | j        d                     4d S )Nuser_fieldszUnknown field name '%s'Tr,   r8   r3   )keys_add_user_fieldsrQ   r)   r8   )project_filerR   	yaml_dictknown_fieldskeys        r;   _unknown_field_suggestionsrc   s   s    	((( A'	<@@~~ 8 8l" 	8OO$=$E(4(=157 7 78 8 88 8r=   c                 v    t          | d                   }|                    d           ||g}d |D             S )Nr[   c                     g | ]	}|D ]}|
S rM   rM   ).0subis      r;   
<listcomp>z$_add_user_fields.<locals>.<listcomp>   s%    ***#c**A****r=   )r   rQ   )r`   ra   r[   alls       r;   r^   r^   ~   sF    9]344K}%%%
%C******r=   c                 T    | D ]$}t          |t                    s dS |j        s dS %dS )NTF)rP   r)   r3   )rR   rT   s     r;   _fatal_problemrl      sF      !^,, 	44" 	44	5r=   c                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdS )_ConfigCachec                 @   || _         |t                      }|| _        d | _        d| _        d | _        t                      | _        d | _        d| _	        d| _
        t                      | _        t                      | _        d| _        d | _        d | _        || _        d S )N r   F)directory_pathr   registrynamedescriptionicondictcommandsdefault_command_nameproject_file_countlock_file_count	env_specs	lock_setslocking_globally_enableddefault_env_spec_nameglobal_base_env_spec
must_exist)r7   rq   rr   r   s       r;   r<   z_ConfigCache.__init__   s    , 	.+--H 		$(!"# (-%%)"$(!$r=   c                 &    |j          j        k    r|j          j        k    rd S |j          _        |j          _        t                      }g } fd}t          j                             j                  }|s|                    d j        z             n} j	        rvt          j        
                    |j                  sR|                    t          dt          j                            |j                  z  d|j        z  |                     |j        r=|                    t          d|j        z  |j        |j        |j                             |j        r=|                    t          d|j        z  |j        |j        |j                             |r6|j        s.|j        s&t%          |||j        d           t%          |||j        d	                                ||                                ||                                ||                                ||                                |||                                |||                                |||                                |||                                |||                                |||                                ||           | _        tA          |           _!        tE          d
  j!        D                        _#        d S )Nc                     d_         d S NF)r   )rD   r7   s    r;   accept_project_creationz4_ConfigCache.update.<locals>.accept_project_creation   s    #DOOOr=   z&Project directory '%s' does not exist.z!Project file '%s' does not exist.zCreate file '%s'?)r,   r0   r1   zSyntax error: %s)r,   r8   r9   r:   )rs   rt   ru   	variables	downloadsservicesr{   rw   packagesdependencieschannels	platformsskip_imports)r{   locking_enabledc                 *    g | ]}|j         	|j        S rM   )r3   r,   rf   rT   s     r;   ri   z'_ConfigCache.update.<locals>.<listcomp>   s"    $^$^$^!J]$^QV$^$^$^r=   )$change_country   rz   rv   r-   r.   isdirrq   rQ   r   isfiler8   r)   r/   	corruptedcorrupted_error_messagecorrupted_maybe_linecorrupted_maybe_columnrc   root_update_name_update_description_update_icon_update_lock_sets_update_env_specs_update_variables_update_downloads_update_services_update_conda_env_requirements_update_commands_verify_command_dependenciesrequirementsrU   rR   listproblem_strings)r7   r_   	lock_filer   rR   r   project_existss   `      r;   updatez_ConfigCache.update   sw   $(?? 	&$*>>	F".";(5vv	$ 	$ 	$ 	$ 	$ t':;; 	FOODtGZZ[[[[_ 	FRW^^L4I%J%J 	FOO$G"'JZJZ[g[pJqJq$q*=@U*U,CE E EF F F
 ! 	SOO%7<;_%`(4(=+7+L-9-PR R RS S S  	POO%79;\%](1(:+4+I-6-MO O OP P P  	F<#9 	FY=P 	F&h(9VW W W
 'y(INLlmmmh555$$X|<<<h555""8Y777""8\9EEE""<<HHH""<<HHH!!,,GGG //hUUU !!(L,GGG--hEEE(3H==#$^$^T]$^$^$^__r=   c                    t           j                            | j                  d|j        vr3fd}|                    t          d|j        dz  |                     |                    dd           }|^t          |          st          ||d|z             d }n8t          |                                          dk    rt          ||d           d }|}|| _        d S )	Nrs   c                 >    | j                             d           d S )Nrs   r_   	set_value)rD   default_names    r;   set_name_fieldz1_ConfigCache._update_name.<locals>.set_name_field   s"    $..v|DDDDDr=   zThe 'name:' field is missing.zName the project '%s'?rW   z-name: field should have a string value not %rr   z1name: field is an empty or all-whitespace string.)r-   r.   r/   rq   r   rQ   r)   r8   	get_valuer   rY   lenstriprs   )r7   rR   r_   r   rs   r   s        @r;   r   z_ConfigCache._update_name   s#    w''(;<<** 		=E E E E E OO$C(4(=+Cl+R,:< < <= = = %%fd33 	T?? h6ehl6lmmmTZZ\\""a' h6ijjj 	 D			r=   c                     |                     dd           }|%t          |          st          ||d|z             d }|d}|| _        d S )Nrt   z4description: field should have a string value not %rrp   )r   r   rY   rt   )r7   rR   r_   descs       r;   r   z _ConfigCache._update_description
  se    %%mT:: 	IdOO 	(L2hko2opppD 	Dr=   c                 N   |                     dd           }|%t          |          st          ||d|z             d }|^t          j                            | j        |          }t          j                            |          s|                    d|z             d }|| _	        d S )Nru   z-icon: field should have a string value not %rzIcon file %s does not exist.)
r   r   rY   r-   r.   r   rq   r   rQ   ru   )r7   rR   r_   ru   s       r;   r   z_ConfigCache._update_icon  s    %%fd33 	IdOO 	(L2aei2jkkkD 	7<< 3T::D7>>$''  > EFFF			r=   c                 l    |j         |vr
g ||j         <   ||j                                      |           d S N)rs   rQ   )r7   r   env_specrequirements       r;   _add_requirementz_ConfigCache._add_requirement#  s>    =, 	-*,L'X]#**;77777r=   c                     |                     |          } ||||| j        |           | j                                        D ]/}|                     d|j        |gd           } ||||||           0d S Nr{   )r   r   r{   valuesrs   )	r7   r   rR   r_   	dict_nameupdaterglobal_dictr   env_dicts	            r;   _update_requirementsz!_ConfigCache._update_requirements)  s    ",,Y77hd6OQ\]]]--// 	N 	NH#--{HM9.UW[\\HGL(L(HMMMM	N 	Nr=   c                 B    |                      |||d| j                   d S )Nr   )r   _update_variables_for_env_specr7   r   rR   r_   s       r;   r   z_ConfigCache._update_variables0  7    !!,,"&"E	G 	G 	G 	G 	Gr=   c                 B    |                      |||d| j                   d S )Nr   )r   _update_downloads_for_env_specr   s       r;   r   z_ConfigCache._update_downloads4  r   r=   c                 B    |                      |||d| j                   d S )Nr   )r   _update_services_for_env_specr   s       r;   r   z_ConfigCache._update_services8  s(    !!,,
TXTvwwwwwr=   c                 &   fd}|d S t          |          r|                                D ]} ||          r|                                dk    r%t          d                    |                     K||         }|i }	n/t          |          rt          |          }	nt          |          }	t          |	t                    sJ t          j	        |	|          r2| j
                            ||	          }
|                     |||
           d S t          |          r|D ]}t          |          r|                                dk    r%t          d                    |                     N ||          rZ| j
                            |t                                }
|                     |||
           t          d                    |                     d S t          d                    |	                     d S )
Nc                 <    | dv rt          d| z             dS dS )N)CONDA_DEFAULT_ENVCONDA_ENV_PATHCONDA_PREFIXzaEnvironment variable %s is reserved for Conda's use, so it can't appear in the variables section.TF)rY   )rb   rR   r_   s    r;   check_conda_reservedzI_ConfigCache._update_variables_for_env_spec.<locals>.check_conda_reserved<  sC    MM h 8fil7m n n ntur=   rp   z9Variable name cannot be empty string, found: '{}' as namedefault)optionszSvariables section should contain environment variable names, {item} is not a string)itemz[variables section contains wrong value type {value}, should be dict or list of requirements)value)r   r]   r   rY   formatr   rv   rP   r   _parse_defaultrr   find_requirement_by_env_varr   r   r   )r7   r   rR   r_   r   r   r   rb   raw_optionsr   r   r   s     ``        r;   r   z+_ConfigCache._update_variables_for_env_spec;  s   	 	 	 	 	 	  .	&DY ,	& ~~'' O O'',, 99;;"$ !(L"]"d"deh"i"ik k k'n 8 GG[)) 8&{33GG";777G"7D11222$3GS(KK O"&-"K"KCQX"Y"YK)),+NNN)O O, Y 	&! ) )T?? )zz||r) !%h&a&h&him&n&np p p ++D11 ! "&-"K"KDZ^Z`Z`"K"a"aK)),+NNNN! ,nuu!% v ' ') ) ) )) )" ,mtt# u % %& & & & &r=   c           	         |d S t          |          s3t          ||d                    t          |                               d S |                                D ]\  }}|                                dk    r%t          ||d                    |                     Bt          j        |||          }|[t          | j        fi |}	| 	                    |||	           d S )Nz5'downloads:' section should be a dictionary, found {}rp   z9Download name cannot be empty string, found: '{}' as name)
r   rY   r   repritemsr   r   _parserr   r   )
r7   r   rR   r_   r   r   varnamer   download_kwargsr   s
             r;   r   z+_ConfigCache._update_downloads_for_env_specw  s    	Fy!! 	(LQXXY]^gYhYhiik k kF&__.. 
	G 
	GMGT}}"$ hY``ahiik k k18$QQO -dmOOOOK!!,+FFFF
	G 
	Gr=   c           	         |d S t          |          s3t          ||d                    t          |                               d S |                                D ]\  }}|                                dk    r%t          ||d                    |                     Bt          j        |||          }|[|d         }	 | j        j	        di |s*|
                    d                    ||	                      | j        j        di |}
t          |
t                    sJ d|
j        v sJ |                     |||
           d S )Nz^'services:' section should be a dictionary from environment variable to service type, found {}rp   z8Service name cannot be empty string, found: '{}' as nameservice_typez$Service {} has an unknown type '{}'.typerM   )r   rY   r   r   r   r   r   r   rr   $can_find_requirement_by_service_typerQ    find_requirement_by_service_typerP   r   r   )r7   r   rR   r_   r   r   r   r   service_kwargsr   r   s              r;   r   z*_ConfigCache._update_services_for_env_spec  s    	Fx   	(L45;VDNN5K5KM M M F%^^-- 	G 	GMGT}}"$ hX__`ghhj j j/6whOON ).9LE4=EWWWW  F M MgWc d deeeH$-HZZ>ZZKk+=>>>>>[00000!!,+FFFF%	G 	Gr=   c                    |                     |g           }t          |          st          |||d|d|d           g g fS g }g }	|D ]t}
t          |
          r(|                    |
                                           9 ||
          r|	                    |
           Zt          |||d|d|
d           u||	fS )Nz: value should be a list of zs, not ''z: value should be a z (as a string) not ')getr   rY   r   rQ   r   )r7   rR   rX   parent_dictrb   whatspecial_filterr   cleanedspecialr   s              r;   _parse_string_list_with_specialz,_ConfigCache._parse_string_list_with_special  s   R((u~~ 	(I`c`c`ceieieikpkpkp/qrrr8O 	g 	gD gtzz||,,,,%% gt$$$$h	TWTWTWY]Y]Y]_c_c_cdg g g g!!r=   c                 F    |                      |||||d           d         S )Nc                     dS r   rM   xs    r;   <lambda>z1_ConfigCache._parse_string_list.<locals>.<lambda>  s    U r=   )r   r   )r   )r7   rR   rX   r   rb   r   s         r;   _parse_string_listz_ConfigCache._parse_string_list  sB    33H4=4?4748CR? 4 T T
 UVW 	Wr=   c                     |                      |||dd          }t          j        |          \  }}}|D ]/}|                    t	          d|z  |j        d                     0|D ]}t          ||d|z             |S )Nr   zplatform namezXUnusual platform name '%s' may be a typo (more usual examples: linux-64, osx-64, win-64)Tr\   zHPlatform name '%s' is invalid (valid examples: linux-64, osx-64, win-64))r   	conda_apivalidate_platform_listrQ   r)   r8   rY   )	r7   rR   rX   r   r   unknowninvalidurh   s	            r;   _parse_platformsz_ConfigCache._parse_platforms  s    ++Hik[jkk	(1(H(S(S%GW 	- 	-AOOt&/&*	, , ,- - - -  	j 	jA(Idghhj j j jr=   c                 l   |                      ||||dd           \  }}|D ],}t          j        |          }|t          ||d|z             -g }	|D ]0}
|                     |||
dd          }|	                    |           1|	D ],}t          j        |          }|t          ||d|z             -||	fS )Nzpackage namec                 (    t          |           od| v S )Npip)r   r   s    r;   r   z._ConfigCache._parse_packages.<locals>.<lambda>  s    7ST::Kf[`de[e r=   z!invalid package specification: %sr   zpip package namez!invalid pip package specifier: %s)r   r   
parse_specrY   r   extendpip_api)r7   rR   rX   rb   r   deps	pip_dictsdepparsedpip_depspip_dictpip_lists               r;   _parse_packagesz_ConfigCache._parse_packages  s    @@9VacfhvAfAfh hy 	` 	`C)#..F `h	3VZ]3^___ ! 	& 	&H..xHeUghhHOOH%%%% 	` 	`C',,F `h	3VZ]3^___hr=   c           	      t   t                      | _        d| _        |                    dgd          }t	          |t
                    st          ||d|z             n|| _        |                    dgi           }t          |          s3t          ||d                    t          |                               d S |
                                D ]\  }}t          |          st          ||d|d|           -t          |||d	           |                    d
| j                  }t	          |t
                    st          ||d|d|           |                    dd           }|'t          |          st          ||d|d|           |                     |||          }t                      }	|                    di           }
t          |
          st          ||d|d|
           )|
                                D ]}t!          |          }|                     ||||
          \  }}t!          |          |k    r@t!          |          dk    r-|                    t'          d|z  |j        d                     ||	|<   t+          |	||          }||_        || j        |<   d S )NFr   Tz;Value for locking_enabled should be true or false, found %rr{   zj'env_specs:' section in lock file should be a dictionary from env spec names to lock information, found {}zField 'z:' in env_specs in lock file should be a dictionary, found )r   r   r   lockedenv_spec_hashr
  zValue for locked for env spec 'z!' should be true or false, found r  z&Value for env_spec_hash for env spec 'z' should be a string, found r   z!'packages:' section in env spec 'z-' in lock file should be a dictionary, found r   zFenv spec '%s': pip dependencies are currently ignored in the lock filer\   )package_specs_by_platformr   enabled)rv   r|   r}   r   rP   boolrY   r   r   r   r   rc   r   r   r   r]   r   r  rQ   r)   r8   r   r  )r7   rR   r   r  r|   rs   lock_setr  r   conda_packages_by_platformpackages_by_platformplatformprevious_problem_countr  r  lock_set_objects                   r;   r   z_ConfigCache._update_lock_sets  sx   (-%%%'8&94@@'4(( 	4(I/lov/vwwww,3D)''r::	y!! 	(I 1_`f`fgklugvgv`w`wy y yF ) 1 1 =	3 =	3T88$$ ii_c_c_cememnp p p &y(H'km m m ll8T-JKKGgt,, h		hlhlhlnunuvx x x$LL$??M  =1I1I ii`d`d`dfsfstv v v --h	8LLI)-&#+<<
B#?#? /00 iiTT//12 2 2 05577 < <),X&#'#7#7)XWk#l#l xx==#99 x==1$ @ OO&,t'+-,090B9=? ? ?@ @ @ 8<*844*E_5>3:< < <O -:O)#2DN4  {=	3 =	3r=   c                    01234  fd00fd} fd} fd} |j                   \  }} |j                   }	 |j                   }
t          dt          dg fdg fg          fg          }                    d|	          }d }d
}d
}t          d |||	|
ddd           _        t                      2|d}nt          |          rt          |          dk    rd}|                                D ]\  }}|	                                dk    r%t          d                    |                     C|                    dd           }|4t          |          s%t          d                    |                     t                    }|                    dd           }|g }n2t          |          r|	                                g}n 0|dd          }t                    |k    r ||          \  }} ||          } ||          } j                            |d           }|$t          t                      g  j        d          }t          ||||||t#          |          d|	  	        2|<   ||}t%          |d           nt          d|z             t                       _        24 fd42                                D ]} 4|g            | j        v sJ g }d} j                                        D ]Q}|j        j        r|dz  }|j        j        r2t          |j                  dk    r|                    |j                   R|dk    rt7          j                    1t          |          }||k    r01fd}t          ddd                    1          z  |            nMt=          |          D ]=}1fd!} t          d"|z  dd                    1          z   | |                      > j                                        D ]}|j        j        r|j        j         }!|!K|!|j!        k    r@d#|j        d$|!d%|j!        d&}"                    tE          |"|j#        d'                     |j        |j        j        k    rt          |j        j                  dk    r'd#|j        d(d)                    |j                  d*}"nFd#|j        d(d)                    |j                  d+d)                    |j        j                  d,}"                    tE          |"|j#        d'                     t          |j$                  dk    rN|j        j        D ]@}#|j        %                    |#          }$t          |$          dk    r8d-|j        d.|#}"                    tE          |"|j#        d'                     htM                      }%|$D ]2}&t7          j'        |&          }'|'|%(                    |'j                   3|j)        |%z
  }(t          |(          dk    rxd/t          |(          d0|j        d1|#d2d)                    t=          tU          |(                              d&	}"                    tE          |"|j#        d'                     B j                                        D ]B}| j        vr7d3|d4j+        }"                    tE          |"|j#        d'                     CtY           j                                         j-                  \  3})3$                    d5d6g          }*|*3j!        k    rd 33 j                            3j                  }+3|+3.                    |+          rd 33|+dd73j        d8|)d9t^          j0        +                    j#                  d:}"d;3j        d%t^          j0        +                    j#                  d<},nVd73j        d8|)d=t^          j0        +                    j#                  d>31                    |+          }"d?3j        d@|)d<},3fdA}-3fdB}.                    tE          |"|,|-|.C                     n	|s|r fdD}/d j        v r	d _2        d S | _2        d S )ENc                 6                         | ||          S r   )r   )r   rb   r   rR   r_   r7   s      r;   r   z:_ConfigCache._update_env_specs.<locals>._parse_string_list7  s!    **8\;PSUYZZZr=   c                      | dd          S )Nr   zchannel namerM   )r   r   s    r;   _parse_channelsz7_ConfigCache._update_env_specs.<locals>._parse_channels:  s    %%k:~NNNr=   c                 2                         |           S r   )r   )r   rR   r_   r7   s    r;   r   z8_ConfigCache._update_env_specs.<locals>._parse_platforms=  s    ((<MMMr=   c                 f                         d          rdnd}                    ||           S )Nr   r   )r   r  )r   pkg_keyrR   r_   r7   s     r;   r  z7_ConfigCache._update_env_specs.<locals>._parse_packages@  s<     )5(>(>~(N(N^nnT^G'',UUUr=   r   r   r   r{   r   FzGlobal packages and channelsrM   )rs   conda_packagespip_packagesr   r   rt   inherit_from_namesinherit_fromTr   rp   zAEnvironment spec name cannot be empty string, found: '{}' as namert   z6'description' field of environment {} must be a stringr  zenv spec name)r  r   r  missing)	rs   r  r  r   r   rt   r  r  r  )	r   r   r   r   rt   r  r   r   r   zXenv_specs should be a dictionary from environment name to environment attributes, not %rc                    | v sJ | j         vrd}| |v rFt          	
d                    d                    t	          |                                         d}|                    |            |          }|sX|d         }|D ]M}|vr,t          	
d                    ||d                              2 ||          }|d         |fz   |d<   N|d         d	k    rj        f|d<   t          d	i |j         | <   j         |          S )
NFzK'inherit_from' fields create circular inheritance among these env specs: {}, Tr  z\name '{}' in 'inherit_from' field of env spec {} does not match the name of another env specrs   r  rM   )r{   rY   r   r   sortedrQ   r   r   )rs   trail	was_cycleattrsr  parentr  env_spec_attrsmake_env_specrR   r_   r7   s          r;   r)  z5_ConfigCache._update_env_specs.<locals>.make_env_spec  s   >))))4>) 8!	5= %!(L#p#w#w&*iiu&>&>$@ $@B B B !%IT"""&t,  	])./C)D&"4 ] ]!7 ])(L,JKQ6RXZ_`fZgKhKhj j j j ,9=+G+GL49.4I\L\4\E.11 (B. J-1-F,IE.)'.'7'7'7'7t$>$''r=      c                 @    | j                             dg           d S )Nr   r   )rD   default_platformss    r;   set_global_default_platformszD_ConfigCache._update_env_specs.<locals>.set_global_default_platforms  s%    (22K=BSTTTTTr=   zBThe 'platforms:' field should list platforms the project supports.zSet platforms to '%s'?r"  )r0   r1   c                       fd}|S )Nc                 D    | j                             ddg           d S )Nr{   r   r   )rD   r,  r   s    r;   set_env_spec_platformszP_ConfigCache._update_env_specs.<locals>.make_fix.<locals>.set_env_spec_platforms  s+    #0::KR];^`qrrrrrr=   rM   )r   r0  r,  s   ` r;   make_fixz0_ConfigCache._update_env_specs.<locals>.make_fix  s0    s s s s s s  65r=   z=Env spec %s does not have anything in its 'platforms:' field.z
Env spec 'zS' has changed since the lock file was last updated (env spec hash has changed from z to )r\   z' specifies platforms ',z-' but the lock file lists no platforms for itz7' but the lock file has locked versions for platforms 'r   z*Lock file lists no packages for env spec 'z' on platform zLock file is missing z packages for env spec z on z (zLock file lists env spec 'z' which is not in r   environmentzEnvironment spec 'z' from z is not in .zAdd env spec ?z is out of sync with z. Diff:
zOverwrite env spec z with the changes from c                 p    | j                             dj        g                                           d S r   )r_   r   rs   to_jsonrD   importable_specs    r;   "overwrite_env_spec_from_importablezJ_ConfigCache._update_env_specs.<locals>.overwrite_env_spec_from_importableH  s7    $.._=Q/RTcTkTkTmTmnnnnnr=   c                 L    | j                             ddgj                   d S )Nr   r4  )r_   r   logical_hashr9  s    r;   remember_no_import_importablezE_ConfigCache._update_env_specs.<locals>.remember_no_import_importableK  s+    $../NP_Plmmmmmr=   )r,   r0   r1   r2   c                     t          j                  }| j                            d|j        g|                                           d S r   )r   r   r_   r   rs   r8  )rD   default_specr7   s     r;   add_default_env_specz<_ConfigCache._update_env_specs.<locals>.add_default_env_spec\  sG    9$:STT$..\=N/OQ]QeQeQgQghhhhhr=   )3r   r   r   r   r   rv   r   r   r   r   rY   r   r   r   r|   r   r}   tuplerc   r{   r]   r   r  r  r   rQ   rs   r   default_platforms_with_currentr   r#  disabledr  r=  r)   r8   r  package_specs_for_platformsetr   addconda_package_names_setr   r/   r
   rq   #diff_only_removes_notebook_or_bokehr-   r.   	diff_fromr~   )5r7   rR   r_   r   r  r   r  shared_depsshared_pip_depsshared_channelsshared_platforms_default_env_specr{   first_env_spec_nameenv_specs_is_emptyenv_specs_is_missingrs   r&  rt   problem_countr  r  r  r   r   r  missing_platformslocked_specs_countr   missing_platform_countr-  r   r1  locked_hashr,   r  r  lock_set_namespackager  unlocked_namesimportable_filenameskip_spec_importoldpromptr;  r>  rA  r   r,  r(  r:  r)  s5   ```                                             @@@@@r;   r   z_ConfigCache._update_env_specs6  sd   	[ 	[ 	[ 	[ 	[ 	[ 	[	O 	O 	O 	O 	O	N 	N 	N 	N 	N 	N 	N	V 	V 	V 	V 	V 	V 	V *99J)K)K&o)/,*;<<++L,=>>(9lZQSDTWaceVfCg6h6h*i)jkk **;@Q*RR	""$ %,;F9H5D6F8V?A9;%= %= %=!  <	#'  Y :	9~~" *%)"!*!2!2 2c 2cu::<<2% !(L"e"l"lmq"r"rt t t#iit<< 9[3I3I !(L#[#b#bcg#h#hk k k #H%*YY~t%D%D"% d)+&&122 d*<*B*B*D*D)E&&););E>Sb)c)c&x===0 #2?5#9#9 x*?511,,U33	>--dD99 :+dff68484Q48 :  :  :H
 (,;?9A5=6?8C?DEW?X?X9;5=(? (? (?t$ ' /*.'*<5,bc c c ca2ch ,j  
  	(  	(  	(  	(  	(  	(  	(  	(  	(L #'')) 	* 	*DM$###4>))))) --// 	8 	8H ( ("a'" ( 8S1C-D-D-I 8!((777! 	B ) H J J
 &)):%;%;"%);; BU U U U U h*b*BTYYO`EaEa*a+G	I I I I I  &&788 B BG6 6 6 6 6 "("."adk"k.FSdIeIe.e/7x/@/@	B B B B B --// )	p )	pH ) "+9K p;(:O+O p pHPWbWbWbHPH]H]H]_ D9CUim n n nooo!X%6%@@ px(233q8 \ \ sxx0B'C'C'C'CEDD\
 FN]]]TWT\T\ ( 2U4 U4 U4 U458XXh>O>Y5Z5Z5Z5Z\D D9CUim n n nooo8*++a/ p ( 1 ; p pH%-%6%Q%QRZ%[%[N>**a/ p pckcpcpcpckck m D9K]qu(v(v(vwwww *-'5 @ @G%.%9'%B%BF% @ . 2 26; ? ? ?)1)IN)Z~..2 p p #N 3 3 3 3X]]]HHHchhW]^bcq^r^rWsWsNtNtNtNt$vD$OO .D9CUim n n np p p N'')) 	p 	pD4>) p pOSttUaUjUjkD9CUim n n nooo 2SSWSaShShSjSjSWSf2h 2h.- 	'+55~}6UVV?#?? '"& 	;.$$_%9::C  	#3 	#CCCHH	#"O !	i y yHWH\H\H\^q^q^qHJHXHXYeYnHoHoHoHoq5D5I5I5I27K[K[\h\qKrKrKrKrsy $(((*=*=*=rw?O?O$-@/ @/ @/ @/0?0I0I#0N0N0NP O^NbNbNbdwdwdwxo o o o on n n n n
 OOD*0,N/LN N NO O O O
   		i#7 		ii i i i i & 	=)2D&&&)<D&&&r=   c                 .   t          |          rd S |                                 r8t          | j        | j        d          }|                     || j        |           t          | j        | j                  }|                     || j        |           d S )NBOOTSTRAP_ENV_PREFIX)rr   r{   env_var)rr   r{   )rl   has_bootstrap_env_specr   rr   r{   r   r   )r7   r   rR   r_   r   s        r;   r   z+_ConfigCache._update_conda_env_requirementsl  s    (## 	F&&(( 	X-t}8<6LN N NK !!,0I;WWW)4=DN[[[lD,E{SSSSSr=   c                 P   d}d }t                      }|                    dd           }t          j        d          }t          t          |                                          z   }	|'t          |          st          ||d|z             d}nB|?|	                                D ])\  }
}|

                                dk    r't          ||d                    |
                     d}E||
}t          |          st          ||d|
d	|           d}rt          ||||	           d
|v r;t          |d
                   s&t          ||d                    |
                     d}d|v rAt          |d         t                    s&t          ||d                    |
                     d}d|v rkt          |d                   s't          ||d                    |
                     d}n/|d         | j        vr t          ||d|d         d|
d           d}d|v rAt          |d         t                    s&t          ||d                    |
                     d}t#          |          }d|vr
| j        |d<   g }t&          }t(          t          |                                          z   D ]`}||vr||v r||         }|                    |           t          ||                   s#t          ||d|
d|d||         d           d}at-          |          dk    rt          ||d|
z             d}d|v sd|v rzt-          |          dk    rgd|v rdnd}t/          |          }|                    |           d |D             }t          ||d|
d|d d!                    |                     d}|s ||
|"          ||
<   +|                     ||||           |rt                      | _        d | _        n|| _        d#| j        v r	d#| _        d S || _        d S )$NFrw   command_runzS'commands:' section should be a dictionary from command names to attributes, not %rTrp   zACommand variable name cannot be empty string, found: '{}' as namezcommand name 'z7' should be followed by a dictionary of attributes not rt   z2'description' field of command {} must be a stringsupports_http_optionsz='supports_http_options' field of command {} must be a booleanr   zJ'env_spec' field of command {} must be a string (an environment spec name)z
env_spec 'z' for command 'z*' does not appear in the env_specs sectionregisters_fusion_functionzA'registers_fusion_function' field of command {} must be a booleanz	command 'z' attribute 'z' should be a string not 'r   r   z/command '%s' does not have a command line in itr&   r'   r*  c                     g | ]}d |z  S )z'%s'rM   )rf   others     r;   ri   z1_ConfigCache._update_commands.<locals>.<listcomp>  s    CCC5v~CCCr=   z ' has multiple commands in it, 'z' can't go with r"  )rs   
attributesr   )rv   r   plugins_apiget_pluginsr   rB  r]   r   rY   r   r   r   rc   r   rP   r  r{   r   r~   r   ALL_COMMAND_TYPESrQ   r   r   remover   _verify_notebook_commandsrw   rx   )r7   rR   r_   r   failedfirst_command_namerw   commands_sectionr!   %all_known_command_attributes_extendedrs   r&  copied_attrscommand_typesProjectCommandClassattrlabelotherss                     r;   r   z_ConfigCache._update_commandsy  s   !66'11*dCC)-881MPUV]VbVbVdVdPePe1e- ^	]8H0I0I ^	],e!#$ $ $ FF X	]!1!7!7!9!9 W] W]u::<<2% !(L"e"l"lmq"r"rt t t!F% .)-&u~~ ! ,,gkgkgkmrmrsu u u "F*<5Joppp E) ")E-<P2Q2Q "!(L"V"]"]^b"c"ce e e!F*e3 "JuMdGegk<l<l "!(L#b#i#ijn#o#or r r!F& &$U:%677 
&%$lhooptuuw w w "&z*$.@ &%$ll":...67 7 7 "&.%7 "
5QlKmos@t@t "!(L#f#m#mnr#s#sv v v!F'\1 J/3/IL, "&4#-gllnn0E0EE & &D</ @ 7? @29$-/
 "((...$\$%788 &%$ll!TT444d);););5=> > > "&}%%* "!(L:kos:tuuu!F,. "+2M "TWXeTfTfijTj "+6,+FVKKJE!-00FMM%(((CCFCCCF! ,,uuudii&7&7&719: : : "F  ]%8%8d|%\%\%\HTN&&x<VVV 	% FFDM(,D%%$DM% 	;(1D%%% );D%%%r=   c           	      x    |                     ddg          Idu rd S t                    s3t          ||d                    t	                                         d S ng t          t                                }g }|                                D ]}|                    |           t           j
        ||          }|1|                    |                                           |g k    sJ d S d |D             }d |D             }t          |          }fd}	 fd	d
 g }
|D ]7}|                    d          r  |	|          r|
                    |           8|
                                 t!          |
          dk    r}|
d         }t#          d|z  |j        dt&          j                            |j                  d|d | j                   |          d          }|                    |           d S t!          |
          dk    r fd|
D             fd|
D             fd}fd}t#          dd                    |
          z  |j        dt&          j                            |j                  z  ||d          }|                    |           d S d S )Nr   	notebooksTz;'skip_imports: notebooks:' value should be a list, found {})frontendr   c                 *    g | ]}|d          dk    |S )r   r5  rM   rf   fs     r;   ri   z:_ConfigCache._verify_notebook_commands.<locals>.<listcomp>  s%    555q15555r=   c                 :    g | ]}|                     d d          S )\/)replacer}  s     r;   ri   z:_ConfigCache._verify_notebook_commands.<locals>.<listcomp>  s&    555!4%%555r=   c                 ^                                     D ]}|j        | k    r dS | v rdS dS )NFT)r   r&   )relative_namecommandrw   skipped_notebookss     r;   need_to_import_notebookzG_ConfigCache._verify_notebook_commands.<locals>.need_to_import_notebook  sR    #??,, ! !#}4 ! 55!  11 u4r=   c                       fd}|S )Nc                    g }t          j        t          j                            j                  |          }g |k    sJ |J d}|                    |           | j                            dg|           d S )N)r&   r   rw   )	notebook_analyzerextrasr-   r.   r   rq   r   r_   r   )rD   errorsr  command_dictenv_spec_namer  r7   s       r;   add_notebookz\_ConfigCache._verify_notebook_commands.<locals>.make_add_notebook_func.<locals>.add_notebook$  s    *1"',,t?RTa2b2bdjkk V|###))),9}UU##F+++$..
M/JLYYYYYr=   rM   )r  r  r  r7   s   `` r;   make_add_notebook_funczF_ConfigCache._verify_notebook_commands.<locals>.make_add_notebook_func#  s7    
Z 
Z 
Z 
Z 
Z 
Z 
Z  r=   c                       fd}|S )Nc                     | j                             ddgg           }|                               | j                             ddg|           d S )Nr   rz  r   )r_   r   rQ   r   )rD   r  r  s     r;   no_add_notebookzb_ConfigCache._verify_notebook_commands.<locals>.make_no_add_notebook_func.<locals>.no_add_notebook3  s_    $+$8$B$BNT_C`jl$B$m$m!!((777$../LN_`````r=   rM   )r  r  s   ` r;   make_no_add_notebook_funczI_ConfigCache._verify_notebook_commands.<locals>.make_no_add_notebook_func2  s)    a a a a a
 #"r=   z.ipynbr*  r   zNo command runs notebook %szCreate a command in z for r6  )r,   r8   r0   r1   r2   r3   c                 2    g | ]} |j                   S rM   )r~   )rf   r  r  r7   s     r;   ri   z:_ConfigCache._verify_notebook_commands.<locals>.<listcomp>N  s7       Vc&&}d6PQQ  r=   c                 &    g | ]} |          S rM   rM   )rf   r  r  s     r;   ri   z:_ConfigCache._verify_notebook_commands.<locals>.<listcomp>Q  s%    iii55mDDiiir=   c                 (    D ]} ||            d S r   rM   )rD   r~  	add_funcss     r;   add_allz7_ConfigCache._verify_notebook_commands.<locals>.add_allS  s+    "  AAgJJJJ r=   c                 (    D ]} ||            d S r   rM   )rD   r~  no_add_funcss     r;   
no_add_allz:_ConfigCache._verify_notebook_commands.<locals>.no_add_allW  s+    %  AAgJJJJ r=   zNo commands run notebooks %sr"  z0Create commands in %s for all missing notebooks?)r   r   rY   r   r   r   r   r   r   r   rq   
pop_errorsr#  endswithrQ   sortr   r)   r8   r-   r.   r/   r~   r   )r7   rw   rR   r   r_   recorderflat_requirementsreqsfilesr  need_to_importr  problemr  r  r  r  r  r  r  s   ``             @@@@@r;   rn  z&_ConfigCache._verify_notebook_commands  s   (22NK3PQQ 
	# D( .// lQXXY]^oYpYpqqs s s 	 !#&~'7'788 '')) 	+ 	+D$$T****@ATJRN_a a a  	OOH//11222r>!!!F 65E555 65u555 u	 	 	 	 	 		  	  	  	  	 	# 	# 	# " 	9 	9M%%h// 9**=99 9"))-888 	~!# 	%*1-M$*G=*Y.:.C.C&(g&6&6|7L&M&M&M&M}}}1^2H2HX\Xr2s2s5N5N}5]5]7;= = =G OOG$$$$$  1$ 	%    gu  I jiiiZhiiiL         %*HDIIVdLeLe*f.:.C0b&(g&6&6|7L&M&M1O295?7;= = =G OOG$$$$$+	% 	%r=   c                    | j                                         D ]}|j        | j        vr d S | j        |j                 |                              t                    dk    rfd}t          d|j        dj        dd                              |j	        dd                              dj        d	t          j                            |j	                  d
|d          }|                    |           d S )Nr   c                     | j                             dj        g          }|J |                    dg           }D ]}||vr|                    |           | j                             dj        dg|           d S )Nr{   r   )r_   r   rs   r   rQ   r   )rD   r   r   mr   r   s       r;   add_packages_to_env_speczK_ConfigCache._verify_command_dependencies.<locals>.add_packages_to_env_specn  s    &3=={HM>Z[[H#///'||J;;H$ / / H, /$OOA...(22KPZ3[]efffffr=   zCommand z uses env spec z# which does not have the packages: r"  zAdd z to env spec z in r6  T)r,   r8   r0   r1   r3   )rw   r   r~   r{   missing_packagesr   r)   rs   r   r8   r-   r.   r/   rQ   )r7   rR   r_   r  r  r  r   r   s         @@r;   r   z)_ConfigCache._verify_command_dependenciesd  sB   }++-- 	) 	)G,DNB  ~g&CDH..x88G7||a )	g 	g 	g 	g 	g 	g )."<<<		'8J8J8JL)22!%7!3!3!3!3X]]]BGDTDTUaUjDkDkDkDk!m!9&*, , , (((9	) 	)r=   c                     d| j         v S )>Return True if bootstrap-env is in env_specs, False otherwise.bootstrap-env)r{   r@   s    r;   rb  z#_ConfigCache.has_bootstrap_env_spec  s    $.00r=   N)rH   rI   rJ   r<   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r   r   rn  r   rb  rM   r=   r;   rn   rn      s       % % %(B` B` B`H  B	  	  	   8 8 8N N NG G GG G Gx x x:& :& :&xG G G*G G G<" " ""W W W       *M3 M3 M3^t= t= t=l	T T Tw; w; w;rp% p% p%d) ) )>1 1 1 1 1r=   rn   c                      e Zd ZdZd6dZd Zed             Zed             Zed	             Z	ed
             Z
ed             Zed             Zd Zd Zd Zd Zd Zd Zd Zej        d             Zd7dZed             Zed             Zed             Zed             Zd8dZed             Zed             Zd Zed             Z ed             Z!ed              Z"ed!             Z#ed"             Z$ed#             Z%ed$             Z&d% Z'd& Z(d' Z)d( Z*ed)             Z+d* Z,ed+             Z-ed,             Z.d8d-Z/d. Z0d/ Z1d0 Z2d1 Z3d2 Z4ed3             Z5d4 Z6d5 Z7dS )9ProjectzRepresents the information we've inferred about a project.

    The Project class encapsulates information from the project
    file, and also anything else we've guessed by snooping around in
    the project directory or global user configuration.
    NFTc                 8   t           j                                                          t           j                  | _        fd}t          j        ||          | _        | j        j	        | _        t          | j                   t          j        | j                  | _        t           j                            | j                  | _        t          | j        ||          | _        |t#                      }t%          |t&                    sJ |g| _        dS )a  Construct a Project with the given directory and plugin registry.

        Args:
            directory_path (str): path to the project directory
            plugin_registry (RequirementsRegistry): where to look up Requirement and Provider instances,
                                                    None for default
            frontend (Frontend): the UX using this Project instance
            must_exist (bool): if True, the absence of a project file is a problem
            scan_parents (bool): if True search for anaconda-project.yml file in parent directories
                                 If one is found change the directory_path to its location.
        c                  T    t                    \  } }| | gS t          d           gS )N)shared_base_spec)r	   r   )r:  r[  rq   s     r;   load_default_specsz,Project.__init__.<locals>.load_default_specs  s<    5J>5Z5Z2_1 H'((/FFFGGr=   )default_env_specs_funcscan_parentsN)r-   r.   realpathrstripsep_directory_pathr   load_for_directory_project_fileproject_dirr"   r   
_lock_filer/   _directory_basenamern   _config_cacher   rP   r   
_frontends)r7   rq   plugin_registryr{  r   r  r  s    `     r;   r<   zProject.__init__  s     "w//??FFrvNN	H 	H 	H 	H 	H );NSeIUW W W  $1=!$"6777)<T=QRR#%7#3#3D4H#I#I )$*>Q[\\ 	(%''H(H-----#*r=   c                 Z    | j                             | j        | j                   | j         S r   )r  r   r  r  r@   s    r;   _updated_cachezProject._updated_cache  s)    !!$"4doFFF!!r=   c                     | j         S )z"Get path to the project directory.)r  r@   s    r;   rq   zProject.directory_path  s     ##r=   c                     | j         d         S )zReturn the current UX frontend.)r  r@   s    r;   r{  zProject.frontend  s     r""r=   c                     | j         S )z)Get the ``ProjectFile`` for this project.)r  r@   s    r;   r_   zProject.project_file  s     !!r=   c                     | j         S )z-Get the ``ProjectLockFile`` for this project.)r  r@   s    r;   r   zProject.lock_file  s     r=   c                     | j         j        S )z2Get the ``RequirementsRegistry`` for this project.)r  rr   r@   s    r;   r  zProject.plugin_registry  s     !**r=   c                     g }| j                                         D ]/}|                    |                     |j                             0|S )z@Required items for ALL envs (list of ``Requirement`` instances).)r{   r   r   r   rs   )r7   combinedr   s      r;   "union_of_requirements_for_all_envsz*Project.union_of_requirements_for_all_envs  sR     --// 	> 	>H OOD--hm<<====r=   c                     || j         }|                                 j        fd}d }| j                            |          }|g S t          |                    ||                    S )zPRequired items in order to run this project (list of ``Requirement`` instances).Nc                 :                         | j        g           S r   )r   rs   )r   r   s    r;   get_reqsz&Project.requirements.<locals>.get_reqs  s    ##HM2666r=   c                 >    t          | t                    sJ | j        S r   )rP   r   ra  )reqs    r;   req_keyz%Project.requirements.<locals>.req_key  s!    c#455555;r=   )key_func)r~   r  r   r{   r   r   _get_inherited_with_getter)r7   r  r  r  r   r   s        @r;   r   zProject.requirements  s     	7 6M**,,9	7 	7 	7 	7 	7	 	 	 >%%m44 	YI ;;Hw;WWXXXr=   c                 :    |                      |t                    S )z7All requirements that are ServiceRequirement instances.klass)find_requirementsr   r7   r  s     r;   service_requirementszProject.service_requirements  s    %%m;M%NNNr=   c                 :    |                      |t                    S )z8All requirements that are DownloadRequirement instances.r  )r  r   r  s     r;   download_requirementszProject.download_requirements  s    %%m;N%OOOr=   c                 :    |                      |t                    S )zAll requirements that have an associated environment variable.

        Note: this will include services, downloads, and even CondaEnvRequirement.
        r  )r  r   r  s     r;   all_variable_requirementsz!Project.all_variable_requirements  s    
 %%m;L%MMMr=   c                 @    d |                      |          D             S )zAll 'plain' variables (that aren't services, downloads, or a Conda environment for example).

        Use the ``all_variable_requirements`` property to get every variable.
        c                 .    g | ]}|j         t          u |S rM   )	__class__r   )rf   r  s     r;   ri   z7Project.plain_variable_requirements.<locals>.<listcomp>  s'    sssPSP]arPrssssr=   r  r  s     r;   plain_variable_requirementsz#Project.plain_variable_requirements   s'    
 tst==mLLssssr=   c                 R    | j                             t                                 dS )zxPush a no-op frontend overriding the currently-active one.

        This is used to disable output temporarily.
        N)r  rQ   r   r@   s    r;   push_null_frontendzProject.push_null_frontend  s&    
 	~//00000r=   c                 b    t          | j                  dk    sJ | j        dd         | _        dS )zPop the no-op frontend.r*  Nr  )r   r  r@   s    r;   pop_null_frontendzProject.pop_null_frontend  s3    4?##a''''/#2#.r=   c              #      K   |                                   	 dV  |                                  dS # |                                  w xY w)z,Create a context with the frontend disabled.N)r  r  r@   s    r;   null_frontendzProject.null_frontend  sX       	!!!	%EEE""$$$$$D""$$$$s	   2 Ac                     g }|                      |          D ]M}|!t          |t                    r|j        |k    s%|t          ||          s8|                    |           N|S )a  Find requirements that match the given env var and class.

        If env_var and klass are both provided, BOTH must match.

        Args:
           env_spec_name (str): name of env spec to find requirements of
           env_var (str): if not None, filter requirements that have this env_var
           klass (class): if not None, filter requirements that are an instance of this class

        Returns:
           list of matching requirements (may be empty)
        )r   rP   r   ra  rQ   )r7   r  ra  r  foundr  s         r;   r  zProject.find_requirements  s     $$]33 	 	C Js<M,N,N SVS^biSi  C)?)? LLr=   c                 4    |                                  j        S )a  List of strings describing problems with the project configuration.

        This list contains problems which keep the project from loading, such as corrupt
        config files; it does not contain missing requirements and other "expected"
        problems.
        )r  r   r@   s    r;   rR   zProject.problems2  s     ""$$44r=   c                 H    d |                                  j        D             S )zTList of ProjectProblem instances describing problems with the project configuration.c                      g | ]}|j         	|S rM   r3   rf   r  s     r;   ri   z+Project.problem_objects.<locals>.<listcomp>?  s     gggGWMfggggr=   r  rR   r@   s    r;   problem_objectszProject.problem_objects<  s(     hgt':':'<'<'Eggggr=   c                 $    d | j         D             S )z8List of ProjectProblem that have associated fix prompts.c                 .    g | ]}|j         	|j        |S rM   rA   r3   r   s     r;   ri   z,Project.fixable_problems.<locals>.<listcomp>D  s'    YYYa19YQEXYYYYr=   r  r@   s    r;   fixable_problemszProject.fixable_problemsA  s     ZY4/YYYYr=   c                 $    d | j         D             S )z,List of ProjectProblem that cannot be fixed.c                 .    g | ]}|j         	|j        |S rM   r  r   s     r;   ri   z.Project.unfixable_problems.<locals>.<listcomp>I  s'    ]]]aqy]I\]]]]r=   r  r@   s    r;   unfixable_problemszProject.unfixable_problemsF  s     ^]4/]]]]r=   c                     t          | j                  dk    r7g }| j        D ]}|                    |           |d}t          d||          S dS )zIGet a ``Status`` describing project problems, or ``None`` if no problems.r   NzUnable to load the project.F)successrt   r  )r   rR   rQ   r   )r7   rt   r  r  s       r;   problems_statuszProject.problems_statusK  sk    t}! 	F= ' 'g&&&& <;;vVVVV4r=   c                 $    d | j         D             S )zJList of strings describing suggested changes to the project configuration.c                     g | ]	}|j         
S rM   rO   r  s     r;   ri   z'Project.suggestions.<locals>.<listcomp>Z  s    DDDDDDr=   )suggestion_objectsr@   s    r;   suggestionszProject.suggestionsW  s     EDD,CDDDDr=   c                 H    d |                                  j        D             S )z[List of ProjectProblem instances describing suggested changes to the project configuration.c                      g | ]}|j         	|S rM   r  r  s     r;   ri   z.Project.suggestion_objects.<locals>.<listcomp>_  s     cccGIbccccr=   r  r@   s    r;   r   zProject.suggestion_objects\  s(     dct':':'<'<'Eccccr=   c                     d}|dk    r_d}|                                  j        D ] }|j        r|                    |            d}!|r|                                  |dz  }|dk    ]dS dS )z%Fix fixable problems and suggestions.   r   FTr*  N)r  rR   rA   rE   use_changes_without_saving)r7   
iterationsfixed_a_thingr  s       r;   fix_problems_and_suggestionsz$Project.fix_problems_and_suggestionsa  s     
1n 	!M..009 ) )? )KK%%%$(M 2//111!OJ 1n 	 	 	 	 	r=   c                 4    |                                  j        S )zGet the project's human-readable name.

        Prefers in order: `name` field from anaconda-project.yml, `package:
        name:` from meta.yaml, then project directory name.
        )r  rs   r@   s    r;   rs   zProject.namet       ""$$))r=   c                 *    t          | j                  S )z$Get the project's url-friendly name.)r    rs   r@   s    r;   url_friendly_namezProject.url_friendly_name}  s     ty!!!r=   c                 4    |                                  j        S )zGet the project description.)r  rt   r@   s    r;   rt   zProject.description  s     ""$$00r=   c                 4    |                                  j        S )zGet the project's icon as an absolute path or None if no icon.

        Prefers in order: `icon` field from anaconda-project.yml, `app:
        icon:` from meta.yaml.
        )r  ru   r@   s    r;   ru   zProject.icon  r  r=   c                 4    |                                  j        S )zDGet a dictionary of environment names to CondaEnvironment instances.)r  r{   r@   s    r;   r{   zProject.env_specs  s     ""$$..r=   c                 4    |                                  j        S )zKGet whether locking is enabled by default for lock sets that don't specify.)r  r}   r@   s    r;   r}   z Project.locking_globally_enabled  s     ""$$==r=   c                 4    |                                  j        S )zGet the env spec representing global packages, channels, and platforms sections.

        This env spec has no name (its name is None) and can't be used directly
        to create environments, but every other env spec inherits from it.
        )r  r   r@   s    r;   r   zProject.global_base_env_spec  s     ""$$99r=   c                 @    d |                      |          D             S )zRGet a list of strings with the variables names from ``all_variable_requirements``.c                     g | ]	}|j         
S rM   ra  rf   rs     r;   ri   z)Project.all_variables.<locals>.<listcomp>  s    QQQa	QQQr=   r  r  s     r;   all_variableszProject.all_variables  s$    QQ4#A#A-#P#PQQQQr=   c                 @    d |                      |          D             S )zTGet a list of strings with the variables names from ``plain_variable_requirements``.c                     g | ]	}|j         
S rM   r  r  s     r;   ri   z+Project.plain_variables.<locals>.<listcomp>  s    SSSa	SSSr=   )r  r  s     r;   plain_variableszProject.plain_variables  s$    SS4#C#CM#R#RSSSSr=   c                 @    d |                      |          D             S )zTGet a list of strings with the variable names for the project services requirements.c                     g | ]	}|j         
S rM   r  r  s     r;   ri   z$Project.services.<locals>.<listcomp>  s    LLLa	LLLr=   )r  r  s     r;   r   zProject.services  s$    LL4#<#<]#K#KLLLLr=   c                 @    d |                      |          D             S )zTGet a list of strings with the variable names for the project download requirements.c                     g | ]	}|j         
S rM   r  r  s     r;   ri   z%Project.downloads.<locals>.<listcomp>  s    MMMa	MMMr=   )r  r  s     r;   r   zProject.downloads  s$    MM4#=#=m#L#LMMMMr=   c                 4    |                                  j        S )a&  Get the named environment to use by default.

        This will be the one named "default" if it exists, and
        otherwise the first-listed one.

        Note that each command may have its own default, so
        this should only be used in contexts with no known
        command.
        )r  r~   r@   s    r;   r~   zProject.default_env_spec_name  s     ""$$::r=   c                 P    || j         S t          |t                    sJ |j         S )zuGet the named environment to use by default for a given ProjectCommand.

        the command may be ``None``
        )r~   rP   r   )r7   r  s     r;   !default_env_spec_name_for_commandz)Project.default_env_spec_name_for_command  s4    
  	1--g~6666600r=   c                 4    |                                  j        S )zGet the dictionary of commands to run the project.

        This dictionary can be empty.

        Returns:
            dictionary of command names to ``ProjectCommand``
        )r  rw   r@   s    r;   rw   zProject.commands  s     ""$$--r=   c                 `    |                                  }|j        dS |j        |j                 S )zGet the default ``ProjectCommand`` or None if we don't have one.

        Returns:
            the default ``ProjectCommand``
        N)r  rx   rw   )r7   caches     r;   default_commandzProject.default_command  s5     ##%%% 	>4>%"<==r=   c                 F    | j         }|dS |                    ||          S )a  Get the information needed to run the project's default command.

        Args:
            environ (dict): the environment
            extra_args (list of str): extra args to append to the command line
        Returns:
            a CommandExecInfo instance
        N)environ
extra_args)r&  exec_info_for_environment)r7   r(  r)  r  s       r;   !default_exec_info_for_environmentz)Project.default_exec_info_for_environment  s4     & 	]444WQ[4\\\r=   c                 4   |                                  j        }d|v }|dk    r|s|                                  j        }||                                  j        }|dS ||                                  j        v r|                                  j        |         S dS )zGet the ProjectCommand for the given command name, or None if no commands.

        Args:
           command_name (str): the command name
        Returns:
           a ProjectCommand instance or None
        r   N)r  rw   rx   )r7   command_namerw   has_defaults       r;   command_for_namezProject.command_for_name  s     &&((18+I% 	F 	F..00EL 	F..00EL 	44..0099 	&&((1,??4r=   c           
         t                      }| j        |d<   | j        |d<   | j        |d<   t          |d<   t                      }| j                                        D ]\  }}t          |j                  ||<   |j        |j        ||         d<   |j        |j        ||         d<   |j	        |j	        ||         d	<   |j
        |j
        ||         d
<   || j        u rd||         d<   |j        ||         d<   |j        ||         d<   ||                             |j                   ||d<   t                      }| j                                        D ]\  }}t          t#          |j                  t#          |j                  |j        |j        j        t#          |j                            ||<   t                      }t                      }t                      }	|                     |          D ]}
t1          |
t2                    rt1          |
t4                    rt          |
j        |
j        |
j                  }|
j        }|||d<   t1          |
t<                    r|
j        |d<   |||
j         <   t1          |
tB                    r|
j"        |d<   ||	|
j         <   t1          |
t4                    r
|||
j         <   |||         d<   |||         d<   |	||         d<   ||d<   |S )aq  Get JSON-serializable information to be stored as metadata when publishing the project.

        This is a "baked" version of anaconda-project.yml which also
        includes any defaults or automatic configuration.

        Before calling this, check that Project.problems is empty.

        Returns:
            A dictionary containing JSON-compatible types.
        rs   r  rt   anaconda_project_version)rt   Nr'   r&   r%   r$   Tr   r   re  rw   )r   r   rt   r
  r   )titlert   	encryptedurlr   r   r   r   r{   )#rv   rs   r  rt   versionrw   r   r'   r&   windows_cmd_commandlineunix_shell_commandliner&  r~   re  r   r  r{   r   r  r   r  r  r   r   rP   r   r   r2  r3  default_as_stringr   r4  ra  r   r   )r7   jsonrw   rb   r  envsenvr   r   r   r  datar   s                r;   publication_infozProject.publication_info  s     vvyV %)$: !".]+2'(66 M//11 	1 	1LC W-@AAAHSM  ?-4->k* =,3,<j). K+2+Ji(- G(/(Ff%$.. 0+/i((/(EHSM*%5<5RHSM12SM  0000#Zvv,,..  	-  	-HCd3+=&>&>&*3<&8&8),$'L$8'+CM':':	< < <DI IIvvH((-- 6 6c#677 c#455 6ciS_X[XefffD!3G 2*1Y!#':;; 6&)gU15	#+..#C);<< 6'*'7V04--#C):;; 615	#+.%.DIk"%.DIk"$,DIj!! [r=   c                 j    | j                                          | j                                         dS )zRevert the project configuration by reloading config from disk.

        Discards all unsaved changes.

        This isn't needed when creating a Project, just if you want to
        revert to disk. We automatically load on Project creation.
        N)r_   loadr   r@   s    r;   r?  zProject.loadS  s3     	   r=   c                 j    | j                                          | j                                         dS )zlSave any modified project configuration.

        Does nothing for config files that are not dirty.
        N)r_   saver   r@   s    r;   rA  zProject.save^  s3    
 	   r=   c                 j    | j                                          | j                                         dS )zRebuild project state from in-memory changes.

        This causes the Project instance to reload from
        the in-memory (but possibly unsaved) state of
        the project file and lock file.
        N)r_   r  r   r@   s    r;   r  z"Project.use_changes_without_savingf  s3     	446661133333r=   c                 .    t          | j        dd          S )z)Fullpath to bootstrap environment prefix.r:  r  )r   r  r@   s    r;   bootstrap_env_prefixzProject.bootstrap_env_prefixp  s     D(&/BBBr=   c                 8    t           j        d         | j        k    S )zZReturn True if anaconda-project is running inside a project bootstrap env False otherwise.r   )r-   r(  rD  r@   s    r;   is_running_in_bootstrap_envz#Project.is_running_in_bootstrap_envu  s    z.)T-FFFr=   c                 4    | j                                         S )r  )r  rb  r@   s    r;   rb  zProject.has_bootstrap_env_specy  s    !88:::r=   )NNFTNNr   )8rH   rI   rJ   rK   r<   r  rL   rq   r{  r_   r   r  r  r   r  r  r  r  r  r  
contextlibcontextmanagerr  r  rR   r  r  r  r  r  r   r	  rs   r  rt   ru   r{   r}   r   r  r  r   r   r~   r"  rw   r&  r+  r/  r=  r?  rA  r  rD  rF  rb  rM   r=   r;   r  r    sn        !% !% !% !%F" " " $ $ X$ # # X# " " X"   X + + X+   XY Y Y.O O OP P PN N Nt t t1 1 1/ / /
 % % %   , 5 5 X5 h h Xh Z Z XZ ^ ^ X^
 
 
 
 E E XE d d Xd  & * * X* " " X" 1 1 X1 * * X* / / X/ > > X> : : X:R R RT T TM M MN N N 
; 
; X
;	1 	1 	1 . . X. 
> 
> X
>] ] ] ]  ,I I IV	 	 	  4 4 4 C C XCG G G; ; ; ; ;r=   r  rH  )PrK   
__future__r   rI  r   r   r-   os.pathr   anaconda_project.env_specr   r   r	   r
   r   /anaconda_project.requirements_registry.registryr   2anaconda_project.requirements_registry.requirementr   =anaconda_project.requirements_registry.requirements.conda_envr   <anaconda_project.requirements_registry.requirements.downloadr   ;anaconda_project.requirements_registry.requirements.servicer   !anaconda_project.project_commandsr   r   anaconda_project.project_filer   "anaconda_project.project_lock_filer   anaconda_project.archiverr   anaconda_projectr   r5  anaconda_project.conda_managerr   anaconda_project.frontendr   r   r   anaconda_project.yaml_filer   $anaconda_project.internal.py2_compatr   r   r   'anaconda_project.internal.simple_statusr   !anaconda_project.internal.slugifyr    +anaconda_project.internal.notebook_analyzerinternalr  #anaconda_project.internal.conda_apir   !anaconda_project.internal.pip_apir   anaconda_project.internalr!   rj  anaconda_project.projectignorer"   COMMAND_TYPE_CONDA_APP_ENTRYCOMMAND_TYPE_SHELLCOMMAND_TYPE_WINDOWSCOMMAND_TYPE_NOTEBOOKCOMMAND_TYPE_BOKEH_APPrl  objectr)   rU   rY   rc   r^   rl   rn   r  rM   r=   r;   <module>rj     s   6 5 & & & & & &             				      c c c c c c c c c c c c c c P P P P P P P P P P P P ] ] ] ] ] ] \ \ \ \ \ \ Z Z Z Z Z Z \ \ \ \ \ \ \ \ 5 5 5 5 5 5 > > > > > > V V V V V V 3 3 3 3 3 3 7 7 7 7 7 7 S S S S S S S S S S 3 3 3 3 3 3 L L L L L L L L L L @ @ @ @ @ @ 5 5 5 5 5 5 G G G G G G G G G 7 7 7 7 7 7 7 7 7 3 3 3 3 3 3 3 3 3 < < < < < < D D D D D D  1    " $ 13EG[]r+- * * * * *V * * *^  r r r r
8 8 8+ + +  u1 u1 u1 u1 u16 u1 u1 u1ps; s; s; s; s;f s; s; s; s; s;r=   