
     [1f[!                     ~   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jB                  fde"de"fdZ# ejH                   e	e%      jL                  d   dz  dz  jO                               d   d   Z(y)
    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j0                     fdZy
)Menuusernameprefixbase_prefixmodec                     |dv sJ d| d       || _         || _        t        |      | _        t        |      | _        d | _        y )N)r   systemzmode=z must be `user` or `system`)r   r   r   r   r   env_name)selfr   r   r   r   s        7lib/python3.12/site-packages/menuinst/platforms/base.py__init__zMenu.__init__   sO     ))TU4&8S+TT)		6l,    returnc                     t         NNotImplementedErrorr!   s    r"   createzMenu.create*       !!r$   c                     t         r'   r(   r*   s    r"   removezMenu.remove-   r,   r$   Nvalueslugextrac                     t        |d      s|S |ri | j                  |}n| j                  }|j                         D ]  \  }}|j                  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9L,,L(4(:(:(< 	L$KMM%+"5"={KE	LENE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
                  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!%!1!1!6!6t//%7(BC$++&(($++-89DKK&014;;./GG&&s+
 	
r$   c                 f   | j                   dz  | j                   dz  t        t        j                  j	                  dd            | j                   dz  dz  | j                   dz  dz  t        t        j                  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Qz)G3u$w.-OPQz)L8u$|3	
 		
r$   c                     t         j                  j                  d      rt        t         j                        S | j	                         D ]  }|j                         s|c S  t        d      S )NrP   rS   )sys
executableendswithr   rX   is_file)r!   rL   s     r"   	conda_exezMenu.conda_exe_   sU    >>"";/''335 	D||~	 G}r$   exec                 v    d|j                   v ry|j                   dv rt        t        |      dgd      }d|v S y)NrU   T)rP   rO   info)universal_newlineszmicromamba versionF)r   r   rJ   )r!   r_   outs      r"   _is_micromambazMenu._is_micromambak   sA    388#8822C&1dKC'3..r$   c                     t         j                  dk(  rt        || j                  }t	        |      dz  }t        d |j                  d      D        |dz        }|dz  S )zJ
        Locate the python site-packages location on unix systems
        ntlibc              3   B   K   | ]  }|j                         s|  y wr'   )is_dir).0ps     r"   	<genexpr>z&Menu._site_packages.<locals>.<genexpr>|   s     HQXXZ1Hs   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   s]     77d?%%>[[F6lU"Hchhy&9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 
 
*

DcN 

 	4 	 	$ 4 
,T 
,"- "r$   r   c            
       n   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j8                  fdededefd       Zej8                  fdedefdZy	)MenuItemmenumetadatac                 ~    || _         | j                  |      | _        | j                  | j                        | _        y r'   )r~   _initialize_on_defaults_data_flatten_for_platformr   )r!   r~   r   s      r"   r#   zMenuItem.__init__   s1    	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                 0    dt        | j                        iS )NMENU_ITEM_LOCATION)rJ   r   r*   s    r"   r5   zMenuItem.placeholders   s     !#dmm"4
 	
r$   Nkeyr0   r1   c                 `    | j                   j                  |      }| j                  |||      S )Nr0   r1   )r   rW   r9   )r!   r   r0   r1   r/   s        r"   
render_keyzMenuItem.render_key   s-     !!#&{{5t5{99r$   r/   c           
         |dv r|S |||n| j                   d}t        |t              r | j                  j                  |fi |S t        |d      r?|j                         D ci c]#  \  }}| | j                  j                  |fi |% c}}S |D cg c]  } | j                  j                  |fi |! c}S c c}}w c c}w )N)NTFr   r6   )r5   
isinstancerJ   r~   r9   r4   r6   )r!   r/   r0   r1   kwargsr   items          r"   r9   zMenuItem.render   s     ''L#/UT5F5F
 eS!#499##E4V445'"MR[[][zsEC)))%:6::[[=BCT 		  00CC \Cs   &(B=$Cc                    t         j                  dk(  rt        | j                  d      }|syt	        dd      5 }|j                  |       ddd       |j                  d      r.t        j                  j                  d       |j                  g}nd	j                  g}t        |d
       t        j                  |j                         y# 1 sw Y   xY w)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     77d?%%5u37 	&3IIn%	&$$T*HHSXXu%88*C388$C3d#
		#((	& 	&s   CC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        t	        |       S # 1 sw Y   xY w)Nmenuinst.default.json
menu_itemsr   )openr   jsonloadr   )datafdefaultss      r"   r   z MenuItem._initialize_on_defaults   sM    )345 	5yy|L1!4H	5 8T**	5 	5s   AAr   platformc                 l   t        |       }|j                  di       }|j                  t        |      d      }|rB|j                         D ].  \  }}||vr|||<   |t        j                  d||       |||<   0 n||d<   | d   j                         D cg c]
  \  }}|	| c}}|d<   |S c c}}w )zN
        Merge platform keys with global keys, overwriting if needed.
        	platformsNz+Platform value %s=%s overrides global value)r   popplatform_keyr6   logdebug)r   r   	flattenedall_platformsthis_platformr   r/   s          r"   r   zMenuItem._flatten_for_platform   s    
 TN	!k26%)),x*@$G+113 +
Ui'%*IcN& IIKSRWX%*IcN+ &3Ik"
 #'{"3"9"9";"
Cu?PC"
	+ "
s   
B0#B0c                 T    | j                   d   j                  t        |            d uS )Nr   )r   rW   r   )r!   r   s     r"   enabled_for_platformzMenuItem.enabled_for_platform   s&    zz+&**<+A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}      sn   ?T ?T ?
 "$ " ""T
 ""T
 " 
d38n 
 
 OS::":3;DcN3K:	: QUDD $D5=d38n5MD	D("- " + + + =@\\ G s g  6 47<< OS OD Or$   r}   r   r%   c                 \    | dk(  ry| dk(  ry| j                  d      ryt        d|  d      )Nwin32windarwinosxlinuxz	Platform z is not supported)r   
ValueError)r   s    r"   r   r      s>    787#
y
*;<
==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     	 
    # ' ? ?   j" j"ZkO kO\ "% >3 ># > DJJ	(^A'*AALLN r$   