
    .e[!                        d Z ddlZddlZddlZddlmZ ddlmZ ddlm	Z	 ddl
mZ ddlmZ ddlmZmZmZmZmZmZ d	d
lmZmZmZmZmZmZmZ  ee          Z G d d          Z G d d          Z ej!        fde"de"fdZ# ej$         e	e%          j&        d         dz  dz  '                                          d         d         Z(dS )
    N)deepcopy)	getLogger)Path)check_output)NamedTemporaryFile)AnyDictIterableListMappingOptional   )DEFAULT_BASE_PREFIXDEFAULT_PREFIX_UserOrSystem	data_pathdeep_update
logged_runslugifyc            	          e Zd ZeedfdedededefdZdee	         fdZ
dee	         fd	ZddedededefdZedeeef         fd            Zdeeef         fdZede	fd            Zde	defdZdde	fdZdeej                 fdZdS )Menuusernameprefixbase_prefixmodec                     |dv sJ d| d            || _         || _        t          |          | _        t          |          | _        d | _        d S )N)r   systemzmode=z must be `user` or `system`)r   r   r   r   r   env_name)selfr   r   r   r   s        7lib/python3.11/site-packages/menuinst/platforms/base.py__init__zMenu.__init__   s`     ))))+T4+T+T+T)))		6ll,,    returnc                     t           NNotImplementedErrorr!   s    r"   createzMenu.create*       !!r$   c                     t           r'   r(   r*   s    r"   removezMenu.remove-   r,   r$   FNvalueslugextrac                     t          |d          s|S |ri | j        |}n| j        }|                                D ]!\  }}|                    d|z   dz   |          }"|rt	          |          }|S )Nreplacez{{ z }})hasattrplaceholdersitemsr3   r   )r!   r/   r0   r1   r5   placeholderreplacements          r"   renderzMenu.render0   s    ui(( 	L 	-9d/959LL,L(4(:(:(<(< 	L 	L$KMM%+"5"={KKEE 	#ENNEr$   c                 |   t          | j                  | j        j        t          | j        dz  dz            t          | j                  | j        j        t          | j        dz  dz            t          | j        dz            t          | j        dz            dt          j                            d          ddS )z
        Additional placeholders added at runtime:
        - MENU_ITEM_LOCATION -> *MenuItem().location

        Subclasses may extend this dictionary!
        binpythonr   zN.A~png)BASE_PREFIXDISTRIBUTION_NAMEBASE_PYTHONPREFIXENV_NAMEPYTHONMENU_DIRBIN_DIRPY_VERHOMEICON_EXT)strr   r   r   ospath
expanduserr*   s    r"   r5   zMenu.placeholders=   s     t/00!%!1!6t/%7(BCC$+&&($+-899DK&0114;.//G&&s++
 
 	
r$   c                 :   | j         dz  | j         dz  t          t          j                            dd                    | j         dz  dz  | j         dz  dz  t          t          j                            dd                    | j         dz  d	z  | j         dz  d	z  fS )
N
_conda.exe	conda.exe	CONDA_EXEz /oops/a_file_that_does_not_existcondabincondar;   	MAMBA_EXE
micromamba)r   r   rK   environgetr*   s    r"   _conda_exe_path_candidateszMenu._conda_exe_path_candidatesS   s    |+{*-OPPQQz)G3u$w.-OPPQQz)L8u$|3	
 		
r$   c                     t           j                            d          rt          t           j                  S |                                 D ]}|                                r|c S t          d          S )NrP   rS   )sys
executableendswithr   rX   is_file)r!   rL   s     r"   	conda_exezMenu.conda_exe_   sq    >"";// 	('''3355 	 	D||~~  G}}r$   exec                 v    d|j         v rdS |j         dv r$t          t          |          dgd          }d|v S dS )NrU   T)rP   rO   info)universal_newlineszmicromamba versionF)r   r   rJ   )r!   r_   outs      r"   _is_micromambazMenu._is_micromambak   sO    38##48222C&1dKKKC'3..ur$   c                     t           j        dk    rt          || j        }t	          |          dz  }t          d |                    d          D             |dz            }|dz  S )zJ
        Locate the python site-packages location on unix systems
        ntNlibc              3   B   K   | ]}|                                 |V  d S r'   )is_dir).0ps     r"   	<genexpr>z&Menu._site_packages.<locals>.<genexpr>|   s/      HHQXXZZH1HHHHHHr$   zpython*z	pythonN.Azsite-packages)rK   r   r)   r   r   nextglob)r!   r   rg   
lib_pythons       r"   _site_packageszMenu._site_packagess   sl     7d??%%>[F6llU"HHchhy&9&9HHH#P[J[\\
O++r$   c                     t           )z|
        This method should return the paths created by the menu
        so they can be removed upon uninstallation
        r(   r*   s    r"   _pathszMenu._paths   
    
 "!r$   FNr'   )__name__
__module____qualname__r   r   rJ   r   r#   r   r   r+   r.   r	   boolr
   r9   propertyr5   rX   r^   rd   rp   r   rK   PathLikerr    r$   r"   r   r      s        %.$   	
    "T
 " " " ""T
 " " " " C t D C     
d38n 
 
 
 X
*

DcN 

 

 

 

 	4 	 	 	 X	$ 4    
, 
,T 
, 
, 
, 
,"- " " " " " "r$   r   c            
          e Zd ZdedefdZedefd            Zde	e         fdZ
de	e         fdZedeeef         fd            Z	 ddededeeeef                  defdZ	 ddededeeeef                  defdZd Zdeej                 fdZedefd            Zeej        fdededefd            Zej        fdedefdZd
S )MenuItemmenumetadatac                     || _         |                     |          | _        |                     | j                  | _        d S r'   )r~   _initialize_on_defaults_data_flatten_for_platformr   )r!   r~   r   s      r"   r#   zMenuItem.__init__   s9    	11(;;
224:>>r$   r%   c                     t           )zPPath to the main menu item artifact (file or directory, depends on the platform)r(   r*   s    r"   locationzMenuItem.location   s
     "!r$   c                     t           r'   r(   r*   s    r"   r+   zMenuItem.create   r,   r$   c                     t           r'   r(   r*   s    r"   r.   zMenuItem.remove   r,   r$   c                 .    dt          | j                  iS )NMENU_ITEM_LOCATION)rJ   r   r*   s    r"   r5   zMenuItem.placeholders   s     !#dm"4"4
 	
r$   FNkeyr0   r1   c                 f    | j                             |          }|                     |||          S )Nr0   r1   )r   rW   r9   )r!   r   r0   r1   r/   s        r"   
render_keyzMenuItem.render_key   s1     !!#&&{{5t5{999r$   r/   c                      |dv r|S |||n j         dt          |t                    r  j        j        |fi S t          |d          r! fd|                                D             S  fd|D             S )N)NTFr   r6   c                 >    i | ]\  }}| j         j        |fi S r{   r~   r9   )rj   r   r/   kwargsr!   s      r"   
<dictcomp>z#MenuItem.render.<locals>.<dictcomp>   s7    [[[zsEC))%::6::[[[r$   c                 6    g | ]} j         j        |fi S r{   r   )rj   itemr   r!   s     r"   
<listcomp>z#MenuItem.render.<locals>.<listcomp>   s1    CCCT 	 0000CCCr$   )r5   
isinstancerJ   r~   r9   r4   r6   )r!   r/   r0   r1   r   s   `   @r"   r9   zMenuItem.render   s     '''L#/UUT5F
 
 eS!! 	5#49#E44V4445'"" 	\[[[[[U[[]][[[[CCCCCUCCCCr$   c                    t           j        dk    rt          |                     d          }|sdS t	          dd          5 }|                    |           ddd           n# 1 swxY w Y   |                    d          r#t          j        |j        d           |j        g}n	d	|j        g}t          |d
           t          j	        |j                   dS )zE
        Logic to run before the shortcut files are created.
        rf   	precreateNFw)deleter   z#!i  bashT)check)
rK   r   r)   r   r   write
startswithchmodr   unlink)r!   precreate_codetmpcmds       r"   
_precreatezMenuItem._precreate   s    7d??%%55 	Fu3777 	&3IIn%%%	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&$$T** 	%HSXu%%%8*CC38$C3d####
	#(s   A$$A(+A(c                     t           )z|
        This method should return the paths created by the item
        so they can be removed upon uninstallation
        r(   r*   s    r"   rr   zMenuItem._paths   rs   r$   c                     t          t          d                    5 }t          j        |          d         d         }d d d            n# 1 swxY w Y   t	          ||           S )Nmenuinst.default.json
menu_itemsr   )openr   jsonloadr   )datafdefaultss      r"   r   z MenuItem._initialize_on_defaults   s    )34455 	5y||L1!4H	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 8T***s   !A

AAr   platformc                    t          |           }|                    di           }|                    t          |          d          }|rH|                                D ]2\  }}||vr|||<   |!t                              d||           |||<   3n||d<   d | d                                         D             |d<   |S )zN
        Merge platform keys with global keys, overwriting if needed.
        	platformsNz+Platform value %s=%s overrides global valuec                     g | ]	\  }}||
S r'   r{   )rj   r   r/   s      r"   r   z2MenuItem._flatten_for_platform.<locals>.<listcomp>   s(     "
 "
 "
Cu?PC?P?P?Pr$   )r   popplatform_keyr6   logdebug)r   r   	flattenedall_platformsthis_platformr   r/   s          r"   r   zMenuItem._flatten_for_platform   s    
 TNN	!k266%)),x*@*@$GG 	3+1133 + +
Ui''%*IcNN& IIKSRWXXX%*IcN+ &3Ik""
 "
"&{"3"9"9";";"
 "
 "
	+ r$   c                 `    | j         d                             t          |                    d uS )Nr   )r   rW   r   )r!   r   s     r"   enabled_for_platformzMenuItem.enabled_for_platform   s*    z+&**<+A+ABB$NNr$   rt   ) ru   rv   rw   r   dictr#   ry   r   r   r   r+   r.   r
   rJ   r5   rx   r   r	   r   r9   r   r   rK   rz   rr   staticmethodr   rZ   r   r   r   r   r{   r$   r"   r}   r}      s;       ?T ?T ? ? ? ?
 "$ " " " X""T
 " " " ""T
 " " " " 
d38n 
 
 
 X
 OS: ::":3;DcN3K:	: : : : QUD DD $D5=d38n5MD	D D D D  ("- " " " " + + + + \+ =@\  G s g    \6 47< O OS OD O O O O O Or$   r}   r   r%   c                 v    | dk    rdS | dk    rdS |                      d          rdS t          d|  d          )Nwin32windarwinosxlinuxz	Platform z is not supported)r   
ValueError)r   s    r"   r   r      sW    7u8u7## w
<<<<
=
==r$      r   r   r   ))__doc__r   rK   rZ   copyr   loggingr   pathlibr   
subprocessr   tempfiler   typingr	   r
   r   r   r   r   utilsr   r   r   r   r   r   r   ru   r   r   r}   r   rJ   r   loads__file__parents	read_textmenuitem_defaultsr{   r$   r"   <module>r      s     				 



                   # # # # # # ' ' ' ' ' ' ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?                  ij" j" j" j" j" j" j" j"ZkO kO kO kO kO kO kO kO\ "% > >3 ># > > > > DJ	T(^^A'*AALLNN    r$   