
     [1f1                         d Z ddl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mZmZ ddlmZ dd	lmZmZ d
dlmZmZmZ  ee      Z G d de      Z G d de      ZdddZy)
    N)sha1)	getLogger)Path)DictOptionalTuple   )data)UnixLex
logged_run   )MenuMenuItemmenuitem_defaultsc                   \     e Zd ZdefdZdefdZedeeef   f fd       Z	defdZ
 xZS )	MacOSMenureturnc                 "    | j                         S N_pathsselfs    6lib/python3.12/site-packages/menuinst/platforms/osx.pycreatezMacOSMenu.create       {{}    c                 "    | j                         S r   r   r   s    r   removezMacOSMenu.remove   r   r   c                     t         |   }|j                  t        | j	                               dt        | j
                  dz  dz  dz  dz        d       |S )Nicnsz
python.appContentsMacOSpython)SP_DIRICON_EXT	PYTHONAPP)superplaceholdersupdatestr_site_packagesprefix)r   r*   	__class__s     r   r*   zMacOSMenu.placeholders   s]    w+d1134" |!;j!H7!RU]!]^	
 r   c                      y)N r1   r   s    r   r   zMacOSMenu._paths&   s    r   )__name__
__module____qualname__r	   r   r    propertyr   r,   r*   r   __classcell__r/   s   @r   r   r      sJ       	d38n 	 	 r   r   c                   F    e Zd Zedefd       Zedefd       Zedefd       ZdefdZ	 fdZ
dee   fdZdee   fdZdee   fd	Zd
 Zd Zd ZdefdZddeej*                     dej*                  fdZddeej*                     dej*                  fdZddeej*                     dej*                  fdZddeej*                     dej*                  fdZdeej*                     fdZdefdZdefdZddedefdZddedefdZddZd Z ede!fd       Z" xZ#S ) MacOSMenuItemr   c                 B    | j                         dz  | j                  z  S )z1Path to the .app directory defining the menu itemApplications)_base_location_bundle_namer   s    r   locationzMacOSMenuItem.location+   s#     ""$~58I8IIIr   c                 .    | j                  di        dS )Nname)extraz.app)
render_keyr   s    r   r=   zMacOSMenuItem._bundle_name0   s    //&/34D99r   c                 @    | j                   dz  dz  | j                  z  S )zAPath to the nested .app directory defining the menu item main appr#   	Resources)r>   r=   r   s    r   _nested_locationzMacOSMenuItem._nested_location4   s#     }}z)K7$:K:KKKr   c                 |    | j                   j                  dk(  rt        d      j                         S t        d      S )Nuser~/)menumoder   
expanduserr   s    r   r<   zMacOSMenuItem._base_location9   s/    99>>V#9''))Cyr   c                    t         |           | j                  d   xs i j                         D ]  \  }}| j                  | j                  |      z  j                         }t        |      j                  t        | j                              st        d| j                   d| d      |j                  j                  dd       t        j                  | j                  |      |        y )Nlink_in_bundlezF'link_in_bundle' destinations MUST be created inside the .app bundle (z), but it points to '.Tparentsexist_ok)r)   
_precreatemetadataitemsr>   renderresolver,   
startswith
ValueErrorparentmkdirossymlink)r   srcdestrendered_destr/   s       r   rS   zMacOSMenuItem._precreate>   s    --(89?RFFH 		8IC#'==4;;t3D#D"M"M"OM}%00T]]1CD //3}}o=RS`Raabd    &&td&CJJt{{3'7		8r   c                    t         j                  d| j                         | j                          | j	                          | j                          | j                          | j                          | j                          | j                          | j                          | j                          | j                          | j                          | j                  fS )NzCreating %s)logdebugr>   _create_application_treerS   
_copy_icon_write_pkginfo_write_plistinfo_write_appkit_launcher_write_launcher_write_script_write_event_handler#_maybe_register_with_launchservices_sign_with_entitlementsr   s    r   r   zMacOSMenuItem.createK   s    		-/%%'##%!!#002$$&r   c                     t         j                  d| j                         | j                  d       t	        j
                  | j                  d       | j                  fS )NzRemoving %sF)registerT)ignore_errors)rb   rc   r>   rl   shutilrmtreer   s    r   r    zMacOSMenuItem.removeZ   sD    		-/00%0@dmm48r   c                     | j                   dz  dz  | j                   dz  dz  g}| j                  r'|| j                  dz  dz  | j                  dz  dz  gz  }|D ]  }|j                  dd        t	        |      S )Nr#   rD   r$   TFrP   )r>   _needs_appkit_launcherrE   r[   tuple)r   pathspaths      r   rd   z&MacOSMenuItem._create_application_tree`   s    MMJ&4MMJ&0
 &&%%
2[@%%
2W< E  	5DJJteJ4	5U|r   c                     | j                  d      }|rZt        j                  || j                  dz  dz         | j                  r't        j                  || j
                  dz  dz         y y y )Niconr#   rD   )rB   rq   copyr>   rt   rE   )r   ry   s     r   re   zMacOSMenuItem._copy_iconn   s`    v&KKdmmj8;FG**D$"7"7*"D{"RS + r   c           	         | j                   g}| j                  r|j                  | j                         |D ]E  }t	        |dz  dz  d      5 }|j                  d| j                  dd      d d         d d d        G y # 1 sw Y   RxY w)	Nr#   PkgInfowAPPLr@   Tslug   )r>   rt   appendrE   openwriterB   )r   app_bundlesappfs       r   rf   zMacOSMenuItem._write_pkginfou   s    }}o&&t445 	ICcJ&2C8 IA$tvDA"1EFGHI I	II Is   )B  B		c           	      6   | j                  d      }| j                  dd      }t        |      dkD  r1|d d t        |j                               j	                         d d z   }n|}|||| dd| d	d
d
d}| j                  d      }|rt        |      j                  |d<   | j                  rIt        | j                  dz  dz  d      5 }t        j                  ||       d d d        d|d<   d| d|d<   g t        dd}t        d   d   D ]4  }||v r| j                  |      }	|	|dk(  r|	|d<   | d|	 |d<   |	||<   6 t        | j                  dz  dz  d      5 }t        j                  ||       d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nr@   Tr      
      z-1.0.0com.r~   z1.0.0)CFBundleNameCFBundleDisplayNameCFBundleExecutableCFBundleGetInfoStringCFBundleIdentifierCFBundlePackageTypeCFBundleVersionCFBundleShortVersionStringry   CFBundleIconFiler#   z
Info.plistwbLSBackgroundOnlyz-appkit-launcherr   entitlementsrN   	platformsosxr   r   -r   )rB   lenr   encode	hexdigestr   r@   rt   r   rE   plistlibdumpr   r>   )
r   r@   slugname	shortnameplry   r   ignore_keyskeyvalues
             r   rg   zMacOSMenuItem._write_plistinfo}   s   v&??6?5x=2 "X__->(?(I(I(KBQ(OOI I%#'"*(0z%8$(
"3#)&*1	
 v&%)$Z__B!"&&d++j8<GN %RSb!$% &*B!")-hZ7G'HB#$ M)L>L;KL$[1%8 
	Ck!OOC(E}''38/019
!E7.C*+BsG
	 $--*,|;TB 	!aMM"a 	! 	!'% %&	! 	!s   
F#FFFc           	         dg}| j                  d      r|j                  g d       | j                  d      }|r1t        |      j                  dd       |j	                  d| d       | j                  d	      }|r|j	                  |       | j
                  d
   re| j                  j                  }| j                  j                  |      rd}nd}|j	                  d| d| d| j                  j                   d       |j	                  dj                  t        j                  | j                  d                         dj                  |      S )Nz	#!/bin/shterminal)z@if [ "${__CFBundleIdentifier:-}" != "com.apple.Terminal" ]; thenz#    open -b com.apple.terminal "$0"z    exit $?fiworking_dirTrP   zcd ""
precommandactivatezshell activatezshell.bash activatez	eval "$("z" z "z")" commandr   )rB   extendr   r[   r   rT   rJ   	conda_exe_is_micromambar.   joinr   
quote_args)r   linesr   r   r   r   s         r   _commandzMacOSMenuItem._command   s    ??:& LL oom4##D4#@LL4}A./__\2
LL$==$		++Iyy''	2+0LL9YKr(2dii>N>N=OsSTSXXg001KLMNyyr   launcher_pathc                     || j                         }t        j                  | j                         |       t	        j
                  |d       |S N  )_default_appkit_launcher_pathrq   rz   _find_appkit_launcherr\   chmodr   r   s     r   rh   z$MacOSMenuItem._write_appkit_launcher   sA      >>@MD..0-@
&r   c                     || j                         }t        j                  | j                         |       t	        j
                  |d       |S r   )_default_launcher_pathrq   rz   _find_launcherr\   r   r   s     r   ri   zMacOSMenuItem._write_launcher   sA      779MD'')=9
&r   script_pathc                     || j                  d      }t        |d      5 }|j                  | j                                d d d        t	        j
                  |d       |S # 1 sw Y   !xY w)Nz-script)suffixr}   r   )r   r   r   r   r\   r   )r   r   r   s      r   rj   zMacOSMenuItem._write_script   sb    55Y5GK+s# 	%qGGDMMO$	%
e$	% 	%s    A!!A*c                    | j                   sy | j                  d      }|y || j                  dz  dz  dz  }t        |d      5 }|j	                  d| d       d d d        t        j                  |d       |S # 1 sw Y   !xY w)	Nevent_handlerr#   rD   zhandle-eventr}   z#!/bin/bash
r   r   )rt   rB   r>   r   r   r\   r   )r   r   event_handler_logicr   s       r   rk   z"MacOSMenuItem._write_event_handler   s    **"ooo>&--*4{B^SK+s# 	=qGGm$7#8;<	=
e$	= 	=s   A;;Bc                     | j                   fS r   )r>   r   s    r   r   zMacOSMenuItem._paths   s    r   c                 (   dt        j                          }t        j                  D ]I  }t	        |      |z  }|j                         s"t        j                  |t        j                        sG|c S  t        dt        j                                )Nappkit_launcher_'Could not find executable launcher for 
platformmachine_menuinst_data__path__r   is_filer\   accessX_OKrY   r   launcher_namedatapathr   s       r   r   z#MacOSMenuItem._find_appkit_launcher   s}    *8+;+;+=*>?&// 	%H N]:M$$&299]BGG+L$$	% B8CSCSCUBVWXXr   c                 (   dt        j                          }t        j                  D ]I  }t	        |      |z  }|j                         s"t        j                  |t        j                        sG|c S  t        dt        j                                )Nosx_launcher_r   r   r   s       r   r   zMacOSMenuItem._find_launcher   s}    '(8(8(:';<&// 	%H N]:M$$&299]BGG+L$$	% B8CSCSCUBVWXXr   r   c                 Z    | j                  dd      }| j                  dz  dz  | | z  S Nr@   Tr   r#   r$   )rB   r>   r   r   r@   s      r   r   z+MacOSMenuItem._default_appkit_launcher_path  s6    vD1}}z)G3vh6GGGr   c                     | j                  dd      }| j                  r| j                  dz  dz  | | z  S | j                  dz  dz  | | z  S r   )rB   rt   rE   r>   r   s      r   r   z$MacOSMenuItem._default_launcher_path  sc    vD1&&((:5?TF6(BSSS}}z)G3vh6GGGr   c                     | j                   sy |r t        dt        | j                               y t        dddt        | j                               y )Nz-Rz-uz-all)rt   _lsregisterr,   r>   )r   ro   s     r   rl   z1MacOSMenuItem._maybe_register_with_launchservices  s;    **c$--01dFC,>?r   c                 \   | j                  d      }|sy| j                  dd      }|D ci c]  }|d }}| j                  dz  dz  }t        |d      5 }t        j                  ||       ddd       t        d	d
dddd| ddddd|| j                  gd       yc c}w # 1 sw Y   6xY w)z1Self-sign shortcut to apply required entitlementsr   Nr@   Tr   r#   zEntitlements.plistr   z/usr/bin/codesignz	--verbosez--signr   z--prefixr   z	--optionsruntimez--forcez--deepz--entitlementscheck)rB   r>   r   r   r   r   )r   entitlement_keysr   r   plistentitlements_pathr   s          r   rm   z%MacOSMenuItem._sign_with_entitlements  s    ??>:??6?5&67sd77 MMJ69MM#T* 	$aMM%#	$ $xj! !  #	
	 8	$ 	$s   
BB""B+c                 t    d}t        |D cg c]  }| j                  j                  |       c}      S c c}w )a[  
        In macOS, file type and URL protocol associations are handled by the
        Apple Events system. When the user opens on a file or URL, the system
        will send an Apple Event to the application that was registered as a handler.
        We need a special launcher to handle these events and pass them to the
        wrapped application in the shortcut.

        See:
        - https://developer.apple.com/library/archive/documentation/Carbon/Conceptual/LaunchServicesConcepts/LSCConcepts/LSCConcepts.html  # noqa
        - The source code at /src/appkit-launcher in this repository
        )CFBundleURLTypesCFBundleDocumentTypes)anyrT   get)r   needed_keysks      r   rt   z$MacOSMenuItem._needs_appkit_launcher5  s2     D+>QDMM%%a(>??>s   "5r   ) )T)$r2   r3   r4   r5   r   r>   r,   r=   rE   r<   rS   r	   r   r    rd   re   rf   rg   r   r   r\   PathLikerh   ri   rj   rk   r   r   r   r   r   rl   rm   boolrt   r6   r7   s   @r   r9   r9   *   s   J$ J J :c : : L$ L L 
8 d   d  %+ TI,!\! # ! FHR[[4I UWU`U` Xbkk-B bkk "++)> "++ 0E QSQ\Q\  bkk*  Yt YY YHC H HHS H$ H@
< @ @ @r   r9   Tr   c                 (    d}t        |g|fd| i|S )Nzh/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregisterr   )r   )r   argskwargsexes       r   r   r   F  s*    	B  slTl:%:6::r   )__doc__r\   r   r   rq   hashlibr   loggingr   pathlibr   typingr   r   r	   r   r   r   utilsr   r   baser   r   r   r2   rb   r   r9   r   r1   r   r   <module>r      sb    	       ( ( % ' 3 3 .Y@H Y@x " ;r   