From 9acccaef37561ac429f510914ea874549c459a42 Mon Sep 17 00:00:00 2001 From: lnd212 Date: Sun, 30 Oct 2022 12:51:19 +0400 Subject: [PATCH] Some python updates and fix in stable diffusion --- .../cleanpy-0.3.1.dist-info/RECORD | 2 +- .../INSTALLER | 0 .../LICENSE.txt | 0 .../METADATA | 4 +- .../RECORD | 193 +++++------ .../REQUESTED | 0 .../WHEEL | 0 .../entry_points.txt | 2 +- .../top_level.txt | 0 Python310/Lib/site-packages/pip/__init__.py | 2 +- .../Lib/site-packages/pip/__pip-runner__.py | 36 ++- .../site-packages/pip/_internal/build_env.py | 30 +- .../Lib/site-packages/pip/_internal/cache.py | 6 +- .../pip/_internal/cli/base_command.py | 7 - .../pip/_internal/cli/cmdoptions.py | 39 +-- .../pip/_internal/cli/main_parser.py | 49 ++- .../pip/_internal/cli/spinners.py | 4 +- .../pip/_internal/commands/configuration.py | 8 +- .../pip/_internal/commands/download.py | 7 + .../pip/_internal/commands/install.py | 55 +++- .../pip/_internal/commands/list.py | 5 + .../pip/_internal/commands/wheel.py | 31 +- .../site-packages/pip/_internal/exceptions.py | 16 +- .../pip/_internal/index/collector.py | 130 +------- .../pip/_internal/locations/_distutils.py | 6 +- .../pip/_internal/metadata/__init__.py | 22 ++ .../pip/_internal/metadata/base.py | 18 ++ .../_internal/metadata/importlib/_compat.py | 14 +- .../_internal/metadata/importlib/_dists.py | 18 ++ .../pip/_internal/metadata/importlib/_envs.py | 14 +- .../pip/_internal/metadata/pkg_resources.py | 23 +- .../pip/_internal/models/link.py | 247 ++++++++++++-- .../pip/_internal/models/search_scope.py | 6 +- .../pip/_internal/models/wheel.py | 4 +- .../pip/_internal/network/lazy_wheel.py | 2 +- .../pip/_internal/operations/install/wheel.py | 4 +- .../pip/_internal/operations/prepare.py | 73 ++++- .../pip/_internal/req/req_file.py | 20 +- .../pip/_internal/req/req_install.py | 91 +++++- .../pip/_internal/utils/deprecation.py | 68 ++++ .../pip/_internal/utils/entrypoints.py | 11 +- .../pip/_internal/utils/hashes.py | 4 +- .../pip/_internal/utils/setuptools_build.py | 2 +- .../site-packages/pip/_internal/vcs/bazaar.py | 15 +- .../pip/_internal/vcs/subversion.py | 2 +- .../pip/_internal/wheel_builder.py | 39 ++- .../pip/_vendor/certifi/__init__.py | 2 +- .../pip/_vendor/certifi/cacert.pem | 101 +++--- .../site-packages/pip/_vendor/certifi/core.py | 70 ++-- .../pip/_vendor/distlib/__init__.py | 4 +- .../site-packages/pip/_vendor/distlib/t32.exe | Bin 97792 -> 97792 bytes .../pip/_vendor/distlib/t64-arm.exe | Bin 182784 -> 182784 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 107520 -> 108032 bytes .../site-packages/pip/_vendor/distlib/w32.exe | Bin 91648 -> 91648 bytes .../pip/_vendor/distlib/w64-arm.exe | Bin 168448 -> 168448 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 101888 -> 101888 bytes .../site-packages/pip/_vendor/idna/core.py | 5 +- .../pip/_vendor/idna/idnadata.py | 34 +- .../pip/_vendor/idna/package_data.py | 2 +- .../pip/_vendor/idna/uts46data.py | 306 +++++++++++------- .../pip/_vendor/pep517/__init__.py | 2 +- .../pip/_vendor/pep517/_compat.py | 8 + .../site-packages/pip/_vendor/pep517/build.py | 13 +- .../site-packages/pip/_vendor/pep517/check.py | 16 +- .../pip/_vendor/pep517/colorlog.py | 2 - .../pip/_vendor/pep517/compat.py | 51 --- .../pip/_vendor/pep517/dirtools.py | 27 +- .../pip/_vendor/pep517/envbuild.py | 15 +- .../pip/_vendor/pep517/in_process/__init__.py | 17 +- .../_vendor/pep517/in_process/_in_process.py | 36 +-- .../site-packages/pip/_vendor/pep517/meta.py | 13 +- .../pip/_vendor/pep517/wrappers.py | 55 ++-- .../pip/_vendor/pygments/__init__.py | 19 +- .../pip/_vendor/pygments/cmdline.py | 9 +- .../pip/_vendor/pygments/filters/__init__.py | 7 +- .../_vendor/pygments/formatters/__init__.py | 16 +- .../_vendor/pygments/formatters/_mapping.py | 67 +--- .../pip/_vendor/pygments/formatters/img.py | 12 +- .../pip/_vendor/pygments/lexers/__init__.py | 20 +- .../pip/_vendor/pygments/lexers/_mapping.py | 67 +--- .../pip/_vendor/pygments/lexers/python.py | 27 +- .../pip/_vendor/pygments/plugin.py | 35 +- .../pip/_vendor/pygments/styles/__init__.py | 4 + .../pip/_vendor/pygments/token.py | 1 + .../pip/_vendor/requests/certs.py | 9 +- .../pip/_vendor/tenacity/__init__.py | 2 + .../pip/_vendor/tenacity/retry.py | 27 ++ .../pip/_vendor/tenacity/wait.py | 71 +++- .../pip/_vendor/typing_extensions.py | 156 ++++++++- .../pip/_vendor/urllib3/__init__.py | 17 + .../pip/_vendor/urllib3/_version.py | 2 +- .../pip/_vendor/urllib3/contrib/pyopenssl.py | 9 + .../pip/_vendor/urllib3/response.py | 54 +++- .../Lib/site-packages/pip/_vendor/vendor.txt | 16 +- Python310/Scripts/cleanpy.exe | Bin 107864 -> 108407 bytes Python310/Scripts/pip3.exe | Bin 107870 -> 108413 bytes scripts/minDalle.py | 2 - scripts/stable_diff.py | 2 +- 98 files changed, 1774 insertions(+), 985 deletions(-) rename Python310/Lib/site-packages/{pip-22.2.2.dist-info => pip-22.3.dist-info}/INSTALLER (100%) rename Python310/Lib/site-packages/{pip-22.2.2.dist-info => pip-22.3.dist-info}/LICENSE.txt (100%) rename Python310/Lib/site-packages/{pip-22.2.2.dist-info => pip-22.3.dist-info}/METADATA (96%) rename Python310/Lib/site-packages/{pip-22.2.2.dist-info => pip-22.3.dist-info}/RECORD (88%) rename Python310/Lib/site-packages/{pip-22.2.2.dist-info => pip-22.3.dist-info}/REQUESTED (100%) rename Python310/Lib/site-packages/{pip-22.2.2.dist-info => pip-22.3.dist-info}/WHEEL (100%) rename Python310/Lib/site-packages/{pip-22.2.2.dist-info => pip-22.3.dist-info}/entry_points.txt (69%) rename Python310/Lib/site-packages/{pip-22.2.2.dist-info => pip-22.3.dist-info}/top_level.txt (100%) create mode 100644 Python310/Lib/site-packages/pip/_vendor/pep517/_compat.py delete mode 100644 Python310/Lib/site-packages/pip/_vendor/pep517/compat.py diff --git a/Python310/Lib/site-packages/cleanpy-0.3.1.dist-info/RECORD b/Python310/Lib/site-packages/cleanpy-0.3.1.dist-info/RECORD index 80b38f5..2c49471 100644 --- a/Python310/Lib/site-packages/cleanpy-0.3.1.dist-info/RECORD +++ b/Python310/Lib/site-packages/cleanpy-0.3.1.dist-info/RECORD @@ -1,4 +1,4 @@ -../../Scripts/cleanpy.exe,sha256=g0IyfRqUyutdyM9JPtYd_3yyx5swLUvcltLP2hV3GC4,107864 +../../Scripts/cleanpy.exe,sha256=jQ_msz-8ZnrvlKk_U0e-rP7d_s3hhBn4W8Xgq-xI67c,108407 cleanpy-0.3.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 cleanpy-0.3.1.dist-info/LICENSE,sha256=9BoEVtXyu6Jf1NflC1GpXeMEdw_x21p5UV0DOXqRTY0,1074 cleanpy-0.3.1.dist-info/METADATA,sha256=OWfqUzcqWO3svR3PGkVkcVUH7fN9EJbyAoe3jq2lo0Y,6188 diff --git a/Python310/Lib/site-packages/pip-22.2.2.dist-info/INSTALLER b/Python310/Lib/site-packages/pip-22.3.dist-info/INSTALLER similarity index 100% rename from Python310/Lib/site-packages/pip-22.2.2.dist-info/INSTALLER rename to Python310/Lib/site-packages/pip-22.3.dist-info/INSTALLER diff --git a/Python310/Lib/site-packages/pip-22.2.2.dist-info/LICENSE.txt b/Python310/Lib/site-packages/pip-22.3.dist-info/LICENSE.txt similarity index 100% rename from Python310/Lib/site-packages/pip-22.2.2.dist-info/LICENSE.txt rename to Python310/Lib/site-packages/pip-22.3.dist-info/LICENSE.txt diff --git a/Python310/Lib/site-packages/pip-22.2.2.dist-info/METADATA b/Python310/Lib/site-packages/pip-22.3.dist-info/METADATA similarity index 96% rename from Python310/Lib/site-packages/pip-22.2.2.dist-info/METADATA rename to Python310/Lib/site-packages/pip-22.3.dist-info/METADATA index eec3585..a0504ed 100644 --- a/Python310/Lib/site-packages/pip-22.2.2.dist-info/METADATA +++ b/Python310/Lib/site-packages/pip-22.3.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: pip -Version: 22.2.2 +Version: 22.3 Summary: The PyPA recommended tool for installing Python packages. Home-page: https://pip.pypa.io/ Author: The pip developers @@ -61,7 +61,6 @@ If you want to get involved head over to GitHub to get the source code, look at * `GitHub page`_ * `Development documentation`_ -* `Development mailing list`_ * `Development IRC`_ Code of Conduct @@ -84,7 +83,6 @@ rooms, and mailing lists is expected to follow the `PSF Code of Conduct`_. .. _Python 2 support policy: https://pip.pypa.io/en/latest/development/release-process/#python-2-support .. _Issue tracking: https://github.com/pypa/pip/issues .. _Discourse channel: https://discuss.python.org/c/packaging -.. _Development mailing list: https://mail.python.org/mailman3/lists/distutils-sig.python.org/ .. _User IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa .. _Development IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa-dev .. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md diff --git a/Python310/Lib/site-packages/pip-22.2.2.dist-info/RECORD b/Python310/Lib/site-packages/pip-22.3.dist-info/RECORD similarity index 88% rename from Python310/Lib/site-packages/pip-22.2.2.dist-info/RECORD rename to Python310/Lib/site-packages/pip-22.3.dist-info/RECORD index 54cd2b2..d7ddba8 100644 --- a/Python310/Lib/site-packages/pip-22.2.2.dist-info/RECORD +++ b/Python310/Lib/site-packages/pip-22.3.dist-info/RECORD @@ -1,17 +1,18 @@ -../../Scripts/pip.exe,sha256=Ny0SgVCXVElXIFJUWxzlgUZknQTjUOd4ddmrij0HXnQ,107870 -../../Scripts/pip3.10.exe,sha256=Ny0SgVCXVElXIFJUWxzlgUZknQTjUOd4ddmrij0HXnQ,107870 -../../Scripts/pip3.exe,sha256=Ny0SgVCXVElXIFJUWxzlgUZknQTjUOd4ddmrij0HXnQ,107870 -pip-22.2.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -pip-22.2.2.dist-info/LICENSE.txt,sha256=Y0MApmnUmurmWxLGxIySTFGkzfPR_whtw0VtyLyqIQQ,1093 -pip-22.2.2.dist-info/METADATA,sha256=1THNkoBHocZtVQ8SixJH12wuSXHJIQb4Vu7RzzEjfKQ,4197 -pip-22.2.2.dist-info/RECORD,, -pip-22.2.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip-22.2.2.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92 -pip-22.2.2.dist-info/entry_points.txt,sha256=_ZUyZpzz1RdotcszCitH_lQ6yiWAKmaOcIkCEmkrePU,124 -pip-22.2.2.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -pip/__init__.py,sha256=RKJ102-F8id9kMdMic9j7MD2OvtK6CP0CK1Erl6PtyU,357 +../../Scripts/pip.exe,sha256=h1PDR-UkIA35HeaHPF8eeKD1DVA1k1IupBjP5vO2AkI,108413 +../../Scripts/pip3.10.exe,sha256=h1PDR-UkIA35HeaHPF8eeKD1DVA1k1IupBjP5vO2AkI,108413 +../../Scripts/pip3.10.exe,sha256=h1PDR-UkIA35HeaHPF8eeKD1DVA1k1IupBjP5vO2AkI,108413 +../../Scripts/pip3.exe,sha256=h1PDR-UkIA35HeaHPF8eeKD1DVA1k1IupBjP5vO2AkI,108413 +pip-22.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pip-22.3.dist-info/LICENSE.txt,sha256=Y0MApmnUmurmWxLGxIySTFGkzfPR_whtw0VtyLyqIQQ,1093 +pip-22.3.dist-info/METADATA,sha256=CPPiEmaf6uwWzUdhKzSs4P2nVlj8OQXqNosdEf2_b2U,4070 +pip-22.3.dist-info/RECORD,, +pip-22.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip-22.3.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92 +pip-22.3.dist-info/entry_points.txt,sha256=ynZN1_707_L23Oa8_O5LOxEoccj1nDa4xHT5galfN7o,125 +pip-22.3.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pip/__init__.py,sha256=bsx-xKM3ixByJQTrS7rzaHCYdTO-5kimvPR8sneY56w,355 pip/__main__.py,sha256=mXwWDftNLMKfwVqKFWGE_uuBZvGSIiUELhLkeysIuZc,1198 -pip/__pip-runner__.py,sha256=7S_j7iwRDWb9mahaaEiVL6fct6fWouB2V8W_S8FY0ME,1037 +pip/__pip-runner__.py,sha256=EnrfKmKMzWAdqg_JicLCOP9Y95Ux7zHh4ObvqLtQcjo,1444 pip/__pycache__/__init__.cpython-310.pyc,, pip/__pycache__/__main__.cpython-310.pyc,, pip/__pycache__/__pip-runner__.cpython-310.pyc,, @@ -25,8 +26,8 @@ pip/_internal/__pycache__/main.cpython-310.pyc,, pip/_internal/__pycache__/pyproject.cpython-310.pyc,, pip/_internal/__pycache__/self_outdated_check.cpython-310.pyc,, pip/_internal/__pycache__/wheel_builder.cpython-310.pyc,, -pip/_internal/build_env.py,sha256=Io06wf8aNlP1FkDYCbbuVFPGWAMJNys7l_p7r9CmEKE,9535 -pip/_internal/cache.py,sha256=-FXxS81WOM-amtx3w7N8s20PfFIlHPX8X27FfOBql-I,10623 +pip/_internal/build_env.py,sha256=gEAT8R6SuWbg2mcrsmOTKWMw_x5pedMzvSTxQS57JZs,10234 +pip/_internal/cache.py,sha256=C3n78VnBga9rjPXZqht_4A4d-T25poC7K0qBM7FHDhU,10734 pip/_internal/cli/__init__.py,sha256=FkHBgpxxb-_gd6r1FjnNhfMOzAUYyXoXKJ6abijfcFU,132 pip/_internal/cli/__pycache__/__init__.cpython-310.pyc,, pip/_internal/cli/__pycache__/autocompletion.cpython-310.pyc,, @@ -41,15 +42,15 @@ pip/_internal/cli/__pycache__/req_command.cpython-310.pyc,, pip/_internal/cli/__pycache__/spinners.cpython-310.pyc,, pip/_internal/cli/__pycache__/status_codes.cpython-310.pyc,, pip/_internal/cli/autocompletion.py,sha256=wY2JPZY2Eji1vhR7bVo-yCBPJ9LCy6P80iOAhZD1Vi8,6676 -pip/_internal/cli/base_command.py,sha256=EiHzq1RBubmgYkhsVgJLNc4Y18koPUS1TzMVJwpnYxc,8146 -pip/_internal/cli/cmdoptions.py,sha256=LKKpinHThNt7wtHqxwkWJpgCUcyQeTX0GUCqyXImAbc,29985 +pip/_internal/cli/base_command.py,sha256=t1D5x40Hfn9HnPnMt-iSxvqL14nht2olBCacW74pc-k,7842 +pip/_internal/cli/cmdoptions.py,sha256=Jlarlzz9qv9tC_tCaEbcc_jVvrPreFLBBUnDgoyWflw,29381 pip/_internal/cli/command_context.py,sha256=RHgIPwtObh5KhMrd3YZTkl8zbVG-6Okml7YbFX4Ehg0,774 pip/_internal/cli/main.py,sha256=ioJ8IVlb2K1qLOxR-tXkee9lURhYV89CDM71MKag7YY,2472 -pip/_internal/cli/main_parser.py,sha256=Q9TnytfuC5Z2JSjBFWVGtEdYLFy7rukNIb04movHdAo,2614 +pip/_internal/cli/main_parser.py,sha256=laDpsuBDl6kyfywp9eMMA9s84jfH2TJJn-vmL0GG90w,4338 pip/_internal/cli/parser.py,sha256=tWP-K1uSxnJyXu3WE0kkH3niAYRBeuUaxeydhzOdhL4,10817 pip/_internal/cli/progress_bars.py,sha256=So4mPoSjXkXiSHiTzzquH3VVyVD_njXlHJSExYPXAow,1968 pip/_internal/cli/req_command.py,sha256=ypTutLv4j_efxC2f6C6aCQufxre-zaJdi5m_tWlLeBk,18172 -pip/_internal/cli/spinners.py,sha256=rs_NveD0wCoJ9GiJJmOjGC1UPVK8isOQpQsFVE899zQ,5098 +pip/_internal/cli/spinners.py,sha256=hIJ83GerdFgFCdobIA23Jggetegl_uC4Sp586nzFbPE,5118 pip/_internal/cli/status_codes.py,sha256=sEFHUaUJbqv8iArL3HAtcztWZmGOFX01hTesSytDEh0,116 pip/_internal/commands/__init__.py,sha256=5oRO9O3dM2vGuh0bFw4HOVletryrz5HHMmmPWwJrH9U,3882 pip/_internal/commands/__pycache__/__init__.cpython-310.pyc,, @@ -73,20 +74,20 @@ pip/_internal/commands/__pycache__/wheel.cpython-310.pyc,, pip/_internal/commands/cache.py,sha256=muaT0mbL-ZUpn6AaushVAipzTiMwE4nV2BLbJBwt_KQ,7582 pip/_internal/commands/check.py,sha256=0gjXR7j36xJT5cs2heYU_dfOfpnFfzX8OoPNNoKhqdM,1685 pip/_internal/commands/completion.py,sha256=H0TJvGrdsoleuIyQKzJbicLFppYx2OZA0BLNpQDeFjI,4129 -pip/_internal/commands/configuration.py,sha256=ZJRO2YMzI5vPA2ADTWZrSsvGd4q880CylCUzEUJziZY,9500 +pip/_internal/commands/configuration.py,sha256=NB5uf8HIX8-li95YLoZO09nALIWlLCHDF5aifSKcBn8,9815 pip/_internal/commands/debug.py,sha256=kVjn-O1ixLk0webD0w9vfFFq_GCTUTd2hmLOnYtDCig,6573 -pip/_internal/commands/download.py,sha256=vLtEY3QqIAddjAOGvJJsbaHJg7Har5TPa4UuOOL6Gn8,5058 +pip/_internal/commands/download.py,sha256=LwKEyYMG2L67nQRyGo8hQdNEeMU2bmGWqJfcB8JDXas,5289 pip/_internal/commands/freeze.py,sha256=gCjoD6foBZPBAAYx5t8zZLkJhsF_ZRtnb3dPuD7beO8,2951 pip/_internal/commands/hash.py,sha256=EVVOuvGtoPEdFi8SNnmdqlCQrhCxV-kJsdwtdcCnXGQ,1703 pip/_internal/commands/help.py,sha256=gcc6QDkcgHMOuAn5UxaZwAStsRBrnGSn_yxjS57JIoM,1132 pip/_internal/commands/index.py,sha256=1VVXXj5MsI2qH-N7uniQQyVkg-KCn_RdjiyiUmkUS5U,4762 pip/_internal/commands/inspect.py,sha256=mRJ9aIkBQN0IJ7Um8pzaxAzVPIgL8KfWHx1fWKJgUAQ,3374 -pip/_internal/commands/install.py,sha256=nyZCUv7Oi8rScPe4WENgQ8Vd5n3OHzBuj2tw6khg4Ss,30315 -pip/_internal/commands/list.py,sha256=wF2g5i4j_JyoRckO9FAeB7KhcFAnLboy0dL-G9fn7Eo,12148 +pip/_internal/commands/install.py,sha256=_XbW0PyxtZCMMNqo8mDaOq3TBRiJNFM-94CR27mburc,31726 +pip/_internal/commands/list.py,sha256=Fk1TSxB33NlRS4qlLQ0xwnytnF9-zkQJbKQYv2xc4Q4,12343 pip/_internal/commands/search.py,sha256=sbBZiARRc050QquOKcCvOr2K3XLsoYebLKZGRi__iUI,5697 pip/_internal/commands/show.py,sha256=CJI8q4SSY0X346K1hi4Th8Nbyhl4nxPTBJUuzOlTaYE,6129 pip/_internal/commands/uninstall.py,sha256=0JQhifYxecNrJAwoILFwjm9V1V3liXzNT-y4bgRXXPw,3680 -pip/_internal/commands/wheel.py,sha256=dar33wNjUyTN6Cy8PVxV5TerJS1u7pZmKoqgoYiQh7g,6307 +pip/_internal/commands/wheel.py,sha256=mbFJd4dmUfrVFJkQbK8n2zHyRcD3AI91f7EUo9l3KYg,7396 pip/_internal/configuration.py,sha256=uBKTus43pDIO6IzT2mLWQeROmHhtnoabhniKNjPYvD0,13529 pip/_internal/distributions/__init__.py,sha256=Hq6kt6gXBgjNit5hTTWLAzeCNOKoB-N0pGYSqehrli8,858 pip/_internal/distributions/__pycache__/__init__.cpython-310.pyc,, @@ -98,13 +99,13 @@ pip/_internal/distributions/base.py,sha256=jrF1Vi7eGyqFqMHrieh1PIOrGU7KeCxhYPZnb pip/_internal/distributions/installed.py,sha256=NI2OgsgH9iBq9l5vB-56vOg5YsybOy-AU4VE5CSCO2I,729 pip/_internal/distributions/sdist.py,sha256=SQBdkatXSigKGG_SaD0U0p1Jwdfrg26UCNcHgkXZfdA,6494 pip/_internal/distributions/wheel.py,sha256=m-J4XO-gvFerlYsFzzSXYDvrx8tLZlJFTCgDxctn8ig,1164 -pip/_internal/exceptions.py,sha256=U-dV1ixkSz6NAU6Aw9dosKi2EzZ5D3BA7ilYZuTLKeU,20912 +pip/_internal/exceptions.py,sha256=BfvcyN2iEv3Sf00SVmSk59lEeZEBHELqkuoN2KeIWKc,20942 pip/_internal/index/__init__.py,sha256=vpt-JeTZefh8a-FC22ZeBSXFVbuBcXSGiILhQZJaNpQ,30 pip/_internal/index/__pycache__/__init__.cpython-310.pyc,, pip/_internal/index/__pycache__/collector.cpython-310.pyc,, pip/_internal/index/__pycache__/package_finder.cpython-310.pyc,, pip/_internal/index/__pycache__/sources.cpython-310.pyc,, -pip/_internal/index/collector.py,sha256=wLRu5q9a7oVAMATsg1O4P9UT1jfjC6KaxwYf3GWI7Wk,20316 +pip/_internal/index/collector.py,sha256=Pb9FW9STH2lwaApCIdMCivsbPP5pSYQp5bh3nLQBkDU,16503 pip/_internal/index/package_finder.py,sha256=kmcMu5_i-BP6v3NQGY0_am1ezxM2Gk4t00arZMmm4sc,37596 pip/_internal/index/sources.py,sha256=SVyPitv08-Qalh2_Bk5diAJ9GAA_d-a93koouQodAG0,6557 pip/_internal/locations/__init__.py,sha256=QhB-Y6TNyaU010cimm2T4wM5loe8oRdjLwJ6xmsGc-k,17552 @@ -112,26 +113,26 @@ pip/_internal/locations/__pycache__/__init__.cpython-310.pyc,, pip/_internal/locations/__pycache__/_distutils.cpython-310.pyc,, pip/_internal/locations/__pycache__/_sysconfig.cpython-310.pyc,, pip/_internal/locations/__pycache__/base.cpython-310.pyc,, -pip/_internal/locations/_distutils.py,sha256=AUJcoQ88zfYs9V57GsBlbhqCpyxxsAlLV1t6oqv55Xc,6272 +pip/_internal/locations/_distutils.py,sha256=wgHDvHGNZHtlcHkQjYovHzkEUBzisR0iOh7OqCIkB5g,6302 pip/_internal/locations/_sysconfig.py,sha256=nM-DiVHXWTxippdmN0MGVl5r7OIfIMy3vgDMlo8c_oo,7867 pip/_internal/locations/base.py,sha256=ufyDqPwZ4jLbScD44u8AwTVI-3ft8O78UGrroQI5f68,2573 pip/_internal/main.py,sha256=r-UnUe8HLo5XFJz8inTcOOTiu_sxNhgHb6VwlGUllOI,340 -pip/_internal/metadata/__init__.py,sha256=IeqRXbTeSreqClORmjA_4CMjkWA-trWdss7Oyimwosw,3535 +pip/_internal/metadata/__init__.py,sha256=84j1dPJaIoz5Q2ZTPi0uB1iaDAHiUNfKtYSGQCfFKpo,4280 pip/_internal/metadata/__pycache__/__init__.cpython-310.pyc,, pip/_internal/metadata/__pycache__/_json.cpython-310.pyc,, pip/_internal/metadata/__pycache__/base.cpython-310.pyc,, pip/_internal/metadata/__pycache__/pkg_resources.cpython-310.pyc,, pip/_internal/metadata/_json.py,sha256=BTkWfFDrWFwuSodImjtbAh8wCL3isecbnjTb5E6UUDI,2595 -pip/_internal/metadata/base.py,sha256=gOjhT0Mk4f6hCa8hzZIQKynIwpHzydnm6krwGTHTVhI,24596 +pip/_internal/metadata/base.py,sha256=vIwIo1BtoqegehWMAXhNrpLGYBq245rcaCNkBMPnTU8,25277 pip/_internal/metadata/importlib/__init__.py,sha256=9ZVO8BoE7NEZPmoHp5Ap_NJo0HgNIezXXg-TFTtt3Z4,107 pip/_internal/metadata/importlib/__pycache__/__init__.cpython-310.pyc,, pip/_internal/metadata/importlib/__pycache__/_compat.cpython-310.pyc,, pip/_internal/metadata/importlib/__pycache__/_dists.cpython-310.pyc,, pip/_internal/metadata/importlib/__pycache__/_envs.cpython-310.pyc,, -pip/_internal/metadata/importlib/_compat.py,sha256=B_qZlMBcbf2VrjHw4Pz9gfk-c-W1Mzp2u_GAzoWWuLE,1493 -pip/_internal/metadata/importlib/_dists.py,sha256=iEu6KvMdFIfq3ujQvsS0fvI9jDbp1qFC9SmOySfn_fY,7456 -pip/_internal/metadata/importlib/_envs.py,sha256=-4O0PiYmxydf0e6upJ7X-_BR4DB46I_szlgx53hnJLs,7195 -pip/_internal/metadata/pkg_resources.py,sha256=RfU--nYrkHAYJXfpoviyBHJA5b9Mw3Dc5HpeYwki1gE,9289 +pip/_internal/metadata/importlib/_compat.py,sha256=GAe_prIfCE4iUylrnr_2dJRlkkBVRUbOidEoID7LPoE,1882 +pip/_internal/metadata/importlib/_dists.py,sha256=BUV8y6D0PePZrEN3vfJL-m1FDqZ6YPRgAiBeBinHhNg,8181 +pip/_internal/metadata/importlib/_envs.py,sha256=7BxanCh3T7arusys__O2ZHJdnmDhQXFmfU7x1-jB5xI,7457 +pip/_internal/metadata/pkg_resources.py,sha256=WjwiNdRsvxqxL4MA5Tb5a_q3Q3sUhdpbZF8wGLtPMI0,9773 pip/_internal/models/__init__.py,sha256=3DHUd_qxpPozfzouoqa9g9ts1Czr5qaHfFxbnxriepM,63 pip/_internal/models/__pycache__/__init__.cpython-310.pyc,, pip/_internal/models/__pycache__/candidate.cpython-310.pyc,, @@ -150,12 +151,12 @@ pip/_internal/models/direct_url.py,sha256=HLO0sL2aYB6n45bwmd72TDN05sLHJlOQI8M01l pip/_internal/models/format_control.py,sha256=DJpMYjxeYKKQdwNcML2_F0vtAh-qnKTYe-CpTxQe-4g,2520 pip/_internal/models/index.py,sha256=tYnL8oxGi4aSNWur0mG8DAP7rC6yuha_MwJO8xw0crI,1030 pip/_internal/models/installation_report.py,sha256=ad1arqtxrSFBvWnm6mRqmG12HLV3pZZcZcHrlTFIiqU,2617 -pip/_internal/models/link.py,sha256=_5okBLOR7vshRltnD11SC3cyD0aSxOa0lMpKWIwQ5UY,10490 +pip/_internal/models/link.py,sha256=9HWL14UQTMxRCnY6dmAz09rGElJrMAcHn2OJZCBx0tk,18083 pip/_internal/models/scheme.py,sha256=3EFQp_ICu_shH1-TBqhl0QAusKCPDFOlgHFeN4XowWs,738 -pip/_internal/models/search_scope.py,sha256=LwloG0PJAmtI1hFXIypsD95kWE9xfR5hf_a2v1Vw7sk,4520 +pip/_internal/models/search_scope.py,sha256=iGPQQ6a4Lau8oGQ_FWj8aRLik8A21o03SMO5KnSt-Cg,4644 pip/_internal/models/selection_prefs.py,sha256=KZdi66gsR-_RUXUr9uejssk3rmTHrQVJWeNA2sV-VSY,1907 pip/_internal/models/target_python.py,sha256=qKpZox7J8NAaPmDs5C_aniwfPDxzvpkrCKqfwndG87k,3858 -pip/_internal/models/wheel.py,sha256=X_fakLR3OGF7HhrhwVXCUN-1wBwVCT2Lz0o3NguT_GQ,3575 +pip/_internal/models/wheel.py,sha256=YqazoIZyma_Q1ejFa1C7NHKQRRWlvWkdK96VRKmDBeI,3600 pip/_internal/network/__init__.py,sha256=jf6Tt5nV_7zkARBrKojIXItgejvoegVJVKUbhAa5Ioc,50 pip/_internal/network/__pycache__/__init__.cpython-310.pyc,, pip/_internal/network/__pycache__/auth.cpython-310.pyc,, @@ -168,7 +169,7 @@ pip/_internal/network/__pycache__/xmlrpc.cpython-310.pyc,, pip/_internal/network/auth.py,sha256=a3C7Xaa8kTJjXkdi_wrUjqaySc8Z9Yz7U6QIbXfzMyc,12190 pip/_internal/network/cache.py,sha256=hgXftU-eau4MWxHSLquTMzepYq5BPC2zhCkhN3glBy8,2145 pip/_internal/network/download.py,sha256=HvDDq9bVqaN3jcS3DyVJHP7uTqFzbShdkf7NFSoHfkw,6096 -pip/_internal/network/lazy_wheel.py,sha256=7YsbcpwOLyXbwCbR484ikhG9-C1FbUVABekVSBS0zHc,7637 +pip/_internal/network/lazy_wheel.py,sha256=PbPyuleNhtEq6b2S7rufoGXZWMD15FAGL4XeiAQ8FxA,7638 pip/_internal/network/session.py,sha256=BpDOJ7_Xw5VkgPYWsePzcaqOfcyRZcB2AW7W0HGBST0,18443 pip/_internal/network/utils.py,sha256=6A5SrUJEEUHxbGtbscwU2NpCyz-3ztiDlGWHpRRhsJ8,4073 pip/_internal/network/xmlrpc.py,sha256=AzQgG4GgS152_cqmGr_Oz2MIXsCal-xfsis7fA7nmU0,1791 @@ -202,8 +203,8 @@ pip/_internal/operations/install/__pycache__/legacy.cpython-310.pyc,, pip/_internal/operations/install/__pycache__/wheel.cpython-310.pyc,, pip/_internal/operations/install/editable_legacy.py,sha256=ee4kfJHNuzTdKItbfAsNOSEwq_vD7DRPGkBdK48yBhU,1354 pip/_internal/operations/install/legacy.py,sha256=cHdcHebyzf8w7OaOLwcsTNSMSSV8WBoAPFLay_9CjE8,4105 -pip/_internal/operations/install/wheel.py,sha256=ZbmrarCh74tariXY8rgI56jbZ1BJ2Z6u5fZt4nt3Gmw,27379 -pip/_internal/operations/prepare.py,sha256=kvL-s1ZUs53g1JIzmJ62j8FwCO_fKWXN45pAtVuz0xE,22962 +pip/_internal/operations/install/wheel.py,sha256=ZbRGMj1VVS39coYNj4kvsTQCiABeGBJEi7gSsaL2xXU,27403 +pip/_internal/operations/prepare.py,sha256=BeYXrLFpRoV5XBnRXQHxRA2plyC36kK9Pms5D9wjCo4,25091 pip/_internal/pyproject.py,sha256=ob0Gb0l12YLZNxjdpZGRfWHgjqhZTnSVv96RuJyNOfs,7074 pip/_internal/req/__init__.py,sha256=rUQ9d_Sh3E5kNYqX9pkN0D06YL-LrtcbJQ-LiIonq08,2807 pip/_internal/req/__pycache__/__init__.cpython-310.pyc,, @@ -213,8 +214,8 @@ pip/_internal/req/__pycache__/req_install.cpython-310.pyc,, pip/_internal/req/__pycache__/req_set.cpython-310.pyc,, pip/_internal/req/__pycache__/req_uninstall.cpython-310.pyc,, pip/_internal/req/constructors.py,sha256=ypjtq1mOQ3d2mFkFPMf_6Mr8SLKeHQk3tUKHA1ddG0U,16611 -pip/_internal/req/req_file.py,sha256=Qgqx7qLfDO3ai72oO2U1u928_6Idajun5VFRWPZg3XM,17502 -pip/_internal/req/req_install.py,sha256=bOtpOZnDgmEst_QuWZRXViaPW1JJ1iAvO6vVFgFf0PI,33506 +pip/_internal/req/req_file.py,sha256=N6lPO3c0to_G73YyGAnk7VUYmed5jV4Qxgmt1xtlXVg,17646 +pip/_internal/req/req_install.py,sha256=4tzyVGPHJ1-GXowm6PBT52BGIlbc4w7fhVqf-55bmRg,35600 pip/_internal/req/req_set.py,sha256=j3esG0s6SzoVReX9rWn4rpYNtyET_fwxbwJPRimvRxo,2858 pip/_internal/req/req_uninstall.py,sha256=ZFQfgSNz6H1BMsgl87nQNr2iaQCcbFcmXpW8rKVQcic,24045 pip/_internal/resolution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 @@ -278,22 +279,22 @@ pip/_internal/utils/appdirs.py,sha256=swgcTKOm3daLeXTW6v5BUS2Ti2RvEnGRQYH_yDXklA pip/_internal/utils/compat.py,sha256=ACyBfLgj3_XG-iA5omEDrXqDM0cQKzi8h8HRBInzG6Q,1884 pip/_internal/utils/compatibility_tags.py,sha256=ydin8QG8BHqYRsPY4OL6cmb44CbqXl1T0xxS97VhHkk,5377 pip/_internal/utils/datetime.py,sha256=m21Y3wAtQc-ji6Veb6k_M5g6A0ZyFI4egchTdnwh-pQ,242 -pip/_internal/utils/deprecation.py,sha256=NKo8VqLioJ4nnXXGmW4KdasxF90EFHkZaHeX1fT08C8,3627 +pip/_internal/utils/deprecation.py,sha256=OLc7GzDwPob9y8jscDYCKUNBV-9CWwqFplBOJPLOpBM,5764 pip/_internal/utils/direct_url_helpers.py,sha256=6F1tc2rcKaCZmgfVwsE6ObIe_Pux23mUVYA-2D9wCFc,3206 pip/_internal/utils/distutils_args.py,sha256=bYUt4wfFJRaeGO4VHia6FNaA8HlYXMcKuEq1zYijY5g,1115 pip/_internal/utils/egg_link.py,sha256=5MVlpz5LirT4iLQq86OYzjXaYF0D4Qk1dprEI7ThST4,2203 pip/_internal/utils/encoding.py,sha256=qqsXDtiwMIjXMEiIVSaOjwH5YmirCaK-dIzb6-XJsL0,1169 -pip/_internal/utils/entrypoints.py,sha256=GgeG2FUbbYhQ0sYgG2AtM-a4d1P8MJYdmEl5IhQ-WeM,2900 +pip/_internal/utils/entrypoints.py,sha256=YlhLTRl2oHBAuqhc-zmL7USS67TPWVHImjeAQHreZTQ,3064 pip/_internal/utils/filesystem.py,sha256=RhMIXUaNVMGjc3rhsDahWQ4MavvEQDdqXqgq-F6fpw8,5122 pip/_internal/utils/filetypes.py,sha256=i8XAQ0eFCog26Fw9yV0Yb1ygAqKYB1w9Cz9n0fj8gZU,716 pip/_internal/utils/glibc.py,sha256=tDfwVYnJCOC0BNVpItpy8CGLP9BjkxFHdl0mTS0J7fc,3110 -pip/_internal/utils/hashes.py,sha256=EPVx_I0UI8Gvu_skgLwpJA90pHZ5Ev1qNaZagYOub7I,4811 +pip/_internal/utils/hashes.py,sha256=1WhkVNIHNfuYLafBHThIjVKGplxFJXSlQtuG2mXNlJI,4831 pip/_internal/utils/inject_securetransport.py,sha256=o-QRVMGiENrTJxw3fAhA7uxpdEdw6M41TjHYtSVRrcg,795 pip/_internal/utils/logging.py,sha256=U2q0i1n8hPS2gQh8qcocAg5dovGAa_bR24akmXMzrk4,11632 pip/_internal/utils/misc.py,sha256=49Rs2NgrD4JGTKFt0farCm7FIAi-rjyoxgioArhCW_0,21617 pip/_internal/utils/models.py,sha256=5GoYU586SrxURMvDn_jBMJInitviJg4O5-iOU-6I0WY,1193 pip/_internal/utils/packaging.py,sha256=5Wm6_x7lKrlqVjPI5MBN_RurcRHwVYoQ7Ksrs84de7s,2108 -pip/_internal/utils/setuptools_build.py,sha256=vNH9hQB9wT6d-h1hVQhBKw91jNeT42meHpVeii-urOI,5652 +pip/_internal/utils/setuptools_build.py,sha256=4i3CuS34yNrkePnZ73rR47pyDzpZBo-SX9V5PNDSSHY,5662 pip/_internal/utils/subprocess.py,sha256=MYySbvY7qBevRxq_RFfOsDqG4vMqrB4vDoL_eyPE6Bo,9197 pip/_internal/utils/temp_dir.py,sha256=aCX489gRa4Nu0dMKRFyGhV6maJr60uEynu5uCbKR4Qg,7702 pip/_internal/utils/unpacking.py,sha256=SBb2iV1crb89MDRTEKY86R4A_UOWApTQn9VQVcMDOlE,8821 @@ -307,12 +308,12 @@ pip/_internal/vcs/__pycache__/git.cpython-310.pyc,, pip/_internal/vcs/__pycache__/mercurial.cpython-310.pyc,, pip/_internal/vcs/__pycache__/subversion.cpython-310.pyc,, pip/_internal/vcs/__pycache__/versioncontrol.cpython-310.pyc,, -pip/_internal/vcs/bazaar.py,sha256=IGb5ca1xSZfgegRD2_JeyoZPrQQHs7lEYEIgpVsKpoU,3047 +pip/_internal/vcs/bazaar.py,sha256=zq-Eu2NtJffc6kOsyv2kmRTnKg9qeIXE-KH5JeKck70,3518 pip/_internal/vcs/git.py,sha256=mjhwudCx9WlLNkxZ6_kOKmueF0rLoU2i1xeASKF6yiQ,18116 pip/_internal/vcs/mercurial.py,sha256=Bzbd518Jsx-EJI0IhIobiQqiRsUv5TWYnrmRIFWE0Gw,5238 -pip/_internal/vcs/subversion.py,sha256=TEMRdwECvMcXakZX0pTNUep79kmBYkWDkWFkrYmcmac,11718 +pip/_internal/vcs/subversion.py,sha256=AeUVE9d9qp-0QSOMiUvuFHy1TK950E3QglN7ipP13sI,11728 pip/_internal/vcs/versioncontrol.py,sha256=KUOc-hN51em9jrqxKwUR3JnkgSE-xSOqMiiJcSaL6B8,22811 -pip/_internal/wheel_builder.py,sha256=S-_i83q75xGqKjBenUl4uaTkLyXcZf7jFgChcCNi0xc,12712 +pip/_internal/wheel_builder.py,sha256=8cObBCu4mIsMJqZM7xXI9DO3vldiAnRNa1Gt6izPPTs,13079 pip/_vendor/__init__.py,sha256=fNxOSVD0auElsD8fN9tuq5psfgMQ-RFBtD4X5gjlRkg,4966 pip/_vendor/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/__pycache__/six.cpython-310.pyc,, @@ -343,13 +344,13 @@ pip/_vendor/cachecontrol/filewrapper.py,sha256=X4BAQOO26GNOR7nH_fhTzAfeuct2rBQcx pip/_vendor/cachecontrol/heuristics.py,sha256=8kAyuZLSCyEIgQr6vbUwfhpqg9ows4mM0IV6DWazevI,4154 pip/_vendor/cachecontrol/serialize.py,sha256=_U1NU_C-SDgFzkbAxAsPDgMTHeTWZZaHCQnZN_jh0U8,7105 pip/_vendor/cachecontrol/wrapper.py,sha256=X3-KMZ20Ho3VtqyVaXclpeQpFzokR5NE8tZSfvKVaB8,774 -pip/_vendor/certifi/__init__.py,sha256=SuZ3iYmzdRyUv-PiaZkquUgXtWZ16ICUKgymlEBspx0,94 +pip/_vendor/certifi/__init__.py,sha256=luDjIGxDSrQ9O0zthdz5Lnt069Z_7eR1GIEefEaf-Ys,94 pip/_vendor/certifi/__main__.py,sha256=1k3Cr95vCxxGRGDljrW3wMdpZdL3Nhf0u1n-k2qdsCY,255 pip/_vendor/certifi/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/certifi/__pycache__/__main__.cpython-310.pyc,, pip/_vendor/certifi/__pycache__/core.cpython-310.pyc,, -pip/_vendor/certifi/cacert.pem,sha256=pZ_eiDoO-ddKudrQCWieABc9KFlbV0FsmLLugygMbkw,285222 -pip/_vendor/certifi/core.py,sha256=g6EYcIFUAhYv5CB9B94iKRgMfGj8f82MF0CRdTDovxM,3052 +pip/_vendor/certifi/cacert.pem,sha256=3l8CcWt_qL42030rGieD3SLufICFX0bYtGhDl_EXVPI,286370 +pip/_vendor/certifi/core.py,sha256=ZwiOsv-sD_ouU1ft8wy_xZ3LQ7UbcVzyqj2XNyrsZis,4279 pip/_vendor/chardet/__init__.py,sha256=9-r0i294avRciob2HKVcKf6GJmXPHpgMqIijVrqHBDU,3705 pip/_vendor/chardet/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/chardet/__pycache__/big5freq.cpython-310.pyc,, @@ -452,7 +453,7 @@ pip/_vendor/colorama/ansitowin32.py,sha256=gGrO7MVtwc-j1Sq3jKfZpERT1JWmYSOsTVDiT pip/_vendor/colorama/initialise.py,sha256=PprovDNxMTrvoNHFcL2NZjpH2XzDc8BLxLxiErfUl4k,1915 pip/_vendor/colorama/win32.py,sha256=bJ8Il9jwaBN5BJ8bmN6FoYZ1QYuMKv2j8fGrXh7TJjw,5404 pip/_vendor/colorama/winterm.py,sha256=2y_2b7Zsv34feAsP67mLOVc-Bgq51mdYGo571VprlrM,6438 -pip/_vendor/distlib/__init__.py,sha256=kshNHF2XFPxmBv57X7Jsj7c6VzF5r9naVwGePP-s5Wc,581 +pip/_vendor/distlib/__init__.py,sha256=acgfseOC55dNrVAzaBKpUiH3Z6V7Q1CaxsiQ3K7pC-E,581 pip/_vendor/distlib/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/distlib/__pycache__/compat.cpython-310.pyc,, pip/_vendor/distlib/__pycache__/database.cpython-310.pyc,, @@ -475,14 +476,14 @@ pip/_vendor/distlib/markers.py,sha256=TpHHHLgkzyT7YHbwj-2i6weRaq-Ivy2-MUnrDkjau- pip/_vendor/distlib/metadata.py,sha256=g_DIiu8nBXRzA-mWPRpatHGbmFZqaFoss7z9TG7QSUU,39801 pip/_vendor/distlib/resources.py,sha256=LwbPksc0A1JMbi6XnuPdMBUn83X7BPuFNWqPGEKI698,10820 pip/_vendor/distlib/scripts.py,sha256=BmkTKmiTk4m2cj-iueliatwz3ut_9SsABBW51vnQnZU,18102 -pip/_vendor/distlib/t32.exe,sha256=lD3IWCwZiYZ9onypJifi2R1sGS-S24t3mYupsEAOKyA,97792 -pip/_vendor/distlib/t64-arm.exe,sha256=3hjLTLg7XBVHwDxgzZpkiHXXp4IJQMLvg_ZlGGpKZDI,182784 -pip/_vendor/distlib/t64.exe,sha256=vvS31h4-SnumthypJJKAWBeBh7cxSJ8AwGmbqumM05k,107520 +pip/_vendor/distlib/t32.exe,sha256=a0GV5kCoWsMutvliiCKmIgV98eRZ33wXoS-XrqvJQVs,97792 +pip/_vendor/distlib/t64-arm.exe,sha256=68TAa32V504xVBnufojh0PcenpR3U4wAqTqf-MZqbPw,182784 +pip/_vendor/distlib/t64.exe,sha256=gaYY8hy4fbkHYTTnA4i26ct8IQZzkBG2pRdy0iyuBrc,108032 pip/_vendor/distlib/util.py,sha256=31dPXn3Rfat0xZLeVoFpuniyhe6vsbl9_QN-qd9Lhlk,66262 pip/_vendor/distlib/version.py,sha256=WG__LyAa2GwmA6qSoEJtvJE8REA1LZpbSizy8WvhJLk,23513 -pip/_vendor/distlib/w32.exe,sha256=-a9nfgVZClK_mGnbQtXVLbn7xtPYw3xDKTddKnu2AJ8,91648 -pip/_vendor/distlib/w64-arm.exe,sha256=LW-JyIIGblDOp8Psy8igJXDvcg_YpJIINvN0tRjfv18,168448 -pip/_vendor/distlib/w64.exe,sha256=XvKqAoQzca86ERd2-KV5Vo1RSOBM28I2a35sPQONrYI,101888 +pip/_vendor/distlib/w32.exe,sha256=R4csx3-OGM9kL4aPIzQKRo5TfmRSHZo6QWyLhDhNBks,91648 +pip/_vendor/distlib/w64-arm.exe,sha256=xdyYhKj0WDcVUOCb05blQYvzdYIKMbmJn2SZvzkcey4,168448 +pip/_vendor/distlib/w64.exe,sha256=ejGf-rojoBfXseGLpya6bFTFPWRG21X5KvU8J5iU-K0,101888 pip/_vendor/distlib/wheel.py,sha256=Rgqs658VsJ3R2845qwnZD8XQryV2CzWw2mghwLvxxsI,43898 pip/_vendor/distro/__init__.py,sha256=2fHjF-SfgPvjyNZ1iHh_wjqWdR_Yo5ODHwZC0jLBPhc,981 pip/_vendor/distro/__main__.py,sha256=bu9d3TifoKciZFcqRBuygV3GSuThnVD_m2IK4cz96Vs,64 @@ -501,11 +502,11 @@ pip/_vendor/idna/__pycache__/package_data.cpython-310.pyc,, pip/_vendor/idna/__pycache__/uts46data.cpython-310.pyc,, pip/_vendor/idna/codec.py,sha256=6ly5odKfqrytKT9_7UrlGklHnf1DSK2r9C6cSM4sa28,3374 pip/_vendor/idna/compat.py,sha256=0_sOEUMT4CVw9doD3vyRhX80X19PwqFoUBs7gWsFME4,321 -pip/_vendor/idna/core.py,sha256=RFIkY-HhFZaDoBEFjGwyGd_vWI04uOAQjnzueMWqwOU,12795 -pip/_vendor/idna/idnadata.py,sha256=fzMzkCea2xieVxcrjngJ-2pLsKQNejPCZFlBajIuQdw,44025 +pip/_vendor/idna/core.py,sha256=1JxchwKzkxBSn7R_oCE12oBu3eVux0VzdxolmIad24M,12950 +pip/_vendor/idna/idnadata.py,sha256=xUjqKqiJV8Ho_XzBpAtv5JFoVPSupK-SUXvtjygUHqw,44375 pip/_vendor/idna/intranges.py,sha256=YBr4fRYuWH7kTKS2tXlFjM24ZF1Pdvcir-aywniInqg,1881 -pip/_vendor/idna/package_data.py,sha256=szxQhV0ZD0nKJ84Kuobw3l8q4_KeCyXjFRdpwIpKZmw,21 -pip/_vendor/idna/uts46data.py,sha256=o-D7V-a0fOLZNd7tvxof6MYfUd0TBZzE2bLR5XO67xU,204400 +pip/_vendor/idna/package_data.py,sha256=C_jHJzmX8PI4xq0jpzmcTMxpb5lDsq4o5VyxQzlVrZE,21 +pip/_vendor/idna/uts46data.py,sha256=zvjZU24s58_uAS850Mcd0NnD0X7_gCMAMjzWNIeUJdc,206539 pip/_vendor/msgpack/__init__.py,sha256=NryGaKLDk_Egd58ZxXpnuI7OWO27AXz7S6CBFRM3sAY,1132 pip/_vendor/msgpack/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/msgpack/__pycache__/exceptions.cpython-310.pyc,, @@ -536,28 +537,28 @@ pip/_vendor/packaging/specifiers.py,sha256=LRQ0kFsHrl5qfcFNEEJrIFYsnIHQUJXY9fIsa pip/_vendor/packaging/tags.py,sha256=lmsnGNiJ8C4D_Pf9PbM0qgbZvD9kmB9lpZBQUZa3R_Y,15699 pip/_vendor/packaging/utils.py,sha256=dJjeat3BS-TYn1RrUFVwufUMasbtzLfYRoy_HXENeFQ,4200 pip/_vendor/packaging/version.py,sha256=_fLRNrFrxYcHVfyo8vk9j8s6JM8N_xsSxVFr6RJyco8,14665 -pip/_vendor/pep517/__init__.py,sha256=Y1bATL2qbFNN6M_DQa4yyrwqjpIiL-j9T6kBmR0DS14,130 +pip/_vendor/pep517/__init__.py,sha256=QJpRfzTpk6YSPgjcxp9-MCAiS5dEdzf9Bh0UXophG6c,130 pip/_vendor/pep517/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/pep517/__pycache__/_compat.cpython-310.pyc,, pip/_vendor/pep517/__pycache__/build.cpython-310.pyc,, pip/_vendor/pep517/__pycache__/check.cpython-310.pyc,, pip/_vendor/pep517/__pycache__/colorlog.cpython-310.pyc,, -pip/_vendor/pep517/__pycache__/compat.cpython-310.pyc,, pip/_vendor/pep517/__pycache__/dirtools.cpython-310.pyc,, pip/_vendor/pep517/__pycache__/envbuild.cpython-310.pyc,, pip/_vendor/pep517/__pycache__/meta.cpython-310.pyc,, pip/_vendor/pep517/__pycache__/wrappers.cpython-310.pyc,, -pip/_vendor/pep517/build.py,sha256=2bar6EdjwIz2Dlfy94qdxn3oA9mVnnny40mfoT5f-qI,3457 -pip/_vendor/pep517/check.py,sha256=bCORq1WrHjhpTONa-zpAqG0EB9rHNuhO1ORu6DsDuL8,6084 -pip/_vendor/pep517/colorlog.py,sha256=Tk9AuYm_cLF3BKTBoSTJt9bRryn0aFojIQOwbfVUTxQ,4098 -pip/_vendor/pep517/compat.py,sha256=NmLImE5oiDT3gbEhJ4w7xeoMFcpAPrGu_NltBytSJUY,1253 -pip/_vendor/pep517/dirtools.py,sha256=2mkAkAL0mRz_elYFjRKuekTJVipH1zTn4tbf1EDev84,1129 -pip/_vendor/pep517/envbuild.py,sha256=zFde--rmzjXMLXcm7SA_3hDtgk5VCTA8hjpk88RbF6E,6100 -pip/_vendor/pep517/in_process/__init__.py,sha256=MyWoAi8JHdcBv7yXuWpUSVADbx6LSB9rZh7kTIgdA8Y,563 +pip/_vendor/pep517/_compat.py,sha256=by6evrYnqkisiM-MQcvOKs5bgDMzlOSgZqRHNqf04zE,138 +pip/_vendor/pep517/build.py,sha256=VLtq0hOvNWCfX0FkdvTKEr-TmyrbaX0UqghpU7bHO1w,3443 +pip/_vendor/pep517/check.py,sha256=o0Mp_PX1yOM2WNq1ZdDph3YA7RObj2UGQUCUF-46RaU,6083 +pip/_vendor/pep517/colorlog.py,sha256=eCV1W52xzBjA-sOlKzUcvabRiFa11Y7hA791u-85_c8,3994 +pip/_vendor/pep517/dirtools.py,sha256=JiZ1Hlt2LNaLZEhNa_pm1YyG3MUoRh7KxY6hJ8ac-w0,607 +pip/_vendor/pep517/envbuild.py,sha256=nkTt1ZY7MXVgYOhPTyTr-VOxQ-q_Qc1touXfQgM56Bs,6081 +pip/_vendor/pep517/in_process/__init__.py,sha256=4yDanGyKTXQtLhqRo9eEZ1CsLFezEAEZMfqEd88xrvY,872 pip/_vendor/pep517/in_process/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/pep517/in_process/__pycache__/_in_process.cpython-310.pyc,, -pip/_vendor/pep517/in_process/_in_process.py,sha256=D3waguyNSGcwosociD5USfcycYr2RCzCjYtxX5UHQmQ,11201 -pip/_vendor/pep517/meta.py,sha256=8mnM5lDnT4zXQpBTliJbRGfesH7iioHwozbDxALPS9Y,2463 -pip/_vendor/pep517/wrappers.py,sha256=impq7Cz_LL1iDF1iiOzYWB4MaEu6O6Gps7TJ5qsJz1Q,13429 +pip/_vendor/pep517/in_process/_in_process.py,sha256=JDpTxlKMDN1QfN_ey4IDtE6ZVSWtzP0_WLSqt1TyGaA,10801 +pip/_vendor/pep517/meta.py,sha256=budDWsV3I2OnnpSvXQ_ycuTqxh8G7DABoazAq-j8OlQ,2520 +pip/_vendor/pep517/wrappers.py,sha256=jcxIy-1Kl8I2xAZgbr6qNjF5b_6Q5gTndf9cxF0p5gM,12721 pip/_vendor/pkg_resources/__init__.py,sha256=NnpQ3g6BCHzpMgOR_OLBmYtniY4oOzdKpwqghfq_6ug,108287 pip/_vendor/pkg_resources/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-310.pyc,, @@ -578,7 +579,7 @@ pip/_vendor/platformdirs/macos.py,sha256=-3UXQewbT0yMhMdkzRXfXGAntmLIH7Qt4a9Hlf8 pip/_vendor/platformdirs/unix.py,sha256=b4aVYTz0qZ50HntwOXo8r6tp82jAa3qTjxw-WlnC2yc,6910 pip/_vendor/platformdirs/version.py,sha256=tsBKKPDX3LLh39yHXeTYauGRbRd-AmOJr9SwKldlFIU,78 pip/_vendor/platformdirs/windows.py,sha256=ISruopR5UGBePC0BxCxXevkZYfjJsIZc49YWU5iYfQ4,6439 -pip/_vendor/pygments/__init__.py,sha256=M4yPkVb6x8OkEb4tHfVU8p6B3DBEsshB_8a2gZvr4FE,3002 +pip/_vendor/pygments/__init__.py,sha256=5oLcMLXD0cTG8YcHBPITtK1fS0JBASILEvEnWkTezgE,2999 pip/_vendor/pygments/__main__.py,sha256=p0_rz3JZmNZMNZBOqDojaEx1cr9wmA9FQZX_TYl74lQ,353 pip/_vendor/pygments/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/pygments/__pycache__/__main__.cpython-310.pyc,, @@ -596,13 +597,13 @@ pip/_vendor/pygments/__pycache__/style.cpython-310.pyc,, pip/_vendor/pygments/__pycache__/token.cpython-310.pyc,, pip/_vendor/pygments/__pycache__/unistring.cpython-310.pyc,, pip/_vendor/pygments/__pycache__/util.cpython-310.pyc,, -pip/_vendor/pygments/cmdline.py,sha256=HYs14dbtMgL7t_BJ7B84NXlFjOzMYgW7Z0ZSxkTJun4,23408 +pip/_vendor/pygments/cmdline.py,sha256=rc0fah4eknRqFgn1wKNEwkq0yWnSqYOGaA4PaIeOxVY,23685 pip/_vendor/pygments/console.py,sha256=hQfqCFuOlGk7DW2lPQYepsw-wkOH1iNt9ylNA1eRymM,1697 pip/_vendor/pygments/filter.py,sha256=NglMmMPTRRv-zuRSE_QbWid7JXd2J4AvwjCW2yWALXU,1938 -pip/_vendor/pygments/filters/__init__.py,sha256=F8WwJguaJLs3bomEH8LyVATQfpULTpSpTd4PRPONR5A,40292 +pip/_vendor/pygments/filters/__init__.py,sha256=b5YuXB9rampSy2-cMtKxGQoMDfrG4_DcvVwZrzTlB6w,40386 pip/_vendor/pygments/filters/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/pygments/formatter.py,sha256=6-TS2Y8pUMeWIUolWwr1O8ruC-U6HydWDwOdbAiJgJQ,2917 -pip/_vendor/pygments/formatters/__init__.py,sha256=5LfCZThsbVVtZU5OyavkRPwC0MV7tB6pqcJ793PWi6E,5119 +pip/_vendor/pygments/formatters/__init__.py,sha256=YTqGeHS17fNXCLMZpf7oCxBCKLB9YLsZ8IAsjGhawyg,4810 pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-310.pyc,, pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-310.pyc,, @@ -617,11 +618,11 @@ pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-310.pyc,, pip/_vendor/pygments/formatters/__pycache__/svg.cpython-310.pyc,, pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-310.pyc,, pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-310.pyc,, -pip/_vendor/pygments/formatters/_mapping.py,sha256=QLyYZ7Cv9W7YcM8seq0XqR3MXW3MzoFZSyHd7BDNU84,6517 +pip/_vendor/pygments/formatters/_mapping.py,sha256=fCZgvsM6UEuZUG7J6lr47eVss5owKd_JyaNbDfxeqmQ,4104 pip/_vendor/pygments/formatters/bbcode.py,sha256=JrL4ITjN-KzPcuQpPMBf1pm33eW2sDUNr8WzSoAJsJA,3314 pip/_vendor/pygments/formatters/groff.py,sha256=xrOFoLbafSA9uHsSLRogy79_Zc4GWJ8tMK2hCdTJRsw,5086 pip/_vendor/pygments/formatters/html.py,sha256=QNt9prPgxmbKx2M-nfDwoR1bIg06-sNouQuWnE434Wc,35441 -pip/_vendor/pygments/formatters/img.py,sha256=j3hHU1fhbBEIKEtWTV-vc-z-5c2nqoobOty3QqeQbpk,21819 +pip/_vendor/pygments/formatters/img.py,sha256=h75Y7IRZLZxDEIwyoOsdRLTwm7kLVPbODKkgEiJ0iKI,21938 pip/_vendor/pygments/formatters/irc.py,sha256=iwk5tDJOxbCV64SCmOFyvk__x6RD60ay0nUn7ko9n7U,5871 pip/_vendor/pygments/formatters/latex.py,sha256=thPbytJCIs2AUXsO3NZwqKtXJ-upOlcXP4CXsx94G4w,19351 pip/_vendor/pygments/formatters/other.py,sha256=PczqK1Rms43lz6iucOLPeBMxIncPKOGBt-195w1ynII,5073 @@ -631,21 +632,21 @@ pip/_vendor/pygments/formatters/svg.py,sha256=6MM9YyO8NhU42RTQfTWBiagWMnsf9iG5gw pip/_vendor/pygments/formatters/terminal.py,sha256=NpEGvwkC6LgMLQTjVzGrJXji3XcET1sb5JCunSCzoRo,4674 pip/_vendor/pygments/formatters/terminal256.py,sha256=4v4OVizvsxtwWBpIy_Po30zeOzE5oJg_mOc1-rCjMDk,11753 pip/_vendor/pygments/lexer.py,sha256=ZPB_TGn_qzrXodRFwEdPzzJk6LZBo9BlfSy3lacc6zg,32005 -pip/_vendor/pygments/lexers/__init__.py,sha256=Gku6kqn9IvgIdvV50gISPo0mmyyMNYRoUliEwhw6eNY,11491 +pip/_vendor/pygments/lexers/__init__.py,sha256=8d80-XfL5UKDCC1wRD1a_ZBZDkZ2HOe7Zul8SsnNYFE,11174 pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-310.pyc,, pip/_vendor/pygments/lexers/__pycache__/python.cpython-310.pyc,, -pip/_vendor/pygments/lexers/_mapping.py,sha256=sExOsmEbtg7hKwXgSz6M3L77cKPaOgskzxOCdw_GxVc,72083 -pip/_vendor/pygments/lexers/python.py,sha256=QWj4ud4brZCj0-LXjR7IcO0kL6lqM2HzM_DzZZxMRjg,52792 +pip/_vendor/pygments/lexers/_mapping.py,sha256=zEiCV5FPiBioMJQJjw9kk7IJ5Y9GwknS4VJPYlcNchs,70232 +pip/_vendor/pygments/lexers/python.py,sha256=gZROs9iNSOA18YyVghP1cUCD0OwYZ04a6PCwgSOCeSA,53376 pip/_vendor/pygments/modeline.py,sha256=gIbMSYrjSWPk0oATz7W9vMBYkUyTK2OcdVyKjioDRvA,986 -pip/_vendor/pygments/plugin.py,sha256=tIRWetjR4dokpgbbFnsx7jjfN57T4-Z4errH1eVgGYw,1727 +pip/_vendor/pygments/plugin.py,sha256=5rPxEoB_89qQMpOs0nI4KyLOzAHNlbQiwEMOKxqNmv8,2591 pip/_vendor/pygments/regexopt.py,sha256=c6xcXGpGgvCET_3VWawJJqAnOp0QttFpQEdOPNY2Py0,3072 pip/_vendor/pygments/scanner.py,sha256=F2T2G6cpkj-yZtzGQr-sOBw5w5-96UrJWveZN6va2aM,3092 pip/_vendor/pygments/sphinxext.py,sha256=F8L0211sPnXaiWutN0lkSUajWBwlgDMIEFFAbMWOvZY,4630 pip/_vendor/pygments/style.py,sha256=RRnussX1YiK9Z7HipIvKorImxu3-HnkdpPCO4u925T0,6257 -pip/_vendor/pygments/styles/__init__.py,sha256=eVJlJqbmc-TYSQEEl-2yhbtnW6INfuvlayJOiXrt9ro,3252 +pip/_vendor/pygments/styles/__init__.py,sha256=iZDZ7PBKb55SpGlE1--cx9cbmWx5lVTH4bXO87t2Vok,3419 pip/_vendor/pygments/styles/__pycache__/__init__.cpython-310.pyc,, -pip/_vendor/pygments/token.py,sha256=naybicpgOtSlh3vMGvbbx2T_6qEdGWYEH_RJ4gacIcc,6143 +pip/_vendor/pygments/token.py,sha256=vA2yNHGJBHfq4jNQSah7C9DmIOp34MmYHPA8P-cYAHI,6184 pip/_vendor/pygments/unistring.py,sha256=gP3gK-6C4oAFjjo9HvoahsqzuV4Qz0jl0E0OxfDerHI,63187 pip/_vendor/pygments/util.py,sha256=KgwpWWC3By5AiNwxGTI7oI9aXupH2TyZWukafBJe0Mg,9110 pip/_vendor/pyparsing/__init__.py,sha256=ZPdI7pPo4IYXcABw-51AcqOzsxVvDtqnQbyn_qYWZvo,9171 @@ -694,7 +695,7 @@ pip/_vendor/requests/_internal_utils.py,sha256=aSPlF4uDhtfKxEayZJJ7KkAxtormeTfpw pip/_vendor/requests/adapters.py,sha256=GFEz5koZaMZD86v0SHXKVB5SE9MgslEjkCQzldkNwVM,21443 pip/_vendor/requests/api.py,sha256=dyvkDd5itC9z2g0wHl_YfD1yf6YwpGWLO7__8e21nks,6377 pip/_vendor/requests/auth.py,sha256=h-HLlVx9j8rKV5hfSAycP2ApOSglTz77R0tz7qCbbEE,10187 -pip/_vendor/requests/certs.py,sha256=kHDlkK_beuHXeMPc5jta2wgl8gdKeUWt5f2nTDVrvt8,441 +pip/_vendor/requests/certs.py,sha256=PVPooB0jP5hkZEULSCwC074532UFbR2Ptgu0I5zwmCs,575 pip/_vendor/requests/compat.py,sha256=IhK9quyX0RRuWTNcg6d2JGSAOUbM6mym2p_2XjLTwf4,1286 pip/_vendor/requests/cookies.py,sha256=kD3kNEcCj-mxbtf5fJsSaT86eGoEYpD3X0CSgpzl7BM,18560 pip/_vendor/requests/exceptions.py,sha256=FA-_kVwBZ2jhXauRctN_ewHVK25b-fj0Azyz1THQ0Kk,3823 @@ -871,7 +872,7 @@ pip/_vendor/rich/themes.py,sha256=0xgTLozfabebYtcJtDdC5QkX5IVUEaviqDUJJh4YVFk,10 pip/_vendor/rich/traceback.py,sha256=MORQpXH7AvhAAThW8oIbtwffXb8M6XRkSkcJ52JuA3g,26060 pip/_vendor/rich/tree.py,sha256=BMbUYNjS9uodNPfvtY_odmU09GA5QzcMbQ5cJZhllQI,9169 pip/_vendor/six.py,sha256=TOOfQi7nFGfMrIvtdr6wX4wyHH8M7aknmuLfo2cBBrM,34549 -pip/_vendor/tenacity/__init__.py,sha256=GLLsTFD4Bd5VDgTR6mU_FxyOsrxc48qONorVaRebeD4,18257 +pip/_vendor/tenacity/__init__.py,sha256=rjcWJVq5PcNJNC42rt-TAGGskM-RUEkZbDKu1ra7IPo,18364 pip/_vendor/tenacity/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/tenacity/__pycache__/_asyncio.cpython-310.pyc,, pip/_vendor/tenacity/__pycache__/_utils.cpython-310.pyc,, @@ -889,10 +890,10 @@ pip/_vendor/tenacity/after.py,sha256=dlmyxxFy2uqpLXDr838DiEd7jgv2AGthsWHGYcGYsaI pip/_vendor/tenacity/before.py,sha256=7XtvRmO0dRWUp8SVn24OvIiGFj8-4OP5muQRUiWgLh0,1376 pip/_vendor/tenacity/before_sleep.py,sha256=ThyDvqKU5yle_IvYQz_b6Tp6UjUS0PhVp6zgqYl9U6Y,1908 pip/_vendor/tenacity/nap.py,sha256=fRWvnz1aIzbIq9Ap3gAkAZgDH6oo5zxMrU6ZOVByq0I,1383 -pip/_vendor/tenacity/retry.py,sha256=62R71W59bQjuNyFKsDM7hE2aEkEPtwNBRA0tnsEvgSk,6645 +pip/_vendor/tenacity/retry.py,sha256=Cy504Ss3UrRV7lnYgvymF66WD1wJ2dbM869kDcjuDes,7550 pip/_vendor/tenacity/stop.py,sha256=sKHmHaoSaW6sKu3dTxUVKr1-stVkY7lw4Y9yjZU30zQ,2790 pip/_vendor/tenacity/tornadoweb.py,sha256=E8lWO2nwe6dJgoB-N2HhQprYLDLB_UdSgFnv-EN6wKE,2145 -pip/_vendor/tenacity/wait.py,sha256=e_Saa6I2tsNLpCL1t9897wN2fGb0XQMQlE4bU2t9V2w,6691 +pip/_vendor/tenacity/wait.py,sha256=tdLTESRm5E237VHG0SxCDXRa0DHKPKVq285kslHVURc,8011 pip/_vendor/tomli/__init__.py,sha256=JhUwV66DB1g4Hvt1UQCVMdfCu-IgAV8FXmvDU9onxd4,396 pip/_vendor/tomli/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/tomli/__pycache__/_parser.cpython-310.pyc,, @@ -901,8 +902,8 @@ pip/_vendor/tomli/__pycache__/_types.cpython-310.pyc,, pip/_vendor/tomli/_parser.py,sha256=g9-ENaALS-B8dokYpCuzUFalWlog7T-SIYMjLZSWrtM,22633 pip/_vendor/tomli/_re.py,sha256=dbjg5ChZT23Ka9z9DHOXfdtSpPwUfdgMXnj8NOoly-w,2943 pip/_vendor/tomli/_types.py,sha256=-GTG2VUqkpxwMqzmVO4F7ybKddIbAnuAHXfmWQcTi3Q,254 -pip/_vendor/typing_extensions.py,sha256=U_PyumPFBkMiR_Iq78QWZXdPprTywptECB2WRIQjDv0,75420 -pip/_vendor/urllib3/__init__.py,sha256=j3yzHIbmW7CS-IKQJ9-PPQf_YKO8EOAey_rMW0UR7us,2763 +pip/_vendor/typing_extensions.py,sha256=VKZ_nHsuzDbKOVUY2CTdavwBgfZ2EXRyluZHRzUYAbg,80114 +pip/_vendor/urllib3/__init__.py,sha256=iXLcYiJySn0GNbWOOZDDApgBL1JgP44EZ8i1760S8Mc,3333 pip/_vendor/urllib3/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/urllib3/__pycache__/_collections.cpython-310.pyc,, pip/_vendor/urllib3/__pycache__/_version.cpython-310.pyc,, @@ -915,7 +916,7 @@ pip/_vendor/urllib3/__pycache__/poolmanager.cpython-310.pyc,, pip/_vendor/urllib3/__pycache__/request.cpython-310.pyc,, pip/_vendor/urllib3/__pycache__/response.cpython-310.pyc,, pip/_vendor/urllib3/_collections.py,sha256=Rp1mVyBgc_UlAcp6M3at1skJBXR5J43NawRTvW2g_XY,10811 -pip/_vendor/urllib3/_version.py,sha256=kDAZ-bEcWgqZsVJELrYbVo4buZP5eBBOGl_X7VA0Ic4,64 +pip/_vendor/urllib3/_version.py,sha256=GhuGBUT_MtRxHEHDb-LYs5yLPeYWlCwFBPjGZmVJbVg,64 pip/_vendor/urllib3/connection.py,sha256=8976wL6sGeVMW0JnXvx5mD00yXu87uQjxtB9_VL8dx8,20070 pip/_vendor/urllib3/connectionpool.py,sha256=vEzk1iJEw1qR2vHBo7m3Y98iDfna6rKkUz3AyK5lJKQ,39093 pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 @@ -935,7 +936,7 @@ pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=4Xk64qIkPBt09A5q pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=B2JBB2_NRP02xK6DCa1Pa9IuxrPwxzDzZbixQkb7U9M,13922 pip/_vendor/urllib3/contrib/appengine.py,sha256=lfzpHFmJiO82shClLEm3QB62SYgHWnjpZOH_2JhU5Tc,11034 pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=ej9gGvfAb2Gt00lafFp45SIoRz-QwrQ4WChm6gQmAlM,4538 -pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=oR_4W0U0gaDYBN8Q5qz_VZ8xrYZsoXve52RwIKdYGbc,16899 +pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=rt9NEIP8iMBLxxRhH0jLnmshW-OFP83jEayxMSqu2MU,17182 pip/_vendor/urllib3/contrib/securetransport.py,sha256=yhZdmVjY6PI6EeFbp7qYOp6-vp1Rkv2NMuOGaEj7pmc,34448 pip/_vendor/urllib3/contrib/socks.py,sha256=aRi9eWXo9ZEb95XUxef4Z21CFlnnjbEiAo9HOseoMt4,7097 pip/_vendor/urllib3/exceptions.py,sha256=0Mnno3KHTNfXRfY7638NufOPkUb6mXOm-Lqj-4x2w8A,8217 @@ -951,7 +952,7 @@ pip/_vendor/urllib3/packages/backports/makefile.py,sha256=nbzt3i0agPVP07jqqgjhaY pip/_vendor/urllib3/packages/six.py,sha256=b9LM0wBXv7E7SrbCjAm4wwN-hrH-iNxv18LgWNMMKPo,34665 pip/_vendor/urllib3/poolmanager.py,sha256=0KOOJECoeLYVjUHvv-0h4Oq3FFQQ2yb-Fnjkbj8gJO0,19786 pip/_vendor/urllib3/request.py,sha256=ZFSIqX0C6WizixecChZ3_okyu7BEv0lZu1VT0s6h4SM,5985 -pip/_vendor/urllib3/response.py,sha256=36JUM28H4dHsuCQgIPeN91LNcK8r1wBUJGFLk3ALfJc,28156 +pip/_vendor/urllib3/response.py,sha256=p3VBYPhwBca77wCZfmoXvEDVVC3SdF7yxQ6TXuxy1BI,30109 pip/_vendor/urllib3/util/__init__.py,sha256=JEmSmmqqLyaw8P51gUImZh8Gwg9i1zSe-DoqAitn2nc,1155 pip/_vendor/urllib3/util/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/urllib3/util/__pycache__/connection.cpython-310.pyc,, @@ -978,7 +979,7 @@ pip/_vendor/urllib3/util/ssltransport.py,sha256=NA-u5rMTrDFDFC8QzRKUEKMG0561hOD4 pip/_vendor/urllib3/util/timeout.py,sha256=QSbBUNOB9yh6AnDn61SrLQ0hg5oz0I9-uXEG91AJuIg,10003 pip/_vendor/urllib3/util/url.py,sha256=49HwObaTUUjqVe4qvSUvIjZyf3ghgNA6-OLm3kmkFKM,14287 pip/_vendor/urllib3/util/wait.py,sha256=fOX0_faozG2P7iVojQoE1mbydweNyTcm-hXEfFrTtLI,5403 -pip/_vendor/vendor.txt,sha256=8XILGklF_LcEc20OonK8_bpFH7tG7wLotFxI0k3FMU0,469 +pip/_vendor/vendor.txt,sha256=07gLL_CcEHdl1XM0g4PH2L4gsTTMlJr8WWIC11yEyMo,469 pip/_vendor/webencodings/__init__.py,sha256=qOBJIuPy_4ByYH6W_bNgJF-qYQ2DoU-dKsDu5yRWCXg,10579 pip/_vendor/webencodings/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/webencodings/__pycache__/labels.cpython-310.pyc,, diff --git a/Python310/Lib/site-packages/pip-22.2.2.dist-info/REQUESTED b/Python310/Lib/site-packages/pip-22.3.dist-info/REQUESTED similarity index 100% rename from Python310/Lib/site-packages/pip-22.2.2.dist-info/REQUESTED rename to Python310/Lib/site-packages/pip-22.3.dist-info/REQUESTED diff --git a/Python310/Lib/site-packages/pip-22.2.2.dist-info/WHEEL b/Python310/Lib/site-packages/pip-22.3.dist-info/WHEEL similarity index 100% rename from Python310/Lib/site-packages/pip-22.2.2.dist-info/WHEEL rename to Python310/Lib/site-packages/pip-22.3.dist-info/WHEEL diff --git a/Python310/Lib/site-packages/pip-22.2.2.dist-info/entry_points.txt b/Python310/Lib/site-packages/pip-22.3.dist-info/entry_points.txt similarity index 69% rename from Python310/Lib/site-packages/pip-22.2.2.dist-info/entry_points.txt rename to Python310/Lib/site-packages/pip-22.3.dist-info/entry_points.txt index d3ad2e2..5367846 100644 --- a/Python310/Lib/site-packages/pip-22.2.2.dist-info/entry_points.txt +++ b/Python310/Lib/site-packages/pip-22.3.dist-info/entry_points.txt @@ -1,4 +1,4 @@ [console_scripts] pip = pip._internal.cli.main:main pip3 = pip._internal.cli.main:main -pip3.8 = pip._internal.cli.main:main +pip3.10 = pip._internal.cli.main:main diff --git a/Python310/Lib/site-packages/pip-22.2.2.dist-info/top_level.txt b/Python310/Lib/site-packages/pip-22.3.dist-info/top_level.txt similarity index 100% rename from Python310/Lib/site-packages/pip-22.2.2.dist-info/top_level.txt rename to Python310/Lib/site-packages/pip-22.3.dist-info/top_level.txt diff --git a/Python310/Lib/site-packages/pip/__init__.py b/Python310/Lib/site-packages/pip/__init__.py index 3d4b45a..168abe8 100644 --- a/Python310/Lib/site-packages/pip/__init__.py +++ b/Python310/Lib/site-packages/pip/__init__.py @@ -1,6 +1,6 @@ from typing import List, Optional -__version__ = "22.2.2" +__version__ = "22.3" def main(args: Optional[List[str]] = None) -> int: diff --git a/Python310/Lib/site-packages/pip/__pip-runner__.py b/Python310/Lib/site-packages/pip/__pip-runner__.py index 14026c0..49a148a 100644 --- a/Python310/Lib/site-packages/pip/__pip-runner__.py +++ b/Python310/Lib/site-packages/pip/__pip-runner__.py @@ -4,24 +4,38 @@ This file is named as it is, to ensure that this module can't be imported via an import statement. """ -import runpy +# /!\ This version compatibility check section must be Python 2 compatible. /!\ + import sys -import types -from importlib.machinery import ModuleSpec, PathFinder -from os.path import dirname -from typing import Optional, Sequence, Union + +# Copied from setup.py +PYTHON_REQUIRES = (3, 7) + + +def version_str(version): # type: ignore + return ".".join(str(v) for v in version) + + +if sys.version_info[:2] < PYTHON_REQUIRES: + raise SystemExit( + "This version of pip does not support python {} (requires >={}).".format( + version_str(sys.version_info[:2]), version_str(PYTHON_REQUIRES) + ) + ) + +# From here on, we can use Python 3 features, but the syntax must remain +# Python 2 compatible. + +import runpy # noqa: E402 +from importlib.machinery import PathFinder # noqa: E402 +from os.path import dirname # noqa: E402 PIP_SOURCES_ROOT = dirname(dirname(__file__)) class PipImportRedirectingFinder: @classmethod - def find_spec( - self, - fullname: str, - path: Optional[Sequence[Union[bytes, str]]] = None, - target: Optional[types.ModuleType] = None, - ) -> Optional[ModuleSpec]: + def find_spec(self, fullname, path=None, target=None): # type: ignore if fullname != "pip": return None diff --git a/Python310/Lib/site-packages/pip/_internal/build_env.py b/Python310/Lib/site-packages/pip/_internal/build_env.py index 6d4f6a5..cc2b38b 100644 --- a/Python310/Lib/site-packages/pip/_internal/build_env.py +++ b/Python310/Lib/site-packages/pip/_internal/build_env.py @@ -4,6 +4,7 @@ import logging import os import pathlib +import site import sys import textwrap from collections import OrderedDict @@ -39,7 +40,7 @@ class _Prefix: self.lib_dirs = get_prefixed_libs(path) -def _get_runnable_pip() -> str: +def get_runnable_pip() -> str: """Get a file to pass to a Python executable, to run the currently-running pip. This is used to run a pip subprocess, for installing requirements into the build @@ -55,6 +56,26 @@ def _get_runnable_pip() -> str: return os.fsdecode(source / "__pip-runner__.py") +def _get_system_sitepackages() -> Set[str]: + """Get system site packages + + Usually from site.getsitepackages, + but fallback on `get_purelib()/get_platlib()` if unavailable + (e.g. in a virtualenv created by virtualenv<20) + + Returns normalized set of strings. + """ + if hasattr(site, "getsitepackages"): + system_sites = site.getsitepackages() + else: + # virtualenv < 20 overwrites site.py without getsitepackages + # fallback on get_purelib/get_platlib. + # this is known to miss things, but shouldn't in the cases + # where getsitepackages() has been removed (inside a virtualenv) + system_sites = [get_purelib(), get_platlib()] + return {os.path.normcase(path) for path in system_sites} + + class BuildEnvironment: """Creates and manages an isolated environment to install build deps""" @@ -75,9 +96,8 @@ class BuildEnvironment: # Customize site to: # - ensure .pth files are honored # - prevent access to system site packages - system_sites = { - os.path.normcase(site) for site in (get_purelib(), get_platlib()) - } + system_sites = _get_system_sitepackages() + self._site_dir = os.path.join(temp_dir.path, "site") if not os.path.exists(self._site_dir): os.mkdir(self._site_dir) @@ -194,7 +214,7 @@ class BuildEnvironment: if not requirements: return self._install_requirements( - _get_runnable_pip(), + get_runnable_pip(), finder, requirements, prefix, diff --git a/Python310/Lib/site-packages/pip/_internal/cache.py b/Python310/Lib/site-packages/pip/_internal/cache.py index e51edd5..c53b7f0 100644 --- a/Python310/Lib/site-packages/pip/_internal/cache.py +++ b/Python310/Lib/site-packages/pip/_internal/cache.py @@ -221,7 +221,11 @@ class WheelCache(Cache): when a certain link is not found in the simple wheel cache first. """ - def __init__(self, cache_dir: str, format_control: FormatControl) -> None: + def __init__( + self, cache_dir: str, format_control: Optional[FormatControl] = None + ) -> None: + if format_control is None: + format_control = FormatControl() super().__init__(cache_dir, format_control, {"binary"}) self._wheel_cache = SimpleWheelCache(cache_dir, format_control) self._ephem_cache = EphemWheelCache(format_control) diff --git a/Python310/Lib/site-packages/pip/_internal/cli/base_command.py b/Python310/Lib/site-packages/pip/_internal/cli/base_command.py index 0774f26..5bd7e67 100644 --- a/Python310/Lib/site-packages/pip/_internal/cli/base_command.py +++ b/Python310/Lib/site-packages/pip/_internal/cli/base_command.py @@ -151,13 +151,6 @@ class Command(CommandContextMixIn): ) options.cache_dir = None - if "2020-resolver" in options.features_enabled: - logger.warning( - "--use-feature=2020-resolver no longer has any effect, " - "since it is now the default dependency resolver in pip. " - "This will become an error in pip 21.0." - ) - def intercepts_unhandled_exc( run_func: Callable[..., int] ) -> Callable[..., int]: diff --git a/Python310/Lib/site-packages/pip/_internal/cli/cmdoptions.py b/Python310/Lib/site-packages/pip/_internal/cli/cmdoptions.py index 47ed927..b4e2560 100644 --- a/Python310/Lib/site-packages/pip/_internal/cli/cmdoptions.py +++ b/Python310/Lib/site-packages/pip/_internal/cli/cmdoptions.py @@ -59,31 +59,6 @@ def make_option_group(group: Dict[str, Any], parser: ConfigOptionParser) -> Opti return option_group -def check_install_build_global( - options: Values, check_options: Optional[Values] = None -) -> None: - """Disable wheels if per-setup.py call options are set. - - :param options: The OptionParser options to update. - :param check_options: The options to check, if not supplied defaults to - options. - """ - if check_options is None: - check_options = options - - def getname(n: str) -> Optional[Any]: - return getattr(check_options, n, None) - - names = ["build_options", "global_options", "install_options"] - if any(map(getname, names)): - control = options.format_control - control.disallow_binaries() - logger.warning( - "Disabling all use of wheels due to the use of --build-option " - "/ --global-option / --install-option.", - ) - - def check_dist_restriction(options: Values, check_target: bool = False) -> None: """Function for determining if custom platform options are allowed. @@ -189,6 +164,13 @@ require_virtualenv: Callable[..., Option] = partial( ), ) +python: Callable[..., Option] = partial( + Option, + "--python", + dest="python", + help="Run pip with the specified Python interpreter.", +) + verbose: Callable[..., Option] = partial( Option, "-v", @@ -1000,7 +982,11 @@ use_new_feature: Callable[..., Option] = partial( metavar="feature", action="append", default=[], - choices=["2020-resolver", "fast-deps", "truststore"], + choices=[ + "fast-deps", + "truststore", + "no-binary-enable-wheel-cache", + ], help="Enable new functionality, that may be backward incompatible.", ) @@ -1029,6 +1015,7 @@ general_group: Dict[str, Any] = { debug_mode, isolated_mode, require_virtualenv, + python, verbose, version, quiet, diff --git a/Python310/Lib/site-packages/pip/_internal/cli/main_parser.py b/Python310/Lib/site-packages/pip/_internal/cli/main_parser.py index 3666ab0..5ade356 100644 --- a/Python310/Lib/site-packages/pip/_internal/cli/main_parser.py +++ b/Python310/Lib/site-packages/pip/_internal/cli/main_parser.py @@ -2,9 +2,11 @@ """ import os +import subprocess import sys -from typing import List, Tuple +from typing import List, Optional, Tuple +from pip._internal.build_env import get_runnable_pip from pip._internal.cli import cmdoptions from pip._internal.cli.parser import ConfigOptionParser, UpdatingDefaultsHelpFormatter from pip._internal.commands import commands_dict, get_similar_commands @@ -45,6 +47,25 @@ def create_main_parser() -> ConfigOptionParser: return parser +def identify_python_interpreter(python: str) -> Optional[str]: + # If the named file exists, use it. + # If it's a directory, assume it's a virtual environment and + # look for the environment's Python executable. + if os.path.exists(python): + if os.path.isdir(python): + # bin/python for Unix, Scripts/python.exe for Windows + # Try both in case of odd cases like cygwin. + for exe in ("bin/python", "Scripts/python.exe"): + py = os.path.join(python, exe) + if os.path.exists(py): + return py + else: + return python + + # Could not find the interpreter specified + return None + + def parse_command(args: List[str]) -> Tuple[str, List[str]]: parser = create_main_parser() @@ -57,6 +78,32 @@ def parse_command(args: List[str]) -> Tuple[str, List[str]]: # args_else: ['install', '--user', 'INITools'] general_options, args_else = parser.parse_args(args) + # --python + if general_options.python and "_PIP_RUNNING_IN_SUBPROCESS" not in os.environ: + # Re-invoke pip using the specified Python interpreter + interpreter = identify_python_interpreter(general_options.python) + if interpreter is None: + raise CommandError( + f"Could not locate Python interpreter {general_options.python}" + ) + + pip_cmd = [ + interpreter, + get_runnable_pip(), + ] + pip_cmd.extend(args) + + # Set a flag so the child doesn't re-invoke itself, causing + # an infinite loop. + os.environ["_PIP_RUNNING_IN_SUBPROCESS"] = "1" + returncode = 0 + try: + proc = subprocess.run(pip_cmd) + returncode = proc.returncode + except (subprocess.SubprocessError, OSError) as exc: + raise CommandError(f"Failed to run pip under {interpreter}: {exc}") + sys.exit(returncode) + # --version if general_options.version: sys.stdout.write(parser.version) diff --git a/Python310/Lib/site-packages/pip/_internal/cli/spinners.py b/Python310/Lib/site-packages/pip/_internal/cli/spinners.py index a50e6ad..cf2b976 100644 --- a/Python310/Lib/site-packages/pip/_internal/cli/spinners.py +++ b/Python310/Lib/site-packages/pip/_internal/cli/spinners.py @@ -3,7 +3,7 @@ import itertools import logging import sys import time -from typing import IO, Generator +from typing import IO, Generator, Optional from pip._internal.utils.compat import WINDOWS from pip._internal.utils.logging import get_indentation @@ -23,7 +23,7 @@ class InteractiveSpinner(SpinnerInterface): def __init__( self, message: str, - file: IO[str] = None, + file: Optional[IO[str]] = None, spin_chars: str = "-\\|/", # Empirically, 8 updates/second looks nice min_update_interval_seconds: float = 0.125, diff --git a/Python310/Lib/site-packages/pip/_internal/commands/configuration.py b/Python310/Lib/site-packages/pip/_internal/commands/configuration.py index e383732..84b134e 100644 --- a/Python310/Lib/site-packages/pip/_internal/commands/configuration.py +++ b/Python310/Lib/site-packages/pip/_internal/commands/configuration.py @@ -228,9 +228,15 @@ class ConfigurationCommand(Command): fname = self.configuration.get_file_to_edit() if fname is None: raise PipError("Could not determine appropriate file.") + elif '"' in fname: + # This shouldn't happen, unless we see a username like that. + # If that happens, we'd appreciate a pull request fixing this. + raise PipError( + f'Can not open an editor for a file name containing "\n{fname}' + ) try: - subprocess.check_call([editor, fname]) + subprocess.check_call(f'{editor} "{fname}"', shell=True) except FileNotFoundError as e: if not e.filename: e.filename = editor diff --git a/Python310/Lib/site-packages/pip/_internal/commands/download.py b/Python310/Lib/site-packages/pip/_internal/commands/download.py index 26a5080..4132e08 100644 --- a/Python310/Lib/site-packages/pip/_internal/commands/download.py +++ b/Python310/Lib/site-packages/pip/_internal/commands/download.py @@ -8,6 +8,10 @@ from pip._internal.cli.cmdoptions import make_target_python from pip._internal.cli.req_command import RequirementCommand, with_cleanup from pip._internal.cli.status_codes import SUCCESS from pip._internal.operations.build.build_tracker import get_build_tracker +from pip._internal.req.req_install import ( + LegacySetupPyOptionsCheckMode, + check_legacy_setup_py_options, +) from pip._internal.utils.misc import ensure_dir, normalize_path, write_output from pip._internal.utils.temp_dir import TempDirectory @@ -105,6 +109,9 @@ class DownloadCommand(RequirementCommand): ) reqs = self.get_requirements(args, options, finder, session) + check_legacy_setup_py_options( + options, reqs, LegacySetupPyOptionsCheckMode.DOWNLOAD + ) preparer = self.make_requirement_preparer( temp_build_dir=directory, diff --git a/Python310/Lib/site-packages/pip/_internal/commands/install.py b/Python310/Lib/site-packages/pip/_internal/commands/install.py index 2990764..e081c27 100644 --- a/Python310/Lib/site-packages/pip/_internal/commands/install.py +++ b/Python310/Lib/site-packages/pip/_internal/commands/install.py @@ -27,8 +27,16 @@ from pip._internal.models.installation_report import InstallationReport from pip._internal.operations.build.build_tracker import get_build_tracker from pip._internal.operations.check import ConflictDetails, check_install_conflicts from pip._internal.req import install_given_reqs -from pip._internal.req.req_install import InstallRequirement +from pip._internal.req.req_install import ( + InstallRequirement, + LegacySetupPyOptionsCheckMode, + check_legacy_setup_py_options, +) from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.deprecation import ( + LegacyInstallReasonFailedBdistWheel, + deprecated, +) from pip._internal.utils.distutils_args import parse_distutils_args from pip._internal.utils.filesystem import test_writable_dir from pip._internal.utils.logging import getLogger @@ -44,7 +52,7 @@ from pip._internal.utils.virtualenv import ( virtualenv_no_global, ) from pip._internal.wheel_builder import ( - BinaryAllowedPredicate, + BdistWheelAllowedPredicate, build, should_build_for_install_command, ) @@ -52,7 +60,9 @@ from pip._internal.wheel_builder import ( logger = getLogger(__name__) -def get_check_binary_allowed(format_control: FormatControl) -> BinaryAllowedPredicate: +def get_check_bdist_wheel_allowed( + format_control: FormatControl, +) -> BdistWheelAllowedPredicate: def check_binary_allowed(req: InstallRequirement) -> bool: canonical_name = canonicalize_name(req.name or "") allowed_formats = format_control.get_allowed_formats(canonical_name) @@ -263,7 +273,9 @@ class InstallCommand(RequirementCommand): "the provided requirements. " "Can be used in combination with --dry-run and --ignore-installed " "to 'resolve' the requirements. " - "When - is used as file name it writes to stdout." + "When - is used as file name it writes to stdout. " + "When writing to stdout, please combine with the --quiet option " + "to avoid mixing pip logging output with JSON output." ), ) @@ -272,7 +284,6 @@ class InstallCommand(RequirementCommand): if options.use_user_site and options.target_dir is not None: raise CommandError("Can not combine '--user' and '--target'") - cmdoptions.check_install_build_global(options) upgrade_strategy = "to-satisfy-only" if options.upgrade: upgrade_strategy = options.upgrade_strategy @@ -321,8 +332,6 @@ class InstallCommand(RequirementCommand): target_python=target_python, ignore_requires_python=options.ignore_requires_python, ) - wheel_cache = WheelCache(options.cache_dir, options.format_control) - build_tracker = self.enter_context(get_build_tracker()) directory = TempDirectory( @@ -333,6 +342,28 @@ class InstallCommand(RequirementCommand): try: reqs = self.get_requirements(args, options, finder, session) + check_legacy_setup_py_options( + options, reqs, LegacySetupPyOptionsCheckMode.INSTALL + ) + + if "no-binary-enable-wheel-cache" in options.features_enabled: + # TODO: remove format_control from WheelCache when the deprecation cycle + # is over + wheel_cache = WheelCache(options.cache_dir) + else: + if options.format_control.no_binary: + deprecated( + reason=( + "--no-binary currently disables reading from " + "the cache of locally built wheels. In the future " + "--no-binary will not influence the wheel cache." + ), + replacement="to use the --no-cache-dir option", + feature_flag="no-binary-enable-wheel-cache", + issue=11453, + gone_in="23.1", + ) + wheel_cache = WheelCache(options.cache_dir, options.format_control) # Only when installing is it permitted to use PEP 660. # In other circumstances (pip wheel, pip download) we generate @@ -406,12 +437,14 @@ class InstallCommand(RequirementCommand): modifying_pip = pip_req.satisfied_by is None protect_pip_from_modification_on_windows(modifying_pip=modifying_pip) - check_binary_allowed = get_check_binary_allowed(finder.format_control) + check_bdist_wheel_allowed = get_check_bdist_wheel_allowed( + finder.format_control + ) reqs_to_build = [ r for r in requirement_set.requirements.values() - if should_build_for_install_command(r, check_binary_allowed) + if should_build_for_install_command(r, check_bdist_wheel_allowed) ] _, build_failures = build( @@ -419,7 +452,7 @@ class InstallCommand(RequirementCommand): wheel_cache=wheel_cache, verify=True, build_options=[], - global_options=[], + global_options=global_options, ) # If we're using PEP 517, we cannot do a legacy setup.py install @@ -440,7 +473,7 @@ class InstallCommand(RequirementCommand): # those. for r in build_failures: if not r.use_pep517: - r.legacy_install_reason = 8368 + r.legacy_install_reason = LegacyInstallReasonFailedBdistWheel to_install = resolver.get_installation_order(requirement_set) diff --git a/Python310/Lib/site-packages/pip/_internal/commands/list.py b/Python310/Lib/site-packages/pip/_internal/commands/list.py index a9b08a0..8e1426d 100644 --- a/Python310/Lib/site-packages/pip/_internal/commands/list.py +++ b/Python310/Lib/site-packages/pip/_internal/commands/list.py @@ -155,6 +155,11 @@ class ListCommand(IndexGroupCommand): if options.outdated and options.uptodate: raise CommandError("Options --outdated and --uptodate cannot be combined.") + if options.outdated and options.list_format == "freeze": + raise CommandError( + "List format 'freeze' can not be used with the --outdated option." + ) + cmdoptions.check_list_path_option(options) skip = set(stdlib_pkgs) diff --git a/Python310/Lib/site-packages/pip/_internal/commands/wheel.py b/Python310/Lib/site-packages/pip/_internal/commands/wheel.py index 9dd6c82..1afbd56 100644 --- a/Python310/Lib/site-packages/pip/_internal/commands/wheel.py +++ b/Python310/Lib/site-packages/pip/_internal/commands/wheel.py @@ -10,7 +10,12 @@ from pip._internal.cli.req_command import RequirementCommand, with_cleanup from pip._internal.cli.status_codes import SUCCESS from pip._internal.exceptions import CommandError from pip._internal.operations.build.build_tracker import get_build_tracker -from pip._internal.req.req_install import InstallRequirement +from pip._internal.req.req_install import ( + InstallRequirement, + LegacySetupPyOptionsCheckMode, + check_legacy_setup_py_options, +) +from pip._internal.utils.deprecation import deprecated from pip._internal.utils.misc import ensure_dir, normalize_path from pip._internal.utils.temp_dir import TempDirectory from pip._internal.wheel_builder import build, should_build_for_wheel_command @@ -100,8 +105,6 @@ class WheelCommand(RequirementCommand): @with_cleanup def run(self, options: Values, args: List[str]) -> int: - cmdoptions.check_install_build_global(options) - session = self.get_default_session(options) finder = self._build_package_finder(options, session) @@ -119,6 +122,28 @@ class WheelCommand(RequirementCommand): ) reqs = self.get_requirements(args, options, finder, session) + check_legacy_setup_py_options( + options, reqs, LegacySetupPyOptionsCheckMode.WHEEL + ) + + if "no-binary-enable-wheel-cache" in options.features_enabled: + # TODO: remove format_control from WheelCache when the deprecation cycle + # is over + wheel_cache = WheelCache(options.cache_dir) + else: + if options.format_control.no_binary: + deprecated( + reason=( + "--no-binary currently disables reading from " + "the cache of locally built wheels. In the future " + "--no-binary will not influence the wheel cache." + ), + replacement="to use the --no-cache-dir option", + feature_flag="no-binary-enable-wheel-cache", + issue=11453, + gone_in="23.1", + ) + wheel_cache = WheelCache(options.cache_dir, options.format_control) preparer = self.make_requirement_preparer( temp_build_dir=directory, diff --git a/Python310/Lib/site-packages/pip/_internal/exceptions.py b/Python310/Lib/site-packages/pip/_internal/exceptions.py index 97b9612..2ab1f59 100644 --- a/Python310/Lib/site-packages/pip/_internal/exceptions.py +++ b/Python310/Lib/site-packages/pip/_internal/exceptions.py @@ -288,7 +288,10 @@ class NetworkConnectionError(PipError): """HTTP connection error""" def __init__( - self, error_msg: str, response: Response = None, request: Request = None + self, + error_msg: str, + response: Optional[Response] = None, + request: Optional[Request] = None, ) -> None: """ Initialize NetworkConnectionError with `request` and `response` @@ -332,8 +335,8 @@ class MetadataInconsistent(InstallationError): """Built metadata contains inconsistent information. This is raised when the metadata contains values (e.g. name and version) - that do not match the information previously obtained from sdist filename - or user-supplied ``#egg=`` value. + that do not match the information previously obtained from sdist filename, + user-supplied ``#egg=`` value, or an install requirement name. """ def __init__( @@ -345,11 +348,10 @@ class MetadataInconsistent(InstallationError): self.m_val = m_val def __str__(self) -> str: - template = ( - "Requested {} has inconsistent {}: " - "filename has {!r}, but metadata has {!r}" + return ( + f"Requested {self.ireq} has inconsistent {self.field}: " + f"expected {self.f_val!r}, but metadata has {self.m_val!r}" ) - return template.format(self.ireq, self.field, self.f_val, self.m_val) class LegacyInstallFailure(DiagnosticPipError): diff --git a/Python310/Lib/site-packages/pip/_internal/index/collector.py b/Python310/Lib/site-packages/pip/_internal/index/collector.py index bc41737..0120610 100644 --- a/Python310/Lib/site-packages/pip/_internal/index/collector.py +++ b/Python310/Lib/site-packages/pip/_internal/index/collector.py @@ -9,10 +9,8 @@ import itertools import json import logging import os -import re import urllib.parse import urllib.request -import xml.etree.ElementTree from html.parser import HTMLParser from optparse import Values from typing import ( @@ -39,7 +37,7 @@ from pip._internal.models.search_scope import SearchScope from pip._internal.network.session import PipSession from pip._internal.network.utils import raise_for_status from pip._internal.utils.filetypes import is_archive_file -from pip._internal.utils.misc import pairwise, redact_auth_from_url +from pip._internal.utils.misc import redact_auth_from_url from pip._internal.vcs import vcs from .sources import CandidatesFromPage, LinkSource, build_source @@ -51,7 +49,6 @@ else: logger = logging.getLogger(__name__) -HTMLElement = xml.etree.ElementTree.Element ResponseHeaders = MutableMapping[str, str] @@ -191,94 +188,6 @@ def _get_encoding_from_headers(headers: ResponseHeaders) -> Optional[str]: return None -def _clean_url_path_part(part: str) -> str: - """ - Clean a "part" of a URL path (i.e. after splitting on "@" characters). - """ - # We unquote prior to quoting to make sure nothing is double quoted. - return urllib.parse.quote(urllib.parse.unquote(part)) - - -def _clean_file_url_path(part: str) -> str: - """ - Clean the first part of a URL path that corresponds to a local - filesystem path (i.e. the first part after splitting on "@" characters). - """ - # We unquote prior to quoting to make sure nothing is double quoted. - # Also, on Windows the path part might contain a drive letter which - # should not be quoted. On Linux where drive letters do not - # exist, the colon should be quoted. We rely on urllib.request - # to do the right thing here. - return urllib.request.pathname2url(urllib.request.url2pathname(part)) - - -# percent-encoded: / -_reserved_chars_re = re.compile("(@|%2F)", re.IGNORECASE) - - -def _clean_url_path(path: str, is_local_path: bool) -> str: - """ - Clean the path portion of a URL. - """ - if is_local_path: - clean_func = _clean_file_url_path - else: - clean_func = _clean_url_path_part - - # Split on the reserved characters prior to cleaning so that - # revision strings in VCS URLs are properly preserved. - parts = _reserved_chars_re.split(path) - - cleaned_parts = [] - for to_clean, reserved in pairwise(itertools.chain(parts, [""])): - cleaned_parts.append(clean_func(to_clean)) - # Normalize %xx escapes (e.g. %2f -> %2F) - cleaned_parts.append(reserved.upper()) - - return "".join(cleaned_parts) - - -def _clean_link(url: str) -> str: - """ - Make sure a link is fully quoted. - For example, if ' ' occurs in the URL, it will be replaced with "%20", - and without double-quoting other characters. - """ - # Split the URL into parts according to the general structure - # `scheme://netloc/path;parameters?query#fragment`. - result = urllib.parse.urlparse(url) - # If the netloc is empty, then the URL refers to a local filesystem path. - is_local_path = not result.netloc - path = _clean_url_path(result.path, is_local_path=is_local_path) - return urllib.parse.urlunparse(result._replace(path=path)) - - -def _create_link_from_element( - element_attribs: Dict[str, Optional[str]], - page_url: str, - base_url: str, -) -> Optional[Link]: - """ - Convert an anchor element's attributes in a simple repository page to a Link. - """ - href = element_attribs.get("href") - if not href: - return None - - url = _clean_link(urllib.parse.urljoin(base_url, href)) - pyrequire = element_attribs.get("data-requires-python") - yanked_reason = element_attribs.get("data-yanked") - - link = Link( - url, - comes_from=page_url, - requires_python=pyrequire, - yanked_reason=yanked_reason, - ) - - return link - - class CacheablePageContent: def __init__(self, page: "IndexContent") -> None: assert page.cache_link_parsing @@ -326,25 +235,10 @@ def parse_links(page: "IndexContent") -> Iterable[Link]: if content_type_l.startswith("application/vnd.pypi.simple.v1+json"): data = json.loads(page.content) for file in data.get("files", []): - file_url = file.get("url") - if file_url is None: + link = Link.from_json(file, page.url) + if link is None: continue - - # The Link.yanked_reason expects an empty string instead of a boolean. - yanked_reason = file.get("yanked") - if yanked_reason and not isinstance(yanked_reason, str): - yanked_reason = "" - # The Link.yanked_reason expects None instead of False - elif not yanked_reason: - yanked_reason = None - - yield Link( - _clean_link(urllib.parse.urljoin(page.url, file_url)), - comes_from=page.url, - requires_python=file.get("requires-python"), - yanked_reason=yanked_reason, - hashes=file.get("hashes", {}), - ) + yield link return parser = HTMLLinkParser(page.url) @@ -354,11 +248,7 @@ def parse_links(page: "IndexContent") -> Iterable[Link]: url = page.url base_url = parser.base_url or url for anchor in parser.anchors: - link = _create_link_from_element( - anchor, - page_url=url, - base_url=base_url, - ) + link = Link.from_element(anchor, page_url=url, base_url=base_url) if link is None: continue yield link @@ -443,14 +333,7 @@ def _make_index_content( ) -def _get_index_content( - link: Link, session: Optional[PipSession] = None -) -> Optional["IndexContent"]: - if session is None: - raise TypeError( - "_get_html_page() missing 1 required keyword argument: 'session'" - ) - +def _get_index_content(link: Link, *, session: PipSession) -> Optional["IndexContent"]: url = link.url.split("#", 1)[0] # Check for VCS schemes that do not support lookup as web pages. @@ -559,6 +442,7 @@ class LinkCollector: search_scope = SearchScope.create( find_links=find_links, index_urls=index_urls, + no_index=options.no_index, ) link_collector = LinkCollector( session=session, diff --git a/Python310/Lib/site-packages/pip/_internal/locations/_distutils.py b/Python310/Lib/site-packages/pip/_internal/locations/_distutils.py index fbcb04f..c7712f0 100644 --- a/Python310/Lib/site-packages/pip/_internal/locations/_distutils.py +++ b/Python310/Lib/site-packages/pip/_internal/locations/_distutils.py @@ -35,10 +35,10 @@ logger = logging.getLogger(__name__) def distutils_scheme( dist_name: str, user: bool = False, - home: str = None, - root: str = None, + home: Optional[str] = None, + root: Optional[str] = None, isolated: bool = False, - prefix: str = None, + prefix: Optional[str] = None, *, ignore_config_files: bool = False, ) -> Dict[str, str]: diff --git a/Python310/Lib/site-packages/pip/_internal/metadata/__init__.py b/Python310/Lib/site-packages/pip/_internal/metadata/__init__.py index 8cd0fda..9f73ca7 100644 --- a/Python310/Lib/site-packages/pip/_internal/metadata/__init__.py +++ b/Python310/Lib/site-packages/pip/_internal/metadata/__init__.py @@ -103,3 +103,25 @@ def get_wheel_distribution(wheel: Wheel, canonical_name: str) -> BaseDistributio :param canonical_name: Normalized project name of the given wheel. """ return select_backend().Distribution.from_wheel(wheel, canonical_name) + + +def get_metadata_distribution( + metadata_contents: bytes, + filename: str, + canonical_name: str, +) -> BaseDistribution: + """Get the dist representation of the specified METADATA file contents. + + This returns a Distribution instance from the chosen backend sourced from the data + in `metadata_contents`. + + :param metadata_contents: Contents of a METADATA file within a dist, or one served + via PEP 658. + :param filename: Filename for the dist this metadata represents. + :param canonical_name: Normalized project name of the given dist. + """ + return select_backend().Distribution.from_metadata_file_contents( + metadata_contents, + filename, + canonical_name, + ) diff --git a/Python310/Lib/site-packages/pip/_internal/metadata/base.py b/Python310/Lib/site-packages/pip/_internal/metadata/base.py index 151fd6d..cafb79f 100644 --- a/Python310/Lib/site-packages/pip/_internal/metadata/base.py +++ b/Python310/Lib/site-packages/pip/_internal/metadata/base.py @@ -113,6 +113,24 @@ class BaseDistribution(Protocol): """ raise NotImplementedError() + @classmethod + def from_metadata_file_contents( + cls, + metadata_contents: bytes, + filename: str, + project_name: str, + ) -> "BaseDistribution": + """Load the distribution from the contents of a METADATA file. + + This is used to implement PEP 658 by generating a "shallow" dist object that can + be used for resolution without downloading or building the actual dist yet. + + :param metadata_contents: The contents of a METADATA file. + :param filename: File name for the dist with this metadata. + :param project_name: Name of the project this dist represents. + """ + raise NotImplementedError() + @classmethod def from_wheel(cls, wheel: "Wheel", name: str) -> "BaseDistribution": """Load the distribution from a given wheel. diff --git a/Python310/Lib/site-packages/pip/_internal/metadata/importlib/_compat.py b/Python310/Lib/site-packages/pip/_internal/metadata/importlib/_compat.py index e087980..593bff2 100644 --- a/Python310/Lib/site-packages/pip/_internal/metadata/importlib/_compat.py +++ b/Python310/Lib/site-packages/pip/_internal/metadata/importlib/_compat.py @@ -2,6 +2,15 @@ import importlib.metadata from typing import Any, Optional, Protocol, cast +class BadMetadata(ValueError): + def __init__(self, dist: importlib.metadata.Distribution, *, reason: str) -> None: + self.dist = dist + self.reason = reason + + def __str__(self) -> str: + return f"Bad metadata in {self.dist} ({self.reason})" + + class BasePath(Protocol): """A protocol that various path objects conform. @@ -40,4 +49,7 @@ def get_dist_name(dist: importlib.metadata.Distribution) -> str: The ``name`` attribute is only available in Python 3.10 or later. We are targeting exactly that, but Mypy does not know this. """ - return cast(Any, dist).name + name = cast(Any, dist).name + if not isinstance(name, str): + raise BadMetadata(dist, reason="invalid metadata entry 'name'") + return name diff --git a/Python310/Lib/site-packages/pip/_internal/metadata/importlib/_dists.py b/Python310/Lib/site-packages/pip/_internal/metadata/importlib/_dists.py index fbf9a93..65c043c 100644 --- a/Python310/Lib/site-packages/pip/_internal/metadata/importlib/_dists.py +++ b/Python310/Lib/site-packages/pip/_internal/metadata/importlib/_dists.py @@ -28,6 +28,7 @@ from pip._internal.metadata.base import ( ) from pip._internal.utils.misc import normalize_path from pip._internal.utils.packaging import safe_extra +from pip._internal.utils.temp_dir import TempDirectory from pip._internal.utils.wheel import parse_wheel, read_wheel_metadata_file from ._compat import BasePath, get_dist_name @@ -109,6 +110,23 @@ class Distribution(BaseDistribution): dist = importlib.metadata.Distribution.at(info_location) return cls(dist, info_location, info_location.parent) + @classmethod + def from_metadata_file_contents( + cls, + metadata_contents: bytes, + filename: str, + project_name: str, + ) -> BaseDistribution: + # Generate temp dir to contain the metadata file, and write the file contents. + temp_dir = pathlib.Path( + TempDirectory(kind="metadata", globally_managed=True).path + ) + metadata_path = temp_dir / "METADATA" + metadata_path.write_bytes(metadata_contents) + # Construct dist pointing to the newly created directory. + dist = importlib.metadata.Distribution.at(metadata_path.parent) + return cls(dist, metadata_path.parent, None) + @classmethod def from_wheel(cls, wheel: Wheel, name: str) -> BaseDistribution: try: diff --git a/Python310/Lib/site-packages/pip/_internal/metadata/importlib/_envs.py b/Python310/Lib/site-packages/pip/_internal/metadata/importlib/_envs.py index d5fcfdb..cbec59e 100644 --- a/Python310/Lib/site-packages/pip/_internal/metadata/importlib/_envs.py +++ b/Python310/Lib/site-packages/pip/_internal/metadata/importlib/_envs.py @@ -1,5 +1,6 @@ import functools import importlib.metadata +import logging import os import pathlib import sys @@ -14,9 +15,11 @@ from pip._internal.models.wheel import Wheel from pip._internal.utils.deprecation import deprecated from pip._internal.utils.filetypes import WHEEL_EXTENSION -from ._compat import BasePath, get_dist_name, get_info_location +from ._compat import BadMetadata, BasePath, get_dist_name, get_info_location from ._dists import Distribution +logger = logging.getLogger(__name__) + def _looks_like_wheel(location: str) -> bool: if not location.endswith(WHEEL_EXTENSION): @@ -56,11 +59,16 @@ class _DistributionFinder: # To know exactly where we find a distribution, we have to feed in the # paths one by one, instead of dumping the list to importlib.metadata. for dist in importlib.metadata.distributions(path=[location]): - normalized_name = canonicalize_name(get_dist_name(dist)) + info_location = get_info_location(dist) + try: + raw_name = get_dist_name(dist) + except BadMetadata as e: + logger.warning("Skipping %s due to %s", info_location, e.reason) + continue + normalized_name = canonicalize_name(raw_name) if normalized_name in self._found_names: continue self._found_names.add(normalized_name) - info_location = get_info_location(dist) yield dist, info_location def find(self, location: str) -> Iterator[BaseDistribution]: diff --git a/Python310/Lib/site-packages/pip/_internal/metadata/pkg_resources.py b/Python310/Lib/site-packages/pip/_internal/metadata/pkg_resources.py index bf79ba1..f330ef1 100644 --- a/Python310/Lib/site-packages/pip/_internal/metadata/pkg_resources.py +++ b/Python310/Lib/site-packages/pip/_internal/metadata/pkg_resources.py @@ -33,7 +33,7 @@ class EntryPoint(NamedTuple): group: str -class WheelMetadata: +class InMemoryMetadata: """IMetadataProvider that reads metadata files from a dictionary. This also maps metadata decoding exceptions to our internal exception type. @@ -92,12 +92,29 @@ class Distribution(BaseDistribution): dist = dist_cls(base_dir, project_name=dist_name, metadata=metadata) return cls(dist) + @classmethod + def from_metadata_file_contents( + cls, + metadata_contents: bytes, + filename: str, + project_name: str, + ) -> BaseDistribution: + metadata_dict = { + "METADATA": metadata_contents, + } + dist = pkg_resources.DistInfoDistribution( + location=filename, + metadata=InMemoryMetadata(metadata_dict, filename), + project_name=project_name, + ) + return cls(dist) + @classmethod def from_wheel(cls, wheel: Wheel, name: str) -> BaseDistribution: try: with wheel.as_zipfile() as zf: info_dir, _ = parse_wheel(zf, name) - metadata_text = { + metadata_dict = { path.split("/", 1)[-1]: read_wheel_metadata_file(zf, path) for path in zf.namelist() if path.startswith(f"{info_dir}/") @@ -108,7 +125,7 @@ class Distribution(BaseDistribution): raise UnsupportedWheel(f"{name} has an invalid wheel, {e}") dist = pkg_resources.DistInfoDistribution( location=wheel.location, - metadata=WheelMetadata(metadata_text, wheel.location), + metadata=InMemoryMetadata(metadata_dict, wheel.location), project_name=name, ) return cls(dist) diff --git a/Python310/Lib/site-packages/pip/_internal/models/link.py b/Python310/Lib/site-packages/pip/_internal/models/link.py index 8fd1c3d..c792d12 100644 --- a/Python310/Lib/site-packages/pip/_internal/models/link.py +++ b/Python310/Lib/site-packages/pip/_internal/models/link.py @@ -1,11 +1,14 @@ import functools +import itertools import logging import os import posixpath import re import urllib.parse +from dataclasses import dataclass from typing import ( TYPE_CHECKING, + Any, Dict, List, Mapping, @@ -18,6 +21,7 @@ from typing import ( from pip._internal.utils.filetypes import WHEEL_EXTENSION from pip._internal.utils.hashes import Hashes from pip._internal.utils.misc import ( + pairwise, redact_auth_from_url, split_auth_from_netloc, splitext, @@ -36,6 +40,119 @@ logger = logging.getLogger(__name__) _SUPPORTED_HASHES = ("sha512", "sha384", "sha256", "sha224", "sha1", "md5") +@dataclass(frozen=True) +class LinkHash: + """Links to content may have embedded hash values. This class parses those. + + `name` must be any member of `_SUPPORTED_HASHES`. + + This class can be converted to and from `ArchiveInfo`. While ArchiveInfo intends to + be JSON-serializable to conform to PEP 610, this class contains the logic for + parsing a hash name and value for correctness, and then checking whether that hash + conforms to a schema with `.is_hash_allowed()`.""" + + name: str + value: str + + _hash_re = re.compile( + # NB: we do not validate that the second group (.*) is a valid hex + # digest. Instead, we simply keep that string in this class, and then check it + # against Hashes when hash-checking is needed. This is easier to debug than + # proactively discarding an invalid hex digest, as we handle incorrect hashes + # and malformed hashes in the same place. + r"({choices})=(.*)".format( + choices="|".join(re.escape(hash_name) for hash_name in _SUPPORTED_HASHES) + ), + ) + + def __post_init__(self) -> None: + assert self._hash_re.match(f"{self.name}={self.value}") + + @classmethod + @functools.lru_cache(maxsize=None) + def split_hash_name_and_value(cls, url: str) -> Optional["LinkHash"]: + """Search a string for a checksum algorithm name and encoded output value.""" + match = cls._hash_re.search(url) + if match is None: + return None + name, value = match.groups() + return cls(name=name, value=value) + + def as_hashes(self) -> Hashes: + """Return a Hashes instance which checks only for the current hash.""" + return Hashes({self.name: [self.value]}) + + def is_hash_allowed(self, hashes: Optional[Hashes]) -> bool: + """ + Return True if the current hash is allowed by `hashes`. + """ + if hashes is None: + return False + return hashes.is_hash_allowed(self.name, hex_digest=self.value) + + +def _clean_url_path_part(part: str) -> str: + """ + Clean a "part" of a URL path (i.e. after splitting on "@" characters). + """ + # We unquote prior to quoting to make sure nothing is double quoted. + return urllib.parse.quote(urllib.parse.unquote(part)) + + +def _clean_file_url_path(part: str) -> str: + """ + Clean the first part of a URL path that corresponds to a local + filesystem path (i.e. the first part after splitting on "@" characters). + """ + # We unquote prior to quoting to make sure nothing is double quoted. + # Also, on Windows the path part might contain a drive letter which + # should not be quoted. On Linux where drive letters do not + # exist, the colon should be quoted. We rely on urllib.request + # to do the right thing here. + return urllib.request.pathname2url(urllib.request.url2pathname(part)) + + +# percent-encoded: / +_reserved_chars_re = re.compile("(@|%2F)", re.IGNORECASE) + + +def _clean_url_path(path: str, is_local_path: bool) -> str: + """ + Clean the path portion of a URL. + """ + if is_local_path: + clean_func = _clean_file_url_path + else: + clean_func = _clean_url_path_part + + # Split on the reserved characters prior to cleaning so that + # revision strings in VCS URLs are properly preserved. + parts = _reserved_chars_re.split(path) + + cleaned_parts = [] + for to_clean, reserved in pairwise(itertools.chain(parts, [""])): + cleaned_parts.append(clean_func(to_clean)) + # Normalize %xx escapes (e.g. %2f -> %2F) + cleaned_parts.append(reserved.upper()) + + return "".join(cleaned_parts) + + +def _ensure_quoted_url(url: str) -> str: + """ + Make sure a link is fully quoted. + For example, if ' ' occurs in the URL, it will be replaced with "%20", + and without double-quoting other characters. + """ + # Split the URL into parts according to the general structure + # `scheme://netloc/path;parameters?query#fragment`. + result = urllib.parse.urlparse(url) + # If the netloc is empty, then the URL refers to a local filesystem path. + is_local_path = not result.netloc + path = _clean_url_path(result.path, is_local_path=is_local_path) + return urllib.parse.urlunparse(result._replace(path=path)) + + class Link(KeyBasedCompareMixin): """Represents a parsed link from a Package Index's simple URL""" @@ -46,6 +163,8 @@ class Link(KeyBasedCompareMixin): "comes_from", "requires_python", "yanked_reason", + "dist_info_metadata", + "link_hash", "cache_link_parsing", ] @@ -55,6 +174,8 @@ class Link(KeyBasedCompareMixin): comes_from: Optional[Union[str, "IndexContent"]] = None, requires_python: Optional[str] = None, yanked_reason: Optional[str] = None, + dist_info_metadata: Optional[str] = None, + link_hash: Optional[LinkHash] = None, cache_link_parsing: bool = True, hashes: Optional[Mapping[str, str]] = None, ) -> None: @@ -72,6 +193,14 @@ class Link(KeyBasedCompareMixin): a simple repository HTML link. If the file has been yanked but no reason was provided, this should be the empty string. See PEP 592 for more information and the specification. + :param dist_info_metadata: the metadata attached to the file, or None if no such + metadata is provided. This is the value of the "data-dist-info-metadata" + attribute, if present, in a simple repository HTML link. This may be parsed + into its own `Link` by `self.metadata_link()`. See PEP 658 for more + information and the specification. + :param link_hash: a checksum for the content the link points to. If not + provided, this will be extracted from the link URL, if the URL has + any checksum. :param cache_link_parsing: A flag that is used elsewhere to determine whether resources retrieved from this link should be cached. PyPI index urls should @@ -94,11 +223,75 @@ class Link(KeyBasedCompareMixin): self.comes_from = comes_from self.requires_python = requires_python if requires_python else None self.yanked_reason = yanked_reason + self.dist_info_metadata = dist_info_metadata + self.link_hash = link_hash or LinkHash.split_hash_name_and_value(self._url) super().__init__(key=url, defining_class=Link) self.cache_link_parsing = cache_link_parsing + @classmethod + def from_json( + cls, + file_data: Dict[str, Any], + page_url: str, + ) -> Optional["Link"]: + """ + Convert an pypi json document from a simple repository page into a Link. + """ + file_url = file_data.get("url") + if file_url is None: + return None + + url = _ensure_quoted_url(urllib.parse.urljoin(page_url, file_url)) + pyrequire = file_data.get("requires-python") + yanked_reason = file_data.get("yanked") + dist_info_metadata = file_data.get("dist-info-metadata") + hashes = file_data.get("hashes", {}) + + # The Link.yanked_reason expects an empty string instead of a boolean. + if yanked_reason and not isinstance(yanked_reason, str): + yanked_reason = "" + # The Link.yanked_reason expects None instead of False. + elif not yanked_reason: + yanked_reason = None + + return cls( + url, + comes_from=page_url, + requires_python=pyrequire, + yanked_reason=yanked_reason, + hashes=hashes, + dist_info_metadata=dist_info_metadata, + ) + + @classmethod + def from_element( + cls, + anchor_attribs: Dict[str, Optional[str]], + page_url: str, + base_url: str, + ) -> Optional["Link"]: + """ + Convert an anchor element's attributes in a simple repository page to a Link. + """ + href = anchor_attribs.get("href") + if not href: + return None + + url = _ensure_quoted_url(urllib.parse.urljoin(base_url, href)) + pyrequire = anchor_attribs.get("data-requires-python") + yanked_reason = anchor_attribs.get("data-yanked") + dist_info_metadata = anchor_attribs.get("data-dist-info-metadata") + + return cls( + url, + comes_from=page_url, + requires_python=pyrequire, + yanked_reason=yanked_reason, + dist_info_metadata=dist_info_metadata, + ) + def __str__(self) -> str: if self.requires_python: rp = f" (requires-python:{self.requires_python})" @@ -181,32 +374,36 @@ class Link(KeyBasedCompareMixin): return None return match.group(1) - _hash_re = re.compile( - r"({choices})=([a-f0-9]+)".format(choices="|".join(_SUPPORTED_HASHES)) - ) + def metadata_link(self) -> Optional["Link"]: + """Implementation of PEP 658 parsing.""" + # Note that Link.from_element() parsing the "data-dist-info-metadata" attribute + # from an HTML anchor tag is typically how the Link.dist_info_metadata attribute + # gets set. + if self.dist_info_metadata is None: + return None + metadata_url = f"{self.url_without_fragment}.metadata" + link_hash: Optional[LinkHash] = None + # If data-dist-info-metadata="true" is set, then the metadata file exists, + # but there is no information about its checksum or anything else. + if self.dist_info_metadata != "true": + link_hash = LinkHash.split_hash_name_and_value(self.dist_info_metadata) + return Link(metadata_url, link_hash=link_hash) + + def as_hashes(self) -> Optional[Hashes]: + if self.link_hash is not None: + return self.link_hash.as_hashes() + return None @property def hash(self) -> Optional[str]: - for hashname in _SUPPORTED_HASHES: - if hashname in self._hashes: - return self._hashes[hashname] - - match = self._hash_re.search(self._url) - if match: - return match.group(2) - + if self.link_hash is not None: + return self.link_hash.value return None @property def hash_name(self) -> Optional[str]: - for hashname in _SUPPORTED_HASHES: - if hashname in self._hashes: - return hashname - - match = self._hash_re.search(self._url) - if match: - return match.group(1) - + if self.link_hash is not None: + return self.link_hash.name return None @property @@ -236,19 +433,15 @@ class Link(KeyBasedCompareMixin): @property def has_hash(self) -> bool: - return self.hash_name is not None + return self.link_hash is not None def is_hash_allowed(self, hashes: Optional[Hashes]) -> bool: """ - Return True if the link has a hash and it is allowed. + Return True if the link has a hash and it is allowed by `hashes`. """ - if hashes is None or not self.has_hash: + if self.link_hash is None: return False - # Assert non-None so mypy knows self.hash_name and self.hash are str. - assert self.hash_name is not None - assert self.hash is not None - - return hashes.is_hash_allowed(self.hash_name, hex_digest=self.hash) + return self.link_hash.is_hash_allowed(hashes) class _CleanResult(NamedTuple): diff --git a/Python310/Lib/site-packages/pip/_internal/models/search_scope.py b/Python310/Lib/site-packages/pip/_internal/models/search_scope.py index e4e54c2..a64af73 100644 --- a/Python310/Lib/site-packages/pip/_internal/models/search_scope.py +++ b/Python310/Lib/site-packages/pip/_internal/models/search_scope.py @@ -20,13 +20,14 @@ class SearchScope: Encapsulates the locations that pip is configured to search. """ - __slots__ = ["find_links", "index_urls"] + __slots__ = ["find_links", "index_urls", "no_index"] @classmethod def create( cls, find_links: List[str], index_urls: List[str], + no_index: bool, ) -> "SearchScope": """ Create a SearchScope object after normalizing the `find_links`. @@ -60,15 +61,18 @@ class SearchScope: return cls( find_links=built_find_links, index_urls=index_urls, + no_index=no_index, ) def __init__( self, find_links: List[str], index_urls: List[str], + no_index: bool, ) -> None: self.find_links = find_links self.index_urls = index_urls + self.no_index = no_index def get_formatted_locations(self) -> str: lines = [] diff --git a/Python310/Lib/site-packages/pip/_internal/models/wheel.py b/Python310/Lib/site-packages/pip/_internal/models/wheel.py index 35c7037..a5dc12b 100644 --- a/Python310/Lib/site-packages/pip/_internal/models/wheel.py +++ b/Python310/Lib/site-packages/pip/_internal/models/wheel.py @@ -13,8 +13,8 @@ class Wheel: """A wheel file""" wheel_file_re = re.compile( - r"""^(?P(?P.+?)-(?P.*?)) - ((-(?P\d[^-]*?))?-(?P.+?)-(?P.+?)-(?P.+?) + r"""^(?P(?P[^\s-]+?)-(?P[^\s-]*?)) + ((-(?P\d[^-]*?))?-(?P[^\s-]+?)-(?P[^\s-]+?)-(?P[^\s-]+?) \.whl|\.dist-info)$""", re.VERBOSE, ) diff --git a/Python310/Lib/site-packages/pip/_internal/network/lazy_wheel.py b/Python310/Lib/site-packages/pip/_internal/network/lazy_wheel.py index 2d1ddaa..854a6fa 100644 --- a/Python310/Lib/site-packages/pip/_internal/network/lazy_wheel.py +++ b/Python310/Lib/site-packages/pip/_internal/network/lazy_wheel.py @@ -23,7 +23,7 @@ class HTTPRangeRequestUnsupported(Exception): def dist_from_wheel_url(name: str, url: str, session: PipSession) -> BaseDistribution: """Return a distribution object from the given wheel URL. - This uses HTTP range requests to only fetch the potion of the wheel + This uses HTTP range requests to only fetch the portion of the wheel containing metadata, just enough for the object to be constructed. If such requests are not supported, HTTPRangeRequestUnsupported is raised. diff --git a/Python310/Lib/site-packages/pip/_internal/operations/install/wheel.py b/Python310/Lib/site-packages/pip/_internal/operations/install/wheel.py index 1af8978..1650d59 100644 --- a/Python310/Lib/site-packages/pip/_internal/operations/install/wheel.py +++ b/Python310/Lib/site-packages/pip/_internal/operations/install/wheel.py @@ -420,7 +420,9 @@ def _raise_for_invalid_entrypoint(specification: str) -> None: class PipScriptMaker(ScriptMaker): - def make(self, specification: str, options: Dict[str, Any] = None) -> List[str]: + def make( + self, specification: str, options: Optional[Dict[str, Any]] = None + ) -> List[str]: _raise_for_invalid_entrypoint(specification) return super().make(specification, options) diff --git a/Python310/Lib/site-packages/pip/_internal/operations/prepare.py b/Python310/Lib/site-packages/pip/_internal/operations/prepare.py index 80723ff..4bf414c 100644 --- a/Python310/Lib/site-packages/pip/_internal/operations/prepare.py +++ b/Python310/Lib/site-packages/pip/_internal/operations/prepare.py @@ -19,12 +19,13 @@ from pip._internal.exceptions import ( HashMismatch, HashUnpinned, InstallationError, + MetadataInconsistent, NetworkConnectionError, PreviousBuildDirError, VcsHashUnsupported, ) from pip._internal.index.package_finder import PackageFinder -from pip._internal.metadata import BaseDistribution +from pip._internal.metadata import BaseDistribution, get_metadata_distribution from pip._internal.models.direct_url import ArchiveInfo from pip._internal.models.link import Link from pip._internal.models.wheel import Wheel @@ -346,19 +347,72 @@ class RequirementPreparer: # showing the user what the hash should be. return req.hashes(trust_internet=False) or MissingHashes() + def _fetch_metadata_only( + self, + req: InstallRequirement, + ) -> Optional[BaseDistribution]: + if self.require_hashes: + logger.debug( + "Metadata-only fetching is not used as hash checking is required", + ) + return None + # Try PEP 658 metadata first, then fall back to lazy wheel if unavailable. + return self._fetch_metadata_using_link_data_attr( + req + ) or self._fetch_metadata_using_lazy_wheel(req.link) + + def _fetch_metadata_using_link_data_attr( + self, + req: InstallRequirement, + ) -> Optional[BaseDistribution]: + """Fetch metadata from the data-dist-info-metadata attribute, if possible.""" + # (1) Get the link to the metadata file, if provided by the backend. + metadata_link = req.link.metadata_link() + if metadata_link is None: + return None + assert req.req is not None + logger.info( + "Obtaining dependency information for %s from %s", + req.req, + metadata_link, + ) + # (2) Download the contents of the METADATA file, separate from the dist itself. + metadata_file = get_http_url( + metadata_link, + self._download, + hashes=metadata_link.as_hashes(), + ) + with open(metadata_file.path, "rb") as f: + metadata_contents = f.read() + # (3) Generate a dist just from those file contents. + metadata_dist = get_metadata_distribution( + metadata_contents, + req.link.filename, + req.req.name, + ) + # (4) Ensure the Name: field from the METADATA file matches the name from the + # install requirement. + # + # NB: raw_name will fall back to the name from the install requirement if + # the Name: field is not present, but it's noted in the raw_name docstring + # that that should NEVER happen anyway. + if metadata_dist.raw_name != req.req.name: + raise MetadataInconsistent( + req, "Name", req.req.name, metadata_dist.raw_name + ) + return metadata_dist + def _fetch_metadata_using_lazy_wheel( self, link: Link, ) -> Optional[BaseDistribution]: """Fetch metadata using lazy wheel, if possible.""" + # --use-feature=fast-deps must be provided. if not self.use_lazy_wheel: return None - if self.require_hashes: - logger.debug("Lazy wheel is not used as hash checking is required") - return None if link.is_file or not link.is_wheel: logger.debug( - "Lazy wheel is not used as %r does not points to a remote wheel", + "Lazy wheel is not used as %r does not point to a remote wheel", link, ) return None @@ -414,13 +468,12 @@ class RequirementPreparer: ) -> BaseDistribution: """Prepare a requirement to be obtained from req.link.""" assert req.link - link = req.link self._log_preparing_link(req) with indent_log(): # Check if the relevant file is already available # in the download directory file_path = None - if self.download_dir is not None and link.is_wheel: + if self.download_dir is not None and req.link.is_wheel: hashes = self._get_linked_req_hashes(req) file_path = _check_download_dir(req.link, self.download_dir, hashes) @@ -429,10 +482,10 @@ class RequirementPreparer: self._downloaded[req.link.url] = file_path else: # The file is not available, attempt to fetch only metadata - wheel_dist = self._fetch_metadata_using_lazy_wheel(link) - if wheel_dist is not None: + metadata_dist = self._fetch_metadata_only(req) + if metadata_dist is not None: req.needs_more_preparation = True - return wheel_dist + return metadata_dist # None of the optimizations worked, fully prepare the requirement return self._prepare_linked_requirement(req, parallel_builds) diff --git a/Python310/Lib/site-packages/pip/_internal/req/req_file.py b/Python310/Lib/site-packages/pip/_internal/req/req_file.py index 4550c72..11ec699 100644 --- a/Python310/Lib/site-packages/pip/_internal/req/req_file.py +++ b/Python310/Lib/site-packages/pip/_internal/req/req_file.py @@ -186,10 +186,6 @@ def handle_requirement_line( constraint=line.constraint, ) else: - if options: - # Disable wheels if the user has specified build options - cmdoptions.check_install_build_global(options, line.opts) - # get the options that apply to requirements req_options = {} for dest in SUPPORTED_OPTIONS_REQ_DEST: @@ -229,11 +225,13 @@ def handle_option_line( if finder: find_links = finder.find_links index_urls = finder.index_urls - if opts.index_url: - index_urls = [opts.index_url] + no_index = finder.search_scope.no_index if opts.no_index is True: + no_index = True index_urls = [] - if opts.extra_index_urls: + if opts.index_url and not no_index: + index_urls = [opts.index_url] + if opts.extra_index_urls and not no_index: index_urls.extend(opts.extra_index_urls) if opts.find_links: # FIXME: it would be nice to keep track of the source @@ -253,6 +251,7 @@ def handle_option_line( search_scope = SearchScope( find_links=find_links, index_urls=index_urls, + no_index=no_index, ) finder.search_scope = search_scope @@ -394,7 +393,12 @@ def get_line_parser(finder: Optional["PackageFinder"]) -> LineParser: args_str, options_str = break_args_options(line) - opts, _ = parser.parse_args(shlex.split(options_str), defaults) + try: + options = shlex.split(options_str) + except ValueError as e: + raise OptionParsingError(f"Could not split options: {options_str}") from e + + opts, _ = parser.parse_args(options, defaults) return args_str, opts diff --git a/Python310/Lib/site-packages/pip/_internal/req/req_install.py b/Python310/Lib/site-packages/pip/_internal/req/req_install.py index a1e376c..5f29261 100644 --- a/Python310/Lib/site-packages/pip/_internal/req/req_install.py +++ b/Python310/Lib/site-packages/pip/_internal/req/req_install.py @@ -8,6 +8,8 @@ import shutil import sys import uuid import zipfile +from enum import Enum +from optparse import Values from typing import Any, Collection, Dict, Iterable, List, Optional, Sequence, Union from pip._vendor.packaging.markers import Marker @@ -42,7 +44,7 @@ from pip._internal.operations.install.legacy import install as install_legacy from pip._internal.operations.install.wheel import install_wheel from pip._internal.pyproject import load_pyproject_toml, make_pyproject_path from pip._internal.req.req_uninstall import UninstallPathSet -from pip._internal.utils.deprecation import deprecated +from pip._internal.utils.deprecation import LegacyInstallReason, deprecated from pip._internal.utils.direct_url_helpers import ( direct_url_for_editable, direct_url_from_link, @@ -96,7 +98,7 @@ class InstallRequirement: self.constraint = constraint self.editable = editable self.permit_editable_wheels = permit_editable_wheels - self.legacy_install_reason: Optional[int] = None + self.legacy_install_reason: Optional[LegacyInstallReason] = None # source_dir is the local directory where the linked requirement is # located, or unpacked. In case unpacking is needed, creating and @@ -811,6 +813,11 @@ class InstallRequirement: install_options = list(install_options) + self.install_options try: + if ( + self.legacy_install_reason is not None + and self.legacy_install_reason.emit_before_install + ): + self.legacy_install_reason.emit_deprecation(self.name) success = install_legacy( install_options=install_options, global_options=global_options, @@ -836,18 +843,12 @@ class InstallRequirement: self.install_succeeded = success - if success and self.legacy_install_reason == 8368: - deprecated( - reason=( - "{} was installed using the legacy 'setup.py install' " - "method, because a wheel could not be built for it.".format( - self.name - ) - ), - replacement="to fix the wheel build issue reported above", - gone_in=None, - issue=8368, - ) + if ( + success + and self.legacy_install_reason is not None + and self.legacy_install_reason.emit_after_success + ): + self.legacy_install_reason.emit_deprecation(self.name) def check_invalid_constraint_type(req: InstallRequirement) -> str: @@ -877,3 +878,65 @@ def check_invalid_constraint_type(req: InstallRequirement) -> str: ) return problem + + +def _has_option(options: Values, reqs: List[InstallRequirement], option: str) -> bool: + if getattr(options, option, None): + return True + for req in reqs: + if getattr(req, option, None): + return True + return False + + +def _install_option_ignored( + install_options: List[str], reqs: List[InstallRequirement] +) -> bool: + for req in reqs: + if (install_options or req.install_options) and not req.use_pep517: + return False + return True + + +class LegacySetupPyOptionsCheckMode(Enum): + INSTALL = 1 + WHEEL = 2 + DOWNLOAD = 3 + + +def check_legacy_setup_py_options( + options: Values, + reqs: List[InstallRequirement], + mode: LegacySetupPyOptionsCheckMode, +) -> None: + has_install_options = _has_option(options, reqs, "install_options") + has_build_options = _has_option(options, reqs, "build_options") + has_global_options = _has_option(options, reqs, "global_options") + legacy_setup_py_options_present = ( + has_install_options or has_build_options or has_global_options + ) + if not legacy_setup_py_options_present: + return + + options.format_control.disallow_binaries() + logger.warning( + "Implying --no-binary=:all: due to the presence of " + "--build-option / --global-option / --install-option. " + "Consider using --config-settings for more flexibility.", + ) + if mode == LegacySetupPyOptionsCheckMode.INSTALL and has_install_options: + if _install_option_ignored(options.install_options, reqs): + logger.warning( + "Ignoring --install-option when building using PEP 517", + ) + else: + deprecated( + reason=( + "--install-option is deprecated because " + "it forces pip to use the 'setup.py install' " + "command which is itself deprecated." + ), + issue=11358, + replacement="to use --config-settings", + gone_in="23.1", + ) diff --git a/Python310/Lib/site-packages/pip/_internal/utils/deprecation.py b/Python310/Lib/site-packages/pip/_internal/utils/deprecation.py index 72bd6f2..18e9be9 100644 --- a/Python310/Lib/site-packages/pip/_internal/utils/deprecation.py +++ b/Python310/Lib/site-packages/pip/_internal/utils/deprecation.py @@ -118,3 +118,71 @@ def deprecated( raise PipDeprecationWarning(message) warnings.warn(message, category=PipDeprecationWarning, stacklevel=2) + + +class LegacyInstallReason: + def __init__( + self, + reason: str, + replacement: Optional[str] = None, + gone_in: Optional[str] = None, + feature_flag: Optional[str] = None, + issue: Optional[int] = None, + emit_after_success: bool = False, + emit_before_install: bool = False, + ): + self._reason = reason + self._replacement = replacement + self._gone_in = gone_in + self._feature_flag = feature_flag + self._issue = issue + self.emit_after_success = emit_after_success + self.emit_before_install = emit_before_install + + def emit_deprecation(self, name: str) -> None: + deprecated( + reason=self._reason.format(name=name), + replacement=self._replacement, + gone_in=self._gone_in, + feature_flag=self._feature_flag, + issue=self._issue, + ) + + +LegacyInstallReasonFailedBdistWheel = LegacyInstallReason( + reason=( + "{name} was installed using the legacy 'setup.py install' " + "method, because a wheel could not be built for it." + ), + replacement="to fix the wheel build issue reported above", + gone_in="23.1", + issue=8368, + emit_after_success=True, +) + + +LegacyInstallReasonMissingWheelPackage = LegacyInstallReason( + reason=( + "{name} is being installed using the legacy " + "'setup.py install' method, because it does not have a " + "'pyproject.toml' and the 'wheel' package " + "is not installed." + ), + replacement="to enable the '--use-pep517' option", + gone_in="23.1", + issue=8559, + emit_before_install=True, +) + +LegacyInstallReasonNoBinaryForcesSetuptoolsInstall = LegacyInstallReason( + reason=( + "{name} is being installed using the legacy " + "'setup.py install' method, because the '--no-binary' option was enabled " + "for it and this currently disables local wheel building for projects that " + "don't have a 'pyproject.toml' file." + ), + replacement="to enable the '--use-pep517' option", + gone_in="23.1", + issue=11451, + emit_before_install=True, +) diff --git a/Python310/Lib/site-packages/pip/_internal/utils/entrypoints.py b/Python310/Lib/site-packages/pip/_internal/utils/entrypoints.py index f292c64..1501369 100644 --- a/Python310/Lib/site-packages/pip/_internal/utils/entrypoints.py +++ b/Python310/Lib/site-packages/pip/_internal/utils/entrypoints.py @@ -55,9 +55,14 @@ def get_best_invocation_for_this_pip() -> str: if exe_are_in_PATH: for exe_name in _EXECUTABLE_NAMES: found_executable = shutil.which(exe_name) - if found_executable and os.path.samefile( - found_executable, - os.path.join(binary_prefix, exe_name), + binary_executable = os.path.join(binary_prefix, exe_name) + if ( + found_executable + and os.path.exists(binary_executable) + and os.path.samefile( + found_executable, + binary_executable, + ) ): return exe_name diff --git a/Python310/Lib/site-packages/pip/_internal/utils/hashes.py b/Python310/Lib/site-packages/pip/_internal/utils/hashes.py index 0c1af32..7672730 100644 --- a/Python310/Lib/site-packages/pip/_internal/utils/hashes.py +++ b/Python310/Lib/site-packages/pip/_internal/utils/hashes.py @@ -1,5 +1,5 @@ import hashlib -from typing import TYPE_CHECKING, BinaryIO, Dict, Iterable, List +from typing import TYPE_CHECKING, BinaryIO, Dict, Iterable, List, Optional from pip._internal.exceptions import HashMismatch, HashMissing, InstallationError from pip._internal.utils.misc import read_chunks @@ -28,7 +28,7 @@ class Hashes: """ - def __init__(self, hashes: Dict[str, List[str]] = None) -> None: + def __init__(self, hashes: Optional[Dict[str, List[str]]] = None) -> None: """ :param hashes: A dict of algorithm names pointing to lists of allowed hex digests diff --git a/Python310/Lib/site-packages/pip/_internal/utils/setuptools_build.py b/Python310/Lib/site-packages/pip/_internal/utils/setuptools_build.py index f460c40..01ef4a4 100644 --- a/Python310/Lib/site-packages/pip/_internal/utils/setuptools_build.py +++ b/Python310/Lib/site-packages/pip/_internal/utils/setuptools_build.py @@ -48,7 +48,7 @@ _SETUPTOOLS_SHIM = textwrap.dedent( def make_setuptools_shim_args( setup_py_path: str, - global_options: Sequence[str] = None, + global_options: Optional[Sequence[str]] = None, no_user_config: bool = False, unbuffered_output: bool = False, ) -> List[str]: diff --git a/Python310/Lib/site-packages/pip/_internal/vcs/bazaar.py b/Python310/Lib/site-packages/pip/_internal/vcs/bazaar.py index a7b16e2..06c80e4 100644 --- a/Python310/Lib/site-packages/pip/_internal/vcs/bazaar.py +++ b/Python310/Lib/site-packages/pip/_internal/vcs/bazaar.py @@ -49,14 +49,25 @@ class Bazaar(VersionControl): flag = "" else: flag = f"-{'v'*verbosity}" - cmd_args = make_command("branch", flag, rev_options.to_args(), url, dest) + cmd_args = make_command( + "checkout", "--lightweight", flag, rev_options.to_args(), url, dest + ) self.run_command(cmd_args) def switch(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None: self.run_command(make_command("switch", url), cwd=dest) def update(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None: - cmd_args = make_command("pull", "-q", rev_options.to_args()) + output = self.run_command( + make_command("info"), show_stdout=False, stdout_only=True, cwd=dest + ) + if output.startswith("Standalone "): + # Older versions of pip used to create standalone branches. + # Convert the standalone branch to a checkout by calling "bzr bind". + cmd_args = make_command("bind", "-q", url) + self.run_command(cmd_args, cwd=dest) + + cmd_args = make_command("update", "-q", rev_options.to_args()) self.run_command(cmd_args, cwd=dest) @classmethod diff --git a/Python310/Lib/site-packages/pip/_internal/vcs/subversion.py b/Python310/Lib/site-packages/pip/_internal/vcs/subversion.py index 89c8754..2cd6f0a 100644 --- a/Python310/Lib/site-packages/pip/_internal/vcs/subversion.py +++ b/Python310/Lib/site-packages/pip/_internal/vcs/subversion.py @@ -184,7 +184,7 @@ class Subversion(VersionControl): """Always assume the versions don't match""" return False - def __init__(self, use_interactive: bool = None) -> None: + def __init__(self, use_interactive: Optional[bool] = None) -> None: if use_interactive is None: use_interactive = is_console_interactive() self.use_interactive = use_interactive diff --git a/Python310/Lib/site-packages/pip/_internal/wheel_builder.py b/Python310/Lib/site-packages/pip/_internal/wheel_builder.py index 77a17ff..15b30af 100644 --- a/Python310/Lib/site-packages/pip/_internal/wheel_builder.py +++ b/Python310/Lib/site-packages/pip/_internal/wheel_builder.py @@ -5,7 +5,7 @@ import logging import os.path import re import shutil -from typing import Any, Callable, Iterable, List, Optional, Tuple +from typing import Callable, Iterable, List, Optional, Tuple from pip._vendor.packaging.utils import canonicalize_name, canonicalize_version from pip._vendor.packaging.version import InvalidVersion, Version @@ -19,6 +19,10 @@ from pip._internal.operations.build.wheel import build_wheel_pep517 from pip._internal.operations.build.wheel_editable import build_wheel_editable from pip._internal.operations.build.wheel_legacy import build_wheel_legacy from pip._internal.req.req_install import InstallRequirement +from pip._internal.utils.deprecation import ( + LegacyInstallReasonMissingWheelPackage, + LegacyInstallReasonNoBinaryForcesSetuptoolsInstall, +) from pip._internal.utils.logging import indent_log from pip._internal.utils.misc import ensure_dir, hash_file, is_wheel_installed from pip._internal.utils.setuptools_build import make_setuptools_clean_args @@ -31,7 +35,7 @@ logger = logging.getLogger(__name__) _egg_info_re = re.compile(r"([a-z0-9_.]+)-([a-z0-9_.!+-]+)", re.IGNORECASE) -BinaryAllowedPredicate = Callable[[InstallRequirement], bool] +BdistWheelAllowedPredicate = Callable[[InstallRequirement], bool] BuildResult = Tuple[List[InstallRequirement], List[InstallRequirement]] @@ -46,7 +50,7 @@ def _contains_egg_info(s: str) -> bool: def _should_build( req: InstallRequirement, need_wheel: bool, - check_binary_allowed: BinaryAllowedPredicate, + check_bdist_wheel: Optional[BdistWheelAllowedPredicate] = None, ) -> bool: """Return whether an InstallRequirement should be built into a wheel.""" if req.constraint: @@ -77,20 +81,19 @@ def _should_build( if req.use_pep517: return True - if not check_binary_allowed(req): - logger.info( - "Skipping wheel build for %s, due to binaries being disabled for it.", - req.name, - ) + assert check_bdist_wheel is not None + if not check_bdist_wheel(req): + # /!\ When we change this to unconditionally return True, we must also remove + # support for `--install-option`. Indeed, `--install-option` implies + # `--no-binary` so we can return False here and run `setup.py install`. + # `--global-option` and `--build-option` can remain until we drop support for + # building with `setup.py bdist_wheel`. + req.legacy_install_reason = LegacyInstallReasonNoBinaryForcesSetuptoolsInstall return False if not is_wheel_installed(): # we don't build legacy requirements if wheel is not installed - logger.info( - "Using legacy 'setup.py install' for %s, " - "since package 'wheel' is not installed.", - req.name, - ) + req.legacy_install_reason = LegacyInstallReasonMissingWheelPackage return False return True @@ -99,15 +102,15 @@ def _should_build( def should_build_for_wheel_command( req: InstallRequirement, ) -> bool: - return _should_build(req, need_wheel=True, check_binary_allowed=_always_true) + return _should_build(req, need_wheel=True) def should_build_for_install_command( req: InstallRequirement, - check_binary_allowed: BinaryAllowedPredicate, + check_bdist_wheel_allowed: BdistWheelAllowedPredicate, ) -> bool: return _should_build( - req, need_wheel=False, check_binary_allowed=check_binary_allowed + req, need_wheel=False, check_bdist_wheel=check_bdist_wheel_allowed ) @@ -159,10 +162,6 @@ def _get_cache_dir( return cache_dir -def _always_true(_: Any) -> bool: - return True - - def _verify_one(req: InstallRequirement, wheel_path: str) -> None: canonical_name = canonicalize_name(req.name or "") w = Wheel(os.path.basename(wheel_path)) diff --git a/Python310/Lib/site-packages/pip/_vendor/certifi/__init__.py b/Python310/Lib/site-packages/pip/_vendor/certifi/__init__.py index bdeb06b..af4bcc1 100644 --- a/Python310/Lib/site-packages/pip/_vendor/certifi/__init__.py +++ b/Python310/Lib/site-packages/pip/_vendor/certifi/__init__.py @@ -1,4 +1,4 @@ from .core import contents, where __all__ = ["contents", "where"] -__version__ = "2022.06.15" +__version__ = "2022.09.24" diff --git a/Python310/Lib/site-packages/pip/_vendor/certifi/cacert.pem b/Python310/Lib/site-packages/pip/_vendor/certifi/cacert.pem index ee9be4c..4005155 100644 --- a/Python310/Lib/site-packages/pip/_vendor/certifi/cacert.pem +++ b/Python310/Lib/site-packages/pip/_vendor/certifi/cacert.pem @@ -1323,45 +1323,6 @@ t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 -----END CERTIFICATE----- -# Issuer: CN=EC-ACC O=Agencia Catalana de Certificacio (NIF Q-0801176-I) OU=Serveis Publics de Certificacio/Vegeu https://www.catcert.net/verarrel (c)03/Jerarquia Entitats de Certificacio Catalanes -# Subject: CN=EC-ACC O=Agencia Catalana de Certificacio (NIF Q-0801176-I) OU=Serveis Publics de Certificacio/Vegeu https://www.catcert.net/verarrel (c)03/Jerarquia Entitats de Certificacio Catalanes -# Label: "EC-ACC" -# Serial: -23701579247955709139626555126524820479 -# MD5 Fingerprint: eb:f5:9d:29:0d:61:f9:42:1f:7c:c2:ba:6d:e3:15:09 -# SHA1 Fingerprint: 28:90:3a:63:5b:52:80:fa:e6:77:4c:0b:6d:a7:d6:ba:a6:4a:f2:e8 -# SHA256 Fingerprint: 88:49:7f:01:60:2f:31:54:24:6a:e2:8c:4d:5a:ef:10:f1:d8:7e:bb:76:62:6f:4a:e0:b7:f9:5b:a7:96:87:99 ------BEGIN CERTIFICATE----- -MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB -8zELMAkGA1UEBhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2Vy -dGlmaWNhY2lvIChOSUYgUS0wODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1 -YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYDVQQLEyxWZWdldSBodHRwczovL3d3 -dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UECxMsSmVyYXJxdWlh -IEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMTBkVD -LUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQG -EwJFUzE7MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8g -KE5JRiBRLTA4MDExNzYtSSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBD -ZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZlZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQu -bmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJhcnF1aWEgRW50aXRhdHMg -ZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUNDMIIBIjAN -BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R -85iKw5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm -4CgPukLjbo73FCeTae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaV -HMf5NLWUhdWZXqBIoH7nF2W4onW4HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNd -QlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0aE9jD2z3Il3rucO2n5nzbcc8t -lGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw0JDnJwIDAQAB -o4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4 -opvpXY0wfwYDVR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBo -dHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidW -ZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAwDQYJKoZIhvcN -AQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJlF7W2u++AVtd0x7Y -/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNaAl6k -SBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhy -Rp/7SNVel+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOS -Agu+TGbrIP65y7WZf+a2E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xl -nJ2lYJU6Un/10asIbvPuW/mIPX64b24D5EI= ------END CERTIFICATE----- - # Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 # Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 # Label: "Actalis Authentication Root CA" @@ -4683,3 +4644,65 @@ ADBmAjEA5gVYaWHlLcoNy/EZCL3W/VGSGn5jVASQkZo1kTmZ+gepZpO6yGjUij/6 7W4WAie3AjEA3VoXK3YdZUKWpqxdinlW2Iob35reX8dQj7FbcQwm32pAAOwzkSFx vmjkI6TZraE3 -----END CERTIFICATE----- + +# Issuer: CN=Security Communication RootCA3 O=SECOM Trust Systems CO.,LTD. +# Subject: CN=Security Communication RootCA3 O=SECOM Trust Systems CO.,LTD. +# Label: "Security Communication RootCA3" +# Serial: 16247922307909811815 +# MD5 Fingerprint: 1c:9a:16:ff:9e:5c:e0:4d:8a:14:01:f4:35:5d:29:26 +# SHA1 Fingerprint: c3:03:c8:22:74:92:e5:61:a2:9c:5f:79:91:2b:1e:44:13:91:30:3a +# SHA256 Fingerprint: 24:a5:5c:2a:b0:51:44:2d:06:17:76:65:41:23:9a:4a:d0:32:d7:c5:51:75:aa:34:ff:de:2f:bc:4f:5c:52:94 +-----BEGIN CERTIFICATE----- +MIIFfzCCA2egAwIBAgIJAOF8N0D9G/5nMA0GCSqGSIb3DQEBDAUAMF0xCzAJBgNV +BAYTAkpQMSUwIwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMScw +JQYDVQQDEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTMwHhcNMTYwNjE2 +MDYxNzE2WhcNMzgwMTE4MDYxNzE2WjBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UEAxMeU2VjdXJpdHkg +Q29tbXVuaWNhdGlvbiBSb290Q0EzMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEA48lySfcw3gl8qUCBWNO0Ot26YQ+TUG5pPDXC7ltzkBtnTCHsXzW7OT4r +CmDvu20rhvtxosis5FaU+cmvsXLUIKx00rgVrVH+hXShuRD+BYD5UpOzQD11EKzA +lrenfna84xtSGc4RHwsENPXY9Wk8d/Nk9A2qhd7gCVAEF5aEt8iKvE1y/By7z/MG +TfmfZPd+pmaGNXHIEYBMwXFAWB6+oHP2/D5Q4eAvJj1+XCO1eXDe+uDRpdYMQXF7 +9+qMHIjH7Iv10S9VlkZ8WjtYO/u62C21Jdp6Ts9EriGmnpjKIG58u4iFW/vAEGK7 +8vknR+/RiTlDxN/e4UG/VHMgly1s2vPUB6PmudhvrvyMGS7TZ2crldtYXLVqAvO4 +g160a75BflcJdURQVc1aEWEhCmHCqYj9E7wtiS/NYeCVvsq1e+F7NGcLH7YMx3we +GVPKp7FKFSBWFHA9K4IsD50VHUeAR/94mQ4xr28+j+2GaR57GIgUssL8gjMunEst ++3A7caoreyYn8xrC3PsXuKHqy6C0rtOUfnrQq8PsOC0RLoi/1D+tEjtCrI8Cbn3M +0V9hvqG8OmpI6iZVIhZdXw3/JzOfGAN0iltSIEdrRU0id4xVJ/CvHozJgyJUt5rQ +T9nO/NkuHJYosQLTA70lUhw0Zk8jq/R3gpYd0VcwCBEF/VfR2ccCAwEAAaNCMEAw +HQYDVR0OBBYEFGQUfPxYchamCik0FW8qy7z8r6irMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBDAUAA4ICAQDcAiMI4u8hOscNtybS +YpOnpSNyByCCYN8Y11StaSWSntkUz5m5UoHPrmyKO1o5yGwBQ8IibQLwYs1OY0PA +FNr0Y/Dq9HHuTofjcan0yVflLl8cebsjqodEV+m9NU1Bu0soo5iyG9kLFwfl9+qd +9XbXv8S2gVj/yP9kaWJ5rW4OH3/uHWnlt3Jxs/6lATWUVCvAUm2PVcTJ0rjLyjQI +UYWg9by0F1jqClx6vWPGOi//lkkZhOpn2ASxYfQAW0q3nHE3GYV5v4GwxxMOdnE+ +OoAGrgYWp421wsTL/0ClXI2lyTrtcoHKXJg80jQDdwj98ClZXSEIx2C/pHF7uNke +gr4Jr2VvKKu/S7XuPghHJ6APbw+LP6yVGPO5DtxnVW5inkYO0QR4ynKudtml+LLf +iAlhi+8kTtFZP1rUPcmTPCtk9YENFpb3ksP+MW/oKjJ0DvRMmEoYDjBU1cXrvMUV +nuiZIesnKwkK2/HmcBhWuwzkvvnoEKQTkrgc4NtnHVMDpCKn3F2SEDzq//wbEBrD +2NCcnWXL0CsnMQMeNuE9dnUM/0Umud1RvCPHX9jYhxBAEg09ODfnRDwYwFMJZI// +1ZqmfHAuc1Uh6N//g7kdPjIe1qZ9LPFm6Vwdp6POXiUyK+OVrCoHzrQoeIY8Laad +TdJ0MN1kURXbg4NR16/9M51NZg== +-----END CERTIFICATE----- + +# Issuer: CN=Security Communication ECC RootCA1 O=SECOM Trust Systems CO.,LTD. +# Subject: CN=Security Communication ECC RootCA1 O=SECOM Trust Systems CO.,LTD. +# Label: "Security Communication ECC RootCA1" +# Serial: 15446673492073852651 +# MD5 Fingerprint: 7e:43:b0:92:68:ec:05:43:4c:98:ab:5d:35:2e:7e:86 +# SHA1 Fingerprint: b8:0e:26:a9:bf:d2:b2:3b:c0:ef:46:c9:ba:c7:bb:f6:1d:0d:41:41 +# SHA256 Fingerprint: e7:4f:bd:a5:5b:d5:64:c4:73:a3:6b:44:1a:a7:99:c8:a6:8e:07:74:40:e8:28:8b:9f:a1:e5:0e:4b:ba:ca:11 +-----BEGIN CERTIFICATE----- +MIICODCCAb6gAwIBAgIJANZdm7N4gS7rMAoGCCqGSM49BAMDMGExCzAJBgNVBAYT +AkpQMSUwIwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMSswKQYD +VQQDEyJTZWN1cml0eSBDb21tdW5pY2F0aW9uIEVDQyBSb290Q0ExMB4XDTE2MDYx +NjA1MTUyOFoXDTM4MDExODA1MTUyOFowYTELMAkGA1UEBhMCSlAxJTAjBgNVBAoT +HFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKzApBgNVBAMTIlNlY3VyaXR5 +IENvbW11bmljYXRpb24gRUNDIFJvb3RDQTEwdjAQBgcqhkjOPQIBBgUrgQQAIgNi +AASkpW9gAwPDvTH00xecK4R1rOX9PVdu12O/5gSJko6BnOPpR27KkBLIE+Cnnfdl +dB9sELLo5OnvbYUymUSxXv3MdhDYW72ixvnWQuRXdtyQwjWpS4g8EkdtXP9JTxpK +ULGjQjBAMB0GA1UdDgQWBBSGHOf+LaVKiwj+KBH6vqNm+GBZLzAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu +9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3LsnNdo4gIxwwCMQDAqy0O +be0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70eN9k= +-----END CERTIFICATE----- diff --git a/Python310/Lib/site-packages/pip/_vendor/certifi/core.py b/Python310/Lib/site-packages/pip/_vendor/certifi/core.py index f34045b..c3e5466 100644 --- a/Python310/Lib/site-packages/pip/_vendor/certifi/core.py +++ b/Python310/Lib/site-packages/pip/_vendor/certifi/core.py @@ -4,26 +4,12 @@ certifi.py This module returns the installation location of cacert.pem or its contents. """ -import os -import types -from typing import Union +import sys -class _PipPatchedCertificate(Exception): - pass +if sys.version_info >= (3, 11): - -try: - # Return a certificate file on disk for a standalone pip zipapp running in - # an isolated build environment to use. Passing --cert to the standalone - # pip does not work since requests calls where() unconditionally on import. - _PIP_STANDALONE_CERT = os.environ.get("_PIP_STANDALONE_CERT") - if _PIP_STANDALONE_CERT: - def where(): - return _PIP_STANDALONE_CERT - raise _PipPatchedCertificate() - - from importlib.resources import path as get_path, read_text + from importlib.resources import as_file, files _CACERT_CTX = None _CACERT_PATH = None @@ -47,15 +33,54 @@ try: # We also have to hold onto the actual context manager, because # it will do the cleanup whenever it gets garbage collected, so # we will also store that at the global level as well. + _CACERT_CTX = as_file(files("pip._vendor.certifi").joinpath("cacert.pem")) + _CACERT_PATH = str(_CACERT_CTX.__enter__()) + + return _CACERT_PATH + + def contents() -> str: + return files("pip._vendor.certifi").joinpath("cacert.pem").read_text(encoding="ascii") + +elif sys.version_info >= (3, 7): + + from importlib.resources import path as get_path, read_text + + _CACERT_CTX = None + _CACERT_PATH = None + + def where() -> str: + # This is slightly terrible, but we want to delay extracting the + # file in cases where we're inside of a zipimport situation until + # someone actually calls where(), but we don't want to re-extract + # the file on every call of where(), so we'll do it once then store + # it in a global variable. + global _CACERT_CTX + global _CACERT_PATH + if _CACERT_PATH is None: + # This is slightly janky, the importlib.resources API wants you + # to manage the cleanup of this file, so it doesn't actually + # return a path, it returns a context manager that will give + # you the path when you enter it and will do any cleanup when + # you leave it. In the common case of not needing a temporary + # file, it will just return the file system location and the + # __exit__() is a no-op. + # + # We also have to hold onto the actual context manager, because + # it will do the cleanup whenever it gets garbage collected, so + # we will also store that at the global level as well. _CACERT_CTX = get_path("pip._vendor.certifi", "cacert.pem") _CACERT_PATH = str(_CACERT_CTX.__enter__()) return _CACERT_PATH -except _PipPatchedCertificate: - pass + def contents() -> str: + return read_text("pip._vendor.certifi", "cacert.pem", encoding="ascii") + +else: + import os + import types + from typing import Union -except ImportError: Package = Union[types.ModuleType, str] Resource = Union[str, "os.PathLike"] @@ -79,6 +104,5 @@ except ImportError: return os.path.join(f, "cacert.pem") - -def contents() -> str: - return read_text("certifi", "cacert.pem", encoding="ascii") + def contents() -> str: + return read_text("pip._vendor.certifi", "cacert.pem", encoding="ascii") diff --git a/Python310/Lib/site-packages/pip/_vendor/distlib/__init__.py b/Python310/Lib/site-packages/pip/_vendor/distlib/__init__.py index 5055565..962173c 100644 --- a/Python310/Lib/site-packages/pip/_vendor/distlib/__init__.py +++ b/Python310/Lib/site-packages/pip/_vendor/distlib/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # -# Copyright (C) 2012-2019 Vinay Sajip. +# Copyright (C) 2012-2022 Vinay Sajip. # Licensed to the Python Software Foundation under a contributor agreement. # See LICENSE.txt and CONTRIBUTORS.txt. # import logging -__version__ = '0.3.5' +__version__ = '0.3.6' class DistlibException(Exception): pass diff --git a/Python310/Lib/site-packages/pip/_vendor/distlib/t32.exe b/Python310/Lib/site-packages/pip/_vendor/distlib/t32.exe index 0aaa386d75662d2f874aab78460dcd39b2ee43b0..52154f0be32cc2bdbf98af131d477900667d0abd 100644 GIT binary patch delta 15993 zcmd^mdsx&}_wV;RfPf4Fa=)X1ppwr0KFp|~XlP^DASU453AMb;cqs{Wz{C+lx2ctx zrlzIl1#kI!K~eFVmn_XoVK1+3!wS-rlAQC|-$8rc-#O27{yKjho@dQod+oJvYp=cb z+G~HA*XA>?&8OPH(`Cl2vS}A)o(|rS`V3wz(x;w5{_85g)O$i|OsyAE|I}SbkJ%)t z7m%I~{v>skKo4x^*S4pbLi+M+V{NQWuKmxF&2hQB4<`!zb<8tb11I8%A0N!$Bhh?s zFWCm3yvPsqKj6=C>smN2ZdsRDa)1xxN3QDAi;oIKwO;n|v+YP@u94sQZu}S$EtX2*Zi~&(u@6VJok6QLTj&yE@ebn+WW2XJ@yDWP zj87QjY{qyoq@8hj6dCFr%3mQDz2o?y`ttGwO4nO&$ zN=GZ*LwH|hr_Y624_&QnRIiaNU)}idXf|Q7{*>ctlb8Hae^&BM0LK*+yH2&YRO%

w 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 Re&)l>w#@wrGx_g*{};Hht7QNH delta 15894 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 H#Or?ob9iVn diff --git a/Python310/Lib/site-packages/pip/_vendor/distlib/t64-arm.exe b/Python310/Lib/site-packages/pip/_vendor/distlib/t64-arm.exe index a759e270d0bf784d1cbd03acc9492cc25f7e4669..e1ab8f8f589eadabaf3efa068dce3ff620a01898 100644 GIT binary patch delta 21754 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 TKQ7>KZbgxGq2n(ZJ&gYbW8$WF delta 22110 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 QLvSS8TNgU^y3xh>KTZ|9h5!Hn diff --git a/Python310/Lib/site-packages/pip/_vendor/distlib/t64.exe b/Python310/Lib/site-packages/pip/_vendor/distlib/t64.exe index 82fe2d99e115fe361782ac4e84f8a4e67a243768..e8bebdba6d8f242244bf397ab067965d47c5093e 100644 GIT binary patch delta 23759 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 delta 23636 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�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 F{{uwys8#>~ diff --git a/Python310/Lib/site-packages/pip/_vendor/distlib/w32.exe b/Python310/Lib/site-packages/pip/_vendor/distlib/w32.exe index f2e73aa0ce958737d95b1968e94a03a815cadff6..4ee2d3a31b59e8b50f433ecdf0be9e496e8cc3b8 100644 GIT binary patch delta 13492 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ξ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 diff --git a/Python310/Lib/site-packages/pip/_vendor/distlib/w64-arm.exe b/Python310/Lib/site-packages/pip/_vendor/distlib/w64-arm.exe index b998321c461a422a6f03deb404a299c2d288c617..951d5817c9e6d81c94a173a0d9fead7f1f143331 100644 GIT binary patch delta 10631 zcmeI2dsvj!_Q%)S130MI0D_=$zla(*ctuSaykeT7d7;c?@P?(OrA8igK+RCoq}O`w zs0C_@ghq`z+Nlnl($GxN%BZ6@BVMqhhI;BqW&FPTop)4x`u+a@JqRnn5r=#vs6nTGjmFgY>V`N8H0U^rk46pM7wKB z3l8Hdr6YeTZi&LEw!TU8rsd9q;4H;obl_9=-ohYwm%X1?n^q#Costw7t1Ju{DMUNv zNI*8LN@Adedn?Zbb`E{S(mAC2K`P9ns#yMCA#Sln(-*hD>hZw4*nLM1FX#`hOLTJLOOX&A2z3yui7f>Ee*p=bU>LE+A(ZyT7v;L5D1Lg36z7N$<0?j2#w*H z$|?L#Q+^HY%(IpFwjJ22jBMK(zYE(w&6W0xNa4XstM)PY?W+BbZ{OE1%{`i0MT3>M z+DG^!#c60=dZ+rq$}vxB;JvATwC~DWl;p4!u2h~1d%-kJmZL&hu5qBTaG`QNtUHfZ z;=_}8t1>QpIImNR!@Kb^<(u%;oTXSJ0)r;rZd9Fyz|z0{(Wt_Y>e<@7aJ;fIB9v4~A$;yurJ)_#9gr;khrJ+(-8Y;#Q(!9~t7p;G5c`-#vjEw0Mq178)IvDk8 z(&$r#&pnm(LmZ`H&M`1&z@5HMQ{IXUZr;Mv$T;Pb$QbByE;5xLSE8dv@@ZvmR5w1Z zyc0D!Y#GEfth6rl8#4e-EYmryW#LXRl9h!C!+Ej&P(rF#H})=U ze1IB!Z~su`g#Sm%#oz%;gB0xO@+z!rK@ADWlSZwBzP^hrUnx%{hA0_{L0qg%Pkfc5 zlwT5~`GyjjbQ=EoOVSIz#YtL232DlLF2{L^vfJEAnPcw9OYFPN?+VUW9`81UJ1NE8 z`WUK>imBmr2U)R)y(4+>%y(v!|wf;&dgnvcm=Vzqcq)a z>`@@CSgh>Jf0o%EzjV6bFO)UQdvUCCaCxmLa;eX>W2p2}8Bes&UID!iDDzit_1}NC zQEdiSI%jBGDp##n>>XEOtR7a9S39`9{qpM80weavnhyAlU;7h!8~kdE78w2LzfQ#O zlE40dj3+k^4X^YoT!|GiGR?2>mBvOD>a1gKkt_E%0#Ebn_XnZ;=hKVf~6u8cwJlqEp8 zbde|DCG54EOMTd8U%PFi9Ij3!$NeynzwV8IPqf|lD8o_g&pNJYoP6LDjIuraqnie- znE@4@g{zs8S`ja2g^c*v6+|HMVPy=%5zqd^4tu}$=_MIic(5IQ-#GYuXp~Xwq_n8) zR3uZ69BjZCpy)#m_|Nx;`l80*&nGJ19r9O}e*Szbm$C42XWscVr2gU(ilJ%%1cp=% z6)vOlYSmI0FW~TT*!tYzr|~=T$ZGt4e`Gk?i~r&;VNH!tDvjWcQPtYCDxZAus9VCl zWk?g}K>}uWOH?XJNB?h$eC4g96Vc+YM`1Lj?Uz!A6<@}nC#7G$itj$hhAVMj3|5XD zOGT{t@r?p~*m3+A47H%z=F4gJU%pHALeaB7gezmuuEE#2v%hKack#Q**$u1RC(f_T+zIp@_FzuR#2a^3v75 zd`zjlI?>;8uu)yQ#G zNXN)wr{p+fpuP|JkXq@*6NCQq_eS+AkvGN&Ye!>kl0I?7k?hTR9L~)P<>a%qqU0!f z>_AomH$N~;p4D8w>Tw^Q%R|((X8b&}y0;lea+Kp#Gd{+=Mt#SZm+>A)$L9RB;KSws%t8M+c7KwlO zqu=>z{{UVZu=b-yRUTiet~9E$TSlwnWB@w^r#V&yaUXB)rygv}JGhHFyB!bZj_Tfa zoPZk7w&UsI!r#&|K- zcg8?iuqEU)nPN4(BmcoO)UZyRAzTK>vz>UmfEK}tJQ0?BE|Ia+6{`!AxFB=e0H`S}%_%ufFNO#@{k?B47 zJ*jF>#*9;Y_T*CT?{M|xNF!uKDh8`k9gxbCdt)a}cTsQ8c5XV;sP1WOZ1YQm6yHn{STBjExyJP_c(Vp z@D_FSB!1Wb?>igSYp{Vl>B;G)sD4lK>d^O4>fg92;Pf?j7f$?EtP=9ZveWVYliZob ze@fM}lQG+Gs(x9#2#&cb3py=P|H$G|z(^~`cZvE}tLDPUYpb@;hT$~1w(5v%4rQA< zJ)3QC=8M@doXrtD1>=T^SUHsy4CAzZXazf9a&K9{KMG#0u6dDf z@_0x7Le4O7rQ_sc_AzjUU+334f7JP_ zPSb;W{W`nq9N?yn9@i6cbmr<@r*n(WeL6qWc}nMboi}tIN_IE6PiKkFO*+@=%++Ya zeO*r&qccTkxK1yfpC!60KCAQJI-4iC(_?k^(V3}pmd=GbSLu91@*$Xho1XB2&X06{ zt@Db`=3U$kMeFRYzQ39yY|rV@6*@QREZ6xDohNmk)%l~&0JFQ=aGek8?4xs#&ha{P zbmqEgqg8ss8#+sMeyH=P&Qm(i>Aa>>^FREo&<*;A&N7{z{1JM*kIs0FJ&A(#geP>) z(&;H!A5RwcL_lMAvZ($nTF0hzbLZ6StQhT%-xKtznZe4RCB(!`A|A<`0^-weG%n&OhDxB|52(F0XUWNq5}zm757k?)EZudb;7% z>#ez>%U#tNN7dEtgpd<%TGqPhX(%Mb-KC&3Ps@6hS$18}(}X9k%jN1Vrh9tS$FZuI zJ5BD3$F6KyM!M1C2zep6ky1 zx{JlPrix9ab+7bmJ#6*$m%rWCZd_+|y%6&rOMjk8drOO*{S0cPj6$aNUZkhx5*0Ds zLhDI0r&{M(V|z#$G(p(7D9LP|GJOU?H!za++pk%Dg#E)3hpb zo1~4^s>nl{Ngd}UJ`K9Z4&9{|ajF__9jUA48fFQ2cl@XP0G zYgG0Tfn1{o`G_fTl43WDW$O`%MmI(adoqgXcH_&8Es_t!ceC`9HOmL)FVEk ze~>3{>Hwr8Y?IZfVa>#+Xvoz}1p0d5qFZy z#}R#mP^Nxo6dmp+PaygXp-lDn746W2L?Fmx(5_@QxvG~}iI=1?C;5st(K4$FwvM7X zM%S`vO*`3-lvjwBBSb3d8@?jCw@2%vYth?Ri3Ta|-WK4y=$`m8GKaVh`&6M3j94w2 zx$b+9+JiO_Wg(QQQO(5+o5!>xcAz&11*kQ$gy@0$w7In%Dj|QW-YT>;xn8PT8jB`8 zbwrjyGlVi-#{a%L>URS`A;?N@@{ks!6V>DCX*}wYnI*cG?Kmt`Xk8BOSZ)1 zbmgC~9YS+LT+2>2JF!9za>5-mK2b@u0ijx*+d{Ot)8Da&@gRXvt?L>f`*UAYb=7F& z#9jaBA!U{|?X&qbQ58bHUQhCUeKwv!^9ZK(+Gq`+zOs_lO)L2t0?W_hPU9BB`XC!> z+V3(aQ4K=9I;^GWd#4|{7g0Zg$7F%`wV!c`CyA zWHAlK4r%ZcJ2kH^f$I*CUR@=Yx!tYOPsDV*>+l(-L^=2JtDE@B`Zi4eM#xnCT8S7; zljK(SO!W5tOeq0OQ`K>;MCveE*#@-JjxvmGw94*IlbQ#at{~*Z5i z63-)dvk5oH8ug4xL;$w|e~%fTBeOPTur~RNh&Y)nM=?}(C;zTxEl6LEV0j%>=lY8& ziN-|O4O?hUCuu+TzlBJvz!tjyp0xc)D^fWC6Yjrvi2vRp+|Kg<^bQgDCwBa{NBJej3;#D3LYkhv34 zd$9gNqC_!GM0O#15b>I>xcA9)FqHDh*iF(&ks9*|mlDd9`Fc98D-?$OgzjXc9As4C z;3W$%=YmJ$F7j zQuHW}Ly*fFOJs#272xX_%1n9ill6fwl8ZCP6FCvLW#ZUZkB=JA51Q3wVr=o^8i~_* zJ{m}$NR$Q^fFTirOp~zXgGEmgy+gH}KH1GVQ}mwd%$Q2F844Ju6YZj@V!zIu85kOo z%_TF5I*M!?@1I4q5`vc5_+J3*Bzl(U09Y{xmJm~faUKo=XfWdiqMc~)md>JFm|mRY ziiK`E7ZH7fdiF0SI!IGQ-V)i+bWxFqAr+T|ahX&kn=8Od)RVWI=x4Ika_$P48Vy)p zM#Iqb7I+X%R}{Eeuo7bm6IZWtGvpPbMbZM``{d+|HF8L58TV3*J)8_Ik@+~^?nQde zI=3?xflj3Fe@&ZR!ld9DXG20RJ|02ADlm!}zJkyZ-zBV1X z9!#Swftxxdq9AVW+H}NQ1S+yJ-VU_+Pj4IEZWHdrE}Nq z!Te80Li%1L7%myA_7h$9xnu~ba8I9HupM4|3P#e^SJ0UC?GBy zDh^=?pmE_UQM(Gqy&t^0#*HuTpuvDr{v0JXc+f_&!ABqSO=ElcyElx*qxOMWeNI0dNZ5}oQ8%IoJ2Fh zb>M@L3vm&7VfRf&z+$A+HFv{iomt>~ zt`*Lou%x4W`E^;&W@WnJcA^Y$u3@HE#m{mfxga+Dg8OU?mdsmnL7HwT_!VQ!GYloa zp~py{^E;*!m~$K6EwI8h$|1p?fot9w^t>J{luJ4@eTzXmm0jqp*W(6}_;7Bjyt#HW(>mR^>^8s&}aKVVhkl>QBldK{=kTJH|Tn)w|-5G@U z2`~d!lq-ru4by0vz@M?;WY~|v(dbbfSb>6OTwEgK;FO?TK+MTZ=aDWiJaRt| z!R6%uOk53GAXk8kOfi<^gq}>>5Wm$2^?>GwFfqWaey|Ma?9Y@X^HXh11^7r9i089- zf$J612(WGl(?ej^FsARYvZXwXG4s0Y;~Xg!wF=89*+Ul>fLV|;k7oD`4j^MBYuO2o z#u%H&LJ{OgW@2c;ikVFFz?`R8Tfp*c_&A6jq(9Btc3B601_7Fbo`O!W9^5dOu|8yr z^yiqoI$((AGq&GL2E6NPV;i!7wONn@9)u;$FE9==Sv&{aC0EoJ;Ug$lw@?m+m2>_g zEox=k27F9IPiPTi$#ijEzKmPhw3M+>OcS)6=`wm&56bO#!%IxvWkoB{1FwrBWVLJv zODis2W05W|X1x)Y?`lOjImt(}qo8~si^M^v>@}vAIB&@JE6_$)@KKHgc>&#o-Ea^n z1>}WQ#^vLVq78Qm?5cAM?2K5euvCNOGE1#b+th7RjKswUM%hWzH6U-e2x1XD<;Hvej=WKvkevo!IidQ9>HBiP?(Y&5UV`xKS8v2 zQx5y*@){*6z{JCpg#o=oCz-Air=K`)pz5l%;_7*#eTRr@5-iF)0gpf@BJg&dmv88- zgHCSXYM!QC3Y?1H(LvcfM|m}$%ocAbuwMOPZ`^_N6=~HT97M=EIJ-V zMaP>AU8_eZ&vhMwI`4Ij2|A#ci;@bxJg7QO`MK+O{!tkg92T_W-_-X~9t$2HwD#YW zTvm<*PvlWb_mFh%smu%+-|KWYTHhRCy85eu5@oNJgwguR1{xrre^PkRr@P1%_D$15xPbg8L{X$xZrWl#pXu#;JaMZelB-2% zd=whSPbuGq#_(gxpZLvJqPz9xMaqP3@tmhD!*iapt=l6UW$O|a&pcKc7#@S)hqT|n zgb(o<<(iLrm^O}8J`L~T2T7A5uv*TNF8!xl8gQ#Lu6tkJrA+Id#!<@4-JkTmU)G~C zS8j(wky_koGK|pSd5f_OWlv;qR6eB8Y%X<;LF-j>=dvJJ)M`yr&PK+d zD;=ZKd6qIRY672CUXAL<-zZ0-9+oj49mek~W257_Mp+a+kzcdbMW-;YRDO;L=5dO5 z?D&p@t~u2zjMmsknH4*b3*M@f^c&6nl|%jR zF|-+r70>>O?5p(YAJ0CvY5l#JTWppACWftT13&Yx<1+8--`7VXXwbU`BYP^=L2>BM zjzKB-Juzqye!HZ_aGlaOZIHL6lWe*np;>t%EgmHs)25<>zoZR8v&n-W=Q`V#!NS9P zNNwkyLwV5q!f3Si|_W~lOA#tW!DH}gq!=DW;)utj-) zL>OFhVuXP?!}jgSAp-4oz4zfzi>KC2a!^?$_c$T9NOZTxSZrH+ua^N;HjMM^z+tw{ z6Zy9y7VlkBwoHt$jhqz1ycm-HwzBLOg7}&(bp8mzi)}L(eDA{#DZ>h5c&}n9 z+{B5t>xHYC&B}{US8}>7>6zZlLzQXI9^{U;sOPFYf}+F?U(t2vfR)l;b;@_ek7IRD zD48qx@5;XAgE(2axV(j{m1EEE7kSOftn99~T`SrI?^iazSn2oicTUv{v2fbZts47C z_6FOeRhX11%CyyXj4ov`*YhBo}KojPHD$8DUB-yIvjN5P6s_eM1P zl)Z>eBhuni_L9@7qBrX}s*6j;U6da;Jpsj8uU+=Dc-`o>R6zUowihaa;fdz?VF^pv#Y-FiK=s1Z7~ETo*qGE&Dcw1 z5H%4En6Ej;mig{v#@yRf`z4Jpy!R2N(>D5pUkwQHdmOz580O_R;)V713iej)^(D}{ z=g=4U?RfYR{4P7Z8o%PR@#xru&z`~a;m;7N%Gu8*#D)(%@$k4x7aP}lv&@siQkUj|DiocD6vgz@bpeoKU6;3REbWmYL0>T_B3}h zaJzD-^)(dFJ(I|v+RDxZ;H+@Sw&VOef}gcb`!R(*Qa^R7YNQv3C}ibNRCUv2d>Jz&ljGXpTi+21YYBdv!}RR7=#e(fl~@U<}VjtMA9~ByO{Jj^*wK zWE11L2N&DN#q;;l4~e}Pt6m-5i~rZnA{66|4D6M2V#-Qh_*9sbyu#Mq4L)NRQ; zP)xC_3&S}=ZBOPv?{vFUO-U#^K205)%0tww6rPD{ds5&b%tjxM5HQv)mE*jBdDo@c zS!$L;>2&H1CAO>g_u&-ZO6W|4wGTn(;*`%+M=uUnO$bGGS07AphI+gYe+J82`f>zM zw}03d;lS6`p#FRk6Z1=d-h{%n1Nbf3_kkE_ojPkESBo+Gv_9Jt1~D6pYVP8QdzT~();G4~~EVlH=6KR5Ft!5Y%rb$v_JnW=Mz&O)6lbZ*gE zqZ6+|d9CAG`N@iV9sB?wR4LbMebm;s_=V_h4=@dz>27Pt5 z_HpIE()p>*_jT^lXeHX93rchr=zLJ;P@T~_PwNd_)9Ih=YA8Wxrp_Fl%XF^NS+286 zvOiq6R~LM&vq9&#I)BmGF-31kJr*E(SPS&*vpU!5+^+L|okw*x>1@+^O{X!{Wj0mk zP@Us+=IG4Txx_^)tyF*4^RP~L`2sCJ znkYvv7^$>ET81cH!NjMZdNnaaByJZ zE|=I*>=HL*y9|V@>(;QZIGt*Tr z$QyF|s;!*(@DP0S$(40vFg=7+6e6fdxI)Wa)*13Zq?0H+d9&=5%c9JKDqUUbuGYNA zM%A$iFV@{GzV_YrdU5a0iE}e{ZaDLBhksrFU0pB4l4+5PnY2$zv5zf;MM@}R3ilvg zR!CHV`7|J(KgY7f5<5WZpb5hMNXe?s1cMh)^5vwJoUcg<@8s%OEK(%F(Lk;>h9b+e}k?kZIoZKMt&`Uxousy_`< z4||H?LGH4lnUEtrE6u3gy~KVr)a)e!{M;JtqljX$!k4QZj3Q>5yZzP)_jmDA29ezL%y=%8d9~Omf^W1+Q(zA16LqIi z^td5j`2f*+q~+>2MiGBgJeBA*q~)rgw+O=sl7Jw$L;F&yZ*#-)dhxt;=1gx994(9L z;p-?WFgBM)YrT`>@O_DB22%UW>IQESJ=opr?Q1dGzY>KjuF;zDTzE^qlu|>Q4|&$3 z5zJT%n)%uLmTrfa6Qv<7SED+Lc~-Y;W8c7Nkj${!4&HS~ZyI(GH6jhwTSaeuo1d>Q ziA57`8|`nRXS-lp*YUfyA@9MkklYGB$2z2Xb!=xb1JP%4xI88J%HPVr68hCn_8DdZJU zUF0WbC&kI56JDWBiPC?rzjDaxw=p?xk)437N@ag6xc}TF{&SOX1A#1mcRxgxR`US#2djEUHo!1}w1l0=?pPbRt>`I^4i#HAbzr6Ow5*hKAm z9(NVWk>y}0+QTh|x`Vh&T4_ECDsUo`1+`!!@(BZFN1A9Q*edflmhA%D!NKTYY8uff zun-&zIzVZ#2|Pu)!uKA0A(!>RX=L^|4?c%{(Ga{bV8=L=D34mXU?^_W@W{&x@G;60 zwcvT^r;SE?oXZvW64mhqgV{P3Uq4W=ay-!ynk#bdb9Kl8W<{W3ocYc`?wEjs9`f?+ zco7DTlL-I8Ya(3xD2mSu-0Ns522wZ~XI$u|;ZSHnN6NuhFqNq|4Spc)flpC0r#^_w zB=Xi&oCn+RPy_m)XO0}qExxa|Pa`Tu1Ci5-GC(sJ(nHYs8JIS(a2C<))WVSuyEtaH zK2n_tbBH#h15J5EyJ?PCH`hheJWP$q<)VC|ULx1Z>mDU~5sD#?;lJeEM2!oH-UG`E z;0ZBXG%d!d84V^pNwgCUHs~xYgzLp=E`Qp^+GmOW4m<0fBRW8{Mb2MjLvuxW5vEj} z6HO(u1G!vY3fIF<&T^tFWNqQB6>v2g2zdbwqo)nv0W@8{(na%&m{Yj8YL$y^t8ovI z9(al9ZEE6#HF8Q?7&lhTJ%S9ZlI1w~?t|R4&J~P>U=!r)Ue;EZI1jd4A;?mQ?nlK6 zFoW|9P3v)Ai4;_!;w=Vdl@obmxixN-t0I@pn}{Z1L^Yd<7GcDZTZmreR#E$3M9qkS z@(LO4xg4@p&UG%Y1Bb#+?KYzOK-%tF-Z`LEuJc+vlz~~V6RiQ8z(w#t)(+WVE7yP( zsMrP;f+1BnpvpWr12peM2k0~xRl8!v0Zzhz8gb}$pd23|s1KRB3S5H@kHJA(4!CMJ z)_})d_&gT+H&N2FoVnjS9nT7MO^8%{Q_SpV93Jws-UfZ zT>Ui<;gbM}=m+I8c7Sqfj5w6Xq8$?`gWIte>wgRck^3MpoHJC^5?$~-XK4Fx*Ye47 zAWETFsIvmhf_`nC45Ha$<;O%nV;vWMf)0oahVoA_1?YHTJv;@ynnMUWj|(2=qeRzf zo~QW>*TC?#gDOzoX2ruOxIFEc45k)756X3m?t=fZ38L#5+lI|RrPndKVWW8 z$eqo?1>hCRH_ZQ9>g94HxCk86=wdDSybQu`r0ZL`0hIdn-^%@>g{}CY1A}N7`~*F6 zoWxEAuEe?D7>&96PIkyF8o_-qyzYCcZ(%rv^1=Dw-Oy_TJ76blZ-$4EH=U8otwqpT zIb~)}1)qg{C3q4vp2J-vF^OAU||P%5e?T|aE&bT2iyRm=ldgW z6;dBOgO1}%k`_!**4_q1n`t?i+6h+*neT$zH&}lc z(_XLvH;=SfObKouJINv<0~m9g%T-`3o||dte7N z4rOWt(}uw_VC`@wvn)@y;%b5i8i7wwae^Ab`#{HNT&2LYu}t4!XY(D0IrF&SSvx^? z)FMJA$`LlR88k!BIEfK6IDlwu;o5BJiB>jFK}S&DJ{407mgh4q0Zj{7+rV(T*!0)@uMF;cL$0M|pXU=d?~$Q6-KFnPpdik327zvm42+^fxP8z{F_(=urf z4L`{^$e4KyxLfY1g@_TE0~(bQl<+q zT)$ifT?-dH&(vQUT7eOGoE2@WWJB0maT}WgxxBFrMqYk!tH8-geogxvlwZywanM&D#uisE9X}h*uz$d HGhY7#nG&?2 diff --git a/Python310/Lib/site-packages/pip/_vendor/distlib/w64.exe b/Python310/Lib/site-packages/pip/_vendor/distlib/w64.exe index 9a6b894db58c868b27c1859614c479a4d640a6ce..5763076d2878093971a0ef9870e1cde7f556b18b 100644 GIT binary patch delta 14555 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 delta 14582 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 Jx9M*#{|kF4kbwXI diff --git a/Python310/Lib/site-packages/pip/_vendor/idna/core.py b/Python310/Lib/site-packages/pip/_vendor/idna/core.py index 55ab967..4f30037 100644 --- a/Python310/Lib/site-packages/pip/_vendor/idna/core.py +++ b/Python310/Lib/site-packages/pip/_vendor/idna/core.py @@ -339,7 +339,10 @@ def uts46_remap(domain: str, std3_rules: bool = True, transitional: bool = False def encode(s: Union[str, bytes, bytearray], strict: bool = False, uts46: bool = False, std3_rules: bool = False, transitional: bool = False) -> bytes: if isinstance(s, (bytes, bytearray)): - s = s.decode('ascii') + try: + s = s.decode('ascii') + except UnicodeDecodeError: + raise IDNAError('should pass a unicode string to the function rather than a byte string.') if uts46: s = uts46_remap(s, std3_rules, transitional) trailing_dot = False diff --git a/Python310/Lib/site-packages/pip/_vendor/idna/idnadata.py b/Python310/Lib/site-packages/pip/_vendor/idna/idnadata.py index 1b5805d..67db462 100644 --- a/Python310/Lib/site-packages/pip/_vendor/idna/idnadata.py +++ b/Python310/Lib/site-packages/pip/_vendor/idna/idnadata.py @@ -1,6 +1,6 @@ # This file is automatically generated by tools/idna-data -__version__ = '14.0.0' +__version__ = '15.0.0' scripts = { 'Greek': ( 0x37000000374, @@ -55,12 +55,13 @@ scripts = { 0x16fe200016fe4, 0x16ff000016ff2, 0x200000002a6e0, - 0x2a7000002b739, + 0x2a7000002b73a, 0x2b7400002b81e, 0x2b8200002cea2, 0x2ceb00002ebe1, 0x2f8000002fa1e, 0x300000003134b, + 0x31350000323b0, ), 'Hebrew': ( 0x591000005c8, @@ -77,6 +78,7 @@ scripts = { 0x304100003097, 0x309d000030a0, 0x1b0010001b120, + 0x1b1320001b133, 0x1b1500001b153, 0x1f2000001f201, ), @@ -93,6 +95,7 @@ scripts = { 0x1affd0001afff, 0x1b0000001b001, 0x1b1200001b123, + 0x1b1550001b156, 0x1b1640001b168, ), } @@ -1331,7 +1334,7 @@ codepoint_classes = { 0xcdd00000cdf, 0xce000000ce4, 0xce600000cf0, - 0xcf100000cf3, + 0xcf100000cf4, 0xd0000000d0d, 0xd0e00000d11, 0xd1200000d45, @@ -1366,7 +1369,7 @@ codepoint_classes = { 0xeb400000ebe, 0xec000000ec5, 0xec600000ec7, - 0xec800000ece, + 0xec800000ecf, 0xed000000eda, 0xede00000ee0, 0xf0000000f01, @@ -1859,7 +1862,7 @@ codepoint_classes = { 0xab200000ab27, 0xab280000ab2f, 0xab300000ab5b, - 0xab600000ab6a, + 0xab600000ab69, 0xabc00000abeb, 0xabec0000abee, 0xabf00000abfa, @@ -1943,7 +1946,7 @@ codepoint_classes = { 0x10e8000010eaa, 0x10eab00010ead, 0x10eb000010eb2, - 0x10f0000010f1d, + 0x10efd00010f1d, 0x10f2700010f28, 0x10f3000010f51, 0x10f7000010f86, @@ -1966,7 +1969,7 @@ codepoint_classes = { 0x111dc000111dd, 0x1120000011212, 0x1121300011238, - 0x1123e0001123f, + 0x1123e00011242, 0x1128000011287, 0x1128800011289, 0x1128a0001128e, @@ -2047,11 +2050,16 @@ codepoint_classes = { 0x11d9300011d99, 0x11da000011daa, 0x11ee000011ef7, + 0x11f0000011f11, + 0x11f1200011f3b, + 0x11f3e00011f43, + 0x11f5000011f5a, 0x11fb000011fb1, 0x120000001239a, 0x1248000012544, 0x12f9000012ff1, - 0x130000001342f, + 0x1300000013430, + 0x1344000013456, 0x1440000014647, 0x1680000016a39, 0x16a4000016a5f, @@ -2079,7 +2087,9 @@ codepoint_classes = { 0x1aff50001affc, 0x1affd0001afff, 0x1b0000001b123, + 0x1b1320001b133, 0x1b1500001b153, + 0x1b1550001b156, 0x1b1640001b168, 0x1b1700001b2fc, 0x1bc000001bc6b, @@ -2096,17 +2106,21 @@ codepoint_classes = { 0x1da9b0001daa0, 0x1daa10001dab0, 0x1df000001df1f, + 0x1df250001df2b, 0x1e0000001e007, 0x1e0080001e019, 0x1e01b0001e022, 0x1e0230001e025, 0x1e0260001e02b, + 0x1e0300001e06e, + 0x1e08f0001e090, 0x1e1000001e12d, 0x1e1300001e13e, 0x1e1400001e14a, 0x1e14e0001e14f, 0x1e2900001e2af, 0x1e2c00001e2fa, + 0x1e4d00001e4fa, 0x1e7e00001e7e7, 0x1e7e80001e7ec, 0x1e7ed0001e7ef, @@ -2115,13 +2129,13 @@ codepoint_classes = { 0x1e8d00001e8d7, 0x1e9220001e94c, 0x1e9500001e95a, - 0x1fbf00001fbfa, 0x200000002a6e0, - 0x2a7000002b739, + 0x2a7000002b73a, 0x2b7400002b81e, 0x2b8200002cea2, 0x2ceb00002ebe1, 0x300000003134b, + 0x31350000323b0, ), 'CONTEXTJ': ( 0x200c0000200e, diff --git a/Python310/Lib/site-packages/pip/_vendor/idna/package_data.py b/Python310/Lib/site-packages/pip/_vendor/idna/package_data.py index f5ea87c..8501893 100644 --- a/Python310/Lib/site-packages/pip/_vendor/idna/package_data.py +++ b/Python310/Lib/site-packages/pip/_vendor/idna/package_data.py @@ -1,2 +1,2 @@ -__version__ = '3.3' +__version__ = '3.4' diff --git a/Python310/Lib/site-packages/pip/_vendor/idna/uts46data.py b/Python310/Lib/site-packages/pip/_vendor/idna/uts46data.py index 8f65705..186796c 100644 --- a/Python310/Lib/site-packages/pip/_vendor/idna/uts46data.py +++ b/Python310/Lib/site-packages/pip/_vendor/idna/uts46data.py @@ -7,7 +7,7 @@ from typing import List, Tuple, Union """IDNA Mapping Table from UTS46.""" -__version__ = '14.0.0' +__version__ = '15.0.0' def _seg_0() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x0, '3'), @@ -1300,7 +1300,7 @@ def _seg_12() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0xCE6, 'V'), (0xCF0, 'X'), (0xCF1, 'V'), - (0xCF3, 'X'), + (0xCF4, 'X'), (0xD00, 'V'), (0xD0D, 'X'), (0xD0E, 'V'), @@ -1368,7 +1368,7 @@ def _seg_13() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0xEC6, 'V'), (0xEC7, 'X'), (0xEC8, 'V'), - (0xECE, 'X'), + (0xECF, 'X'), (0xED0, 'V'), (0xEDA, 'X'), (0xEDC, 'M', 'ຫນ'), @@ -5917,7 +5917,7 @@ def _seg_56() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x10EAE, 'X'), (0x10EB0, 'V'), (0x10EB2, 'X'), - (0x10F00, 'V'), + (0x10EFD, 'V'), (0x10F28, 'X'), (0x10F30, 'V'), (0x10F5A, 'X'), @@ -5956,7 +5956,7 @@ def _seg_57() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x11200, 'V'), (0x11212, 'X'), (0x11213, 'V'), - (0x1123F, 'X'), + (0x11242, 'X'), (0x11280, 'V'), (0x11287, 'X'), (0x11288, 'V'), @@ -6097,6 +6097,8 @@ def _seg_58() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x11AA3, 'X'), (0x11AB0, 'V'), (0x11AF9, 'X'), + (0x11B00, 'V'), + (0x11B0A, 'X'), (0x11C00, 'V'), (0x11C09, 'X'), (0x11C0A, 'V'), @@ -6139,13 +6141,19 @@ def _seg_58() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x11DAA, 'X'), (0x11EE0, 'V'), (0x11EF9, 'X'), - (0x11FB0, 'V'), - (0x11FB1, 'X'), - (0x11FC0, 'V'), + (0x11F00, 'V'), ] def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ + (0x11F11, 'X'), + (0x11F12, 'V'), + (0x11F3B, 'X'), + (0x11F3E, 'V'), + (0x11F5A, 'X'), + (0x11FB0, 'V'), + (0x11FB1, 'X'), + (0x11FC0, 'V'), (0x11FF2, 'X'), (0x11FFF, 'V'), (0x1239A, 'X'), @@ -6158,7 +6166,9 @@ def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x12F90, 'V'), (0x12FF3, 'X'), (0x13000, 'V'), - (0x1342F, 'X'), + (0x13430, 'X'), + (0x13440, 'V'), + (0x13456, 'X'), (0x14400, 'V'), (0x14647, 'X'), (0x16800, 'V'), @@ -6236,6 +6246,10 @@ def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x18D00, 'V'), (0x18D09, 'X'), (0x1AFF0, 'V'), + ] + +def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x1AFF4, 'X'), (0x1AFF5, 'V'), (0x1AFFC, 'X'), @@ -6243,13 +6257,13 @@ def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1AFFF, 'X'), (0x1B000, 'V'), (0x1B123, 'X'), + (0x1B132, 'V'), + (0x1B133, 'X'), (0x1B150, 'V'), (0x1B153, 'X'), + (0x1B155, 'V'), + (0x1B156, 'X'), (0x1B164, 'V'), - ] - -def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x1B168, 'X'), (0x1B170, 'V'), (0x1B2FC, 'X'), @@ -6295,6 +6309,8 @@ def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1D1EB, 'X'), (0x1D200, 'V'), (0x1D246, 'X'), + (0x1D2C0, 'V'), + (0x1D2D4, 'X'), (0x1D2E0, 'V'), (0x1D2F4, 'X'), (0x1D300, 'V'), @@ -6334,6 +6350,10 @@ def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1D41E, 'M', 'e'), (0x1D41F, 'M', 'f'), (0x1D420, 'M', 'g'), + ] + +def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x1D421, 'M', 'h'), (0x1D422, 'M', 'i'), (0x1D423, 'M', 'j'), @@ -6350,10 +6370,6 @@ def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1D42E, 'M', 'u'), (0x1D42F, 'M', 'v'), (0x1D430, 'M', 'w'), - ] - -def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x1D431, 'M', 'x'), (0x1D432, 'M', 'y'), (0x1D433, 'M', 'z'), @@ -6438,6 +6454,10 @@ def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1D482, 'M', 'a'), (0x1D483, 'M', 'b'), (0x1D484, 'M', 'c'), + ] + +def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x1D485, 'M', 'd'), (0x1D486, 'M', 'e'), (0x1D487, 'M', 'f'), @@ -6454,10 +6474,6 @@ def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1D492, 'M', 'q'), (0x1D493, 'M', 'r'), (0x1D494, 'M', 's'), - ] - -def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x1D495, 'M', 't'), (0x1D496, 'M', 'u'), (0x1D497, 'M', 'v'), @@ -6542,6 +6558,10 @@ def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1D4E9, 'M', 'z'), (0x1D4EA, 'M', 'a'), (0x1D4EB, 'M', 'b'), + ] + +def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x1D4EC, 'M', 'c'), (0x1D4ED, 'M', 'd'), (0x1D4EE, 'M', 'e'), @@ -6558,10 +6578,6 @@ def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1D4F9, 'M', 'p'), (0x1D4FA, 'M', 'q'), (0x1D4FB, 'M', 'r'), - ] - -def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x1D4FC, 'M', 's'), (0x1D4FD, 'M', 't'), (0x1D4FE, 'M', 'u'), @@ -6646,6 +6662,10 @@ def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1D550, 'M', 'y'), (0x1D551, 'X'), (0x1D552, 'M', 'a'), + ] + +def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x1D553, 'M', 'b'), (0x1D554, 'M', 'c'), (0x1D555, 'M', 'd'), @@ -6662,10 +6682,6 @@ def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1D560, 'M', 'o'), (0x1D561, 'M', 'p'), (0x1D562, 'M', 'q'), - ] - -def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x1D563, 'M', 'r'), (0x1D564, 'M', 's'), (0x1D565, 'M', 't'), @@ -6750,6 +6766,10 @@ def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1D5B4, 'M', 'u'), (0x1D5B5, 'M', 'v'), (0x1D5B6, 'M', 'w'), + ] + +def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x1D5B7, 'M', 'x'), (0x1D5B8, 'M', 'y'), (0x1D5B9, 'M', 'z'), @@ -6766,10 +6786,6 @@ def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1D5C4, 'M', 'k'), (0x1D5C5, 'M', 'l'), (0x1D5C6, 'M', 'm'), - ] - -def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x1D5C7, 'M', 'n'), (0x1D5C8, 'M', 'o'), (0x1D5C9, 'M', 'p'), @@ -6854,6 +6870,10 @@ def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1D618, 'M', 'q'), (0x1D619, 'M', 'r'), (0x1D61A, 'M', 's'), + ] + +def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x1D61B, 'M', 't'), (0x1D61C, 'M', 'u'), (0x1D61D, 'M', 'v'), @@ -6870,10 +6890,6 @@ def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1D628, 'M', 'g'), (0x1D629, 'M', 'h'), (0x1D62A, 'M', 'i'), - ] - -def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x1D62B, 'M', 'j'), (0x1D62C, 'M', 'k'), (0x1D62D, 'M', 'l'), @@ -6958,6 +6974,10 @@ def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1D67C, 'M', 'm'), (0x1D67D, 'M', 'n'), (0x1D67E, 'M', 'o'), + ] + +def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x1D67F, 'M', 'p'), (0x1D680, 'M', 'q'), (0x1D681, 'M', 'r'), @@ -6974,10 +6994,6 @@ def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1D68C, 'M', 'c'), (0x1D68D, 'M', 'd'), (0x1D68E, 'M', 'e'), - ] - -def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x1D68F, 'M', 'f'), (0x1D690, 'M', 'g'), (0x1D691, 'M', 'h'), @@ -7062,6 +7078,10 @@ def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1D6E2, 'M', 'α'), (0x1D6E3, 'M', 'β'), (0x1D6E4, 'M', 'γ'), + ] + +def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x1D6E5, 'M', 'δ'), (0x1D6E6, 'M', 'ε'), (0x1D6E7, 'M', 'ζ'), @@ -7078,10 +7098,6 @@ def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1D6F2, 'M', 'ρ'), (0x1D6F3, 'M', 'θ'), (0x1D6F4, 'M', 'σ'), - ] - -def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x1D6F5, 'M', 'τ'), (0x1D6F6, 'M', 'υ'), (0x1D6F7, 'M', 'φ'), @@ -7166,6 +7182,10 @@ def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1D747, 'M', 'σ'), (0x1D749, 'M', 'τ'), (0x1D74A, 'M', 'υ'), + ] + +def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x1D74B, 'M', 'φ'), (0x1D74C, 'M', 'χ'), (0x1D74D, 'M', 'ψ'), @@ -7182,10 +7202,6 @@ def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1D758, 'M', 'γ'), (0x1D759, 'M', 'δ'), (0x1D75A, 'M', 'ε'), - ] - -def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x1D75B, 'M', 'ζ'), (0x1D75C, 'M', 'η'), (0x1D75D, 'M', 'θ'), @@ -7270,6 +7286,10 @@ def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1D7AD, 'M', 'δ'), (0x1D7AE, 'M', 'ε'), (0x1D7AF, 'M', 'ζ'), + ] + +def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x1D7B0, 'M', 'η'), (0x1D7B1, 'M', 'θ'), (0x1D7B2, 'M', 'ι'), @@ -7286,10 +7306,6 @@ def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1D7BE, 'M', 'υ'), (0x1D7BF, 'M', 'φ'), (0x1D7C0, 'M', 'χ'), - ] - -def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x1D7C1, 'M', 'ψ'), (0x1D7C2, 'M', 'ω'), (0x1D7C3, 'M', '∂'), @@ -7359,6 +7375,8 @@ def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1DAB0, 'X'), (0x1DF00, 'V'), (0x1DF1F, 'X'), + (0x1DF25, 'V'), + (0x1DF2B, 'X'), (0x1E000, 'V'), (0x1E007, 'X'), (0x1E008, 'V'), @@ -7369,6 +7387,75 @@ def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1E025, 'X'), (0x1E026, 'V'), (0x1E02B, 'X'), + (0x1E030, 'M', 'а'), + (0x1E031, 'M', 'б'), + (0x1E032, 'M', 'в'), + ] + +def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1E033, 'M', 'г'), + (0x1E034, 'M', 'д'), + (0x1E035, 'M', 'е'), + (0x1E036, 'M', 'ж'), + (0x1E037, 'M', 'з'), + (0x1E038, 'M', 'и'), + (0x1E039, 'M', 'к'), + (0x1E03A, 'M', 'л'), + (0x1E03B, 'M', 'м'), + (0x1E03C, 'M', 'о'), + (0x1E03D, 'M', 'п'), + (0x1E03E, 'M', 'р'), + (0x1E03F, 'M', 'с'), + (0x1E040, 'M', 'т'), + (0x1E041, 'M', 'у'), + (0x1E042, 'M', 'ф'), + (0x1E043, 'M', 'х'), + (0x1E044, 'M', 'ц'), + (0x1E045, 'M', 'ч'), + (0x1E046, 'M', 'ш'), + (0x1E047, 'M', 'ы'), + (0x1E048, 'M', 'э'), + (0x1E049, 'M', 'ю'), + (0x1E04A, 'M', 'ꚉ'), + (0x1E04B, 'M', 'ә'), + (0x1E04C, 'M', 'і'), + (0x1E04D, 'M', 'ј'), + (0x1E04E, 'M', 'ө'), + (0x1E04F, 'M', 'ү'), + (0x1E050, 'M', 'ӏ'), + (0x1E051, 'M', 'а'), + (0x1E052, 'M', 'б'), + (0x1E053, 'M', 'в'), + (0x1E054, 'M', 'г'), + (0x1E055, 'M', 'д'), + (0x1E056, 'M', 'е'), + (0x1E057, 'M', 'ж'), + (0x1E058, 'M', 'з'), + (0x1E059, 'M', 'и'), + (0x1E05A, 'M', 'к'), + (0x1E05B, 'M', 'л'), + (0x1E05C, 'M', 'о'), + (0x1E05D, 'M', 'п'), + (0x1E05E, 'M', 'с'), + (0x1E05F, 'M', 'у'), + (0x1E060, 'M', 'ф'), + (0x1E061, 'M', 'х'), + (0x1E062, 'M', 'ц'), + (0x1E063, 'M', 'ч'), + (0x1E064, 'M', 'ш'), + (0x1E065, 'M', 'ъ'), + (0x1E066, 'M', 'ы'), + (0x1E067, 'M', 'ґ'), + (0x1E068, 'M', 'і'), + (0x1E069, 'M', 'ѕ'), + (0x1E06A, 'M', 'џ'), + (0x1E06B, 'M', 'ҫ'), + (0x1E06C, 'M', 'ꙑ'), + (0x1E06D, 'M', 'ұ'), + (0x1E06E, 'X'), + (0x1E08F, 'V'), + (0x1E090, 'X'), (0x1E100, 'V'), (0x1E12D, 'X'), (0x1E130, 'V'), @@ -7383,6 +7470,8 @@ def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1E2FA, 'X'), (0x1E2FF, 'V'), (0x1E300, 'X'), + (0x1E4D0, 'V'), + (0x1E4FA, 'X'), (0x1E7E0, 'V'), (0x1E7E7, 'X'), (0x1E7E8, 'V'), @@ -7390,10 +7479,6 @@ def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1E7ED, 'V'), (0x1E7EF, 'X'), (0x1E7F0, 'V'), - ] - -def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x1E7FF, 'X'), (0x1E800, 'V'), (0x1E8C5, 'X'), @@ -7409,6 +7494,10 @@ def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1E907, 'M', '𞤩'), (0x1E908, 'M', '𞤪'), (0x1E909, 'M', '𞤫'), + ] + +def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x1E90A, 'M', '𞤬'), (0x1E90B, 'M', '𞤭'), (0x1E90C, 'M', '𞤮'), @@ -7494,10 +7583,6 @@ def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1EE31, 'M', 'ص'), (0x1EE32, 'M', 'ق'), (0x1EE33, 'X'), - ] - -def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x1EE34, 'M', 'ش'), (0x1EE35, 'M', 'ت'), (0x1EE36, 'M', 'ث'), @@ -7513,6 +7598,10 @@ def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1EE48, 'X'), (0x1EE49, 'M', 'ي'), (0x1EE4A, 'X'), + ] + +def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x1EE4B, 'M', 'ل'), (0x1EE4C, 'X'), (0x1EE4D, 'M', 'ن'), @@ -7598,10 +7687,6 @@ def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1EEA3, 'M', 'د'), (0x1EEA4, 'X'), (0x1EEA5, 'M', 'و'), - ] - -def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x1EEA6, 'M', 'ز'), (0x1EEA7, 'M', 'ح'), (0x1EEA8, 'M', 'ط'), @@ -7617,6 +7702,10 @@ def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1EEB2, 'M', 'ق'), (0x1EEB3, 'M', 'ر'), (0x1EEB4, 'M', 'ش'), + ] + +def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x1EEB5, 'M', 'ت'), (0x1EEB6, 'M', 'ث'), (0x1EEB7, 'M', 'خ'), @@ -7702,10 +7791,6 @@ def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1F141, 'M', 'r'), (0x1F142, 'M', 's'), (0x1F143, 'M', 't'), - ] - -def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x1F144, 'M', 'u'), (0x1F145, 'M', 'v'), (0x1F146, 'M', 'w'), @@ -7721,6 +7806,10 @@ def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1F150, 'V'), (0x1F16A, 'M', 'mc'), (0x1F16B, 'M', 'md'), + ] + +def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x1F16C, 'M', 'mr'), (0x1F16D, 'V'), (0x1F190, 'M', 'dj'), @@ -7793,23 +7882,19 @@ def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1F266, 'X'), (0x1F300, 'V'), (0x1F6D8, 'X'), - (0x1F6DD, 'V'), + (0x1F6DC, 'V'), (0x1F6ED, 'X'), (0x1F6F0, 'V'), (0x1F6FD, 'X'), (0x1F700, 'V'), - (0x1F774, 'X'), - (0x1F780, 'V'), - (0x1F7D9, 'X'), + (0x1F777, 'X'), + (0x1F77B, 'V'), + (0x1F7DA, 'X'), (0x1F7E0, 'V'), (0x1F7EC, 'X'), (0x1F7F0, 'V'), (0x1F7F1, 'X'), (0x1F800, 'V'), - ] - -def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x1F80C, 'X'), (0x1F810, 'V'), (0x1F848, 'X'), @@ -7825,24 +7910,24 @@ def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x1FA54, 'X'), (0x1FA60, 'V'), (0x1FA6E, 'X'), + ] + +def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x1FA70, 'V'), - (0x1FA75, 'X'), - (0x1FA78, 'V'), (0x1FA7D, 'X'), (0x1FA80, 'V'), - (0x1FA87, 'X'), + (0x1FA89, 'X'), (0x1FA90, 'V'), - (0x1FAAD, 'X'), - (0x1FAB0, 'V'), - (0x1FABB, 'X'), - (0x1FAC0, 'V'), + (0x1FABE, 'X'), + (0x1FABF, 'V'), (0x1FAC6, 'X'), - (0x1FAD0, 'V'), - (0x1FADA, 'X'), + (0x1FACE, 'V'), + (0x1FADC, 'X'), (0x1FAE0, 'V'), - (0x1FAE8, 'X'), + (0x1FAE9, 'X'), (0x1FAF0, 'V'), - (0x1FAF7, 'X'), + (0x1FAF9, 'X'), (0x1FB00, 'V'), (0x1FB93, 'X'), (0x1FB94, 'V'), @@ -7861,7 +7946,7 @@ def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x20000, 'V'), (0x2A6E0, 'X'), (0x2A700, 'V'), - (0x2B739, 'X'), + (0x2B73A, 'X'), (0x2B740, 'V'), (0x2B81E, 'X'), (0x2B820, 'V'), @@ -7910,10 +7995,6 @@ def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x2F827, 'M', '勤'), (0x2F828, 'M', '勺'), (0x2F829, 'M', '包'), - ] - -def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x2F82A, 'M', '匆'), (0x2F82B, 'M', '北'), (0x2F82C, 'M', '卉'), @@ -7933,6 +8014,10 @@ def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x2F83C, 'M', '咞'), (0x2F83D, 'M', '吸'), (0x2F83E, 'M', '呈'), + ] + +def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x2F83F, 'M', '周'), (0x2F840, 'M', '咢'), (0x2F841, 'M', '哶'), @@ -8014,10 +8099,6 @@ def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x2F88F, 'M', '𪎒'), (0x2F890, 'M', '廾'), (0x2F891, 'M', '𢌱'), - ] - -def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x2F893, 'M', '舁'), (0x2F894, 'M', '弢'), (0x2F896, 'M', '㣇'), @@ -8037,6 +8118,10 @@ def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x2F8A4, 'M', '𢛔'), (0x2F8A5, 'M', '惇'), (0x2F8A6, 'M', '慈'), + ] + +def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x2F8A7, 'M', '慌'), (0x2F8A8, 'M', '慎'), (0x2F8A9, 'M', '慌'), @@ -8118,10 +8203,6 @@ def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x2F8F5, 'M', '殺'), (0x2F8F6, 'M', '殻'), (0x2F8F7, 'M', '𣪍'), - ] - -def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x2F8F8, 'M', '𡴋'), (0x2F8F9, 'M', '𣫺'), (0x2F8FA, 'M', '汎'), @@ -8141,6 +8222,10 @@ def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x2F908, 'M', '港'), (0x2F909, 'M', '湮'), (0x2F90A, 'M', '㴳'), + ] + +def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x2F90B, 'M', '滋'), (0x2F90C, 'M', '滇'), (0x2F90D, 'M', '𣻑'), @@ -8222,10 +8307,6 @@ def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x2F95B, 'M', '穏'), (0x2F95C, 'M', '𥥼'), (0x2F95D, 'M', '𥪧'), - ] - -def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x2F95F, 'X'), (0x2F960, 'M', '䈂'), (0x2F961, 'M', '𥮫'), @@ -8245,6 +8326,10 @@ def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x2F96F, 'M', '縂'), (0x2F970, 'M', '繅'), (0x2F971, 'M', '䌴'), + ] + +def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x2F972, 'M', '𦈨'), (0x2F973, 'M', '𦉇'), (0x2F974, 'M', '䍙'), @@ -8326,10 +8411,6 @@ def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x2F9C0, 'M', '蟡'), (0x2F9C1, 'M', '蠁'), (0x2F9C2, 'M', '䗹'), - ] - -def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ (0x2F9C3, 'M', '衠'), (0x2F9C4, 'M', '衣'), (0x2F9C5, 'M', '𧙧'), @@ -8349,6 +8430,10 @@ def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x2F9D3, 'M', '𧲨'), (0x2F9D4, 'M', '貫'), (0x2F9D5, 'M', '賁'), + ] + +def _seg_81() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ (0x2F9D6, 'M', '贛'), (0x2F9D7, 'M', '起'), (0x2F9D8, 'M', '𧼯'), @@ -8423,6 +8508,8 @@ def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: (0x2FA1E, 'X'), (0x30000, 'V'), (0x3134B, 'X'), + (0x31350, 'V'), + (0x323B0, 'X'), (0xE0100, 'I'), (0xE01F0, 'X'), ] @@ -8509,4 +8596,5 @@ uts46data = tuple( + _seg_78() + _seg_79() + _seg_80() + + _seg_81() ) # type: Tuple[Union[Tuple[int, str], Tuple[int, str, str]], ...] diff --git a/Python310/Lib/site-packages/pip/_vendor/pep517/__init__.py b/Python310/Lib/site-packages/pip/_vendor/pep517/__init__.py index 2b6b885..38ea0f5 100644 --- a/Python310/Lib/site-packages/pip/_vendor/pep517/__init__.py +++ b/Python310/Lib/site-packages/pip/_vendor/pep517/__init__.py @@ -1,6 +1,6 @@ """Wrappers to build Python packages using PEP 517 hooks """ -__version__ = '0.12.0' +__version__ = '0.13.0' from .wrappers import * # noqa: F401, F403 diff --git a/Python310/Lib/site-packages/pip/_vendor/pep517/_compat.py b/Python310/Lib/site-packages/pip/_vendor/pep517/_compat.py new file mode 100644 index 0000000..95e509c --- /dev/null +++ b/Python310/Lib/site-packages/pip/_vendor/pep517/_compat.py @@ -0,0 +1,8 @@ +__all__ = ("tomllib",) + +import sys + +if sys.version_info >= (3, 11): + import tomllib +else: + from pip._vendor import tomli as tomllib diff --git a/Python310/Lib/site-packages/pip/_vendor/pep517/build.py b/Python310/Lib/site-packages/pip/_vendor/pep517/build.py index bc463b2..b30909c 100644 --- a/Python310/Lib/site-packages/pip/_vendor/pep517/build.py +++ b/Python310/Lib/site-packages/pip/_vendor/pep517/build.py @@ -1,15 +1,14 @@ """Build a project using PEP 517 hooks. """ import argparse -import io import logging import os import shutil +import tempfile +from ._compat import tomllib from .envbuild import BuildEnvironment from .wrappers import Pep517HookCaller -from .dirtools import tempdir, mkdir_p -from .compat import FileNotFoundError, toml_load log = logging.getLogger(__name__) @@ -31,8 +30,8 @@ def load_system(source_dir): Load the build system from a source dir (pyproject.toml). """ pyproject = os.path.join(source_dir, 'pyproject.toml') - with io.open(pyproject, 'rb') as f: - pyproject_data = toml_load(f) + with open(pyproject, 'rb') as f: + pyproject_data = tomllib.load(f) return pyproject_data['build-system'] @@ -64,7 +63,7 @@ def _do_build(hooks, env, dist, dest): env.pip_install(reqs) log.info('Installed dynamic build dependencies') - with tempdir() as td: + with tempfile.TemporaryDirectory() as td: log.info('Trying to build %s in %s', dist, td) build_name = 'build_{dist}'.format(**locals()) build = getattr(hooks, build_name) @@ -76,7 +75,7 @@ def _do_build(hooks, env, dist, dest): def build(source_dir, dist, dest=None, system=None): system = system or load_system(source_dir) dest = os.path.join(source_dir, dest or 'dist') - mkdir_p(dest) + os.makedirs(dest, exist_ok=True) validate_system(system) hooks = Pep517HookCaller( diff --git a/Python310/Lib/site-packages/pip/_vendor/pep517/check.py b/Python310/Lib/site-packages/pip/_vendor/pep517/check.py index bf3c722..b79f627 100644 --- a/Python310/Lib/site-packages/pip/_vendor/pep517/check.py +++ b/Python310/Lib/site-packages/pip/_vendor/pep517/check.py @@ -1,19 +1,19 @@ """Check a project and backend by attempting to build using PEP 517 hooks. """ import argparse -import io import logging import os -from os.path import isfile, join as pjoin import shutil -from subprocess import CalledProcessError import sys import tarfile -from tempfile import mkdtemp import zipfile +from os.path import isfile +from os.path import join as pjoin +from subprocess import CalledProcessError +from tempfile import mkdtemp +from ._compat import tomllib from .colorlog import enable_colourful_output -from .compat import TOMLDecodeError, toml_load from .envbuild import BuildEnvironment from .wrappers import Pep517HookCaller @@ -142,15 +142,15 @@ def check(source_dir): return False try: - with io.open(pyproject, 'rb') as f: - pyproject_data = toml_load(f) + with open(pyproject, 'rb') as f: + pyproject_data = tomllib.load(f) # Ensure the mandatory data can be loaded buildsys = pyproject_data['build-system'] requires = buildsys['requires'] backend = buildsys['build-backend'] backend_path = buildsys.get('backend-path') log.info('Loaded pyproject.toml') - except (TOMLDecodeError, KeyError): + except (tomllib.TOMLDecodeError, KeyError): log.error("Invalid pyproject.toml", exc_info=True) return False diff --git a/Python310/Lib/site-packages/pip/_vendor/pep517/colorlog.py b/Python310/Lib/site-packages/pip/_vendor/pep517/colorlog.py index 69c8a59..66310a7 100644 --- a/Python310/Lib/site-packages/pip/_vendor/pep517/colorlog.py +++ b/Python310/Lib/site-packages/pip/_vendor/pep517/colorlog.py @@ -73,8 +73,6 @@ class LogFormatter(logging.Formatter): # right conversion in python 3. fg_color = (curses.tigetstr("setaf") or curses.tigetstr("setf") or "") - if (3, 0) < sys.version_info < (3, 2, 3): - fg_color = str(fg_color, "ascii") for levelno, code in self.DEFAULT_COLORS.items(): self._colors[levelno] = str( diff --git a/Python310/Lib/site-packages/pip/_vendor/pep517/compat.py b/Python310/Lib/site-packages/pip/_vendor/pep517/compat.py deleted file mode 100644 index 730ef5f..0000000 --- a/Python310/Lib/site-packages/pip/_vendor/pep517/compat.py +++ /dev/null @@ -1,51 +0,0 @@ -"""Python 2/3 compatibility""" -import io -import json -import sys - - -# Handle reading and writing JSON in UTF-8, on Python 3 and 2. - -if sys.version_info[0] >= 3: - # Python 3 - def write_json(obj, path, **kwargs): - with open(path, 'w', encoding='utf-8') as f: - json.dump(obj, f, **kwargs) - - def read_json(path): - with open(path, 'r', encoding='utf-8') as f: - return json.load(f) - -else: - # Python 2 - def write_json(obj, path, **kwargs): - with open(path, 'wb') as f: - json.dump(obj, f, encoding='utf-8', **kwargs) - - def read_json(path): - with open(path, 'rb') as f: - return json.load(f) - - -# FileNotFoundError - -try: - FileNotFoundError = FileNotFoundError -except NameError: - FileNotFoundError = IOError - - -if sys.version_info < (3, 6): - from toml import load as _toml_load # noqa: F401 - - def toml_load(f): - w = io.TextIOWrapper(f, encoding="utf8", newline="") - try: - return _toml_load(w) - finally: - w.detach() - - from toml import TomlDecodeError as TOMLDecodeError # noqa: F401 -else: - from pip._vendor.tomli import load as toml_load # noqa: F401 - from pip._vendor.tomli import TOMLDecodeError # noqa: F401 diff --git a/Python310/Lib/site-packages/pip/_vendor/pep517/dirtools.py b/Python310/Lib/site-packages/pip/_vendor/pep517/dirtools.py index 58c6ca0..3eff4d8 100644 --- a/Python310/Lib/site-packages/pip/_vendor/pep517/dirtools.py +++ b/Python310/Lib/site-packages/pip/_vendor/pep517/dirtools.py @@ -1,33 +1,8 @@ -import os import io -import contextlib -import tempfile -import shutil -import errno +import os import zipfile -@contextlib.contextmanager -def tempdir(): - """Create a temporary directory in a context manager.""" - td = tempfile.mkdtemp() - try: - yield td - finally: - shutil.rmtree(td) - - -def mkdir_p(*args, **kwargs): - """Like `mkdir`, but does not raise an exception if the - directory already exists. - """ - try: - return os.mkdir(*args, **kwargs) - except OSError as exc: - if exc.errno != errno.EEXIST: - raise - - def dir_to_zipfile(root): """Construct an in-memory zip file for a directory.""" buffer = io.BytesIO() diff --git a/Python310/Lib/site-packages/pip/_vendor/pep517/envbuild.py b/Python310/Lib/site-packages/pip/_vendor/pep517/envbuild.py index fe8873c..c0415c4 100644 --- a/Python310/Lib/site-packages/pip/_vendor/pep517/envbuild.py +++ b/Python310/Lib/site-packages/pip/_vendor/pep517/envbuild.py @@ -1,27 +1,26 @@ """Build wheels/sdists by installing build deps to a temporary environment. """ -import io -import os import logging +import os import shutil -from subprocess import check_call import sys +from subprocess import check_call from sysconfig import get_paths from tempfile import mkdtemp -from .compat import toml_load -from .wrappers import Pep517HookCaller, LoggerWrapper +from ._compat import tomllib +from .wrappers import LoggerWrapper, Pep517HookCaller log = logging.getLogger(__name__) def _load_pyproject(source_dir): - with io.open( + with open( os.path.join(source_dir, 'pyproject.toml'), 'rb', ) as f: - pyproject_data = toml_load(f) + pyproject_data = tomllib.load(f) buildsys = pyproject_data['build-system'] return ( buildsys['requires'], @@ -30,7 +29,7 @@ def _load_pyproject(source_dir): ) -class BuildEnvironment(object): +class BuildEnvironment: """Context manager to install build deps in a simple temporary environment Based on code I wrote for pip, which is MIT licensed. diff --git a/Python310/Lib/site-packages/pip/_vendor/pep517/in_process/__init__.py b/Python310/Lib/site-packages/pip/_vendor/pep517/in_process/__init__.py index c932313..281a356 100644 --- a/Python310/Lib/site-packages/pip/_vendor/pep517/in_process/__init__.py +++ b/Python310/Lib/site-packages/pip/_vendor/pep517/in_process/__init__.py @@ -3,15 +3,24 @@ The subpackage should stay as empty as possible to avoid shadowing modules that the backend might import. """ -from os.path import dirname, abspath, join as pjoin from contextlib import contextmanager +from os.path import abspath, dirname +from os.path import join as pjoin try: import importlib.resources as resources - - def _in_proc_script_path(): - return resources.path(__package__, '_in_process.py') + try: + resources.files + except AttributeError: + # Python 3.8 compatibility + def _in_proc_script_path(): + return resources.path(__package__, '_in_process.py') + else: + def _in_proc_script_path(): + return resources.as_file( + resources.files(__package__).joinpath('_in_process.py')) except ImportError: + # Python 3.6 compatibility @contextmanager def _in_proc_script_path(): yield pjoin(dirname(abspath(__file__)), '_in_process.py') diff --git a/Python310/Lib/site-packages/pip/_vendor/pep517/in_process/_in_process.py b/Python310/Lib/site-packages/pip/_vendor/pep517/in_process/_in_process.py index 954a4ab..ae4cf9e 100644 --- a/Python310/Lib/site-packages/pip/_vendor/pep517/in_process/_in_process.py +++ b/Python310/Lib/site-packages/pip/_vendor/pep517/in_process/_in_process.py @@ -12,41 +12,29 @@ Results: - control_dir/output.json - {"return_val": ...} """ -from glob import glob -from importlib import import_module import json import os import os.path -from os.path import join as pjoin import re import shutil import sys import traceback +from glob import glob +from importlib import import_module +from os.path import join as pjoin -# This file is run as a script, and `import compat` is not zip-safe, so we -# include write_json() and read_json() from compat.py. -# -# Handle reading and writing JSON in UTF-8, on Python 3 and 2. +# This file is run as a script, and `import wrappers` is not zip-safe, so we +# include write_json() and read_json() from wrappers.py. -if sys.version_info[0] >= 3: - # Python 3 - def write_json(obj, path, **kwargs): - with open(path, 'w', encoding='utf-8') as f: - json.dump(obj, f, **kwargs) - def read_json(path): - with open(path, 'r', encoding='utf-8') as f: - return json.load(f) +def write_json(obj, path, **kwargs): + with open(path, 'w', encoding='utf-8') as f: + json.dump(obj, f, **kwargs) -else: - # Python 2 - def write_json(obj, path, **kwargs): - with open(path, 'wb') as f: - json.dump(obj, f, encoding='utf-8', **kwargs) - def read_json(path): - with open(path, 'rb') as f: - return json.load(f) +def read_json(path): + with open(path, encoding='utf-8') as f: + return json.load(f) class BackendUnavailable(Exception): @@ -64,7 +52,7 @@ class BackendInvalid(Exception): class HookMissing(Exception): """Raised if a hook is missing and we are not executing the fallback""" def __init__(self, hook_name=None): - super(HookMissing, self).__init__(hook_name) + super().__init__(hook_name) self.hook_name = hook_name diff --git a/Python310/Lib/site-packages/pip/_vendor/pep517/meta.py b/Python310/Lib/site-packages/pip/_vendor/pep517/meta.py index d525de5..4afc3c0 100644 --- a/Python310/Lib/site-packages/pip/_vendor/pep517/meta.py +++ b/Python310/Lib/site-packages/pip/_vendor/pep517/meta.py @@ -1,10 +1,11 @@ """Build metadata for a project using PEP 517 hooks. """ import argparse +import functools import logging import os import shutil -import functools +import tempfile try: import importlib.metadata as imp_meta @@ -16,10 +17,10 @@ try: except ImportError: from zipp import Path +from .build import compat_system, load_system, validate_system +from .dirtools import dir_to_zipfile from .envbuild import BuildEnvironment from .wrappers import Pep517HookCaller, quiet_subprocess_runner -from .dirtools import tempdir, mkdir_p, dir_to_zipfile -from .build import validate_system, load_system, compat_system log = logging.getLogger(__name__) @@ -31,7 +32,7 @@ def _prep_meta(hooks, env, dest): env.pip_install(reqs) log.info('Installed dynamic build dependencies') - with tempdir() as td: + with tempfile.TemporaryDirectory() as td: log.info('Trying to build metadata in %s', td) filename = hooks.prepare_metadata_for_build_wheel(td, {}) source = os.path.join(td, filename) @@ -41,7 +42,7 @@ def _prep_meta(hooks, env, dest): def build(source_dir='.', dest=None, system=None): system = system or load_system(source_dir) dest = os.path.join(source_dir, dest or 'dist') - mkdir_p(dest) + os.makedirs(dest, exist_ok=True) validate_system(system) hooks = Pep517HookCaller( source_dir, system['build-backend'], system.get('backend-path') @@ -54,7 +55,7 @@ def build(source_dir='.', dest=None, system=None): def build_as_zip(builder=build): - with tempdir() as out_dir: + with tempfile.TemporaryDirectory() as out_dir: builder(dest=out_dir) return dir_to_zipfile(out_dir) diff --git a/Python310/Lib/site-packages/pip/_vendor/pep517/wrappers.py b/Python310/Lib/site-packages/pip/_vendor/pep517/wrappers.py index e031ed7..987a62a 100644 --- a/Python310/Lib/site-packages/pip/_vendor/pep517/wrappers.py +++ b/Python310/Lib/site-packages/pip/_vendor/pep517/wrappers.py @@ -1,13 +1,13 @@ +import json +import os +import sys +import tempfile import threading from contextlib import contextmanager -import os -from os.path import abspath, join as pjoin -import shutil -from subprocess import check_call, check_output, STDOUT -import sys -from tempfile import mkdtemp +from os.path import abspath +from os.path import join as pjoin +from subprocess import STDOUT, check_call, check_output -from . import compat from .in_process import _in_proc_script_path __all__ = [ @@ -21,13 +21,14 @@ __all__ = [ ] -@contextmanager -def tempdir(): - td = mkdtemp() - try: - yield td - finally: - shutil.rmtree(td) +def write_json(obj, path, **kwargs): + with open(path, 'w', encoding='utf-8') as f: + json.dump(obj, f, **kwargs) + + +def read_json(path): + with open(path, encoding='utf-8') as f: + return json.load(f) class BackendUnavailable(Exception): @@ -47,7 +48,7 @@ class BackendInvalid(Exception): class HookMissing(Exception): """Will be raised on missing hooks.""" def __init__(self, hook_name): - super(HookMissing, self).__init__(hook_name) + super().__init__(hook_name) self.hook_name = hook_name @@ -99,7 +100,7 @@ def norm_and_check(source_tree, requested): return abs_requested -class Pep517HookCaller(object): +class Pep517HookCaller: """A wrapper around a source directory to be built with a PEP 517 backend. :param source_dir: The path to the source directory, containing @@ -292,29 +293,15 @@ class Pep517HookCaller(object): }) def _call_hook(self, hook_name, kwargs): - # On Python 2, pytoml returns Unicode values (which is correct) but the - # environment passed to check_call needs to contain string values. We - # convert here by encoding using ASCII (the backend can only contain - # letters, digits and _, . and : characters, and will be used as a - # Python identifier, so non-ASCII content is wrong on Python 2 in - # any case). - # For backend_path, we use sys.getfilesystemencoding. - if sys.version_info[0] == 2: - build_backend = self.build_backend.encode('ASCII') - else: - build_backend = self.build_backend - extra_environ = {'PEP517_BUILD_BACKEND': build_backend} + extra_environ = {'PEP517_BUILD_BACKEND': self.build_backend} if self.backend_path: backend_path = os.pathsep.join(self.backend_path) - if sys.version_info[0] == 2: - backend_path = backend_path.encode(sys.getfilesystemencoding()) extra_environ['PEP517_BACKEND_PATH'] = backend_path - with tempdir() as td: + with tempfile.TemporaryDirectory() as td: hook_input = {'kwargs': kwargs} - compat.write_json(hook_input, pjoin(td, 'input.json'), - indent=2) + write_json(hook_input, pjoin(td, 'input.json'), indent=2) # Run the hook in a subprocess with _in_proc_script_path() as script: @@ -325,7 +312,7 @@ class Pep517HookCaller(object): extra_environ=extra_environ ) - data = compat.read_json(pjoin(td, 'output.json')) + data = read_json(pjoin(td, 'output.json')) if data.get('unsupported'): raise UnsupportedOperation(data.get('traceback', '')) if data.get('no_backend'): diff --git a/Python310/Lib/site-packages/pip/_vendor/pygments/__init__.py b/Python310/Lib/site-packages/pip/_vendor/pygments/__init__.py index 52ff035..7185e53 100644 --- a/Python310/Lib/site-packages/pip/_vendor/pygments/__init__.py +++ b/Python310/Lib/site-packages/pip/_vendor/pygments/__init__.py @@ -26,7 +26,7 @@ """ from io import StringIO, BytesIO -__version__ = '2.12.0' +__version__ = '2.13.0' __docformat__ = 'restructuredtext' __all__ = ['lex', 'format', 'highlight'] @@ -38,10 +38,10 @@ def lex(code, lexer): """ try: return lexer.get_tokens(code) - except TypeError as err: - if (isinstance(err.args[0], str) and - ('unbound method get_tokens' in err.args[0] or - 'missing 1 required positional argument' in err.args[0])): + except TypeError: + # Heuristic to catch a common mistake. + from pip._vendor.pygments.lexer import RegexLexer + if isinstance(lexer, type) and issubclass(lexer, RegexLexer): raise TypeError('lex() argument must be a lexer instance, ' 'not a class') raise @@ -62,10 +62,10 @@ def format(tokens, formatter, outfile=None): # pylint: disable=redefined-builti return realoutfile.getvalue() else: formatter.format(tokens, outfile) - except TypeError as err: - if (isinstance(err.args[0], str) and - ('unbound method format' in err.args[0] or - 'missing 1 required positional argument' in err.args[0])): + except TypeError: + # Heuristic to catch a common mistake. + from pip._vendor.pygments.formatter import Formatter + if isinstance(formatter, type) and issubclass(formatter, Formatter): raise TypeError('format() argument must be a formatter instance, ' 'not a class') raise @@ -80,4 +80,3 @@ def highlight(code, lexer, formatter, outfile=None): it is returned as a string. """ return format(lex(code, lexer), formatter, outfile) - diff --git a/Python310/Lib/site-packages/pip/_vendor/pygments/cmdline.py b/Python310/Lib/site-packages/pip/_vendor/pygments/cmdline.py index 349c626..de73b06 100644 --- a/Python310/Lib/site-packages/pip/_vendor/pygments/cmdline.py +++ b/Python310/Lib/site-packages/pip/_vendor/pygments/cmdline.py @@ -25,7 +25,7 @@ from pip._vendor.pygments.formatters.latex import LatexEmbeddedLexer, LatexForma from pip._vendor.pygments.formatters import get_all_formatters, get_formatter_by_name, \ load_formatter_from_file, get_formatter_for_filename, find_formatter_class from pip._vendor.pygments.formatters.terminal import TerminalFormatter -from pip._vendor.pygments.formatters.terminal256 import Terminal256Formatter +from pip._vendor.pygments.formatters.terminal256 import Terminal256Formatter, TerminalTrueColorFormatter from pip._vendor.pygments.filters import get_all_filters, find_filter_class from pip._vendor.pygments.styles import get_all_styles, get_style_by_name @@ -445,7 +445,9 @@ def main_inner(parser, argns): return 1 else: if not fmter: - if '256' in os.environ.get('TERM', ''): + if os.environ.get('COLORTERM','') in ('truecolor', '24bit'): + fmter = TerminalTrueColorFormatter(**parsed_opts) + elif '256' in os.environ.get('TERM', ''): fmter = Terminal256Formatter(**parsed_opts) else: fmter = TerminalFormatter(**parsed_opts) @@ -636,6 +638,9 @@ def main(args=sys.argv): try: return main_inner(parser, argns) + except BrokenPipeError: + # someone closed our stdout, e.g. by quitting a pager. + return 0 except Exception: if argns.v: print(file=sys.stderr) diff --git a/Python310/Lib/site-packages/pip/_vendor/pygments/filters/__init__.py b/Python310/Lib/site-packages/pip/_vendor/pygments/filters/__init__.py index 5c99ce2..c302a6c 100644 --- a/Python310/Lib/site-packages/pip/_vendor/pygments/filters/__init__.py +++ b/Python310/Lib/site-packages/pip/_vendor/pygments/filters/__init__.py @@ -69,13 +69,16 @@ class CodeTagFilter(Filter): `codetags` : list of strings A list of strings that are flagged as code tags. The default is to - highlight ``XXX``, ``TODO``, ``BUG`` and ``NOTE``. + highlight ``XXX``, ``TODO``, ``FIXME``, ``BUG`` and ``NOTE``. + + .. versionchanged:: 2.13 + Now recognizes ``FIXME`` by default. """ def __init__(self, **options): Filter.__init__(self, **options) tags = get_list_opt(options, 'codetags', - ['XXX', 'TODO', 'BUG', 'NOTE']) + ['XXX', 'TODO', 'FIXME', 'BUG', 'NOTE']) self.tag_re = re.compile(r'\b(%s)\b' % '|'.join([ re.escape(tag) for tag in tags if tag ])) diff --git a/Python310/Lib/site-packages/pip/_vendor/pygments/formatters/__init__.py b/Python310/Lib/site-packages/pip/_vendor/pygments/formatters/__init__.py index 7023aae..43c4c89 100644 --- a/Python310/Lib/site-packages/pip/_vendor/pygments/formatters/__init__.py +++ b/Python310/Lib/site-packages/pip/_vendor/pygments/formatters/__init__.py @@ -11,7 +11,7 @@ import re import sys import types -import fnmatch +from fnmatch import fnmatch from os.path import basename from pip._vendor.pygments.formatters._mapping import FORMATTERS @@ -22,16 +22,6 @@ __all__ = ['get_formatter_by_name', 'get_formatter_for_filename', 'get_all_formatters', 'load_formatter_from_file'] + list(FORMATTERS) _formatter_cache = {} # classes by name -_pattern_cache = {} - - -def _fn_matches(fn, glob): - """Return whether the supplied file name fn matches pattern filename.""" - if glob not in _pattern_cache: - pattern = _pattern_cache[glob] = re.compile(fnmatch.translate(glob)) - return pattern.match(fn) - return _pattern_cache[glob].match(fn) - def _load_formatters(module_name): """Load a formatter (and all others in the module too).""" @@ -122,13 +112,13 @@ def get_formatter_for_filename(fn, **options): fn = basename(fn) for modname, name, _, filenames, _ in FORMATTERS.values(): for filename in filenames: - if _fn_matches(fn, filename): + if fnmatch(fn, filename): if name not in _formatter_cache: _load_formatters(modname) return _formatter_cache[name](**options) for cls in find_plugin_formatters(): for filename in cls.filenames: - if _fn_matches(fn, filename): + if fnmatch(fn, filename): return cls(**options) raise ClassNotFound("no formatter found for file name %r" % fn) diff --git a/Python310/Lib/site-packages/pip/_vendor/pygments/formatters/_mapping.py b/Python310/Lib/site-packages/pip/_vendor/pygments/formatters/_mapping.py index db1a8d1..6e34f96 100644 --- a/Python310/Lib/site-packages/pip/_vendor/pygments/formatters/_mapping.py +++ b/Python310/Lib/site-packages/pip/_vendor/pygments/formatters/_mapping.py @@ -1,16 +1,5 @@ -""" - pygments.formatters._mapping - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - Formatter mapping definitions. This file is generated by itself. Every time - you change something on a builtin formatter definition, run this script from - the formatters folder to update it. - - Do not alter the FORMATTERS dictionary by hand. - - :copyright: Copyright 2006-2022 by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" +# Automatically generated by scripts/gen_mapfiles.py. +# DO NOT EDIT BY HAND; run `make mapfiles` instead. FORMATTERS = { 'BBCodeFormatter': ('pygments.formatters.bbcode', 'BBCode', ('bbcode', 'bb'), (), 'Format tokens with BBcodes. These formatting codes are used by many bulletin boards, so you can highlight your sourcecode with pygments before posting it there.'), @@ -30,55 +19,5 @@ FORMATTERS = { 'Terminal256Formatter': ('pygments.formatters.terminal256', 'Terminal256', ('terminal256', 'console256', '256'), (), 'Format tokens with ANSI color sequences, for output in a 256-color terminal or console. Like in `TerminalFormatter` color sequences are terminated at newlines, so that paging the output works correctly.'), 'TerminalFormatter': ('pygments.formatters.terminal', 'Terminal', ('terminal', 'console'), (), 'Format tokens with ANSI color sequences, for output in a text console. Color sequences are terminated at newlines, so that paging the output works correctly.'), 'TerminalTrueColorFormatter': ('pygments.formatters.terminal256', 'TerminalTrueColor', ('terminal16m', 'console16m', '16m'), (), 'Format tokens with ANSI color sequences, for output in a true-color terminal or console. Like in `TerminalFormatter` color sequences are terminated at newlines, so that paging the output works correctly.'), - 'TestcaseFormatter': ('pygments.formatters.other', 'Testcase', ('testcase',), (), 'Format tokens as appropriate for a new testcase.') + 'TestcaseFormatter': ('pygments.formatters.other', 'Testcase', ('testcase',), (), 'Format tokens as appropriate for a new testcase.'), } - -if __name__ == '__main__': # pragma: no cover - import sys - import os - - # lookup formatters - found_formatters = [] - imports = [] - sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', '..')) - from pip._vendor.pygments.util import docstring_headline - - for root, dirs, files in os.walk('.'): - for filename in files: - if filename.endswith('.py') and not filename.startswith('_'): - module_name = 'pygments.formatters%s.%s' % ( - root[1:].replace('/', '.'), filename[:-3]) - print(module_name) - module = __import__(module_name, None, None, ['']) - for formatter_name in module.__all__: - formatter = getattr(module, formatter_name) - found_formatters.append( - '%r: %r' % (formatter_name, - (module_name, - formatter.name, - tuple(formatter.aliases), - tuple(formatter.filenames), - docstring_headline(formatter)))) - # sort them to make the diff minimal - found_formatters.sort() - - # extract useful sourcecode from this file - with open(__file__) as fp: - content = fp.read() - # replace crnl to nl for Windows. - # - # Note that, originally, contributors should keep nl of master - # repository, for example by using some kind of automatic - # management EOL, like `EolExtension - # `. - content = content.replace("\r\n", "\n") - header = content[:content.find('FORMATTERS = {')] - footer = content[content.find("if __name__ == '__main__':"):] - - # write new file - with open(__file__, 'w') as fp: - fp.write(header) - fp.write('FORMATTERS = {\n %s\n}\n\n' % ',\n '.join(found_formatters)) - fp.write(footer) - - print ('=== %d formatters processed.' % len(found_formatters)) diff --git a/Python310/Lib/site-packages/pip/_vendor/pygments/formatters/img.py b/Python310/Lib/site-packages/pip/_vendor/pygments/formatters/img.py index 2cc0b2b..0f36a32 100644 --- a/Python310/Lib/site-packages/pip/_vendor/pygments/formatters/img.py +++ b/Python310/Lib/site-packages/pip/_vendor/pygments/formatters/img.py @@ -206,13 +206,17 @@ class FontManager: """ Get the character size. """ - return self.fonts['NORMAL'].getsize('M') + return self.get_text_size('M') def get_text_size(self, text): """ - Get the text size(width, height). + Get the text size (width, height). """ - return self.fonts['NORMAL'].getsize(text) + font = self.fonts['NORMAL'] + if hasattr(font, 'getbbox'): # Pillow >= 9.2.0 + return font.getbbox(text)[2:4] + else: + return font.getsize(text) def get_font(self, bold, oblique): """ @@ -520,7 +524,7 @@ class ImageFormatter(Formatter): text_fg = self._get_text_color(style), text_bg = self._get_text_bg_color(style), ) - temp_width, temp_hight = self.fonts.get_text_size(temp) + temp_width, _ = self.fonts.get_text_size(temp) linelength += temp_width maxlinelength = max(maxlinelength, linelength) charno += len(temp) diff --git a/Python310/Lib/site-packages/pip/_vendor/pygments/lexers/__init__.py b/Python310/Lib/site-packages/pip/_vendor/pygments/lexers/__init__.py index 3f404e4..ed69f24 100644 --- a/Python310/Lib/site-packages/pip/_vendor/pygments/lexers/__init__.py +++ b/Python310/Lib/site-packages/pip/_vendor/pygments/lexers/__init__.py @@ -11,7 +11,7 @@ import re import sys import types -import fnmatch +from fnmatch import fnmatch from os.path import basename from pip._vendor.pygments.lexers._mapping import LEXERS @@ -28,16 +28,6 @@ __all__ = ['get_lexer_by_name', 'get_lexer_for_filename', 'find_lexer_class', 'guess_lexer', 'load_lexer_from_file'] + list(LEXERS) + list(COMPAT) _lexer_cache = {} -_pattern_cache = {} - - -def _fn_matches(fn, glob): - """Return whether the supplied file name fn matches pattern filename.""" - if glob not in _pattern_cache: - pattern = _pattern_cache[glob] = re.compile(fnmatch.translate(glob)) - return pattern.match(fn) - return _pattern_cache[glob].match(fn) - def _load_lexers(module_name): """Load a lexer (and all others in the module too).""" @@ -169,13 +159,13 @@ def find_lexer_class_for_filename(_fn, code=None): fn = basename(_fn) for modname, name, _, filenames, _ in LEXERS.values(): for filename in filenames: - if _fn_matches(fn, filename): + if fnmatch(fn, filename): if name not in _lexer_cache: _load_lexers(modname) matches.append((_lexer_cache[name], filename)) for cls in find_plugin_lexers(): for filename in cls.filenames: - if _fn_matches(fn, filename): + if fnmatch(fn, filename): matches.append((cls, filename)) if isinstance(code, bytes): @@ -262,11 +252,11 @@ def guess_lexer_for_filename(_fn, _text, **options): matching_lexers = set() for lexer in _iter_lexerclasses(): for filename in lexer.filenames: - if _fn_matches(fn, filename): + if fnmatch(fn, filename): matching_lexers.add(lexer) primary[lexer] = True for filename in lexer.alias_filenames: - if _fn_matches(fn, filename): + if fnmatch(fn, filename): matching_lexers.add(lexer) primary[lexer] = False if not matching_lexers: diff --git a/Python310/Lib/site-packages/pip/_vendor/pygments/lexers/_mapping.py b/Python310/Lib/site-packages/pip/_vendor/pygments/lexers/_mapping.py index 44dbfe6..40dcaa3 100644 --- a/Python310/Lib/site-packages/pip/_vendor/pygments/lexers/_mapping.py +++ b/Python310/Lib/site-packages/pip/_vendor/pygments/lexers/_mapping.py @@ -1,16 +1,5 @@ -""" - pygments.lexers._mapping - ~~~~~~~~~~~~~~~~~~~~~~~~ - - Lexer mapping definitions. This file is generated by itself. Every time - you change something on a builtin lexer definition, run this script from - the lexers folder to update it. - - Do not alter the LEXERS dictionary by hand. - - :copyright: Copyright 2006-2014, 2016 by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" +# Automatically generated by scripts/gen_mapfiles.py. +# DO NOT EDIT BY HAND; run `make mapfiles` instead. LEXERS = { 'ABAPLexer': ('pip._vendor.pygments.lexers.business', 'ABAP', ('abap',), ('*.abap', '*.ABAP'), ('text/x-abap',)), @@ -103,6 +92,7 @@ LEXERS = { 'ColdfusionCFCLexer': ('pip._vendor.pygments.lexers.templates', 'Coldfusion CFC', ('cfc',), ('*.cfc',), ()), 'ColdfusionHtmlLexer': ('pip._vendor.pygments.lexers.templates', 'Coldfusion HTML', ('cfm',), ('*.cfm', '*.cfml'), ('application/x-coldfusion',)), 'ColdfusionLexer': ('pip._vendor.pygments.lexers.templates', 'cfstatement', ('cfs',), (), ()), + 'Comal80Lexer': ('pip._vendor.pygments.lexers.comal', 'COMAL-80', ('comal', 'comal80'), ('*.cml', '*.comal'), ()), 'CommonLispLexer': ('pip._vendor.pygments.lexers.lisp', 'Common Lisp', ('common-lisp', 'cl', 'lisp'), ('*.cl', '*.lisp'), ('text/x-common-lisp',)), 'ComponentPascalLexer': ('pip._vendor.pygments.lexers.oberon', 'Component Pascal', ('componentpascal', 'cp'), ('*.cp', '*.cps'), ('text/x-component-pascal',)), 'CoqLexer': ('pip._vendor.pygments.lexers.theorem', 'Coq', ('coq',), ('*.v',), ('text/x-coq',)), @@ -229,6 +219,7 @@ LEXERS = { 'IrcLogsLexer': ('pip._vendor.pygments.lexers.textfmts', 'IRC logs', ('irc',), ('*.weechatlog',), ('text/x-irclog',)), 'IsabelleLexer': ('pip._vendor.pygments.lexers.theorem', 'Isabelle', ('isabelle',), ('*.thy',), ('text/x-isabelle',)), 'JLexer': ('pip._vendor.pygments.lexers.j', 'J', ('j',), ('*.ijs',), ('text/x-j',)), + 'JMESPathLexer': ('pip._vendor.pygments.lexers.jmespath', 'JMESPath', ('jmespath', 'jp'), ('*.jp',), ()), 'JSLTLexer': ('pip._vendor.pygments.lexers.jslt', 'JSLT', ('jslt',), ('*.jslt',), ('text/x-jslt',)), 'JagsLexer': ('pip._vendor.pygments.lexers.modeling', 'JAGS', ('jags',), ('*.jag', '*.bug'), ()), 'JasminLexer': ('pip._vendor.pygments.lexers.jvm', 'Jasmin', ('jasmin', 'jasminxt'), ('*.j',), ()), @@ -462,6 +453,7 @@ LEXERS = { 'SourcesListLexer': ('pip._vendor.pygments.lexers.installers', 'Debian Sourcelist', ('debsources', 'sourceslist', 'sources.list'), ('sources.list',), ()), 'SparqlLexer': ('pip._vendor.pygments.lexers.rdf', 'SPARQL', ('sparql',), ('*.rq', '*.sparql'), ('application/sparql-query',)), 'SpiceLexer': ('pip._vendor.pygments.lexers.spice', 'Spice', ('spice', 'spicelang'), ('*.spice',), ('text/x-spice',)), + 'SqlJinjaLexer': ('pip._vendor.pygments.lexers.templates', 'SQL+Jinja', ('sql+jinja',), ('*.sql', '*.sql.j2', '*.sql.jinja2'), ()), 'SqlLexer': ('pip._vendor.pygments.lexers.sql', 'SQL', ('sql',), ('*.sql',), ('text/x-sql',)), 'SqliteConsoleLexer': ('pip._vendor.pygments.lexers.sql', 'sqlite3con', ('sqlite3',), ('*.sqlite3-console',), ('text/x-sqlite3-console',)), 'SquidConfLexer': ('pip._vendor.pygments.lexers.configs', 'SquidConf', ('squidconf', 'squid.conf', 'squid'), ('squid.conf',), ('text/x-squidconf',)), @@ -516,7 +508,7 @@ LEXERS = { 'VGLLexer': ('pip._vendor.pygments.lexers.dsls', 'VGL', ('vgl',), ('*.rpf',), ()), 'ValaLexer': ('pip._vendor.pygments.lexers.c_like', 'Vala', ('vala', 'vapi'), ('*.vala', '*.vapi'), ('text/x-vala',)), 'VbNetAspxLexer': ('pip._vendor.pygments.lexers.dotnet', 'aspx-vb', ('aspx-vb',), ('*.aspx', '*.asax', '*.ascx', '*.ashx', '*.asmx', '*.axd'), ()), - 'VbNetLexer': ('pip._vendor.pygments.lexers.dotnet', 'VB.net', ('vb.net', 'vbnet'), ('*.vb', '*.bas'), ('text/x-vbnet', 'text/x-vba')), + 'VbNetLexer': ('pip._vendor.pygments.lexers.dotnet', 'VB.net', ('vb.net', 'vbnet', 'lobas', 'oobas', 'sobas'), ('*.vb', '*.bas'), ('text/x-vbnet', 'text/x-vba')), 'VelocityHtmlLexer': ('pip._vendor.pygments.lexers.templates', 'HTML+Velocity', ('html+velocity',), (), ('text/html+velocity',)), 'VelocityLexer': ('pip._vendor.pygments.lexers.templates', 'Velocity', ('velocity',), ('*.vm', '*.fhtml'), ()), 'VelocityXmlLexer': ('pip._vendor.pygments.lexers.templates', 'XML+Velocity', ('xml+velocity',), (), ('application/xml+velocity',)), @@ -547,50 +539,3 @@ LEXERS = { 'ZigLexer': ('pip._vendor.pygments.lexers.zig', 'Zig', ('zig',), ('*.zig',), ('text/zig',)), 'apdlexer': ('pip._vendor.pygments.lexers.apdlexer', 'ANSYS parametric design language', ('ansys', 'apdl'), ('*.ans',), ()), } - -if __name__ == '__main__': # pragma: no cover - import sys - import os - - # lookup lexers - found_lexers = [] - sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', '..')) - for root, dirs, files in os.walk('.'): - for filename in files: - if filename.endswith('.py') and not filename.startswith('_'): - module_name = 'pygments.lexers%s.%s' % ( - root[1:].replace('/', '.'), filename[:-3]) - print(module_name) - module = __import__(module_name, None, None, ['']) - for lexer_name in module.__all__: - lexer = getattr(module, lexer_name) - found_lexers.append( - '%r: %r' % (lexer_name, - (module_name, - lexer.name, - tuple(lexer.aliases), - tuple(lexer.filenames), - tuple(lexer.mimetypes)))) - # sort them to make the diff minimal - found_lexers.sort() - - # extract useful sourcecode from this file - with open(__file__) as fp: - content = fp.read() - # replace crnl to nl for Windows. - # - # Note that, originally, contributors should keep nl of master - # repository, for example by using some kind of automatic - # management EOL, like `EolExtension - # `. - content = content.replace("\r\n", "\n") - header = content[:content.find('LEXERS = {')] - footer = content[content.find("if __name__ == '__main__':"):] - - # write new file - with open(__file__, 'w') as fp: - fp.write(header) - fp.write('LEXERS = {\n %s,\n}\n\n' % ',\n '.join(found_lexers)) - fp.write(footer) - - print ('=== %d lexers processed.' % len(found_lexers)) diff --git a/Python310/Lib/site-packages/pip/_vendor/pygments/lexers/python.py b/Python310/Lib/site-packages/pip/_vendor/pygments/lexers/python.py index 6bc7a78..c24e3c8 100644 --- a/Python310/Lib/site-packages/pip/_vendor/pygments/lexers/python.py +++ b/Python310/Lib/site-packages/pip/_vendor/pygments/lexers/python.py @@ -142,7 +142,7 @@ class PythonLexer(RegexLexer): combined('fstringescape', 'dqf')), ("([fF])(')", bygroups(String.Affix, String.Single), combined('fstringescape', 'sqf')), - # raw strings + # raw bytes and strings ('(?i)(rb|br|r)(""")', bygroups(String.Affix, String.Double), 'tdqs'), ("(?i)(rb|br|r)(''')", @@ -152,14 +152,24 @@ class PythonLexer(RegexLexer): ("(?i)(rb|br|r)(')", bygroups(String.Affix, String.Single), 'sqs'), # non-raw strings - ('([uUbB]?)(""")', bygroups(String.Affix, String.Double), + ('([uU]?)(""")', bygroups(String.Affix, String.Double), combined('stringescape', 'tdqs')), - ("([uUbB]?)(''')", bygroups(String.Affix, String.Single), + ("([uU]?)(''')", bygroups(String.Affix, String.Single), combined('stringescape', 'tsqs')), - ('([uUbB]?)(")', bygroups(String.Affix, String.Double), + ('([uU]?)(")', bygroups(String.Affix, String.Double), combined('stringescape', 'dqs')), - ("([uUbB]?)(')", bygroups(String.Affix, String.Single), + ("([uU]?)(')", bygroups(String.Affix, String.Single), combined('stringescape', 'sqs')), + # non-raw bytes + ('([bB])(""")', bygroups(String.Affix, String.Double), + combined('bytesescape', 'tdqs')), + ("([bB])(''')", bygroups(String.Affix, String.Single), + combined('bytesescape', 'tsqs')), + ('([bB])(")', bygroups(String.Affix, String.Double), + combined('bytesescape', 'dqs')), + ("([bB])(')", bygroups(String.Affix, String.Single), + combined('bytesescape', 'sqs')), + (r'[^\S\n]+', Text), include('numbers'), (r'!=|==|<<|>>|:=|[-~+/*%=<>&^|.]', Operator), @@ -343,9 +353,12 @@ class PythonLexer(RegexLexer): include('rfstringescape'), include('stringescape'), ], + 'bytesescape': [ + (r'\\([\\abfnrtv"\']|\n|x[a-fA-F0-9]{2}|[0-7]{1,3})', String.Escape) + ], 'stringescape': [ - (r'\\([\\abfnrtv"\']|\n|N\{.*?\}|u[a-fA-F0-9]{4}|' - r'U[a-fA-F0-9]{8}|x[a-fA-F0-9]{2}|[0-7]{1,3})', String.Escape) + (r'\\(N\{.*?\}|u[a-fA-F0-9]{4}|U[a-fA-F0-9]{8})', String.Escape), + include('bytesescape') ], 'fstrings-single': fstring_rules(String.Single), 'fstrings-double': fstring_rules(String.Double), diff --git a/Python310/Lib/site-packages/pip/_vendor/pygments/plugin.py b/Python310/Lib/site-packages/pip/_vendor/pygments/plugin.py index a0431bf..3590bee 100644 --- a/Python310/Lib/site-packages/pip/_vendor/pygments/plugin.py +++ b/Python310/Lib/site-packages/pip/_vendor/pygments/plugin.py @@ -2,9 +2,12 @@ pygments.plugin ~~~~~~~~~~~~~~~ - Pygments setuptools plugin interface. The methods defined - here also work if setuptools isn't installed but they just - return nothing. + Pygments plugin interface. By default, this tries to use + ``importlib.metadata``, which is in the Python standard + library since Python 3.8, or its ``importlib_metadata`` + backport for earlier versions of Python. It falls back on + ``pkg_resources`` if not found. Finally, if ``pkg_resources`` + is not found either, no plugins are loaded at all. lexer plugins:: @@ -34,6 +37,7 @@ :copyright: Copyright 2006-2022 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ + LEXER_ENTRY_POINT = 'pygments.lexers' FORMATTER_ENTRY_POINT = 'pygments.formatters' STYLE_ENTRY_POINT = 'pygments.styles' @@ -42,11 +46,26 @@ FILTER_ENTRY_POINT = 'pygments.filters' def iter_entry_points(group_name): try: - from pip._vendor import pkg_resources - except (ImportError, OSError): - return [] - - return pkg_resources.iter_entry_points(group_name) + from importlib.metadata import entry_points + except ImportError: + try: + from importlib_metadata import entry_points + except ImportError: + try: + from pip._vendor.pkg_resources import iter_entry_points + except (ImportError, OSError): + return [] + else: + return iter_entry_points(group_name) + groups = entry_points() + if hasattr(groups, 'select'): + # New interface in Python 3.10 and newer versions of the + # importlib_metadata backport. + return groups.select(group=group_name) + else: + # Older interface, deprecated in Python 3.10 and recent + # importlib_metadata, but we need it in Python 3.8 and 3.9. + return groups.get(group_name, []) def find_plugin_lexers(): diff --git a/Python310/Lib/site-packages/pip/_vendor/pygments/styles/__init__.py b/Python310/Lib/site-packages/pip/_vendor/pygments/styles/__init__.py index 951ca17..44cc0ef 100644 --- a/Python310/Lib/site-packages/pip/_vendor/pygments/styles/__init__.py +++ b/Python310/Lib/site-packages/pip/_vendor/pygments/styles/__init__.py @@ -48,6 +48,7 @@ STYLE_MAP = { 'solarized-dark': 'solarized::SolarizedDarkStyle', 'solarized-light': 'solarized::SolarizedLightStyle', 'sas': 'sas::SasStyle', + 'staroffice' : 'staroffice::StarofficeStyle', 'stata': 'stata_light::StataLightStyle', 'stata-light': 'stata_light::StataLightStyle', 'stata-dark': 'stata_dark::StataDarkStyle', @@ -58,6 +59,9 @@ STYLE_MAP = { 'dracula': 'dracula::DraculaStyle', 'one-dark': 'onedark::OneDarkStyle', 'lilypond' : 'lilypond::LilyPondStyle', + 'nord': 'nord::NordStyle', + 'nord-darker': 'nord::NordDarkerStyle', + 'github-dark': 'gh_dark::GhDarkStyle' } diff --git a/Python310/Lib/site-packages/pip/_vendor/pygments/token.py b/Python310/Lib/site-packages/pip/_vendor/pygments/token.py index 8aee88a..e3e565a 100644 --- a/Python310/Lib/site-packages/pip/_vendor/pygments/token.py +++ b/Python310/Lib/site-packages/pip/_vendor/pygments/token.py @@ -189,6 +189,7 @@ STANDARD_TYPES = { Operator.Word: 'ow', Punctuation: 'p', + Punctuation.Marker: 'pm', Comment: 'c', Comment.Hashbang: 'ch', diff --git a/Python310/Lib/site-packages/pip/_vendor/requests/certs.py b/Python310/Lib/site-packages/pip/_vendor/requests/certs.py index 2743144..38696a1 100644 --- a/Python310/Lib/site-packages/pip/_vendor/requests/certs.py +++ b/Python310/Lib/site-packages/pip/_vendor/requests/certs.py @@ -11,7 +11,14 @@ If you are packaging Requests, e.g., for a Linux distribution or a managed environment, you can change the definition of where() to return a separately packaged CA bundle. """ -from pip._vendor.certifi import where + +import os + +if "_PIP_STANDALONE_CERT" not in os.environ: + from pip._vendor.certifi import where +else: + def where(): + return os.environ["_PIP_STANDALONE_CERT"] if __name__ == "__main__": print(where()) diff --git a/Python310/Lib/site-packages/pip/_vendor/tenacity/__init__.py b/Python310/Lib/site-packages/pip/_vendor/tenacity/__init__.py index 086ad46..ab3be3b 100644 --- a/Python310/Lib/site-packages/pip/_vendor/tenacity/__init__.py +++ b/Python310/Lib/site-packages/pip/_vendor/tenacity/__init__.py @@ -33,6 +33,7 @@ from .retry import retry_always # noqa from .retry import retry_any # noqa from .retry import retry_if_exception # noqa from .retry import retry_if_exception_type # noqa +from .retry import retry_if_exception_cause_type # noqa from .retry import retry_if_not_exception_type # noqa from .retry import retry_if_not_result # noqa from .retry import retry_if_result # noqa @@ -63,6 +64,7 @@ from .wait import wait_none # noqa from .wait import wait_random # noqa from .wait import wait_random_exponential # noqa from .wait import wait_random_exponential as wait_full_jitter # noqa +from .wait import wait_exponential_jitter # noqa # Import all built-in before strategies for easier usage. from .before import before_log # noqa diff --git a/Python310/Lib/site-packages/pip/_vendor/tenacity/retry.py b/Python310/Lib/site-packages/pip/_vendor/tenacity/retry.py index 1d727e9..9ebeb62 100644 --- a/Python310/Lib/site-packages/pip/_vendor/tenacity/retry.py +++ b/Python310/Lib/site-packages/pip/_vendor/tenacity/retry.py @@ -117,6 +117,33 @@ class retry_unless_exception_type(retry_if_exception): return self.predicate(retry_state.outcome.exception()) +class retry_if_exception_cause_type(retry_base): + """Retries if any of the causes of the raised exception is of one or more types. + + The check on the type of the cause of the exception is done recursively (until finding + an exception in the chain that has no `__cause__`) + """ + + def __init__( + self, + exception_types: typing.Union[ + typing.Type[BaseException], + typing.Tuple[typing.Type[BaseException], ...], + ] = Exception, + ) -> None: + self.exception_cause_types = exception_types + + def __call__(self, retry_state: "RetryCallState") -> bool: + if retry_state.outcome.failed: + exc = retry_state.outcome.exception() + while exc is not None: + if isinstance(exc.__cause__, self.exception_cause_types): + return True + exc = exc.__cause__ + + return False + + class retry_if_result(retry_base): """Retries if the result verifies a predicate.""" diff --git a/Python310/Lib/site-packages/pip/_vendor/tenacity/wait.py b/Python310/Lib/site-packages/pip/_vendor/tenacity/wait.py index 6ed97a7..8fdfc8f 100644 --- a/Python310/Lib/site-packages/pip/_vendor/tenacity/wait.py +++ b/Python310/Lib/site-packages/pip/_vendor/tenacity/wait.py @@ -17,12 +17,19 @@ import abc import random import typing +from datetime import timedelta from pip._vendor.tenacity import _utils if typing.TYPE_CHECKING: from pip._vendor.tenacity import RetryCallState +wait_unit_type = typing.Union[int, float, timedelta] + + +def to_seconds(wait_unit: wait_unit_type) -> float: + return float(wait_unit.total_seconds() if isinstance(wait_unit, timedelta) else wait_unit) + class wait_base(abc.ABC): """Abstract base class for wait strategies.""" @@ -44,8 +51,8 @@ class wait_base(abc.ABC): class wait_fixed(wait_base): """Wait strategy that waits a fixed amount of time between each retry.""" - def __init__(self, wait: float) -> None: - self.wait_fixed = wait + def __init__(self, wait: wait_unit_type) -> None: + self.wait_fixed = to_seconds(wait) def __call__(self, retry_state: "RetryCallState") -> float: return self.wait_fixed @@ -61,9 +68,9 @@ class wait_none(wait_fixed): class wait_random(wait_base): """Wait strategy that waits a random amount of time between min/max.""" - def __init__(self, min: typing.Union[int, float] = 0, max: typing.Union[int, float] = 1) -> None: # noqa - self.wait_random_min = min - self.wait_random_max = max + def __init__(self, min: wait_unit_type = 0, max: wait_unit_type = 1) -> None: # noqa + self.wait_random_min = to_seconds(min) + self.wait_random_max = to_seconds(max) def __call__(self, retry_state: "RetryCallState") -> float: return self.wait_random_min + (random.random() * (self.wait_random_max - self.wait_random_min)) @@ -113,13 +120,13 @@ class wait_incrementing(wait_base): def __init__( self, - start: typing.Union[int, float] = 0, - increment: typing.Union[int, float] = 100, - max: typing.Union[int, float] = _utils.MAX_WAIT, # noqa + start: wait_unit_type = 0, + increment: wait_unit_type = 100, + max: wait_unit_type = _utils.MAX_WAIT, # noqa ) -> None: - self.start = start - self.increment = increment - self.max = max + self.start = to_seconds(start) + self.increment = to_seconds(increment) + self.max = to_seconds(max) def __call__(self, retry_state: "RetryCallState") -> float: result = self.start + (self.increment * (retry_state.attempt_number - 1)) @@ -142,13 +149,13 @@ class wait_exponential(wait_base): def __init__( self, multiplier: typing.Union[int, float] = 1, - max: typing.Union[int, float] = _utils.MAX_WAIT, # noqa + max: wait_unit_type = _utils.MAX_WAIT, # noqa exp_base: typing.Union[int, float] = 2, - min: typing.Union[int, float] = 0, # noqa + min: wait_unit_type = 0, # noqa ) -> None: self.multiplier = multiplier - self.min = min - self.max = max + self.min = to_seconds(min) + self.max = to_seconds(max) self.exp_base = exp_base def __call__(self, retry_state: "RetryCallState") -> float: @@ -189,3 +196,37 @@ class wait_random_exponential(wait_exponential): def __call__(self, retry_state: "RetryCallState") -> float: high = super().__call__(retry_state=retry_state) return random.uniform(0, high) + + +class wait_exponential_jitter(wait_base): + """Wait strategy that applies exponential backoff and jitter. + + It allows for a customized initial wait, maximum wait and jitter. + + This implements the strategy described here: + https://cloud.google.com/storage/docs/retry-strategy + + The wait time is min(initial * (2**n + random.uniform(0, jitter)), maximum) + where n is the retry count. + """ + + def __init__( + self, + initial: float = 1, + max: float = _utils.MAX_WAIT, # noqa + exp_base: float = 2, + jitter: float = 1, + ) -> None: + self.initial = initial + self.max = max + self.exp_base = exp_base + self.jitter = jitter + + def __call__(self, retry_state: "RetryCallState") -> float: + jitter = random.uniform(0, self.jitter) + try: + exp = self.exp_base ** (retry_state.attempt_number - 1) + result = self.initial * exp + jitter + except OverflowError: + result = self.max + return max(0, min(result, self.max)) diff --git a/Python310/Lib/site-packages/pip/_vendor/typing_extensions.py b/Python310/Lib/site-packages/pip/_vendor/typing_extensions.py index 4fd8247..34199c2 100644 --- a/Python310/Lib/site-packages/pip/_vendor/typing_extensions.py +++ b/Python310/Lib/site-packages/pip/_vendor/typing_extensions.py @@ -8,9 +8,9 @@ import types as _types import typing -# Please keep __all__ alphabetized within each category. __all__ = [ # Super-special typing primitives. + 'Any', 'ClassVar', 'Concatenate', 'Final', @@ -20,6 +20,7 @@ __all__ = [ 'ParamSpecKwargs', 'Self', 'Type', + 'TypeVar', 'TypeVarTuple', 'Unpack', @@ -60,6 +61,7 @@ __all__ = [ 'Literal', 'NewType', 'overload', + 'override', 'Protocol', 'reveal_type', 'runtime', @@ -149,6 +151,37 @@ VT = typing.TypeVar('VT') # Value type. T_co = typing.TypeVar('T_co', covariant=True) # Any type covariant containers. T_contra = typing.TypeVar('T_contra', contravariant=True) # Ditto contravariant. + +if sys.version_info >= (3, 11): + from typing import Any +else: + + class _AnyMeta(type): + def __instancecheck__(self, obj): + if self is Any: + raise TypeError("typing_extensions.Any cannot be used with isinstance()") + return super().__instancecheck__(obj) + + def __repr__(self): + if self is Any: + return "typing_extensions.Any" + return super().__repr__() + + class Any(metaclass=_AnyMeta): + """Special type indicating an unconstrained type. + - Any is compatible with every type. + - Any assumed to have all methods. + - All values assumed to be instances of Any. + Note that all the above statements are true from the point of view of + static type checkers. At runtime, Any should not be used with instance + checks. + """ + def __new__(cls, *args, **kwargs): + if cls is Any: + raise TypeError("Any cannot be instantiated") + return super().__new__(cls, *args, **kwargs) + + ClassVar = typing.ClassVar # On older versions of typing there is an internal class named "Final". @@ -431,7 +464,7 @@ else: if type(self)._is_protocol: raise TypeError('Protocols cannot be instantiated') - class _ProtocolMeta(abc.ABCMeta): + class _ProtocolMeta(abc.ABCMeta): # noqa: B024 # This metaclass is a bit unfortunate and exists only because of the lack # of __instancehook__. def __instancecheck__(cls, instance): @@ -1115,6 +1148,44 @@ else: above.""") +class _DefaultMixin: + """Mixin for TypeVarLike defaults.""" + + __slots__ = () + + def __init__(self, default): + if isinstance(default, (tuple, list)): + self.__default__ = tuple((typing._type_check(d, "Default must be a type") + for d in default)) + elif default: + self.__default__ = typing._type_check(default, "Default must be a type") + else: + self.__default__ = None + + +# Add default and infer_variance parameters from PEP 696 and 695 +class TypeVar(typing.TypeVar, _DefaultMixin, _root=True): + """Type variable.""" + + __module__ = 'typing' + + def __init__(self, name, *constraints, bound=None, + covariant=False, contravariant=False, + default=None, infer_variance=False): + super().__init__(name, *constraints, bound=bound, covariant=covariant, + contravariant=contravariant) + _DefaultMixin.__init__(self, default) + self.__infer_variance__ = infer_variance + + # for pickling: + try: + def_mod = sys._getframe(1).f_globals.get('__name__', '__main__') + except (AttributeError, ValueError): + def_mod = None + if def_mod != 'typing_extensions': + self.__module__ = def_mod + + # Python 3.10+ has PEP 612 if hasattr(typing, 'ParamSpecArgs'): ParamSpecArgs = typing.ParamSpecArgs @@ -1179,12 +1250,32 @@ else: # 3.10+ if hasattr(typing, 'ParamSpec'): - ParamSpec = typing.ParamSpec + + # Add default Parameter - PEP 696 + class ParamSpec(typing.ParamSpec, _DefaultMixin, _root=True): + """Parameter specification variable.""" + + __module__ = 'typing' + + def __init__(self, name, *, bound=None, covariant=False, contravariant=False, + default=None): + super().__init__(name, bound=bound, covariant=covariant, + contravariant=contravariant) + _DefaultMixin.__init__(self, default) + + # for pickling: + try: + def_mod = sys._getframe(1).f_globals.get('__name__', '__main__') + except (AttributeError, ValueError): + def_mod = None + if def_mod != 'typing_extensions': + self.__module__ = def_mod + # 3.7-3.9 else: # Inherits from list as a workaround for Callable checks in Python < 3.9.2. - class ParamSpec(list): + class ParamSpec(list, _DefaultMixin): """Parameter specification variable. Usage:: @@ -1242,7 +1333,8 @@ else: def kwargs(self): return ParamSpecKwargs(self) - def __init__(self, name, *, bound=None, covariant=False, contravariant=False): + def __init__(self, name, *, bound=None, covariant=False, contravariant=False, + default=None): super().__init__([self]) self.__name__ = name self.__covariant__ = bool(covariant) @@ -1251,6 +1343,7 @@ else: self.__bound__ = typing._type_check(bound, 'Bound must be a type.') else: self.__bound__ = None + _DefaultMixin.__init__(self, default) # for pickling: try: @@ -1752,9 +1845,25 @@ else: if hasattr(typing, "TypeVarTuple"): # 3.11+ - TypeVarTuple = typing.TypeVarTuple + + # Add default Parameter - PEP 696 + class TypeVarTuple(typing.TypeVarTuple, _DefaultMixin, _root=True): + """Type variable tuple.""" + + def __init__(self, name, *, default=None): + super().__init__(name) + _DefaultMixin.__init__(self, default) + + # for pickling: + try: + def_mod = sys._getframe(1).f_globals.get('__name__', '__main__') + except (AttributeError, ValueError): + def_mod = None + if def_mod != 'typing_extensions': + self.__module__ = def_mod + else: - class TypeVarTuple: + class TypeVarTuple(_DefaultMixin): """Type variable tuple. Usage:: @@ -1804,8 +1913,9 @@ else: def __iter__(self): yield self.__unpacked__ - def __init__(self, name): + def __init__(self, name, *, default=None): self.__name__ = name + _DefaultMixin.__init__(self, default) # for pickling: try: @@ -1968,6 +2078,36 @@ else: return decorator +if hasattr(typing, "override"): + override = typing.override +else: + _F = typing.TypeVar("_F", bound=typing.Callable[..., typing.Any]) + + def override(__arg: _F) -> _F: + """Indicate that a method is intended to override a method in a base class. + + Usage: + + class Base: + def method(self) -> None: ... + pass + + class Child(Base): + @override + def method(self) -> None: + super().method() + + When this decorator is applied to a method, the type checker will + validate that it overrides a method with the same name on a base class. + This helps prevent bugs that may occur when a base class is changed + without an equivalent change to a child class. + + See PEP 698 for details. + + """ + return __arg + + # We have to do some monkey patching to deal with the dual nature of # Unpack/TypeVarTuple: # - We want Unpack to be a kind of TypeVar so it gets accepted in diff --git a/Python310/Lib/site-packages/pip/_vendor/urllib3/__init__.py b/Python310/Lib/site-packages/pip/_vendor/urllib3/__init__.py index fe86b59..c6fa382 100644 --- a/Python310/Lib/site-packages/pip/_vendor/urllib3/__init__.py +++ b/Python310/Lib/site-packages/pip/_vendor/urllib3/__init__.py @@ -19,6 +19,23 @@ from .util.retry import Retry from .util.timeout import Timeout from .util.url import get_host +# === NOTE TO REPACKAGERS AND VENDORS === +# Please delete this block, this logic is only +# for urllib3 being distributed via PyPI. +# See: https://github.com/urllib3/urllib3/issues/2680 +try: + import urllib3_secure_extra # type: ignore # noqa: F401 +except ImportError: + pass +else: + warnings.warn( + "'urllib3[secure]' extra is deprecated and will be removed " + "in a future release of urllib3 2.x. Read more in this issue: " + "https://github.com/urllib3/urllib3/issues/2680", + category=DeprecationWarning, + stacklevel=2, + ) + __author__ = "Andrey Petrov (andrey.petrov@shazow.net)" __license__ = "MIT" __version__ = __version__ diff --git a/Python310/Lib/site-packages/pip/_vendor/urllib3/_version.py b/Python310/Lib/site-packages/pip/_vendor/urllib3/_version.py index c8ac29d..6fbc84b 100644 --- a/Python310/Lib/site-packages/pip/_vendor/urllib3/_version.py +++ b/Python310/Lib/site-packages/pip/_vendor/urllib3/_version.py @@ -1,2 +1,2 @@ # This file is protected via CODEOWNERS -__version__ = "1.26.10" +__version__ = "1.26.12" diff --git a/Python310/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py b/Python310/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py index 5f1d2d0..528764a 100644 --- a/Python310/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py +++ b/Python310/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py @@ -73,11 +73,20 @@ except ImportError: # Platform-specific: Python 3 import logging import ssl import sys +import warnings from .. import util from ..packages import six from ..util.ssl_ import PROTOCOL_TLS_CLIENT +warnings.warn( + "'urllib3.contrib.pyopenssl' module is deprecated and will be removed " + "in a future release of urllib3 2.x. Read more in this issue: " + "https://github.com/urllib3/urllib3/issues/2680", + category=DeprecationWarning, + stacklevel=2, +) + __all__ = ["inject_into_urllib3", "extract_from_urllib3"] # SNI always works. diff --git a/Python310/Lib/site-packages/pip/_vendor/urllib3/response.py b/Python310/Lib/site-packages/pip/_vendor/urllib3/response.py index 776e49d..4969b70 100644 --- a/Python310/Lib/site-packages/pip/_vendor/urllib3/response.py +++ b/Python310/Lib/site-packages/pip/_vendor/urllib3/response.py @@ -2,6 +2,7 @@ from __future__ import absolute_import import io import logging +import sys import zlib from contextlib import contextmanager from socket import error as SocketError @@ -9,6 +10,7 @@ from socket import timeout as SocketTimeout brotli = None +from . import util from ._collections import HTTPHeaderDict from .connection import BaseSSLError, HTTPException from .exceptions import ( @@ -475,6 +477,54 @@ class HTTPResponse(io.IOBase): if self._original_response and self._original_response.isclosed(): self.release_conn() + def _fp_read(self, amt): + """ + Read a response with the thought that reading the number of bytes + larger than can fit in a 32-bit int at a time via SSL in some + known cases leads to an overflow error that has to be prevented + if `amt` or `self.length_remaining` indicate that a problem may + happen. + + The known cases: + * 3.8 <= CPython < 3.9.7 because of a bug + https://github.com/urllib3/urllib3/issues/2513#issuecomment-1152559900. + * urllib3 injected with pyOpenSSL-backed SSL-support. + * CPython < 3.10 only when `amt` does not fit 32-bit int. + """ + assert self._fp + c_int_max = 2 ** 31 - 1 + if ( + ( + (amt and amt > c_int_max) + or (self.length_remaining and self.length_remaining > c_int_max) + ) + and not util.IS_SECURETRANSPORT + and (util.IS_PYOPENSSL or sys.version_info < (3, 10)) + ): + buffer = io.BytesIO() + # Besides `max_chunk_amt` being a maximum chunk size, it + # affects memory overhead of reading a response by this + # method in CPython. + # `c_int_max` equal to 2 GiB - 1 byte is the actual maximum + # chunk size that does not lead to an overflow error, but + # 256 MiB is a compromise. + max_chunk_amt = 2 ** 28 + while amt is None or amt != 0: + if amt is not None: + chunk_amt = min(amt, max_chunk_amt) + amt -= chunk_amt + else: + chunk_amt = max_chunk_amt + data = self._fp.read(chunk_amt) + if not data: + break + buffer.write(data) + del data # to reduce peak memory usage by `max_chunk_amt`. + return buffer.getvalue() + else: + # StringIO doesn't like amt=None + return self._fp.read(amt) if amt is not None else self._fp.read() + def read(self, amt=None, decode_content=None, cache_content=False): """ Similar to :meth:`http.client.HTTPResponse.read`, but with two additional @@ -507,13 +557,11 @@ class HTTPResponse(io.IOBase): fp_closed = getattr(self._fp, "closed", False) with self._error_catcher(): + data = self._fp_read(amt) if not fp_closed else b"" if amt is None: - # cStringIO doesn't like amt=None - data = self._fp.read() if not fp_closed else b"" flush_decoder = True else: cache_content = False - data = self._fp.read(amt) if not fp_closed else b"" if ( amt != 0 and not data ): # Platform-specific: Buggy versions of Python. diff --git a/Python310/Lib/site-packages/pip/_vendor/vendor.txt b/Python310/Lib/site-packages/pip/_vendor/vendor.txt index 375b641..9e9d4c1 100644 --- a/Python310/Lib/site-packages/pip/_vendor/vendor.txt +++ b/Python310/Lib/site-packages/pip/_vendor/vendor.txt @@ -1,23 +1,23 @@ CacheControl==0.12.11 # Make sure to update the license in pyproject.toml for this. colorama==0.4.5 -distlib==0.3.5 +distlib==0.3.6 distro==1.7.0 msgpack==1.0.4 packaging==21.3 -pep517==0.12.0 +pep517==0.13.0 platformdirs==2.5.2 pyparsing==3.0.9 requests==2.28.1 - certifi==2022.06.15 + certifi==2022.09.24 chardet==5.0.0 - idna==3.3 - urllib3==1.26.10 + idna==3.4 + urllib3==1.26.12 rich==12.5.1 - pygments==2.12.0 - typing_extensions==4.3.0 + pygments==2.13.0 + typing_extensions==4.4.0 resolvelib==0.8.1 setuptools==44.0.0 six==1.16.0 -tenacity==8.0.1 +tenacity==8.1.0 tomli==2.0.1 webencodings==0.5.1 diff --git a/Python310/Scripts/cleanpy.exe b/Python310/Scripts/cleanpy.exe index 9fd9043a58086e257c689cae9419a894b2cea6ec..2521458d40c03eac873aae2774cc1f786dbcc22a 100644 GIT binary patch delta 23813 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 Zlt*mjLv7m4%`6u-^7mw-%jbOB{{ZiCu*U!Z diff --git a/Python310/Scripts/pip3.exe b/Python310/Scripts/pip3.exe index 7734e2314bbcf02c642b63ae7811f1a4e7b93486..463776c675c68315fe6e215a0985a3d845ce9847 100644 GIT binary patch delta 23813 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 B8iN1; delta 23659 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�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 ZZOS7y@}V}7p9