
    ,h                    R   U 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ZddlZddl	m
Z
mZ ddlmZ ddlZe
rddlmZmZ e
s ej&                         dk(  rddlZddlmZ n G d	 d
      Z e       Zded<    G d d      Z G d d      Z G d d      Z G d de      Z G d d      Zy)zo
Environment info about Microsoft Compilers.

>>> getfixture('windows_only')
>>> ei = EnvironmentInfo('amd64')
    )annotationsN)TYPE_CHECKING	TypedDict)unique_everseen)LiteralStringNotRequiredWindows)environc                      e Zd ZdZdZdZdZy)winregN)__name__
__module____qualname__
HKEY_USERSHKEY_CURRENT_USERHKEY_LOCAL_MACHINEHKEY_CLASSES_ROOT     Q/var/www/html/Resume-Scraper/venv/lib/python3.12/site-packages/setuptools/msvc.pyr   r       s    
 ! r   r   zdict[str, str]r
   c                      e Zd ZdZ ej
                  dd      j                         ZddZe	d        Z
d Zd ZdddZddd	Zdd
Zy)PlatformInfoz
    Current and Target Architectures information.

    Parameters
    ----------
    arch: str
        Target architecture.
    processor_architecture c                N    |j                         j                  dd      | _        y )Nx64amd64)lowerreplacearch)selfr    s     r   __init__zPlatformInfo.__init__5   s    JJL((8	r   c                X    | j                   | j                   j                  d      dz   d S )zs
        Return Target CPU architecture.

        Return
        ------
        str
            Target CPU
        _   N)r    findr!   s    r   
target_cpuzPlatformInfo.target_cpu8   s(     yy,q0233r   c                     | j                   dk(  S )z
        Return True if target CPU is x86 32 bits..

        Return
        ------
        bool
            CPU is x86 32 bits
        x86r(   r'   s    r   target_is_x86zPlatformInfo.target_is_x86D   s     %''r   c                     | j                   dk(  S )z
        Return True if current CPU is x86 32 bits..

        Return
        ------
        bool
            CPU is x86 32 bits
        r*   current_cpur'   s    r   current_is_x86zPlatformInfo.current_is_x86O   s     5((r   c                l    | j                   dk(  r|rdS | j                   dk(  r|rdS d| j                    S )uk  
        Current platform specific subfolder.

        Parameters
        ----------
        hidex86: bool
            return '' and not '' if architecture is x86.
        x64: bool
            return 'd' and not 'md64' if architecture is amd64.

        Return
        ------
        str
            subfolder: '	arget', or '' (see hidex86 parameter)
        r*   r   r   \x64\r.   r!   hidex86r   s      r   current_dirzPlatformInfo.current_dirZ   sR    $   E)g 	
   G+ 	

 d&&'(	
r   c                l    | j                   dk(  r|rdS | j                   dk(  r|rdS d| j                    S )ar  
        Target platform specific subfolder.

        Parameters
        ----------
        hidex86: bool
            return '' and not '\x86' if architecture is x86.
        x64: bool
            return '\x64' and not '\amd64' if architecture is amd64.

        Return
        ------
        str
            subfolder: '\current', or '' (see hidex86 parameter)
        r*   r   r   r2   r3   r+   r4   s      r   
target_dirzPlatformInfo.target_dirr   sL    $ 5(W 	
 7*s 	

 doo&'	
r   c                    |rdn| j                   }| j                  |k(  rdS | j                         j                  dd| d      S )ap  
        Cross platform specific subfolder.

        Parameters
        ----------
        forcex86: bool
            Use 'x86' as current architecture even if current architecture is
            not x86.

        Return
        ------
        str
            subfolder: '' if target architecture is current architecture,
            '\current_target' if not.
        r*   r   r3   r$   )r/   r(   r8   r   )r!   forcex86currents      r   	cross_dirzPlatformInfo.cross_dir   sQ      $%)9)9 ') 	
 "**42gYaA	
r   NreturnNone)FFr>   strF)r   r   r   __doc__r
   getr   r/   r"   propertyr(   r,   r0   r6   r8   r<   r   r   r   r   r   )   sW     '++6;AACK9 	4 	4	(	)
0
0
r   r   c                     e Zd ZdZej
                  ej                  ej                  ej                  fZ	ddZ
edd       Zed        Zed        Zed        Zedd       Zedd       Zed	        Zed
        Zedd       ZddZd Zy)RegistryInfoz
    Microsoft Visual Studio related registry information.

    Parameters
    ----------
    platform_info: PlatformInfo
        "PlatformInfo" instance.
    c                    || _         y N)pi)r!   platform_infos     r   r"   zRegistryInfo.__init__   s	    r   c                     y)z
        Microsoft Visual Studio root registry key.

        Return
        ------
        str
            Registry key
        VisualStudior   r'   s    r   visualstudiozRegistryInfo.visualstudio   s     r   c                V    t         j                  j                  | j                  d      S )z
        Microsoft Visual Studio SxS registry key.

        Return
        ------
        str
            Registry key
        SxS)ospathjoinrN   r'   s    r   sxszRegistryInfo.sxs   s     ww||D--u55r   c                V    t         j                  j                  | j                  d      S )z|
        Microsoft Visual C++ VC7 registry key.

        Return
        ------
        str
            Registry key
        VC7rQ   rR   rS   rT   r'   s    r   vczRegistryInfo.vc        ww||DHHe,,r   c                V    t         j                  j                  | j                  d      S )z
        Microsoft Visual Studio VS7 registry key.

        Return
        ------
        str
            Registry key
        VS7rW   r'   s    r   vszRegistryInfo.vs   rY   r   c                     y)z
        Microsoft Visual C++ for Python registry key.

        Return
        ------
        str
            Registry key
        zDevDiv\VCForPythonr   r'   s    r   vc_for_pythonzRegistryInfo.vc_for_python   s     %r   c                     y)zq
        Microsoft SDK registry key.

        Return
        ------
        str
            Registry key
        zMicrosoft SDKsr   r'   s    r   microsoft_sdkzRegistryInfo.microsoft_sdk   s      r   c                V    t         j                  j                  | j                  d      S )z
        Microsoft Windows/Platform SDK registry key.

        Return
        ------
        str
            Registry key
        r	   rQ   rR   rS   r`   r'   s    r   windows_sdkzRegistryInfo.windows_sdk   s     ww||D..	::r   c                V    t         j                  j                  | j                  d      S )z
        Microsoft .NET Framework SDK registry key.

        Return
        ------
        str
            Registry key
        NETFXSDKrb   r'   s    r   	netfx_sdkzRegistryInfo.netfx_sdk
  s     ww||D..
;;r   c                     y)z
        Microsoft Windows Kits Roots registry key.

        Return
        ------
        str
            Registry key
        zWindows Kits\Installed Rootsr   r'   s    r   windows_kits_rootszRegistryInfo.windows_kits_roots  s     /r   c                    | j                   j                         s|rdnd}t        j                  j	                  d|d|      S )a  
        Return key in Microsoft software registry.

        Parameters
        ----------
        key: str
            Registry key path where look.
        x86: str
            Force x86 software registry.

        Return
        ------
        str
            Registry key
        r   Wow6432NodeSoftware	Microsoft)rJ   r0   rQ   rR   rS   )r!   keyr*   node64s       r   	microsoftzRegistryInfo.microsoft"  s5      ww--/3Mww||JSAAr   c           	        t         j                  }t         j                  }t         j                  }| j                  }| j
                  D ]>  }d}	  || ||      d|      }	 t        j                  ||      d   |r ||       c S c S  y# t        $ rC | j                  j                         s$	  || ||d      d|      }n# t        $ r Y Y w xY wY Y vw xY w# t        $ r Y nw xY w	 |s ||       # |r	 ||       w w xY w)a  
        Look for values in registry in Microsoft software registry.

        Parameters
        ----------
        key: str
            Registry key path where look.
        name: str
            Value name to find.

        Return
        ------
        str
            value
        Nr   T)
r   KEY_READOpenKeyCloseKeyro   HKEYSOSErrorrJ   r0   QueryValueEx)	r!   rm   namekey_readopenkeyclosekeymshkeybkeys	            r   lookupzRegistryInfo.lookup5  s     ??..??^^JJ 	#DD	tRWa:#**46q9 TN #	#&   ww--/!&tRT]AxH" ! ! 	   TN TN sZ   B!C#C/CC	CCCCC	C&#C6%C&&C66DNr=   r@   rB   )r   r   r   rC   r   r   r   r   r   rt   r"   rE   rN   rT   rX   r\   r^   r`   rc   rf   rh   ro   r~   r   r   r   rG   rG      s     	  !!  	E  	 	 	6 	6 	- 	- 	- 	- 	% 	% 	  	  	; 	; 	< 	< 	/ 	/B&'r   rG   c                     e Zd ZdZ ej
                  dd      Z ej
                  dd      Z ej
                  de      Zdd dZ	d Z
d	 Zd!d
Zed        Zed        Zed        Zd Zd Zed"d       Zed        Zed#d       Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed$d       Zed$d       Z d$dZ!ed%d       Z"y)&
SystemInfoz
    Microsoft Windows and Visual Studio related system information.

    Parameters
    ----------
    registry_info: RegistryInfo
        "RegistryInfo" instance.
    vc_ver: float
        Required Microsoft Visual C++ version.
    WinDirr   ProgramFileszProgramFiles(x86)Nc                    || _         | j                   j                  | _        | j                         | _        |xs | j	                         x| _        | _        y rI   )rirJ   find_programdata_vs_versknown_vs_paths_find_latest_available_vs_vervs_vervc_ver)r!   registry_infor   s      r   r"   zSystemInfo.__init__q  sG    ''**";;= %+$Rd.P.P.RRdkr   c                    | j                         }|s+| j                  st        j                  j	                  d      t        |      }|j                  | j                         t        |      d   S )zm
        Find the latest VC version

        Return
        ------
        float
            version
        z%No Microsoft Visual C++ version found)find_reg_vs_versr   	distutilserrorsDistutilsPlatformErrorsetupdatesorted)r!   reg_vc_versvc_verss      r   r   z(SystemInfo._find_latest_available_vs_verz  sf     ++-t22""997  k"t**+gr""r   c           
        | j                   j                  }| j                   j                  | j                   j                  | j                   j                  f}g }t        j                  | j                   j                  |      D ]'  \  }}	 t        j                  | ||      dt        j                        }|5  t        j                  |      \  }}}	t        |      D ][  }
t        j                  t               5  t#        t        j$                  ||
      d         }||vr|j'                  |       ddd       ] t        |      D ]X  }
t        j                  t               5  t#        t        j(                  ||
            }||vr|j'                  |       ddd       Z 	 ddd       * t+        |      S # t        $ r Y Bw xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   hxY w)z
        Find Microsoft Visual Studio versions available in registry.

        Return
        ------
        list of float
            Versions
        r   N)r   ro   rX   r^   r\   	itertoolsproductrt   r   rr   rq   ru   QueryInfoKeyrange
contextlibsuppress
ValueErrorfloat	EnumValueappendEnumKeyr   )r!   r{   vckeysvs_versr|   rm   r}   subkeysvaluesr$   ivers               r   r   zSystemInfo.find_reg_vs_vers  s    WW''**dgg33TWWZZ@"**477==&A 	0ID#~~dBsGQH  0%+%8%8%>"v 0A#,,Z8 0#F$4$4T1$=a$@Ag-#NN3/0 00
 w 0A#,,Z8 0#FNN4$;<g-#NN3/0 000 0	0" g  
0 0
0 00 0sO   ,F::AG";8G
	31G"$5G	
G":	GG
GG"GG""G,	c                   i }d}	 t        j                  |      }|D ]  }	 t         j                  j	                  ||d      }t        |dd      5 }t        j                  |      }ddd       d   }t        j                  t         j                  j	                  |d             ||| j                  |d	         <    |S # t        $ r |cY S w xY w# 1 sw Y   mxY w# t        t        f$ r Y w xY w)
z
        Find Visual studio 2017+ versions from information in
        "C:\ProgramData\Microsoft\VisualStudio\Packages\_Instances".

        Return
        ------
        dict
            float version as key, path as value.
        z9C:\ProgramData\Microsoft\VisualStudio\Packages\_Instancesz
state.jsonrtzutf-8)encodingNinstallationPathVC\Tools\MSVCinstallationVersion)
rQ   listdirru   rR   rS   openjsonload_as_float_versionKeyError)	r!   vs_versionsinstances_dirhashed_namesrw   
state_path
state_filestatevs_paths	            r   r   z#SystemInfo.find_programdata_vs_vers  s     )+T	::m4L ! 	DWW\\-|L
*dW= 2 IIj1E2 23 

277<<1ABC  D2259N3OPQ	( 1  		2 2 X& s;   C /CC&ACCCC	CC0/C0c                Z    t        dj                  | j                  d      dd             S )z
        Return a string version as a simplified float version (major.minor)

        Parameters
        ----------
        version: str
            Version.

        Return
        ------
        float
            version
        .N   )r   rS   split)versions    r   r   zSystemInfo._as_float_version  s(     SXXgmmC0!4566r   c                    t         j                  j                  | j                  d| j                  d      }| j
                  j                  | j
                  j                  | j                  d      xs |S )zp
        Microsoft Visual Studio directory.

        Return
        ------
        str
            path
        Microsoft Visual Studio 0.1f)rQ   rR   rS   ProgramFilesx86r   r   r~   r\   )r!   defaults     r   VSInstallDirzSystemInfo.VSInstallDir  s]     '',,  $<T[[<N"O

 ww~~dggjjT[[,>@KGKr   c                    | j                         xs | j                         }t        j                  j	                  |      s!d}t
        j                  j                  |      |S )zm
        Microsoft Visual C++ directory.

        Return
        ------
        str
            path
        z(Microsoft Visual C++ directory not found)	_guess_vc_guess_vc_legacyrQ   rR   isdirr   r   r   )r!   rR   msgs      r   VCInstallDirzSystemInfo.VCInstallDir  sO     ~~:4#8#8#:ww}}T"<C""99#>>r   c                   | j                   dk  ry	 | j                  | j                      }t        j
                  j                  |d      }	 t	        j                  |      d   }| j                  |      | _	        t        j
                  j                  ||      S # t        $ r | j                  }Y w xY w# t        t        f$ r Y yw xY w)zl
        Locate Visual C++ for VS2017+.

        Return
        ------
        str
            path
              ,@r   r   r   )r   r   r   r   rQ   rR   rS   r   r   r   ru   
IndexError)r!   vs_dirguess_vcr   s       r   r   zSystemInfo._guess_vc  s     ;;$	'((5F
 77<<(89	ZZ)"-F008DK77<<&11  	'&&F	' $ 		s$   B AB5 B21B25CCc                   t         j                  j                  | j                  d| j                  dd      }t         j                  j                  | j
                  j                  | j                  d      }| j
                  j                  |d      }|r t         j                  j                  |d      n|}| j
                  j                  | j
                  j                  | j                  d      xs |S )z{
        Locate Visual C++ for versions prior to 2017.

        Return
        ------
        str
            path
        r   r   z\VC
installdirVC)	rQ   rR   rS   r   r   r   r^   r~   rX   )r!   r   reg_path	python_vc
default_vcs        r   r   zSystemInfo._guess_vc_legacy*  s     '',,  'D'9=
 77<< 5 5$++d9KMGGNN8\:	6?RWW\\)T2W
 ww~~dggjjT[[,>@NJNr   c                    | j                   dk  ry| j                   dk(  ry| j                   dk(  ry| j                   dk(  ry| j                   d	k\  ry
y)z
        Microsoft Windows SDK versions for specified MSVC++ version.

        Return
        ------
        tuple of str
            versions
              "@)z7.0z6.1z6.0a      $@)z7.1z7.0a      &@)z8.0z8.0a      (@)8.1z8.1ar   )z10.0r   r   r   r'   s    r   WindowsSdkVersionzSystemInfo.WindowsSdkVersion@  sR     ;;#'[[D  [[D  [[D  [[D  r   c                t    | j                  t        j                  j                  | j                  d            S )zt
        Microsoft Windows SDK last version.

        Return
        ------
        str
            version
        lib)_use_last_dir_namerQ   rR   rS   WindowsSdkDirr'   s    r   WindowsSdkLastVersionz SystemInfo.WindowsSdkLastVersionV  s*     &&rww||D4F4F'NOOr   c                   d}| j                   D ]Y  }t        j                  j                  | j                  j
                  d|       }| j                  j                  |d      }|sY n |rt        j                  j                  |      s~t        j                  j                  | j                  j                  | j                  d      }| j                  j                  |d      }|r t        j                  j                  |d      }|rt        j                  j                  |      sv| j                   D ]g  }|d|j                  d       }d	| }t        j                  j                  | j                  |      }t        j                  j                  |      sf|}i |rt        j                  j                  |      sb| j                   D ]S  }d
| }t        j                  j                  | j                  |      }t        j                  j                  |      sR|}U |s*t        j                  j                  | j                  d      }|S )zn
        Microsoft Windows SDK directory.

        Return
        ------
        str
            path
        r   vinstallationfolderr   r   WinSDKNr   zMicrosoft SDKs\Windows Kits\zMicrosoft SDKs\Windows\vPlatformSDK)r   rQ   rR   rS   r   rc   r~   r   r^   r   rfindr   r   )r!   sdkdirr   locrR   install_baseintverds           r   r   zSystemInfo.WindowsSdkDirb  s     )) 	C'',,tww22auI>CWW^^C)=>F	 RWW]]6277<< 5 5$++d9KMD77>>$=LlH=RWW]]62-- -syy~.6vh?GGLL!2!2D977==#F RWW]]62-- 23%8GGLL!2!2D977==#F	
 WW\\$"3"3]CFr   c                d   | j                   dk  rd}d}nBd}| j                   dk  rdnd}| j                  j                  d|      j                  d	d
      }d| d| }g }| j                   dk\  rJ| j                  D ];  }|t
        j                  j                  | j                  j                  ||      gz  }= | j                  D ]?  }|t
        j                  j                  | j                  j                  d| d|      gz  }A |D ]$  }| j                  j                  |d      }|s"|c S  y)zy
        Microsoft Windows SDK executable directory.

        Return
        ------
        str
            path
        r   #   r   (   r   TF)r   r5   r3   -zWinSDK-NetFxToolsr   r   Ar   N)r   rJ   r6   r   NetFxSdkVersionrQ   rR   rS   r   rf   r   rc   r~   )	r!   netfxverr    r5   fxregpathsr   rR   execpaths	            r   WindowsSDKExecutablePathz#SystemInfo.WindowsSDKExecutablePath  s8    ;;$HDH"kkT1duG77&&4&AII$PSTDH:U4&1 ;;$++ GRWW\\$''*;*;S"EFFG )) 	LCdgg&9&9Qse1:rJKKH	L  	 Dww~~d,@AH	 
 r   c                    t         j                  j                  | j                  j                  | j
                  dd      }| j                  j                  |d      xs dS )zl
        Microsoft Visual F# directory.

        Return
        ------
        str
            path
        r   z	\Setup\F#
productdirr   )rQ   rR   rS   r   rN   r   r~   )r!   rR   s     r   FSharpInstallDirzSystemInfo.FSharpInstallDir  sJ     ww||DGG00dkk$5Gy2QRww~~dL17R7r   c                    | j                   dk\  rdnd}|D ]?  }| j                  j                  | j                  j                  d|       }|s9|xs dc S  y)zt
        Microsoft Universal CRT SDK directory.

        Return
        ------
        str
            path
        r   )1081r   kitsrootr   N)r   r   r~   rh   )r!   versr   r   s       r   UniversalCRTSdkDirzSystemInfo.UniversalCRTSdkDir  s^      ${{d2|  	$CWW^^DGG$>$>(3%@PQF|#	$
 r   c                t    | j                  t        j                  j                  | j                  d            S )z
        Microsoft Universal C Runtime SDK last version.

        Return
        ------
        str
            version
        r   )r   rQ   rR   rS   r  r'   s    r   UniversalCRTSdkLastVersionz%SystemInfo.UniversalCRTSdkLastVersion  s*     &&rww||D4K4KU'STTr   c                (    | j                   dk\  rdS dS )z
        Microsoft .NET Framework SDK versions.

        Return
        ------
        tuple of str
            versions
        r   )	z4.7.2z4.7.1z4.7z4.6.2z4.6.1z4.6z4.5.2z4.5.1z4.5r   r   r'   s    r   r   zSystemInfo.NetFxSdkVersion  s%     {{d" X	
 	
r   c                    d}| j                   D ]W  }t        j                  j                  | j                  j
                  |      }| j                  j                  |d      }|sV |S  |S )zu
        Microsoft .NET Framework SDK directory.

        Return
        ------
        str
            path
        r   kitsinstallationfolder)r   rQ   rR   rS   r   rf   r~   )r!   r   r   r   s       r   NetFxSdkDirzSystemInfo.NetFxSdkDir  sc     '' 	C'',,tww00#6CWW^^C)ABF	
 r   c                    t         j                  j                  | j                  d      }| j                  j                  | j                  j                  d      xs |S )zw
        Microsoft .NET Framework 32bit directory.

        Return
        ------
        str
            path
        zMicrosoft.NET\Frameworkframeworkdir32rQ   rR   rS   r   r   r~   rX   r!   guess_fws     r   FrameworkDir32zSystemInfo.FrameworkDir32  sB     77<<-GH ww~~dggjj*:;GxGr   c                    t         j                  j                  | j                  d      }| j                  j                  | j                  j                  d      xs |S )zw
        Microsoft .NET Framework 64bit directory.

        Return
        ------
        str
            path
        zMicrosoft.NET\Framework64frameworkdir64r  r  s     r   FrameworkDir64zSystemInfo.FrameworkDir64  sB     77<<-IJ ww~~dggjj*:;GxGr   c                $    | j                  d      S )z
        Microsoft .NET Framework 32bit versions.

        Return
        ------
        tuple of str
            versions
            _find_dot_net_versionsr'   s    r   FrameworkVersion32zSystemInfo.FrameworkVersion32#       **2..r   c                $    | j                  d      S )z
        Microsoft .NET Framework 64bit versions.

        Return
        ------
        tuple of str
            versions
        @   r  r'   s    r   FrameworkVersion64zSystemInfo.FrameworkVersion64/  r  r   c                |   | j                   j                  | j                   j                  d|       }t        | d|       }|xs | j	                  |d      xs d}| j
                  dk\  r|dfS | j
                  dk\  r|j                         dd	 d
k7  rddfS |dfS | j
                  dk(  ry| j
                  dk(  ryy)z
        Find Microsoft .NET Framework versions.

        Parameters
        ----------
        bits: int
            Platform number of bits: 32 or 64.

        Return
        ------
        tuple of str
            versions
        frameworkverFrameworkDirr   r   r   zv4.0r   Nr   v4z
v4.0.30319v3.5r   )r   
v2.0.50727g       @)zv3.0r!  r   )r   r~   rX   getattrr   r   r   )r!   bitsreg_verdot_net_dirr   s        r   r  z!SystemInfo._find_dot_net_versions;  s     ''..|D6-BCdl4&$9:H00cBHb ;;$;[[D #&99;r?d#:<VKKVKK[[C'[[C'r   c                v      fdt        t        j                               D        }t        |d      xs dS )a)  
        Return name of the last dir in path or '' if no dir found.

        Parameters
        ----------
        path: str
            Use dirs in this path
        prefix: str
            Use only dirs starting by this prefix

        Return
        ------
        str
            name
        c              3     K   | ]T  }t         j                  j                  t         j                  j                  |            r|j	                        r| V y wrI   )rQ   rR   r   rS   
startswith).0dir_namerR   prefixs     r   	<genexpr>z0SystemInfo._use_last_dir_name.<locals>.<genexpr>j  sF      
ww}}RWW\\$9:##F+ 
s   AANr   )reversedrQ   r   next)rR   r+  matching_dirss   `` r   r   zSystemInfo._use_last_dir_nameY  s4    "
$RZZ%56
 M4(.B.r   rI   r=   )r>   zdict[float, str])r>   ztuple[LiteralString, ...]r>   z
str | None)r>   ztuple[str, ...])r   )#r   r   r   rC   r
   rD   r   r   r   r"   r   r   r   staticmethodr   rE   r   r   r   r   r   r   r   r   r   r  r  r   r	  r  r  r  r  r  r   r   r   r   r   r   _  s   	 W[[2&F7;;~r2L!gkk"5|DOS#(>(T 7 7  L L"  "<O,  * 	P 	P ( (T " "H 
8 
8  ( 	U 	U 
 
   " H H H H 	/ 	/ 	/ 	/< / /r   r   c                  @    e Zd ZU ded<   ded<   ded<   ded<   ded<   y)	_EnvironmentDictrA   includer   libpathrR   zNotRequired[str | None]py_vcruntime_redistN)r   r   r   __annotations__r   r   r   r3  r3  s  s    L	HL
I00r   r3  c                     e Zd ZdZdd dZed        Zed        Zed        Zed        Z	ed        Z
ed	        Zed
        Zed        Zed        Zed        Zed        Zd Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed!d       Zd"d#dZd Z y)$EnvironmentInfoaY  
    Return environment variables for specified Microsoft Visual C++ version
    and platform : Lib, Include, Path and libpath.

    This function is compatible with Microsoft Visual C++ 9.0 to 14.X.

    Script created by analysing Microsoft environment configuration files like
    "vcvars[...].bat", "SetEnv.Cmd", "vcbuildtools.bat", ...

    Parameters
    ----------
    arch: str
        Target architecture.
    vc_ver: float
        Required Microsoft Visual C++ version. If not set, autodetect the last
        version.
    vc_min_ver: float
        Minimum Microsoft Visual C++ version.
    Nc                    t        |      | _        t        | j                        | _        t	        | j                  |      | _        | j                  |k  r!d}t        j                  j                  |      y )Nz.No suitable Microsoft Visual C++ version found)
r   rJ   rG   r   r   sir   r   r   r   )r!   r    r   
vc_min_vererrs        r   r"   zEnvironmentInfo.__init__  s]    t$tww'TWWf-;;#BC""99#>> $r   c                .    | j                   j                  S )zk
        Microsoft Visual Studio.

        Return
        ------
        float
            version
        )r;  r   r'   s    r   r   zEnvironmentInfo.vs_ver       ww~~r   c                .    | j                   j                  S )zp
        Microsoft Visual C++ version.

        Return
        ------
        float
            version
        )r;  r   r'   s    r   r   zEnvironmentInfo.vc_ver  r?  r   c                   ddg}| j                   dk\  r2| j                  j                  dd      }|dgz  }|dgz  }|d| gz  }|D cg c]6  }t        j                  j                  | j                  j                  |      8 c}S c c}w )zu
        Microsoft Visual Studio Tools.

        Return
        ------
        list of str
            paths
        zCommon7\IDEzCommon7\Toolsr   Tr5   r   z1Common7\IDE\CommonExtensions\Microsoft\TestWindowzTeam Tools\Performance Tools)r   rJ   r6   rQ   rR   rS   r;  r   )r!   pathsarch_subdirrR   s       r   VSToolszEnvironmentInfo.VSTools  s      !12;;$''--d-EKJKKE566E5k]CDDEEJKTTWW1148KKKs   
;Bc                    t         j                  j                  | j                  j                  d      t         j                  j                  | j                  j                  d      gS )z
        Microsoft Visual C++ & Microsoft Foundation Class Includes.

        Return
        ------
        list of str
            paths
        IncludezATLMFC\Include)rQ   rR   rS   r;  r   r'   s    r   
VCIncludeszEnvironmentInfo.VCIncludes  sG     GGLL--y9GGLL--/@A
 	
r   c                d   | j                   dk\  r| j                  j                  d      }n| j                  j                  d      }d| d| g}| j                   dk\  r	|d| gz  }|D cg c]6  }t        j                  j                  | j                  j                  |      8 c}S c c}w )	z
        Microsoft Visual C++ & Microsoft Foundation Class Libraries.

        Return
        ------
        list of str
            paths
              .@Tr   r5   Libz
ATLMFC\Libr   z	Lib\store)r   rJ   r8   rQ   rR   rS   r;  r   )r!   rD  rC  rR   s       r   VCLibrarieszEnvironmentInfo.VCLibraries  s     ;;$'',,,6K'',,T,:K{m$K=&AB;;$;-011EEJKTTWW1148KKKs   /;B-c                    | j                   dk  rg S t        j                  j                  | j                  j
                  d      gS )z
        Microsoft Visual C++ store references Libraries.

        Return
        ------
        list of str
            paths
        r   zLib\store\references)r   rQ   rR   rS   r;  r   r'   s    r   VCStoreRefszEnvironmentInfo.VCStoreRefs  s8     ;;ITWW113JKLLr   c                   | j                   }t        j                  j                  |j                  d      g}| j
                  dk  rdnd}| j                  j                  |      }|r1|t        j                  j                  |j                  d|       gz  }| j
                  dk(  rOd| j                  j                  d       }|t        j                  j                  |j                  |      gz  }|S | j
                  dk\  r| j                  j                  j                  d	d
      j                         }t        j                  j                  dd| d      }|t        j                  j                  |j                  || j                  j                  d      z        gz  }| j                  j                  | j                  j                  k7  rK|t        j                  j                  |j                  || j                  j                  d      z        gz  }|S |t        j                  j                  |j                  d      gz  }|S )a  
        Microsoft Visual C++ Tools.

        Return
        ------
        list of str
            paths

        When host CPU is ARM, the tools should be found for ARM.

        >>> getfixture('windows_only')
        >>> mp = getfixture('monkeypatch')
        >>> mp.setattr(PlatformInfo, 'current_cpu', 'arm64')
        >>> ei = EnvironmentInfo(arch='irrelevant')
        >>> paths = ei.VCTools
        >>> any('HostARM64' in path for path in paths)
        True
        
VCPackagesr   TFBinr   rL  rJ  r   r   binHostz%srK  )r;  rQ   rR   rS   r   r   rJ   r<   r6   r/   r   upperr8   r(   )r!   r;  toolsr:   rD  rR   host_idhost_dirs           r   VCToolszEnvironmentInfo.VCTools  s   ( WWboo|<=;;$.4Egg''1bggll2??c+4GHIIE;;$,,T,:;<Dbggll2??D9::E& # [[D gg))11'5AGGIGww||ET'"+=>HR__h9K9KPT9K9U.UV E ww""dgg&8&88GGLLDGG4G4GD4G4Q)Q   bggll2??E:;;Er   c                   | j                   dk  rU| j                  j                  dd      }t        j                  j                  | j                  j                  d|       gS | j                  j                  d      }t        j                  j                  | j                  j                  d      }| j                  }t        j                  j                  || d|       gS )zw
        Microsoft Windows SDK Libraries.

        Return
        ------
        list of str
            paths
        r   TrB  rM  rK  r   um)	r   rJ   r8   rQ   rR   rS   r;  r   _sdk_subdir)r!   rD  r   libvers       r   OSLibrarieszEnvironmentInfo.OSLibraries-  s     ;;$'',,Tt,DKGGLL!6!6#k]8KLMM '',,,6K'',,tww44e<C%%FGGLL;-&@ABBr   c                   t         j                  j                  | j                  j                  d      }| j
                  dk  r"|t         j                  j                  |d      gS | j
                  dk\  r| j                  }nd}t         j                  j                  || d      t         j                  j                  || d      t         j                  j                  || d      gS )	zu
        Microsoft Windows SDK Include.

        Return
        ------
        list of str
            paths
        r4  r   glr   r   sharedr\  winrt)rQ   rR   rS   r;  r   r   r]  )r!   r4  sdkvers      r   
OSIncludeszEnvironmentInfo.OSIncludesA  s     '',,tww44i@;;$RWW\\'4899 {{d"))W&78Wm4W&67 r   c                   t         j                  j                  | j                  j                  d      }g }| j
                  dk  r|| j                  z  }| j
                  dk\  r$|t         j                  j                  |d      gz  }| j
                  dk\  r||t         j                  j                  | j                  j                  d      t         j                  j                  |dd      t         j                  j                  |d	d      t         j                  j                  |d
d      t         j                  j                  | j                  j                  dd| j
                  dddd      gz  }|S )z}
        Microsoft Windows SDK Libraries Paths.

        Return
        ------
        list of str
            paths
        
Referencesr   r   zCommonConfiguration\Neutralr   UnionMetadataz'Windows.Foundation.UniversalApiContractz1.0.0.0z%Windows.Foundation.FoundationContractz,Windows.Networking.Connectivity.WwanContractExtensionSDKszMicrosoft.VCLibsr   CommonConfigurationneutral)rQ   rR   rS   r;  r   r   r_  )r!   refr5  s      r   	OSLibpathzEnvironmentInfo.OSLibpath[  s)    ggll47700,?;;#t'''G;;$S*HIJJG;;$TWW22ODS"KYWS"I9UG GG))#&{{4( ) G$ r   c                4    t        | j                               S )zs
        Microsoft Windows SDK Tools.

        Return
        ------
        list of str
            paths
        )list
_sdk_toolsr'   s    r   SdkToolszEnvironmentInfo.SdkTools  s     DOO%&&r   c              #  :  K   | j                   dk  rI| j                   dk  rdnd}t        j                  j                  | j                  j
                  |       | j                  j                         sW| j                  j                  d      }d| }t        j                  j                  | j                  j
                  |       | j                   dv rv| j                  j                         rd}n| j                  j                  dd	      }d
| }t        j                  j                  | j                  j
                  |       n| j                   dk\  rt        j                  j                  | j                  j
                  d      }| j                  j                  d      }| j                  j                  }t        j                  j                  || |        | j                  j                  r| j                  j                   yyw)z
        Microsoft Windows SDK Tools paths generator.

        Return
        ------
        generator of str
            paths
        rJ  r   rS  zBin\x86TrK  )r   r   r   rB  zBin\NETFX 4.0 ToolsN)r   rQ   rR   rS   r;  r   rJ   r0   r6   r,   r   r   )r!   bin_dirrD  rR   rd  s        r   rp  zEnvironmentInfo._sdk_tools  s     ;;#{{d2e
G'',,tww44g>>ww%%'''--$-7K&D'',,tww44d;;;;,&ww$$& "gg11$D1I)+7D'',,tww44d;;[[D 77<< 5 5u=D''--$-7KWW22F'',,tx}%=>>77++''222 ,s   HHc                @    | j                   j                  }|r| dS dS )zu
        Microsoft Windows SDK version subdir.

        Return
        ------
        str
            subdir
        r3   r   )r;  r   r!   ucrtvers     r   r]  zEnvironmentInfo._sdk_subdir  s&     ''//#*7)222r   c                    | j                   dkD  rg S t        j                  j                  | j                  j
                  d      gS )zs
        Microsoft Windows SDK Setup.

        Return
        ------
        list of str
            paths
        r   Setup)r   rQ   rR   rS   r;  r   r'   s    r   SdkSetupzEnvironmentInfo.SdkSetup  s7     ;;ITWW22G<==r   c                Z   | j                   }| j                  }| j                  dk  r'd}|j                          xr |j	                          }nB|j                         xs |j	                         }|j
                  dk(  xs |j                  dk(  }g }|rE||j                  D cg c],  }t        j                  j                  |j                  |      . c}z  }|rE||j                  D cg c],  }t        j                  j                  |j                  |      . c}z  }|S c c}w c c}w )zv
        Microsoft .NET Framework Tools.

        Return
        ------
        list of str
            paths
        r   Tr   )rJ   r;  r   r,   r0   r/   r(   r  rQ   rR   rS   r  r  r  )r!   rJ   r;  	include32	include64rW  r   s          r   FxToolszEnvironmentInfo.FxTools  s    WWWW;;$I,,..Jr7H7H7J3JI((*Ab.?.?.AI'1MR]]g5MI@B@U@U9<R..4 E @B@U@U9<R..4 E s   $1D#+1D(c                    | j                   dk  s| j                  j                  sg S | j                  j	                  d      }t
        j                  j                  | j                  j                  d|       gS )z~
        Microsoft .Net Framework SDK Libraries.

        Return
        ------
        list of str
            paths
        r   TrK  zlib\um)r   r;  r	  rJ   r8   rQ   rR   rS   )r!   rD  s     r   NetFxSDKLibrariesz!EnvironmentInfo.NetFxSDKLibraries  sa     ;;TWW%8%8Igg((T(2TWW00VK=2IJKKr   c                    | j                   dk  s| j                  j                  sg S t        j                  j                  | j                  j                  d      gS )z}
        Microsoft .Net Framework SDK Includes.

        Return
        ------
        list of str
            paths
        r   z
include\um)r   r;  r	  rQ   rR   rS   r'   s    r   NetFxSDKIncludesz EnvironmentInfo.NetFxSDKIncludes  sC     ;;TWW%8%8ITWW00-@AAr   c                l    t         j                  j                  | j                  j                  d      gS )z
        Microsoft Visual Studio Team System Database.

        Return
        ------
        list of str
            paths
        zVSTSDB\Deploy)rQ   rR   rS   r;  r   r'   s    r   VsTDbzEnvironmentInfo.VsTDb  s'     TWW113CDEEr   c                   | j                   dk  rg S | j                   dk  r3| j                  j                  }| j                  j	                  d      }n| j                  j
                  }d}d| j                   dd| }t        j                  j                  ||      g}| j                   dk\  r%|t        j                  j                  ||d	      gz  }|S )
zn
        Microsoft Build Engine.

        Return
        ------
        list of str
            paths
        r   rJ  TrL  r   zMSBuild\r   z\binRoslyn)	r   r;  r   rJ   r6   r   rQ   rR   rS   )r!   	base_pathrD  rR   builds        r   MSBuildzEnvironmentInfo.MSBuild  s     ;;I[[4//I''--d-;K,,IK4;;t,D>i./;;$bggll9dH=>>Er   c                    | j                   dk  rg S t        j                  j                  | j                  j
                  d      gS )zt
        Microsoft HTML Help Workshop.

        Return
        ------
        list of str
            paths
        r   zHTML Help Workshop)r   rQ   rR   rS   r;  r   r'   s    r   HTMLHelpWorkshopz EnvironmentInfo.HTMLHelpWorkshop4  s8     ;;ITWW446JKLLr   c                (   | j                   dk  rg S | j                  j                  d      }t        j                  j                  | j                  j                  d      }| j                  }t        j                  j                  || d|       gS )z
        Microsoft Universal C Runtime SDK Libraries.

        Return
        ------
        list of str
            paths
        r   TrK  r   ucrt)	r   rJ   r8   rQ   rR   rS   r;  r  _ucrt_subdir)r!   rD  r   rv  s       r   UCRTLibrarieszEnvironmentInfo.UCRTLibrariesC  sx     ;;Igg((T(2ggll47755u=##SWIT+"?@AAr   c                    | j                   dk  rg S t        j                  j                  | j                  j
                  d      }t        j                  j                  || j                   d      gS )z
        Microsoft Universal C Runtime SDK Include.

        Return
        ------
        list of str
            paths
        r   r4  r  )r   rQ   rR   rS   r;  r  r  )r!   r4  s     r   UCRTIncludeszEnvironmentInfo.UCRTIncludesU  sY     ;;I'',,tww999EW):):(;4&@ABBr   c                @    | j                   j                  }|r| dS dS )z
        Microsoft Universal C Runtime SDK version subdir.

        Return
        ------
        str
            subdir
        r3   r   )r;  r  ru  s     r   r  zEnvironmentInfo._ucrt_subdire  s&     ''44#*7)222r   c                `    d| j                   cxkD  rdkD  rg S  | j                  j                  gS )zk
        Microsoft Visual F#.

        Return
        ------
        list of str
            paths
        r   r   )r   r;  r   r'   s    r   FSharpzEnvironmentInfo.FSharpr  s4     $++$$I % (())r   c                @   d| j                    d| j                  j                  d      j                  d      g }| j                  j
                  }t        j                  j                  |j                  dd            }t        j                  j                  |      r[t        j                  j                  |t        j                  |      d         }||t        j                  j                  |d	      gz  }|t        j                  j                  |d
      gz  }d| j                   dz   ddt        | j                        dz   df}fdt        j                   ||      D        }t#        t%        t        j                  j&                  |      d      S )z{
        Microsoft Visual C++ runtime redistributable dll.

        Returns the first suitable path found or None.
        	vcruntimez0.dllTrK  r3   z\Toolsz\Redistr   onecoreredistzMicrosoft.VC
   z.CRTc              3  h   K   | ])  \  }}t         j                  j                  ||       + y wrI   )rQ   rR   rS   )r)  r+  crt_dirrD  r  s      r   r,  z2EnvironmentInfo.VCRuntimeRedist.<locals>.<genexpr>  s0      
! GGLLgyA
s   /2N)r   rJ   r8   stripr;  r   rQ   rR   dirnamer   r   rS   r   intr   r   r   r.  filterisfile)r!   prefixes
tools_pathredist_pathcrt_dirscandidate_pathsrD  r  s         @@r   VCRuntimeRedistzEnvironmentInfo.VCRuntimeRedist  sN     }E2	gg((T(288> WW))
ggooj&8&8J&OP77==%'',,{BJJ{4KB4OPKbggll;	&JKKHRWW\\*h788 4;;+,D13t{{+b016

%.%6%6x%J
 F277>>?;TBBr   c                   t        | j                  d| j                  | j                  | j                  | j
                  g|      | j                  d| j                  | j                  | j                  | j                  | j                  g|      | j                  d| j                  | j                  | j                  | j                  g|      | j                  d| j                  | j                  | j                  | j                   | j"                  | j                  | j$                  | j&                  | j(                  g	|            }| j*                  dk\  r| j,                  r| j,                  |d<   |S )z
        Return environment dict.

        Parameters
        ----------
        exists: bool
            It True, only return existing paths.

        Return
        ------
        dict
            environment
        r4  r   r5  rR   )r4  r   r5  rR      r6  )r3  _build_pathsrH  re  r  r  rN  r_  r}  r  r  rP  rm  rZ  rE  r  rq  ry  r  r  r  r   r  )r!   existsenvs      r   
return_envzEnvironmentInfo.return_env  sR    %%OOOO%%))	 	 !!$$$$LL&&** 
 %%!!4<<1A1A4>>R
 ""LLLLJJMMMMLLLL))KK
 7*
V ;;"!5!5)-)=)=C%&
r   c                   t         j                  j                  |      }t        j                  |d      j                  t        j                        }t        j                  ||      }|r-t        t        t        j                  j                  |            n|}|s2|j                          d}t        j                  j                  |      t!        |      }	t        j                  j#                  |	      S )aC  
        Given an environment variable name and specified paths,
        return a pathsep-separated string of paths containing
        unique, extant, directories from those paths and from
        the environment variable. Raise an error if no paths
        are resolved.

        Parameters
        ----------
        name: str
            Environment variable name
        spec_path_lists: list of str
            Paths
        exists: bool
            It True, only return existing paths.

        Return
        ------
        str
            Pathsep-separated paths
        r   z environment variable is empty)r   chainfrom_iterabler
   rD   r   rQ   pathsepro  r  rR   r   rV  r   r   r   r   rS   )
r!   rw   spec_path_listsr  
spec_paths	env_pathsrC  extant_pathsr   unique_pathss
             r   r  zEnvironmentInfo._build_paths  s    . __22?C
KKb)//

;	
I6=CtF277==%89ZZ\N"@AC""99#>>&|4zz|,,r   )Nr   r=   r0  )T)r  boolr>   r3  )!r   r   r   rC   r"   rE   r   r   rE  rH  rN  rP  rZ  r_  re  rm  rq  rp  r]  ry  r}  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r9  r9  {  s   .? 	 	 	 	 L L& 
 
 L L( M M 0 0d C C&  2 % %N 	' 	'!3F 
3 
3 > >  < L L B B 	F 	F  6 M M B B" C C 
3 
3 * *  C  CD;z-r   r9  )rC   
__future__r   r   r   r   rQ   os.pathplatformtypingr   r   more_itertoolsr   distutils.errorsr   typing_extensionsr   r   systemr   r
   dictr7  r   rG   r   r3  r9  r   r   r   <module>r     s    #    	   + * < *i7! ! #fG^$v
 v
rz zzQ/ Q/h1y 1E
- E
-r   