
    +nOg.                        d Z ddlm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 ddlmZ dd	lmZmZmZ 	 dd
lmZ ej2                  rddlmZmZ ddlmZ  ej<                  e      Z dZ!dZ"dZ#e# dZ$e# dZ%e# dZ&e# dZ'e# dZ(e# dZ)ddhZ*d+dZ+d,dZ,d,dZ-d-dZ.d,dZ/d-dZ0d,dZ1e+ ejd                  d      d-d               Z3e+ ejd                  d      d-d!              Z4e+ ejd                  d      d-d"              Z5e+ ejd                  d      d-d#              Z6e+ ejd                  d      d-d$              Z7 G d% d&ejp                        Z9	 	 	 	 d.d'Z:d/d(Z;ed0d)       Z<ed1d*       Z=y# e$ r dZY Dw xY w)2zCConda plugin that adds telemetry headers to requests made by conda.    )annotationsN)context)list_packages)PrimitiveParametermask_anaconda_token)all_channel_urls)CondaRequestHeaderCondaSettinghookimpl)__version__zn/a)IteratorSequence)Callable;iX  zAnaconda-Telemetryz-Virtual-Packagesz	-Channelsz	-Packagesz-Searchz-Installz	-Sys-Infozrepo.anaconda.comzconda.anaconda.orgc                D     t        j                         d fd       }|S )z$Log the duration of a function call.c                    t         j                         t        j                  k  rXt	        j
                         } | i |}t	        j
                         }||z
  }t         j                  dj                  |       |S  | i |S )zWrap the given function.z'function: %s; duration (seconds): %0.4f)loggergetEffectiveLevelloggingINFOtimeperf_counterinfo__name__)argskwargsticvaluetocelapsed_timefuncs         >lib/python3.12/site-packages/conda_anaconda_telemetry/hooks.pywrapper_timerztimer.<locals>.wrapper_timer@   s~     ##%5##%C$)&)E##%C9LKK9
 LT$V$$    )r   tupler   dictreturnr   )	functoolswraps)r"   r$   s   ` r#   timerr+   =   s(     __T% %  r%   c                 ^    t        d t        j                  j                         D              S )z>Retrieve the registered virtual packages from conda's context.c              3  l   K   | ],  }|j                    d |j                   d |j                    . yw)=N)nameversionbuild).0packages     r#   	<genexpr>z'get_virtual_packages.<locals>.<genexpr>V   s6      KG <<.'//*!GMM?;Ks   24)r&   r   plugin_managerget_virtual_package_records r%   r#   get_virtual_packagesr8   T   s+     --IIK  r%   c                 j    t        t        t        j                              } t	        d | D              S )zFReturn a list of currently configured channel URLs with tokens masked.c              3  2   K   | ]  }t        |        y w)Nr   )r2   cs     r#   r4   z#get_channel_urls.<locals>.<genexpr>_   s     :A$Q's   )listr	   r   channelsr&   )r=   s    r#   get_channel_urlsr>   \   s)    $W%5%567H::::r%   c                 6    t         j                  j                  S )zJUse ``sys.argv`` to determine the conda command that is current being run.)r   _argparse_argscmdr7   r%   r#   get_conda_commandrB   b   s    !!%%%r%   c                 j    t         j                  xs t         j                  } t        | d      \  }}|S )z9Retrieve the list of packages in the current environment.	canonical)format)r   active_prefixroot_prefixr   )prefix_packagess      r#   get_package_listrK   g   s-    ""9g&9&9F{;KAxOr%   c                 6    t         j                  j                  S )z?Retrieve the search term being used when search command is run.)r   r@   
match_specr7   r%   r#   get_search_termrN   o   s    !!,,,r%   c                 6    t         j                  j                  S )z!Get the parsed position argument.)r   r@   rJ   r7   r%   r#   get_install_argumentsrP   t   s    !!***r%   c                 x    t         t               d} t        j                  d | j	                         D              S )z:Return ``;`` delimited string of extra system information.)conda_build_versionconda_commandc              3  0   K   | ]  \  }}| d |   yw):Nr7   )r2   keyr   s      r#   r4   z,get_sys_info_header_value.<locals>.<genexpr>   s$       +AZS%3%q+As   )rR   rB   FIELD_SEPARATORjoinitems)telemetry_datas    r#   get_sys_info_header_valuer[   y   s?    
  3*,N
   +9+?+?+A   r%   c                 <    t         j                  t                     S z<Return ``FIELD_SEPARATOR`` delimited string of channel URLs.)rW   rX   r>   r7   r%   r#   get_channel_urls_header_valuer^            0 233r%   c                 <    t         j                  t                     S )z@Return ``FIELD_SEPARATOR`` delimited string of virtual packages.)rW   rX   r8   r7   r%   r#   !get_virtual_packages_header_valuera      s      4 677r%   c                 <    t         j                  t                     S r]   )rW   rX   rP   r7   r%   r#   "get_install_arguments_header_valuerc      s      5 788r%   c                 <    t         j                  t                     S )zAReturn ``FIELD_SEPARATOR`` delimited string of install arguments.)rW   rX   rK   r7   r%   r#   #get_installed_packages_header_valuere      r_   r%   c                  &    e Zd ZU dZded<   ded<   y)HeaderWrapperzIObject that wraps ``CondaRequestHeader`` and adds a ``size_limit`` field.r
   headerint
size_limitN)r   
__module____qualname____doc____annotations__r7   r%   r#   rg   rg      s    SOr%   rg   c              #     K   | D ]B  }|j                   j                  d|j                   |j                   _        |j                    D yw)zMake sure that all headers combined are not larger than ``SIZE_LIMIT``.

    Any headers over their individual limits will be truncated.
    N)rh   r   rj   )header_wrapperswrappers     r#   validate_headersrr      s@      #&~~334Hg6H6HInn #s   A	Ac            
        t        t        t        t                     d      t        t        t        t                     d      t        t        t        t                     d      t        t        t        t                     d      g} t               }|dk(  r5| j                  t        t        t        t                     d             | S |dv r3| j                  t        t        t        t                     d             | S )N)r/   r   i  )rh   rj   i  search>   createinstall)rg   r
   HEADER_SYS_INFOr[   HEADER_CHANNELSr^   HEADER_VIRTUAL_PACKAGESra   HEADER_PACKAGESre   rB   appendHEADER_SEARCHrN   HEADER_INSTALLrc   )custom_headerscommands     r#   _conda_request_headersr      s   %$/1 	
 	%$35 	
 	%,79 	
 	%$9; 	
-N>  !G()&)+ 	
*  
)	))'<> 	
 r%   c              #     K   t         j                  j                  r&	 | t        v rt	        t                     E d{    yyy7 # t        $ r!}t        j                  d|       Y d}~yd}~ww xY ww)z>Return a list of custom headers to be included in the request.Nz Failed to collect telemetry data)exc_info)	r   pluginsanaconda_telemetryREQUEST_HEADER_HOSTSrr   r   	Exceptionr   debug)hostexcs     r#   conda_session_headersr      sk      ))	K+++,B,DEEE , * F 	KLL;cLJJ	Ks>   A3A AA A3A 	A0A+&A3+A00A3c               #  J   K   t        ddt        dt                     yw)z=Return a list of settings that can be configured by the user.r   z%Whether Anaconda Telemetry is enabledT)element_type)r/   description	parameterN)r   r   boolr7   r%   r#   conda_settingsr      s%      !;$T= s   !#)r"   r   r(   r   )r(   ztuple[str, ...])r(   str)rp   Sequence[HeaderWrapper]r(   Iterator[CondaRequestHeader])r(   r   )r   r   r(   r   )r(   zIterator[CondaSetting])>rm   
__future__r   r)   r   r   typingconda.base.contextr   conda.cli.main_listr   conda.common.configurationr   conda.common.urlr   conda.models.channelr	   conda.pluginsr
   r   r   conda_buildr   rR   ImportErrorTYPE_CHECKINGcollections.abcr   r   r   	getLoggerr   r   rW   
SIZE_LIMITHEADER_PREFIXry   rx   rz   r|   r}   rw   r   r+   r8   r>   rB   rK   rN   rP   	lru_cacher[   r^   ra   rc   re   
NamedTuplerg   rr   r   r   r   r7   r%   r#   <module>r      s2   J "     & - 9 0 1 D D > 
2			8	$  
 % +O+<=  #O9- #O9- !/) "?(+ #O9- ,-AB .;&
-
+
 T	  	 T4  4
 T8  8
 T9  9
 T4  4
F%% 	,	!	8v 
K 
K 
 
Q    s   F FF