+
    )j#              	         R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RI	H
t
 ^ RIHtHt ^RIHtHt ^RIHtHtHtHtHtHtHt ]! ]4      t. R"OtR R	 ltR#R
 R lltR R ltR$R R llt]RRRRRR/R R ll4       t ]RRRRRR/R R ll4       t!]RRRRRRRR/R R ll4       t"]RRRRRRRR/R R ll4       t#R%R R llt$]!t%R]3R  R! llt&R# )& )annotationsN)	getLogger)Path)CallableUnion)MenuMenuItem)DEFAULT_BASE_PREFIXDEFAULT_PREFIX_UserOrSystemelevate_as_neededread_menuinst_tomluser_is_adminwrite_menuinst_tomlc               $    V ^8  d   QhRRRRRR/# )   base_prefixstrtarget_prefixreturnbool )formats   ",lib/python3.14/site-packages/menuinst/api.py__annotate__r   #   s!     4 4 4S 4T 4    c                    \        4       '       g   R # \        VR4      P                  4       '       d   R# \        V R4      P                  4       # )Fz	.nonadminT)r   r   is_file)r   r   s   &&r   _maybe_try_userr   #   s;    ??M;'//11[)1133r   c               0    V ^8  d   QhRRRRRRRRRR	R
R/# )r   prefixr   r   sourcer   pathslist[os.PathLike]distribution_name
str | Noner   Noner   )r   s   "r   r   r   +   sD     
 


 
 	

 "
 

r   c           	     z   V'       g   R# \        V 4      pV P                  V4      '       d   V'       d   VP                  RV4       VP                  R. 4      pV F!  pVP                  RVR\	        V4      /4       K#  	   \        W4       R#   \         d"    \        P                  RT R,          4        R# i ; i)z*Record created shortcuts to menuinst.toml.Nr%   	shortcutsr"   pathznCannot write menuinst.toml to %s (permission denied). Shortcut tracking will not be available for this prefix.r   )	r   samefile
setdefaultappendr   r   PermissionErrorlogdebug)r!   r   r"   r#   r%   datar)   r*   s   &&&&&   r   record_shortcutsr2   +   s     f%D {##(9+->? R0I(FFCI>? 
F) 
		GVO	

s   B (B:9B:c               $    V ^8  d   QhRRRRRR/# )r   r!   r   r"   r   r   r'   r   )r   s   "r   r   r   K   s!     
 
D 
# 
$ 
r   c                v   \        V 4      pV'       g   R# VP                  R. 4      pV'       g   R# V Uu. uF  qDP                  R4      V8w  g   K  VNK  	  pp\        V4      \        V4      8X  d   R# WRR&    \        W4       R# u upi   \         d"    \
        P                  RT R,          4        R# i ; i)a
  Remove shortcut entries matching source from menuinst.toml.

TODO: Use the recorded paths as the source of truth for shortcut removal,
instead of recomputing paths from menu JSON metadata. This would handle
cases where shortcuts were moved or the menu JSON changed.
Nr)   r"   z6Cannot update menuinst.toml at %s (permission denied).r   )r   getlenr   r.   r/   r0   )r!   r"   r1   r)   sfiltereds   &&    r   remove_shortcut_recordsr9   K   s     f%Db)I %B9ah6(A9HB
8}I& 
F) C  
		DVO	

s   BB:B (B87B8userc          
     ,    V ^8  d   QhRRRRRRRRRR	/# )
r   metadata_or_pathzos.PathLike | dictr   r&   r   _moder   r   ztuple[Menu, list[MenuItem]]r   )r   s   "r   r   r   i   s:      (  	
 !r   c                   T;'       g    \         pT;'       g    \        p\        V \        \        34      '       d4   \        V 4      ;_uu_ 4       p\        P                  ! V4      pR R R 4       MT p\        XR,          WV4      pVR,           Uu. uF  p\        Wg4      NK  	  ppWh3#   + '       g   i     LH; iu upi )N	menu_name
menu_items)
r   r
   
isinstancer   r   openjsonloadr   r	   )	r<   r   r   r=   fmetadatamenuitemr@   s	   &&&&     r   _loadrI   i   s     "33^M44!4K"S$K00"##qyy|H $# $%}5ID3;L3IJ3I4(4&3IJJ $#
 Ks   B*B=*B:	r   r   r=   c          
     ,    V ^8  d   QhRRRRRRRRRR	/# 
r   r<   zUnion[os.PathLike, dict]r   r&   r   r=   r   r   r$   r   )r   s   "r   r   r   |   s<     ! !.! ! 	!
 ! !r   c          	        T;'       g    \         pT;'       g    \        p\        WW#4      w  rEV Uu. uF  qfP                  4       '       g   K  VNK  	  ppV'       g7   \        P
                  ! R VP                   R\        P                   24       . # . pWtP                  4       ,          pV F  pWxP                  4       ,          pK  	  \        V \        \        34      '       d   \        V 4      P                  p	MVP                   R2p	\        \        V4      \        V4      V	VVP                  P                  R4      R7       V# u upi )Metadata for  is not enabled for .jsonDISTRIBUTION_NAME)r%   )r   r
   rI   enabled_for_platformwarningswarnnamesysplatformcreaterA   r   r   r2   placeholdersr5   
r<   r   r   r=   rG   r@   rH   r#   	menu_itemr"   s
   &$$$      r   installr[   {   s    "33^M44!4K-kQD#-M:41J1J1L$$:JMdii[0DS\\NST	E	[[]E	!!##   "S$K00&',,II;e$][++//0CD L/ Ns   E
E
c          
     ,    V ^8  d   QhRRRRRRRRRR	/# rK   r   )r   s   "r   r   r      s<     " "." " 	"
 " "r   c               f   T;'       g    \         pT;'       g    \        p\        WW#4      w  rEV Uu. uF  qfP                  4       '       g   K  VNK  	  ppV'       g7   \        P
                  ! R VP                   R\        P                   24       . # . pV F  pWxP                  4       ,          pK  	  WtP                  4       ,          pV'       g~   \        W4      '       dm   \        WVR4      w  rEV Uu. uF  qfP                  4       '       g   K  VNK  	  ppV F  pWxP                  4       ,          pK  	  WtP                  4       ,          p\        V \        \        34      '       d   \        V 4      P                  p	MVP                   R2p	\        \        V4      V	4       V# u upi u upi )rM   rN   r:   rO   )r   r
   rI   rQ   rR   rS   rT   rU   rV   remover   rA   r   r   r9   rY   s
   &$$$      r   r^   r^      sb    "33^M44!4K-kQD#-M:41J1J1L$$:JMdii[0DS\\NST	E	!!##  	[[]E_]@@ !1+vV'1Qzt5N5N5Pddz
Q#I%%''E $ "S$K00&',,II;e$D/8L1 N Rs   F)F)8F.F.filterc          
     ,    V ^8  d   QhRRRRRRRRRR	/# 
r   r   r&   r   r_   Callable | Noner=   r   r   list[tuple[os.PathLike]]r   )r   s   "r   r   r      sC     	L 	L	L 	L 		L
 	L 	Lr   c                d    T ;'       g    \         p T;'       g    \        p\        \        WW#4      # N)r   r
   _process_allr[   r   r   r_   r=   s   $$$$r   install_allrh      s.     "33^M44!4KVKKr   c          
     ,    V ^8  d   QhRRRRRRRRRR	/# ra   r   )r   s   "r   r   r      sC     	K 	K	K 	K 		K
 	K 	Kr   c                d    T ;'       g    \         p T;'       g    \        p\        \        WW#4      # re   )r   r
   rf   r^   rg   s   $$$$r   
remove_allrk      s.     "33^M44!4KFJJr   c               0    V ^8  d   QhRRRRRRRRRR	R
R/# )r   functionz^Callable[[Union[os.PathLike, dict], str | None, str | None, _UserOrSystem], list[os.PathLike]]r   r&   r   r_   rb   r=   r   r   rc   r   )r   s   "r   r   r      sH       	
    r   c           
        T;'       g    \         pT;'       g    \        p\        V4      R ,          P                  R4      p. pV F5  pVf   K	  V! V4      '       g   K   VP	                  V ! VVVVR7      4       K7  	  V#   \
        P                   d(   p\        P                  RT RT R24        Rp?Kr  Rp?ii ; i)r   z*.jsonN)r   r   r=   z	Skipping z: malformed JSON ())	r   r
   r   globr-   rC   JSONDecodeErrorr/   warning)	rm   r   r   r_   r=   jsonsresultsr*   excs	   &&&&&    r   rf   rf      s     "33^M44!4K- 6)//9EG&,,
H&3$/#	  N '' Hiv-?uAFGGHs    BB=B88B=Fc               $    V ^8  d   QhRRRRRR/# )r   r*   r   r^   r   r!   r   )r   s   "r   r   r      s!     !? !?3 !? !?c !?r   c                   \         P                  R8X  d   V P                  RR4      p \         P                  P	                  W 4      p\        V4      ;_uu_ 4       p\        P                  ! V4      pRRR4       RX9  d   RV9  d|   ^RIH	p \         P                  R8X  dJ   VP                  RVP                  R	\        4      4       VR,          f
   \        VR&   V! V3R
VRV/VB  R# \        P                  R4       R# VP                  R	VP                  R\        4      4       VR	,          f
   \        VR	&   V'       d   \        V3RV/VB  R# \        V3RV/VB  R#   + '       g   i     L; i)zp
This function is only here as a legacy adapter for menuinst v1.x.
Please use `menuinst.api` functions instead.
nt/\Nz$schemaz$id)r[   root_prefixr   r^   r!   zymenuinst._legacy is only supported on Windows. Switch to the new-style menu definitions for cross-platform compatibility.r   )osrT   replacer*   joinrB   rC   rD   _legacyr[   r,   popr
   r/   rr   _api_remove)r*   r^   r!   kwargs	json_pathrE   rF   _legacy_installs   &&&,    r   _install_adapterr      s&   
 
ww$||C&V*I	iA99Q< 
 U(%:777d?mVZZGZ-[\m$,(;}%INfNVNvNKK4 	-MCV)WX- ($7F=!	BB6BI>V>v>3 
s   E$$E4	)r[   r^   rh   rk   re   )NNr:   )NNNr:   )'__doc__
__future__r   rC   r|   rU   rR   loggingr   pathlibr   typingr   r   	platformsr   r	   utilsr
   r   r   r   r   r   r   __name__r/   __all__r   r2   r9   rI   r[   r^   rh   rk   rf   r   r   r   r   r   <module>r      s]    "  	 
    " %   4
@
<$ ! !%! #	!
 "! !H " !%" #	"
 "" "J 	L $	L #	L #		L
 "	L 	L 	K $	K #	K #		K
 "	K 	K:  05N !? !?r   