android-notify 1.60.0__py3-none-any.whl → 1.60.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of android-notify might be problematic. Click here for more details.

Files changed (375) hide show
  1. android_notify/config.py +1 -1
  2. {android_notify-1.60.0.dist-info → android_notify-1.60.2.dist-info}/METADATA +4 -4
  3. {android_notify-1.60.0.dist-info → android_notify-1.60.2.dist-info}/RECORD +375 -6
  4. venv/Lib/site-packages/_distutils_hack/__init__.py +239 -0
  5. venv/Lib/site-packages/_distutils_hack/override.py +1 -0
  6. venv/Lib/site-packages/pkg_resources/__init__.py +3713 -0
  7. venv/Lib/site-packages/pkg_resources/py.typed +0 -0
  8. venv/Lib/site-packages/pkg_resources/tests/__init__.py +0 -0
  9. venv/Lib/site-packages/pkg_resources/tests/data/my-test-package-source/setup.py +7 -0
  10. venv/Lib/site-packages/pkg_resources/tests/test_find_distributions.py +56 -0
  11. venv/Lib/site-packages/pkg_resources/tests/test_integration_zope_interface.py +54 -0
  12. venv/Lib/site-packages/pkg_resources/tests/test_markers.py +8 -0
  13. venv/Lib/site-packages/pkg_resources/tests/test_pkg_resources.py +485 -0
  14. venv/Lib/site-packages/pkg_resources/tests/test_resources.py +869 -0
  15. venv/Lib/site-packages/pkg_resources/tests/test_working_set.py +505 -0
  16. venv/Lib/site-packages/setuptools/__init__.py +248 -0
  17. venv/Lib/site-packages/setuptools/_core_metadata.py +337 -0
  18. venv/Lib/site-packages/setuptools/_discovery.py +33 -0
  19. venv/Lib/site-packages/setuptools/_distutils/__init__.py +14 -0
  20. venv/Lib/site-packages/setuptools/_distutils/_log.py +3 -0
  21. venv/Lib/site-packages/setuptools/_distutils/_macos_compat.py +12 -0
  22. venv/Lib/site-packages/setuptools/_distutils/_modified.py +95 -0
  23. venv/Lib/site-packages/setuptools/_distutils/_msvccompiler.py +16 -0
  24. venv/Lib/site-packages/setuptools/_distutils/archive_util.py +294 -0
  25. venv/Lib/site-packages/setuptools/_distutils/ccompiler.py +26 -0
  26. venv/Lib/site-packages/setuptools/_distutils/cmd.py +554 -0
  27. venv/Lib/site-packages/setuptools/_distutils/command/__init__.py +23 -0
  28. venv/Lib/site-packages/setuptools/_distutils/command/_framework_compat.py +54 -0
  29. venv/Lib/site-packages/setuptools/_distutils/command/bdist.py +167 -0
  30. venv/Lib/site-packages/setuptools/_distutils/command/bdist_dumb.py +141 -0
  31. venv/Lib/site-packages/setuptools/_distutils/command/bdist_rpm.py +598 -0
  32. venv/Lib/site-packages/setuptools/_distutils/command/build.py +156 -0
  33. venv/Lib/site-packages/setuptools/_distutils/command/build_clib.py +201 -0
  34. venv/Lib/site-packages/setuptools/_distutils/command/build_ext.py +812 -0
  35. venv/Lib/site-packages/setuptools/_distutils/command/build_py.py +407 -0
  36. venv/Lib/site-packages/setuptools/_distutils/command/build_scripts.py +160 -0
  37. venv/Lib/site-packages/setuptools/_distutils/command/check.py +152 -0
  38. venv/Lib/site-packages/setuptools/_distutils/command/clean.py +77 -0
  39. venv/Lib/site-packages/setuptools/_distutils/command/config.py +358 -0
  40. venv/Lib/site-packages/setuptools/_distutils/command/install.py +805 -0
  41. venv/Lib/site-packages/setuptools/_distutils/command/install_data.py +94 -0
  42. venv/Lib/site-packages/setuptools/_distutils/command/install_egg_info.py +91 -0
  43. venv/Lib/site-packages/setuptools/_distutils/command/install_headers.py +46 -0
  44. venv/Lib/site-packages/setuptools/_distutils/command/install_lib.py +238 -0
  45. venv/Lib/site-packages/setuptools/_distutils/command/install_scripts.py +62 -0
  46. venv/Lib/site-packages/setuptools/_distutils/command/sdist.py +521 -0
  47. venv/Lib/site-packages/setuptools/_distutils/compat/__init__.py +18 -0
  48. venv/Lib/site-packages/setuptools/_distutils/compat/numpy.py +2 -0
  49. venv/Lib/site-packages/setuptools/_distutils/compat/py39.py +66 -0
  50. venv/Lib/site-packages/setuptools/_distutils/compilers/C/base.py +1394 -0
  51. venv/Lib/site-packages/setuptools/_distutils/compilers/C/cygwin.py +340 -0
  52. venv/Lib/site-packages/setuptools/_distutils/compilers/C/errors.py +24 -0
  53. venv/Lib/site-packages/setuptools/_distutils/compilers/C/msvc.py +614 -0
  54. venv/Lib/site-packages/setuptools/_distutils/compilers/C/tests/test_base.py +83 -0
  55. venv/Lib/site-packages/setuptools/_distutils/compilers/C/tests/test_cygwin.py +76 -0
  56. venv/Lib/site-packages/setuptools/_distutils/compilers/C/tests/test_mingw.py +48 -0
  57. venv/Lib/site-packages/setuptools/_distutils/compilers/C/tests/test_msvc.py +136 -0
  58. venv/Lib/site-packages/setuptools/_distutils/compilers/C/tests/test_unix.py +413 -0
  59. venv/Lib/site-packages/setuptools/_distutils/compilers/C/unix.py +422 -0
  60. venv/Lib/site-packages/setuptools/_distutils/compilers/C/zos.py +230 -0
  61. venv/Lib/site-packages/setuptools/_distutils/core.py +289 -0
  62. venv/Lib/site-packages/setuptools/_distutils/cygwinccompiler.py +31 -0
  63. venv/Lib/site-packages/setuptools/_distutils/debug.py +5 -0
  64. venv/Lib/site-packages/setuptools/_distutils/dep_util.py +14 -0
  65. venv/Lib/site-packages/setuptools/_distutils/dir_util.py +244 -0
  66. venv/Lib/site-packages/setuptools/_distutils/dist.py +1386 -0
  67. venv/Lib/site-packages/setuptools/_distutils/errors.py +108 -0
  68. venv/Lib/site-packages/setuptools/_distutils/extension.py +258 -0
  69. venv/Lib/site-packages/setuptools/_distutils/fancy_getopt.py +471 -0
  70. venv/Lib/site-packages/setuptools/_distutils/file_util.py +236 -0
  71. venv/Lib/site-packages/setuptools/_distutils/filelist.py +431 -0
  72. venv/Lib/site-packages/setuptools/_distutils/log.py +56 -0
  73. venv/Lib/site-packages/setuptools/_distutils/spawn.py +134 -0
  74. venv/Lib/site-packages/setuptools/_distutils/sysconfig.py +598 -0
  75. venv/Lib/site-packages/setuptools/_distutils/tests/__init__.py +42 -0
  76. venv/Lib/site-packages/setuptools/_distutils/tests/compat/__init__.py +0 -0
  77. venv/Lib/site-packages/setuptools/_distutils/tests/compat/py39.py +40 -0
  78. venv/Lib/site-packages/setuptools/_distutils/tests/support.py +134 -0
  79. venv/Lib/site-packages/setuptools/_distutils/tests/test_archive_util.py +353 -0
  80. venv/Lib/site-packages/setuptools/_distutils/tests/test_bdist.py +47 -0
  81. venv/Lib/site-packages/setuptools/_distutils/tests/test_bdist_dumb.py +78 -0
  82. venv/Lib/site-packages/setuptools/_distutils/tests/test_bdist_rpm.py +127 -0
  83. venv/Lib/site-packages/setuptools/_distutils/tests/test_build.py +49 -0
  84. venv/Lib/site-packages/setuptools/_distutils/tests/test_build_clib.py +134 -0
  85. venv/Lib/site-packages/setuptools/_distutils/tests/test_build_ext.py +628 -0
  86. venv/Lib/site-packages/setuptools/_distutils/tests/test_build_py.py +196 -0
  87. venv/Lib/site-packages/setuptools/_distutils/tests/test_build_scripts.py +96 -0
  88. venv/Lib/site-packages/setuptools/_distutils/tests/test_check.py +194 -0
  89. venv/Lib/site-packages/setuptools/_distutils/tests/test_clean.py +45 -0
  90. venv/Lib/site-packages/setuptools/_distutils/tests/test_cmd.py +107 -0
  91. venv/Lib/site-packages/setuptools/_distutils/tests/test_config_cmd.py +87 -0
  92. venv/Lib/site-packages/setuptools/_distutils/tests/test_core.py +130 -0
  93. venv/Lib/site-packages/setuptools/_distutils/tests/test_dir_util.py +139 -0
  94. venv/Lib/site-packages/setuptools/_distutils/tests/test_dist.py +552 -0
  95. venv/Lib/site-packages/setuptools/_distutils/tests/test_extension.py +117 -0
  96. venv/Lib/site-packages/setuptools/_distutils/tests/test_file_util.py +95 -0
  97. venv/Lib/site-packages/setuptools/_distutils/tests/test_filelist.py +336 -0
  98. venv/Lib/site-packages/setuptools/_distutils/tests/test_install.py +245 -0
  99. venv/Lib/site-packages/setuptools/_distutils/tests/test_install_data.py +74 -0
  100. venv/Lib/site-packages/setuptools/_distutils/tests/test_install_headers.py +33 -0
  101. venv/Lib/site-packages/setuptools/_distutils/tests/test_install_lib.py +110 -0
  102. venv/Lib/site-packages/setuptools/_distutils/tests/test_install_scripts.py +52 -0
  103. venv/Lib/site-packages/setuptools/_distutils/tests/test_log.py +12 -0
  104. venv/Lib/site-packages/setuptools/_distutils/tests/test_modified.py +126 -0
  105. venv/Lib/site-packages/setuptools/_distutils/tests/test_sdist.py +470 -0
  106. venv/Lib/site-packages/setuptools/_distutils/tests/test_spawn.py +141 -0
  107. venv/Lib/site-packages/setuptools/_distutils/tests/test_sysconfig.py +319 -0
  108. venv/Lib/site-packages/setuptools/_distutils/tests/test_text_file.py +127 -0
  109. venv/Lib/site-packages/setuptools/_distutils/tests/test_util.py +243 -0
  110. venv/Lib/site-packages/setuptools/_distutils/tests/test_version.py +80 -0
  111. venv/Lib/site-packages/setuptools/_distutils/tests/test_versionpredicate.py +0 -0
  112. venv/Lib/site-packages/setuptools/_distutils/tests/unix_compat.py +17 -0
  113. venv/Lib/site-packages/setuptools/_distutils/text_file.py +286 -0
  114. venv/Lib/site-packages/setuptools/_distutils/unixccompiler.py +9 -0
  115. venv/Lib/site-packages/setuptools/_distutils/util.py +518 -0
  116. venv/Lib/site-packages/setuptools/_distutils/version.py +348 -0
  117. venv/Lib/site-packages/setuptools/_distutils/versionpredicate.py +175 -0
  118. venv/Lib/site-packages/setuptools/_distutils/zosccompiler.py +3 -0
  119. venv/Lib/site-packages/setuptools/_entry_points.py +94 -0
  120. venv/Lib/site-packages/setuptools/_imp.py +87 -0
  121. venv/Lib/site-packages/setuptools/_importlib.py +9 -0
  122. venv/Lib/site-packages/setuptools/_itertools.py +23 -0
  123. venv/Lib/site-packages/setuptools/_normalization.py +177 -0
  124. venv/Lib/site-packages/setuptools/_path.py +93 -0
  125. venv/Lib/site-packages/setuptools/_reqs.py +42 -0
  126. venv/Lib/site-packages/setuptools/_scripts.py +361 -0
  127. venv/Lib/site-packages/setuptools/_shutil.py +59 -0
  128. venv/Lib/site-packages/setuptools/_static.py +188 -0
  129. venv/Lib/site-packages/setuptools/_vendor/autocommand/__init__.py +27 -0
  130. venv/Lib/site-packages/setuptools/_vendor/autocommand/autoasync.py +142 -0
  131. venv/Lib/site-packages/setuptools/_vendor/autocommand/autocommand.py +70 -0
  132. venv/Lib/site-packages/setuptools/_vendor/autocommand/automain.py +59 -0
  133. venv/Lib/site-packages/setuptools/_vendor/autocommand/autoparse.py +333 -0
  134. venv/Lib/site-packages/setuptools/_vendor/autocommand/errors.py +23 -0
  135. venv/Lib/site-packages/setuptools/_vendor/backports/__init__.py +1 -0
  136. venv/Lib/site-packages/setuptools/_vendor/backports/tarfile/__init__.py +2937 -0
  137. venv/Lib/site-packages/setuptools/_vendor/backports/tarfile/__main__.py +5 -0
  138. venv/Lib/site-packages/setuptools/_vendor/backports/tarfile/compat/__init__.py +0 -0
  139. venv/Lib/site-packages/setuptools/_vendor/backports/tarfile/compat/py38.py +24 -0
  140. venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__init__.py +1083 -0
  141. venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_adapters.py +83 -0
  142. venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_collections.py +30 -0
  143. venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_compat.py +57 -0
  144. venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_functools.py +104 -0
  145. venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_itertools.py +73 -0
  146. venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_meta.py +67 -0
  147. venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_text.py +99 -0
  148. venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/compat/__init__.py +0 -0
  149. venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/compat/py311.py +22 -0
  150. venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/compat/py39.py +36 -0
  151. venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/diagnose.py +21 -0
  152. venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/py.typed +0 -0
  153. venv/Lib/site-packages/setuptools/_vendor/inflect/__init__.py +3986 -0
  154. venv/Lib/site-packages/setuptools/_vendor/inflect/compat/__init__.py +0 -0
  155. venv/Lib/site-packages/setuptools/_vendor/inflect/compat/py38.py +7 -0
  156. venv/Lib/site-packages/setuptools/_vendor/inflect/py.typed +0 -0
  157. venv/Lib/site-packages/setuptools/_vendor/jaraco/collections/__init__.py +1091 -0
  158. venv/Lib/site-packages/setuptools/_vendor/jaraco/collections/py.typed +0 -0
  159. venv/Lib/site-packages/setuptools/_vendor/jaraco/context.py +361 -0
  160. venv/Lib/site-packages/setuptools/_vendor/jaraco/functools/__init__.py +633 -0
  161. venv/Lib/site-packages/setuptools/_vendor/jaraco/functools/__init__.pyi +125 -0
  162. venv/Lib/site-packages/setuptools/_vendor/jaraco/functools/py.typed +0 -0
  163. venv/Lib/site-packages/setuptools/_vendor/jaraco/text/__init__.py +624 -0
  164. venv/Lib/site-packages/setuptools/_vendor/jaraco/text/layouts.py +25 -0
  165. venv/Lib/site-packages/setuptools/_vendor/jaraco/text/show-newlines.py +33 -0
  166. venv/Lib/site-packages/setuptools/_vendor/jaraco/text/strip-prefix.py +21 -0
  167. venv/Lib/site-packages/setuptools/_vendor/jaraco/text/to-dvorak.py +6 -0
  168. venv/Lib/site-packages/setuptools/_vendor/jaraco/text/to-qwerty.py +6 -0
  169. venv/Lib/site-packages/setuptools/_vendor/more_itertools/__init__.py +6 -0
  170. venv/Lib/site-packages/setuptools/_vendor/more_itertools/__init__.pyi +2 -0
  171. venv/Lib/site-packages/setuptools/_vendor/more_itertools/more.py +4806 -0
  172. venv/Lib/site-packages/setuptools/_vendor/more_itertools/more.pyi +709 -0
  173. venv/Lib/site-packages/setuptools/_vendor/more_itertools/py.typed +0 -0
  174. venv/Lib/site-packages/setuptools/_vendor/more_itertools/recipes.py +1046 -0
  175. venv/Lib/site-packages/setuptools/_vendor/more_itertools/recipes.pyi +136 -0
  176. venv/Lib/site-packages/setuptools/_vendor/packaging/__init__.py +15 -0
  177. venv/Lib/site-packages/setuptools/_vendor/packaging/_elffile.py +110 -0
  178. venv/Lib/site-packages/setuptools/_vendor/packaging/_manylinux.py +263 -0
  179. venv/Lib/site-packages/setuptools/_vendor/packaging/_musllinux.py +85 -0
  180. venv/Lib/site-packages/setuptools/_vendor/packaging/_parser.py +354 -0
  181. venv/Lib/site-packages/setuptools/_vendor/packaging/_structures.py +61 -0
  182. venv/Lib/site-packages/setuptools/_vendor/packaging/_tokenizer.py +194 -0
  183. venv/Lib/site-packages/setuptools/_vendor/packaging/licenses/__init__.py +145 -0
  184. venv/Lib/site-packages/setuptools/_vendor/packaging/licenses/_spdx.py +759 -0
  185. venv/Lib/site-packages/setuptools/_vendor/packaging/markers.py +331 -0
  186. venv/Lib/site-packages/setuptools/_vendor/packaging/metadata.py +863 -0
  187. venv/Lib/site-packages/setuptools/_vendor/packaging/py.typed +0 -0
  188. venv/Lib/site-packages/setuptools/_vendor/packaging/requirements.py +91 -0
  189. venv/Lib/site-packages/setuptools/_vendor/packaging/specifiers.py +1020 -0
  190. venv/Lib/site-packages/setuptools/_vendor/packaging/tags.py +617 -0
  191. venv/Lib/site-packages/setuptools/_vendor/packaging/utils.py +163 -0
  192. venv/Lib/site-packages/setuptools/_vendor/packaging/version.py +582 -0
  193. venv/Lib/site-packages/setuptools/_vendor/platformdirs/__init__.py +627 -0
  194. venv/Lib/site-packages/setuptools/_vendor/platformdirs/__main__.py +55 -0
  195. venv/Lib/site-packages/setuptools/_vendor/platformdirs/android.py +249 -0
  196. venv/Lib/site-packages/setuptools/_vendor/platformdirs/api.py +292 -0
  197. venv/Lib/site-packages/setuptools/_vendor/platformdirs/macos.py +130 -0
  198. venv/Lib/site-packages/setuptools/_vendor/platformdirs/py.typed +0 -0
  199. venv/Lib/site-packages/setuptools/_vendor/platformdirs/unix.py +275 -0
  200. venv/Lib/site-packages/setuptools/_vendor/platformdirs/version.py +16 -0
  201. venv/Lib/site-packages/setuptools/_vendor/platformdirs/windows.py +272 -0
  202. venv/Lib/site-packages/setuptools/_vendor/tomli/__init__.py +11 -0
  203. venv/Lib/site-packages/setuptools/_vendor/tomli/_parser.py +691 -0
  204. venv/Lib/site-packages/setuptools/_vendor/tomli/_re.py +107 -0
  205. venv/Lib/site-packages/setuptools/_vendor/tomli/_types.py +10 -0
  206. venv/Lib/site-packages/setuptools/_vendor/tomli/py.typed +1 -0
  207. venv/Lib/site-packages/setuptools/_vendor/typeguard/__init__.py +48 -0
  208. venv/Lib/site-packages/setuptools/_vendor/typeguard/_checkers.py +993 -0
  209. venv/Lib/site-packages/setuptools/_vendor/typeguard/_config.py +108 -0
  210. venv/Lib/site-packages/setuptools/_vendor/typeguard/_decorators.py +235 -0
  211. venv/Lib/site-packages/setuptools/_vendor/typeguard/_exceptions.py +42 -0
  212. venv/Lib/site-packages/setuptools/_vendor/typeguard/_functions.py +308 -0
  213. venv/Lib/site-packages/setuptools/_vendor/typeguard/_importhook.py +213 -0
  214. venv/Lib/site-packages/setuptools/_vendor/typeguard/_memo.py +48 -0
  215. venv/Lib/site-packages/setuptools/_vendor/typeguard/_pytest_plugin.py +127 -0
  216. venv/Lib/site-packages/setuptools/_vendor/typeguard/_suppression.py +86 -0
  217. venv/Lib/site-packages/setuptools/_vendor/typeguard/_transformer.py +1229 -0
  218. venv/Lib/site-packages/setuptools/_vendor/typeguard/_union_transformer.py +55 -0
  219. venv/Lib/site-packages/setuptools/_vendor/typeguard/_utils.py +173 -0
  220. venv/Lib/site-packages/setuptools/_vendor/typeguard/py.typed +0 -0
  221. venv/Lib/site-packages/setuptools/_vendor/typing_extensions.py +3641 -0
  222. venv/Lib/site-packages/setuptools/_vendor/wheel/__init__.py +3 -0
  223. venv/Lib/site-packages/setuptools/_vendor/wheel/__main__.py +23 -0
  224. venv/Lib/site-packages/setuptools/_vendor/wheel/_bdist_wheel.py +613 -0
  225. venv/Lib/site-packages/setuptools/_vendor/wheel/_setuptools_logging.py +26 -0
  226. venv/Lib/site-packages/setuptools/_vendor/wheel/bdist_wheel.py +26 -0
  227. venv/Lib/site-packages/setuptools/_vendor/wheel/cli/__init__.py +155 -0
  228. venv/Lib/site-packages/setuptools/_vendor/wheel/cli/convert.py +332 -0
  229. venv/Lib/site-packages/setuptools/_vendor/wheel/cli/pack.py +85 -0
  230. venv/Lib/site-packages/setuptools/_vendor/wheel/cli/tags.py +139 -0
  231. venv/Lib/site-packages/setuptools/_vendor/wheel/cli/unpack.py +30 -0
  232. venv/Lib/site-packages/setuptools/_vendor/wheel/macosx_libfile.py +482 -0
  233. venv/Lib/site-packages/setuptools/_vendor/wheel/metadata.py +183 -0
  234. venv/Lib/site-packages/setuptools/_vendor/wheel/util.py +17 -0
  235. venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/__init__.py +0 -0
  236. venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/__init__.py +0 -0
  237. venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/_elffile.py +108 -0
  238. venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/_manylinux.py +260 -0
  239. venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/_musllinux.py +83 -0
  240. venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/_parser.py +356 -0
  241. venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/_structures.py +61 -0
  242. venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/_tokenizer.py +192 -0
  243. venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/markers.py +253 -0
  244. venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/requirements.py +90 -0
  245. venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/specifiers.py +1011 -0
  246. venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/tags.py +571 -0
  247. venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/utils.py +172 -0
  248. venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/version.py +561 -0
  249. venv/Lib/site-packages/setuptools/_vendor/wheel/wheelfile.py +227 -0
  250. venv/Lib/site-packages/setuptools/_vendor/zipp/__init__.py +501 -0
  251. venv/Lib/site-packages/setuptools/_vendor/zipp/compat/__init__.py +0 -0
  252. venv/Lib/site-packages/setuptools/_vendor/zipp/compat/py310.py +11 -0
  253. venv/Lib/site-packages/setuptools/_vendor/zipp/glob.py +106 -0
  254. venv/Lib/site-packages/setuptools/archive_util.py +219 -0
  255. venv/Lib/site-packages/setuptools/build_meta.py +548 -0
  256. venv/Lib/site-packages/setuptools/command/__init__.py +21 -0
  257. venv/Lib/site-packages/setuptools/command/_requirestxt.py +131 -0
  258. venv/Lib/site-packages/setuptools/command/alias.py +77 -0
  259. venv/Lib/site-packages/setuptools/command/bdist_egg.py +477 -0
  260. venv/Lib/site-packages/setuptools/command/bdist_rpm.py +42 -0
  261. venv/Lib/site-packages/setuptools/command/bdist_wheel.py +604 -0
  262. venv/Lib/site-packages/setuptools/command/build.py +135 -0
  263. venv/Lib/site-packages/setuptools/command/build_clib.py +103 -0
  264. venv/Lib/site-packages/setuptools/command/build_ext.py +470 -0
  265. venv/Lib/site-packages/setuptools/command/build_py.py +400 -0
  266. venv/Lib/site-packages/setuptools/command/develop.py +55 -0
  267. venv/Lib/site-packages/setuptools/command/dist_info.py +103 -0
  268. venv/Lib/site-packages/setuptools/command/easy_install.py +30 -0
  269. venv/Lib/site-packages/setuptools/command/editable_wheel.py +908 -0
  270. venv/Lib/site-packages/setuptools/command/egg_info.py +718 -0
  271. venv/Lib/site-packages/setuptools/command/install.py +131 -0
  272. venv/Lib/site-packages/setuptools/command/install_egg_info.py +58 -0
  273. venv/Lib/site-packages/setuptools/command/install_lib.py +137 -0
  274. venv/Lib/site-packages/setuptools/command/install_scripts.py +67 -0
  275. venv/Lib/site-packages/setuptools/command/rotate.py +65 -0
  276. venv/Lib/site-packages/setuptools/command/saveopts.py +21 -0
  277. venv/Lib/site-packages/setuptools/command/sdist.py +217 -0
  278. venv/Lib/site-packages/setuptools/command/setopt.py +141 -0
  279. venv/Lib/site-packages/setuptools/command/test.py +45 -0
  280. venv/Lib/site-packages/setuptools/compat/__init__.py +0 -0
  281. venv/Lib/site-packages/setuptools/compat/py310.py +20 -0
  282. venv/Lib/site-packages/setuptools/compat/py311.py +27 -0
  283. venv/Lib/site-packages/setuptools/compat/py312.py +13 -0
  284. venv/Lib/site-packages/setuptools/compat/py39.py +9 -0
  285. venv/Lib/site-packages/setuptools/config/__init__.py +43 -0
  286. venv/Lib/site-packages/setuptools/config/_apply_pyprojecttoml.py +526 -0
  287. venv/Lib/site-packages/setuptools/config/_validate_pyproject/__init__.py +34 -0
  288. venv/Lib/site-packages/setuptools/config/_validate_pyproject/error_reporting.py +336 -0
  289. venv/Lib/site-packages/setuptools/config/_validate_pyproject/extra_validations.py +82 -0
  290. venv/Lib/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_exceptions.py +51 -0
  291. venv/Lib/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_validations.py +1412 -0
  292. venv/Lib/site-packages/setuptools/config/_validate_pyproject/formats.py +402 -0
  293. venv/Lib/site-packages/setuptools/config/expand.py +452 -0
  294. venv/Lib/site-packages/setuptools/config/pyprojecttoml.py +468 -0
  295. venv/Lib/site-packages/setuptools/config/setupcfg.py +780 -0
  296. venv/Lib/site-packages/setuptools/depends.py +185 -0
  297. venv/Lib/site-packages/setuptools/discovery.py +614 -0
  298. venv/Lib/site-packages/setuptools/dist.py +1119 -0
  299. venv/Lib/site-packages/setuptools/errors.py +67 -0
  300. venv/Lib/site-packages/setuptools/extension.py +177 -0
  301. venv/Lib/site-packages/setuptools/glob.py +185 -0
  302. venv/Lib/site-packages/setuptools/installer.py +155 -0
  303. venv/Lib/site-packages/setuptools/launch.py +36 -0
  304. venv/Lib/site-packages/setuptools/logging.py +40 -0
  305. venv/Lib/site-packages/setuptools/modified.py +18 -0
  306. venv/Lib/site-packages/setuptools/monkey.py +126 -0
  307. venv/Lib/site-packages/setuptools/msvc.py +1536 -0
  308. venv/Lib/site-packages/setuptools/namespaces.py +106 -0
  309. venv/Lib/site-packages/setuptools/tests/__init__.py +13 -0
  310. venv/Lib/site-packages/setuptools/tests/compat/__init__.py +0 -0
  311. venv/Lib/site-packages/setuptools/tests/compat/py39.py +3 -0
  312. venv/Lib/site-packages/setuptools/tests/config/__init__.py +0 -0
  313. venv/Lib/site-packages/setuptools/tests/config/downloads/__init__.py +59 -0
  314. venv/Lib/site-packages/setuptools/tests/config/downloads/preload.py +18 -0
  315. venv/Lib/site-packages/setuptools/tests/config/test_apply_pyprojecttoml.py +772 -0
  316. venv/Lib/site-packages/setuptools/tests/config/test_expand.py +247 -0
  317. venv/Lib/site-packages/setuptools/tests/config/test_pyprojecttoml.py +396 -0
  318. venv/Lib/site-packages/setuptools/tests/config/test_pyprojecttoml_dynamic_deps.py +109 -0
  319. venv/Lib/site-packages/setuptools/tests/config/test_setupcfg.py +980 -0
  320. venv/Lib/site-packages/setuptools/tests/contexts.py +131 -0
  321. venv/Lib/site-packages/setuptools/tests/environment.py +95 -0
  322. venv/Lib/site-packages/setuptools/tests/fixtures.py +392 -0
  323. venv/Lib/site-packages/setuptools/tests/integration/__init__.py +0 -0
  324. venv/Lib/site-packages/setuptools/tests/integration/helpers.py +77 -0
  325. venv/Lib/site-packages/setuptools/tests/integration/test_pbr.py +20 -0
  326. venv/Lib/site-packages/setuptools/tests/integration/test_pip_install_sdist.py +223 -0
  327. venv/Lib/site-packages/setuptools/tests/mod_with_constant.py +1 -0
  328. venv/Lib/site-packages/setuptools/tests/namespaces.py +90 -0
  329. venv/Lib/site-packages/setuptools/tests/script-with-bom.py +1 -0
  330. venv/Lib/site-packages/setuptools/tests/test_archive_util.py +36 -0
  331. venv/Lib/site-packages/setuptools/tests/test_bdist_deprecations.py +28 -0
  332. venv/Lib/site-packages/setuptools/tests/test_bdist_egg.py +73 -0
  333. venv/Lib/site-packages/setuptools/tests/test_bdist_wheel.py +708 -0
  334. venv/Lib/site-packages/setuptools/tests/test_build.py +33 -0
  335. venv/Lib/site-packages/setuptools/tests/test_build_clib.py +84 -0
  336. venv/Lib/site-packages/setuptools/tests/test_build_ext.py +293 -0
  337. venv/Lib/site-packages/setuptools/tests/test_build_meta.py +959 -0
  338. venv/Lib/site-packages/setuptools/tests/test_build_py.py +480 -0
  339. venv/Lib/site-packages/setuptools/tests/test_config_discovery.py +647 -0
  340. venv/Lib/site-packages/setuptools/tests/test_core_metadata.py +622 -0
  341. venv/Lib/site-packages/setuptools/tests/test_depends.py +15 -0
  342. venv/Lib/site-packages/setuptools/tests/test_develop.py +112 -0
  343. venv/Lib/site-packages/setuptools/tests/test_dist.py +278 -0
  344. venv/Lib/site-packages/setuptools/tests/test_dist_info.py +147 -0
  345. venv/Lib/site-packages/setuptools/tests/test_distutils_adoption.py +198 -0
  346. venv/Lib/site-packages/setuptools/tests/test_editable_install.py +1263 -0
  347. venv/Lib/site-packages/setuptools/tests/test_egg_info.py +1306 -0
  348. venv/Lib/site-packages/setuptools/tests/test_extern.py +15 -0
  349. venv/Lib/site-packages/setuptools/tests/test_find_packages.py +218 -0
  350. venv/Lib/site-packages/setuptools/tests/test_find_py_modules.py +73 -0
  351. venv/Lib/site-packages/setuptools/tests/test_glob.py +45 -0
  352. venv/Lib/site-packages/setuptools/tests/test_install_scripts.py +89 -0
  353. venv/Lib/site-packages/setuptools/tests/test_logging.py +76 -0
  354. venv/Lib/site-packages/setuptools/tests/test_manifest.py +622 -0
  355. venv/Lib/site-packages/setuptools/tests/test_namespaces.py +138 -0
  356. venv/Lib/site-packages/setuptools/tests/test_scripts.py +12 -0
  357. venv/Lib/site-packages/setuptools/tests/test_sdist.py +984 -0
  358. venv/Lib/site-packages/setuptools/tests/test_setopt.py +40 -0
  359. venv/Lib/site-packages/setuptools/tests/test_setuptools.py +290 -0
  360. venv/Lib/site-packages/setuptools/tests/test_shutil_wrapper.py +23 -0
  361. venv/Lib/site-packages/setuptools/tests/test_unicode_utils.py +10 -0
  362. venv/Lib/site-packages/setuptools/tests/test_virtualenv.py +113 -0
  363. venv/Lib/site-packages/setuptools/tests/test_warnings.py +106 -0
  364. venv/Lib/site-packages/setuptools/tests/test_wheel.py +690 -0
  365. venv/Lib/site-packages/setuptools/tests/test_windows_wrappers.py +258 -0
  366. venv/Lib/site-packages/setuptools/tests/text.py +4 -0
  367. venv/Lib/site-packages/setuptools/tests/textwrap.py +6 -0
  368. venv/Lib/site-packages/setuptools/unicode_utils.py +102 -0
  369. venv/Lib/site-packages/setuptools/version.py +6 -0
  370. venv/Lib/site-packages/setuptools/warnings.py +110 -0
  371. venv/Lib/site-packages/setuptools/wheel.py +261 -0
  372. venv/Lib/site-packages/setuptools/windows_support.py +30 -0
  373. {android_notify-1.60.0.dist-info → android_notify-1.60.2.dist-info}/WHEEL +0 -0
  374. {android_notify-1.60.0.dist-info → android_notify-1.60.2.dist-info}/entry_points.txt +0 -0
  375. {android_notify-1.60.0.dist-info → android_notify-1.60.2.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,1536 @@
1
+ """
2
+ Environment info about Microsoft Compilers.
3
+
4
+ >>> getfixture('windows_only')
5
+ >>> ei = EnvironmentInfo('amd64')
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import contextlib
11
+ import itertools
12
+ import json
13
+ import os
14
+ import os.path
15
+ import platform
16
+ from typing import TYPE_CHECKING, TypedDict
17
+
18
+ from more_itertools import unique_everseen
19
+
20
+ import distutils.errors
21
+
22
+ if TYPE_CHECKING:
23
+ from typing_extensions import LiteralString, NotRequired
24
+
25
+ # https://github.com/python/mypy/issues/8166
26
+ if not TYPE_CHECKING and platform.system() == 'Windows':
27
+ import winreg
28
+ from os import environ
29
+ else:
30
+ # Mock winreg and environ so the module can be imported on this platform.
31
+
32
+ class winreg:
33
+ HKEY_USERS = None
34
+ HKEY_CURRENT_USER = None
35
+ HKEY_LOCAL_MACHINE = None
36
+ HKEY_CLASSES_ROOT = None
37
+
38
+ environ: dict[str, str] = dict()
39
+
40
+
41
+ class PlatformInfo:
42
+ """
43
+ Current and Target Architectures information.
44
+
45
+ Parameters
46
+ ----------
47
+ arch: str
48
+ Target architecture.
49
+ """
50
+
51
+ current_cpu = environ.get('processor_architecture', '').lower()
52
+
53
+ def __init__(self, arch) -> None:
54
+ self.arch = arch.lower().replace('x64', 'amd64')
55
+
56
+ @property
57
+ def target_cpu(self):
58
+ """
59
+ Return Target CPU architecture.
60
+
61
+ Return
62
+ ------
63
+ str
64
+ Target CPU
65
+ """
66
+ return self.arch[self.arch.find('_') + 1 :]
67
+
68
+ def target_is_x86(self):
69
+ """
70
+ Return True if target CPU is x86 32 bits..
71
+
72
+ Return
73
+ ------
74
+ bool
75
+ CPU is x86 32 bits
76
+ """
77
+ return self.target_cpu == 'x86'
78
+
79
+ def current_is_x86(self):
80
+ """
81
+ Return True if current CPU is x86 32 bits..
82
+
83
+ Return
84
+ ------
85
+ bool
86
+ CPU is x86 32 bits
87
+ """
88
+ return self.current_cpu == 'x86'
89
+
90
+ def current_dir(self, hidex86=False, x64=False) -> str:
91
+ """
92
+ Current platform specific subfolder.
93
+
94
+ Parameters
95
+ ----------
96
+ hidex86: bool
97
+ return '' and not '\x86' if architecture is x86.
98
+ x64: bool
99
+ return '\x64' and not '\amd64' if architecture is amd64.
100
+
101
+ Return
102
+ ------
103
+ str
104
+ subfolder: '\target', or '' (see hidex86 parameter)
105
+ """
106
+ return (
107
+ ''
108
+ if (self.current_cpu == 'x86' and hidex86)
109
+ else r'\x64'
110
+ if (self.current_cpu == 'amd64' and x64)
111
+ else rf'\{self.current_cpu}'
112
+ )
113
+
114
+ def target_dir(self, hidex86=False, x64=False) -> str:
115
+ r"""
116
+ Target platform specific subfolder.
117
+
118
+ Parameters
119
+ ----------
120
+ hidex86: bool
121
+ return '' and not '\x86' if architecture is x86.
122
+ x64: bool
123
+ return '\x64' and not '\amd64' if architecture is amd64.
124
+
125
+ Return
126
+ ------
127
+ str
128
+ subfolder: '\current', or '' (see hidex86 parameter)
129
+ """
130
+ return (
131
+ ''
132
+ if (self.target_cpu == 'x86' and hidex86)
133
+ else r'\x64'
134
+ if (self.target_cpu == 'amd64' and x64)
135
+ else rf'\{self.target_cpu}'
136
+ )
137
+
138
+ def cross_dir(self, forcex86=False):
139
+ r"""
140
+ Cross platform specific subfolder.
141
+
142
+ Parameters
143
+ ----------
144
+ forcex86: bool
145
+ Use 'x86' as current architecture even if current architecture is
146
+ not x86.
147
+
148
+ Return
149
+ ------
150
+ str
151
+ subfolder: '' if target architecture is current architecture,
152
+ '\current_target' if not.
153
+ """
154
+ current = 'x86' if forcex86 else self.current_cpu
155
+ return (
156
+ ''
157
+ if self.target_cpu == current
158
+ else self.target_dir().replace('\\', f'\\{current}_')
159
+ )
160
+
161
+
162
+ class RegistryInfo:
163
+ """
164
+ Microsoft Visual Studio related registry information.
165
+
166
+ Parameters
167
+ ----------
168
+ platform_info: PlatformInfo
169
+ "PlatformInfo" instance.
170
+ """
171
+
172
+ HKEYS = (
173
+ winreg.HKEY_USERS,
174
+ winreg.HKEY_CURRENT_USER,
175
+ winreg.HKEY_LOCAL_MACHINE,
176
+ winreg.HKEY_CLASSES_ROOT,
177
+ )
178
+
179
+ def __init__(self, platform_info) -> None:
180
+ self.pi = platform_info
181
+
182
+ @property
183
+ def visualstudio(self) -> str:
184
+ """
185
+ Microsoft Visual Studio root registry key.
186
+
187
+ Return
188
+ ------
189
+ str
190
+ Registry key
191
+ """
192
+ return 'VisualStudio'
193
+
194
+ @property
195
+ def sxs(self):
196
+ """
197
+ Microsoft Visual Studio SxS registry key.
198
+
199
+ Return
200
+ ------
201
+ str
202
+ Registry key
203
+ """
204
+ return os.path.join(self.visualstudio, 'SxS')
205
+
206
+ @property
207
+ def vc(self):
208
+ """
209
+ Microsoft Visual C++ VC7 registry key.
210
+
211
+ Return
212
+ ------
213
+ str
214
+ Registry key
215
+ """
216
+ return os.path.join(self.sxs, 'VC7')
217
+
218
+ @property
219
+ def vs(self):
220
+ """
221
+ Microsoft Visual Studio VS7 registry key.
222
+
223
+ Return
224
+ ------
225
+ str
226
+ Registry key
227
+ """
228
+ return os.path.join(self.sxs, 'VS7')
229
+
230
+ @property
231
+ def vc_for_python(self) -> str:
232
+ """
233
+ Microsoft Visual C++ for Python registry key.
234
+
235
+ Return
236
+ ------
237
+ str
238
+ Registry key
239
+ """
240
+ return r'DevDiv\VCForPython'
241
+
242
+ @property
243
+ def microsoft_sdk(self) -> str:
244
+ """
245
+ Microsoft SDK registry key.
246
+
247
+ Return
248
+ ------
249
+ str
250
+ Registry key
251
+ """
252
+ return 'Microsoft SDKs'
253
+
254
+ @property
255
+ def windows_sdk(self):
256
+ """
257
+ Microsoft Windows/Platform SDK registry key.
258
+
259
+ Return
260
+ ------
261
+ str
262
+ Registry key
263
+ """
264
+ return os.path.join(self.microsoft_sdk, 'Windows')
265
+
266
+ @property
267
+ def netfx_sdk(self):
268
+ """
269
+ Microsoft .NET Framework SDK registry key.
270
+
271
+ Return
272
+ ------
273
+ str
274
+ Registry key
275
+ """
276
+ return os.path.join(self.microsoft_sdk, 'NETFXSDK')
277
+
278
+ @property
279
+ def windows_kits_roots(self) -> str:
280
+ """
281
+ Microsoft Windows Kits Roots registry key.
282
+
283
+ Return
284
+ ------
285
+ str
286
+ Registry key
287
+ """
288
+ return r'Windows Kits\Installed Roots'
289
+
290
+ def microsoft(self, key, x86=False):
291
+ """
292
+ Return key in Microsoft software registry.
293
+
294
+ Parameters
295
+ ----------
296
+ key: str
297
+ Registry key path where look.
298
+ x86: str
299
+ Force x86 software registry.
300
+
301
+ Return
302
+ ------
303
+ str
304
+ Registry key
305
+ """
306
+ node64 = '' if self.pi.current_is_x86() or x86 else 'Wow6432Node'
307
+ return os.path.join('Software', node64, 'Microsoft', key)
308
+
309
+ def lookup(self, key, name):
310
+ """
311
+ Look for values in registry in Microsoft software registry.
312
+
313
+ Parameters
314
+ ----------
315
+ key: str
316
+ Registry key path where look.
317
+ name: str
318
+ Value name to find.
319
+
320
+ Return
321
+ ------
322
+ str
323
+ value
324
+ """
325
+ key_read = winreg.KEY_READ
326
+ openkey = winreg.OpenKey
327
+ closekey = winreg.CloseKey
328
+ ms = self.microsoft
329
+ for hkey in self.HKEYS:
330
+ bkey = None
331
+ try:
332
+ bkey = openkey(hkey, ms(key), 0, key_read)
333
+ except OSError:
334
+ if not self.pi.current_is_x86():
335
+ try:
336
+ bkey = openkey(hkey, ms(key, True), 0, key_read)
337
+ except OSError:
338
+ continue
339
+ else:
340
+ continue
341
+ try:
342
+ return winreg.QueryValueEx(bkey, name)[0]
343
+ except OSError:
344
+ pass
345
+ finally:
346
+ if bkey:
347
+ closekey(bkey)
348
+ return None
349
+
350
+
351
+ class SystemInfo:
352
+ """
353
+ Microsoft Windows and Visual Studio related system information.
354
+
355
+ Parameters
356
+ ----------
357
+ registry_info: RegistryInfo
358
+ "RegistryInfo" instance.
359
+ vc_ver: float
360
+ Required Microsoft Visual C++ version.
361
+ """
362
+
363
+ # Variables and properties in this class use originals CamelCase variables
364
+ # names from Microsoft source files for more easy comparison.
365
+ WinDir = environ.get('WinDir', '')
366
+ ProgramFiles = environ.get('ProgramFiles', '')
367
+ ProgramFilesx86 = environ.get('ProgramFiles(x86)', ProgramFiles)
368
+
369
+ def __init__(self, registry_info, vc_ver=None) -> None:
370
+ self.ri = registry_info
371
+ self.pi = self.ri.pi
372
+
373
+ self.known_vs_paths = self.find_programdata_vs_vers()
374
+
375
+ # Except for VS15+, VC version is aligned with VS version
376
+ self.vs_ver = self.vc_ver = vc_ver or self._find_latest_available_vs_ver()
377
+
378
+ def _find_latest_available_vs_ver(self):
379
+ """
380
+ Find the latest VC version
381
+
382
+ Return
383
+ ------
384
+ float
385
+ version
386
+ """
387
+ reg_vc_vers = self.find_reg_vs_vers()
388
+
389
+ if not (reg_vc_vers or self.known_vs_paths):
390
+ raise distutils.errors.DistutilsPlatformError(
391
+ 'No Microsoft Visual C++ version found'
392
+ )
393
+
394
+ vc_vers = set(reg_vc_vers)
395
+ vc_vers.update(self.known_vs_paths)
396
+ return sorted(vc_vers)[-1]
397
+
398
+ def find_reg_vs_vers(self):
399
+ """
400
+ Find Microsoft Visual Studio versions available in registry.
401
+
402
+ Return
403
+ ------
404
+ list of float
405
+ Versions
406
+ """
407
+ ms = self.ri.microsoft
408
+ vckeys = (self.ri.vc, self.ri.vc_for_python, self.ri.vs)
409
+ vs_vers = []
410
+ for hkey, key in itertools.product(self.ri.HKEYS, vckeys):
411
+ try:
412
+ bkey = winreg.OpenKey(hkey, ms(key), 0, winreg.KEY_READ)
413
+ except OSError:
414
+ continue
415
+ with bkey:
416
+ subkeys, values, _ = winreg.QueryInfoKey(bkey)
417
+ for i in range(values):
418
+ with contextlib.suppress(ValueError):
419
+ ver = float(winreg.EnumValue(bkey, i)[0])
420
+ if ver not in vs_vers:
421
+ vs_vers.append(ver)
422
+ for i in range(subkeys):
423
+ with contextlib.suppress(ValueError):
424
+ ver = float(winreg.EnumKey(bkey, i))
425
+ if ver not in vs_vers:
426
+ vs_vers.append(ver)
427
+ return sorted(vs_vers)
428
+
429
+ def find_programdata_vs_vers(self) -> dict[float, str]:
430
+ r"""
431
+ Find Visual studio 2017+ versions from information in
432
+ "C:\ProgramData\Microsoft\VisualStudio\Packages\_Instances".
433
+
434
+ Return
435
+ ------
436
+ dict
437
+ float version as key, path as value.
438
+ """
439
+ vs_versions: dict[float, str] = {}
440
+ instances_dir = r'C:\ProgramData\Microsoft\VisualStudio\Packages\_Instances'
441
+
442
+ try:
443
+ hashed_names = os.listdir(instances_dir)
444
+
445
+ except OSError:
446
+ # Directory not exists with all Visual Studio versions
447
+ return vs_versions
448
+
449
+ for name in hashed_names:
450
+ try:
451
+ # Get VS installation path from "state.json" file
452
+ state_path = os.path.join(instances_dir, name, 'state.json')
453
+ with open(state_path, 'rt', encoding='utf-8') as state_file:
454
+ state = json.load(state_file)
455
+ vs_path = state['installationPath']
456
+
457
+ # Raises OSError if this VS installation does not contain VC
458
+ os.listdir(os.path.join(vs_path, r'VC\Tools\MSVC'))
459
+
460
+ # Store version and path
461
+ vs_versions[self._as_float_version(state['installationVersion'])] = (
462
+ vs_path
463
+ )
464
+
465
+ except (OSError, KeyError):
466
+ # Skip if "state.json" file is missing or bad format
467
+ continue
468
+
469
+ return vs_versions
470
+
471
+ @staticmethod
472
+ def _as_float_version(version):
473
+ """
474
+ Return a string version as a simplified float version (major.minor)
475
+
476
+ Parameters
477
+ ----------
478
+ version: str
479
+ Version.
480
+
481
+ Return
482
+ ------
483
+ float
484
+ version
485
+ """
486
+ return float('.'.join(version.split('.')[:2]))
487
+
488
+ @property
489
+ def VSInstallDir(self):
490
+ """
491
+ Microsoft Visual Studio directory.
492
+
493
+ Return
494
+ ------
495
+ str
496
+ path
497
+ """
498
+ # Default path
499
+ default = os.path.join(
500
+ self.ProgramFilesx86, f'Microsoft Visual Studio {self.vs_ver:0.1f}'
501
+ )
502
+
503
+ # Try to get path from registry, if fail use default path
504
+ return self.ri.lookup(self.ri.vs, f'{self.vs_ver:0.1f}') or default
505
+
506
+ @property
507
+ def VCInstallDir(self):
508
+ """
509
+ Microsoft Visual C++ directory.
510
+
511
+ Return
512
+ ------
513
+ str
514
+ path
515
+ """
516
+ path = self._guess_vc() or self._guess_vc_legacy()
517
+
518
+ if not os.path.isdir(path):
519
+ msg = 'Microsoft Visual C++ directory not found'
520
+ raise distutils.errors.DistutilsPlatformError(msg)
521
+
522
+ return path
523
+
524
+ def _guess_vc(self):
525
+ """
526
+ Locate Visual C++ for VS2017+.
527
+
528
+ Return
529
+ ------
530
+ str
531
+ path
532
+ """
533
+ if self.vs_ver <= 14.0:
534
+ return ''
535
+
536
+ try:
537
+ # First search in known VS paths
538
+ vs_dir = self.known_vs_paths[self.vs_ver]
539
+ except KeyError:
540
+ # Else, search with path from registry
541
+ vs_dir = self.VSInstallDir
542
+
543
+ guess_vc = os.path.join(vs_dir, r'VC\Tools\MSVC')
544
+
545
+ # Subdir with VC exact version as name
546
+ try:
547
+ # Update the VC version with real one instead of VS version
548
+ vc_ver = os.listdir(guess_vc)[-1]
549
+ self.vc_ver = self._as_float_version(vc_ver)
550
+ return os.path.join(guess_vc, vc_ver)
551
+ except (OSError, IndexError):
552
+ return ''
553
+
554
+ def _guess_vc_legacy(self):
555
+ """
556
+ Locate Visual C++ for versions prior to 2017.
557
+
558
+ Return
559
+ ------
560
+ str
561
+ path
562
+ """
563
+ default = os.path.join(
564
+ self.ProgramFilesx86,
565
+ rf'Microsoft Visual Studio {self.vs_ver:0.1f}\VC',
566
+ )
567
+
568
+ # Try to get "VC++ for Python" path from registry as default path
569
+ reg_path = os.path.join(self.ri.vc_for_python, f'{self.vs_ver:0.1f}')
570
+ python_vc = self.ri.lookup(reg_path, 'installdir')
571
+ default_vc = os.path.join(python_vc, 'VC') if python_vc else default
572
+
573
+ # Try to get path from registry, if fail use default path
574
+ return self.ri.lookup(self.ri.vc, f'{self.vs_ver:0.1f}') or default_vc
575
+
576
+ @property
577
+ def WindowsSdkVersion(self) -> tuple[LiteralString, ...]:
578
+ """
579
+ Microsoft Windows SDK versions for specified MSVC++ version.
580
+
581
+ Return
582
+ ------
583
+ tuple of str
584
+ versions
585
+ """
586
+ if self.vs_ver <= 9.0:
587
+ return '7.0', '6.1', '6.0a'
588
+ elif self.vs_ver == 10.0:
589
+ return '7.1', '7.0a'
590
+ elif self.vs_ver == 11.0:
591
+ return '8.0', '8.0a'
592
+ elif self.vs_ver == 12.0:
593
+ return '8.1', '8.1a'
594
+ elif self.vs_ver >= 14.0:
595
+ return '10.0', '8.1'
596
+ return ()
597
+
598
+ @property
599
+ def WindowsSdkLastVersion(self):
600
+ """
601
+ Microsoft Windows SDK last version.
602
+
603
+ Return
604
+ ------
605
+ str
606
+ version
607
+ """
608
+ return self._use_last_dir_name(os.path.join(self.WindowsSdkDir, 'lib'))
609
+
610
+ @property
611
+ def WindowsSdkDir(self) -> str | None: # noqa: C901 # is too complex (12) # FIXME
612
+ """
613
+ Microsoft Windows SDK directory.
614
+
615
+ Return
616
+ ------
617
+ str
618
+ path
619
+ """
620
+ sdkdir: str | None = ''
621
+ for ver in self.WindowsSdkVersion:
622
+ # Try to get it from registry
623
+ loc = os.path.join(self.ri.windows_sdk, f'v{ver}')
624
+ sdkdir = self.ri.lookup(loc, 'installationfolder')
625
+ if sdkdir:
626
+ break
627
+ if not sdkdir or not os.path.isdir(sdkdir):
628
+ # Try to get "VC++ for Python" version from registry
629
+ path = os.path.join(self.ri.vc_for_python, f'{self.vc_ver:0.1f}')
630
+ install_base = self.ri.lookup(path, 'installdir')
631
+ if install_base:
632
+ sdkdir = os.path.join(install_base, 'WinSDK')
633
+ if not sdkdir or not os.path.isdir(sdkdir):
634
+ # If fail, use default new path
635
+ for ver in self.WindowsSdkVersion:
636
+ intver = ver[: ver.rfind('.')]
637
+ path = rf'Microsoft SDKs\Windows Kits\{intver}'
638
+ d = os.path.join(self.ProgramFiles, path)
639
+ if os.path.isdir(d):
640
+ sdkdir = d
641
+ if not sdkdir or not os.path.isdir(sdkdir):
642
+ # If fail, use default old path
643
+ for ver in self.WindowsSdkVersion:
644
+ path = rf'Microsoft SDKs\Windows\v{ver}'
645
+ d = os.path.join(self.ProgramFiles, path)
646
+ if os.path.isdir(d):
647
+ sdkdir = d
648
+ if not sdkdir:
649
+ # If fail, use Platform SDK
650
+ sdkdir = os.path.join(self.VCInstallDir, 'PlatformSDK')
651
+ return sdkdir
652
+
653
+ @property
654
+ def WindowsSDKExecutablePath(self):
655
+ """
656
+ Microsoft Windows SDK executable directory.
657
+
658
+ Return
659
+ ------
660
+ str
661
+ path
662
+ """
663
+ # Find WinSDK NetFx Tools registry dir name
664
+ if self.vs_ver <= 11.0:
665
+ netfxver = 35
666
+ arch = ''
667
+ else:
668
+ netfxver = 40
669
+ hidex86 = True if self.vs_ver <= 12.0 else False
670
+ arch = self.pi.current_dir(x64=True, hidex86=hidex86).replace('\\', '-')
671
+ fx = f'WinSDK-NetFx{netfxver}Tools{arch}'
672
+
673
+ # list all possibles registry paths
674
+ regpaths = []
675
+ if self.vs_ver >= 14.0:
676
+ for ver in self.NetFxSdkVersion:
677
+ regpaths += [os.path.join(self.ri.netfx_sdk, ver, fx)]
678
+
679
+ for ver in self.WindowsSdkVersion:
680
+ regpaths += [os.path.join(self.ri.windows_sdk, f'v{ver}A', fx)]
681
+
682
+ # Return installation folder from the more recent path
683
+ for path in regpaths:
684
+ execpath = self.ri.lookup(path, 'installationfolder')
685
+ if execpath:
686
+ return execpath
687
+
688
+ return None
689
+
690
+ @property
691
+ def FSharpInstallDir(self):
692
+ """
693
+ Microsoft Visual F# directory.
694
+
695
+ Return
696
+ ------
697
+ str
698
+ path
699
+ """
700
+ path = os.path.join(self.ri.visualstudio, rf'{self.vs_ver:0.1f}\Setup\F#')
701
+ return self.ri.lookup(path, 'productdir') or ''
702
+
703
+ @property
704
+ def UniversalCRTSdkDir(self):
705
+ """
706
+ Microsoft Universal CRT SDK directory.
707
+
708
+ Return
709
+ ------
710
+ str
711
+ path
712
+ """
713
+ # Set Kit Roots versions for specified MSVC++ version
714
+ vers = ('10', '81') if self.vs_ver >= 14.0 else ()
715
+
716
+ # Find path of the more recent Kit
717
+ for ver in vers:
718
+ sdkdir = self.ri.lookup(self.ri.windows_kits_roots, f'kitsroot{ver}')
719
+ if sdkdir:
720
+ return sdkdir or ''
721
+
722
+ return None
723
+
724
+ @property
725
+ def UniversalCRTSdkLastVersion(self):
726
+ """
727
+ Microsoft Universal C Runtime SDK last version.
728
+
729
+ Return
730
+ ------
731
+ str
732
+ version
733
+ """
734
+ return self._use_last_dir_name(os.path.join(self.UniversalCRTSdkDir, 'lib'))
735
+
736
+ @property
737
+ def NetFxSdkVersion(self):
738
+ """
739
+ Microsoft .NET Framework SDK versions.
740
+
741
+ Return
742
+ ------
743
+ tuple of str
744
+ versions
745
+ """
746
+ # Set FxSdk versions for specified VS version
747
+ return (
748
+ ('4.7.2', '4.7.1', '4.7', '4.6.2', '4.6.1', '4.6', '4.5.2', '4.5.1', '4.5')
749
+ if self.vs_ver >= 14.0
750
+ else ()
751
+ )
752
+
753
+ @property
754
+ def NetFxSdkDir(self):
755
+ """
756
+ Microsoft .NET Framework SDK directory.
757
+
758
+ Return
759
+ ------
760
+ str
761
+ path
762
+ """
763
+ sdkdir = ''
764
+ for ver in self.NetFxSdkVersion:
765
+ loc = os.path.join(self.ri.netfx_sdk, ver)
766
+ sdkdir = self.ri.lookup(loc, 'kitsinstallationfolder')
767
+ if sdkdir:
768
+ break
769
+ return sdkdir
770
+
771
+ @property
772
+ def FrameworkDir32(self):
773
+ """
774
+ Microsoft .NET Framework 32bit directory.
775
+
776
+ Return
777
+ ------
778
+ str
779
+ path
780
+ """
781
+ # Default path
782
+ guess_fw = os.path.join(self.WinDir, r'Microsoft.NET\Framework')
783
+
784
+ # Try to get path from registry, if fail use default path
785
+ return self.ri.lookup(self.ri.vc, 'frameworkdir32') or guess_fw
786
+
787
+ @property
788
+ def FrameworkDir64(self):
789
+ """
790
+ Microsoft .NET Framework 64bit directory.
791
+
792
+ Return
793
+ ------
794
+ str
795
+ path
796
+ """
797
+ # Default path
798
+ guess_fw = os.path.join(self.WinDir, r'Microsoft.NET\Framework64')
799
+
800
+ # Try to get path from registry, if fail use default path
801
+ return self.ri.lookup(self.ri.vc, 'frameworkdir64') or guess_fw
802
+
803
+ @property
804
+ def FrameworkVersion32(self) -> tuple[str, ...]:
805
+ """
806
+ Microsoft .NET Framework 32bit versions.
807
+
808
+ Return
809
+ ------
810
+ tuple of str
811
+ versions
812
+ """
813
+ return self._find_dot_net_versions(32)
814
+
815
+ @property
816
+ def FrameworkVersion64(self) -> tuple[str, ...]:
817
+ """
818
+ Microsoft .NET Framework 64bit versions.
819
+
820
+ Return
821
+ ------
822
+ tuple of str
823
+ versions
824
+ """
825
+ return self._find_dot_net_versions(64)
826
+
827
+ def _find_dot_net_versions(self, bits) -> tuple[str, ...]:
828
+ """
829
+ Find Microsoft .NET Framework versions.
830
+
831
+ Parameters
832
+ ----------
833
+ bits: int
834
+ Platform number of bits: 32 or 64.
835
+
836
+ Return
837
+ ------
838
+ tuple of str
839
+ versions
840
+ """
841
+ # Find actual .NET version in registry
842
+ reg_ver = self.ri.lookup(self.ri.vc, f'frameworkver{bits}')
843
+ dot_net_dir = getattr(self, f'FrameworkDir{bits}')
844
+ ver = reg_ver or self._use_last_dir_name(dot_net_dir, 'v') or ''
845
+
846
+ # Set .NET versions for specified MSVC++ version
847
+ if self.vs_ver >= 12.0:
848
+ return ver, 'v4.0'
849
+ elif self.vs_ver >= 10.0:
850
+ return 'v4.0.30319' if ver.lower()[:2] != 'v4' else ver, 'v3.5'
851
+ elif self.vs_ver == 9.0:
852
+ return 'v3.5', 'v2.0.50727'
853
+ elif self.vs_ver == 8.0:
854
+ return 'v3.0', 'v2.0.50727'
855
+ return ()
856
+
857
+ @staticmethod
858
+ def _use_last_dir_name(path, prefix=''):
859
+ """
860
+ Return name of the last dir in path or '' if no dir found.
861
+
862
+ Parameters
863
+ ----------
864
+ path: str
865
+ Use dirs in this path
866
+ prefix: str
867
+ Use only dirs starting by this prefix
868
+
869
+ Return
870
+ ------
871
+ str
872
+ name
873
+ """
874
+ matching_dirs = (
875
+ dir_name
876
+ for dir_name in reversed(os.listdir(path))
877
+ if os.path.isdir(os.path.join(path, dir_name))
878
+ and dir_name.startswith(prefix)
879
+ )
880
+ return next(matching_dirs, None) or ''
881
+
882
+
883
+ class _EnvironmentDict(TypedDict):
884
+ include: str
885
+ lib: str
886
+ libpath: str
887
+ path: str
888
+ py_vcruntime_redist: NotRequired[str | None]
889
+
890
+
891
+ class EnvironmentInfo:
892
+ """
893
+ Return environment variables for specified Microsoft Visual C++ version
894
+ and platform : Lib, Include, Path and libpath.
895
+
896
+ This function is compatible with Microsoft Visual C++ 9.0 to 14.X.
897
+
898
+ Script created by analysing Microsoft environment configuration files like
899
+ "vcvars[...].bat", "SetEnv.Cmd", "vcbuildtools.bat", ...
900
+
901
+ Parameters
902
+ ----------
903
+ arch: str
904
+ Target architecture.
905
+ vc_ver: float
906
+ Required Microsoft Visual C++ version. If not set, autodetect the last
907
+ version.
908
+ vc_min_ver: float
909
+ Minimum Microsoft Visual C++ version.
910
+ """
911
+
912
+ # Variables and properties in this class use originals CamelCase variables
913
+ # names from Microsoft source files for more easy comparison.
914
+
915
+ def __init__(self, arch, vc_ver=None, vc_min_ver=0) -> None:
916
+ self.pi = PlatformInfo(arch)
917
+ self.ri = RegistryInfo(self.pi)
918
+ self.si = SystemInfo(self.ri, vc_ver)
919
+
920
+ if self.vc_ver < vc_min_ver:
921
+ err = 'No suitable Microsoft Visual C++ version found'
922
+ raise distutils.errors.DistutilsPlatformError(err)
923
+
924
+ @property
925
+ def vs_ver(self):
926
+ """
927
+ Microsoft Visual Studio.
928
+
929
+ Return
930
+ ------
931
+ float
932
+ version
933
+ """
934
+ return self.si.vs_ver
935
+
936
+ @property
937
+ def vc_ver(self):
938
+ """
939
+ Microsoft Visual C++ version.
940
+
941
+ Return
942
+ ------
943
+ float
944
+ version
945
+ """
946
+ return self.si.vc_ver
947
+
948
+ @property
949
+ def VSTools(self):
950
+ """
951
+ Microsoft Visual Studio Tools.
952
+
953
+ Return
954
+ ------
955
+ list of str
956
+ paths
957
+ """
958
+ paths = [r'Common7\IDE', r'Common7\Tools']
959
+
960
+ if self.vs_ver >= 14.0:
961
+ arch_subdir = self.pi.current_dir(hidex86=True, x64=True)
962
+ paths += [r'Common7\IDE\CommonExtensions\Microsoft\TestWindow']
963
+ paths += [r'Team Tools\Performance Tools']
964
+ paths += [rf'Team Tools\Performance Tools{arch_subdir}']
965
+
966
+ return [os.path.join(self.si.VSInstallDir, path) for path in paths]
967
+
968
+ @property
969
+ def VCIncludes(self):
970
+ """
971
+ Microsoft Visual C++ & Microsoft Foundation Class Includes.
972
+
973
+ Return
974
+ ------
975
+ list of str
976
+ paths
977
+ """
978
+ return [
979
+ os.path.join(self.si.VCInstallDir, 'Include'),
980
+ os.path.join(self.si.VCInstallDir, r'ATLMFC\Include'),
981
+ ]
982
+
983
+ @property
984
+ def VCLibraries(self):
985
+ """
986
+ Microsoft Visual C++ & Microsoft Foundation Class Libraries.
987
+
988
+ Return
989
+ ------
990
+ list of str
991
+ paths
992
+ """
993
+ if self.vs_ver >= 15.0:
994
+ arch_subdir = self.pi.target_dir(x64=True)
995
+ else:
996
+ arch_subdir = self.pi.target_dir(hidex86=True)
997
+ paths = [f'Lib{arch_subdir}', rf'ATLMFC\Lib{arch_subdir}']
998
+
999
+ if self.vs_ver >= 14.0:
1000
+ paths += [rf'Lib\store{arch_subdir}']
1001
+
1002
+ return [os.path.join(self.si.VCInstallDir, path) for path in paths]
1003
+
1004
+ @property
1005
+ def VCStoreRefs(self):
1006
+ """
1007
+ Microsoft Visual C++ store references Libraries.
1008
+
1009
+ Return
1010
+ ------
1011
+ list of str
1012
+ paths
1013
+ """
1014
+ if self.vs_ver < 14.0:
1015
+ return []
1016
+ return [os.path.join(self.si.VCInstallDir, r'Lib\store\references')]
1017
+
1018
+ @property
1019
+ def VCTools(self):
1020
+ """
1021
+ Microsoft Visual C++ Tools.
1022
+
1023
+ Return
1024
+ ------
1025
+ list of str
1026
+ paths
1027
+
1028
+ When host CPU is ARM, the tools should be found for ARM.
1029
+
1030
+ >>> getfixture('windows_only')
1031
+ >>> mp = getfixture('monkeypatch')
1032
+ >>> mp.setattr(PlatformInfo, 'current_cpu', 'arm64')
1033
+ >>> ei = EnvironmentInfo(arch='irrelevant')
1034
+ >>> paths = ei.VCTools
1035
+ >>> any('HostARM64' in path for path in paths)
1036
+ True
1037
+ """
1038
+ si = self.si
1039
+ tools = [os.path.join(si.VCInstallDir, 'VCPackages')]
1040
+
1041
+ forcex86 = True if self.vs_ver <= 10.0 else False
1042
+ arch_subdir = self.pi.cross_dir(forcex86)
1043
+ if arch_subdir:
1044
+ tools += [os.path.join(si.VCInstallDir, f'Bin{arch_subdir}')]
1045
+
1046
+ if self.vs_ver == 14.0:
1047
+ path = f'Bin{self.pi.current_dir(hidex86=True)}'
1048
+ tools += [os.path.join(si.VCInstallDir, path)]
1049
+
1050
+ elif self.vs_ver >= 15.0:
1051
+ host_id = self.pi.current_cpu.replace('amd64', 'x64').upper()
1052
+ host_dir = os.path.join('bin', f'Host{host_id}%s')
1053
+ tools += [
1054
+ os.path.join(si.VCInstallDir, host_dir % self.pi.target_dir(x64=True))
1055
+ ]
1056
+
1057
+ if self.pi.current_cpu != self.pi.target_cpu:
1058
+ tools += [
1059
+ os.path.join(
1060
+ si.VCInstallDir, host_dir % self.pi.current_dir(x64=True)
1061
+ )
1062
+ ]
1063
+
1064
+ else:
1065
+ tools += [os.path.join(si.VCInstallDir, 'Bin')]
1066
+
1067
+ return tools
1068
+
1069
+ @property
1070
+ def OSLibraries(self):
1071
+ """
1072
+ Microsoft Windows SDK Libraries.
1073
+
1074
+ Return
1075
+ ------
1076
+ list of str
1077
+ paths
1078
+ """
1079
+ if self.vs_ver <= 10.0:
1080
+ arch_subdir = self.pi.target_dir(hidex86=True, x64=True)
1081
+ return [os.path.join(self.si.WindowsSdkDir, f'Lib{arch_subdir}')]
1082
+
1083
+ else:
1084
+ arch_subdir = self.pi.target_dir(x64=True)
1085
+ lib = os.path.join(self.si.WindowsSdkDir, 'lib')
1086
+ libver = self._sdk_subdir
1087
+ return [os.path.join(lib, f'{libver}um{arch_subdir}')]
1088
+
1089
+ @property
1090
+ def OSIncludes(self):
1091
+ """
1092
+ Microsoft Windows SDK Include.
1093
+
1094
+ Return
1095
+ ------
1096
+ list of str
1097
+ paths
1098
+ """
1099
+ include = os.path.join(self.si.WindowsSdkDir, 'include')
1100
+
1101
+ if self.vs_ver <= 10.0:
1102
+ return [include, os.path.join(include, 'gl')]
1103
+
1104
+ else:
1105
+ if self.vs_ver >= 14.0:
1106
+ sdkver = self._sdk_subdir
1107
+ else:
1108
+ sdkver = ''
1109
+ return [
1110
+ os.path.join(include, f'{sdkver}shared'),
1111
+ os.path.join(include, f'{sdkver}um'),
1112
+ os.path.join(include, f'{sdkver}winrt'),
1113
+ ]
1114
+
1115
+ @property
1116
+ def OSLibpath(self):
1117
+ """
1118
+ Microsoft Windows SDK Libraries Paths.
1119
+
1120
+ Return
1121
+ ------
1122
+ list of str
1123
+ paths
1124
+ """
1125
+ ref = os.path.join(self.si.WindowsSdkDir, 'References')
1126
+ libpath = []
1127
+
1128
+ if self.vs_ver <= 9.0:
1129
+ libpath += self.OSLibraries
1130
+
1131
+ if self.vs_ver >= 11.0:
1132
+ libpath += [os.path.join(ref, r'CommonConfiguration\Neutral')]
1133
+
1134
+ if self.vs_ver >= 14.0:
1135
+ libpath += [
1136
+ ref,
1137
+ os.path.join(self.si.WindowsSdkDir, 'UnionMetadata'),
1138
+ os.path.join(ref, 'Windows.Foundation.UniversalApiContract', '1.0.0.0'),
1139
+ os.path.join(ref, 'Windows.Foundation.FoundationContract', '1.0.0.0'),
1140
+ os.path.join(
1141
+ ref, 'Windows.Networking.Connectivity.WwanContract', '1.0.0.0'
1142
+ ),
1143
+ os.path.join(
1144
+ self.si.WindowsSdkDir,
1145
+ 'ExtensionSDKs',
1146
+ 'Microsoft.VCLibs',
1147
+ f'{self.vs_ver:0.1f}',
1148
+ 'References',
1149
+ 'CommonConfiguration',
1150
+ 'neutral',
1151
+ ),
1152
+ ]
1153
+ return libpath
1154
+
1155
+ @property
1156
+ def SdkTools(self):
1157
+ """
1158
+ Microsoft Windows SDK Tools.
1159
+
1160
+ Return
1161
+ ------
1162
+ list of str
1163
+ paths
1164
+ """
1165
+ return list(self._sdk_tools())
1166
+
1167
+ def _sdk_tools(self):
1168
+ """
1169
+ Microsoft Windows SDK Tools paths generator.
1170
+
1171
+ Return
1172
+ ------
1173
+ generator of str
1174
+ paths
1175
+ """
1176
+ if self.vs_ver < 15.0:
1177
+ bin_dir = 'Bin' if self.vs_ver <= 11.0 else r'Bin\x86'
1178
+ yield os.path.join(self.si.WindowsSdkDir, bin_dir)
1179
+
1180
+ if not self.pi.current_is_x86():
1181
+ arch_subdir = self.pi.current_dir(x64=True)
1182
+ path = f'Bin{arch_subdir}'
1183
+ yield os.path.join(self.si.WindowsSdkDir, path)
1184
+
1185
+ if self.vs_ver in (10.0, 11.0):
1186
+ if self.pi.target_is_x86():
1187
+ arch_subdir = ''
1188
+ else:
1189
+ arch_subdir = self.pi.current_dir(hidex86=True, x64=True)
1190
+ path = rf'Bin\NETFX 4.0 Tools{arch_subdir}'
1191
+ yield os.path.join(self.si.WindowsSdkDir, path)
1192
+
1193
+ elif self.vs_ver >= 15.0:
1194
+ path = os.path.join(self.si.WindowsSdkDir, 'Bin')
1195
+ arch_subdir = self.pi.current_dir(x64=True)
1196
+ sdkver = self.si.WindowsSdkLastVersion
1197
+ yield os.path.join(path, f'{sdkver}{arch_subdir}')
1198
+
1199
+ if self.si.WindowsSDKExecutablePath:
1200
+ yield self.si.WindowsSDKExecutablePath
1201
+
1202
+ @property
1203
+ def _sdk_subdir(self):
1204
+ """
1205
+ Microsoft Windows SDK version subdir.
1206
+
1207
+ Return
1208
+ ------
1209
+ str
1210
+ subdir
1211
+ """
1212
+ ucrtver = self.si.WindowsSdkLastVersion
1213
+ return (f'{ucrtver}\\') if ucrtver else ''
1214
+
1215
+ @property
1216
+ def SdkSetup(self):
1217
+ """
1218
+ Microsoft Windows SDK Setup.
1219
+
1220
+ Return
1221
+ ------
1222
+ list of str
1223
+ paths
1224
+ """
1225
+ if self.vs_ver > 9.0:
1226
+ return []
1227
+
1228
+ return [os.path.join(self.si.WindowsSdkDir, 'Setup')]
1229
+
1230
+ @property
1231
+ def FxTools(self):
1232
+ """
1233
+ Microsoft .NET Framework Tools.
1234
+
1235
+ Return
1236
+ ------
1237
+ list of str
1238
+ paths
1239
+ """
1240
+ pi = self.pi
1241
+ si = self.si
1242
+
1243
+ if self.vs_ver <= 10.0:
1244
+ include32 = True
1245
+ include64 = not pi.target_is_x86() and not pi.current_is_x86()
1246
+ else:
1247
+ include32 = pi.target_is_x86() or pi.current_is_x86()
1248
+ include64 = pi.current_cpu == 'amd64' or pi.target_cpu == 'amd64'
1249
+
1250
+ tools = []
1251
+ if include32:
1252
+ tools += [
1253
+ os.path.join(si.FrameworkDir32, ver) for ver in si.FrameworkVersion32
1254
+ ]
1255
+ if include64:
1256
+ tools += [
1257
+ os.path.join(si.FrameworkDir64, ver) for ver in si.FrameworkVersion64
1258
+ ]
1259
+ return tools
1260
+
1261
+ @property
1262
+ def NetFxSDKLibraries(self):
1263
+ """
1264
+ Microsoft .Net Framework SDK Libraries.
1265
+
1266
+ Return
1267
+ ------
1268
+ list of str
1269
+ paths
1270
+ """
1271
+ if self.vs_ver < 14.0 or not self.si.NetFxSdkDir:
1272
+ return []
1273
+
1274
+ arch_subdir = self.pi.target_dir(x64=True)
1275
+ return [os.path.join(self.si.NetFxSdkDir, rf'lib\um{arch_subdir}')]
1276
+
1277
+ @property
1278
+ def NetFxSDKIncludes(self):
1279
+ """
1280
+ Microsoft .Net Framework SDK Includes.
1281
+
1282
+ Return
1283
+ ------
1284
+ list of str
1285
+ paths
1286
+ """
1287
+ if self.vs_ver < 14.0 or not self.si.NetFxSdkDir:
1288
+ return []
1289
+
1290
+ return [os.path.join(self.si.NetFxSdkDir, r'include\um')]
1291
+
1292
+ @property
1293
+ def VsTDb(self):
1294
+ """
1295
+ Microsoft Visual Studio Team System Database.
1296
+
1297
+ Return
1298
+ ------
1299
+ list of str
1300
+ paths
1301
+ """
1302
+ return [os.path.join(self.si.VSInstallDir, r'VSTSDB\Deploy')]
1303
+
1304
+ @property
1305
+ def MSBuild(self):
1306
+ """
1307
+ Microsoft Build Engine.
1308
+
1309
+ Return
1310
+ ------
1311
+ list of str
1312
+ paths
1313
+ """
1314
+ if self.vs_ver < 12.0:
1315
+ return []
1316
+ elif self.vs_ver < 15.0:
1317
+ base_path = self.si.ProgramFilesx86
1318
+ arch_subdir = self.pi.current_dir(hidex86=True)
1319
+ else:
1320
+ base_path = self.si.VSInstallDir
1321
+ arch_subdir = ''
1322
+
1323
+ path = rf'MSBuild\{self.vs_ver:0.1f}\bin{arch_subdir}'
1324
+ build = [os.path.join(base_path, path)]
1325
+
1326
+ if self.vs_ver >= 15.0:
1327
+ # Add Roslyn C# & Visual Basic Compiler
1328
+ build += [os.path.join(base_path, path, 'Roslyn')]
1329
+
1330
+ return build
1331
+
1332
+ @property
1333
+ def HTMLHelpWorkshop(self):
1334
+ """
1335
+ Microsoft HTML Help Workshop.
1336
+
1337
+ Return
1338
+ ------
1339
+ list of str
1340
+ paths
1341
+ """
1342
+ if self.vs_ver < 11.0:
1343
+ return []
1344
+
1345
+ return [os.path.join(self.si.ProgramFilesx86, 'HTML Help Workshop')]
1346
+
1347
+ @property
1348
+ def UCRTLibraries(self):
1349
+ """
1350
+ Microsoft Universal C Runtime SDK Libraries.
1351
+
1352
+ Return
1353
+ ------
1354
+ list of str
1355
+ paths
1356
+ """
1357
+ if self.vs_ver < 14.0:
1358
+ return []
1359
+
1360
+ arch_subdir = self.pi.target_dir(x64=True)
1361
+ lib = os.path.join(self.si.UniversalCRTSdkDir, 'lib')
1362
+ ucrtver = self._ucrt_subdir
1363
+ return [os.path.join(lib, f'{ucrtver}ucrt{arch_subdir}')]
1364
+
1365
+ @property
1366
+ def UCRTIncludes(self):
1367
+ """
1368
+ Microsoft Universal C Runtime SDK Include.
1369
+
1370
+ Return
1371
+ ------
1372
+ list of str
1373
+ paths
1374
+ """
1375
+ if self.vs_ver < 14.0:
1376
+ return []
1377
+
1378
+ include = os.path.join(self.si.UniversalCRTSdkDir, 'include')
1379
+ return [os.path.join(include, f'{self._ucrt_subdir}ucrt')]
1380
+
1381
+ @property
1382
+ def _ucrt_subdir(self):
1383
+ """
1384
+ Microsoft Universal C Runtime SDK version subdir.
1385
+
1386
+ Return
1387
+ ------
1388
+ str
1389
+ subdir
1390
+ """
1391
+ ucrtver = self.si.UniversalCRTSdkLastVersion
1392
+ return (f'{ucrtver}\\') if ucrtver else ''
1393
+
1394
+ @property
1395
+ def FSharp(self):
1396
+ """
1397
+ Microsoft Visual F#.
1398
+
1399
+ Return
1400
+ ------
1401
+ list of str
1402
+ paths
1403
+ """
1404
+ if 11.0 > self.vs_ver > 12.0:
1405
+ return []
1406
+
1407
+ return [self.si.FSharpInstallDir]
1408
+
1409
+ @property
1410
+ def VCRuntimeRedist(self) -> str | None:
1411
+ """
1412
+ Microsoft Visual C++ runtime redistributable dll.
1413
+
1414
+ Returns the first suitable path found or None.
1415
+ """
1416
+ vcruntime = f'vcruntime{self.vc_ver}0.dll'
1417
+ arch_subdir = self.pi.target_dir(x64=True).strip('\\')
1418
+
1419
+ # Installation prefixes candidates
1420
+ prefixes = []
1421
+ tools_path = self.si.VCInstallDir
1422
+ redist_path = os.path.dirname(tools_path.replace(r'\Tools', r'\Redist'))
1423
+ if os.path.isdir(redist_path):
1424
+ # Redist version may not be exactly the same as tools
1425
+ redist_path = os.path.join(redist_path, os.listdir(redist_path)[-1])
1426
+ prefixes += [redist_path, os.path.join(redist_path, 'onecore')]
1427
+
1428
+ prefixes += [os.path.join(tools_path, 'redist')] # VS14 legacy path
1429
+
1430
+ # CRT directory
1431
+ crt_dirs = (
1432
+ f'Microsoft.VC{self.vc_ver * 10}.CRT',
1433
+ # Sometime store in directory with VS version instead of VC
1434
+ f'Microsoft.VC{int(self.vs_ver) * 10}.CRT',
1435
+ )
1436
+
1437
+ # vcruntime path
1438
+ candidate_paths = (
1439
+ os.path.join(prefix, arch_subdir, crt_dir, vcruntime)
1440
+ for (prefix, crt_dir) in itertools.product(prefixes, crt_dirs)
1441
+ )
1442
+ return next(filter(os.path.isfile, candidate_paths), None) # type: ignore[arg-type] #python/mypy#12682
1443
+
1444
+ def return_env(self, exists: bool = True) -> _EnvironmentDict:
1445
+ """
1446
+ Return environment dict.
1447
+
1448
+ Parameters
1449
+ ----------
1450
+ exists: bool
1451
+ It True, only return existing paths.
1452
+
1453
+ Return
1454
+ ------
1455
+ dict
1456
+ environment
1457
+ """
1458
+ env = _EnvironmentDict(
1459
+ include=self._build_paths(
1460
+ 'include',
1461
+ [
1462
+ self.VCIncludes,
1463
+ self.OSIncludes,
1464
+ self.UCRTIncludes,
1465
+ self.NetFxSDKIncludes,
1466
+ ],
1467
+ exists,
1468
+ ),
1469
+ lib=self._build_paths(
1470
+ 'lib',
1471
+ [
1472
+ self.VCLibraries,
1473
+ self.OSLibraries,
1474
+ self.FxTools,
1475
+ self.UCRTLibraries,
1476
+ self.NetFxSDKLibraries,
1477
+ ],
1478
+ exists,
1479
+ ),
1480
+ libpath=self._build_paths(
1481
+ 'libpath',
1482
+ [self.VCLibraries, self.FxTools, self.VCStoreRefs, self.OSLibpath],
1483
+ exists,
1484
+ ),
1485
+ path=self._build_paths(
1486
+ 'path',
1487
+ [
1488
+ self.VCTools,
1489
+ self.VSTools,
1490
+ self.VsTDb,
1491
+ self.SdkTools,
1492
+ self.SdkSetup,
1493
+ self.FxTools,
1494
+ self.MSBuild,
1495
+ self.HTMLHelpWorkshop,
1496
+ self.FSharp,
1497
+ ],
1498
+ exists,
1499
+ ),
1500
+ )
1501
+ if self.vs_ver >= 14 and self.VCRuntimeRedist:
1502
+ env['py_vcruntime_redist'] = self.VCRuntimeRedist
1503
+ return env
1504
+
1505
+ def _build_paths(self, name, spec_path_lists, exists):
1506
+ """
1507
+ Given an environment variable name and specified paths,
1508
+ return a pathsep-separated string of paths containing
1509
+ unique, extant, directories from those paths and from
1510
+ the environment variable. Raise an error if no paths
1511
+ are resolved.
1512
+
1513
+ Parameters
1514
+ ----------
1515
+ name: str
1516
+ Environment variable name
1517
+ spec_path_lists: list of str
1518
+ Paths
1519
+ exists: bool
1520
+ It True, only return existing paths.
1521
+
1522
+ Return
1523
+ ------
1524
+ str
1525
+ Pathsep-separated paths
1526
+ """
1527
+ # flatten spec_path_lists
1528
+ spec_paths = itertools.chain.from_iterable(spec_path_lists)
1529
+ env_paths = environ.get(name, '').split(os.pathsep)
1530
+ paths = itertools.chain(spec_paths, env_paths)
1531
+ extant_paths = list(filter(os.path.isdir, paths)) if exists else paths
1532
+ if not extant_paths:
1533
+ msg = f"{name.upper()} environment variable is empty"
1534
+ raise distutils.errors.DistutilsPlatformError(msg)
1535
+ unique_paths = unique_everseen(extant_paths)
1536
+ return os.pathsep.join(unique_paths)