Some python updates and fix in stable diffusion
This commit is contained in:
parent
85c0e5a964
commit
9acccaef37
|
@ -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
|
||||||
|
|
|
@ -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
|
|
@ -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,,
|
|
@ -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
|
|
@ -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:
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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]:
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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]:
|
||||||
|
|
|
@ -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,
|
||||||
|
)
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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]:
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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 = []
|
||||||
|
|
|
@ -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,
|
||||||
)
|
)
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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",
|
||||||
|
)
|
||||||
|
|
|
@ -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,
|
||||||
|
)
|
||||||
|
|
|
@ -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)
|
||||||
found_executable,
|
if (
|
||||||
os.path.join(binary_prefix, exe_name),
|
found_executable
|
||||||
|
and os.path.exists(binary_executable)
|
||||||
|
and os.path.samefile(
|
||||||
|
found_executable,
|
||||||
|
binary_executable,
|
||||||
|
)
|
||||||
):
|
):
|
||||||
return exe_name
|
return exe_name
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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]:
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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-----
|
||||||
|
|
|
@ -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")
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -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)):
|
||||||
s = s.decode('ascii')
|
try:
|
||||||
|
s = s.decode('ascii')
|
||||||
|
except UnicodeDecodeError:
|
||||||
|
raise IDNAError('should pass a unicode string to the function rather than a byte string.')
|
||||||
if uts46:
|
if uts46:
|
||||||
s = uts46_remap(s, std3_rules, transitional)
|
s = uts46_remap(s, std3_rules, transitional)
|
||||||
trailing_dot = False
|
trailing_dot = False
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
__version__ = '3.3'
|
__version__ = '3.4'
|
||||||
|
|
||||||
|
|
|
@ -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]], ...]
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
__all__ = ("tomllib",)
|
||||||
|
|
||||||
|
import sys
|
||||||
|
|
||||||
|
if sys.version_info >= (3, 11):
|
||||||
|
import tomllib
|
||||||
|
else:
|
||||||
|
from pip._vendor import tomli as tomllib
|
|
@ -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(
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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
|
|
|
@ -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()
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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:
|
||||||
def _in_proc_script_path():
|
resources.files
|
||||||
return resources.path(__package__, '_in_process.py')
|
except AttributeError:
|
||||||
|
# Python 3.8 compatibility
|
||||||
|
def _in_proc_script_path():
|
||||||
|
return resources.path(__package__, '_in_process.py')
|
||||||
|
else:
|
||||||
|
def _in_proc_script_path():
|
||||||
|
return resources.as_file(
|
||||||
|
resources.files(__package__).joinpath('_in_process.py'))
|
||||||
except ImportError:
|
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')
|
||||||
|
|
|
@ -12,41 +12,29 @@ 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):
|
|
||||||
with open(path, 'w', encoding='utf-8') as f:
|
|
||||||
json.dump(obj, f, **kwargs)
|
|
||||||
|
|
||||||
def read_json(path):
|
def write_json(obj, path, **kwargs):
|
||||||
with open(path, 'r', encoding='utf-8') as f:
|
with open(path, 'w', encoding='utf-8') as f:
|
||||||
return json.load(f)
|
json.dump(obj, f, **kwargs)
|
||||||
|
|
||||||
else:
|
|
||||||
# Python 2
|
|
||||||
def write_json(obj, path, **kwargs):
|
|
||||||
with open(path, 'wb') as f:
|
|
||||||
json.dump(obj, f, encoding='utf-8', **kwargs)
|
|
||||||
|
|
||||||
def read_json(path):
|
def read_json(path):
|
||||||
with open(path, 'rb') as f:
|
with open(path, encoding='utf-8') as f:
|
||||||
return json.load(f)
|
return json.load(f)
|
||||||
|
|
||||||
|
|
||||||
class BackendUnavailable(Exception):
|
class BackendUnavailable(Exception):
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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'):
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
]))
|
]))
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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))
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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))
|
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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, OSError):
|
except ImportError:
|
||||||
return []
|
try:
|
||||||
|
from importlib_metadata import entry_points
|
||||||
return pkg_resources.iter_entry_points(group_name)
|
except ImportError:
|
||||||
|
try:
|
||||||
|
from pip._vendor.pkg_resources import iter_entry_points
|
||||||
|
except (ImportError, OSError):
|
||||||
|
return []
|
||||||
|
else:
|
||||||
|
return iter_entry_points(group_name)
|
||||||
|
groups = entry_points()
|
||||||
|
if hasattr(groups, 'select'):
|
||||||
|
# New interface in Python 3.10 and newer versions of the
|
||||||
|
# importlib_metadata backport.
|
||||||
|
return groups.select(group=group_name)
|
||||||
|
else:
|
||||||
|
# Older interface, deprecated in Python 3.10 and recent
|
||||||
|
# importlib_metadata, but we need it in Python 3.8 and 3.9.
|
||||||
|
return groups.get(group_name, [])
|
||||||
|
|
||||||
|
|
||||||
def find_plugin_lexers():
|
def find_plugin_lexers():
|
||||||
|
|
|
@ -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'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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',
|
||||||
|
|
|
@ -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())
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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."""
|
||||||
|
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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__
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
# This file is protected via CODEOWNERS
|
# This file is protected via CODEOWNERS
|
||||||
__version__ = "1.26.10"
|
__version__ = "1.26.12"
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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.
|
@ -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
|
||||||
|
|
|
@ -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(
|
||||||
|
|
Loading…
Reference in New Issue