pex 2.59.5__py2.py3-none-any.whl → 2.60.0__py2.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 pex might be problematic. Click here for more details.

Files changed (111) hide show
  1. pex/cache/dirs.py +14 -4
  2. pex/cli/commands/lock.py +8 -5
  3. pex/common.py +57 -7
  4. pex/dist_metadata.py +48 -6
  5. pex/docs/html/_pagefind/fragment/en_39c0488.pf_fragment +0 -0
  6. pex/docs/html/_pagefind/fragment/en_3eeaaf4.pf_fragment +0 -0
  7. pex/docs/html/_pagefind/fragment/en_a1dde36.pf_fragment +0 -0
  8. pex/docs/html/_pagefind/fragment/en_a755644.pf_fragment +0 -0
  9. pex/docs/html/_pagefind/fragment/en_b16e3bd.pf_fragment +0 -0
  10. pex/docs/html/_pagefind/fragment/{en_ecf679c.pf_fragment → en_c5d35a7.pf_fragment} +0 -0
  11. pex/docs/html/_pagefind/fragment/en_ec62bd2.pf_fragment +0 -0
  12. pex/docs/html/_pagefind/fragment/en_f32628f.pf_fragment +0 -0
  13. pex/docs/html/_pagefind/index/{en_974dc5a.pf_index → en_b211695.pf_index} +0 -0
  14. pex/docs/html/_pagefind/pagefind-entry.json +1 -1
  15. pex/docs/html/_pagefind/pagefind.en_e8a49380e5.pf_meta +0 -0
  16. pex/docs/html/_static/documentation_options.js +1 -1
  17. pex/docs/html/api/vars.html +5 -5
  18. pex/docs/html/buildingpex.html +5 -5
  19. pex/docs/html/genindex.html +5 -5
  20. pex/docs/html/index.html +5 -5
  21. pex/docs/html/recipes.html +5 -5
  22. pex/docs/html/scie.html +5 -5
  23. pex/docs/html/search.html +5 -5
  24. pex/docs/html/whatispex.html +5 -5
  25. pex/entry_points_txt.py +98 -0
  26. pex/environment.py +13 -10
  27. pex/finders.py +1 -1
  28. pex/installed_wheel.py +127 -0
  29. pex/interpreter.py +17 -5
  30. pex/interpreter_constraints.py +4 -4
  31. pex/pep_376.py +20 -380
  32. pex/pep_427.py +736 -248
  33. pex/pex_builder.py +4 -4
  34. pex/pex_info.py +8 -3
  35. pex/resolve/venv_resolver.py +46 -25
  36. pex/resolver.py +10 -3
  37. pex/sysconfig.py +5 -3
  38. pex/third_party/__init__.py +1 -1
  39. pex/tools/commands/repository.py +47 -24
  40. pex/vendor/__init__.py +1 -8
  41. pex/vendor/__main__.py +62 -41
  42. pex/vendor/_vendored/ansicolors/.layout.json +1 -1
  43. pex/vendor/_vendored/ansicolors/ansicolors-1.1.8.dist-info/RECORD +11 -0
  44. pex/vendor/_vendored/ansicolors/ansicolors-1.1.8.pex-info/original-whl-info.json +1 -0
  45. pex/vendor/_vendored/appdirs/.layout.json +1 -1
  46. pex/vendor/_vendored/appdirs/appdirs-1.4.4.dist-info/RECORD +7 -0
  47. pex/vendor/_vendored/appdirs/appdirs-1.4.4.pex-info/original-whl-info.json +1 -0
  48. pex/vendor/_vendored/attrs/.layout.json +1 -1
  49. pex/vendor/_vendored/attrs/attrs-21.5.0.dev0.dist-info/RECORD +37 -0
  50. pex/vendor/_vendored/attrs/attrs-21.5.0.dev0.pex-info/original-whl-info.json +1 -0
  51. pex/vendor/_vendored/packaging_20_9/.layout.json +1 -1
  52. pex/vendor/_vendored/packaging_20_9/packaging-20.9.dist-info/RECORD +20 -0
  53. pex/vendor/_vendored/packaging_20_9/packaging-20.9.pex-info/original-whl-info.json +1 -0
  54. pex/vendor/_vendored/packaging_20_9/pyparsing-2.4.7.dist-info/RECORD +7 -0
  55. pex/vendor/_vendored/packaging_20_9/pyparsing-2.4.7.pex-info/original-whl-info.json +1 -0
  56. pex/vendor/_vendored/packaging_21_3/.layout.json +1 -1
  57. pex/vendor/_vendored/packaging_21_3/packaging-21.3.dist-info/RECORD +20 -0
  58. pex/vendor/_vendored/packaging_21_3/packaging-21.3.pex-info/original-whl-info.json +1 -0
  59. pex/vendor/_vendored/packaging_21_3/pyparsing-3.0.7.dist-info/RECORD +18 -0
  60. pex/vendor/_vendored/packaging_21_3/pyparsing-3.0.7.pex-info/original-whl-info.json +1 -0
  61. pex/vendor/_vendored/packaging_24_0/.layout.json +1 -1
  62. pex/vendor/_vendored/packaging_24_0/packaging-24.0.dist-info/RECORD +22 -0
  63. pex/vendor/_vendored/packaging_24_0/packaging-24.0.pex-info/original-whl-info.json +1 -0
  64. pex/vendor/_vendored/packaging_25_0/.layout.json +1 -1
  65. pex/vendor/_vendored/packaging_25_0/packaging-25.0.dist-info/RECORD +24 -0
  66. pex/vendor/_vendored/packaging_25_0/packaging-25.0.pex-info/original-whl-info.json +1 -0
  67. pex/vendor/_vendored/pip/.layout.json +1 -1
  68. pex/vendor/_vendored/pip/pip-20.3.4.dist-info/RECORD +388 -0
  69. pex/vendor/_vendored/pip/pip-20.3.4.pex-info/original-whl-info.json +1 -0
  70. pex/vendor/_vendored/setuptools/.layout.json +1 -1
  71. pex/vendor/_vendored/setuptools/setuptools-44.0.0+3acb925dd708430aeaf197ea53ac8a752f7c1863.dist-info/RECORD +107 -0
  72. pex/vendor/_vendored/setuptools/setuptools-44.0.0+3acb925dd708430aeaf197ea53ac8a752f7c1863.pex-info/original-whl-info.json +1 -0
  73. pex/vendor/_vendored/toml/.layout.json +1 -1
  74. pex/vendor/_vendored/toml/toml-0.10.2.dist-info/RECORD +11 -0
  75. pex/vendor/_vendored/toml/toml-0.10.2.pex-info/original-whl-info.json +1 -0
  76. pex/vendor/_vendored/tomli/.layout.json +1 -1
  77. pex/vendor/_vendored/tomli/tomli-2.0.1.dist-info/RECORD +10 -0
  78. pex/vendor/_vendored/tomli/tomli-2.0.1.pex-info/original-whl-info.json +1 -0
  79. pex/venv/installer.py +9 -5
  80. pex/version.py +1 -1
  81. pex/wheel.py +79 -15
  82. pex/whl.py +67 -0
  83. pex/windows/__init__.py +14 -11
  84. {pex-2.59.5.dist-info → pex-2.60.0.dist-info}/METADATA +4 -4
  85. {pex-2.59.5.dist-info → pex-2.60.0.dist-info}/RECORD +90 -74
  86. pex/docs/html/_pagefind/fragment/en_34b3bf8.pf_fragment +0 -0
  87. pex/docs/html/_pagefind/fragment/en_3cefc8e.pf_fragment +0 -0
  88. pex/docs/html/_pagefind/fragment/en_44ba8a7.pf_fragment +0 -0
  89. pex/docs/html/_pagefind/fragment/en_8eb9a56.pf_fragment +0 -0
  90. pex/docs/html/_pagefind/fragment/en_db171fd.pf_fragment +0 -0
  91. pex/docs/html/_pagefind/fragment/en_fb971c7.pf_fragment +0 -0
  92. pex/docs/html/_pagefind/fragment/en_fd8f242.pf_fragment +0 -0
  93. pex/docs/html/_pagefind/pagefind.en_3549188bce.pf_meta +0 -0
  94. pex/vendor/_vendored/ansicolors/ansicolors-1.1.8.dist-info/INSTALLER +0 -1
  95. pex/vendor/_vendored/appdirs/appdirs-1.4.4.dist-info/INSTALLER +0 -1
  96. pex/vendor/_vendored/attrs/attrs-21.5.0.dev0.dist-info/INSTALLER +0 -1
  97. pex/vendor/_vendored/packaging_20_9/packaging-20.9.dist-info/INSTALLER +0 -1
  98. pex/vendor/_vendored/packaging_20_9/pyparsing-2.4.7.dist-info/INSTALLER +0 -1
  99. pex/vendor/_vendored/packaging_21_3/packaging-21.3.dist-info/INSTALLER +0 -1
  100. pex/vendor/_vendored/packaging_21_3/pyparsing-3.0.7.dist-info/INSTALLER +0 -1
  101. pex/vendor/_vendored/packaging_24_0/packaging-24.0.dist-info/INSTALLER +0 -1
  102. pex/vendor/_vendored/packaging_25_0/packaging-25.0.dist-info/INSTALLER +0 -1
  103. pex/vendor/_vendored/pip/pip-20.3.4.dist-info/INSTALLER +0 -1
  104. pex/vendor/_vendored/setuptools/setuptools-44.0.0+3acb925dd708430aeaf197ea53ac8a752f7c1863.dist-info/INSTALLER +0 -1
  105. pex/vendor/_vendored/toml/toml-0.10.2.dist-info/INSTALLER +0 -1
  106. pex/vendor/_vendored/tomli/tomli-2.0.1.dist-info/INSTALLER +0 -1
  107. {pex-2.59.5.dist-info → pex-2.60.0.dist-info}/WHEEL +0 -0
  108. {pex-2.59.5.dist-info → pex-2.60.0.dist-info}/entry_points.txt +0 -0
  109. {pex-2.59.5.dist-info → pex-2.60.0.dist-info}/licenses/LICENSE +0 -0
  110. {pex-2.59.5.dist-info → pex-2.60.0.dist-info}/pylock/pylock.toml +0 -0
  111. {pex-2.59.5.dist-info → pex-2.60.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1 @@
1
+ {"entries":[["easy_install.py",[1980,1,1,0,0,0],2175008768],["pkg_resources/__init__.py",[1980,1,1,0,0,0],2175008768],["pkg_resources/py31compat.py",[1980,1,1,0,0,0],2175008768],["pkg_resources/_vendor/__init__.py",[1980,1,1,0,0,0],2175008768],["pkg_resources/_vendor/appdirs.py",[1980,1,1,0,0,0],2175008768],["pkg_resources/_vendor/pyparsing.py",[1980,1,1,0,0,0],2175008768],["pkg_resources/_vendor/six.py",[1980,1,1,0,0,0],2175008768],["pkg_resources/_vendor/packaging/__about__.py",[1980,1,1,0,0,0],2175008768],["pkg_resources/_vendor/packaging/__init__.py",[1980,1,1,0,0,0],2175008768],["pkg_resources/_vendor/packaging/_compat.py",[1980,1,1,0,0,0],2175008768],["pkg_resources/_vendor/packaging/_structures.py",[1980,1,1,0,0,0],2175008768],["pkg_resources/_vendor/packaging/markers.py",[1980,1,1,0,0,0],2175008768],["pkg_resources/_vendor/packaging/requirements.py",[1980,1,1,0,0,0],2175008768],["pkg_resources/_vendor/packaging/specifiers.py",[1980,1,1,0,0,0],2175008768],["pkg_resources/_vendor/packaging/utils.py",[1980,1,1,0,0,0],2175008768],["pkg_resources/_vendor/packaging/version.py",[1980,1,1,0,0,0],2175008768],["pkg_resources/extern/__init__.py",[1980,1,1,0,0,0],2175008768],["setuptools/__init__.py",[1980,1,1,0,0,0],2175008768],["setuptools/_deprecation_warning.py",[1980,1,1,0,0,0],2175008768],["setuptools/_imp.py",[1980,1,1,0,0,0],2175008768],["setuptools/archive_util.py",[1980,1,1,0,0,0],2175008768],["setuptools/build_meta.py",[1980,1,1,0,0,0],2175008768],["setuptools/cli-32.exe",[1980,1,1,0,0,0],2175008768],["setuptools/cli-64.exe",[1980,1,1,0,0,0],2175008768],["setuptools/cli.exe",[1980,1,1,0,0,0],2175008768],["setuptools/config.py",[1980,1,1,0,0,0],2175008768],["setuptools/dep_util.py",[1980,1,1,0,0,0],2175008768],["setuptools/depends.py",[1980,1,1,0,0,0],2175008768],["setuptools/dist.py",[1980,1,1,0,0,0],2175008768],["setuptools/errors.py",[1980,1,1,0,0,0],2175008768],["setuptools/extension.py",[1980,1,1,0,0,0],2175008768],["setuptools/glob.py",[1980,1,1,0,0,0],2175008768],["setuptools/gui-32.exe",[1980,1,1,0,0,0],2175008768],["setuptools/gui-64.exe",[1980,1,1,0,0,0],2175008768],["setuptools/gui.exe",[1980,1,1,0,0,0],2175008768],["setuptools/installer.py",[1980,1,1,0,0,0],2175008768],["setuptools/launch.py",[1980,1,1,0,0,0],2175008768],["setuptools/lib2to3_ex.py",[1980,1,1,0,0,0],2175008768],["setuptools/monkey.py",[1980,1,1,0,0,0],2175008768],["setuptools/msvc.py",[1980,1,1,0,0,0],2175008768],["setuptools/namespaces.py",[1980,1,1,0,0,0],2175008768],["setuptools/package_index.py",[1980,1,1,0,0,0],2175008768],["setuptools/py27compat.py",[1980,1,1,0,0,0],2175008768],["setuptools/py31compat.py",[1980,1,1,0,0,0],2175008768],["setuptools/py33compat.py",[1980,1,1,0,0,0],2175008768],["setuptools/py34compat.py",[1980,1,1,0,0,0],2175008768],["setuptools/sandbox.py",[1980,1,1,0,0,0],2175008768],["setuptools/script (dev).tmpl",[1980,1,1,0,0,0],2175008768],["setuptools/script.tmpl",[1980,1,1,0,0,0],2175008768],["setuptools/site-patch.py",[1980,1,1,0,0,0],2175008768],["setuptools/ssl_support.py",[1980,1,1,0,0,0],2175008768],["setuptools/unicode_utils.py",[1980,1,1,0,0,0],2175008768],["setuptools/version.py",[1980,1,1,0,0,0],2175008768],["setuptools/wheel.py",[1980,1,1,0,0,0],2175008768],["setuptools/windows_support.py",[1980,1,1,0,0,0],2175008768],["setuptools/_vendor/__init__.py",[1980,1,1,0,0,0],2175008768],["setuptools/_vendor/ordered_set.py",[1980,1,1,0,0,0],2175008768],["setuptools/_vendor/pyparsing.py",[1980,1,1,0,0,0],2175008768],["setuptools/_vendor/six.py",[1980,1,1,0,0,0],2175008768],["setuptools/_vendor/packaging/__about__.py",[1980,1,1,0,0,0],2175008768],["setuptools/_vendor/packaging/__init__.py",[1980,1,1,0,0,0],2175008768],["setuptools/_vendor/packaging/_compat.py",[1980,1,1,0,0,0],2175008768],["setuptools/_vendor/packaging/_structures.py",[1980,1,1,0,0,0],2175008768],["setuptools/_vendor/packaging/markers.py",[1980,1,1,0,0,0],2175008768],["setuptools/_vendor/packaging/requirements.py",[1980,1,1,0,0,0],2175008768],["setuptools/_vendor/packaging/specifiers.py",[1980,1,1,0,0,0],2175008768],["setuptools/_vendor/packaging/tags.py",[1980,1,1,0,0,0],2175008768],["setuptools/_vendor/packaging/utils.py",[1980,1,1,0,0,0],2175008768],["setuptools/_vendor/packaging/version.py",[1980,1,1,0,0,0],2175008768],["setuptools/command/__init__.py",[1980,1,1,0,0,0],2175008768],["setuptools/command/alias.py",[1980,1,1,0,0,0],2175008768],["setuptools/command/bdist_egg.py",[1980,1,1,0,0,0],2175008768],["setuptools/command/bdist_rpm.py",[1980,1,1,0,0,0],2175008768],["setuptools/command/bdist_wininst.py",[1980,1,1,0,0,0],2175008768],["setuptools/command/build_clib.py",[1980,1,1,0,0,0],2175008768],["setuptools/command/build_ext.py",[1980,1,1,0,0,0],2175008768],["setuptools/command/build_py.py",[1980,1,1,0,0,0],2175008768],["setuptools/command/develop.py",[1980,1,1,0,0,0],2175008768],["setuptools/command/dist_info.py",[1980,1,1,0,0,0],2175008768],["setuptools/command/easy_install.py",[1980,1,1,0,0,0],2175008768],["setuptools/command/egg_info.py",[1980,1,1,0,0,0],2175008768],["setuptools/command/install.py",[1980,1,1,0,0,0],2175008768],["setuptools/command/install_egg_info.py",[1980,1,1,0,0,0],2175008768],["setuptools/command/install_lib.py",[1980,1,1,0,0,0],2175008768],["setuptools/command/install_scripts.py",[1980,1,1,0,0,0],2175008768],["setuptools/command/launcher manifest.xml",[1980,1,1,0,0,0],2175008768],["setuptools/command/py36compat.py",[1980,1,1,0,0,0],2175008768],["setuptools/command/register.py",[1980,1,1,0,0,0],2175008768],["setuptools/command/rotate.py",[1980,1,1,0,0,0],2175008768],["setuptools/command/saveopts.py",[1980,1,1,0,0,0],2175008768],["setuptools/command/sdist.py",[1980,1,1,0,0,0],2175008768],["setuptools/command/setopt.py",[1980,1,1,0,0,0],2175008768],["setuptools/command/test.py",[1980,1,1,0,0,0],2175008768],["setuptools/command/upload.py",[1980,1,1,0,0,0],2175008768],["setuptools/command/upload_docs.py",[1980,1,1,0,0,0],2175008768],["setuptools/extern/__init__.py",[1980,1,1,0,0,0],2175008768],["setuptools-44.0.0+3acb925dd708430aeaf197ea53ac8a752f7c1863.dist-info/LICENSE",[1980,1,1,0,0,0],2175008768],["setuptools-44.0.0+3acb925dd708430aeaf197ea53ac8a752f7c1863.dist-info/METADATA",[1980,1,1,0,0,0],2175008768],["setuptools-44.0.0+3acb925dd708430aeaf197ea53ac8a752f7c1863.dist-info/WHEEL",[1980,1,1,0,0,0],2175008768],["setuptools-44.0.0+3acb925dd708430aeaf197ea53ac8a752f7c1863.dist-info/dependency_links.txt",[1980,1,1,0,0,0],2175008768],["setuptools-44.0.0+3acb925dd708430aeaf197ea53ac8a752f7c1863.dist-info/entry_points.txt",[1980,1,1,0,0,0],2175008768],["setuptools-44.0.0+3acb925dd708430aeaf197ea53ac8a752f7c1863.dist-info/top_level.txt",[1980,1,1,0,0,0],2175008768],["setuptools-44.0.0+3acb925dd708430aeaf197ea53ac8a752f7c1863.dist-info/zip-safe",[1980,1,1,0,0,0],2175008768],["setuptools-44.0.0+3acb925dd708430aeaf197ea53ac8a752f7c1863.dist-info/RECORD",[1980,1,1,0,0,0],28573696]],"filename":"setuptools-44.0.0+3acb925dd708430aeaf197ea53ac8a752f7c1863-py2.py3-none-any.whl"}
@@ -1 +1 @@
1
- {"fingerprint": "3fd281547bbc087c77a8de1a2ccdd19711d62164aa3edef5a801f8092650db08", "record_relpath": "toml-0.10.2.dist-info/RECORD", "root_is_purelib": true, "stash_dir": ".prefix"}
1
+ {"fingerprint":"e022215e30b009ca1018a9255f6812d150469e3f6ff12687dd93459dd5a5274d","record_relpath":"toml-0.10.2.dist-info/RECORD","root_is_purelib":true,"stash_dir":".prefix"}
@@ -0,0 +1,11 @@
1
+ toml/__init__.py,sha256=OAi77F_oThE00nGyd1z7JgtG_PKq6XKQxLfThnETzcU,1003
2
+ toml/decoder.py,sha256=NT-RGTEh0vBksVd2WaYorMu5-K350_ymWiDggVUXefM,39084
3
+ toml/encoder.py,sha256=KWnqyK3VROUobm8d3dOKckXMEh4d_yOQGPWvPNCj5xI,10273
4
+ toml/ordered.py,sha256=-0iAss5NfnsyIjhzsyjtztFiCgVINlW7dGXmgdBcLvA,642
5
+ toml/tz.py,sha256=-5vg8wkg_atnVi2TnEveexIVE7T_FxBVr_-2WVfO1oA,701
6
+ toml-0.10.2.dist-info/LICENSE,sha256=LZKUgj32yJNXyL5JJ_znk2HWVh5e51MtWSbmOTmqpTY,1252
7
+ toml-0.10.2.dist-info/METADATA,sha256=n_YkspvEihd_QXLIZZ50WVSFz3rZ_k7jQP-OU1WUpWY,7142
8
+ toml-0.10.2.dist-info/WHEEL,sha256=ADKeyaGyKF5DwBNE0sRE5pvW-bSkFMJfBuhzZ3rceP4,110
9
+ toml-0.10.2.dist-info/top_level.txt,sha256=2BO8ZRNnvJWgXyiQv66LBb_v87qBzcoUtEBefA75Ouk,5
10
+ toml-0.10.2.dist-info/RECORD,,
11
+ toml-0.10.2.pex-info/original-whl-info.json,sha256=63hjg_RvL2dX1x8O7tNS3P_oW9o1e5CHUfZ0MIyKehM,636
@@ -0,0 +1 @@
1
+ {"entries":[["toml/__init__.py",[2020,11,1,1,37,2],2175008768],["toml/decoder.py",[2020,10,31,3,20,8],2175008768],["toml/encoder.py",[2020,10,31,3,20,8],2175008768],["toml/ordered.py",[2018,4,1,16,33,32],2175008768],["toml/tz.py",[2020,10,31,3,20,8],2175008768],["toml-0.10.2.dist-info/LICENSE",[2020,11,1,1,37,14],2175008768],["toml-0.10.2.dist-info/METADATA",[2020,11,1,1,37,14],2175008768],["toml-0.10.2.dist-info/WHEEL",[2020,11,1,1,37,14],2175008768],["toml-0.10.2.dist-info/top_level.txt",[2020,11,1,1,37,14],2175008768],["toml-0.10.2.dist-info/RECORD",[2020,11,1,1,37,14],28573696]],"filename":"toml-0.10.2-py2.py3-none-any.whl"}
@@ -1 +1 @@
1
- {"fingerprint": "0454d05ff5986998a7ace56edd25253452f464fd365f7ab4295edba84b58162f", "record_relpath": "tomli-2.0.1.dist-info/RECORD", "root_is_purelib": true, "stash_dir": ".prefix"}
1
+ {"fingerprint":"bbe9219bfe424168417563a7c481eeed73fbb39ef7458e0e8ba636276afb2822","record_relpath":"tomli-2.0.1.dist-info/RECORD","root_is_purelib":true,"stash_dir":".prefix"}
@@ -0,0 +1,10 @@
1
+ tomli/__init__.py,sha256=JhUwV66DB1g4Hvt1UQCVMdfCu-IgAV8FXmvDU9onxd4,396
2
+ tomli/_parser.py,sha256=g9-ENaALS-B8dokYpCuzUFalWlog7T-SIYMjLZSWrtM,22633
3
+ tomli/_re.py,sha256=dbjg5ChZT23Ka9z9DHOXfdtSpPwUfdgMXnj8NOoly-w,2943
4
+ tomli/_types.py,sha256=-GTG2VUqkpxwMqzmVO4F7ybKddIbAnuAHXfmWQcTi3Q,254
5
+ tomli/py.typed,sha256=8PjyZ1aVoQpRVvt71muvuq5qE-jTFZkK-GLHkhdebmc,26
6
+ tomli-2.0.1.dist-info/LICENSE,sha256=uAgWsNUwuKzLTCIReDeQmEpuO2GSLCte6S8zcqsnQv4,1072
7
+ tomli-2.0.1.dist-info/WHEEL,sha256=jPMR_Dzkc4X4icQtmz81lnNY_kAsfog7ry7qoRvYLXw,81
8
+ tomli-2.0.1.dist-info/METADATA,sha256=zPDceKmPwJGLWtZykrHixL7WVXWmJGzZ1jyRT5lCoPI,8875
9
+ tomli-2.0.1.dist-info/RECORD,,
10
+ tomli-2.0.1.pex-info/original-whl-info.json,sha256=_Iy0aZfe20sZ7ZM6ou1a246HfctfLCZeq4YrNIc7k_I,552
@@ -0,0 +1 @@
1
+ {"entries":[["tomli/__init__.py",[2022,2,8,10,53,42],2175008768],["tomli/_parser.py",[2022,2,8,10,53,42],2175008768],["tomli/_re.py",[2022,2,8,10,53,42],2175008768],["tomli/_types.py",[2022,2,8,10,53,42],2175008768],["tomli/py.typed",[2022,2,8,10,53,42],2175008768],["tomli-2.0.1.dist-info/LICENSE",[2022,2,8,10,53,42],2175008768],["tomli-2.0.1.dist-info/WHEEL",[2016,1,1,0,0,0],27525120],["tomli-2.0.1.dist-info/METADATA",[2016,1,1,0,0,0],27525120],["tomli-2.0.1.dist-info/RECORD",[2016,1,1,0,0,0],27525120]],"filename":"tomli-2.0.1-py3-none-any.whl"}
pex/venv/installer.py CHANGED
@@ -17,9 +17,10 @@ from pex.dist_metadata import Distribution
17
17
  from pex.environment import PEXEnvironment
18
18
  from pex.executables import chmod_plus_x
19
19
  from pex.fs import safe_symlink
20
+ from pex.installed_wheel import InstalledWheel
20
21
  from pex.orderedset import OrderedSet
21
22
  from pex.os import WINDOWS
22
- from pex.pep_376 import InstalledWheel
23
+ from pex.pep_427 import reinstall_flat, reinstall_venv
23
24
  from pex.pep_440 import Version
24
25
  from pex.pep_503 import ProjectName
25
26
  from pex.pex import PEX
@@ -268,8 +269,8 @@ def _populate_flat_deps(
268
269
  for dist in distributions:
269
270
  try:
270
271
  installed_wheel = InstalledWheel.load(dist.location)
271
- for src, dst in installed_wheel.reinstall_flat(
272
- target_dir=dest_dir, copy_mode=copy_mode
272
+ for src, dst in reinstall_flat(
273
+ installed_wheel=installed_wheel, target_dir=dest_dir, copy_mode=copy_mode
273
274
  ):
274
275
  yield src, dst
275
276
  except InstalledWheel.LoadError:
@@ -482,8 +483,11 @@ def _populate_venv_deps(
482
483
 
483
484
  try:
484
485
  installed_wheel = InstalledWheel.load(dist.location)
485
- for src, dst in installed_wheel.reinstall_venv(
486
- venv, copy_mode=copy_mode, rel_extra_path=rel_extra_path
486
+ for src, dst in reinstall_venv(
487
+ installed_wheel=installed_wheel,
488
+ venv=venv,
489
+ copy_mode=copy_mode,
490
+ rel_extra_path=rel_extra_path,
487
491
  ):
488
492
  yield src, dst
489
493
  except InstalledWheel.LoadError:
pex/version.py CHANGED
@@ -1,4 +1,4 @@
1
1
  # Copyright 2015 Pex project contributors.
2
2
  # Licensed under the Apache License, Version 2.0 (see LICENSE).
3
3
 
4
- __version__ = "2.59.5"
4
+ __version__ = "2.60.0"
pex/wheel.py CHANGED
@@ -17,11 +17,13 @@ from pex.dist_metadata import (
17
17
  parse_message,
18
18
  )
19
19
  from pex.orderedset import OrderedSet
20
+ from pex.pep_440 import Version
21
+ from pex.pep_503 import ProjectName
20
22
  from pex.third_party.packaging import tags
21
23
  from pex.typing import TYPE_CHECKING, cast
22
24
 
23
25
  if TYPE_CHECKING:
24
- from typing import Dict, Optional, Text, Tuple
26
+ from typing import Dict, Iterator, List, Optional, Text, Tuple
25
27
 
26
28
  import attr # vendor:skip
27
29
  else:
@@ -53,30 +55,37 @@ class WHEEL(object):
53
55
  metadata = parse_message(metadata_bytes)
54
56
  return cls(files=metadata_files, metadata=metadata)
55
57
 
56
- _CACHE = {} # type: Dict[Text, WHEEL]
58
+ _CACHE = {} # type: Dict[Tuple[Text, Optional[ProjectName]], WHEEL]
57
59
 
58
60
  @classmethod
59
- def load(cls, location):
60
- # type: (Text) -> WHEEL
61
- wheel = cls._CACHE.get(location)
61
+ def load(
62
+ cls,
63
+ location, # type: Text
64
+ project_name=None, # type: Optional[ProjectName]
65
+ ):
66
+ # type: (...) -> WHEEL
67
+ wheel = cls._CACHE.get((location, project_name))
62
68
  if not wheel:
63
- metadata_files = load_metadata(location, restrict_types_to=(MetadataType.DIST_INFO,))
69
+ metadata_files = load_metadata(
70
+ location, project_name=project_name, restrict_types_to=(MetadataType.DIST_INFO,)
71
+ )
64
72
  if not metadata_files:
65
73
  raise WheelMetadataLoadError(
66
74
  "Could not find any metadata in {wheel}.".format(wheel=location)
67
75
  )
68
76
  wheel = cls._from_metadata_files(metadata_files)
69
- cls._CACHE[location] = wheel
77
+ cls._CACHE[(location, project_name)] = wheel
70
78
  return wheel
71
79
 
72
80
  @classmethod
73
81
  def from_distribution(cls, distribution):
74
82
  # type: (Distribution) -> WHEEL
75
83
  location = distribution.metadata.files.metadata.path
76
- wheel = cls._CACHE.get(location)
84
+ project_name = distribution.metadata.project_name
85
+ wheel = cls._CACHE.get((location, project_name))
77
86
  if not wheel:
78
87
  wheel = cls._from_metadata_files(distribution.metadata.files)
79
- cls._CACHE[location] = wheel
88
+ cls._CACHE[(location, project_name)] = wheel
80
89
  return wheel
81
90
 
82
91
  files = attr.ib() # type: MetadataFiles
@@ -163,6 +172,7 @@ class Wheel(object):
163
172
  metadata_dir = str(wheel_metadata_dir)
164
173
 
165
174
  data_dir = re.sub(r"\.dist-info$", ".data", metadata_dir)
175
+ pex_metadata_dir = re.sub(r"\.dist-info$", ".pex-info", metadata_dir)
166
176
 
167
177
  return cls(
168
178
  location=location,
@@ -170,13 +180,18 @@ class Wheel(object):
170
180
  metadata_files=metadata_files,
171
181
  metadata=metadata,
172
182
  data_dir=data_dir,
183
+ pex_metadata_dir=pex_metadata_dir,
173
184
  )
174
185
 
175
186
  @classmethod
176
- def load(cls, wheel_path):
177
- # type: (str) -> Wheel
187
+ def load(
188
+ cls,
189
+ wheel_path, # type: str
190
+ project_name=None, # type: Optional[ProjectName]
191
+ ):
192
+ # type: (...) -> Wheel
178
193
 
179
- wheel = WHEEL.load(wheel_path)
194
+ wheel = WHEEL.load(wheel_path, project_name=project_name)
180
195
  return cls._from_metadata_files(
181
196
  location=wheel_path, metadata_files=wheel.files, wheel=wheel
182
197
  )
@@ -193,12 +208,23 @@ class Wheel(object):
193
208
  metadata_files = attr.ib() # type: MetadataFiles
194
209
  metadata = attr.ib() # type: WHEEL
195
210
  data_dir = attr.ib() # type: str
211
+ pex_metadata_dir = attr.ib() # type: str
196
212
 
197
213
  @property
198
214
  def source(self):
199
215
  # type: () -> str
200
216
  return self._source(self.location, self.metadata_files)
201
217
 
218
+ @property
219
+ def project_name(self):
220
+ # type: () -> ProjectName
221
+ return self.metadata_files.metadata.project_name
222
+
223
+ @property
224
+ def version(self):
225
+ # type: () -> Version
226
+ return self.metadata_files.metadata.version
227
+
202
228
  @property
203
229
  def wheel_file_name(self):
204
230
  # type: () -> str
@@ -215,11 +241,31 @@ class Wheel(object):
215
241
  )
216
242
 
217
243
  return "{project_name}-{version}-{tag}.whl".format(
218
- project_name=self.metadata_files.metadata.project_name.raw,
219
- version=self.metadata_files.metadata.version.raw,
220
- tag=tag,
244
+ project_name=self.project_name.raw, version=self.version.raw, tag=tag
221
245
  )
222
246
 
247
+ def iter_compatible_python_versions(self):
248
+ # type: () -> Iterator[Tuple[int, ...]]
249
+
250
+ for tag in self.metadata.tags:
251
+ match = re.search(r"\d+(?:_\d+)*", tag.interpreter)
252
+ if not match:
253
+ raise WheelMetadataLoadError(
254
+ "Invalid interpreter tag for wheel {whl} at {location}: {tag}".format(
255
+ whl=self.wheel_file_name, location=self.location, tag=tag.interpreter
256
+ )
257
+ )
258
+ components = match.group().split("_")
259
+ version = [] # type: List[int]
260
+ if len(components) == 1:
261
+ py_version_nodot = components[0]
262
+ version.append(int(py_version_nodot[0]))
263
+ if len(py_version_nodot) > 1:
264
+ version.append(int(py_version_nodot[1:]))
265
+ else:
266
+ version.extend(int(component) for component in components)
267
+ yield tuple(version)
268
+
223
269
  @property
224
270
  def root_is_purelib(self):
225
271
  # type: () -> bool
@@ -231,8 +277,26 @@ class Wheel(object):
231
277
 
232
278
  def metadata_path(self, *components):
233
279
  # type: (*str) -> str
280
+ if not components:
281
+ return self.metadata_dir
234
282
  return os.path.join(self.metadata_dir, *components)
235
283
 
236
284
  def data_path(self, *components):
237
285
  # type: (*str) -> str
238
286
  return os.path.join(self.data_dir, *components)
287
+
288
+ def pex_metadata_path(self, *components):
289
+ # type: (*str) -> str
290
+ if not components:
291
+ return self.pex_metadata_dir
292
+ return os.path.join(self.pex_metadata_dir, *components)
293
+
294
+ def read_pex_metadata(self, *components):
295
+ # type: (*str) -> Optional[bytes]
296
+
297
+ location = os.path.join(self.location, self.pex_metadata_path(*components))
298
+ if not os.path.exists(location):
299
+ return None
300
+
301
+ with open(location, "rb") as fp:
302
+ return fp.read()
pex/whl.py ADDED
@@ -0,0 +1,67 @@
1
+ # Copyright 2025 Pex project contributors.
2
+ # Licensed under the Apache License, Version 2.0 (see LICENSE).
3
+
4
+ from __future__ import absolute_import
5
+
6
+ import hashlib
7
+ import os
8
+
9
+ from pex.atomic_directory import atomic_directory
10
+ from pex.cache.dirs import CacheDir
11
+ from pex.dist_metadata import Distribution
12
+ from pex.fingerprinted_distribution import FingerprintedDistribution
13
+ from pex.installed_wheel import InstalledWheel
14
+ from pex.pep_427 import repack
15
+ from pex.typing import TYPE_CHECKING
16
+ from pex.util import CacheHelper
17
+
18
+ if TYPE_CHECKING:
19
+ from typing import Optional, Union
20
+
21
+
22
+ def repacked_whl(
23
+ installed_wheel, # type: Union[str, InstalledWheel]
24
+ fingerprint, # type: str
25
+ distribution_name=None, # type: Optional[str]
26
+ use_system_time=False, # type: bool
27
+ ):
28
+ # type: (...) -> FingerprintedDistribution
29
+
30
+ installed_wheel = (
31
+ installed_wheel
32
+ if isinstance(installed_wheel, InstalledWheel)
33
+ else InstalledWheel.load(installed_wheel)
34
+ )
35
+
36
+ repack_dir = CacheDir.REPACKED_WHEELS.path(fingerprint)
37
+ with atomic_directory(target_dir=repack_dir) as atomic_dir:
38
+ if not atomic_dir.is_finalized():
39
+ whl = repack(
40
+ installed_wheel=installed_wheel,
41
+ dest_dir=atomic_dir.work_dir,
42
+ # N.B.: Some compressed tag set wheels in the wild have a wheel filename with tags
43
+ # in a different order from their WHEEL metadata; e.g.:
44
+ # cffi-2.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
45
+ # vs its WHEEL metadata:
46
+ # Wheel-Version: 1.0
47
+ # Generator: setuptools (80.9.0)
48
+ # Root-Is-Purelib: false
49
+ # Tag: cp310-cp310-manylinux_2_17_x86_64
50
+ # Tag: cp310-cp310-manylinux2014_x86_64
51
+ #
52
+ # This override allows higher levels to adjust for this.
53
+ override_wheel_file_name=distribution_name,
54
+ use_system_time=use_system_time,
55
+ )
56
+ with open(os.path.join(atomic_dir.work_dir, "FINGERPRINT"), "w") as fp:
57
+ fp.write(CacheHelper.hash(whl, hasher=hashlib.sha256))
58
+
59
+ with open(os.path.join(repack_dir, "FINGERPRINT")) as fp:
60
+ fingerprint = fp.read()
61
+
62
+ return FingerprintedDistribution(
63
+ distribution=Distribution.load(
64
+ os.path.join(repack_dir, distribution_name or installed_wheel.wheel_file_name())
65
+ ),
66
+ fingerprint=fingerprint,
67
+ )
pex/windows/__init__.py CHANGED
@@ -142,21 +142,24 @@ def create_script(
142
142
  platform=SysPlatform.CURRENT, # type: SysPlatform.Value
143
143
  gui=False, # type: bool
144
144
  python_path=None, # type: Optional[Text]
145
+ overwrite=True, # type: bool
145
146
  ):
146
147
  # type: (...) -> _Text
147
148
 
148
- with safe_open("{path}.{unique}".format(path=path, unique=uuid.uuid4().hex), "wb") as fp:
149
- fp.write(_load_stub(platform=platform, gui=gui).read_data())
150
- with contextlib.closing(zipfile.ZipFile(fp, "a")) as zip_fp:
151
- zip_fp.writestr("__main__.py", contents.encode("utf-8"), zipfile.ZIP_STORED)
152
- python_path_bytes = platform.binary_name(
153
- python_path or ("pythonw" if gui else "python")
154
- ).encode("utf-8")
155
- fp.write(python_path_bytes)
156
- fp.write(struct.pack("<I", len(python_path_bytes)))
157
- fp.write(b"UVSC")
158
149
  script = platform.binary_name(path)
159
- safe_rename(fp.name, script)
150
+ if overwrite or not os.path.exists(script):
151
+ with safe_open("{path}.{unique}".format(path=path, unique=uuid.uuid4().hex), "wb") as fp:
152
+ fp.write(_load_stub(platform=platform, gui=gui).read_data())
153
+ with contextlib.closing(zipfile.ZipFile(fp, "a")) as zip_fp:
154
+ zip_fp.writestr("__main__.py", contents.encode("utf-8"), zipfile.ZIP_STORED)
155
+ python_path_bytes = platform.binary_name(
156
+ python_path or ("pythonw" if gui else "python")
157
+ ).encode("utf-8")
158
+ fp.write(python_path_bytes)
159
+ fp.write(struct.pack("<I", len(python_path_bytes)))
160
+ fp.write(b"UVSC")
161
+
162
+ safe_rename(fp.name, script)
160
163
  return script
161
164
 
162
165
 
@@ -1,15 +1,15 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pex
3
- Version: 2.59.5
3
+ Version: 2.60.0
4
4
  Summary: The PEX packaging toolchain.
5
5
  Home-page: https://github.com/pex-tool/pex
6
- Download-URL: https://github.com/pex-tool/pex/releases/download/v2.59.5/pex
6
+ Download-URL: https://github.com/pex-tool/pex/releases/download/v2.60.0/pex
7
7
  Author: The PEX developers
8
8
  Author-email: developers@pex-tool.org
9
9
  License-Expression: Apache-2.0
10
- Project-URL: Changelog, https://github.com/pex-tool/pex/blob/v2.59.5/CHANGES.md
10
+ Project-URL: Changelog, https://github.com/pex-tool/pex/blob/v2.60.0/CHANGES.md
11
11
  Project-URL: Documentation, https://docs.pex-tool.org/
12
- Project-URL: Source, https://github.com/pex-tool/pex/tree/v2.59.5
12
+ Project-URL: Source, https://github.com/pex-tool/pex/tree/v2.60.0
13
13
  Keywords: package,executable,virtualenv,lock,freeze
14
14
  Classifier: Development Status :: 5 - Production/Stable
15
15
  Classifier: Intended Audience :: Developers