Some python updates and fix in stable diffusion

This commit is contained in:
Морозов Андрей 2022-10-30 12:51:19 +04:00
parent 85c0e5a964
commit 9acccaef37
98 changed files with 1774 additions and 985 deletions

View File

@ -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/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
cleanpy-0.3.1.dist-info/LICENSE,sha256=9BoEVtXyu6Jf1NflC1GpXeMEdw_x21p5UV0DOXqRTY0,1074 cleanpy-0.3.1.dist-info/LICENSE,sha256=9BoEVtXyu6Jf1NflC1GpXeMEdw_x21p5UV0DOXqRTY0,1074
cleanpy-0.3.1.dist-info/METADATA,sha256=OWfqUzcqWO3svR3PGkVkcVUH7fN9EJbyAoe3jq2lo0Y,6188 cleanpy-0.3.1.dist-info/METADATA,sha256=OWfqUzcqWO3svR3PGkVkcVUH7fN9EJbyAoe3jq2lo0Y,6188

View File

@ -1,6 +1,6 @@
Metadata-Version: 2.1 Metadata-Version: 2.1
Name: pip Name: pip
Version: 22.2.2 Version: 22.3
Summary: The PyPA recommended tool for installing Python packages. Summary: The PyPA recommended tool for installing Python packages.
Home-page: https://pip.pypa.io/ Home-page: https://pip.pypa.io/
Author: The pip developers 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`_ * `GitHub page`_
* `Development documentation`_ * `Development documentation`_
* `Development mailing list`_
* `Development IRC`_ * `Development IRC`_
Code of Conduct 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 .. _Python 2 support policy: https://pip.pypa.io/en/latest/development/release-process/#python-2-support
.. _Issue tracking: https://github.com/pypa/pip/issues .. _Issue tracking: https://github.com/pypa/pip/issues
.. _Discourse channel: https://discuss.python.org/c/packaging .. _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 .. _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 .. _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 .. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md

View File

@ -1,17 +1,18 @@
../../Scripts/pip.exe,sha256=Ny0SgVCXVElXIFJUWxzlgUZknQTjUOd4ddmrij0HXnQ,107870 ../../Scripts/pip.exe,sha256=h1PDR-UkIA35HeaHPF8eeKD1DVA1k1IupBjP5vO2AkI,108413
../../Scripts/pip3.10.exe,sha256=Ny0SgVCXVElXIFJUWxzlgUZknQTjUOd4ddmrij0HXnQ,107870 ../../Scripts/pip3.10.exe,sha256=h1PDR-UkIA35HeaHPF8eeKD1DVA1k1IupBjP5vO2AkI,108413
../../Scripts/pip3.exe,sha256=Ny0SgVCXVElXIFJUWxzlgUZknQTjUOd4ddmrij0HXnQ,107870 ../../Scripts/pip3.10.exe,sha256=h1PDR-UkIA35HeaHPF8eeKD1DVA1k1IupBjP5vO2AkI,108413
pip-22.2.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 ../../Scripts/pip3.exe,sha256=h1PDR-UkIA35HeaHPF8eeKD1DVA1k1IupBjP5vO2AkI,108413
pip-22.2.2.dist-info/LICENSE.txt,sha256=Y0MApmnUmurmWxLGxIySTFGkzfPR_whtw0VtyLyqIQQ,1093 pip-22.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
pip-22.2.2.dist-info/METADATA,sha256=1THNkoBHocZtVQ8SixJH12wuSXHJIQb4Vu7RzzEjfKQ,4197 pip-22.3.dist-info/LICENSE.txt,sha256=Y0MApmnUmurmWxLGxIySTFGkzfPR_whtw0VtyLyqIQQ,1093
pip-22.2.2.dist-info/RECORD,, pip-22.3.dist-info/METADATA,sha256=CPPiEmaf6uwWzUdhKzSs4P2nVlj8OQXqNosdEf2_b2U,4070
pip-22.2.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 pip-22.3.dist-info/RECORD,,
pip-22.2.2.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92 pip-22.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
pip-22.2.2.dist-info/entry_points.txt,sha256=_ZUyZpzz1RdotcszCitH_lQ6yiWAKmaOcIkCEmkrePU,124 pip-22.3.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
pip-22.2.2.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 pip-22.3.dist-info/entry_points.txt,sha256=ynZN1_707_L23Oa8_O5LOxEoccj1nDa4xHT5galfN7o,125
pip/__init__.py,sha256=RKJ102-F8id9kMdMic9j7MD2OvtK6CP0CK1Erl6PtyU,357 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/__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__/__init__.cpython-310.pyc,,
pip/__pycache__/__main__.cpython-310.pyc,, pip/__pycache__/__main__.cpython-310.pyc,,
pip/__pycache__/__pip-runner__.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__/pyproject.cpython-310.pyc,,
pip/_internal/__pycache__/self_outdated_check.cpython-310.pyc,, pip/_internal/__pycache__/self_outdated_check.cpython-310.pyc,,
pip/_internal/__pycache__/wheel_builder.cpython-310.pyc,, pip/_internal/__pycache__/wheel_builder.cpython-310.pyc,,
pip/_internal/build_env.py,sha256=Io06wf8aNlP1FkDYCbbuVFPGWAMJNys7l_p7r9CmEKE,9535 pip/_internal/build_env.py,sha256=gEAT8R6SuWbg2mcrsmOTKWMw_x5pedMzvSTxQS57JZs,10234
pip/_internal/cache.py,sha256=-FXxS81WOM-amtx3w7N8s20PfFIlHPX8X27FfOBql-I,10623 pip/_internal/cache.py,sha256=C3n78VnBga9rjPXZqht_4A4d-T25poC7K0qBM7FHDhU,10734
pip/_internal/cli/__init__.py,sha256=FkHBgpxxb-_gd6r1FjnNhfMOzAUYyXoXKJ6abijfcFU,132 pip/_internal/cli/__init__.py,sha256=FkHBgpxxb-_gd6r1FjnNhfMOzAUYyXoXKJ6abijfcFU,132
pip/_internal/cli/__pycache__/__init__.cpython-310.pyc,, pip/_internal/cli/__pycache__/__init__.cpython-310.pyc,,
pip/_internal/cli/__pycache__/autocompletion.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__/spinners.cpython-310.pyc,,
pip/_internal/cli/__pycache__/status_codes.cpython-310.pyc,, pip/_internal/cli/__pycache__/status_codes.cpython-310.pyc,,
pip/_internal/cli/autocompletion.py,sha256=wY2JPZY2Eji1vhR7bVo-yCBPJ9LCy6P80iOAhZD1Vi8,6676 pip/_internal/cli/autocompletion.py,sha256=wY2JPZY2Eji1vhR7bVo-yCBPJ9LCy6P80iOAhZD1Vi8,6676
pip/_internal/cli/base_command.py,sha256=EiHzq1RBubmgYkhsVgJLNc4Y18koPUS1TzMVJwpnYxc,8146 pip/_internal/cli/base_command.py,sha256=t1D5x40Hfn9HnPnMt-iSxvqL14nht2olBCacW74pc-k,7842
pip/_internal/cli/cmdoptions.py,sha256=LKKpinHThNt7wtHqxwkWJpgCUcyQeTX0GUCqyXImAbc,29985 pip/_internal/cli/cmdoptions.py,sha256=Jlarlzz9qv9tC_tCaEbcc_jVvrPreFLBBUnDgoyWflw,29381
pip/_internal/cli/command_context.py,sha256=RHgIPwtObh5KhMrd3YZTkl8zbVG-6Okml7YbFX4Ehg0,774 pip/_internal/cli/command_context.py,sha256=RHgIPwtObh5KhMrd3YZTkl8zbVG-6Okml7YbFX4Ehg0,774
pip/_internal/cli/main.py,sha256=ioJ8IVlb2K1qLOxR-tXkee9lURhYV89CDM71MKag7YY,2472 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/parser.py,sha256=tWP-K1uSxnJyXu3WE0kkH3niAYRBeuUaxeydhzOdhL4,10817
pip/_internal/cli/progress_bars.py,sha256=So4mPoSjXkXiSHiTzzquH3VVyVD_njXlHJSExYPXAow,1968 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/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/cli/status_codes.py,sha256=sEFHUaUJbqv8iArL3HAtcztWZmGOFX01hTesSytDEh0,116
pip/_internal/commands/__init__.py,sha256=5oRO9O3dM2vGuh0bFw4HOVletryrz5HHMmmPWwJrH9U,3882 pip/_internal/commands/__init__.py,sha256=5oRO9O3dM2vGuh0bFw4HOVletryrz5HHMmmPWwJrH9U,3882
pip/_internal/commands/__pycache__/__init__.cpython-310.pyc,, 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/cache.py,sha256=muaT0mbL-ZUpn6AaushVAipzTiMwE4nV2BLbJBwt_KQ,7582
pip/_internal/commands/check.py,sha256=0gjXR7j36xJT5cs2heYU_dfOfpnFfzX8OoPNNoKhqdM,1685 pip/_internal/commands/check.py,sha256=0gjXR7j36xJT5cs2heYU_dfOfpnFfzX8OoPNNoKhqdM,1685
pip/_internal/commands/completion.py,sha256=H0TJvGrdsoleuIyQKzJbicLFppYx2OZA0BLNpQDeFjI,4129 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/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/freeze.py,sha256=gCjoD6foBZPBAAYx5t8zZLkJhsF_ZRtnb3dPuD7beO8,2951
pip/_internal/commands/hash.py,sha256=EVVOuvGtoPEdFi8SNnmdqlCQrhCxV-kJsdwtdcCnXGQ,1703 pip/_internal/commands/hash.py,sha256=EVVOuvGtoPEdFi8SNnmdqlCQrhCxV-kJsdwtdcCnXGQ,1703
pip/_internal/commands/help.py,sha256=gcc6QDkcgHMOuAn5UxaZwAStsRBrnGSn_yxjS57JIoM,1132 pip/_internal/commands/help.py,sha256=gcc6QDkcgHMOuAn5UxaZwAStsRBrnGSn_yxjS57JIoM,1132
pip/_internal/commands/index.py,sha256=1VVXXj5MsI2qH-N7uniQQyVkg-KCn_RdjiyiUmkUS5U,4762 pip/_internal/commands/index.py,sha256=1VVXXj5MsI2qH-N7uniQQyVkg-KCn_RdjiyiUmkUS5U,4762
pip/_internal/commands/inspect.py,sha256=mRJ9aIkBQN0IJ7Um8pzaxAzVPIgL8KfWHx1fWKJgUAQ,3374 pip/_internal/commands/inspect.py,sha256=mRJ9aIkBQN0IJ7Um8pzaxAzVPIgL8KfWHx1fWKJgUAQ,3374
pip/_internal/commands/install.py,sha256=nyZCUv7Oi8rScPe4WENgQ8Vd5n3OHzBuj2tw6khg4Ss,30315 pip/_internal/commands/install.py,sha256=_XbW0PyxtZCMMNqo8mDaOq3TBRiJNFM-94CR27mburc,31726
pip/_internal/commands/list.py,sha256=wF2g5i4j_JyoRckO9FAeB7KhcFAnLboy0dL-G9fn7Eo,12148 pip/_internal/commands/list.py,sha256=Fk1TSxB33NlRS4qlLQ0xwnytnF9-zkQJbKQYv2xc4Q4,12343
pip/_internal/commands/search.py,sha256=sbBZiARRc050QquOKcCvOr2K3XLsoYebLKZGRi__iUI,5697 pip/_internal/commands/search.py,sha256=sbBZiARRc050QquOKcCvOr2K3XLsoYebLKZGRi__iUI,5697
pip/_internal/commands/show.py,sha256=CJI8q4SSY0X346K1hi4Th8Nbyhl4nxPTBJUuzOlTaYE,6129 pip/_internal/commands/show.py,sha256=CJI8q4SSY0X346K1hi4Th8Nbyhl4nxPTBJUuzOlTaYE,6129
pip/_internal/commands/uninstall.py,sha256=0JQhifYxecNrJAwoILFwjm9V1V3liXzNT-y4bgRXXPw,3680 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/configuration.py,sha256=uBKTus43pDIO6IzT2mLWQeROmHhtnoabhniKNjPYvD0,13529
pip/_internal/distributions/__init__.py,sha256=Hq6kt6gXBgjNit5hTTWLAzeCNOKoB-N0pGYSqehrli8,858 pip/_internal/distributions/__init__.py,sha256=Hq6kt6gXBgjNit5hTTWLAzeCNOKoB-N0pGYSqehrli8,858
pip/_internal/distributions/__pycache__/__init__.cpython-310.pyc,, 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/installed.py,sha256=NI2OgsgH9iBq9l5vB-56vOg5YsybOy-AU4VE5CSCO2I,729
pip/_internal/distributions/sdist.py,sha256=SQBdkatXSigKGG_SaD0U0p1Jwdfrg26UCNcHgkXZfdA,6494 pip/_internal/distributions/sdist.py,sha256=SQBdkatXSigKGG_SaD0U0p1Jwdfrg26UCNcHgkXZfdA,6494
pip/_internal/distributions/wheel.py,sha256=m-J4XO-gvFerlYsFzzSXYDvrx8tLZlJFTCgDxctn8ig,1164 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/__init__.py,sha256=vpt-JeTZefh8a-FC22ZeBSXFVbuBcXSGiILhQZJaNpQ,30
pip/_internal/index/__pycache__/__init__.cpython-310.pyc,, pip/_internal/index/__pycache__/__init__.cpython-310.pyc,,
pip/_internal/index/__pycache__/collector.cpython-310.pyc,, pip/_internal/index/__pycache__/collector.cpython-310.pyc,,
pip/_internal/index/__pycache__/package_finder.cpython-310.pyc,, pip/_internal/index/__pycache__/package_finder.cpython-310.pyc,,
pip/_internal/index/__pycache__/sources.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/package_finder.py,sha256=kmcMu5_i-BP6v3NQGY0_am1ezxM2Gk4t00arZMmm4sc,37596
pip/_internal/index/sources.py,sha256=SVyPitv08-Qalh2_Bk5diAJ9GAA_d-a93koouQodAG0,6557 pip/_internal/index/sources.py,sha256=SVyPitv08-Qalh2_Bk5diAJ9GAA_d-a93koouQodAG0,6557
pip/_internal/locations/__init__.py,sha256=QhB-Y6TNyaU010cimm2T4wM5loe8oRdjLwJ6xmsGc-k,17552 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__/_distutils.cpython-310.pyc,,
pip/_internal/locations/__pycache__/_sysconfig.cpython-310.pyc,, pip/_internal/locations/__pycache__/_sysconfig.cpython-310.pyc,,
pip/_internal/locations/__pycache__/base.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/_sysconfig.py,sha256=nM-DiVHXWTxippdmN0MGVl5r7OIfIMy3vgDMlo8c_oo,7867
pip/_internal/locations/base.py,sha256=ufyDqPwZ4jLbScD44u8AwTVI-3ft8O78UGrroQI5f68,2573 pip/_internal/locations/base.py,sha256=ufyDqPwZ4jLbScD44u8AwTVI-3ft8O78UGrroQI5f68,2573
pip/_internal/main.py,sha256=r-UnUe8HLo5XFJz8inTcOOTiu_sxNhgHb6VwlGUllOI,340 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__/__init__.cpython-310.pyc,,
pip/_internal/metadata/__pycache__/_json.cpython-310.pyc,, pip/_internal/metadata/__pycache__/_json.cpython-310.pyc,,
pip/_internal/metadata/__pycache__/base.cpython-310.pyc,, pip/_internal/metadata/__pycache__/base.cpython-310.pyc,,
pip/_internal/metadata/__pycache__/pkg_resources.cpython-310.pyc,, pip/_internal/metadata/__pycache__/pkg_resources.cpython-310.pyc,,
pip/_internal/metadata/_json.py,sha256=BTkWfFDrWFwuSodImjtbAh8wCL3isecbnjTb5E6UUDI,2595 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/__init__.py,sha256=9ZVO8BoE7NEZPmoHp5Ap_NJo0HgNIezXXg-TFTtt3Z4,107
pip/_internal/metadata/importlib/__pycache__/__init__.cpython-310.pyc,, pip/_internal/metadata/importlib/__pycache__/__init__.cpython-310.pyc,,
pip/_internal/metadata/importlib/__pycache__/_compat.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__/_dists.cpython-310.pyc,,
pip/_internal/metadata/importlib/__pycache__/_envs.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/_compat.py,sha256=GAe_prIfCE4iUylrnr_2dJRlkkBVRUbOidEoID7LPoE,1882
pip/_internal/metadata/importlib/_dists.py,sha256=iEu6KvMdFIfq3ujQvsS0fvI9jDbp1qFC9SmOySfn_fY,7456 pip/_internal/metadata/importlib/_dists.py,sha256=BUV8y6D0PePZrEN3vfJL-m1FDqZ6YPRgAiBeBinHhNg,8181
pip/_internal/metadata/importlib/_envs.py,sha256=-4O0PiYmxydf0e6upJ7X-_BR4DB46I_szlgx53hnJLs,7195 pip/_internal/metadata/importlib/_envs.py,sha256=7BxanCh3T7arusys__O2ZHJdnmDhQXFmfU7x1-jB5xI,7457
pip/_internal/metadata/pkg_resources.py,sha256=RfU--nYrkHAYJXfpoviyBHJA5b9Mw3Dc5HpeYwki1gE,9289 pip/_internal/metadata/pkg_resources.py,sha256=WjwiNdRsvxqxL4MA5Tb5a_q3Q3sUhdpbZF8wGLtPMI0,9773
pip/_internal/models/__init__.py,sha256=3DHUd_qxpPozfzouoqa9g9ts1Czr5qaHfFxbnxriepM,63 pip/_internal/models/__init__.py,sha256=3DHUd_qxpPozfzouoqa9g9ts1Czr5qaHfFxbnxriepM,63
pip/_internal/models/__pycache__/__init__.cpython-310.pyc,, pip/_internal/models/__pycache__/__init__.cpython-310.pyc,,
pip/_internal/models/__pycache__/candidate.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/format_control.py,sha256=DJpMYjxeYKKQdwNcML2_F0vtAh-qnKTYe-CpTxQe-4g,2520
pip/_internal/models/index.py,sha256=tYnL8oxGi4aSNWur0mG8DAP7rC6yuha_MwJO8xw0crI,1030 pip/_internal/models/index.py,sha256=tYnL8oxGi4aSNWur0mG8DAP7rC6yuha_MwJO8xw0crI,1030
pip/_internal/models/installation_report.py,sha256=ad1arqtxrSFBvWnm6mRqmG12HLV3pZZcZcHrlTFIiqU,2617 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/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/selection_prefs.py,sha256=KZdi66gsR-_RUXUr9uejssk3rmTHrQVJWeNA2sV-VSY,1907
pip/_internal/models/target_python.py,sha256=qKpZox7J8NAaPmDs5C_aniwfPDxzvpkrCKqfwndG87k,3858 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/__init__.py,sha256=jf6Tt5nV_7zkARBrKojIXItgejvoegVJVKUbhAa5Ioc,50
pip/_internal/network/__pycache__/__init__.cpython-310.pyc,, pip/_internal/network/__pycache__/__init__.cpython-310.pyc,,
pip/_internal/network/__pycache__/auth.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/auth.py,sha256=a3C7Xaa8kTJjXkdi_wrUjqaySc8Z9Yz7U6QIbXfzMyc,12190
pip/_internal/network/cache.py,sha256=hgXftU-eau4MWxHSLquTMzepYq5BPC2zhCkhN3glBy8,2145 pip/_internal/network/cache.py,sha256=hgXftU-eau4MWxHSLquTMzepYq5BPC2zhCkhN3glBy8,2145
pip/_internal/network/download.py,sha256=HvDDq9bVqaN3jcS3DyVJHP7uTqFzbShdkf7NFSoHfkw,6096 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/session.py,sha256=BpDOJ7_Xw5VkgPYWsePzcaqOfcyRZcB2AW7W0HGBST0,18443
pip/_internal/network/utils.py,sha256=6A5SrUJEEUHxbGtbscwU2NpCyz-3ztiDlGWHpRRhsJ8,4073 pip/_internal/network/utils.py,sha256=6A5SrUJEEUHxbGtbscwU2NpCyz-3ztiDlGWHpRRhsJ8,4073
pip/_internal/network/xmlrpc.py,sha256=AzQgG4GgS152_cqmGr_Oz2MIXsCal-xfsis7fA7nmU0,1791 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/__pycache__/wheel.cpython-310.pyc,,
pip/_internal/operations/install/editable_legacy.py,sha256=ee4kfJHNuzTdKItbfAsNOSEwq_vD7DRPGkBdK48yBhU,1354 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/legacy.py,sha256=cHdcHebyzf8w7OaOLwcsTNSMSSV8WBoAPFLay_9CjE8,4105
pip/_internal/operations/install/wheel.py,sha256=ZbmrarCh74tariXY8rgI56jbZ1BJ2Z6u5fZt4nt3Gmw,27379 pip/_internal/operations/install/wheel.py,sha256=ZbRGMj1VVS39coYNj4kvsTQCiABeGBJEi7gSsaL2xXU,27403
pip/_internal/operations/prepare.py,sha256=kvL-s1ZUs53g1JIzmJ62j8FwCO_fKWXN45pAtVuz0xE,22962 pip/_internal/operations/prepare.py,sha256=BeYXrLFpRoV5XBnRXQHxRA2plyC36kK9Pms5D9wjCo4,25091
pip/_internal/pyproject.py,sha256=ob0Gb0l12YLZNxjdpZGRfWHgjqhZTnSVv96RuJyNOfs,7074 pip/_internal/pyproject.py,sha256=ob0Gb0l12YLZNxjdpZGRfWHgjqhZTnSVv96RuJyNOfs,7074
pip/_internal/req/__init__.py,sha256=rUQ9d_Sh3E5kNYqX9pkN0D06YL-LrtcbJQ-LiIonq08,2807 pip/_internal/req/__init__.py,sha256=rUQ9d_Sh3E5kNYqX9pkN0D06YL-LrtcbJQ-LiIonq08,2807
pip/_internal/req/__pycache__/__init__.cpython-310.pyc,, 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_set.cpython-310.pyc,,
pip/_internal/req/__pycache__/req_uninstall.cpython-310.pyc,, pip/_internal/req/__pycache__/req_uninstall.cpython-310.pyc,,
pip/_internal/req/constructors.py,sha256=ypjtq1mOQ3d2mFkFPMf_6Mr8SLKeHQk3tUKHA1ddG0U,16611 pip/_internal/req/constructors.py,sha256=ypjtq1mOQ3d2mFkFPMf_6Mr8SLKeHQk3tUKHA1ddG0U,16611
pip/_internal/req/req_file.py,sha256=Qgqx7qLfDO3ai72oO2U1u928_6Idajun5VFRWPZg3XM,17502 pip/_internal/req/req_file.py,sha256=N6lPO3c0to_G73YyGAnk7VUYmed5jV4Qxgmt1xtlXVg,17646
pip/_internal/req/req_install.py,sha256=bOtpOZnDgmEst_QuWZRXViaPW1JJ1iAvO6vVFgFf0PI,33506 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_set.py,sha256=j3esG0s6SzoVReX9rWn4rpYNtyET_fwxbwJPRimvRxo,2858
pip/_internal/req/req_uninstall.py,sha256=ZFQfgSNz6H1BMsgl87nQNr2iaQCcbFcmXpW8rKVQcic,24045 pip/_internal/req/req_uninstall.py,sha256=ZFQfgSNz6H1BMsgl87nQNr2iaQCcbFcmXpW8rKVQcic,24045
pip/_internal/resolution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 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/compat.py,sha256=ACyBfLgj3_XG-iA5omEDrXqDM0cQKzi8h8HRBInzG6Q,1884
pip/_internal/utils/compatibility_tags.py,sha256=ydin8QG8BHqYRsPY4OL6cmb44CbqXl1T0xxS97VhHkk,5377 pip/_internal/utils/compatibility_tags.py,sha256=ydin8QG8BHqYRsPY4OL6cmb44CbqXl1T0xxS97VhHkk,5377
pip/_internal/utils/datetime.py,sha256=m21Y3wAtQc-ji6Veb6k_M5g6A0ZyFI4egchTdnwh-pQ,242 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/direct_url_helpers.py,sha256=6F1tc2rcKaCZmgfVwsE6ObIe_Pux23mUVYA-2D9wCFc,3206
pip/_internal/utils/distutils_args.py,sha256=bYUt4wfFJRaeGO4VHia6FNaA8HlYXMcKuEq1zYijY5g,1115 pip/_internal/utils/distutils_args.py,sha256=bYUt4wfFJRaeGO4VHia6FNaA8HlYXMcKuEq1zYijY5g,1115
pip/_internal/utils/egg_link.py,sha256=5MVlpz5LirT4iLQq86OYzjXaYF0D4Qk1dprEI7ThST4,2203 pip/_internal/utils/egg_link.py,sha256=5MVlpz5LirT4iLQq86OYzjXaYF0D4Qk1dprEI7ThST4,2203
pip/_internal/utils/encoding.py,sha256=qqsXDtiwMIjXMEiIVSaOjwH5YmirCaK-dIzb6-XJsL0,1169 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/filesystem.py,sha256=RhMIXUaNVMGjc3rhsDahWQ4MavvEQDdqXqgq-F6fpw8,5122
pip/_internal/utils/filetypes.py,sha256=i8XAQ0eFCog26Fw9yV0Yb1ygAqKYB1w9Cz9n0fj8gZU,716 pip/_internal/utils/filetypes.py,sha256=i8XAQ0eFCog26Fw9yV0Yb1ygAqKYB1w9Cz9n0fj8gZU,716
pip/_internal/utils/glibc.py,sha256=tDfwVYnJCOC0BNVpItpy8CGLP9BjkxFHdl0mTS0J7fc,3110 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/inject_securetransport.py,sha256=o-QRVMGiENrTJxw3fAhA7uxpdEdw6M41TjHYtSVRrcg,795
pip/_internal/utils/logging.py,sha256=U2q0i1n8hPS2gQh8qcocAg5dovGAa_bR24akmXMzrk4,11632 pip/_internal/utils/logging.py,sha256=U2q0i1n8hPS2gQh8qcocAg5dovGAa_bR24akmXMzrk4,11632
pip/_internal/utils/misc.py,sha256=49Rs2NgrD4JGTKFt0farCm7FIAi-rjyoxgioArhCW_0,21617 pip/_internal/utils/misc.py,sha256=49Rs2NgrD4JGTKFt0farCm7FIAi-rjyoxgioArhCW_0,21617
pip/_internal/utils/models.py,sha256=5GoYU586SrxURMvDn_jBMJInitviJg4O5-iOU-6I0WY,1193 pip/_internal/utils/models.py,sha256=5GoYU586SrxURMvDn_jBMJInitviJg4O5-iOU-6I0WY,1193
pip/_internal/utils/packaging.py,sha256=5Wm6_x7lKrlqVjPI5MBN_RurcRHwVYoQ7Ksrs84de7s,2108 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/subprocess.py,sha256=MYySbvY7qBevRxq_RFfOsDqG4vMqrB4vDoL_eyPE6Bo,9197
pip/_internal/utils/temp_dir.py,sha256=aCX489gRa4Nu0dMKRFyGhV6maJr60uEynu5uCbKR4Qg,7702 pip/_internal/utils/temp_dir.py,sha256=aCX489gRa4Nu0dMKRFyGhV6maJr60uEynu5uCbKR4Qg,7702
pip/_internal/utils/unpacking.py,sha256=SBb2iV1crb89MDRTEKY86R4A_UOWApTQn9VQVcMDOlE,8821 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__/mercurial.cpython-310.pyc,,
pip/_internal/vcs/__pycache__/subversion.cpython-310.pyc,, pip/_internal/vcs/__pycache__/subversion.cpython-310.pyc,,
pip/_internal/vcs/__pycache__/versioncontrol.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/git.py,sha256=mjhwudCx9WlLNkxZ6_kOKmueF0rLoU2i1xeASKF6yiQ,18116
pip/_internal/vcs/mercurial.py,sha256=Bzbd518Jsx-EJI0IhIobiQqiRsUv5TWYnrmRIFWE0Gw,5238 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/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/__init__.py,sha256=fNxOSVD0auElsD8fN9tuq5psfgMQ-RFBtD4X5gjlRkg,4966
pip/_vendor/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/__pycache__/__init__.cpython-310.pyc,,
pip/_vendor/__pycache__/six.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/heuristics.py,sha256=8kAyuZLSCyEIgQr6vbUwfhpqg9ows4mM0IV6DWazevI,4154
pip/_vendor/cachecontrol/serialize.py,sha256=_U1NU_C-SDgFzkbAxAsPDgMTHeTWZZaHCQnZN_jh0U8,7105 pip/_vendor/cachecontrol/serialize.py,sha256=_U1NU_C-SDgFzkbAxAsPDgMTHeTWZZaHCQnZN_jh0U8,7105
pip/_vendor/cachecontrol/wrapper.py,sha256=X3-KMZ20Ho3VtqyVaXclpeQpFzokR5NE8tZSfvKVaB8,774 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/__main__.py,sha256=1k3Cr95vCxxGRGDljrW3wMdpZdL3Nhf0u1n-k2qdsCY,255
pip/_vendor/certifi/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/certifi/__pycache__/__init__.cpython-310.pyc,,
pip/_vendor/certifi/__pycache__/__main__.cpython-310.pyc,, pip/_vendor/certifi/__pycache__/__main__.cpython-310.pyc,,
pip/_vendor/certifi/__pycache__/core.cpython-310.pyc,, pip/_vendor/certifi/__pycache__/core.cpython-310.pyc,,
pip/_vendor/certifi/cacert.pem,sha256=pZ_eiDoO-ddKudrQCWieABc9KFlbV0FsmLLugygMbkw,285222 pip/_vendor/certifi/cacert.pem,sha256=3l8CcWt_qL42030rGieD3SLufICFX0bYtGhDl_EXVPI,286370
pip/_vendor/certifi/core.py,sha256=g6EYcIFUAhYv5CB9B94iKRgMfGj8f82MF0CRdTDovxM,3052 pip/_vendor/certifi/core.py,sha256=ZwiOsv-sD_ouU1ft8wy_xZ3LQ7UbcVzyqj2XNyrsZis,4279
pip/_vendor/chardet/__init__.py,sha256=9-r0i294avRciob2HKVcKf6GJmXPHpgMqIijVrqHBDU,3705 pip/_vendor/chardet/__init__.py,sha256=9-r0i294avRciob2HKVcKf6GJmXPHpgMqIijVrqHBDU,3705
pip/_vendor/chardet/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/chardet/__pycache__/__init__.cpython-310.pyc,,
pip/_vendor/chardet/__pycache__/big5freq.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/initialise.py,sha256=PprovDNxMTrvoNHFcL2NZjpH2XzDc8BLxLxiErfUl4k,1915
pip/_vendor/colorama/win32.py,sha256=bJ8Il9jwaBN5BJ8bmN6FoYZ1QYuMKv2j8fGrXh7TJjw,5404 pip/_vendor/colorama/win32.py,sha256=bJ8Il9jwaBN5BJ8bmN6FoYZ1QYuMKv2j8fGrXh7TJjw,5404
pip/_vendor/colorama/winterm.py,sha256=2y_2b7Zsv34feAsP67mLOVc-Bgq51mdYGo571VprlrM,6438 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__/__init__.cpython-310.pyc,,
pip/_vendor/distlib/__pycache__/compat.cpython-310.pyc,, pip/_vendor/distlib/__pycache__/compat.cpython-310.pyc,,
pip/_vendor/distlib/__pycache__/database.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/metadata.py,sha256=g_DIiu8nBXRzA-mWPRpatHGbmFZqaFoss7z9TG7QSUU,39801
pip/_vendor/distlib/resources.py,sha256=LwbPksc0A1JMbi6XnuPdMBUn83X7BPuFNWqPGEKI698,10820 pip/_vendor/distlib/resources.py,sha256=LwbPksc0A1JMbi6XnuPdMBUn83X7BPuFNWqPGEKI698,10820
pip/_vendor/distlib/scripts.py,sha256=BmkTKmiTk4m2cj-iueliatwz3ut_9SsABBW51vnQnZU,18102 pip/_vendor/distlib/scripts.py,sha256=BmkTKmiTk4m2cj-iueliatwz3ut_9SsABBW51vnQnZU,18102
pip/_vendor/distlib/t32.exe,sha256=lD3IWCwZiYZ9onypJifi2R1sGS-S24t3mYupsEAOKyA,97792 pip/_vendor/distlib/t32.exe,sha256=a0GV5kCoWsMutvliiCKmIgV98eRZ33wXoS-XrqvJQVs,97792
pip/_vendor/distlib/t64-arm.exe,sha256=3hjLTLg7XBVHwDxgzZpkiHXXp4IJQMLvg_ZlGGpKZDI,182784 pip/_vendor/distlib/t64-arm.exe,sha256=68TAa32V504xVBnufojh0PcenpR3U4wAqTqf-MZqbPw,182784
pip/_vendor/distlib/t64.exe,sha256=vvS31h4-SnumthypJJKAWBeBh7cxSJ8AwGmbqumM05k,107520 pip/_vendor/distlib/t64.exe,sha256=gaYY8hy4fbkHYTTnA4i26ct8IQZzkBG2pRdy0iyuBrc,108032
pip/_vendor/distlib/util.py,sha256=31dPXn3Rfat0xZLeVoFpuniyhe6vsbl9_QN-qd9Lhlk,66262 pip/_vendor/distlib/util.py,sha256=31dPXn3Rfat0xZLeVoFpuniyhe6vsbl9_QN-qd9Lhlk,66262
pip/_vendor/distlib/version.py,sha256=WG__LyAa2GwmA6qSoEJtvJE8REA1LZpbSizy8WvhJLk,23513 pip/_vendor/distlib/version.py,sha256=WG__LyAa2GwmA6qSoEJtvJE8REA1LZpbSizy8WvhJLk,23513
pip/_vendor/distlib/w32.exe,sha256=-a9nfgVZClK_mGnbQtXVLbn7xtPYw3xDKTddKnu2AJ8,91648 pip/_vendor/distlib/w32.exe,sha256=R4csx3-OGM9kL4aPIzQKRo5TfmRSHZo6QWyLhDhNBks,91648
pip/_vendor/distlib/w64-arm.exe,sha256=LW-JyIIGblDOp8Psy8igJXDvcg_YpJIINvN0tRjfv18,168448 pip/_vendor/distlib/w64-arm.exe,sha256=xdyYhKj0WDcVUOCb05blQYvzdYIKMbmJn2SZvzkcey4,168448
pip/_vendor/distlib/w64.exe,sha256=XvKqAoQzca86ERd2-KV5Vo1RSOBM28I2a35sPQONrYI,101888 pip/_vendor/distlib/w64.exe,sha256=ejGf-rojoBfXseGLpya6bFTFPWRG21X5KvU8J5iU-K0,101888
pip/_vendor/distlib/wheel.py,sha256=Rgqs658VsJ3R2845qwnZD8XQryV2CzWw2mghwLvxxsI,43898 pip/_vendor/distlib/wheel.py,sha256=Rgqs658VsJ3R2845qwnZD8XQryV2CzWw2mghwLvxxsI,43898
pip/_vendor/distro/__init__.py,sha256=2fHjF-SfgPvjyNZ1iHh_wjqWdR_Yo5ODHwZC0jLBPhc,981 pip/_vendor/distro/__init__.py,sha256=2fHjF-SfgPvjyNZ1iHh_wjqWdR_Yo5ODHwZC0jLBPhc,981
pip/_vendor/distro/__main__.py,sha256=bu9d3TifoKciZFcqRBuygV3GSuThnVD_m2IK4cz96Vs,64 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/__pycache__/uts46data.cpython-310.pyc,,
pip/_vendor/idna/codec.py,sha256=6ly5odKfqrytKT9_7UrlGklHnf1DSK2r9C6cSM4sa28,3374 pip/_vendor/idna/codec.py,sha256=6ly5odKfqrytKT9_7UrlGklHnf1DSK2r9C6cSM4sa28,3374
pip/_vendor/idna/compat.py,sha256=0_sOEUMT4CVw9doD3vyRhX80X19PwqFoUBs7gWsFME4,321 pip/_vendor/idna/compat.py,sha256=0_sOEUMT4CVw9doD3vyRhX80X19PwqFoUBs7gWsFME4,321
pip/_vendor/idna/core.py,sha256=RFIkY-HhFZaDoBEFjGwyGd_vWI04uOAQjnzueMWqwOU,12795 pip/_vendor/idna/core.py,sha256=1JxchwKzkxBSn7R_oCE12oBu3eVux0VzdxolmIad24M,12950
pip/_vendor/idna/idnadata.py,sha256=fzMzkCea2xieVxcrjngJ-2pLsKQNejPCZFlBajIuQdw,44025 pip/_vendor/idna/idnadata.py,sha256=xUjqKqiJV8Ho_XzBpAtv5JFoVPSupK-SUXvtjygUHqw,44375
pip/_vendor/idna/intranges.py,sha256=YBr4fRYuWH7kTKS2tXlFjM24ZF1Pdvcir-aywniInqg,1881 pip/_vendor/idna/intranges.py,sha256=YBr4fRYuWH7kTKS2tXlFjM24ZF1Pdvcir-aywniInqg,1881
pip/_vendor/idna/package_data.py,sha256=szxQhV0ZD0nKJ84Kuobw3l8q4_KeCyXjFRdpwIpKZmw,21 pip/_vendor/idna/package_data.py,sha256=C_jHJzmX8PI4xq0jpzmcTMxpb5lDsq4o5VyxQzlVrZE,21
pip/_vendor/idna/uts46data.py,sha256=o-D7V-a0fOLZNd7tvxof6MYfUd0TBZzE2bLR5XO67xU,204400 pip/_vendor/idna/uts46data.py,sha256=zvjZU24s58_uAS850Mcd0NnD0X7_gCMAMjzWNIeUJdc,206539
pip/_vendor/msgpack/__init__.py,sha256=NryGaKLDk_Egd58ZxXpnuI7OWO27AXz7S6CBFRM3sAY,1132 pip/_vendor/msgpack/__init__.py,sha256=NryGaKLDk_Egd58ZxXpnuI7OWO27AXz7S6CBFRM3sAY,1132
pip/_vendor/msgpack/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/msgpack/__pycache__/__init__.cpython-310.pyc,,
pip/_vendor/msgpack/__pycache__/exceptions.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/tags.py,sha256=lmsnGNiJ8C4D_Pf9PbM0qgbZvD9kmB9lpZBQUZa3R_Y,15699
pip/_vendor/packaging/utils.py,sha256=dJjeat3BS-TYn1RrUFVwufUMasbtzLfYRoy_HXENeFQ,4200 pip/_vendor/packaging/utils.py,sha256=dJjeat3BS-TYn1RrUFVwufUMasbtzLfYRoy_HXENeFQ,4200
pip/_vendor/packaging/version.py,sha256=_fLRNrFrxYcHVfyo8vk9j8s6JM8N_xsSxVFr6RJyco8,14665 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__/__init__.cpython-310.pyc,,
pip/_vendor/pep517/__pycache__/_compat.cpython-310.pyc,,
pip/_vendor/pep517/__pycache__/build.cpython-310.pyc,, pip/_vendor/pep517/__pycache__/build.cpython-310.pyc,,
pip/_vendor/pep517/__pycache__/check.cpython-310.pyc,, pip/_vendor/pep517/__pycache__/check.cpython-310.pyc,,
pip/_vendor/pep517/__pycache__/colorlog.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__/dirtools.cpython-310.pyc,,
pip/_vendor/pep517/__pycache__/envbuild.cpython-310.pyc,, pip/_vendor/pep517/__pycache__/envbuild.cpython-310.pyc,,
pip/_vendor/pep517/__pycache__/meta.cpython-310.pyc,, pip/_vendor/pep517/__pycache__/meta.cpython-310.pyc,,
pip/_vendor/pep517/__pycache__/wrappers.cpython-310.pyc,, pip/_vendor/pep517/__pycache__/wrappers.cpython-310.pyc,,
pip/_vendor/pep517/build.py,sha256=2bar6EdjwIz2Dlfy94qdxn3oA9mVnnny40mfoT5f-qI,3457 pip/_vendor/pep517/_compat.py,sha256=by6evrYnqkisiM-MQcvOKs5bgDMzlOSgZqRHNqf04zE,138
pip/_vendor/pep517/check.py,sha256=bCORq1WrHjhpTONa-zpAqG0EB9rHNuhO1ORu6DsDuL8,6084 pip/_vendor/pep517/build.py,sha256=VLtq0hOvNWCfX0FkdvTKEr-TmyrbaX0UqghpU7bHO1w,3443
pip/_vendor/pep517/colorlog.py,sha256=Tk9AuYm_cLF3BKTBoSTJt9bRryn0aFojIQOwbfVUTxQ,4098 pip/_vendor/pep517/check.py,sha256=o0Mp_PX1yOM2WNq1ZdDph3YA7RObj2UGQUCUF-46RaU,6083
pip/_vendor/pep517/compat.py,sha256=NmLImE5oiDT3gbEhJ4w7xeoMFcpAPrGu_NltBytSJUY,1253 pip/_vendor/pep517/colorlog.py,sha256=eCV1W52xzBjA-sOlKzUcvabRiFa11Y7hA791u-85_c8,3994
pip/_vendor/pep517/dirtools.py,sha256=2mkAkAL0mRz_elYFjRKuekTJVipH1zTn4tbf1EDev84,1129 pip/_vendor/pep517/dirtools.py,sha256=JiZ1Hlt2LNaLZEhNa_pm1YyG3MUoRh7KxY6hJ8ac-w0,607
pip/_vendor/pep517/envbuild.py,sha256=zFde--rmzjXMLXcm7SA_3hDtgk5VCTA8hjpk88RbF6E,6100 pip/_vendor/pep517/envbuild.py,sha256=nkTt1ZY7MXVgYOhPTyTr-VOxQ-q_Qc1touXfQgM56Bs,6081
pip/_vendor/pep517/in_process/__init__.py,sha256=MyWoAi8JHdcBv7yXuWpUSVADbx6LSB9rZh7kTIgdA8Y,563 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__/__init__.cpython-310.pyc,,
pip/_vendor/pep517/in_process/__pycache__/_in_process.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/in_process/_in_process.py,sha256=JDpTxlKMDN1QfN_ey4IDtE6ZVSWtzP0_WLSqt1TyGaA,10801
pip/_vendor/pep517/meta.py,sha256=8mnM5lDnT4zXQpBTliJbRGfesH7iioHwozbDxALPS9Y,2463 pip/_vendor/pep517/meta.py,sha256=budDWsV3I2OnnpSvXQ_ycuTqxh8G7DABoazAq-j8OlQ,2520
pip/_vendor/pep517/wrappers.py,sha256=impq7Cz_LL1iDF1iiOzYWB4MaEu6O6Gps7TJ5qsJz1Q,13429 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/__init__.py,sha256=NnpQ3g6BCHzpMgOR_OLBmYtniY4oOzdKpwqghfq_6ug,108287
pip/_vendor/pkg_resources/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/pkg_resources/__pycache__/__init__.cpython-310.pyc,,
pip/_vendor/pkg_resources/__pycache__/py31compat.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/unix.py,sha256=b4aVYTz0qZ50HntwOXo8r6tp82jAa3qTjxw-WlnC2yc,6910
pip/_vendor/platformdirs/version.py,sha256=tsBKKPDX3LLh39yHXeTYauGRbRd-AmOJr9SwKldlFIU,78 pip/_vendor/platformdirs/version.py,sha256=tsBKKPDX3LLh39yHXeTYauGRbRd-AmOJr9SwKldlFIU,78
pip/_vendor/platformdirs/windows.py,sha256=ISruopR5UGBePC0BxCxXevkZYfjJsIZc49YWU5iYfQ4,6439 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/__main__.py,sha256=p0_rz3JZmNZMNZBOqDojaEx1cr9wmA9FQZX_TYl74lQ,353
pip/_vendor/pygments/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/pygments/__pycache__/__init__.cpython-310.pyc,,
pip/_vendor/pygments/__pycache__/__main__.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__/token.cpython-310.pyc,,
pip/_vendor/pygments/__pycache__/unistring.cpython-310.pyc,, pip/_vendor/pygments/__pycache__/unistring.cpython-310.pyc,,
pip/_vendor/pygments/__pycache__/util.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/console.py,sha256=hQfqCFuOlGk7DW2lPQYepsw-wkOH1iNt9ylNA1eRymM,1697
pip/_vendor/pygments/filter.py,sha256=NglMmMPTRRv-zuRSE_QbWid7JXd2J4AvwjCW2yWALXU,1938 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/filters/__pycache__/__init__.cpython-310.pyc,,
pip/_vendor/pygments/formatter.py,sha256=6-TS2Y8pUMeWIUolWwr1O8ruC-U6HydWDwOdbAiJgJQ,2917 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__/__init__.cpython-310.pyc,,
pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-310.pyc,, pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-310.pyc,,
pip/_vendor/pygments/formatters/__pycache__/bbcode.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__/svg.cpython-310.pyc,,
pip/_vendor/pygments/formatters/__pycache__/terminal.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/__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/bbcode.py,sha256=JrL4ITjN-KzPcuQpPMBf1pm33eW2sDUNr8WzSoAJsJA,3314
pip/_vendor/pygments/formatters/groff.py,sha256=xrOFoLbafSA9uHsSLRogy79_Zc4GWJ8tMK2hCdTJRsw,5086 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/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/irc.py,sha256=iwk5tDJOxbCV64SCmOFyvk__x6RD60ay0nUn7ko9n7U,5871
pip/_vendor/pygments/formatters/latex.py,sha256=thPbytJCIs2AUXsO3NZwqKtXJ-upOlcXP4CXsx94G4w,19351 pip/_vendor/pygments/formatters/latex.py,sha256=thPbytJCIs2AUXsO3NZwqKtXJ-upOlcXP4CXsx94G4w,19351
pip/_vendor/pygments/formatters/other.py,sha256=PczqK1Rms43lz6iucOLPeBMxIncPKOGBt-195w1ynII,5073 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/terminal.py,sha256=NpEGvwkC6LgMLQTjVzGrJXji3XcET1sb5JCunSCzoRo,4674
pip/_vendor/pygments/formatters/terminal256.py,sha256=4v4OVizvsxtwWBpIy_Po30zeOzE5oJg_mOc1-rCjMDk,11753 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/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__/__init__.cpython-310.pyc,,
pip/_vendor/pygments/lexers/__pycache__/_mapping.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/__pycache__/python.cpython-310.pyc,,
pip/_vendor/pygments/lexers/_mapping.py,sha256=sExOsmEbtg7hKwXgSz6M3L77cKPaOgskzxOCdw_GxVc,72083 pip/_vendor/pygments/lexers/_mapping.py,sha256=zEiCV5FPiBioMJQJjw9kk7IJ5Y9GwknS4VJPYlcNchs,70232
pip/_vendor/pygments/lexers/python.py,sha256=QWj4ud4brZCj0-LXjR7IcO0kL6lqM2HzM_DzZZxMRjg,52792 pip/_vendor/pygments/lexers/python.py,sha256=gZROs9iNSOA18YyVghP1cUCD0OwYZ04a6PCwgSOCeSA,53376
pip/_vendor/pygments/modeline.py,sha256=gIbMSYrjSWPk0oATz7W9vMBYkUyTK2OcdVyKjioDRvA,986 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/regexopt.py,sha256=c6xcXGpGgvCET_3VWawJJqAnOp0QttFpQEdOPNY2Py0,3072
pip/_vendor/pygments/scanner.py,sha256=F2T2G6cpkj-yZtzGQr-sOBw5w5-96UrJWveZN6va2aM,3092 pip/_vendor/pygments/scanner.py,sha256=F2T2G6cpkj-yZtzGQr-sOBw5w5-96UrJWveZN6va2aM,3092
pip/_vendor/pygments/sphinxext.py,sha256=F8L0211sPnXaiWutN0lkSUajWBwlgDMIEFFAbMWOvZY,4630 pip/_vendor/pygments/sphinxext.py,sha256=F8L0211sPnXaiWutN0lkSUajWBwlgDMIEFFAbMWOvZY,4630
pip/_vendor/pygments/style.py,sha256=RRnussX1YiK9Z7HipIvKorImxu3-HnkdpPCO4u925T0,6257 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/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/unistring.py,sha256=gP3gK-6C4oAFjjo9HvoahsqzuV4Qz0jl0E0OxfDerHI,63187
pip/_vendor/pygments/util.py,sha256=KgwpWWC3By5AiNwxGTI7oI9aXupH2TyZWukafBJe0Mg,9110 pip/_vendor/pygments/util.py,sha256=KgwpWWC3By5AiNwxGTI7oI9aXupH2TyZWukafBJe0Mg,9110
pip/_vendor/pyparsing/__init__.py,sha256=ZPdI7pPo4IYXcABw-51AcqOzsxVvDtqnQbyn_qYWZvo,9171 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/adapters.py,sha256=GFEz5koZaMZD86v0SHXKVB5SE9MgslEjkCQzldkNwVM,21443
pip/_vendor/requests/api.py,sha256=dyvkDd5itC9z2g0wHl_YfD1yf6YwpGWLO7__8e21nks,6377 pip/_vendor/requests/api.py,sha256=dyvkDd5itC9z2g0wHl_YfD1yf6YwpGWLO7__8e21nks,6377
pip/_vendor/requests/auth.py,sha256=h-HLlVx9j8rKV5hfSAycP2ApOSglTz77R0tz7qCbbEE,10187 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/compat.py,sha256=IhK9quyX0RRuWTNcg6d2JGSAOUbM6mym2p_2XjLTwf4,1286
pip/_vendor/requests/cookies.py,sha256=kD3kNEcCj-mxbtf5fJsSaT86eGoEYpD3X0CSgpzl7BM,18560 pip/_vendor/requests/cookies.py,sha256=kD3kNEcCj-mxbtf5fJsSaT86eGoEYpD3X0CSgpzl7BM,18560
pip/_vendor/requests/exceptions.py,sha256=FA-_kVwBZ2jhXauRctN_ewHVK25b-fj0Azyz1THQ0Kk,3823 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/traceback.py,sha256=MORQpXH7AvhAAThW8oIbtwffXb8M6XRkSkcJ52JuA3g,26060
pip/_vendor/rich/tree.py,sha256=BMbUYNjS9uodNPfvtY_odmU09GA5QzcMbQ5cJZhllQI,9169 pip/_vendor/rich/tree.py,sha256=BMbUYNjS9uodNPfvtY_odmU09GA5QzcMbQ5cJZhllQI,9169
pip/_vendor/six.py,sha256=TOOfQi7nFGfMrIvtdr6wX4wyHH8M7aknmuLfo2cBBrM,34549 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__/__init__.cpython-310.pyc,,
pip/_vendor/tenacity/__pycache__/_asyncio.cpython-310.pyc,, pip/_vendor/tenacity/__pycache__/_asyncio.cpython-310.pyc,,
pip/_vendor/tenacity/__pycache__/_utils.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.py,sha256=7XtvRmO0dRWUp8SVn24OvIiGFj8-4OP5muQRUiWgLh0,1376
pip/_vendor/tenacity/before_sleep.py,sha256=ThyDvqKU5yle_IvYQz_b6Tp6UjUS0PhVp6zgqYl9U6Y,1908 pip/_vendor/tenacity/before_sleep.py,sha256=ThyDvqKU5yle_IvYQz_b6Tp6UjUS0PhVp6zgqYl9U6Y,1908
pip/_vendor/tenacity/nap.py,sha256=fRWvnz1aIzbIq9Ap3gAkAZgDH6oo5zxMrU6ZOVByq0I,1383 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/stop.py,sha256=sKHmHaoSaW6sKu3dTxUVKr1-stVkY7lw4Y9yjZU30zQ,2790
pip/_vendor/tenacity/tornadoweb.py,sha256=E8lWO2nwe6dJgoB-N2HhQprYLDLB_UdSgFnv-EN6wKE,2145 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/__init__.py,sha256=JhUwV66DB1g4Hvt1UQCVMdfCu-IgAV8FXmvDU9onxd4,396
pip/_vendor/tomli/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/tomli/__pycache__/__init__.cpython-310.pyc,,
pip/_vendor/tomli/__pycache__/_parser.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/_parser.py,sha256=g9-ENaALS-B8dokYpCuzUFalWlog7T-SIYMjLZSWrtM,22633
pip/_vendor/tomli/_re.py,sha256=dbjg5ChZT23Ka9z9DHOXfdtSpPwUfdgMXnj8NOoly-w,2943 pip/_vendor/tomli/_re.py,sha256=dbjg5ChZT23Ka9z9DHOXfdtSpPwUfdgMXnj8NOoly-w,2943
pip/_vendor/tomli/_types.py,sha256=-GTG2VUqkpxwMqzmVO4F7ybKddIbAnuAHXfmWQcTi3Q,254 pip/_vendor/tomli/_types.py,sha256=-GTG2VUqkpxwMqzmVO4F7ybKddIbAnuAHXfmWQcTi3Q,254
pip/_vendor/typing_extensions.py,sha256=U_PyumPFBkMiR_Iq78QWZXdPprTywptECB2WRIQjDv0,75420 pip/_vendor/typing_extensions.py,sha256=VKZ_nHsuzDbKOVUY2CTdavwBgfZ2EXRyluZHRzUYAbg,80114
pip/_vendor/urllib3/__init__.py,sha256=j3yzHIbmW7CS-IKQJ9-PPQf_YKO8EOAey_rMW0UR7us,2763 pip/_vendor/urllib3/__init__.py,sha256=iXLcYiJySn0GNbWOOZDDApgBL1JgP44EZ8i1760S8Mc,3333
pip/_vendor/urllib3/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/urllib3/__pycache__/__init__.cpython-310.pyc,,
pip/_vendor/urllib3/__pycache__/_collections.cpython-310.pyc,, pip/_vendor/urllib3/__pycache__/_collections.cpython-310.pyc,,
pip/_vendor/urllib3/__pycache__/_version.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__/request.cpython-310.pyc,,
pip/_vendor/urllib3/__pycache__/response.cpython-310.pyc,, pip/_vendor/urllib3/__pycache__/response.cpython-310.pyc,,
pip/_vendor/urllib3/_collections.py,sha256=Rp1mVyBgc_UlAcp6M3at1skJBXR5J43NawRTvW2g_XY,10811 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/connection.py,sha256=8976wL6sGeVMW0JnXvx5mD00yXu87uQjxtB9_VL8dx8,20070
pip/_vendor/urllib3/connectionpool.py,sha256=vEzk1iJEw1qR2vHBo7m3Y98iDfna6rKkUz3AyK5lJKQ,39093 pip/_vendor/urllib3/connectionpool.py,sha256=vEzk1iJEw1qR2vHBo7m3Y98iDfna6rKkUz3AyK5lJKQ,39093
pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 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/_securetransport/low_level.py,sha256=B2JBB2_NRP02xK6DCa1Pa9IuxrPwxzDzZbixQkb7U9M,13922
pip/_vendor/urllib3/contrib/appengine.py,sha256=lfzpHFmJiO82shClLEm3QB62SYgHWnjpZOH_2JhU5Tc,11034 pip/_vendor/urllib3/contrib/appengine.py,sha256=lfzpHFmJiO82shClLEm3QB62SYgHWnjpZOH_2JhU5Tc,11034
pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=ej9gGvfAb2Gt00lafFp45SIoRz-QwrQ4WChm6gQmAlM,4538 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/securetransport.py,sha256=yhZdmVjY6PI6EeFbp7qYOp6-vp1Rkv2NMuOGaEj7pmc,34448
pip/_vendor/urllib3/contrib/socks.py,sha256=aRi9eWXo9ZEb95XUxef4Z21CFlnnjbEiAo9HOseoMt4,7097 pip/_vendor/urllib3/contrib/socks.py,sha256=aRi9eWXo9ZEb95XUxef4Z21CFlnnjbEiAo9HOseoMt4,7097
pip/_vendor/urllib3/exceptions.py,sha256=0Mnno3KHTNfXRfY7638NufOPkUb6mXOm-Lqj-4x2w8A,8217 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/packages/six.py,sha256=b9LM0wBXv7E7SrbCjAm4wwN-hrH-iNxv18LgWNMMKPo,34665
pip/_vendor/urllib3/poolmanager.py,sha256=0KOOJECoeLYVjUHvv-0h4Oq3FFQQ2yb-Fnjkbj8gJO0,19786 pip/_vendor/urllib3/poolmanager.py,sha256=0KOOJECoeLYVjUHvv-0h4Oq3FFQQ2yb-Fnjkbj8gJO0,19786
pip/_vendor/urllib3/request.py,sha256=ZFSIqX0C6WizixecChZ3_okyu7BEv0lZu1VT0s6h4SM,5985 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/__init__.py,sha256=JEmSmmqqLyaw8P51gUImZh8Gwg9i1zSe-DoqAitn2nc,1155
pip/_vendor/urllib3/util/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/urllib3/util/__pycache__/__init__.cpython-310.pyc,,
pip/_vendor/urllib3/util/__pycache__/connection.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/timeout.py,sha256=QSbBUNOB9yh6AnDn61SrLQ0hg5oz0I9-uXEG91AJuIg,10003
pip/_vendor/urllib3/util/url.py,sha256=49HwObaTUUjqVe4qvSUvIjZyf3ghgNA6-OLm3kmkFKM,14287 pip/_vendor/urllib3/util/url.py,sha256=49HwObaTUUjqVe4qvSUvIjZyf3ghgNA6-OLm3kmkFKM,14287
pip/_vendor/urllib3/util/wait.py,sha256=fOX0_faozG2P7iVojQoE1mbydweNyTcm-hXEfFrTtLI,5403 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/__init__.py,sha256=qOBJIuPy_4ByYH6W_bNgJF-qYQ2DoU-dKsDu5yRWCXg,10579
pip/_vendor/webencodings/__pycache__/__init__.cpython-310.pyc,, pip/_vendor/webencodings/__pycache__/__init__.cpython-310.pyc,,
pip/_vendor/webencodings/__pycache__/labels.cpython-310.pyc,, pip/_vendor/webencodings/__pycache__/labels.cpython-310.pyc,,

View File

@ -1,4 +1,4 @@
[console_scripts] [console_scripts]
pip = pip._internal.cli.main:main pip = pip._internal.cli.main:main
pip3 = 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

View File

@ -1,6 +1,6 @@
from typing import List, Optional from typing import List, Optional
__version__ = "22.2.2" __version__ = "22.3"
def main(args: Optional[List[str]] = None) -> int: def main(args: Optional[List[str]] = None) -> int:

View File

@ -4,24 +4,38 @@ This file is named as it is, to ensure that this module can't be imported via
an import statement. an import statement.
""" """
import runpy # /!\ This version compatibility check section must be Python 2 compatible. /!\
import sys import sys
import types
from importlib.machinery import ModuleSpec, PathFinder # Copied from setup.py
from os.path import dirname PYTHON_REQUIRES = (3, 7)
from typing import Optional, Sequence, Union
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__)) PIP_SOURCES_ROOT = dirname(dirname(__file__))
class PipImportRedirectingFinder: class PipImportRedirectingFinder:
@classmethod @classmethod
def find_spec( def find_spec(self, fullname, path=None, target=None): # type: ignore
self,
fullname: str,
path: Optional[Sequence[Union[bytes, str]]] = None,
target: Optional[types.ModuleType] = None,
) -> Optional[ModuleSpec]:
if fullname != "pip": if fullname != "pip":
return None return None

View File

@ -4,6 +4,7 @@
import logging import logging
import os import os
import pathlib import pathlib
import site
import sys import sys
import textwrap import textwrap
from collections import OrderedDict from collections import OrderedDict
@ -39,7 +40,7 @@ class _Prefix:
self.lib_dirs = get_prefixed_libs(path) 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. """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 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") 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: class BuildEnvironment:
"""Creates and manages an isolated environment to install build deps""" """Creates and manages an isolated environment to install build deps"""
@ -75,9 +96,8 @@ class BuildEnvironment:
# Customize site to: # Customize site to:
# - ensure .pth files are honored # - ensure .pth files are honored
# - prevent access to system site packages # - prevent access to system site packages
system_sites = { system_sites = _get_system_sitepackages()
os.path.normcase(site) for site in (get_purelib(), get_platlib())
}
self._site_dir = os.path.join(temp_dir.path, "site") self._site_dir = os.path.join(temp_dir.path, "site")
if not os.path.exists(self._site_dir): if not os.path.exists(self._site_dir):
os.mkdir(self._site_dir) os.mkdir(self._site_dir)
@ -194,7 +214,7 @@ class BuildEnvironment:
if not requirements: if not requirements:
return return
self._install_requirements( self._install_requirements(
_get_runnable_pip(), get_runnable_pip(),
finder, finder,
requirements, requirements,
prefix, prefix,

View File

@ -221,7 +221,11 @@ class WheelCache(Cache):
when a certain link is not found in the simple wheel cache first. 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"}) super().__init__(cache_dir, format_control, {"binary"})
self._wheel_cache = SimpleWheelCache(cache_dir, format_control) self._wheel_cache = SimpleWheelCache(cache_dir, format_control)
self._ephem_cache = EphemWheelCache(format_control) self._ephem_cache = EphemWheelCache(format_control)

View File

@ -151,13 +151,6 @@ class Command(CommandContextMixIn):
) )
options.cache_dir = None 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( def intercepts_unhandled_exc(
run_func: Callable[..., int] run_func: Callable[..., int]
) -> Callable[..., int]: ) -> Callable[..., int]:

View File

@ -59,31 +59,6 @@ def make_option_group(group: Dict[str, Any], parser: ConfigOptionParser) -> Opti
return option_group 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: def check_dist_restriction(options: Values, check_target: bool = False) -> None:
"""Function for determining if custom platform options are allowed. """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( verbose: Callable[..., Option] = partial(
Option, Option,
"-v", "-v",
@ -1000,7 +982,11 @@ use_new_feature: Callable[..., Option] = partial(
metavar="feature", metavar="feature",
action="append", action="append",
default=[], 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.", help="Enable new functionality, that may be backward incompatible.",
) )
@ -1029,6 +1015,7 @@ general_group: Dict[str, Any] = {
debug_mode, debug_mode,
isolated_mode, isolated_mode,
require_virtualenv, require_virtualenv,
python,
verbose, verbose,
version, version,
quiet, quiet,

View File

@ -2,9 +2,11 @@
""" """
import os import os
import subprocess
import sys 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 import cmdoptions
from pip._internal.cli.parser import ConfigOptionParser, UpdatingDefaultsHelpFormatter from pip._internal.cli.parser import ConfigOptionParser, UpdatingDefaultsHelpFormatter
from pip._internal.commands import commands_dict, get_similar_commands from pip._internal.commands import commands_dict, get_similar_commands
@ -45,6 +47,25 @@ def create_main_parser() -> ConfigOptionParser:
return parser 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]]: def parse_command(args: List[str]) -> Tuple[str, List[str]]:
parser = create_main_parser() parser = create_main_parser()
@ -57,6 +78,32 @@ def parse_command(args: List[str]) -> Tuple[str, List[str]]:
# args_else: ['install', '--user', 'INITools'] # args_else: ['install', '--user', 'INITools']
general_options, args_else = parser.parse_args(args) 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 # --version
if general_options.version: if general_options.version:
sys.stdout.write(parser.version) sys.stdout.write(parser.version)

View File

@ -3,7 +3,7 @@ import itertools
import logging import logging
import sys import sys
import time import time
from typing import IO, Generator from typing import IO, Generator, Optional
from pip._internal.utils.compat import WINDOWS from pip._internal.utils.compat import WINDOWS
from pip._internal.utils.logging import get_indentation from pip._internal.utils.logging import get_indentation
@ -23,7 +23,7 @@ class InteractiveSpinner(SpinnerInterface):
def __init__( def __init__(
self, self,
message: str, message: str,
file: IO[str] = None, file: Optional[IO[str]] = None,
spin_chars: str = "-\\|/", spin_chars: str = "-\\|/",
# Empirically, 8 updates/second looks nice # Empirically, 8 updates/second looks nice
min_update_interval_seconds: float = 0.125, min_update_interval_seconds: float = 0.125,

View File

@ -228,9 +228,15 @@ class ConfigurationCommand(Command):
fname = self.configuration.get_file_to_edit() fname = self.configuration.get_file_to_edit()
if fname is None: if fname is None:
raise PipError("Could not determine appropriate file.") 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: try:
subprocess.check_call([editor, fname]) subprocess.check_call(f'{editor} "{fname}"', shell=True)
except FileNotFoundError as e: except FileNotFoundError as e:
if not e.filename: if not e.filename:
e.filename = editor e.filename = editor

View File

@ -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.req_command import RequirementCommand, with_cleanup
from pip._internal.cli.status_codes import SUCCESS from pip._internal.cli.status_codes import SUCCESS
from pip._internal.operations.build.build_tracker import get_build_tracker 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.misc import ensure_dir, normalize_path, write_output
from pip._internal.utils.temp_dir import TempDirectory from pip._internal.utils.temp_dir import TempDirectory
@ -105,6 +109,9 @@ class DownloadCommand(RequirementCommand):
) )
reqs = self.get_requirements(args, options, finder, session) reqs = self.get_requirements(args, options, finder, session)
check_legacy_setup_py_options(
options, reqs, LegacySetupPyOptionsCheckMode.DOWNLOAD
)
preparer = self.make_requirement_preparer( preparer = self.make_requirement_preparer(
temp_build_dir=directory, temp_build_dir=directory,

View File

@ -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.build.build_tracker import get_build_tracker
from pip._internal.operations.check import ConflictDetails, check_install_conflicts from pip._internal.operations.check import ConflictDetails, check_install_conflicts
from pip._internal.req import install_given_reqs 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.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.distutils_args import parse_distutils_args
from pip._internal.utils.filesystem import test_writable_dir from pip._internal.utils.filesystem import test_writable_dir
from pip._internal.utils.logging import getLogger from pip._internal.utils.logging import getLogger
@ -44,7 +52,7 @@ from pip._internal.utils.virtualenv import (
virtualenv_no_global, virtualenv_no_global,
) )
from pip._internal.wheel_builder import ( from pip._internal.wheel_builder import (
BinaryAllowedPredicate, BdistWheelAllowedPredicate,
build, build,
should_build_for_install_command, should_build_for_install_command,
) )
@ -52,7 +60,9 @@ from pip._internal.wheel_builder import (
logger = getLogger(__name__) 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: def check_binary_allowed(req: InstallRequirement) -> bool:
canonical_name = canonicalize_name(req.name or "") canonical_name = canonicalize_name(req.name or "")
allowed_formats = format_control.get_allowed_formats(canonical_name) allowed_formats = format_control.get_allowed_formats(canonical_name)
@ -263,7 +273,9 @@ class InstallCommand(RequirementCommand):
"the provided requirements. " "the provided requirements. "
"Can be used in combination with --dry-run and --ignore-installed " "Can be used in combination with --dry-run and --ignore-installed "
"to 'resolve' the requirements. " "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: if options.use_user_site and options.target_dir is not None:
raise CommandError("Can not combine '--user' and '--target'") raise CommandError("Can not combine '--user' and '--target'")
cmdoptions.check_install_build_global(options)
upgrade_strategy = "to-satisfy-only" upgrade_strategy = "to-satisfy-only"
if options.upgrade: if options.upgrade:
upgrade_strategy = options.upgrade_strategy upgrade_strategy = options.upgrade_strategy
@ -321,8 +332,6 @@ class InstallCommand(RequirementCommand):
target_python=target_python, target_python=target_python,
ignore_requires_python=options.ignore_requires_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()) build_tracker = self.enter_context(get_build_tracker())
directory = TempDirectory( directory = TempDirectory(
@ -333,6 +342,28 @@ class InstallCommand(RequirementCommand):
try: try:
reqs = self.get_requirements(args, options, finder, session) 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. # Only when installing is it permitted to use PEP 660.
# In other circumstances (pip wheel, pip download) we generate # In other circumstances (pip wheel, pip download) we generate
@ -406,12 +437,14 @@ class InstallCommand(RequirementCommand):
modifying_pip = pip_req.satisfied_by is None modifying_pip = pip_req.satisfied_by is None
protect_pip_from_modification_on_windows(modifying_pip=modifying_pip) 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 = [ reqs_to_build = [
r r
for r in requirement_set.requirements.values() 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( _, build_failures = build(
@ -419,7 +452,7 @@ class InstallCommand(RequirementCommand):
wheel_cache=wheel_cache, wheel_cache=wheel_cache,
verify=True, verify=True,
build_options=[], build_options=[],
global_options=[], global_options=global_options,
) )
# If we're using PEP 517, we cannot do a legacy setup.py install # If we're using PEP 517, we cannot do a legacy setup.py install
@ -440,7 +473,7 @@ class InstallCommand(RequirementCommand):
# those. # those.
for r in build_failures: for r in build_failures:
if not r.use_pep517: if not r.use_pep517:
r.legacy_install_reason = 8368 r.legacy_install_reason = LegacyInstallReasonFailedBdistWheel
to_install = resolver.get_installation_order(requirement_set) to_install = resolver.get_installation_order(requirement_set)

View File

@ -155,6 +155,11 @@ class ListCommand(IndexGroupCommand):
if options.outdated and options.uptodate: if options.outdated and options.uptodate:
raise CommandError("Options --outdated and --uptodate cannot be combined.") 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) cmdoptions.check_list_path_option(options)
skip = set(stdlib_pkgs) skip = set(stdlib_pkgs)

View File

@ -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.cli.status_codes import SUCCESS
from pip._internal.exceptions import CommandError from pip._internal.exceptions import CommandError
from pip._internal.operations.build.build_tracker import get_build_tracker 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.misc import ensure_dir, normalize_path
from pip._internal.utils.temp_dir import TempDirectory from pip._internal.utils.temp_dir import TempDirectory
from pip._internal.wheel_builder import build, should_build_for_wheel_command from pip._internal.wheel_builder import build, should_build_for_wheel_command
@ -100,8 +105,6 @@ class WheelCommand(RequirementCommand):
@with_cleanup @with_cleanup
def run(self, options: Values, args: List[str]) -> int: def run(self, options: Values, args: List[str]) -> int:
cmdoptions.check_install_build_global(options)
session = self.get_default_session(options) session = self.get_default_session(options)
finder = self._build_package_finder(options, session) finder = self._build_package_finder(options, session)
@ -119,6 +122,28 @@ class WheelCommand(RequirementCommand):
) )
reqs = self.get_requirements(args, options, finder, session) 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( preparer = self.make_requirement_preparer(
temp_build_dir=directory, temp_build_dir=directory,

View File

@ -288,7 +288,10 @@ class NetworkConnectionError(PipError):
"""HTTP connection error""" """HTTP connection error"""
def __init__( 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: ) -> None:
""" """
Initialize NetworkConnectionError with `request` and `response` Initialize NetworkConnectionError with `request` and `response`
@ -332,8 +335,8 @@ class MetadataInconsistent(InstallationError):
"""Built metadata contains inconsistent information. """Built metadata contains inconsistent information.
This is raised when the metadata contains values (e.g. name and version) This is raised when the metadata contains values (e.g. name and version)
that do not match the information previously obtained from sdist filename that do not match the information previously obtained from sdist filename,
or user-supplied ``#egg=`` value. user-supplied ``#egg=`` value, or an install requirement name.
""" """
def __init__( def __init__(
@ -345,11 +348,10 @@ class MetadataInconsistent(InstallationError):
self.m_val = m_val self.m_val = m_val
def __str__(self) -> str: def __str__(self) -> str:
template = ( return (
"Requested {} has inconsistent {}: " f"Requested {self.ireq} has inconsistent {self.field}: "
"filename has {!r}, but metadata has {!r}" 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): class LegacyInstallFailure(DiagnosticPipError):

View File

@ -9,10 +9,8 @@ import itertools
import json import json
import logging import logging
import os import os
import re
import urllib.parse import urllib.parse
import urllib.request import urllib.request
import xml.etree.ElementTree
from html.parser import HTMLParser from html.parser import HTMLParser
from optparse import Values from optparse import Values
from typing import ( 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.session import PipSession
from pip._internal.network.utils import raise_for_status from pip._internal.network.utils import raise_for_status
from pip._internal.utils.filetypes import is_archive_file 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 pip._internal.vcs import vcs
from .sources import CandidatesFromPage, LinkSource, build_source from .sources import CandidatesFromPage, LinkSource, build_source
@ -51,7 +49,6 @@ else:
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
HTMLElement = xml.etree.ElementTree.Element
ResponseHeaders = MutableMapping[str, str] ResponseHeaders = MutableMapping[str, str]
@ -191,94 +188,6 @@ def _get_encoding_from_headers(headers: ResponseHeaders) -> Optional[str]:
return None 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: class CacheablePageContent:
def __init__(self, page: "IndexContent") -> None: def __init__(self, page: "IndexContent") -> None:
assert page.cache_link_parsing 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"): if content_type_l.startswith("application/vnd.pypi.simple.v1+json"):
data = json.loads(page.content) data = json.loads(page.content)
for file in data.get("files", []): for file in data.get("files", []):
file_url = file.get("url") link = Link.from_json(file, page.url)
if file_url is None: if link is None:
continue continue
yield link
# 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", {}),
)
return return
parser = HTMLLinkParser(page.url) parser = HTMLLinkParser(page.url)
@ -354,11 +248,7 @@ def parse_links(page: "IndexContent") -> Iterable[Link]:
url = page.url url = page.url
base_url = parser.base_url or url base_url = parser.base_url or url
for anchor in parser.anchors: for anchor in parser.anchors:
link = _create_link_from_element( link = Link.from_element(anchor, page_url=url, base_url=base_url)
anchor,
page_url=url,
base_url=base_url,
)
if link is None: if link is None:
continue continue
yield link yield link
@ -443,14 +333,7 @@ def _make_index_content(
) )
def _get_index_content( def _get_index_content(link: Link, *, session: PipSession) -> Optional["IndexContent"]:
link: Link, session: Optional[PipSession] = None
) -> Optional["IndexContent"]:
if session is None:
raise TypeError(
"_get_html_page() missing 1 required keyword argument: 'session'"
)
url = link.url.split("#", 1)[0] url = link.url.split("#", 1)[0]
# Check for VCS schemes that do not support lookup as web pages. # Check for VCS schemes that do not support lookup as web pages.
@ -559,6 +442,7 @@ class LinkCollector:
search_scope = SearchScope.create( search_scope = SearchScope.create(
find_links=find_links, find_links=find_links,
index_urls=index_urls, index_urls=index_urls,
no_index=options.no_index,
) )
link_collector = LinkCollector( link_collector = LinkCollector(
session=session, session=session,

View File

@ -35,10 +35,10 @@ logger = logging.getLogger(__name__)
def distutils_scheme( def distutils_scheme(
dist_name: str, dist_name: str,
user: bool = False, user: bool = False,
home: str = None, home: Optional[str] = None,
root: str = None, root: Optional[str] = None,
isolated: bool = False, isolated: bool = False,
prefix: str = None, prefix: Optional[str] = None,
*, *,
ignore_config_files: bool = False, ignore_config_files: bool = False,
) -> Dict[str, str]: ) -> Dict[str, str]:

View File

@ -103,3 +103,25 @@ def get_wheel_distribution(wheel: Wheel, canonical_name: str) -> BaseDistributio
:param canonical_name: Normalized project name of the given wheel. :param canonical_name: Normalized project name of the given wheel.
""" """
return select_backend().Distribution.from_wheel(wheel, canonical_name) 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,
)

View File

@ -113,6 +113,24 @@ class BaseDistribution(Protocol):
""" """
raise NotImplementedError() 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 @classmethod
def from_wheel(cls, wheel: "Wheel", name: str) -> "BaseDistribution": def from_wheel(cls, wheel: "Wheel", name: str) -> "BaseDistribution":
"""Load the distribution from a given wheel. """Load the distribution from a given wheel.

View File

@ -2,6 +2,15 @@ import importlib.metadata
from typing import Any, Optional, Protocol, cast 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): class BasePath(Protocol):
"""A protocol that various path objects conform. """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 The ``name`` attribute is only available in Python 3.10 or later. We are
targeting exactly that, but Mypy does not know this. 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

View File

@ -28,6 +28,7 @@ from pip._internal.metadata.base import (
) )
from pip._internal.utils.misc import normalize_path from pip._internal.utils.misc import normalize_path
from pip._internal.utils.packaging import safe_extra 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 pip._internal.utils.wheel import parse_wheel, read_wheel_metadata_file
from ._compat import BasePath, get_dist_name from ._compat import BasePath, get_dist_name
@ -109,6 +110,23 @@ class Distribution(BaseDistribution):
dist = importlib.metadata.Distribution.at(info_location) dist = importlib.metadata.Distribution.at(info_location)
return cls(dist, info_location, info_location.parent) 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 @classmethod
def from_wheel(cls, wheel: Wheel, name: str) -> BaseDistribution: def from_wheel(cls, wheel: Wheel, name: str) -> BaseDistribution:
try: try:

View File

@ -1,5 +1,6 @@
import functools import functools
import importlib.metadata import importlib.metadata
import logging
import os import os
import pathlib import pathlib
import sys import sys
@ -14,9 +15,11 @@ from pip._internal.models.wheel import Wheel
from pip._internal.utils.deprecation import deprecated from pip._internal.utils.deprecation import deprecated
from pip._internal.utils.filetypes import WHEEL_EXTENSION 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 from ._dists import Distribution
logger = logging.getLogger(__name__)
def _looks_like_wheel(location: str) -> bool: def _looks_like_wheel(location: str) -> bool:
if not location.endswith(WHEEL_EXTENSION): 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 # 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. # paths one by one, instead of dumping the list to importlib.metadata.
for dist in importlib.metadata.distributions(path=[location]): 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: if normalized_name in self._found_names:
continue continue
self._found_names.add(normalized_name) self._found_names.add(normalized_name)
info_location = get_info_location(dist)
yield dist, info_location yield dist, info_location
def find(self, location: str) -> Iterator[BaseDistribution]: def find(self, location: str) -> Iterator[BaseDistribution]:

View File

@ -33,7 +33,7 @@ class EntryPoint(NamedTuple):
group: str group: str
class WheelMetadata: class InMemoryMetadata:
"""IMetadataProvider that reads metadata files from a dictionary. """IMetadataProvider that reads metadata files from a dictionary.
This also maps metadata decoding exceptions to our internal exception type. 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) dist = dist_cls(base_dir, project_name=dist_name, metadata=metadata)
return cls(dist) 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 @classmethod
def from_wheel(cls, wheel: Wheel, name: str) -> BaseDistribution: def from_wheel(cls, wheel: Wheel, name: str) -> BaseDistribution:
try: try:
with wheel.as_zipfile() as zf: with wheel.as_zipfile() as zf:
info_dir, _ = parse_wheel(zf, name) info_dir, _ = parse_wheel(zf, name)
metadata_text = { metadata_dict = {
path.split("/", 1)[-1]: read_wheel_metadata_file(zf, path) path.split("/", 1)[-1]: read_wheel_metadata_file(zf, path)
for path in zf.namelist() for path in zf.namelist()
if path.startswith(f"{info_dir}/") if path.startswith(f"{info_dir}/")
@ -108,7 +125,7 @@ class Distribution(BaseDistribution):
raise UnsupportedWheel(f"{name} has an invalid wheel, {e}") raise UnsupportedWheel(f"{name} has an invalid wheel, {e}")
dist = pkg_resources.DistInfoDistribution( dist = pkg_resources.DistInfoDistribution(
location=wheel.location, location=wheel.location,
metadata=WheelMetadata(metadata_text, wheel.location), metadata=InMemoryMetadata(metadata_dict, wheel.location),
project_name=name, project_name=name,
) )
return cls(dist) return cls(dist)

View File

@ -1,11 +1,14 @@
import functools import functools
import itertools
import logging import logging
import os import os
import posixpath import posixpath
import re import re
import urllib.parse import urllib.parse
from dataclasses import dataclass
from typing import ( from typing import (
TYPE_CHECKING, TYPE_CHECKING,
Any,
Dict, Dict,
List, List,
Mapping, Mapping,
@ -18,6 +21,7 @@ from typing import (
from pip._internal.utils.filetypes import WHEEL_EXTENSION from pip._internal.utils.filetypes import WHEEL_EXTENSION
from pip._internal.utils.hashes import Hashes from pip._internal.utils.hashes import Hashes
from pip._internal.utils.misc import ( from pip._internal.utils.misc import (
pairwise,
redact_auth_from_url, redact_auth_from_url,
split_auth_from_netloc, split_auth_from_netloc,
splitext, splitext,
@ -36,6 +40,119 @@ logger = logging.getLogger(__name__)
_SUPPORTED_HASHES = ("sha512", "sha384", "sha256", "sha224", "sha1", "md5") _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): class Link(KeyBasedCompareMixin):
"""Represents a parsed link from a Package Index's simple URL""" """Represents a parsed link from a Package Index's simple URL"""
@ -46,6 +163,8 @@ class Link(KeyBasedCompareMixin):
"comes_from", "comes_from",
"requires_python", "requires_python",
"yanked_reason", "yanked_reason",
"dist_info_metadata",
"link_hash",
"cache_link_parsing", "cache_link_parsing",
] ]
@ -55,6 +174,8 @@ class Link(KeyBasedCompareMixin):
comes_from: Optional[Union[str, "IndexContent"]] = None, comes_from: Optional[Union[str, "IndexContent"]] = None,
requires_python: Optional[str] = None, requires_python: Optional[str] = None,
yanked_reason: Optional[str] = None, yanked_reason: Optional[str] = None,
dist_info_metadata: Optional[str] = None,
link_hash: Optional[LinkHash] = None,
cache_link_parsing: bool = True, cache_link_parsing: bool = True,
hashes: Optional[Mapping[str, str]] = None, hashes: Optional[Mapping[str, str]] = None,
) -> None: ) -> None:
@ -72,6 +193,14 @@ class Link(KeyBasedCompareMixin):
a simple repository HTML link. If the file has been yanked but a simple repository HTML link. If the file has been yanked but
no reason was provided, this should be the empty string. See no reason was provided, this should be the empty string. See
PEP 592 for more information and the specification. 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 :param cache_link_parsing: A flag that is used elsewhere to determine
whether resources retrieved from this link whether resources retrieved from this link
should be cached. PyPI index urls should should be cached. PyPI index urls should
@ -94,11 +223,75 @@ class Link(KeyBasedCompareMixin):
self.comes_from = comes_from self.comes_from = comes_from
self.requires_python = requires_python if requires_python else None self.requires_python = requires_python if requires_python else None
self.yanked_reason = yanked_reason 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) super().__init__(key=url, defining_class=Link)
self.cache_link_parsing = cache_link_parsing 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: def __str__(self) -> str:
if self.requires_python: if self.requires_python:
rp = f" (requires-python:{self.requires_python})" rp = f" (requires-python:{self.requires_python})"
@ -181,32 +374,36 @@ class Link(KeyBasedCompareMixin):
return None return None
return match.group(1) return match.group(1)
_hash_re = re.compile( def metadata_link(self) -> Optional["Link"]:
r"({choices})=([a-f0-9]+)".format(choices="|".join(_SUPPORTED_HASHES)) """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 @property
def hash(self) -> Optional[str]: def hash(self) -> Optional[str]:
for hashname in _SUPPORTED_HASHES: if self.link_hash is not None:
if hashname in self._hashes: return self.link_hash.value
return self._hashes[hashname]
match = self._hash_re.search(self._url)
if match:
return match.group(2)
return None return None
@property @property
def hash_name(self) -> Optional[str]: def hash_name(self) -> Optional[str]:
for hashname in _SUPPORTED_HASHES: if self.link_hash is not None:
if hashname in self._hashes: return self.link_hash.name
return hashname
match = self._hash_re.search(self._url)
if match:
return match.group(1)
return None return None
@property @property
@ -236,19 +433,15 @@ class Link(KeyBasedCompareMixin):
@property @property
def has_hash(self) -> bool: 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: 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 return False
# Assert non-None so mypy knows self.hash_name and self.hash are str. return self.link_hash.is_hash_allowed(hashes)
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)
class _CleanResult(NamedTuple): class _CleanResult(NamedTuple):

View File

@ -20,13 +20,14 @@ class SearchScope:
Encapsulates the locations that pip is configured to search. Encapsulates the locations that pip is configured to search.
""" """
__slots__ = ["find_links", "index_urls"] __slots__ = ["find_links", "index_urls", "no_index"]
@classmethod @classmethod
def create( def create(
cls, cls,
find_links: List[str], find_links: List[str],
index_urls: List[str], index_urls: List[str],
no_index: bool,
) -> "SearchScope": ) -> "SearchScope":
""" """
Create a SearchScope object after normalizing the `find_links`. Create a SearchScope object after normalizing the `find_links`.
@ -60,15 +61,18 @@ class SearchScope:
return cls( return cls(
find_links=built_find_links, find_links=built_find_links,
index_urls=index_urls, index_urls=index_urls,
no_index=no_index,
) )
def __init__( def __init__(
self, self,
find_links: List[str], find_links: List[str],
index_urls: List[str], index_urls: List[str],
no_index: bool,
) -> None: ) -> None:
self.find_links = find_links self.find_links = find_links
self.index_urls = index_urls self.index_urls = index_urls
self.no_index = no_index
def get_formatted_locations(self) -> str: def get_formatted_locations(self) -> str:
lines = [] lines = []

View File

@ -13,8 +13,8 @@ class Wheel:
"""A wheel file""" """A wheel file"""
wheel_file_re = re.compile( wheel_file_re = re.compile(
r"""^(?P<namever>(?P<name>.+?)-(?P<ver>.*?)) r"""^(?P<namever>(?P<name>[^\s-]+?)-(?P<ver>[^\s-]*?))
((-(?P<build>\d[^-]*?))?-(?P<pyver>.+?)-(?P<abi>.+?)-(?P<plat>.+?) ((-(?P<build>\d[^-]*?))?-(?P<pyver>[^\s-]+?)-(?P<abi>[^\s-]+?)-(?P<plat>[^\s-]+?)
\.whl|\.dist-info)$""", \.whl|\.dist-info)$""",
re.VERBOSE, re.VERBOSE,
) )

View File

@ -23,7 +23,7 @@ class HTTPRangeRequestUnsupported(Exception):
def dist_from_wheel_url(name: str, url: str, session: PipSession) -> BaseDistribution: def dist_from_wheel_url(name: str, url: str, session: PipSession) -> BaseDistribution:
"""Return a distribution object from the given wheel URL. """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. containing metadata, just enough for the object to be constructed.
If such requests are not supported, HTTPRangeRequestUnsupported If such requests are not supported, HTTPRangeRequestUnsupported
is raised. is raised.

View File

@ -420,7 +420,9 @@ def _raise_for_invalid_entrypoint(specification: str) -> None:
class PipScriptMaker(ScriptMaker): 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) _raise_for_invalid_entrypoint(specification)
return super().make(specification, options) return super().make(specification, options)

View File

@ -19,12 +19,13 @@ from pip._internal.exceptions import (
HashMismatch, HashMismatch,
HashUnpinned, HashUnpinned,
InstallationError, InstallationError,
MetadataInconsistent,
NetworkConnectionError, NetworkConnectionError,
PreviousBuildDirError, PreviousBuildDirError,
VcsHashUnsupported, VcsHashUnsupported,
) )
from pip._internal.index.package_finder import PackageFinder 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.direct_url import ArchiveInfo
from pip._internal.models.link import Link from pip._internal.models.link import Link
from pip._internal.models.wheel import Wheel from pip._internal.models.wheel import Wheel
@ -346,19 +347,72 @@ class RequirementPreparer:
# showing the user what the hash should be. # showing the user what the hash should be.
return req.hashes(trust_internet=False) or MissingHashes() 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( def _fetch_metadata_using_lazy_wheel(
self, self,
link: Link, link: Link,
) -> Optional[BaseDistribution]: ) -> Optional[BaseDistribution]:
"""Fetch metadata using lazy wheel, if possible.""" """Fetch metadata using lazy wheel, if possible."""
# --use-feature=fast-deps must be provided.
if not self.use_lazy_wheel: if not self.use_lazy_wheel:
return None 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: if link.is_file or not link.is_wheel:
logger.debug( 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, link,
) )
return None return None
@ -414,13 +468,12 @@ class RequirementPreparer:
) -> BaseDistribution: ) -> BaseDistribution:
"""Prepare a requirement to be obtained from req.link.""" """Prepare a requirement to be obtained from req.link."""
assert req.link assert req.link
link = req.link
self._log_preparing_link(req) self._log_preparing_link(req)
with indent_log(): with indent_log():
# Check if the relevant file is already available # Check if the relevant file is already available
# in the download directory # in the download directory
file_path = None 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) hashes = self._get_linked_req_hashes(req)
file_path = _check_download_dir(req.link, self.download_dir, hashes) file_path = _check_download_dir(req.link, self.download_dir, hashes)
@ -429,10 +482,10 @@ class RequirementPreparer:
self._downloaded[req.link.url] = file_path self._downloaded[req.link.url] = file_path
else: else:
# The file is not available, attempt to fetch only metadata # The file is not available, attempt to fetch only metadata
wheel_dist = self._fetch_metadata_using_lazy_wheel(link) metadata_dist = self._fetch_metadata_only(req)
if wheel_dist is not None: if metadata_dist is not None:
req.needs_more_preparation = True req.needs_more_preparation = True
return wheel_dist return metadata_dist
# None of the optimizations worked, fully prepare the requirement # None of the optimizations worked, fully prepare the requirement
return self._prepare_linked_requirement(req, parallel_builds) return self._prepare_linked_requirement(req, parallel_builds)

View File

@ -186,10 +186,6 @@ def handle_requirement_line(
constraint=line.constraint, constraint=line.constraint,
) )
else: 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 # get the options that apply to requirements
req_options = {} req_options = {}
for dest in SUPPORTED_OPTIONS_REQ_DEST: for dest in SUPPORTED_OPTIONS_REQ_DEST:
@ -229,11 +225,13 @@ def handle_option_line(
if finder: if finder:
find_links = finder.find_links find_links = finder.find_links
index_urls = finder.index_urls index_urls = finder.index_urls
if opts.index_url: no_index = finder.search_scope.no_index
index_urls = [opts.index_url]
if opts.no_index is True: if opts.no_index is True:
no_index = True
index_urls = [] 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) index_urls.extend(opts.extra_index_urls)
if opts.find_links: if opts.find_links:
# FIXME: it would be nice to keep track of the source # FIXME: it would be nice to keep track of the source
@ -253,6 +251,7 @@ def handle_option_line(
search_scope = SearchScope( search_scope = SearchScope(
find_links=find_links, find_links=find_links,
index_urls=index_urls, index_urls=index_urls,
no_index=no_index,
) )
finder.search_scope = search_scope 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) 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 return args_str, opts

View File

@ -8,6 +8,8 @@ import shutil
import sys import sys
import uuid import uuid
import zipfile import zipfile
from enum import Enum
from optparse import Values
from typing import Any, Collection, Dict, Iterable, List, Optional, Sequence, Union from typing import Any, Collection, Dict, Iterable, List, Optional, Sequence, Union
from pip._vendor.packaging.markers import Marker 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.operations.install.wheel import install_wheel
from pip._internal.pyproject import load_pyproject_toml, make_pyproject_path from pip._internal.pyproject import load_pyproject_toml, make_pyproject_path
from pip._internal.req.req_uninstall import UninstallPathSet 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 ( from pip._internal.utils.direct_url_helpers import (
direct_url_for_editable, direct_url_for_editable,
direct_url_from_link, direct_url_from_link,
@ -96,7 +98,7 @@ class InstallRequirement:
self.constraint = constraint self.constraint = constraint
self.editable = editable self.editable = editable
self.permit_editable_wheels = permit_editable_wheels 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 # source_dir is the local directory where the linked requirement is
# located, or unpacked. In case unpacking is needed, creating and # located, or unpacked. In case unpacking is needed, creating and
@ -811,6 +813,11 @@ class InstallRequirement:
install_options = list(install_options) + self.install_options install_options = list(install_options) + self.install_options
try: 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( success = install_legacy(
install_options=install_options, install_options=install_options,
global_options=global_options, global_options=global_options,
@ -836,18 +843,12 @@ class InstallRequirement:
self.install_succeeded = success self.install_succeeded = success
if success and self.legacy_install_reason == 8368: if (
deprecated( success
reason=( and self.legacy_install_reason is not None
"{} was installed using the legacy 'setup.py install' " and self.legacy_install_reason.emit_after_success
"method, because a wheel could not be built for it.".format( ):
self.name self.legacy_install_reason.emit_deprecation(self.name)
)
),
replacement="to fix the wheel build issue reported above",
gone_in=None,
issue=8368,
)
def check_invalid_constraint_type(req: InstallRequirement) -> str: def check_invalid_constraint_type(req: InstallRequirement) -> str:
@ -877,3 +878,65 @@ def check_invalid_constraint_type(req: InstallRequirement) -> str:
) )
return problem 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",
)

View File

@ -118,3 +118,71 @@ def deprecated(
raise PipDeprecationWarning(message) raise PipDeprecationWarning(message)
warnings.warn(message, category=PipDeprecationWarning, stacklevel=2) 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,
)

View File

@ -55,9 +55,14 @@ def get_best_invocation_for_this_pip() -> str:
if exe_are_in_PATH: if exe_are_in_PATH:
for exe_name in _EXECUTABLE_NAMES: for exe_name in _EXECUTABLE_NAMES:
found_executable = shutil.which(exe_name) found_executable = shutil.which(exe_name)
if found_executable and os.path.samefile( binary_executable = os.path.join(binary_prefix, exe_name)
if (
found_executable
and os.path.exists(binary_executable)
and os.path.samefile(
found_executable, found_executable,
os.path.join(binary_prefix, exe_name), binary_executable,
)
): ):
return exe_name return exe_name

View File

@ -1,5 +1,5 @@
import hashlib 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.exceptions import HashMismatch, HashMissing, InstallationError
from pip._internal.utils.misc import read_chunks 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 :param hashes: A dict of algorithm names pointing to lists of allowed
hex digests hex digests

View File

@ -48,7 +48,7 @@ _SETUPTOOLS_SHIM = textwrap.dedent(
def make_setuptools_shim_args( def make_setuptools_shim_args(
setup_py_path: str, setup_py_path: str,
global_options: Sequence[str] = None, global_options: Optional[Sequence[str]] = None,
no_user_config: bool = False, no_user_config: bool = False,
unbuffered_output: bool = False, unbuffered_output: bool = False,
) -> List[str]: ) -> List[str]:

View File

@ -49,14 +49,25 @@ class Bazaar(VersionControl):
flag = "" flag = ""
else: else:
flag = f"-{'v'*verbosity}" 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) self.run_command(cmd_args)
def switch(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None: def switch(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None:
self.run_command(make_command("switch", url), cwd=dest) self.run_command(make_command("switch", url), cwd=dest)
def update(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None: 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) self.run_command(cmd_args, cwd=dest)
@classmethod @classmethod

View File

@ -184,7 +184,7 @@ class Subversion(VersionControl):
"""Always assume the versions don't match""" """Always assume the versions don't match"""
return False return False
def __init__(self, use_interactive: bool = None) -> None: def __init__(self, use_interactive: Optional[bool] = None) -> None:
if use_interactive is None: if use_interactive is None:
use_interactive = is_console_interactive() use_interactive = is_console_interactive()
self.use_interactive = use_interactive self.use_interactive = use_interactive

View File

@ -5,7 +5,7 @@ import logging
import os.path import os.path
import re import re
import shutil 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.utils import canonicalize_name, canonicalize_version
from pip._vendor.packaging.version import InvalidVersion, 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_editable import build_wheel_editable
from pip._internal.operations.build.wheel_legacy import build_wheel_legacy from pip._internal.operations.build.wheel_legacy import build_wheel_legacy
from pip._internal.req.req_install import InstallRequirement 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.logging import indent_log
from pip._internal.utils.misc import ensure_dir, hash_file, is_wheel_installed from pip._internal.utils.misc import ensure_dir, hash_file, is_wheel_installed
from pip._internal.utils.setuptools_build import make_setuptools_clean_args 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) _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]] BuildResult = Tuple[List[InstallRequirement], List[InstallRequirement]]
@ -46,7 +50,7 @@ def _contains_egg_info(s: str) -> bool:
def _should_build( def _should_build(
req: InstallRequirement, req: InstallRequirement,
need_wheel: bool, need_wheel: bool,
check_binary_allowed: BinaryAllowedPredicate, check_bdist_wheel: Optional[BdistWheelAllowedPredicate] = None,
) -> bool: ) -> bool:
"""Return whether an InstallRequirement should be built into a wheel.""" """Return whether an InstallRequirement should be built into a wheel."""
if req.constraint: if req.constraint:
@ -77,20 +81,19 @@ def _should_build(
if req.use_pep517: if req.use_pep517:
return True return True
if not check_binary_allowed(req): assert check_bdist_wheel is not None
logger.info( if not check_bdist_wheel(req):
"Skipping wheel build for %s, due to binaries being disabled for it.", # /!\ When we change this to unconditionally return True, we must also remove
req.name, # 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 return False
if not is_wheel_installed(): if not is_wheel_installed():
# we don't build legacy requirements if wheel is not installed # we don't build legacy requirements if wheel is not installed
logger.info( req.legacy_install_reason = LegacyInstallReasonMissingWheelPackage
"Using legacy 'setup.py install' for %s, "
"since package 'wheel' is not installed.",
req.name,
)
return False return False
return True return True
@ -99,15 +102,15 @@ def _should_build(
def should_build_for_wheel_command( def should_build_for_wheel_command(
req: InstallRequirement, req: InstallRequirement,
) -> bool: ) -> 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( def should_build_for_install_command(
req: InstallRequirement, req: InstallRequirement,
check_binary_allowed: BinaryAllowedPredicate, check_bdist_wheel_allowed: BdistWheelAllowedPredicate,
) -> bool: ) -> bool:
return _should_build( 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 return cache_dir
def _always_true(_: Any) -> bool:
return True
def _verify_one(req: InstallRequirement, wheel_path: str) -> None: def _verify_one(req: InstallRequirement, wheel_path: str) -> None:
canonical_name = canonicalize_name(req.name or "") canonical_name = canonicalize_name(req.name or "")
w = Wheel(os.path.basename(wheel_path)) w = Wheel(os.path.basename(wheel_path))

View File

@ -1,4 +1,4 @@
from .core import contents, where from .core import contents, where
__all__ = ["contents", "where"] __all__ = ["contents", "where"]
__version__ = "2022.06.15" __version__ = "2022.09.24"

View File

@ -1323,45 +1323,6 @@ t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy
SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
-----END CERTIFICATE----- -----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 # Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967
# Subject: 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" # Label: "Actalis Authentication Root CA"
@ -4683,3 +4644,65 @@ ADBmAjEA5gVYaWHlLcoNy/EZCL3W/VGSGn5jVASQkZo1kTmZ+gepZpO6yGjUij/6
7W4WAie3AjEA3VoXK3YdZUKWpqxdinlW2Iob35reX8dQj7FbcQwm32pAAOwzkSFx 7W4WAie3AjEA3VoXK3YdZUKWpqxdinlW2Iob35reX8dQj7FbcQwm32pAAOwzkSFx
vmjkI6TZraE3 vmjkI6TZraE3
-----END CERTIFICATE----- -----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-----

View File

@ -4,26 +4,12 @@ certifi.py
This module returns the installation location of cacert.pem or its contents. This module returns the installation location of cacert.pem or its contents.
""" """
import os import sys
import types
from typing import Union
class _PipPatchedCertificate(Exception): if sys.version_info >= (3, 11):
pass
from importlib.resources import as_file, files
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
_CACERT_CTX = None _CACERT_CTX = None
_CACERT_PATH = None _CACERT_PATH = None
@ -47,15 +33,54 @@ try:
# We also have to hold onto the actual context manager, because # We also have to hold onto the actual context manager, because
# it will do the cleanup whenever it gets garbage collected, so # it will do the cleanup whenever it gets garbage collected, so
# we will also store that at the global level as well. # 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_CTX = get_path("pip._vendor.certifi", "cacert.pem")
_CACERT_PATH = str(_CACERT_CTX.__enter__()) _CACERT_PATH = str(_CACERT_CTX.__enter__())
return _CACERT_PATH return _CACERT_PATH
except _PipPatchedCertificate: def contents() -> str:
pass 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] Package = Union[types.ModuleType, str]
Resource = Union[str, "os.PathLike"] Resource = Union[str, "os.PathLike"]
@ -79,6 +104,5 @@ except ImportError:
return os.path.join(f, "cacert.pem") return os.path.join(f, "cacert.pem")
def contents() -> str:
def contents() -> str: return read_text("pip._vendor.certifi", "cacert.pem", encoding="ascii")
return read_text("certifi", "cacert.pem", encoding="ascii")

View File

@ -1,12 +1,12 @@
# -*- coding: utf-8 -*- # -*- 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. # Licensed to the Python Software Foundation under a contributor agreement.
# See LICENSE.txt and CONTRIBUTORS.txt. # See LICENSE.txt and CONTRIBUTORS.txt.
# #
import logging import logging
__version__ = '0.3.5' __version__ = '0.3.6'
class DistlibException(Exception): class DistlibException(Exception):
pass pass

View File

@ -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: 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)): if isinstance(s, (bytes, bytearray)):
try:
s = s.decode('ascii') s = s.decode('ascii')
except UnicodeDecodeError:
raise IDNAError('should pass a unicode string to the function rather than a byte string.')
if uts46: if uts46:
s = uts46_remap(s, std3_rules, transitional) s = uts46_remap(s, std3_rules, transitional)
trailing_dot = False trailing_dot = False

View File

@ -1,6 +1,6 @@
# This file is automatically generated by tools/idna-data # This file is automatically generated by tools/idna-data
__version__ = '14.0.0' __version__ = '15.0.0'
scripts = { scripts = {
'Greek': ( 'Greek': (
0x37000000374, 0x37000000374,
@ -55,12 +55,13 @@ scripts = {
0x16fe200016fe4, 0x16fe200016fe4,
0x16ff000016ff2, 0x16ff000016ff2,
0x200000002a6e0, 0x200000002a6e0,
0x2a7000002b739, 0x2a7000002b73a,
0x2b7400002b81e, 0x2b7400002b81e,
0x2b8200002cea2, 0x2b8200002cea2,
0x2ceb00002ebe1, 0x2ceb00002ebe1,
0x2f8000002fa1e, 0x2f8000002fa1e,
0x300000003134b, 0x300000003134b,
0x31350000323b0,
), ),
'Hebrew': ( 'Hebrew': (
0x591000005c8, 0x591000005c8,
@ -77,6 +78,7 @@ scripts = {
0x304100003097, 0x304100003097,
0x309d000030a0, 0x309d000030a0,
0x1b0010001b120, 0x1b0010001b120,
0x1b1320001b133,
0x1b1500001b153, 0x1b1500001b153,
0x1f2000001f201, 0x1f2000001f201,
), ),
@ -93,6 +95,7 @@ scripts = {
0x1affd0001afff, 0x1affd0001afff,
0x1b0000001b001, 0x1b0000001b001,
0x1b1200001b123, 0x1b1200001b123,
0x1b1550001b156,
0x1b1640001b168, 0x1b1640001b168,
), ),
} }
@ -1331,7 +1334,7 @@ codepoint_classes = {
0xcdd00000cdf, 0xcdd00000cdf,
0xce000000ce4, 0xce000000ce4,
0xce600000cf0, 0xce600000cf0,
0xcf100000cf3, 0xcf100000cf4,
0xd0000000d0d, 0xd0000000d0d,
0xd0e00000d11, 0xd0e00000d11,
0xd1200000d45, 0xd1200000d45,
@ -1366,7 +1369,7 @@ codepoint_classes = {
0xeb400000ebe, 0xeb400000ebe,
0xec000000ec5, 0xec000000ec5,
0xec600000ec7, 0xec600000ec7,
0xec800000ece, 0xec800000ecf,
0xed000000eda, 0xed000000eda,
0xede00000ee0, 0xede00000ee0,
0xf0000000f01, 0xf0000000f01,
@ -1859,7 +1862,7 @@ codepoint_classes = {
0xab200000ab27, 0xab200000ab27,
0xab280000ab2f, 0xab280000ab2f,
0xab300000ab5b, 0xab300000ab5b,
0xab600000ab6a, 0xab600000ab69,
0xabc00000abeb, 0xabc00000abeb,
0xabec0000abee, 0xabec0000abee,
0xabf00000abfa, 0xabf00000abfa,
@ -1943,7 +1946,7 @@ codepoint_classes = {
0x10e8000010eaa, 0x10e8000010eaa,
0x10eab00010ead, 0x10eab00010ead,
0x10eb000010eb2, 0x10eb000010eb2,
0x10f0000010f1d, 0x10efd00010f1d,
0x10f2700010f28, 0x10f2700010f28,
0x10f3000010f51, 0x10f3000010f51,
0x10f7000010f86, 0x10f7000010f86,
@ -1966,7 +1969,7 @@ codepoint_classes = {
0x111dc000111dd, 0x111dc000111dd,
0x1120000011212, 0x1120000011212,
0x1121300011238, 0x1121300011238,
0x1123e0001123f, 0x1123e00011242,
0x1128000011287, 0x1128000011287,
0x1128800011289, 0x1128800011289,
0x1128a0001128e, 0x1128a0001128e,
@ -2047,11 +2050,16 @@ codepoint_classes = {
0x11d9300011d99, 0x11d9300011d99,
0x11da000011daa, 0x11da000011daa,
0x11ee000011ef7, 0x11ee000011ef7,
0x11f0000011f11,
0x11f1200011f3b,
0x11f3e00011f43,
0x11f5000011f5a,
0x11fb000011fb1, 0x11fb000011fb1,
0x120000001239a, 0x120000001239a,
0x1248000012544, 0x1248000012544,
0x12f9000012ff1, 0x12f9000012ff1,
0x130000001342f, 0x1300000013430,
0x1344000013456,
0x1440000014647, 0x1440000014647,
0x1680000016a39, 0x1680000016a39,
0x16a4000016a5f, 0x16a4000016a5f,
@ -2079,7 +2087,9 @@ codepoint_classes = {
0x1aff50001affc, 0x1aff50001affc,
0x1affd0001afff, 0x1affd0001afff,
0x1b0000001b123, 0x1b0000001b123,
0x1b1320001b133,
0x1b1500001b153, 0x1b1500001b153,
0x1b1550001b156,
0x1b1640001b168, 0x1b1640001b168,
0x1b1700001b2fc, 0x1b1700001b2fc,
0x1bc000001bc6b, 0x1bc000001bc6b,
@ -2096,17 +2106,21 @@ codepoint_classes = {
0x1da9b0001daa0, 0x1da9b0001daa0,
0x1daa10001dab0, 0x1daa10001dab0,
0x1df000001df1f, 0x1df000001df1f,
0x1df250001df2b,
0x1e0000001e007, 0x1e0000001e007,
0x1e0080001e019, 0x1e0080001e019,
0x1e01b0001e022, 0x1e01b0001e022,
0x1e0230001e025, 0x1e0230001e025,
0x1e0260001e02b, 0x1e0260001e02b,
0x1e0300001e06e,
0x1e08f0001e090,
0x1e1000001e12d, 0x1e1000001e12d,
0x1e1300001e13e, 0x1e1300001e13e,
0x1e1400001e14a, 0x1e1400001e14a,
0x1e14e0001e14f, 0x1e14e0001e14f,
0x1e2900001e2af, 0x1e2900001e2af,
0x1e2c00001e2fa, 0x1e2c00001e2fa,
0x1e4d00001e4fa,
0x1e7e00001e7e7, 0x1e7e00001e7e7,
0x1e7e80001e7ec, 0x1e7e80001e7ec,
0x1e7ed0001e7ef, 0x1e7ed0001e7ef,
@ -2115,13 +2129,13 @@ codepoint_classes = {
0x1e8d00001e8d7, 0x1e8d00001e8d7,
0x1e9220001e94c, 0x1e9220001e94c,
0x1e9500001e95a, 0x1e9500001e95a,
0x1fbf00001fbfa,
0x200000002a6e0, 0x200000002a6e0,
0x2a7000002b739, 0x2a7000002b73a,
0x2b7400002b81e, 0x2b7400002b81e,
0x2b8200002cea2, 0x2b8200002cea2,
0x2ceb00002ebe1, 0x2ceb00002ebe1,
0x300000003134b, 0x300000003134b,
0x31350000323b0,
), ),
'CONTEXTJ': ( 'CONTEXTJ': (
0x200c0000200e, 0x200c0000200e,

View File

@ -1,2 +1,2 @@
__version__ = '3.3' __version__ = '3.4'

View File

@ -7,7 +7,7 @@ from typing import List, Tuple, Union
"""IDNA Mapping Table from UTS46.""" """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]]]: def _seg_0() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [ return [
(0x0, '3'), (0x0, '3'),
@ -1300,7 +1300,7 @@ def _seg_12() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0xCE6, 'V'), (0xCE6, 'V'),
(0xCF0, 'X'), (0xCF0, 'X'),
(0xCF1, 'V'), (0xCF1, 'V'),
(0xCF3, 'X'), (0xCF4, 'X'),
(0xD00, 'V'), (0xD00, 'V'),
(0xD0D, 'X'), (0xD0D, 'X'),
(0xD0E, 'V'), (0xD0E, 'V'),
@ -1368,7 +1368,7 @@ def _seg_13() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0xEC6, 'V'), (0xEC6, 'V'),
(0xEC7, 'X'), (0xEC7, 'X'),
(0xEC8, 'V'), (0xEC8, 'V'),
(0xECE, 'X'), (0xECF, 'X'),
(0xED0, 'V'), (0xED0, 'V'),
(0xEDA, 'X'), (0xEDA, 'X'),
(0xEDC, 'M', 'ຫນ'), (0xEDC, 'M', 'ຫນ'),
@ -5917,7 +5917,7 @@ def _seg_56() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x10EAE, 'X'), (0x10EAE, 'X'),
(0x10EB0, 'V'), (0x10EB0, 'V'),
(0x10EB2, 'X'), (0x10EB2, 'X'),
(0x10F00, 'V'), (0x10EFD, 'V'),
(0x10F28, 'X'), (0x10F28, 'X'),
(0x10F30, 'V'), (0x10F30, 'V'),
(0x10F5A, 'X'), (0x10F5A, 'X'),
@ -5956,7 +5956,7 @@ def _seg_57() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x11200, 'V'), (0x11200, 'V'),
(0x11212, 'X'), (0x11212, 'X'),
(0x11213, 'V'), (0x11213, 'V'),
(0x1123F, 'X'), (0x11242, 'X'),
(0x11280, 'V'), (0x11280, 'V'),
(0x11287, 'X'), (0x11287, 'X'),
(0x11288, 'V'), (0x11288, 'V'),
@ -6097,6 +6097,8 @@ def _seg_58() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x11AA3, 'X'), (0x11AA3, 'X'),
(0x11AB0, 'V'), (0x11AB0, 'V'),
(0x11AF9, 'X'), (0x11AF9, 'X'),
(0x11B00, 'V'),
(0x11B0A, 'X'),
(0x11C00, 'V'), (0x11C00, 'V'),
(0x11C09, 'X'), (0x11C09, 'X'),
(0x11C0A, 'V'), (0x11C0A, 'V'),
@ -6139,13 +6141,19 @@ def _seg_58() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x11DAA, 'X'), (0x11DAA, 'X'),
(0x11EE0, 'V'), (0x11EE0, 'V'),
(0x11EF9, 'X'), (0x11EF9, 'X'),
(0x11FB0, 'V'), (0x11F00, 'V'),
(0x11FB1, 'X'),
(0x11FC0, 'V'),
] ]
def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [ return [
(0x11F11, 'X'),
(0x11F12, 'V'),
(0x11F3B, 'X'),
(0x11F3E, 'V'),
(0x11F5A, 'X'),
(0x11FB0, 'V'),
(0x11FB1, 'X'),
(0x11FC0, 'V'),
(0x11FF2, 'X'), (0x11FF2, 'X'),
(0x11FFF, 'V'), (0x11FFF, 'V'),
(0x1239A, 'X'), (0x1239A, 'X'),
@ -6158,7 +6166,9 @@ def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x12F90, 'V'), (0x12F90, 'V'),
(0x12FF3, 'X'), (0x12FF3, 'X'),
(0x13000, 'V'), (0x13000, 'V'),
(0x1342F, 'X'), (0x13430, 'X'),
(0x13440, 'V'),
(0x13456, 'X'),
(0x14400, 'V'), (0x14400, 'V'),
(0x14647, 'X'), (0x14647, 'X'),
(0x16800, 'V'), (0x16800, 'V'),
@ -6236,6 +6246,10 @@ def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x18D00, 'V'), (0x18D00, 'V'),
(0x18D09, 'X'), (0x18D09, 'X'),
(0x1AFF0, 'V'), (0x1AFF0, 'V'),
]
def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x1AFF4, 'X'), (0x1AFF4, 'X'),
(0x1AFF5, 'V'), (0x1AFF5, 'V'),
(0x1AFFC, 'X'), (0x1AFFC, 'X'),
@ -6243,13 +6257,13 @@ def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1AFFF, 'X'), (0x1AFFF, 'X'),
(0x1B000, 'V'), (0x1B000, 'V'),
(0x1B123, 'X'), (0x1B123, 'X'),
(0x1B132, 'V'),
(0x1B133, 'X'),
(0x1B150, 'V'), (0x1B150, 'V'),
(0x1B153, 'X'), (0x1B153, 'X'),
(0x1B155, 'V'),
(0x1B156, 'X'),
(0x1B164, 'V'), (0x1B164, 'V'),
]
def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x1B168, 'X'), (0x1B168, 'X'),
(0x1B170, 'V'), (0x1B170, 'V'),
(0x1B2FC, 'X'), (0x1B2FC, 'X'),
@ -6295,6 +6309,8 @@ def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1D1EB, 'X'), (0x1D1EB, 'X'),
(0x1D200, 'V'), (0x1D200, 'V'),
(0x1D246, 'X'), (0x1D246, 'X'),
(0x1D2C0, 'V'),
(0x1D2D4, 'X'),
(0x1D2E0, 'V'), (0x1D2E0, 'V'),
(0x1D2F4, 'X'), (0x1D2F4, 'X'),
(0x1D300, 'V'), (0x1D300, 'V'),
@ -6334,6 +6350,10 @@ def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1D41E, 'M', 'e'), (0x1D41E, 'M', 'e'),
(0x1D41F, 'M', 'f'), (0x1D41F, 'M', 'f'),
(0x1D420, 'M', 'g'), (0x1D420, 'M', 'g'),
]
def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x1D421, 'M', 'h'), (0x1D421, 'M', 'h'),
(0x1D422, 'M', 'i'), (0x1D422, 'M', 'i'),
(0x1D423, 'M', 'j'), (0x1D423, 'M', 'j'),
@ -6350,10 +6370,6 @@ def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1D42E, 'M', 'u'), (0x1D42E, 'M', 'u'),
(0x1D42F, 'M', 'v'), (0x1D42F, 'M', 'v'),
(0x1D430, 'M', 'w'), (0x1D430, 'M', 'w'),
]
def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x1D431, 'M', 'x'), (0x1D431, 'M', 'x'),
(0x1D432, 'M', 'y'), (0x1D432, 'M', 'y'),
(0x1D433, 'M', 'z'), (0x1D433, 'M', 'z'),
@ -6438,6 +6454,10 @@ def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1D482, 'M', 'a'), (0x1D482, 'M', 'a'),
(0x1D483, 'M', 'b'), (0x1D483, 'M', 'b'),
(0x1D484, 'M', 'c'), (0x1D484, 'M', 'c'),
]
def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x1D485, 'M', 'd'), (0x1D485, 'M', 'd'),
(0x1D486, 'M', 'e'), (0x1D486, 'M', 'e'),
(0x1D487, 'M', 'f'), (0x1D487, 'M', 'f'),
@ -6454,10 +6474,6 @@ def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1D492, 'M', 'q'), (0x1D492, 'M', 'q'),
(0x1D493, 'M', 'r'), (0x1D493, 'M', 'r'),
(0x1D494, 'M', 's'), (0x1D494, 'M', 's'),
]
def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x1D495, 'M', 't'), (0x1D495, 'M', 't'),
(0x1D496, 'M', 'u'), (0x1D496, 'M', 'u'),
(0x1D497, 'M', 'v'), (0x1D497, 'M', 'v'),
@ -6542,6 +6558,10 @@ def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1D4E9, 'M', 'z'), (0x1D4E9, 'M', 'z'),
(0x1D4EA, 'M', 'a'), (0x1D4EA, 'M', 'a'),
(0x1D4EB, 'M', 'b'), (0x1D4EB, 'M', 'b'),
]
def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x1D4EC, 'M', 'c'), (0x1D4EC, 'M', 'c'),
(0x1D4ED, 'M', 'd'), (0x1D4ED, 'M', 'd'),
(0x1D4EE, 'M', 'e'), (0x1D4EE, 'M', 'e'),
@ -6558,10 +6578,6 @@ def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1D4F9, 'M', 'p'), (0x1D4F9, 'M', 'p'),
(0x1D4FA, 'M', 'q'), (0x1D4FA, 'M', 'q'),
(0x1D4FB, 'M', 'r'), (0x1D4FB, 'M', 'r'),
]
def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x1D4FC, 'M', 's'), (0x1D4FC, 'M', 's'),
(0x1D4FD, 'M', 't'), (0x1D4FD, 'M', 't'),
(0x1D4FE, 'M', 'u'), (0x1D4FE, 'M', 'u'),
@ -6646,6 +6662,10 @@ def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1D550, 'M', 'y'), (0x1D550, 'M', 'y'),
(0x1D551, 'X'), (0x1D551, 'X'),
(0x1D552, 'M', 'a'), (0x1D552, 'M', 'a'),
]
def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x1D553, 'M', 'b'), (0x1D553, 'M', 'b'),
(0x1D554, 'M', 'c'), (0x1D554, 'M', 'c'),
(0x1D555, 'M', 'd'), (0x1D555, 'M', 'd'),
@ -6662,10 +6682,6 @@ def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1D560, 'M', 'o'), (0x1D560, 'M', 'o'),
(0x1D561, 'M', 'p'), (0x1D561, 'M', 'p'),
(0x1D562, 'M', 'q'), (0x1D562, 'M', 'q'),
]
def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x1D563, 'M', 'r'), (0x1D563, 'M', 'r'),
(0x1D564, 'M', 's'), (0x1D564, 'M', 's'),
(0x1D565, 'M', 't'), (0x1D565, 'M', 't'),
@ -6750,6 +6766,10 @@ def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1D5B4, 'M', 'u'), (0x1D5B4, 'M', 'u'),
(0x1D5B5, 'M', 'v'), (0x1D5B5, 'M', 'v'),
(0x1D5B6, 'M', 'w'), (0x1D5B6, 'M', 'w'),
]
def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x1D5B7, 'M', 'x'), (0x1D5B7, 'M', 'x'),
(0x1D5B8, 'M', 'y'), (0x1D5B8, 'M', 'y'),
(0x1D5B9, 'M', 'z'), (0x1D5B9, 'M', 'z'),
@ -6766,10 +6786,6 @@ def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1D5C4, 'M', 'k'), (0x1D5C4, 'M', 'k'),
(0x1D5C5, 'M', 'l'), (0x1D5C5, 'M', 'l'),
(0x1D5C6, 'M', 'm'), (0x1D5C6, 'M', 'm'),
]
def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x1D5C7, 'M', 'n'), (0x1D5C7, 'M', 'n'),
(0x1D5C8, 'M', 'o'), (0x1D5C8, 'M', 'o'),
(0x1D5C9, 'M', 'p'), (0x1D5C9, 'M', 'p'),
@ -6854,6 +6870,10 @@ def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1D618, 'M', 'q'), (0x1D618, 'M', 'q'),
(0x1D619, 'M', 'r'), (0x1D619, 'M', 'r'),
(0x1D61A, 'M', 's'), (0x1D61A, 'M', 's'),
]
def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x1D61B, 'M', 't'), (0x1D61B, 'M', 't'),
(0x1D61C, 'M', 'u'), (0x1D61C, 'M', 'u'),
(0x1D61D, 'M', 'v'), (0x1D61D, 'M', 'v'),
@ -6870,10 +6890,6 @@ def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1D628, 'M', 'g'), (0x1D628, 'M', 'g'),
(0x1D629, 'M', 'h'), (0x1D629, 'M', 'h'),
(0x1D62A, 'M', 'i'), (0x1D62A, 'M', 'i'),
]
def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x1D62B, 'M', 'j'), (0x1D62B, 'M', 'j'),
(0x1D62C, 'M', 'k'), (0x1D62C, 'M', 'k'),
(0x1D62D, 'M', 'l'), (0x1D62D, 'M', 'l'),
@ -6958,6 +6974,10 @@ def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1D67C, 'M', 'm'), (0x1D67C, 'M', 'm'),
(0x1D67D, 'M', 'n'), (0x1D67D, 'M', 'n'),
(0x1D67E, 'M', 'o'), (0x1D67E, 'M', 'o'),
]
def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x1D67F, 'M', 'p'), (0x1D67F, 'M', 'p'),
(0x1D680, 'M', 'q'), (0x1D680, 'M', 'q'),
(0x1D681, 'M', 'r'), (0x1D681, 'M', 'r'),
@ -6974,10 +6994,6 @@ def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1D68C, 'M', 'c'), (0x1D68C, 'M', 'c'),
(0x1D68D, 'M', 'd'), (0x1D68D, 'M', 'd'),
(0x1D68E, 'M', 'e'), (0x1D68E, 'M', 'e'),
]
def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x1D68F, 'M', 'f'), (0x1D68F, 'M', 'f'),
(0x1D690, 'M', 'g'), (0x1D690, 'M', 'g'),
(0x1D691, 'M', 'h'), (0x1D691, 'M', 'h'),
@ -7062,6 +7078,10 @@ def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1D6E2, 'M', 'α'), (0x1D6E2, 'M', 'α'),
(0x1D6E3, 'M', 'β'), (0x1D6E3, 'M', 'β'),
(0x1D6E4, 'M', 'γ'), (0x1D6E4, 'M', 'γ'),
]
def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x1D6E5, 'M', 'δ'), (0x1D6E5, 'M', 'δ'),
(0x1D6E6, 'M', 'ε'), (0x1D6E6, 'M', 'ε'),
(0x1D6E7, 'M', 'ζ'), (0x1D6E7, 'M', 'ζ'),
@ -7078,10 +7098,6 @@ def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1D6F2, 'M', 'ρ'), (0x1D6F2, 'M', 'ρ'),
(0x1D6F3, 'M', 'θ'), (0x1D6F3, 'M', 'θ'),
(0x1D6F4, 'M', 'σ'), (0x1D6F4, 'M', 'σ'),
]
def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x1D6F5, 'M', 'τ'), (0x1D6F5, 'M', 'τ'),
(0x1D6F6, 'M', 'υ'), (0x1D6F6, 'M', 'υ'),
(0x1D6F7, 'M', 'φ'), (0x1D6F7, 'M', 'φ'),
@ -7166,6 +7182,10 @@ def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1D747, 'M', 'σ'), (0x1D747, 'M', 'σ'),
(0x1D749, 'M', 'τ'), (0x1D749, 'M', 'τ'),
(0x1D74A, 'M', 'υ'), (0x1D74A, 'M', 'υ'),
]
def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x1D74B, 'M', 'φ'), (0x1D74B, 'M', 'φ'),
(0x1D74C, 'M', 'χ'), (0x1D74C, 'M', 'χ'),
(0x1D74D, 'M', 'ψ'), (0x1D74D, 'M', 'ψ'),
@ -7182,10 +7202,6 @@ def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1D758, 'M', 'γ'), (0x1D758, 'M', 'γ'),
(0x1D759, 'M', 'δ'), (0x1D759, 'M', 'δ'),
(0x1D75A, 'M', 'ε'), (0x1D75A, 'M', 'ε'),
]
def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x1D75B, 'M', 'ζ'), (0x1D75B, 'M', 'ζ'),
(0x1D75C, 'M', 'η'), (0x1D75C, 'M', 'η'),
(0x1D75D, 'M', 'θ'), (0x1D75D, 'M', 'θ'),
@ -7270,6 +7286,10 @@ def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1D7AD, 'M', 'δ'), (0x1D7AD, 'M', 'δ'),
(0x1D7AE, 'M', 'ε'), (0x1D7AE, 'M', 'ε'),
(0x1D7AF, 'M', 'ζ'), (0x1D7AF, 'M', 'ζ'),
]
def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x1D7B0, 'M', 'η'), (0x1D7B0, 'M', 'η'),
(0x1D7B1, 'M', 'θ'), (0x1D7B1, 'M', 'θ'),
(0x1D7B2, 'M', 'ι'), (0x1D7B2, 'M', 'ι'),
@ -7286,10 +7306,6 @@ def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1D7BE, 'M', 'υ'), (0x1D7BE, 'M', 'υ'),
(0x1D7BF, 'M', 'φ'), (0x1D7BF, 'M', 'φ'),
(0x1D7C0, 'M', 'χ'), (0x1D7C0, 'M', 'χ'),
]
def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x1D7C1, 'M', 'ψ'), (0x1D7C1, 'M', 'ψ'),
(0x1D7C2, 'M', 'ω'), (0x1D7C2, 'M', 'ω'),
(0x1D7C3, 'M', ''), (0x1D7C3, 'M', ''),
@ -7359,6 +7375,8 @@ def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1DAB0, 'X'), (0x1DAB0, 'X'),
(0x1DF00, 'V'), (0x1DF00, 'V'),
(0x1DF1F, 'X'), (0x1DF1F, 'X'),
(0x1DF25, 'V'),
(0x1DF2B, 'X'),
(0x1E000, 'V'), (0x1E000, 'V'),
(0x1E007, 'X'), (0x1E007, 'X'),
(0x1E008, 'V'), (0x1E008, 'V'),
@ -7369,6 +7387,75 @@ def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1E025, 'X'), (0x1E025, 'X'),
(0x1E026, 'V'), (0x1E026, 'V'),
(0x1E02B, 'X'), (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'), (0x1E100, 'V'),
(0x1E12D, 'X'), (0x1E12D, 'X'),
(0x1E130, 'V'), (0x1E130, 'V'),
@ -7383,6 +7470,8 @@ def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1E2FA, 'X'), (0x1E2FA, 'X'),
(0x1E2FF, 'V'), (0x1E2FF, 'V'),
(0x1E300, 'X'), (0x1E300, 'X'),
(0x1E4D0, 'V'),
(0x1E4FA, 'X'),
(0x1E7E0, 'V'), (0x1E7E0, 'V'),
(0x1E7E7, 'X'), (0x1E7E7, 'X'),
(0x1E7E8, 'V'), (0x1E7E8, 'V'),
@ -7390,10 +7479,6 @@ def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1E7ED, 'V'), (0x1E7ED, 'V'),
(0x1E7EF, 'X'), (0x1E7EF, 'X'),
(0x1E7F0, 'V'), (0x1E7F0, 'V'),
]
def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x1E7FF, 'X'), (0x1E7FF, 'X'),
(0x1E800, 'V'), (0x1E800, 'V'),
(0x1E8C5, 'X'), (0x1E8C5, 'X'),
@ -7409,6 +7494,10 @@ def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1E907, 'M', '𞤩'), (0x1E907, 'M', '𞤩'),
(0x1E908, 'M', '𞤪'), (0x1E908, 'M', '𞤪'),
(0x1E909, 'M', '𞤫'), (0x1E909, 'M', '𞤫'),
]
def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x1E90A, 'M', '𞤬'), (0x1E90A, 'M', '𞤬'),
(0x1E90B, 'M', '𞤭'), (0x1E90B, 'M', '𞤭'),
(0x1E90C, 'M', '𞤮'), (0x1E90C, 'M', '𞤮'),
@ -7494,10 +7583,6 @@ def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1EE31, 'M', 'ص'), (0x1EE31, 'M', 'ص'),
(0x1EE32, 'M', 'ق'), (0x1EE32, 'M', 'ق'),
(0x1EE33, 'X'), (0x1EE33, 'X'),
]
def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x1EE34, 'M', 'ش'), (0x1EE34, 'M', 'ش'),
(0x1EE35, 'M', 'ت'), (0x1EE35, 'M', 'ت'),
(0x1EE36, 'M', 'ث'), (0x1EE36, 'M', 'ث'),
@ -7513,6 +7598,10 @@ def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1EE48, 'X'), (0x1EE48, 'X'),
(0x1EE49, 'M', 'ي'), (0x1EE49, 'M', 'ي'),
(0x1EE4A, 'X'), (0x1EE4A, 'X'),
]
def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x1EE4B, 'M', 'ل'), (0x1EE4B, 'M', 'ل'),
(0x1EE4C, 'X'), (0x1EE4C, 'X'),
(0x1EE4D, 'M', 'ن'), (0x1EE4D, 'M', 'ن'),
@ -7598,10 +7687,6 @@ def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1EEA3, 'M', 'د'), (0x1EEA3, 'M', 'د'),
(0x1EEA4, 'X'), (0x1EEA4, 'X'),
(0x1EEA5, 'M', 'و'), (0x1EEA5, 'M', 'و'),
]
def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x1EEA6, 'M', 'ز'), (0x1EEA6, 'M', 'ز'),
(0x1EEA7, 'M', 'ح'), (0x1EEA7, 'M', 'ح'),
(0x1EEA8, 'M', 'ط'), (0x1EEA8, 'M', 'ط'),
@ -7617,6 +7702,10 @@ def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1EEB2, 'M', 'ق'), (0x1EEB2, 'M', 'ق'),
(0x1EEB3, 'M', 'ر'), (0x1EEB3, 'M', 'ر'),
(0x1EEB4, 'M', 'ش'), (0x1EEB4, 'M', 'ش'),
]
def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x1EEB5, 'M', 'ت'), (0x1EEB5, 'M', 'ت'),
(0x1EEB6, 'M', 'ث'), (0x1EEB6, 'M', 'ث'),
(0x1EEB7, 'M', 'خ'), (0x1EEB7, 'M', 'خ'),
@ -7702,10 +7791,6 @@ def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1F141, 'M', 'r'), (0x1F141, 'M', 'r'),
(0x1F142, 'M', 's'), (0x1F142, 'M', 's'),
(0x1F143, 'M', 't'), (0x1F143, 'M', 't'),
]
def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x1F144, 'M', 'u'), (0x1F144, 'M', 'u'),
(0x1F145, 'M', 'v'), (0x1F145, 'M', 'v'),
(0x1F146, 'M', 'w'), (0x1F146, 'M', 'w'),
@ -7721,6 +7806,10 @@ def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1F150, 'V'), (0x1F150, 'V'),
(0x1F16A, 'M', 'mc'), (0x1F16A, 'M', 'mc'),
(0x1F16B, 'M', 'md'), (0x1F16B, 'M', 'md'),
]
def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x1F16C, 'M', 'mr'), (0x1F16C, 'M', 'mr'),
(0x1F16D, 'V'), (0x1F16D, 'V'),
(0x1F190, 'M', 'dj'), (0x1F190, 'M', 'dj'),
@ -7793,23 +7882,19 @@ def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1F266, 'X'), (0x1F266, 'X'),
(0x1F300, 'V'), (0x1F300, 'V'),
(0x1F6D8, 'X'), (0x1F6D8, 'X'),
(0x1F6DD, 'V'), (0x1F6DC, 'V'),
(0x1F6ED, 'X'), (0x1F6ED, 'X'),
(0x1F6F0, 'V'), (0x1F6F0, 'V'),
(0x1F6FD, 'X'), (0x1F6FD, 'X'),
(0x1F700, 'V'), (0x1F700, 'V'),
(0x1F774, 'X'), (0x1F777, 'X'),
(0x1F780, 'V'), (0x1F77B, 'V'),
(0x1F7D9, 'X'), (0x1F7DA, 'X'),
(0x1F7E0, 'V'), (0x1F7E0, 'V'),
(0x1F7EC, 'X'), (0x1F7EC, 'X'),
(0x1F7F0, 'V'), (0x1F7F0, 'V'),
(0x1F7F1, 'X'), (0x1F7F1, 'X'),
(0x1F800, 'V'), (0x1F800, 'V'),
]
def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x1F80C, 'X'), (0x1F80C, 'X'),
(0x1F810, 'V'), (0x1F810, 'V'),
(0x1F848, 'X'), (0x1F848, 'X'),
@ -7825,24 +7910,24 @@ def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x1FA54, 'X'), (0x1FA54, 'X'),
(0x1FA60, 'V'), (0x1FA60, 'V'),
(0x1FA6E, 'X'), (0x1FA6E, 'X'),
]
def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x1FA70, 'V'), (0x1FA70, 'V'),
(0x1FA75, 'X'),
(0x1FA78, 'V'),
(0x1FA7D, 'X'), (0x1FA7D, 'X'),
(0x1FA80, 'V'), (0x1FA80, 'V'),
(0x1FA87, 'X'), (0x1FA89, 'X'),
(0x1FA90, 'V'), (0x1FA90, 'V'),
(0x1FAAD, 'X'), (0x1FABE, 'X'),
(0x1FAB0, 'V'), (0x1FABF, 'V'),
(0x1FABB, 'X'),
(0x1FAC0, 'V'),
(0x1FAC6, 'X'), (0x1FAC6, 'X'),
(0x1FAD0, 'V'), (0x1FACE, 'V'),
(0x1FADA, 'X'), (0x1FADC, 'X'),
(0x1FAE0, 'V'), (0x1FAE0, 'V'),
(0x1FAE8, 'X'), (0x1FAE9, 'X'),
(0x1FAF0, 'V'), (0x1FAF0, 'V'),
(0x1FAF7, 'X'), (0x1FAF9, 'X'),
(0x1FB00, 'V'), (0x1FB00, 'V'),
(0x1FB93, 'X'), (0x1FB93, 'X'),
(0x1FB94, 'V'), (0x1FB94, 'V'),
@ -7861,7 +7946,7 @@ def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x20000, 'V'), (0x20000, 'V'),
(0x2A6E0, 'X'), (0x2A6E0, 'X'),
(0x2A700, 'V'), (0x2A700, 'V'),
(0x2B739, 'X'), (0x2B73A, 'X'),
(0x2B740, 'V'), (0x2B740, 'V'),
(0x2B81E, 'X'), (0x2B81E, 'X'),
(0x2B820, 'V'), (0x2B820, 'V'),
@ -7910,10 +7995,6 @@ def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x2F827, 'M', ''), (0x2F827, 'M', ''),
(0x2F828, 'M', ''), (0x2F828, 'M', ''),
(0x2F829, 'M', ''), (0x2F829, 'M', ''),
]
def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x2F82A, 'M', ''), (0x2F82A, 'M', ''),
(0x2F82B, 'M', ''), (0x2F82B, 'M', ''),
(0x2F82C, 'M', ''), (0x2F82C, 'M', ''),
@ -7933,6 +8014,10 @@ def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x2F83C, 'M', ''), (0x2F83C, 'M', ''),
(0x2F83D, 'M', ''), (0x2F83D, 'M', ''),
(0x2F83E, 'M', ''), (0x2F83E, 'M', ''),
]
def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x2F83F, 'M', ''), (0x2F83F, 'M', ''),
(0x2F840, 'M', ''), (0x2F840, 'M', ''),
(0x2F841, 'M', ''), (0x2F841, 'M', ''),
@ -8014,10 +8099,6 @@ def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x2F88F, 'M', '𪎒'), (0x2F88F, 'M', '𪎒'),
(0x2F890, 'M', ''), (0x2F890, 'M', ''),
(0x2F891, 'M', '𢌱'), (0x2F891, 'M', '𢌱'),
]
def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x2F893, 'M', ''), (0x2F893, 'M', ''),
(0x2F894, 'M', ''), (0x2F894, 'M', ''),
(0x2F896, 'M', ''), (0x2F896, 'M', ''),
@ -8037,6 +8118,10 @@ def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x2F8A4, 'M', '𢛔'), (0x2F8A4, 'M', '𢛔'),
(0x2F8A5, 'M', ''), (0x2F8A5, 'M', ''),
(0x2F8A6, 'M', ''), (0x2F8A6, 'M', ''),
]
def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x2F8A7, 'M', ''), (0x2F8A7, 'M', ''),
(0x2F8A8, 'M', ''), (0x2F8A8, 'M', ''),
(0x2F8A9, 'M', ''), (0x2F8A9, 'M', ''),
@ -8118,10 +8203,6 @@ def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x2F8F5, 'M', ''), (0x2F8F5, 'M', ''),
(0x2F8F6, 'M', ''), (0x2F8F6, 'M', ''),
(0x2F8F7, 'M', '𣪍'), (0x2F8F7, 'M', '𣪍'),
]
def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x2F8F8, 'M', '𡴋'), (0x2F8F8, 'M', '𡴋'),
(0x2F8F9, 'M', '𣫺'), (0x2F8F9, 'M', '𣫺'),
(0x2F8FA, 'M', ''), (0x2F8FA, 'M', ''),
@ -8141,6 +8222,10 @@ def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x2F908, 'M', ''), (0x2F908, 'M', ''),
(0x2F909, 'M', ''), (0x2F909, 'M', ''),
(0x2F90A, 'M', ''), (0x2F90A, 'M', ''),
]
def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x2F90B, 'M', ''), (0x2F90B, 'M', ''),
(0x2F90C, 'M', ''), (0x2F90C, 'M', ''),
(0x2F90D, 'M', '𣻑'), (0x2F90D, 'M', '𣻑'),
@ -8222,10 +8307,6 @@ def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x2F95B, 'M', ''), (0x2F95B, 'M', ''),
(0x2F95C, 'M', '𥥼'), (0x2F95C, 'M', '𥥼'),
(0x2F95D, 'M', '𥪧'), (0x2F95D, 'M', '𥪧'),
]
def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x2F95F, 'X'), (0x2F95F, 'X'),
(0x2F960, 'M', ''), (0x2F960, 'M', ''),
(0x2F961, 'M', '𥮫'), (0x2F961, 'M', '𥮫'),
@ -8245,6 +8326,10 @@ def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x2F96F, 'M', ''), (0x2F96F, 'M', ''),
(0x2F970, 'M', ''), (0x2F970, 'M', ''),
(0x2F971, 'M', ''), (0x2F971, 'M', ''),
]
def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x2F972, 'M', '𦈨'), (0x2F972, 'M', '𦈨'),
(0x2F973, 'M', '𦉇'), (0x2F973, 'M', '𦉇'),
(0x2F974, 'M', ''), (0x2F974, 'M', ''),
@ -8326,10 +8411,6 @@ def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x2F9C0, 'M', ''), (0x2F9C0, 'M', ''),
(0x2F9C1, 'M', ''), (0x2F9C1, 'M', ''),
(0x2F9C2, 'M', ''), (0x2F9C2, 'M', ''),
]
def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x2F9C3, 'M', ''), (0x2F9C3, 'M', ''),
(0x2F9C4, 'M', ''), (0x2F9C4, 'M', ''),
(0x2F9C5, 'M', '𧙧'), (0x2F9C5, 'M', '𧙧'),
@ -8349,6 +8430,10 @@ def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x2F9D3, 'M', '𧲨'), (0x2F9D3, 'M', '𧲨'),
(0x2F9D4, 'M', ''), (0x2F9D4, 'M', ''),
(0x2F9D5, 'M', ''), (0x2F9D5, 'M', ''),
]
def _seg_81() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
(0x2F9D6, 'M', ''), (0x2F9D6, 'M', ''),
(0x2F9D7, 'M', ''), (0x2F9D7, 'M', ''),
(0x2F9D8, 'M', '𧼯'), (0x2F9D8, 'M', '𧼯'),
@ -8423,6 +8508,8 @@ def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
(0x2FA1E, 'X'), (0x2FA1E, 'X'),
(0x30000, 'V'), (0x30000, 'V'),
(0x3134B, 'X'), (0x3134B, 'X'),
(0x31350, 'V'),
(0x323B0, 'X'),
(0xE0100, 'I'), (0xE0100, 'I'),
(0xE01F0, 'X'), (0xE01F0, 'X'),
] ]
@ -8509,4 +8596,5 @@ uts46data = tuple(
+ _seg_78() + _seg_78()
+ _seg_79() + _seg_79()
+ _seg_80() + _seg_80()
+ _seg_81()
) # type: Tuple[Union[Tuple[int, str], Tuple[int, str, str]], ...] ) # type: Tuple[Union[Tuple[int, str], Tuple[int, str, str]], ...]

View File

@ -1,6 +1,6 @@
"""Wrappers to build Python packages using PEP 517 hooks """Wrappers to build Python packages using PEP 517 hooks
""" """
__version__ = '0.12.0' __version__ = '0.13.0'
from .wrappers import * # noqa: F401, F403 from .wrappers import * # noqa: F401, F403

View File

@ -0,0 +1,8 @@
__all__ = ("tomllib",)
import sys
if sys.version_info >= (3, 11):
import tomllib
else:
from pip._vendor import tomli as tomllib

View File

@ -1,15 +1,14 @@
"""Build a project using PEP 517 hooks. """Build a project using PEP 517 hooks.
""" """
import argparse import argparse
import io
import logging import logging
import os import os
import shutil import shutil
import tempfile
from ._compat import tomllib
from .envbuild import BuildEnvironment from .envbuild import BuildEnvironment
from .wrappers import Pep517HookCaller from .wrappers import Pep517HookCaller
from .dirtools import tempdir, mkdir_p
from .compat import FileNotFoundError, toml_load
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -31,8 +30,8 @@ def load_system(source_dir):
Load the build system from a source dir (pyproject.toml). Load the build system from a source dir (pyproject.toml).
""" """
pyproject = os.path.join(source_dir, 'pyproject.toml') pyproject = os.path.join(source_dir, 'pyproject.toml')
with io.open(pyproject, 'rb') as f: with open(pyproject, 'rb') as f:
pyproject_data = toml_load(f) pyproject_data = tomllib.load(f)
return pyproject_data['build-system'] return pyproject_data['build-system']
@ -64,7 +63,7 @@ def _do_build(hooks, env, dist, dest):
env.pip_install(reqs) env.pip_install(reqs)
log.info('Installed dynamic build dependencies') 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) log.info('Trying to build %s in %s', dist, td)
build_name = 'build_{dist}'.format(**locals()) build_name = 'build_{dist}'.format(**locals())
build = getattr(hooks, build_name) 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): def build(source_dir, dist, dest=None, system=None):
system = system or load_system(source_dir) system = system or load_system(source_dir)
dest = os.path.join(source_dir, dest or 'dist') dest = os.path.join(source_dir, dest or 'dist')
mkdir_p(dest) os.makedirs(dest, exist_ok=True)
validate_system(system) validate_system(system)
hooks = Pep517HookCaller( hooks = Pep517HookCaller(

View File

@ -1,19 +1,19 @@
"""Check a project and backend by attempting to build using PEP 517 hooks. """Check a project and backend by attempting to build using PEP 517 hooks.
""" """
import argparse import argparse
import io
import logging import logging
import os import os
from os.path import isfile, join as pjoin
import shutil import shutil
from subprocess import CalledProcessError
import sys import sys
import tarfile import tarfile
from tempfile import mkdtemp
import zipfile 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 .colorlog import enable_colourful_output
from .compat import TOMLDecodeError, toml_load
from .envbuild import BuildEnvironment from .envbuild import BuildEnvironment
from .wrappers import Pep517HookCaller from .wrappers import Pep517HookCaller
@ -142,15 +142,15 @@ def check(source_dir):
return False return False
try: try:
with io.open(pyproject, 'rb') as f: with open(pyproject, 'rb') as f:
pyproject_data = toml_load(f) pyproject_data = tomllib.load(f)
# Ensure the mandatory data can be loaded # Ensure the mandatory data can be loaded
buildsys = pyproject_data['build-system'] buildsys = pyproject_data['build-system']
requires = buildsys['requires'] requires = buildsys['requires']
backend = buildsys['build-backend'] backend = buildsys['build-backend']
backend_path = buildsys.get('backend-path') backend_path = buildsys.get('backend-path')
log.info('Loaded pyproject.toml') log.info('Loaded pyproject.toml')
except (TOMLDecodeError, KeyError): except (tomllib.TOMLDecodeError, KeyError):
log.error("Invalid pyproject.toml", exc_info=True) log.error("Invalid pyproject.toml", exc_info=True)
return False return False

View File

@ -73,8 +73,6 @@ class LogFormatter(logging.Formatter):
# right conversion in python 3. # right conversion in python 3.
fg_color = (curses.tigetstr("setaf") or fg_color = (curses.tigetstr("setaf") or
curses.tigetstr("setf") 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(): for levelno, code in self.DEFAULT_COLORS.items():
self._colors[levelno] = str( self._colors[levelno] = str(

View File

@ -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

View File

@ -1,33 +1,8 @@
import os
import io import io
import contextlib import os
import tempfile
import shutil
import errno
import zipfile 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): def dir_to_zipfile(root):
"""Construct an in-memory zip file for a directory.""" """Construct an in-memory zip file for a directory."""
buffer = io.BytesIO() buffer = io.BytesIO()

View File

@ -1,27 +1,26 @@
"""Build wheels/sdists by installing build deps to a temporary environment. """Build wheels/sdists by installing build deps to a temporary environment.
""" """
import io
import os
import logging import logging
import os
import shutil import shutil
from subprocess import check_call
import sys import sys
from subprocess import check_call
from sysconfig import get_paths from sysconfig import get_paths
from tempfile import mkdtemp from tempfile import mkdtemp
from .compat import toml_load from ._compat import tomllib
from .wrappers import Pep517HookCaller, LoggerWrapper from .wrappers import LoggerWrapper, Pep517HookCaller
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
def _load_pyproject(source_dir): def _load_pyproject(source_dir):
with io.open( with open(
os.path.join(source_dir, 'pyproject.toml'), os.path.join(source_dir, 'pyproject.toml'),
'rb', 'rb',
) as f: ) as f:
pyproject_data = toml_load(f) pyproject_data = tomllib.load(f)
buildsys = pyproject_data['build-system'] buildsys = pyproject_data['build-system']
return ( return (
buildsys['requires'], 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 """Context manager to install build deps in a simple temporary environment
Based on code I wrote for pip, which is MIT licensed. Based on code I wrote for pip, which is MIT licensed.

View File

@ -3,15 +3,24 @@
The subpackage should stay as empty as possible to avoid shadowing modules that The subpackage should stay as empty as possible to avoid shadowing modules that
the backend might import. the backend might import.
""" """
from os.path import dirname, abspath, join as pjoin
from contextlib import contextmanager from contextlib import contextmanager
from os.path import abspath, dirname
from os.path import join as pjoin
try: try:
import importlib.resources as resources import importlib.resources as resources
try:
resources.files
except AttributeError:
# Python 3.8 compatibility
def _in_proc_script_path(): def _in_proc_script_path():
return resources.path(__package__, '_in_process.py') 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: except ImportError:
# Python 3.6 compatibility
@contextmanager @contextmanager
def _in_proc_script_path(): def _in_proc_script_path():
yield pjoin(dirname(abspath(__file__)), '_in_process.py') yield pjoin(dirname(abspath(__file__)), '_in_process.py')

View File

@ -12,40 +12,28 @@ Results:
- control_dir/output.json - control_dir/output.json
- {"return_val": ...} - {"return_val": ...}
""" """
from glob import glob
from importlib import import_module
import json import json
import os import os
import os.path import os.path
from os.path import join as pjoin
import re import re
import shutil import shutil
import sys import sys
import traceback 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 # This file is run as a script, and `import wrappers` is not zip-safe, so we
# include write_json() and read_json() from compat.py. # include write_json() and read_json() from wrappers.py.
#
# 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):
def write_json(obj, path, **kwargs):
with open(path, 'w', encoding='utf-8') as f: with open(path, 'w', encoding='utf-8') as f:
json.dump(obj, f, **kwargs) json.dump(obj, f, **kwargs)
def read_json(path):
with open(path, 'r', encoding='utf-8') as f:
return json.load(f)
else: def read_json(path):
# Python 2 with open(path, encoding='utf-8') as f:
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) return json.load(f)
@ -64,7 +52,7 @@ class BackendInvalid(Exception):
class HookMissing(Exception): class HookMissing(Exception):
"""Raised if a hook is missing and we are not executing the fallback""" """Raised if a hook is missing and we are not executing the fallback"""
def __init__(self, hook_name=None): def __init__(self, hook_name=None):
super(HookMissing, self).__init__(hook_name) super().__init__(hook_name)
self.hook_name = hook_name self.hook_name = hook_name

View File

@ -1,10 +1,11 @@
"""Build metadata for a project using PEP 517 hooks. """Build metadata for a project using PEP 517 hooks.
""" """
import argparse import argparse
import functools
import logging import logging
import os import os
import shutil import shutil
import functools import tempfile
try: try:
import importlib.metadata as imp_meta import importlib.metadata as imp_meta
@ -16,10 +17,10 @@ try:
except ImportError: except ImportError:
from zipp import Path from zipp import Path
from .build import compat_system, load_system, validate_system
from .dirtools import dir_to_zipfile
from .envbuild import BuildEnvironment from .envbuild import BuildEnvironment
from .wrappers import Pep517HookCaller, quiet_subprocess_runner 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__) log = logging.getLogger(__name__)
@ -31,7 +32,7 @@ def _prep_meta(hooks, env, dest):
env.pip_install(reqs) env.pip_install(reqs)
log.info('Installed dynamic build dependencies') log.info('Installed dynamic build dependencies')
with tempdir() as td: with tempfile.TemporaryDirectory() as td:
log.info('Trying to build metadata in %s', td) log.info('Trying to build metadata in %s', td)
filename = hooks.prepare_metadata_for_build_wheel(td, {}) filename = hooks.prepare_metadata_for_build_wheel(td, {})
source = os.path.join(td, filename) source = os.path.join(td, filename)
@ -41,7 +42,7 @@ def _prep_meta(hooks, env, dest):
def build(source_dir='.', dest=None, system=None): def build(source_dir='.', dest=None, system=None):
system = system or load_system(source_dir) system = system or load_system(source_dir)
dest = os.path.join(source_dir, dest or 'dist') dest = os.path.join(source_dir, dest or 'dist')
mkdir_p(dest) os.makedirs(dest, exist_ok=True)
validate_system(system) validate_system(system)
hooks = Pep517HookCaller( hooks = Pep517HookCaller(
source_dir, system['build-backend'], system.get('backend-path') 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): def build_as_zip(builder=build):
with tempdir() as out_dir: with tempfile.TemporaryDirectory() as out_dir:
builder(dest=out_dir) builder(dest=out_dir)
return dir_to_zipfile(out_dir) return dir_to_zipfile(out_dir)

View File

@ -1,13 +1,13 @@
import json
import os
import sys
import tempfile
import threading import threading
from contextlib import contextmanager from contextlib import contextmanager
import os from os.path import abspath
from os.path import abspath, join as pjoin from os.path import join as pjoin
import shutil from subprocess import STDOUT, check_call, check_output
from subprocess import check_call, check_output, STDOUT
import sys
from tempfile import mkdtemp
from . import compat
from .in_process import _in_proc_script_path from .in_process import _in_proc_script_path
__all__ = [ __all__ = [
@ -21,13 +21,14 @@ __all__ = [
] ]
@contextmanager def write_json(obj, path, **kwargs):
def tempdir(): with open(path, 'w', encoding='utf-8') as f:
td = mkdtemp() json.dump(obj, f, **kwargs)
try:
yield td
finally: def read_json(path):
shutil.rmtree(td) with open(path, encoding='utf-8') as f:
return json.load(f)
class BackendUnavailable(Exception): class BackendUnavailable(Exception):
@ -47,7 +48,7 @@ class BackendInvalid(Exception):
class HookMissing(Exception): class HookMissing(Exception):
"""Will be raised on missing hooks.""" """Will be raised on missing hooks."""
def __init__(self, hook_name): def __init__(self, hook_name):
super(HookMissing, self).__init__(hook_name) super().__init__(hook_name)
self.hook_name = hook_name self.hook_name = hook_name
@ -99,7 +100,7 @@ def norm_and_check(source_tree, requested):
return abs_requested return abs_requested
class Pep517HookCaller(object): class Pep517HookCaller:
"""A wrapper around a source directory to be built with a PEP 517 backend. """A wrapper around a source directory to be built with a PEP 517 backend.
:param source_dir: The path to the source directory, containing :param source_dir: The path to the source directory, containing
@ -292,29 +293,15 @@ class Pep517HookCaller(object):
}) })
def _call_hook(self, hook_name, kwargs): def _call_hook(self, hook_name, kwargs):
# On Python 2, pytoml returns Unicode values (which is correct) but the extra_environ = {'PEP517_BUILD_BACKEND': self.build_backend}
# 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}
if self.backend_path: if self.backend_path:
backend_path = os.pathsep.join(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 extra_environ['PEP517_BACKEND_PATH'] = backend_path
with tempdir() as td: with tempfile.TemporaryDirectory() as td:
hook_input = {'kwargs': kwargs} hook_input = {'kwargs': kwargs}
compat.write_json(hook_input, pjoin(td, 'input.json'), write_json(hook_input, pjoin(td, 'input.json'), indent=2)
indent=2)
# Run the hook in a subprocess # Run the hook in a subprocess
with _in_proc_script_path() as script: with _in_proc_script_path() as script:
@ -325,7 +312,7 @@ class Pep517HookCaller(object):
extra_environ=extra_environ extra_environ=extra_environ
) )
data = compat.read_json(pjoin(td, 'output.json')) data = read_json(pjoin(td, 'output.json'))
if data.get('unsupported'): if data.get('unsupported'):
raise UnsupportedOperation(data.get('traceback', '')) raise UnsupportedOperation(data.get('traceback', ''))
if data.get('no_backend'): if data.get('no_backend'):

View File

@ -26,7 +26,7 @@
""" """
from io import StringIO, BytesIO from io import StringIO, BytesIO
__version__ = '2.12.0' __version__ = '2.13.0'
__docformat__ = 'restructuredtext' __docformat__ = 'restructuredtext'
__all__ = ['lex', 'format', 'highlight'] __all__ = ['lex', 'format', 'highlight']
@ -38,10 +38,10 @@ def lex(code, lexer):
""" """
try: try:
return lexer.get_tokens(code) return lexer.get_tokens(code)
except TypeError as err: except TypeError:
if (isinstance(err.args[0], str) and # Heuristic to catch a common mistake.
('unbound method get_tokens' in err.args[0] or from pip._vendor.pygments.lexer import RegexLexer
'missing 1 required positional argument' in err.args[0])): if isinstance(lexer, type) and issubclass(lexer, RegexLexer):
raise TypeError('lex() argument must be a lexer instance, ' raise TypeError('lex() argument must be a lexer instance, '
'not a class') 'not a class')
raise raise
@ -62,10 +62,10 @@ def format(tokens, formatter, outfile=None): # pylint: disable=redefined-builti
return realoutfile.getvalue() return realoutfile.getvalue()
else: else:
formatter.format(tokens, outfile) formatter.format(tokens, outfile)
except TypeError as err: except TypeError:
if (isinstance(err.args[0], str) and # Heuristic to catch a common mistake.
('unbound method format' in err.args[0] or from pip._vendor.pygments.formatter import Formatter
'missing 1 required positional argument' in err.args[0])): if isinstance(formatter, type) and issubclass(formatter, Formatter):
raise TypeError('format() argument must be a formatter instance, ' raise TypeError('format() argument must be a formatter instance, '
'not a class') 'not a class')
raise raise
@ -80,4 +80,3 @@ def highlight(code, lexer, formatter, outfile=None):
it is returned as a string. it is returned as a string.
""" """
return format(lex(code, lexer), formatter, outfile) return format(lex(code, lexer), formatter, outfile)

View File

@ -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, \ from pip._vendor.pygments.formatters import get_all_formatters, get_formatter_by_name, \
load_formatter_from_file, get_formatter_for_filename, find_formatter_class load_formatter_from_file, get_formatter_for_filename, find_formatter_class
from pip._vendor.pygments.formatters.terminal import TerminalFormatter 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.filters import get_all_filters, find_filter_class
from pip._vendor.pygments.styles import get_all_styles, get_style_by_name from pip._vendor.pygments.styles import get_all_styles, get_style_by_name
@ -445,7 +445,9 @@ def main_inner(parser, argns):
return 1 return 1
else: else:
if not fmter: 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) fmter = Terminal256Formatter(**parsed_opts)
else: else:
fmter = TerminalFormatter(**parsed_opts) fmter = TerminalFormatter(**parsed_opts)
@ -636,6 +638,9 @@ def main(args=sys.argv):
try: try:
return main_inner(parser, argns) return main_inner(parser, argns)
except BrokenPipeError:
# someone closed our stdout, e.g. by quitting a pager.
return 0
except Exception: except Exception:
if argns.v: if argns.v:
print(file=sys.stderr) print(file=sys.stderr)

View File

@ -69,13 +69,16 @@ class CodeTagFilter(Filter):
`codetags` : list of strings `codetags` : list of strings
A list of strings that are flagged as code tags. The default is to 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): def __init__(self, **options):
Filter.__init__(self, **options) Filter.__init__(self, **options)
tags = get_list_opt(options, 'codetags', 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([ self.tag_re = re.compile(r'\b(%s)\b' % '|'.join([
re.escape(tag) for tag in tags if tag re.escape(tag) for tag in tags if tag
])) ]))

View File

@ -11,7 +11,7 @@
import re import re
import sys import sys
import types import types
import fnmatch from fnmatch import fnmatch
from os.path import basename from os.path import basename
from pip._vendor.pygments.formatters._mapping import FORMATTERS 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) 'get_all_formatters', 'load_formatter_from_file'] + list(FORMATTERS)
_formatter_cache = {} # classes by name _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): def _load_formatters(module_name):
"""Load a formatter (and all others in the module too).""" """Load a formatter (and all others in the module too)."""
@ -122,13 +112,13 @@ def get_formatter_for_filename(fn, **options):
fn = basename(fn) fn = basename(fn)
for modname, name, _, filenames, _ in FORMATTERS.values(): for modname, name, _, filenames, _ in FORMATTERS.values():
for filename in filenames: for filename in filenames:
if _fn_matches(fn, filename): if fnmatch(fn, filename):
if name not in _formatter_cache: if name not in _formatter_cache:
_load_formatters(modname) _load_formatters(modname)
return _formatter_cache[name](**options) return _formatter_cache[name](**options)
for cls in find_plugin_formatters(): for cls in find_plugin_formatters():
for filename in cls.filenames: for filename in cls.filenames:
if _fn_matches(fn, filename): if fnmatch(fn, filename):
return cls(**options) return cls(**options)
raise ClassNotFound("no formatter found for file name %r" % fn) raise ClassNotFound("no formatter found for file name %r" % fn)

View File

@ -1,16 +1,5 @@
""" # Automatically generated by scripts/gen_mapfiles.py.
pygments.formatters._mapping # DO NOT EDIT BY HAND; run `make mapfiles` instead.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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.
"""
FORMATTERS = { 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.'), '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.'), '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.'), '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.'), '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
# <https://www.mercurial-scm.org/wiki/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))

View File

@ -206,13 +206,17 @@ class FontManager:
""" """
Get the character size. Get the character size.
""" """
return self.fonts['NORMAL'].getsize('M') return self.get_text_size('M')
def get_text_size(self, text): 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): def get_font(self, bold, oblique):
""" """
@ -520,7 +524,7 @@ class ImageFormatter(Formatter):
text_fg = self._get_text_color(style), text_fg = self._get_text_color(style),
text_bg = self._get_text_bg_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 linelength += temp_width
maxlinelength = max(maxlinelength, linelength) maxlinelength = max(maxlinelength, linelength)
charno += len(temp) charno += len(temp)

View File

@ -11,7 +11,7 @@
import re import re
import sys import sys
import types import types
import fnmatch from fnmatch import fnmatch
from os.path import basename from os.path import basename
from pip._vendor.pygments.lexers._mapping import LEXERS 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) 'guess_lexer', 'load_lexer_from_file'] + list(LEXERS) + list(COMPAT)
_lexer_cache = {} _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): def _load_lexers(module_name):
"""Load a lexer (and all others in the module too).""" """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) fn = basename(_fn)
for modname, name, _, filenames, _ in LEXERS.values(): for modname, name, _, filenames, _ in LEXERS.values():
for filename in filenames: for filename in filenames:
if _fn_matches(fn, filename): if fnmatch(fn, filename):
if name not in _lexer_cache: if name not in _lexer_cache:
_load_lexers(modname) _load_lexers(modname)
matches.append((_lexer_cache[name], filename)) matches.append((_lexer_cache[name], filename))
for cls in find_plugin_lexers(): for cls in find_plugin_lexers():
for filename in cls.filenames: for filename in cls.filenames:
if _fn_matches(fn, filename): if fnmatch(fn, filename):
matches.append((cls, filename)) matches.append((cls, filename))
if isinstance(code, bytes): if isinstance(code, bytes):
@ -262,11 +252,11 @@ def guess_lexer_for_filename(_fn, _text, **options):
matching_lexers = set() matching_lexers = set()
for lexer in _iter_lexerclasses(): for lexer in _iter_lexerclasses():
for filename in lexer.filenames: for filename in lexer.filenames:
if _fn_matches(fn, filename): if fnmatch(fn, filename):
matching_lexers.add(lexer) matching_lexers.add(lexer)
primary[lexer] = True primary[lexer] = True
for filename in lexer.alias_filenames: for filename in lexer.alias_filenames:
if _fn_matches(fn, filename): if fnmatch(fn, filename):
matching_lexers.add(lexer) matching_lexers.add(lexer)
primary[lexer] = False primary[lexer] = False
if not matching_lexers: if not matching_lexers:

View File

@ -1,16 +1,5 @@
""" # Automatically generated by scripts/gen_mapfiles.py.
pygments.lexers._mapping # DO NOT EDIT BY HAND; run `make mapfiles` instead.
~~~~~~~~~~~~~~~~~~~~~~~~
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.
"""
LEXERS = { LEXERS = {
'ABAPLexer': ('pip._vendor.pygments.lexers.business', 'ABAP', ('abap',), ('*.abap', '*.ABAP'), ('text/x-abap',)), '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',), ()), 'ColdfusionCFCLexer': ('pip._vendor.pygments.lexers.templates', 'Coldfusion CFC', ('cfc',), ('*.cfc',), ()),
'ColdfusionHtmlLexer': ('pip._vendor.pygments.lexers.templates', 'Coldfusion HTML', ('cfm',), ('*.cfm', '*.cfml'), ('application/x-coldfusion',)), 'ColdfusionHtmlLexer': ('pip._vendor.pygments.lexers.templates', 'Coldfusion HTML', ('cfm',), ('*.cfm', '*.cfml'), ('application/x-coldfusion',)),
'ColdfusionLexer': ('pip._vendor.pygments.lexers.templates', 'cfstatement', ('cfs',), (), ()), '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',)), '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',)), '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',)), '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',)), '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',)), 'IsabelleLexer': ('pip._vendor.pygments.lexers.theorem', 'Isabelle', ('isabelle',), ('*.thy',), ('text/x-isabelle',)),
'JLexer': ('pip._vendor.pygments.lexers.j', 'J', ('j',), ('*.ijs',), ('text/x-j',)), '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',)), 'JSLTLexer': ('pip._vendor.pygments.lexers.jslt', 'JSLT', ('jslt',), ('*.jslt',), ('text/x-jslt',)),
'JagsLexer': ('pip._vendor.pygments.lexers.modeling', 'JAGS', ('jags',), ('*.jag', '*.bug'), ()), 'JagsLexer': ('pip._vendor.pygments.lexers.modeling', 'JAGS', ('jags',), ('*.jag', '*.bug'), ()),
'JasminLexer': ('pip._vendor.pygments.lexers.jvm', 'Jasmin', ('jasmin', 'jasminxt'), ('*.j',), ()), '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',), ()), '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',)), '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',)), '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',)), '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',)), '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',)), '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',), ()), 'VGLLexer': ('pip._vendor.pygments.lexers.dsls', 'VGL', ('vgl',), ('*.rpf',), ()),
'ValaLexer': ('pip._vendor.pygments.lexers.c_like', 'Vala', ('vala', 'vapi'), ('*.vala', '*.vapi'), ('text/x-vala',)), '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'), ()), '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',)), 'VelocityHtmlLexer': ('pip._vendor.pygments.lexers.templates', 'HTML+Velocity', ('html+velocity',), (), ('text/html+velocity',)),
'VelocityLexer': ('pip._vendor.pygments.lexers.templates', 'Velocity', ('velocity',), ('*.vm', '*.fhtml'), ()), 'VelocityLexer': ('pip._vendor.pygments.lexers.templates', 'Velocity', ('velocity',), ('*.vm', '*.fhtml'), ()),
'VelocityXmlLexer': ('pip._vendor.pygments.lexers.templates', 'XML+Velocity', ('xml+velocity',), (), ('application/xml+velocity',)), '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',)), 'ZigLexer': ('pip._vendor.pygments.lexers.zig', 'Zig', ('zig',), ('*.zig',), ('text/zig',)),
'apdlexer': ('pip._vendor.pygments.lexers.apdlexer', 'ANSYS parametric design language', ('ansys', 'apdl'), ('*.ans',), ()), '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
# <https://www.mercurial-scm.org/wiki/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))

View File

@ -142,7 +142,7 @@ class PythonLexer(RegexLexer):
combined('fstringescape', 'dqf')), combined('fstringescape', 'dqf')),
("([fF])(')", bygroups(String.Affix, String.Single), ("([fF])(')", bygroups(String.Affix, String.Single),
combined('fstringescape', 'sqf')), combined('fstringescape', 'sqf')),
# raw strings # raw bytes and strings
('(?i)(rb|br|r)(""")', ('(?i)(rb|br|r)(""")',
bygroups(String.Affix, String.Double), 'tdqs'), bygroups(String.Affix, String.Double), 'tdqs'),
("(?i)(rb|br|r)(''')", ("(?i)(rb|br|r)(''')",
@ -152,14 +152,24 @@ class PythonLexer(RegexLexer):
("(?i)(rb|br|r)(')", ("(?i)(rb|br|r)(')",
bygroups(String.Affix, String.Single), 'sqs'), bygroups(String.Affix, String.Single), 'sqs'),
# non-raw strings # non-raw strings
('([uUbB]?)(""")', bygroups(String.Affix, String.Double), ('([uU]?)(""")', bygroups(String.Affix, String.Double),
combined('stringescape', 'tdqs')), combined('stringescape', 'tdqs')),
("([uUbB]?)(''')", bygroups(String.Affix, String.Single), ("([uU]?)(''')", bygroups(String.Affix, String.Single),
combined('stringescape', 'tsqs')), combined('stringescape', 'tsqs')),
('([uUbB]?)(")', bygroups(String.Affix, String.Double), ('([uU]?)(")', bygroups(String.Affix, String.Double),
combined('stringescape', 'dqs')), combined('stringescape', 'dqs')),
("([uUbB]?)(')", bygroups(String.Affix, String.Single), ("([uU]?)(')", bygroups(String.Affix, String.Single),
combined('stringescape', 'sqs')), 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), (r'[^\S\n]+', Text),
include('numbers'), include('numbers'),
(r'!=|==|<<|>>|:=|[-~+/*%=<>&^|.]', Operator), (r'!=|==|<<|>>|:=|[-~+/*%=<>&^|.]', Operator),
@ -343,9 +353,12 @@ class PythonLexer(RegexLexer):
include('rfstringescape'), include('rfstringescape'),
include('stringescape'), include('stringescape'),
], ],
'bytesescape': [
(r'\\([\\abfnrtv"\']|\n|x[a-fA-F0-9]{2}|[0-7]{1,3})', String.Escape)
],
'stringescape': [ 'stringescape': [
(r'\\([\\abfnrtv"\']|\n|N\{.*?\}|u[a-fA-F0-9]{4}|' (r'\\(N\{.*?\}|u[a-fA-F0-9]{4}|U[a-fA-F0-9]{8})', String.Escape),
r'U[a-fA-F0-9]{8}|x[a-fA-F0-9]{2}|[0-7]{1,3})', String.Escape) include('bytesescape')
], ],
'fstrings-single': fstring_rules(String.Single), 'fstrings-single': fstring_rules(String.Single),
'fstrings-double': fstring_rules(String.Double), 'fstrings-double': fstring_rules(String.Double),

View File

@ -2,9 +2,12 @@
pygments.plugin pygments.plugin
~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~
Pygments setuptools plugin interface. The methods defined Pygments plugin interface. By default, this tries to use
here also work if setuptools isn't installed but they just ``importlib.metadata``, which is in the Python standard
return nothing. 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:: lexer plugins::
@ -34,6 +37,7 @@
:copyright: Copyright 2006-2022 by the Pygments team, see AUTHORS. :copyright: Copyright 2006-2022 by the Pygments team, see AUTHORS.
:license: BSD, see LICENSE for details. :license: BSD, see LICENSE for details.
""" """
LEXER_ENTRY_POINT = 'pygments.lexers' LEXER_ENTRY_POINT = 'pygments.lexers'
FORMATTER_ENTRY_POINT = 'pygments.formatters' FORMATTER_ENTRY_POINT = 'pygments.formatters'
STYLE_ENTRY_POINT = 'pygments.styles' STYLE_ENTRY_POINT = 'pygments.styles'
@ -42,11 +46,26 @@ FILTER_ENTRY_POINT = 'pygments.filters'
def iter_entry_points(group_name): def iter_entry_points(group_name):
try: try:
from pip._vendor import pkg_resources 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): except (ImportError, OSError):
return [] return []
else:
return pkg_resources.iter_entry_points(group_name) 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(): def find_plugin_lexers():

View File

@ -48,6 +48,7 @@ STYLE_MAP = {
'solarized-dark': 'solarized::SolarizedDarkStyle', 'solarized-dark': 'solarized::SolarizedDarkStyle',
'solarized-light': 'solarized::SolarizedLightStyle', 'solarized-light': 'solarized::SolarizedLightStyle',
'sas': 'sas::SasStyle', 'sas': 'sas::SasStyle',
'staroffice' : 'staroffice::StarofficeStyle',
'stata': 'stata_light::StataLightStyle', 'stata': 'stata_light::StataLightStyle',
'stata-light': 'stata_light::StataLightStyle', 'stata-light': 'stata_light::StataLightStyle',
'stata-dark': 'stata_dark::StataDarkStyle', 'stata-dark': 'stata_dark::StataDarkStyle',
@ -58,6 +59,9 @@ STYLE_MAP = {
'dracula': 'dracula::DraculaStyle', 'dracula': 'dracula::DraculaStyle',
'one-dark': 'onedark::OneDarkStyle', 'one-dark': 'onedark::OneDarkStyle',
'lilypond' : 'lilypond::LilyPondStyle', 'lilypond' : 'lilypond::LilyPondStyle',
'nord': 'nord::NordStyle',
'nord-darker': 'nord::NordDarkerStyle',
'github-dark': 'gh_dark::GhDarkStyle'
} }

View File

@ -189,6 +189,7 @@ STANDARD_TYPES = {
Operator.Word: 'ow', Operator.Word: 'ow',
Punctuation: 'p', Punctuation: 'p',
Punctuation.Marker: 'pm',
Comment: 'c', Comment: 'c',
Comment.Hashbang: 'ch', Comment.Hashbang: 'ch',

View File

@ -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 environment, you can change the definition of where() to return a separately
packaged CA bundle. 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__": if __name__ == "__main__":
print(where()) print(where())

View File

@ -33,6 +33,7 @@ from .retry import retry_always # noqa
from .retry import retry_any # noqa from .retry import retry_any # noqa
from .retry import retry_if_exception # noqa from .retry import retry_if_exception # noqa
from .retry import retry_if_exception_type # 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_exception_type # noqa
from .retry import retry_if_not_result # noqa from .retry import retry_if_not_result # noqa
from .retry import retry_if_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 # noqa
from .wait import wait_random_exponential # noqa from .wait import wait_random_exponential # noqa
from .wait import wait_random_exponential as wait_full_jitter # 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. # Import all built-in before strategies for easier usage.
from .before import before_log # noqa from .before import before_log # noqa

View File

@ -117,6 +117,33 @@ class retry_unless_exception_type(retry_if_exception):
return self.predicate(retry_state.outcome.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): class retry_if_result(retry_base):
"""Retries if the result verifies a predicate.""" """Retries if the result verifies a predicate."""

View File

@ -17,12 +17,19 @@
import abc import abc
import random import random
import typing import typing
from datetime import timedelta
from pip._vendor.tenacity import _utils from pip._vendor.tenacity import _utils
if typing.TYPE_CHECKING: if typing.TYPE_CHECKING:
from pip._vendor.tenacity import RetryCallState 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): class wait_base(abc.ABC):
"""Abstract base class for wait strategies.""" """Abstract base class for wait strategies."""
@ -44,8 +51,8 @@ class wait_base(abc.ABC):
class wait_fixed(wait_base): class wait_fixed(wait_base):
"""Wait strategy that waits a fixed amount of time between each retry.""" """Wait strategy that waits a fixed amount of time between each retry."""
def __init__(self, wait: float) -> None: def __init__(self, wait: wait_unit_type) -> None:
self.wait_fixed = wait self.wait_fixed = to_seconds(wait)
def __call__(self, retry_state: "RetryCallState") -> float: def __call__(self, retry_state: "RetryCallState") -> float:
return self.wait_fixed return self.wait_fixed
@ -61,9 +68,9 @@ class wait_none(wait_fixed):
class wait_random(wait_base): class wait_random(wait_base):
"""Wait strategy that waits a random amount of time between min/max.""" """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 def __init__(self, min: wait_unit_type = 0, max: wait_unit_type = 1) -> None: # noqa
self.wait_random_min = min self.wait_random_min = to_seconds(min)
self.wait_random_max = max self.wait_random_max = to_seconds(max)
def __call__(self, retry_state: "RetryCallState") -> float: def __call__(self, retry_state: "RetryCallState") -> float:
return self.wait_random_min + (random.random() * (self.wait_random_max - self.wait_random_min)) 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__( def __init__(
self, self,
start: typing.Union[int, float] = 0, start: wait_unit_type = 0,
increment: typing.Union[int, float] = 100, increment: wait_unit_type = 100,
max: typing.Union[int, float] = _utils.MAX_WAIT, # noqa max: wait_unit_type = _utils.MAX_WAIT, # noqa
) -> None: ) -> None:
self.start = start self.start = to_seconds(start)
self.increment = increment self.increment = to_seconds(increment)
self.max = max self.max = to_seconds(max)
def __call__(self, retry_state: "RetryCallState") -> float: def __call__(self, retry_state: "RetryCallState") -> float:
result = self.start + (self.increment * (retry_state.attempt_number - 1)) result = self.start + (self.increment * (retry_state.attempt_number - 1))
@ -142,13 +149,13 @@ class wait_exponential(wait_base):
def __init__( def __init__(
self, self,
multiplier: typing.Union[int, float] = 1, 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, exp_base: typing.Union[int, float] = 2,
min: typing.Union[int, float] = 0, # noqa min: wait_unit_type = 0, # noqa
) -> None: ) -> None:
self.multiplier = multiplier self.multiplier = multiplier
self.min = min self.min = to_seconds(min)
self.max = max self.max = to_seconds(max)
self.exp_base = exp_base self.exp_base = exp_base
def __call__(self, retry_state: "RetryCallState") -> float: def __call__(self, retry_state: "RetryCallState") -> float:
@ -189,3 +196,37 @@ class wait_random_exponential(wait_exponential):
def __call__(self, retry_state: "RetryCallState") -> float: def __call__(self, retry_state: "RetryCallState") -> float:
high = super().__call__(retry_state=retry_state) high = super().__call__(retry_state=retry_state)
return random.uniform(0, high) 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))

View File

@ -8,9 +8,9 @@ import types as _types
import typing import typing
# Please keep __all__ alphabetized within each category.
__all__ = [ __all__ = [
# Super-special typing primitives. # Super-special typing primitives.
'Any',
'ClassVar', 'ClassVar',
'Concatenate', 'Concatenate',
'Final', 'Final',
@ -20,6 +20,7 @@ __all__ = [
'ParamSpecKwargs', 'ParamSpecKwargs',
'Self', 'Self',
'Type', 'Type',
'TypeVar',
'TypeVarTuple', 'TypeVarTuple',
'Unpack', 'Unpack',
@ -60,6 +61,7 @@ __all__ = [
'Literal', 'Literal',
'NewType', 'NewType',
'overload', 'overload',
'override',
'Protocol', 'Protocol',
'reveal_type', 'reveal_type',
'runtime', 'runtime',
@ -149,6 +151,37 @@ VT = typing.TypeVar('VT') # Value type.
T_co = typing.TypeVar('T_co', covariant=True) # Any type covariant containers. T_co = typing.TypeVar('T_co', covariant=True) # Any type covariant containers.
T_contra = typing.TypeVar('T_contra', contravariant=True) # Ditto contravariant. 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 ClassVar = typing.ClassVar
# On older versions of typing there is an internal class named "Final". # On older versions of typing there is an internal class named "Final".
@ -431,7 +464,7 @@ else:
if type(self)._is_protocol: if type(self)._is_protocol:
raise TypeError('Protocols cannot be instantiated') 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 # This metaclass is a bit unfortunate and exists only because of the lack
# of __instancehook__. # of __instancehook__.
def __instancecheck__(cls, instance): def __instancecheck__(cls, instance):
@ -1115,6 +1148,44 @@ else:
above.""") 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 # Python 3.10+ has PEP 612
if hasattr(typing, 'ParamSpecArgs'): if hasattr(typing, 'ParamSpecArgs'):
ParamSpecArgs = typing.ParamSpecArgs ParamSpecArgs = typing.ParamSpecArgs
@ -1179,12 +1250,32 @@ else:
# 3.10+ # 3.10+
if hasattr(typing, 'ParamSpec'): 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 # 3.7-3.9
else: else:
# Inherits from list as a workaround for Callable checks in Python < 3.9.2. # Inherits from list as a workaround for Callable checks in Python < 3.9.2.
class ParamSpec(list): class ParamSpec(list, _DefaultMixin):
"""Parameter specification variable. """Parameter specification variable.
Usage:: Usage::
@ -1242,7 +1333,8 @@ else:
def kwargs(self): def kwargs(self):
return ParamSpecKwargs(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]) super().__init__([self])
self.__name__ = name self.__name__ = name
self.__covariant__ = bool(covariant) self.__covariant__ = bool(covariant)
@ -1251,6 +1343,7 @@ else:
self.__bound__ = typing._type_check(bound, 'Bound must be a type.') self.__bound__ = typing._type_check(bound, 'Bound must be a type.')
else: else:
self.__bound__ = None self.__bound__ = None
_DefaultMixin.__init__(self, default)
# for pickling: # for pickling:
try: try:
@ -1752,9 +1845,25 @@ else:
if hasattr(typing, "TypeVarTuple"): # 3.11+ 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: else:
class TypeVarTuple: class TypeVarTuple(_DefaultMixin):
"""Type variable tuple. """Type variable tuple.
Usage:: Usage::
@ -1804,8 +1913,9 @@ else:
def __iter__(self): def __iter__(self):
yield self.__unpacked__ yield self.__unpacked__
def __init__(self, name): def __init__(self, name, *, default=None):
self.__name__ = name self.__name__ = name
_DefaultMixin.__init__(self, default)
# for pickling: # for pickling:
try: try:
@ -1968,6 +2078,36 @@ else:
return decorator 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 # We have to do some monkey patching to deal with the dual nature of
# Unpack/TypeVarTuple: # Unpack/TypeVarTuple:
# - We want Unpack to be a kind of TypeVar so it gets accepted in # - We want Unpack to be a kind of TypeVar so it gets accepted in

View File

@ -19,6 +19,23 @@ from .util.retry import Retry
from .util.timeout import Timeout from .util.timeout import Timeout
from .util.url import get_host 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)" __author__ = "Andrey Petrov (andrey.petrov@shazow.net)"
__license__ = "MIT" __license__ = "MIT"
__version__ = __version__ __version__ = __version__

View File

@ -1,2 +1,2 @@
# This file is protected via CODEOWNERS # This file is protected via CODEOWNERS
__version__ = "1.26.10" __version__ = "1.26.12"

View File

@ -73,11 +73,20 @@ except ImportError: # Platform-specific: Python 3
import logging import logging
import ssl import ssl
import sys import sys
import warnings
from .. import util from .. import util
from ..packages import six from ..packages import six
from ..util.ssl_ import PROTOCOL_TLS_CLIENT 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"] __all__ = ["inject_into_urllib3", "extract_from_urllib3"]
# SNI always works. # SNI always works.

View File

@ -2,6 +2,7 @@ from __future__ import absolute_import
import io import io
import logging import logging
import sys
import zlib import zlib
from contextlib import contextmanager from contextlib import contextmanager
from socket import error as SocketError from socket import error as SocketError
@ -9,6 +10,7 @@ from socket import timeout as SocketTimeout
brotli = None brotli = None
from . import util
from ._collections import HTTPHeaderDict from ._collections import HTTPHeaderDict
from .connection import BaseSSLError, HTTPException from .connection import BaseSSLError, HTTPException
from .exceptions import ( from .exceptions import (
@ -475,6 +477,54 @@ class HTTPResponse(io.IOBase):
if self._original_response and self._original_response.isclosed(): if self._original_response and self._original_response.isclosed():
self.release_conn() 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): def read(self, amt=None, decode_content=None, cache_content=False):
""" """
Similar to :meth:`http.client.HTTPResponse.read`, but with two additional 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) fp_closed = getattr(self._fp, "closed", False)
with self._error_catcher(): with self._error_catcher():
data = self._fp_read(amt) if not fp_closed else b""
if amt is None: if amt is None:
# cStringIO doesn't like amt=None
data = self._fp.read() if not fp_closed else b""
flush_decoder = True flush_decoder = True
else: else:
cache_content = False cache_content = False
data = self._fp.read(amt) if not fp_closed else b""
if ( if (
amt != 0 and not data amt != 0 and not data
): # Platform-specific: Buggy versions of Python. ): # Platform-specific: Buggy versions of Python.

View File

@ -1,23 +1,23 @@
CacheControl==0.12.11 # Make sure to update the license in pyproject.toml for this. CacheControl==0.12.11 # Make sure to update the license in pyproject.toml for this.
colorama==0.4.5 colorama==0.4.5
distlib==0.3.5 distlib==0.3.6
distro==1.7.0 distro==1.7.0
msgpack==1.0.4 msgpack==1.0.4
packaging==21.3 packaging==21.3
pep517==0.12.0 pep517==0.13.0
platformdirs==2.5.2 platformdirs==2.5.2
pyparsing==3.0.9 pyparsing==3.0.9
requests==2.28.1 requests==2.28.1
certifi==2022.06.15 certifi==2022.09.24
chardet==5.0.0 chardet==5.0.0
idna==3.3 idna==3.4
urllib3==1.26.10 urllib3==1.26.12
rich==12.5.1 rich==12.5.1
pygments==2.12.0 pygments==2.13.0
typing_extensions==4.3.0 typing_extensions==4.4.0
resolvelib==0.8.1 resolvelib==0.8.1
setuptools==44.0.0 setuptools==44.0.0
six==1.16.0 six==1.16.0
tenacity==8.0.1 tenacity==8.1.0
tomli==2.0.1 tomli==2.0.1
webencodings==0.5.1 webencodings==0.5.1

Binary file not shown.

Binary file not shown.

View File

@ -1,5 +1,3 @@
from ast import parse
from distutils.log import error
from msilib.schema import Directory from msilib.schema import Directory
import os import os
import time import time

View File

@ -107,7 +107,7 @@ for i in path_img:
while strenght <= endStrength: while strenght <= endStrength:
with autocast("cuda"): with autocast("cuda"):
image = pipe(prompt=prompt, init_image=init_image, strength=strenght, image = pipe(prompt=prompt, init_image=init_image, strength=strenght,
guidance_scale=guidance_scale, generator=generator)["sample"][0] guidance_scale=guidance_scale, generator=generator).images[0]
image.save(directory+str(counterr)+"/" + str(allwork) + ".jpg") image.save(directory+str(counterr)+"/" + str(allwork) + ".jpg")
exif_dict = piexif.load( exif_dict = piexif.load(