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/LICENSE,sha256=9BoEVtXyu6Jf1NflC1GpXeMEdw_x21p5UV0DOXqRTY0,1074
|
||||
cleanpy-0.3.1.dist-info/METADATA,sha256=OWfqUzcqWO3svR3PGkVkcVUH7fN9EJbyAoe3jq2lo0Y,6188
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
Metadata-Version: 2.1
|
||||
Name: pip
|
||||
Version: 22.2.2
|
||||
Version: 22.3
|
||||
Summary: The PyPA recommended tool for installing Python packages.
|
||||
Home-page: https://pip.pypa.io/
|
||||
Author: The pip developers
|
||||
|
@ -61,7 +61,6 @@ If you want to get involved head over to GitHub to get the source code, look at
|
|||
|
||||
* `GitHub page`_
|
||||
* `Development documentation`_
|
||||
* `Development mailing list`_
|
||||
* `Development IRC`_
|
||||
|
||||
Code of Conduct
|
||||
|
@ -84,7 +83,6 @@ rooms, and mailing lists is expected to follow the `PSF Code of Conduct`_.
|
|||
.. _Python 2 support policy: https://pip.pypa.io/en/latest/development/release-process/#python-2-support
|
||||
.. _Issue tracking: https://github.com/pypa/pip/issues
|
||||
.. _Discourse channel: https://discuss.python.org/c/packaging
|
||||
.. _Development mailing list: https://mail.python.org/mailman3/lists/distutils-sig.python.org/
|
||||
.. _User IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa
|
||||
.. _Development IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa-dev
|
||||
.. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md
|
|
@ -1,17 +1,18 @@
|
|||
../../Scripts/pip.exe,sha256=Ny0SgVCXVElXIFJUWxzlgUZknQTjUOd4ddmrij0HXnQ,107870
|
||||
../../Scripts/pip3.10.exe,sha256=Ny0SgVCXVElXIFJUWxzlgUZknQTjUOd4ddmrij0HXnQ,107870
|
||||
../../Scripts/pip3.exe,sha256=Ny0SgVCXVElXIFJUWxzlgUZknQTjUOd4ddmrij0HXnQ,107870
|
||||
pip-22.2.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
||||
pip-22.2.2.dist-info/LICENSE.txt,sha256=Y0MApmnUmurmWxLGxIySTFGkzfPR_whtw0VtyLyqIQQ,1093
|
||||
pip-22.2.2.dist-info/METADATA,sha256=1THNkoBHocZtVQ8SixJH12wuSXHJIQb4Vu7RzzEjfKQ,4197
|
||||
pip-22.2.2.dist-info/RECORD,,
|
||||
pip-22.2.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
pip-22.2.2.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
|
||||
pip-22.2.2.dist-info/entry_points.txt,sha256=_ZUyZpzz1RdotcszCitH_lQ6yiWAKmaOcIkCEmkrePU,124
|
||||
pip-22.2.2.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
||||
pip/__init__.py,sha256=RKJ102-F8id9kMdMic9j7MD2OvtK6CP0CK1Erl6PtyU,357
|
||||
../../Scripts/pip.exe,sha256=h1PDR-UkIA35HeaHPF8eeKD1DVA1k1IupBjP5vO2AkI,108413
|
||||
../../Scripts/pip3.10.exe,sha256=h1PDR-UkIA35HeaHPF8eeKD1DVA1k1IupBjP5vO2AkI,108413
|
||||
../../Scripts/pip3.10.exe,sha256=h1PDR-UkIA35HeaHPF8eeKD1DVA1k1IupBjP5vO2AkI,108413
|
||||
../../Scripts/pip3.exe,sha256=h1PDR-UkIA35HeaHPF8eeKD1DVA1k1IupBjP5vO2AkI,108413
|
||||
pip-22.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
||||
pip-22.3.dist-info/LICENSE.txt,sha256=Y0MApmnUmurmWxLGxIySTFGkzfPR_whtw0VtyLyqIQQ,1093
|
||||
pip-22.3.dist-info/METADATA,sha256=CPPiEmaf6uwWzUdhKzSs4P2nVlj8OQXqNosdEf2_b2U,4070
|
||||
pip-22.3.dist-info/RECORD,,
|
||||
pip-22.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
pip-22.3.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
|
||||
pip-22.3.dist-info/entry_points.txt,sha256=ynZN1_707_L23Oa8_O5LOxEoccj1nDa4xHT5galfN7o,125
|
||||
pip-22.3.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
||||
pip/__init__.py,sha256=bsx-xKM3ixByJQTrS7rzaHCYdTO-5kimvPR8sneY56w,355
|
||||
pip/__main__.py,sha256=mXwWDftNLMKfwVqKFWGE_uuBZvGSIiUELhLkeysIuZc,1198
|
||||
pip/__pip-runner__.py,sha256=7S_j7iwRDWb9mahaaEiVL6fct6fWouB2V8W_S8FY0ME,1037
|
||||
pip/__pip-runner__.py,sha256=EnrfKmKMzWAdqg_JicLCOP9Y95Ux7zHh4ObvqLtQcjo,1444
|
||||
pip/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/__pycache__/__main__.cpython-310.pyc,,
|
||||
pip/__pycache__/__pip-runner__.cpython-310.pyc,,
|
||||
|
@ -25,8 +26,8 @@ pip/_internal/__pycache__/main.cpython-310.pyc,,
|
|||
pip/_internal/__pycache__/pyproject.cpython-310.pyc,,
|
||||
pip/_internal/__pycache__/self_outdated_check.cpython-310.pyc,,
|
||||
pip/_internal/__pycache__/wheel_builder.cpython-310.pyc,,
|
||||
pip/_internal/build_env.py,sha256=Io06wf8aNlP1FkDYCbbuVFPGWAMJNys7l_p7r9CmEKE,9535
|
||||
pip/_internal/cache.py,sha256=-FXxS81WOM-amtx3w7N8s20PfFIlHPX8X27FfOBql-I,10623
|
||||
pip/_internal/build_env.py,sha256=gEAT8R6SuWbg2mcrsmOTKWMw_x5pedMzvSTxQS57JZs,10234
|
||||
pip/_internal/cache.py,sha256=C3n78VnBga9rjPXZqht_4A4d-T25poC7K0qBM7FHDhU,10734
|
||||
pip/_internal/cli/__init__.py,sha256=FkHBgpxxb-_gd6r1FjnNhfMOzAUYyXoXKJ6abijfcFU,132
|
||||
pip/_internal/cli/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/cli/__pycache__/autocompletion.cpython-310.pyc,,
|
||||
|
@ -41,15 +42,15 @@ pip/_internal/cli/__pycache__/req_command.cpython-310.pyc,,
|
|||
pip/_internal/cli/__pycache__/spinners.cpython-310.pyc,,
|
||||
pip/_internal/cli/__pycache__/status_codes.cpython-310.pyc,,
|
||||
pip/_internal/cli/autocompletion.py,sha256=wY2JPZY2Eji1vhR7bVo-yCBPJ9LCy6P80iOAhZD1Vi8,6676
|
||||
pip/_internal/cli/base_command.py,sha256=EiHzq1RBubmgYkhsVgJLNc4Y18koPUS1TzMVJwpnYxc,8146
|
||||
pip/_internal/cli/cmdoptions.py,sha256=LKKpinHThNt7wtHqxwkWJpgCUcyQeTX0GUCqyXImAbc,29985
|
||||
pip/_internal/cli/base_command.py,sha256=t1D5x40Hfn9HnPnMt-iSxvqL14nht2olBCacW74pc-k,7842
|
||||
pip/_internal/cli/cmdoptions.py,sha256=Jlarlzz9qv9tC_tCaEbcc_jVvrPreFLBBUnDgoyWflw,29381
|
||||
pip/_internal/cli/command_context.py,sha256=RHgIPwtObh5KhMrd3YZTkl8zbVG-6Okml7YbFX4Ehg0,774
|
||||
pip/_internal/cli/main.py,sha256=ioJ8IVlb2K1qLOxR-tXkee9lURhYV89CDM71MKag7YY,2472
|
||||
pip/_internal/cli/main_parser.py,sha256=Q9TnytfuC5Z2JSjBFWVGtEdYLFy7rukNIb04movHdAo,2614
|
||||
pip/_internal/cli/main_parser.py,sha256=laDpsuBDl6kyfywp9eMMA9s84jfH2TJJn-vmL0GG90w,4338
|
||||
pip/_internal/cli/parser.py,sha256=tWP-K1uSxnJyXu3WE0kkH3niAYRBeuUaxeydhzOdhL4,10817
|
||||
pip/_internal/cli/progress_bars.py,sha256=So4mPoSjXkXiSHiTzzquH3VVyVD_njXlHJSExYPXAow,1968
|
||||
pip/_internal/cli/req_command.py,sha256=ypTutLv4j_efxC2f6C6aCQufxre-zaJdi5m_tWlLeBk,18172
|
||||
pip/_internal/cli/spinners.py,sha256=rs_NveD0wCoJ9GiJJmOjGC1UPVK8isOQpQsFVE899zQ,5098
|
||||
pip/_internal/cli/spinners.py,sha256=hIJ83GerdFgFCdobIA23Jggetegl_uC4Sp586nzFbPE,5118
|
||||
pip/_internal/cli/status_codes.py,sha256=sEFHUaUJbqv8iArL3HAtcztWZmGOFX01hTesSytDEh0,116
|
||||
pip/_internal/commands/__init__.py,sha256=5oRO9O3dM2vGuh0bFw4HOVletryrz5HHMmmPWwJrH9U,3882
|
||||
pip/_internal/commands/__pycache__/__init__.cpython-310.pyc,,
|
||||
|
@ -73,20 +74,20 @@ pip/_internal/commands/__pycache__/wheel.cpython-310.pyc,,
|
|||
pip/_internal/commands/cache.py,sha256=muaT0mbL-ZUpn6AaushVAipzTiMwE4nV2BLbJBwt_KQ,7582
|
||||
pip/_internal/commands/check.py,sha256=0gjXR7j36xJT5cs2heYU_dfOfpnFfzX8OoPNNoKhqdM,1685
|
||||
pip/_internal/commands/completion.py,sha256=H0TJvGrdsoleuIyQKzJbicLFppYx2OZA0BLNpQDeFjI,4129
|
||||
pip/_internal/commands/configuration.py,sha256=ZJRO2YMzI5vPA2ADTWZrSsvGd4q880CylCUzEUJziZY,9500
|
||||
pip/_internal/commands/configuration.py,sha256=NB5uf8HIX8-li95YLoZO09nALIWlLCHDF5aifSKcBn8,9815
|
||||
pip/_internal/commands/debug.py,sha256=kVjn-O1ixLk0webD0w9vfFFq_GCTUTd2hmLOnYtDCig,6573
|
||||
pip/_internal/commands/download.py,sha256=vLtEY3QqIAddjAOGvJJsbaHJg7Har5TPa4UuOOL6Gn8,5058
|
||||
pip/_internal/commands/download.py,sha256=LwKEyYMG2L67nQRyGo8hQdNEeMU2bmGWqJfcB8JDXas,5289
|
||||
pip/_internal/commands/freeze.py,sha256=gCjoD6foBZPBAAYx5t8zZLkJhsF_ZRtnb3dPuD7beO8,2951
|
||||
pip/_internal/commands/hash.py,sha256=EVVOuvGtoPEdFi8SNnmdqlCQrhCxV-kJsdwtdcCnXGQ,1703
|
||||
pip/_internal/commands/help.py,sha256=gcc6QDkcgHMOuAn5UxaZwAStsRBrnGSn_yxjS57JIoM,1132
|
||||
pip/_internal/commands/index.py,sha256=1VVXXj5MsI2qH-N7uniQQyVkg-KCn_RdjiyiUmkUS5U,4762
|
||||
pip/_internal/commands/inspect.py,sha256=mRJ9aIkBQN0IJ7Um8pzaxAzVPIgL8KfWHx1fWKJgUAQ,3374
|
||||
pip/_internal/commands/install.py,sha256=nyZCUv7Oi8rScPe4WENgQ8Vd5n3OHzBuj2tw6khg4Ss,30315
|
||||
pip/_internal/commands/list.py,sha256=wF2g5i4j_JyoRckO9FAeB7KhcFAnLboy0dL-G9fn7Eo,12148
|
||||
pip/_internal/commands/install.py,sha256=_XbW0PyxtZCMMNqo8mDaOq3TBRiJNFM-94CR27mburc,31726
|
||||
pip/_internal/commands/list.py,sha256=Fk1TSxB33NlRS4qlLQ0xwnytnF9-zkQJbKQYv2xc4Q4,12343
|
||||
pip/_internal/commands/search.py,sha256=sbBZiARRc050QquOKcCvOr2K3XLsoYebLKZGRi__iUI,5697
|
||||
pip/_internal/commands/show.py,sha256=CJI8q4SSY0X346K1hi4Th8Nbyhl4nxPTBJUuzOlTaYE,6129
|
||||
pip/_internal/commands/uninstall.py,sha256=0JQhifYxecNrJAwoILFwjm9V1V3liXzNT-y4bgRXXPw,3680
|
||||
pip/_internal/commands/wheel.py,sha256=dar33wNjUyTN6Cy8PVxV5TerJS1u7pZmKoqgoYiQh7g,6307
|
||||
pip/_internal/commands/wheel.py,sha256=mbFJd4dmUfrVFJkQbK8n2zHyRcD3AI91f7EUo9l3KYg,7396
|
||||
pip/_internal/configuration.py,sha256=uBKTus43pDIO6IzT2mLWQeROmHhtnoabhniKNjPYvD0,13529
|
||||
pip/_internal/distributions/__init__.py,sha256=Hq6kt6gXBgjNit5hTTWLAzeCNOKoB-N0pGYSqehrli8,858
|
||||
pip/_internal/distributions/__pycache__/__init__.cpython-310.pyc,,
|
||||
|
@ -98,13 +99,13 @@ pip/_internal/distributions/base.py,sha256=jrF1Vi7eGyqFqMHrieh1PIOrGU7KeCxhYPZnb
|
|||
pip/_internal/distributions/installed.py,sha256=NI2OgsgH9iBq9l5vB-56vOg5YsybOy-AU4VE5CSCO2I,729
|
||||
pip/_internal/distributions/sdist.py,sha256=SQBdkatXSigKGG_SaD0U0p1Jwdfrg26UCNcHgkXZfdA,6494
|
||||
pip/_internal/distributions/wheel.py,sha256=m-J4XO-gvFerlYsFzzSXYDvrx8tLZlJFTCgDxctn8ig,1164
|
||||
pip/_internal/exceptions.py,sha256=U-dV1ixkSz6NAU6Aw9dosKi2EzZ5D3BA7ilYZuTLKeU,20912
|
||||
pip/_internal/exceptions.py,sha256=BfvcyN2iEv3Sf00SVmSk59lEeZEBHELqkuoN2KeIWKc,20942
|
||||
pip/_internal/index/__init__.py,sha256=vpt-JeTZefh8a-FC22ZeBSXFVbuBcXSGiILhQZJaNpQ,30
|
||||
pip/_internal/index/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/index/__pycache__/collector.cpython-310.pyc,,
|
||||
pip/_internal/index/__pycache__/package_finder.cpython-310.pyc,,
|
||||
pip/_internal/index/__pycache__/sources.cpython-310.pyc,,
|
||||
pip/_internal/index/collector.py,sha256=wLRu5q9a7oVAMATsg1O4P9UT1jfjC6KaxwYf3GWI7Wk,20316
|
||||
pip/_internal/index/collector.py,sha256=Pb9FW9STH2lwaApCIdMCivsbPP5pSYQp5bh3nLQBkDU,16503
|
||||
pip/_internal/index/package_finder.py,sha256=kmcMu5_i-BP6v3NQGY0_am1ezxM2Gk4t00arZMmm4sc,37596
|
||||
pip/_internal/index/sources.py,sha256=SVyPitv08-Qalh2_Bk5diAJ9GAA_d-a93koouQodAG0,6557
|
||||
pip/_internal/locations/__init__.py,sha256=QhB-Y6TNyaU010cimm2T4wM5loe8oRdjLwJ6xmsGc-k,17552
|
||||
|
@ -112,26 +113,26 @@ pip/_internal/locations/__pycache__/__init__.cpython-310.pyc,,
|
|||
pip/_internal/locations/__pycache__/_distutils.cpython-310.pyc,,
|
||||
pip/_internal/locations/__pycache__/_sysconfig.cpython-310.pyc,,
|
||||
pip/_internal/locations/__pycache__/base.cpython-310.pyc,,
|
||||
pip/_internal/locations/_distutils.py,sha256=AUJcoQ88zfYs9V57GsBlbhqCpyxxsAlLV1t6oqv55Xc,6272
|
||||
pip/_internal/locations/_distutils.py,sha256=wgHDvHGNZHtlcHkQjYovHzkEUBzisR0iOh7OqCIkB5g,6302
|
||||
pip/_internal/locations/_sysconfig.py,sha256=nM-DiVHXWTxippdmN0MGVl5r7OIfIMy3vgDMlo8c_oo,7867
|
||||
pip/_internal/locations/base.py,sha256=ufyDqPwZ4jLbScD44u8AwTVI-3ft8O78UGrroQI5f68,2573
|
||||
pip/_internal/main.py,sha256=r-UnUe8HLo5XFJz8inTcOOTiu_sxNhgHb6VwlGUllOI,340
|
||||
pip/_internal/metadata/__init__.py,sha256=IeqRXbTeSreqClORmjA_4CMjkWA-trWdss7Oyimwosw,3535
|
||||
pip/_internal/metadata/__init__.py,sha256=84j1dPJaIoz5Q2ZTPi0uB1iaDAHiUNfKtYSGQCfFKpo,4280
|
||||
pip/_internal/metadata/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/metadata/__pycache__/_json.cpython-310.pyc,,
|
||||
pip/_internal/metadata/__pycache__/base.cpython-310.pyc,,
|
||||
pip/_internal/metadata/__pycache__/pkg_resources.cpython-310.pyc,,
|
||||
pip/_internal/metadata/_json.py,sha256=BTkWfFDrWFwuSodImjtbAh8wCL3isecbnjTb5E6UUDI,2595
|
||||
pip/_internal/metadata/base.py,sha256=gOjhT0Mk4f6hCa8hzZIQKynIwpHzydnm6krwGTHTVhI,24596
|
||||
pip/_internal/metadata/base.py,sha256=vIwIo1BtoqegehWMAXhNrpLGYBq245rcaCNkBMPnTU8,25277
|
||||
pip/_internal/metadata/importlib/__init__.py,sha256=9ZVO8BoE7NEZPmoHp5Ap_NJo0HgNIezXXg-TFTtt3Z4,107
|
||||
pip/_internal/metadata/importlib/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/metadata/importlib/__pycache__/_compat.cpython-310.pyc,,
|
||||
pip/_internal/metadata/importlib/__pycache__/_dists.cpython-310.pyc,,
|
||||
pip/_internal/metadata/importlib/__pycache__/_envs.cpython-310.pyc,,
|
||||
pip/_internal/metadata/importlib/_compat.py,sha256=B_qZlMBcbf2VrjHw4Pz9gfk-c-W1Mzp2u_GAzoWWuLE,1493
|
||||
pip/_internal/metadata/importlib/_dists.py,sha256=iEu6KvMdFIfq3ujQvsS0fvI9jDbp1qFC9SmOySfn_fY,7456
|
||||
pip/_internal/metadata/importlib/_envs.py,sha256=-4O0PiYmxydf0e6upJ7X-_BR4DB46I_szlgx53hnJLs,7195
|
||||
pip/_internal/metadata/pkg_resources.py,sha256=RfU--nYrkHAYJXfpoviyBHJA5b9Mw3Dc5HpeYwki1gE,9289
|
||||
pip/_internal/metadata/importlib/_compat.py,sha256=GAe_prIfCE4iUylrnr_2dJRlkkBVRUbOidEoID7LPoE,1882
|
||||
pip/_internal/metadata/importlib/_dists.py,sha256=BUV8y6D0PePZrEN3vfJL-m1FDqZ6YPRgAiBeBinHhNg,8181
|
||||
pip/_internal/metadata/importlib/_envs.py,sha256=7BxanCh3T7arusys__O2ZHJdnmDhQXFmfU7x1-jB5xI,7457
|
||||
pip/_internal/metadata/pkg_resources.py,sha256=WjwiNdRsvxqxL4MA5Tb5a_q3Q3sUhdpbZF8wGLtPMI0,9773
|
||||
pip/_internal/models/__init__.py,sha256=3DHUd_qxpPozfzouoqa9g9ts1Czr5qaHfFxbnxriepM,63
|
||||
pip/_internal/models/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/models/__pycache__/candidate.cpython-310.pyc,,
|
||||
|
@ -150,12 +151,12 @@ pip/_internal/models/direct_url.py,sha256=HLO0sL2aYB6n45bwmd72TDN05sLHJlOQI8M01l
|
|||
pip/_internal/models/format_control.py,sha256=DJpMYjxeYKKQdwNcML2_F0vtAh-qnKTYe-CpTxQe-4g,2520
|
||||
pip/_internal/models/index.py,sha256=tYnL8oxGi4aSNWur0mG8DAP7rC6yuha_MwJO8xw0crI,1030
|
||||
pip/_internal/models/installation_report.py,sha256=ad1arqtxrSFBvWnm6mRqmG12HLV3pZZcZcHrlTFIiqU,2617
|
||||
pip/_internal/models/link.py,sha256=_5okBLOR7vshRltnD11SC3cyD0aSxOa0lMpKWIwQ5UY,10490
|
||||
pip/_internal/models/link.py,sha256=9HWL14UQTMxRCnY6dmAz09rGElJrMAcHn2OJZCBx0tk,18083
|
||||
pip/_internal/models/scheme.py,sha256=3EFQp_ICu_shH1-TBqhl0QAusKCPDFOlgHFeN4XowWs,738
|
||||
pip/_internal/models/search_scope.py,sha256=LwloG0PJAmtI1hFXIypsD95kWE9xfR5hf_a2v1Vw7sk,4520
|
||||
pip/_internal/models/search_scope.py,sha256=iGPQQ6a4Lau8oGQ_FWj8aRLik8A21o03SMO5KnSt-Cg,4644
|
||||
pip/_internal/models/selection_prefs.py,sha256=KZdi66gsR-_RUXUr9uejssk3rmTHrQVJWeNA2sV-VSY,1907
|
||||
pip/_internal/models/target_python.py,sha256=qKpZox7J8NAaPmDs5C_aniwfPDxzvpkrCKqfwndG87k,3858
|
||||
pip/_internal/models/wheel.py,sha256=X_fakLR3OGF7HhrhwVXCUN-1wBwVCT2Lz0o3NguT_GQ,3575
|
||||
pip/_internal/models/wheel.py,sha256=YqazoIZyma_Q1ejFa1C7NHKQRRWlvWkdK96VRKmDBeI,3600
|
||||
pip/_internal/network/__init__.py,sha256=jf6Tt5nV_7zkARBrKojIXItgejvoegVJVKUbhAa5Ioc,50
|
||||
pip/_internal/network/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/network/__pycache__/auth.cpython-310.pyc,,
|
||||
|
@ -168,7 +169,7 @@ pip/_internal/network/__pycache__/xmlrpc.cpython-310.pyc,,
|
|||
pip/_internal/network/auth.py,sha256=a3C7Xaa8kTJjXkdi_wrUjqaySc8Z9Yz7U6QIbXfzMyc,12190
|
||||
pip/_internal/network/cache.py,sha256=hgXftU-eau4MWxHSLquTMzepYq5BPC2zhCkhN3glBy8,2145
|
||||
pip/_internal/network/download.py,sha256=HvDDq9bVqaN3jcS3DyVJHP7uTqFzbShdkf7NFSoHfkw,6096
|
||||
pip/_internal/network/lazy_wheel.py,sha256=7YsbcpwOLyXbwCbR484ikhG9-C1FbUVABekVSBS0zHc,7637
|
||||
pip/_internal/network/lazy_wheel.py,sha256=PbPyuleNhtEq6b2S7rufoGXZWMD15FAGL4XeiAQ8FxA,7638
|
||||
pip/_internal/network/session.py,sha256=BpDOJ7_Xw5VkgPYWsePzcaqOfcyRZcB2AW7W0HGBST0,18443
|
||||
pip/_internal/network/utils.py,sha256=6A5SrUJEEUHxbGtbscwU2NpCyz-3ztiDlGWHpRRhsJ8,4073
|
||||
pip/_internal/network/xmlrpc.py,sha256=AzQgG4GgS152_cqmGr_Oz2MIXsCal-xfsis7fA7nmU0,1791
|
||||
|
@ -202,8 +203,8 @@ pip/_internal/operations/install/__pycache__/legacy.cpython-310.pyc,,
|
|||
pip/_internal/operations/install/__pycache__/wheel.cpython-310.pyc,,
|
||||
pip/_internal/operations/install/editable_legacy.py,sha256=ee4kfJHNuzTdKItbfAsNOSEwq_vD7DRPGkBdK48yBhU,1354
|
||||
pip/_internal/operations/install/legacy.py,sha256=cHdcHebyzf8w7OaOLwcsTNSMSSV8WBoAPFLay_9CjE8,4105
|
||||
pip/_internal/operations/install/wheel.py,sha256=ZbmrarCh74tariXY8rgI56jbZ1BJ2Z6u5fZt4nt3Gmw,27379
|
||||
pip/_internal/operations/prepare.py,sha256=kvL-s1ZUs53g1JIzmJ62j8FwCO_fKWXN45pAtVuz0xE,22962
|
||||
pip/_internal/operations/install/wheel.py,sha256=ZbRGMj1VVS39coYNj4kvsTQCiABeGBJEi7gSsaL2xXU,27403
|
||||
pip/_internal/operations/prepare.py,sha256=BeYXrLFpRoV5XBnRXQHxRA2plyC36kK9Pms5D9wjCo4,25091
|
||||
pip/_internal/pyproject.py,sha256=ob0Gb0l12YLZNxjdpZGRfWHgjqhZTnSVv96RuJyNOfs,7074
|
||||
pip/_internal/req/__init__.py,sha256=rUQ9d_Sh3E5kNYqX9pkN0D06YL-LrtcbJQ-LiIonq08,2807
|
||||
pip/_internal/req/__pycache__/__init__.cpython-310.pyc,,
|
||||
|
@ -213,8 +214,8 @@ pip/_internal/req/__pycache__/req_install.cpython-310.pyc,,
|
|||
pip/_internal/req/__pycache__/req_set.cpython-310.pyc,,
|
||||
pip/_internal/req/__pycache__/req_uninstall.cpython-310.pyc,,
|
||||
pip/_internal/req/constructors.py,sha256=ypjtq1mOQ3d2mFkFPMf_6Mr8SLKeHQk3tUKHA1ddG0U,16611
|
||||
pip/_internal/req/req_file.py,sha256=Qgqx7qLfDO3ai72oO2U1u928_6Idajun5VFRWPZg3XM,17502
|
||||
pip/_internal/req/req_install.py,sha256=bOtpOZnDgmEst_QuWZRXViaPW1JJ1iAvO6vVFgFf0PI,33506
|
||||
pip/_internal/req/req_file.py,sha256=N6lPO3c0to_G73YyGAnk7VUYmed5jV4Qxgmt1xtlXVg,17646
|
||||
pip/_internal/req/req_install.py,sha256=4tzyVGPHJ1-GXowm6PBT52BGIlbc4w7fhVqf-55bmRg,35600
|
||||
pip/_internal/req/req_set.py,sha256=j3esG0s6SzoVReX9rWn4rpYNtyET_fwxbwJPRimvRxo,2858
|
||||
pip/_internal/req/req_uninstall.py,sha256=ZFQfgSNz6H1BMsgl87nQNr2iaQCcbFcmXpW8rKVQcic,24045
|
||||
pip/_internal/resolution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
|
@ -278,22 +279,22 @@ pip/_internal/utils/appdirs.py,sha256=swgcTKOm3daLeXTW6v5BUS2Ti2RvEnGRQYH_yDXklA
|
|||
pip/_internal/utils/compat.py,sha256=ACyBfLgj3_XG-iA5omEDrXqDM0cQKzi8h8HRBInzG6Q,1884
|
||||
pip/_internal/utils/compatibility_tags.py,sha256=ydin8QG8BHqYRsPY4OL6cmb44CbqXl1T0xxS97VhHkk,5377
|
||||
pip/_internal/utils/datetime.py,sha256=m21Y3wAtQc-ji6Veb6k_M5g6A0ZyFI4egchTdnwh-pQ,242
|
||||
pip/_internal/utils/deprecation.py,sha256=NKo8VqLioJ4nnXXGmW4KdasxF90EFHkZaHeX1fT08C8,3627
|
||||
pip/_internal/utils/deprecation.py,sha256=OLc7GzDwPob9y8jscDYCKUNBV-9CWwqFplBOJPLOpBM,5764
|
||||
pip/_internal/utils/direct_url_helpers.py,sha256=6F1tc2rcKaCZmgfVwsE6ObIe_Pux23mUVYA-2D9wCFc,3206
|
||||
pip/_internal/utils/distutils_args.py,sha256=bYUt4wfFJRaeGO4VHia6FNaA8HlYXMcKuEq1zYijY5g,1115
|
||||
pip/_internal/utils/egg_link.py,sha256=5MVlpz5LirT4iLQq86OYzjXaYF0D4Qk1dprEI7ThST4,2203
|
||||
pip/_internal/utils/encoding.py,sha256=qqsXDtiwMIjXMEiIVSaOjwH5YmirCaK-dIzb6-XJsL0,1169
|
||||
pip/_internal/utils/entrypoints.py,sha256=GgeG2FUbbYhQ0sYgG2AtM-a4d1P8MJYdmEl5IhQ-WeM,2900
|
||||
pip/_internal/utils/entrypoints.py,sha256=YlhLTRl2oHBAuqhc-zmL7USS67TPWVHImjeAQHreZTQ,3064
|
||||
pip/_internal/utils/filesystem.py,sha256=RhMIXUaNVMGjc3rhsDahWQ4MavvEQDdqXqgq-F6fpw8,5122
|
||||
pip/_internal/utils/filetypes.py,sha256=i8XAQ0eFCog26Fw9yV0Yb1ygAqKYB1w9Cz9n0fj8gZU,716
|
||||
pip/_internal/utils/glibc.py,sha256=tDfwVYnJCOC0BNVpItpy8CGLP9BjkxFHdl0mTS0J7fc,3110
|
||||
pip/_internal/utils/hashes.py,sha256=EPVx_I0UI8Gvu_skgLwpJA90pHZ5Ev1qNaZagYOub7I,4811
|
||||
pip/_internal/utils/hashes.py,sha256=1WhkVNIHNfuYLafBHThIjVKGplxFJXSlQtuG2mXNlJI,4831
|
||||
pip/_internal/utils/inject_securetransport.py,sha256=o-QRVMGiENrTJxw3fAhA7uxpdEdw6M41TjHYtSVRrcg,795
|
||||
pip/_internal/utils/logging.py,sha256=U2q0i1n8hPS2gQh8qcocAg5dovGAa_bR24akmXMzrk4,11632
|
||||
pip/_internal/utils/misc.py,sha256=49Rs2NgrD4JGTKFt0farCm7FIAi-rjyoxgioArhCW_0,21617
|
||||
pip/_internal/utils/models.py,sha256=5GoYU586SrxURMvDn_jBMJInitviJg4O5-iOU-6I0WY,1193
|
||||
pip/_internal/utils/packaging.py,sha256=5Wm6_x7lKrlqVjPI5MBN_RurcRHwVYoQ7Ksrs84de7s,2108
|
||||
pip/_internal/utils/setuptools_build.py,sha256=vNH9hQB9wT6d-h1hVQhBKw91jNeT42meHpVeii-urOI,5652
|
||||
pip/_internal/utils/setuptools_build.py,sha256=4i3CuS34yNrkePnZ73rR47pyDzpZBo-SX9V5PNDSSHY,5662
|
||||
pip/_internal/utils/subprocess.py,sha256=MYySbvY7qBevRxq_RFfOsDqG4vMqrB4vDoL_eyPE6Bo,9197
|
||||
pip/_internal/utils/temp_dir.py,sha256=aCX489gRa4Nu0dMKRFyGhV6maJr60uEynu5uCbKR4Qg,7702
|
||||
pip/_internal/utils/unpacking.py,sha256=SBb2iV1crb89MDRTEKY86R4A_UOWApTQn9VQVcMDOlE,8821
|
||||
|
@ -307,12 +308,12 @@ pip/_internal/vcs/__pycache__/git.cpython-310.pyc,,
|
|||
pip/_internal/vcs/__pycache__/mercurial.cpython-310.pyc,,
|
||||
pip/_internal/vcs/__pycache__/subversion.cpython-310.pyc,,
|
||||
pip/_internal/vcs/__pycache__/versioncontrol.cpython-310.pyc,,
|
||||
pip/_internal/vcs/bazaar.py,sha256=IGb5ca1xSZfgegRD2_JeyoZPrQQHs7lEYEIgpVsKpoU,3047
|
||||
pip/_internal/vcs/bazaar.py,sha256=zq-Eu2NtJffc6kOsyv2kmRTnKg9qeIXE-KH5JeKck70,3518
|
||||
pip/_internal/vcs/git.py,sha256=mjhwudCx9WlLNkxZ6_kOKmueF0rLoU2i1xeASKF6yiQ,18116
|
||||
pip/_internal/vcs/mercurial.py,sha256=Bzbd518Jsx-EJI0IhIobiQqiRsUv5TWYnrmRIFWE0Gw,5238
|
||||
pip/_internal/vcs/subversion.py,sha256=TEMRdwECvMcXakZX0pTNUep79kmBYkWDkWFkrYmcmac,11718
|
||||
pip/_internal/vcs/subversion.py,sha256=AeUVE9d9qp-0QSOMiUvuFHy1TK950E3QglN7ipP13sI,11728
|
||||
pip/_internal/vcs/versioncontrol.py,sha256=KUOc-hN51em9jrqxKwUR3JnkgSE-xSOqMiiJcSaL6B8,22811
|
||||
pip/_internal/wheel_builder.py,sha256=S-_i83q75xGqKjBenUl4uaTkLyXcZf7jFgChcCNi0xc,12712
|
||||
pip/_internal/wheel_builder.py,sha256=8cObBCu4mIsMJqZM7xXI9DO3vldiAnRNa1Gt6izPPTs,13079
|
||||
pip/_vendor/__init__.py,sha256=fNxOSVD0auElsD8fN9tuq5psfgMQ-RFBtD4X5gjlRkg,4966
|
||||
pip/_vendor/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/__pycache__/six.cpython-310.pyc,,
|
||||
|
@ -343,13 +344,13 @@ pip/_vendor/cachecontrol/filewrapper.py,sha256=X4BAQOO26GNOR7nH_fhTzAfeuct2rBQcx
|
|||
pip/_vendor/cachecontrol/heuristics.py,sha256=8kAyuZLSCyEIgQr6vbUwfhpqg9ows4mM0IV6DWazevI,4154
|
||||
pip/_vendor/cachecontrol/serialize.py,sha256=_U1NU_C-SDgFzkbAxAsPDgMTHeTWZZaHCQnZN_jh0U8,7105
|
||||
pip/_vendor/cachecontrol/wrapper.py,sha256=X3-KMZ20Ho3VtqyVaXclpeQpFzokR5NE8tZSfvKVaB8,774
|
||||
pip/_vendor/certifi/__init__.py,sha256=SuZ3iYmzdRyUv-PiaZkquUgXtWZ16ICUKgymlEBspx0,94
|
||||
pip/_vendor/certifi/__init__.py,sha256=luDjIGxDSrQ9O0zthdz5Lnt069Z_7eR1GIEefEaf-Ys,94
|
||||
pip/_vendor/certifi/__main__.py,sha256=1k3Cr95vCxxGRGDljrW3wMdpZdL3Nhf0u1n-k2qdsCY,255
|
||||
pip/_vendor/certifi/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/certifi/__pycache__/__main__.cpython-310.pyc,,
|
||||
pip/_vendor/certifi/__pycache__/core.cpython-310.pyc,,
|
||||
pip/_vendor/certifi/cacert.pem,sha256=pZ_eiDoO-ddKudrQCWieABc9KFlbV0FsmLLugygMbkw,285222
|
||||
pip/_vendor/certifi/core.py,sha256=g6EYcIFUAhYv5CB9B94iKRgMfGj8f82MF0CRdTDovxM,3052
|
||||
pip/_vendor/certifi/cacert.pem,sha256=3l8CcWt_qL42030rGieD3SLufICFX0bYtGhDl_EXVPI,286370
|
||||
pip/_vendor/certifi/core.py,sha256=ZwiOsv-sD_ouU1ft8wy_xZ3LQ7UbcVzyqj2XNyrsZis,4279
|
||||
pip/_vendor/chardet/__init__.py,sha256=9-r0i294avRciob2HKVcKf6GJmXPHpgMqIijVrqHBDU,3705
|
||||
pip/_vendor/chardet/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/big5freq.cpython-310.pyc,,
|
||||
|
@ -452,7 +453,7 @@ pip/_vendor/colorama/ansitowin32.py,sha256=gGrO7MVtwc-j1Sq3jKfZpERT1JWmYSOsTVDiT
|
|||
pip/_vendor/colorama/initialise.py,sha256=PprovDNxMTrvoNHFcL2NZjpH2XzDc8BLxLxiErfUl4k,1915
|
||||
pip/_vendor/colorama/win32.py,sha256=bJ8Il9jwaBN5BJ8bmN6FoYZ1QYuMKv2j8fGrXh7TJjw,5404
|
||||
pip/_vendor/colorama/winterm.py,sha256=2y_2b7Zsv34feAsP67mLOVc-Bgq51mdYGo571VprlrM,6438
|
||||
pip/_vendor/distlib/__init__.py,sha256=kshNHF2XFPxmBv57X7Jsj7c6VzF5r9naVwGePP-s5Wc,581
|
||||
pip/_vendor/distlib/__init__.py,sha256=acgfseOC55dNrVAzaBKpUiH3Z6V7Q1CaxsiQ3K7pC-E,581
|
||||
pip/_vendor/distlib/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/distlib/__pycache__/compat.cpython-310.pyc,,
|
||||
pip/_vendor/distlib/__pycache__/database.cpython-310.pyc,,
|
||||
|
@ -475,14 +476,14 @@ pip/_vendor/distlib/markers.py,sha256=TpHHHLgkzyT7YHbwj-2i6weRaq-Ivy2-MUnrDkjau-
|
|||
pip/_vendor/distlib/metadata.py,sha256=g_DIiu8nBXRzA-mWPRpatHGbmFZqaFoss7z9TG7QSUU,39801
|
||||
pip/_vendor/distlib/resources.py,sha256=LwbPksc0A1JMbi6XnuPdMBUn83X7BPuFNWqPGEKI698,10820
|
||||
pip/_vendor/distlib/scripts.py,sha256=BmkTKmiTk4m2cj-iueliatwz3ut_9SsABBW51vnQnZU,18102
|
||||
pip/_vendor/distlib/t32.exe,sha256=lD3IWCwZiYZ9onypJifi2R1sGS-S24t3mYupsEAOKyA,97792
|
||||
pip/_vendor/distlib/t64-arm.exe,sha256=3hjLTLg7XBVHwDxgzZpkiHXXp4IJQMLvg_ZlGGpKZDI,182784
|
||||
pip/_vendor/distlib/t64.exe,sha256=vvS31h4-SnumthypJJKAWBeBh7cxSJ8AwGmbqumM05k,107520
|
||||
pip/_vendor/distlib/t32.exe,sha256=a0GV5kCoWsMutvliiCKmIgV98eRZ33wXoS-XrqvJQVs,97792
|
||||
pip/_vendor/distlib/t64-arm.exe,sha256=68TAa32V504xVBnufojh0PcenpR3U4wAqTqf-MZqbPw,182784
|
||||
pip/_vendor/distlib/t64.exe,sha256=gaYY8hy4fbkHYTTnA4i26ct8IQZzkBG2pRdy0iyuBrc,108032
|
||||
pip/_vendor/distlib/util.py,sha256=31dPXn3Rfat0xZLeVoFpuniyhe6vsbl9_QN-qd9Lhlk,66262
|
||||
pip/_vendor/distlib/version.py,sha256=WG__LyAa2GwmA6qSoEJtvJE8REA1LZpbSizy8WvhJLk,23513
|
||||
pip/_vendor/distlib/w32.exe,sha256=-a9nfgVZClK_mGnbQtXVLbn7xtPYw3xDKTddKnu2AJ8,91648
|
||||
pip/_vendor/distlib/w64-arm.exe,sha256=LW-JyIIGblDOp8Psy8igJXDvcg_YpJIINvN0tRjfv18,168448
|
||||
pip/_vendor/distlib/w64.exe,sha256=XvKqAoQzca86ERd2-KV5Vo1RSOBM28I2a35sPQONrYI,101888
|
||||
pip/_vendor/distlib/w32.exe,sha256=R4csx3-OGM9kL4aPIzQKRo5TfmRSHZo6QWyLhDhNBks,91648
|
||||
pip/_vendor/distlib/w64-arm.exe,sha256=xdyYhKj0WDcVUOCb05blQYvzdYIKMbmJn2SZvzkcey4,168448
|
||||
pip/_vendor/distlib/w64.exe,sha256=ejGf-rojoBfXseGLpya6bFTFPWRG21X5KvU8J5iU-K0,101888
|
||||
pip/_vendor/distlib/wheel.py,sha256=Rgqs658VsJ3R2845qwnZD8XQryV2CzWw2mghwLvxxsI,43898
|
||||
pip/_vendor/distro/__init__.py,sha256=2fHjF-SfgPvjyNZ1iHh_wjqWdR_Yo5ODHwZC0jLBPhc,981
|
||||
pip/_vendor/distro/__main__.py,sha256=bu9d3TifoKciZFcqRBuygV3GSuThnVD_m2IK4cz96Vs,64
|
||||
|
@ -501,11 +502,11 @@ pip/_vendor/idna/__pycache__/package_data.cpython-310.pyc,,
|
|||
pip/_vendor/idna/__pycache__/uts46data.cpython-310.pyc,,
|
||||
pip/_vendor/idna/codec.py,sha256=6ly5odKfqrytKT9_7UrlGklHnf1DSK2r9C6cSM4sa28,3374
|
||||
pip/_vendor/idna/compat.py,sha256=0_sOEUMT4CVw9doD3vyRhX80X19PwqFoUBs7gWsFME4,321
|
||||
pip/_vendor/idna/core.py,sha256=RFIkY-HhFZaDoBEFjGwyGd_vWI04uOAQjnzueMWqwOU,12795
|
||||
pip/_vendor/idna/idnadata.py,sha256=fzMzkCea2xieVxcrjngJ-2pLsKQNejPCZFlBajIuQdw,44025
|
||||
pip/_vendor/idna/core.py,sha256=1JxchwKzkxBSn7R_oCE12oBu3eVux0VzdxolmIad24M,12950
|
||||
pip/_vendor/idna/idnadata.py,sha256=xUjqKqiJV8Ho_XzBpAtv5JFoVPSupK-SUXvtjygUHqw,44375
|
||||
pip/_vendor/idna/intranges.py,sha256=YBr4fRYuWH7kTKS2tXlFjM24ZF1Pdvcir-aywniInqg,1881
|
||||
pip/_vendor/idna/package_data.py,sha256=szxQhV0ZD0nKJ84Kuobw3l8q4_KeCyXjFRdpwIpKZmw,21
|
||||
pip/_vendor/idna/uts46data.py,sha256=o-D7V-a0fOLZNd7tvxof6MYfUd0TBZzE2bLR5XO67xU,204400
|
||||
pip/_vendor/idna/package_data.py,sha256=C_jHJzmX8PI4xq0jpzmcTMxpb5lDsq4o5VyxQzlVrZE,21
|
||||
pip/_vendor/idna/uts46data.py,sha256=zvjZU24s58_uAS850Mcd0NnD0X7_gCMAMjzWNIeUJdc,206539
|
||||
pip/_vendor/msgpack/__init__.py,sha256=NryGaKLDk_Egd58ZxXpnuI7OWO27AXz7S6CBFRM3sAY,1132
|
||||
pip/_vendor/msgpack/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/msgpack/__pycache__/exceptions.cpython-310.pyc,,
|
||||
|
@ -536,28 +537,28 @@ pip/_vendor/packaging/specifiers.py,sha256=LRQ0kFsHrl5qfcFNEEJrIFYsnIHQUJXY9fIsa
|
|||
pip/_vendor/packaging/tags.py,sha256=lmsnGNiJ8C4D_Pf9PbM0qgbZvD9kmB9lpZBQUZa3R_Y,15699
|
||||
pip/_vendor/packaging/utils.py,sha256=dJjeat3BS-TYn1RrUFVwufUMasbtzLfYRoy_HXENeFQ,4200
|
||||
pip/_vendor/packaging/version.py,sha256=_fLRNrFrxYcHVfyo8vk9j8s6JM8N_xsSxVFr6RJyco8,14665
|
||||
pip/_vendor/pep517/__init__.py,sha256=Y1bATL2qbFNN6M_DQa4yyrwqjpIiL-j9T6kBmR0DS14,130
|
||||
pip/_vendor/pep517/__init__.py,sha256=QJpRfzTpk6YSPgjcxp9-MCAiS5dEdzf9Bh0UXophG6c,130
|
||||
pip/_vendor/pep517/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/pep517/__pycache__/_compat.cpython-310.pyc,,
|
||||
pip/_vendor/pep517/__pycache__/build.cpython-310.pyc,,
|
||||
pip/_vendor/pep517/__pycache__/check.cpython-310.pyc,,
|
||||
pip/_vendor/pep517/__pycache__/colorlog.cpython-310.pyc,,
|
||||
pip/_vendor/pep517/__pycache__/compat.cpython-310.pyc,,
|
||||
pip/_vendor/pep517/__pycache__/dirtools.cpython-310.pyc,,
|
||||
pip/_vendor/pep517/__pycache__/envbuild.cpython-310.pyc,,
|
||||
pip/_vendor/pep517/__pycache__/meta.cpython-310.pyc,,
|
||||
pip/_vendor/pep517/__pycache__/wrappers.cpython-310.pyc,,
|
||||
pip/_vendor/pep517/build.py,sha256=2bar6EdjwIz2Dlfy94qdxn3oA9mVnnny40mfoT5f-qI,3457
|
||||
pip/_vendor/pep517/check.py,sha256=bCORq1WrHjhpTONa-zpAqG0EB9rHNuhO1ORu6DsDuL8,6084
|
||||
pip/_vendor/pep517/colorlog.py,sha256=Tk9AuYm_cLF3BKTBoSTJt9bRryn0aFojIQOwbfVUTxQ,4098
|
||||
pip/_vendor/pep517/compat.py,sha256=NmLImE5oiDT3gbEhJ4w7xeoMFcpAPrGu_NltBytSJUY,1253
|
||||
pip/_vendor/pep517/dirtools.py,sha256=2mkAkAL0mRz_elYFjRKuekTJVipH1zTn4tbf1EDev84,1129
|
||||
pip/_vendor/pep517/envbuild.py,sha256=zFde--rmzjXMLXcm7SA_3hDtgk5VCTA8hjpk88RbF6E,6100
|
||||
pip/_vendor/pep517/in_process/__init__.py,sha256=MyWoAi8JHdcBv7yXuWpUSVADbx6LSB9rZh7kTIgdA8Y,563
|
||||
pip/_vendor/pep517/_compat.py,sha256=by6evrYnqkisiM-MQcvOKs5bgDMzlOSgZqRHNqf04zE,138
|
||||
pip/_vendor/pep517/build.py,sha256=VLtq0hOvNWCfX0FkdvTKEr-TmyrbaX0UqghpU7bHO1w,3443
|
||||
pip/_vendor/pep517/check.py,sha256=o0Mp_PX1yOM2WNq1ZdDph3YA7RObj2UGQUCUF-46RaU,6083
|
||||
pip/_vendor/pep517/colorlog.py,sha256=eCV1W52xzBjA-sOlKzUcvabRiFa11Y7hA791u-85_c8,3994
|
||||
pip/_vendor/pep517/dirtools.py,sha256=JiZ1Hlt2LNaLZEhNa_pm1YyG3MUoRh7KxY6hJ8ac-w0,607
|
||||
pip/_vendor/pep517/envbuild.py,sha256=nkTt1ZY7MXVgYOhPTyTr-VOxQ-q_Qc1touXfQgM56Bs,6081
|
||||
pip/_vendor/pep517/in_process/__init__.py,sha256=4yDanGyKTXQtLhqRo9eEZ1CsLFezEAEZMfqEd88xrvY,872
|
||||
pip/_vendor/pep517/in_process/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/pep517/in_process/__pycache__/_in_process.cpython-310.pyc,,
|
||||
pip/_vendor/pep517/in_process/_in_process.py,sha256=D3waguyNSGcwosociD5USfcycYr2RCzCjYtxX5UHQmQ,11201
|
||||
pip/_vendor/pep517/meta.py,sha256=8mnM5lDnT4zXQpBTliJbRGfesH7iioHwozbDxALPS9Y,2463
|
||||
pip/_vendor/pep517/wrappers.py,sha256=impq7Cz_LL1iDF1iiOzYWB4MaEu6O6Gps7TJ5qsJz1Q,13429
|
||||
pip/_vendor/pep517/in_process/_in_process.py,sha256=JDpTxlKMDN1QfN_ey4IDtE6ZVSWtzP0_WLSqt1TyGaA,10801
|
||||
pip/_vendor/pep517/meta.py,sha256=budDWsV3I2OnnpSvXQ_ycuTqxh8G7DABoazAq-j8OlQ,2520
|
||||
pip/_vendor/pep517/wrappers.py,sha256=jcxIy-1Kl8I2xAZgbr6qNjF5b_6Q5gTndf9cxF0p5gM,12721
|
||||
pip/_vendor/pkg_resources/__init__.py,sha256=NnpQ3g6BCHzpMgOR_OLBmYtniY4oOzdKpwqghfq_6ug,108287
|
||||
pip/_vendor/pkg_resources/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-310.pyc,,
|
||||
|
@ -578,7 +579,7 @@ pip/_vendor/platformdirs/macos.py,sha256=-3UXQewbT0yMhMdkzRXfXGAntmLIH7Qt4a9Hlf8
|
|||
pip/_vendor/platformdirs/unix.py,sha256=b4aVYTz0qZ50HntwOXo8r6tp82jAa3qTjxw-WlnC2yc,6910
|
||||
pip/_vendor/platformdirs/version.py,sha256=tsBKKPDX3LLh39yHXeTYauGRbRd-AmOJr9SwKldlFIU,78
|
||||
pip/_vendor/platformdirs/windows.py,sha256=ISruopR5UGBePC0BxCxXevkZYfjJsIZc49YWU5iYfQ4,6439
|
||||
pip/_vendor/pygments/__init__.py,sha256=M4yPkVb6x8OkEb4tHfVU8p6B3DBEsshB_8a2gZvr4FE,3002
|
||||
pip/_vendor/pygments/__init__.py,sha256=5oLcMLXD0cTG8YcHBPITtK1fS0JBASILEvEnWkTezgE,2999
|
||||
pip/_vendor/pygments/__main__.py,sha256=p0_rz3JZmNZMNZBOqDojaEx1cr9wmA9FQZX_TYl74lQ,353
|
||||
pip/_vendor/pygments/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/__pycache__/__main__.cpython-310.pyc,,
|
||||
|
@ -596,13 +597,13 @@ pip/_vendor/pygments/__pycache__/style.cpython-310.pyc,,
|
|||
pip/_vendor/pygments/__pycache__/token.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/__pycache__/unistring.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/__pycache__/util.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/cmdline.py,sha256=HYs14dbtMgL7t_BJ7B84NXlFjOzMYgW7Z0ZSxkTJun4,23408
|
||||
pip/_vendor/pygments/cmdline.py,sha256=rc0fah4eknRqFgn1wKNEwkq0yWnSqYOGaA4PaIeOxVY,23685
|
||||
pip/_vendor/pygments/console.py,sha256=hQfqCFuOlGk7DW2lPQYepsw-wkOH1iNt9ylNA1eRymM,1697
|
||||
pip/_vendor/pygments/filter.py,sha256=NglMmMPTRRv-zuRSE_QbWid7JXd2J4AvwjCW2yWALXU,1938
|
||||
pip/_vendor/pygments/filters/__init__.py,sha256=F8WwJguaJLs3bomEH8LyVATQfpULTpSpTd4PRPONR5A,40292
|
||||
pip/_vendor/pygments/filters/__init__.py,sha256=b5YuXB9rampSy2-cMtKxGQoMDfrG4_DcvVwZrzTlB6w,40386
|
||||
pip/_vendor/pygments/filters/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/formatter.py,sha256=6-TS2Y8pUMeWIUolWwr1O8ruC-U6HydWDwOdbAiJgJQ,2917
|
||||
pip/_vendor/pygments/formatters/__init__.py,sha256=5LfCZThsbVVtZU5OyavkRPwC0MV7tB6pqcJ793PWi6E,5119
|
||||
pip/_vendor/pygments/formatters/__init__.py,sha256=YTqGeHS17fNXCLMZpf7oCxBCKLB9YLsZ8IAsjGhawyg,4810
|
||||
pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-310.pyc,,
|
||||
|
@ -617,11 +618,11 @@ pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-310.pyc,,
|
|||
pip/_vendor/pygments/formatters/__pycache__/svg.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/formatters/_mapping.py,sha256=QLyYZ7Cv9W7YcM8seq0XqR3MXW3MzoFZSyHd7BDNU84,6517
|
||||
pip/_vendor/pygments/formatters/_mapping.py,sha256=fCZgvsM6UEuZUG7J6lr47eVss5owKd_JyaNbDfxeqmQ,4104
|
||||
pip/_vendor/pygments/formatters/bbcode.py,sha256=JrL4ITjN-KzPcuQpPMBf1pm33eW2sDUNr8WzSoAJsJA,3314
|
||||
pip/_vendor/pygments/formatters/groff.py,sha256=xrOFoLbafSA9uHsSLRogy79_Zc4GWJ8tMK2hCdTJRsw,5086
|
||||
pip/_vendor/pygments/formatters/html.py,sha256=QNt9prPgxmbKx2M-nfDwoR1bIg06-sNouQuWnE434Wc,35441
|
||||
pip/_vendor/pygments/formatters/img.py,sha256=j3hHU1fhbBEIKEtWTV-vc-z-5c2nqoobOty3QqeQbpk,21819
|
||||
pip/_vendor/pygments/formatters/img.py,sha256=h75Y7IRZLZxDEIwyoOsdRLTwm7kLVPbODKkgEiJ0iKI,21938
|
||||
pip/_vendor/pygments/formatters/irc.py,sha256=iwk5tDJOxbCV64SCmOFyvk__x6RD60ay0nUn7ko9n7U,5871
|
||||
pip/_vendor/pygments/formatters/latex.py,sha256=thPbytJCIs2AUXsO3NZwqKtXJ-upOlcXP4CXsx94G4w,19351
|
||||
pip/_vendor/pygments/formatters/other.py,sha256=PczqK1Rms43lz6iucOLPeBMxIncPKOGBt-195w1ynII,5073
|
||||
|
@ -631,21 +632,21 @@ pip/_vendor/pygments/formatters/svg.py,sha256=6MM9YyO8NhU42RTQfTWBiagWMnsf9iG5gw
|
|||
pip/_vendor/pygments/formatters/terminal.py,sha256=NpEGvwkC6LgMLQTjVzGrJXji3XcET1sb5JCunSCzoRo,4674
|
||||
pip/_vendor/pygments/formatters/terminal256.py,sha256=4v4OVizvsxtwWBpIy_Po30zeOzE5oJg_mOc1-rCjMDk,11753
|
||||
pip/_vendor/pygments/lexer.py,sha256=ZPB_TGn_qzrXodRFwEdPzzJk6LZBo9BlfSy3lacc6zg,32005
|
||||
pip/_vendor/pygments/lexers/__init__.py,sha256=Gku6kqn9IvgIdvV50gISPo0mmyyMNYRoUliEwhw6eNY,11491
|
||||
pip/_vendor/pygments/lexers/__init__.py,sha256=8d80-XfL5UKDCC1wRD1a_ZBZDkZ2HOe7Zul8SsnNYFE,11174
|
||||
pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/lexers/__pycache__/python.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/lexers/_mapping.py,sha256=sExOsmEbtg7hKwXgSz6M3L77cKPaOgskzxOCdw_GxVc,72083
|
||||
pip/_vendor/pygments/lexers/python.py,sha256=QWj4ud4brZCj0-LXjR7IcO0kL6lqM2HzM_DzZZxMRjg,52792
|
||||
pip/_vendor/pygments/lexers/_mapping.py,sha256=zEiCV5FPiBioMJQJjw9kk7IJ5Y9GwknS4VJPYlcNchs,70232
|
||||
pip/_vendor/pygments/lexers/python.py,sha256=gZROs9iNSOA18YyVghP1cUCD0OwYZ04a6PCwgSOCeSA,53376
|
||||
pip/_vendor/pygments/modeline.py,sha256=gIbMSYrjSWPk0oATz7W9vMBYkUyTK2OcdVyKjioDRvA,986
|
||||
pip/_vendor/pygments/plugin.py,sha256=tIRWetjR4dokpgbbFnsx7jjfN57T4-Z4errH1eVgGYw,1727
|
||||
pip/_vendor/pygments/plugin.py,sha256=5rPxEoB_89qQMpOs0nI4KyLOzAHNlbQiwEMOKxqNmv8,2591
|
||||
pip/_vendor/pygments/regexopt.py,sha256=c6xcXGpGgvCET_3VWawJJqAnOp0QttFpQEdOPNY2Py0,3072
|
||||
pip/_vendor/pygments/scanner.py,sha256=F2T2G6cpkj-yZtzGQr-sOBw5w5-96UrJWveZN6va2aM,3092
|
||||
pip/_vendor/pygments/sphinxext.py,sha256=F8L0211sPnXaiWutN0lkSUajWBwlgDMIEFFAbMWOvZY,4630
|
||||
pip/_vendor/pygments/style.py,sha256=RRnussX1YiK9Z7HipIvKorImxu3-HnkdpPCO4u925T0,6257
|
||||
pip/_vendor/pygments/styles/__init__.py,sha256=eVJlJqbmc-TYSQEEl-2yhbtnW6INfuvlayJOiXrt9ro,3252
|
||||
pip/_vendor/pygments/styles/__init__.py,sha256=iZDZ7PBKb55SpGlE1--cx9cbmWx5lVTH4bXO87t2Vok,3419
|
||||
pip/_vendor/pygments/styles/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/token.py,sha256=naybicpgOtSlh3vMGvbbx2T_6qEdGWYEH_RJ4gacIcc,6143
|
||||
pip/_vendor/pygments/token.py,sha256=vA2yNHGJBHfq4jNQSah7C9DmIOp34MmYHPA8P-cYAHI,6184
|
||||
pip/_vendor/pygments/unistring.py,sha256=gP3gK-6C4oAFjjo9HvoahsqzuV4Qz0jl0E0OxfDerHI,63187
|
||||
pip/_vendor/pygments/util.py,sha256=KgwpWWC3By5AiNwxGTI7oI9aXupH2TyZWukafBJe0Mg,9110
|
||||
pip/_vendor/pyparsing/__init__.py,sha256=ZPdI7pPo4IYXcABw-51AcqOzsxVvDtqnQbyn_qYWZvo,9171
|
||||
|
@ -694,7 +695,7 @@ pip/_vendor/requests/_internal_utils.py,sha256=aSPlF4uDhtfKxEayZJJ7KkAxtormeTfpw
|
|||
pip/_vendor/requests/adapters.py,sha256=GFEz5koZaMZD86v0SHXKVB5SE9MgslEjkCQzldkNwVM,21443
|
||||
pip/_vendor/requests/api.py,sha256=dyvkDd5itC9z2g0wHl_YfD1yf6YwpGWLO7__8e21nks,6377
|
||||
pip/_vendor/requests/auth.py,sha256=h-HLlVx9j8rKV5hfSAycP2ApOSglTz77R0tz7qCbbEE,10187
|
||||
pip/_vendor/requests/certs.py,sha256=kHDlkK_beuHXeMPc5jta2wgl8gdKeUWt5f2nTDVrvt8,441
|
||||
pip/_vendor/requests/certs.py,sha256=PVPooB0jP5hkZEULSCwC074532UFbR2Ptgu0I5zwmCs,575
|
||||
pip/_vendor/requests/compat.py,sha256=IhK9quyX0RRuWTNcg6d2JGSAOUbM6mym2p_2XjLTwf4,1286
|
||||
pip/_vendor/requests/cookies.py,sha256=kD3kNEcCj-mxbtf5fJsSaT86eGoEYpD3X0CSgpzl7BM,18560
|
||||
pip/_vendor/requests/exceptions.py,sha256=FA-_kVwBZ2jhXauRctN_ewHVK25b-fj0Azyz1THQ0Kk,3823
|
||||
|
@ -871,7 +872,7 @@ pip/_vendor/rich/themes.py,sha256=0xgTLozfabebYtcJtDdC5QkX5IVUEaviqDUJJh4YVFk,10
|
|||
pip/_vendor/rich/traceback.py,sha256=MORQpXH7AvhAAThW8oIbtwffXb8M6XRkSkcJ52JuA3g,26060
|
||||
pip/_vendor/rich/tree.py,sha256=BMbUYNjS9uodNPfvtY_odmU09GA5QzcMbQ5cJZhllQI,9169
|
||||
pip/_vendor/six.py,sha256=TOOfQi7nFGfMrIvtdr6wX4wyHH8M7aknmuLfo2cBBrM,34549
|
||||
pip/_vendor/tenacity/__init__.py,sha256=GLLsTFD4Bd5VDgTR6mU_FxyOsrxc48qONorVaRebeD4,18257
|
||||
pip/_vendor/tenacity/__init__.py,sha256=rjcWJVq5PcNJNC42rt-TAGGskM-RUEkZbDKu1ra7IPo,18364
|
||||
pip/_vendor/tenacity/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/tenacity/__pycache__/_asyncio.cpython-310.pyc,,
|
||||
pip/_vendor/tenacity/__pycache__/_utils.cpython-310.pyc,,
|
||||
|
@ -889,10 +890,10 @@ pip/_vendor/tenacity/after.py,sha256=dlmyxxFy2uqpLXDr838DiEd7jgv2AGthsWHGYcGYsaI
|
|||
pip/_vendor/tenacity/before.py,sha256=7XtvRmO0dRWUp8SVn24OvIiGFj8-4OP5muQRUiWgLh0,1376
|
||||
pip/_vendor/tenacity/before_sleep.py,sha256=ThyDvqKU5yle_IvYQz_b6Tp6UjUS0PhVp6zgqYl9U6Y,1908
|
||||
pip/_vendor/tenacity/nap.py,sha256=fRWvnz1aIzbIq9Ap3gAkAZgDH6oo5zxMrU6ZOVByq0I,1383
|
||||
pip/_vendor/tenacity/retry.py,sha256=62R71W59bQjuNyFKsDM7hE2aEkEPtwNBRA0tnsEvgSk,6645
|
||||
pip/_vendor/tenacity/retry.py,sha256=Cy504Ss3UrRV7lnYgvymF66WD1wJ2dbM869kDcjuDes,7550
|
||||
pip/_vendor/tenacity/stop.py,sha256=sKHmHaoSaW6sKu3dTxUVKr1-stVkY7lw4Y9yjZU30zQ,2790
|
||||
pip/_vendor/tenacity/tornadoweb.py,sha256=E8lWO2nwe6dJgoB-N2HhQprYLDLB_UdSgFnv-EN6wKE,2145
|
||||
pip/_vendor/tenacity/wait.py,sha256=e_Saa6I2tsNLpCL1t9897wN2fGb0XQMQlE4bU2t9V2w,6691
|
||||
pip/_vendor/tenacity/wait.py,sha256=tdLTESRm5E237VHG0SxCDXRa0DHKPKVq285kslHVURc,8011
|
||||
pip/_vendor/tomli/__init__.py,sha256=JhUwV66DB1g4Hvt1UQCVMdfCu-IgAV8FXmvDU9onxd4,396
|
||||
pip/_vendor/tomli/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/tomli/__pycache__/_parser.cpython-310.pyc,,
|
||||
|
@ -901,8 +902,8 @@ pip/_vendor/tomli/__pycache__/_types.cpython-310.pyc,,
|
|||
pip/_vendor/tomli/_parser.py,sha256=g9-ENaALS-B8dokYpCuzUFalWlog7T-SIYMjLZSWrtM,22633
|
||||
pip/_vendor/tomli/_re.py,sha256=dbjg5ChZT23Ka9z9DHOXfdtSpPwUfdgMXnj8NOoly-w,2943
|
||||
pip/_vendor/tomli/_types.py,sha256=-GTG2VUqkpxwMqzmVO4F7ybKddIbAnuAHXfmWQcTi3Q,254
|
||||
pip/_vendor/typing_extensions.py,sha256=U_PyumPFBkMiR_Iq78QWZXdPprTywptECB2WRIQjDv0,75420
|
||||
pip/_vendor/urllib3/__init__.py,sha256=j3yzHIbmW7CS-IKQJ9-PPQf_YKO8EOAey_rMW0UR7us,2763
|
||||
pip/_vendor/typing_extensions.py,sha256=VKZ_nHsuzDbKOVUY2CTdavwBgfZ2EXRyluZHRzUYAbg,80114
|
||||
pip/_vendor/urllib3/__init__.py,sha256=iXLcYiJySn0GNbWOOZDDApgBL1JgP44EZ8i1760S8Mc,3333
|
||||
pip/_vendor/urllib3/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/__pycache__/_collections.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/__pycache__/_version.cpython-310.pyc,,
|
||||
|
@ -915,7 +916,7 @@ pip/_vendor/urllib3/__pycache__/poolmanager.cpython-310.pyc,,
|
|||
pip/_vendor/urllib3/__pycache__/request.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/__pycache__/response.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/_collections.py,sha256=Rp1mVyBgc_UlAcp6M3at1skJBXR5J43NawRTvW2g_XY,10811
|
||||
pip/_vendor/urllib3/_version.py,sha256=kDAZ-bEcWgqZsVJELrYbVo4buZP5eBBOGl_X7VA0Ic4,64
|
||||
pip/_vendor/urllib3/_version.py,sha256=GhuGBUT_MtRxHEHDb-LYs5yLPeYWlCwFBPjGZmVJbVg,64
|
||||
pip/_vendor/urllib3/connection.py,sha256=8976wL6sGeVMW0JnXvx5mD00yXu87uQjxtB9_VL8dx8,20070
|
||||
pip/_vendor/urllib3/connectionpool.py,sha256=vEzk1iJEw1qR2vHBo7m3Y98iDfna6rKkUz3AyK5lJKQ,39093
|
||||
pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
|
@ -935,7 +936,7 @@ pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=4Xk64qIkPBt09A5q
|
|||
pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=B2JBB2_NRP02xK6DCa1Pa9IuxrPwxzDzZbixQkb7U9M,13922
|
||||
pip/_vendor/urllib3/contrib/appengine.py,sha256=lfzpHFmJiO82shClLEm3QB62SYgHWnjpZOH_2JhU5Tc,11034
|
||||
pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=ej9gGvfAb2Gt00lafFp45SIoRz-QwrQ4WChm6gQmAlM,4538
|
||||
pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=oR_4W0U0gaDYBN8Q5qz_VZ8xrYZsoXve52RwIKdYGbc,16899
|
||||
pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=rt9NEIP8iMBLxxRhH0jLnmshW-OFP83jEayxMSqu2MU,17182
|
||||
pip/_vendor/urllib3/contrib/securetransport.py,sha256=yhZdmVjY6PI6EeFbp7qYOp6-vp1Rkv2NMuOGaEj7pmc,34448
|
||||
pip/_vendor/urllib3/contrib/socks.py,sha256=aRi9eWXo9ZEb95XUxef4Z21CFlnnjbEiAo9HOseoMt4,7097
|
||||
pip/_vendor/urllib3/exceptions.py,sha256=0Mnno3KHTNfXRfY7638NufOPkUb6mXOm-Lqj-4x2w8A,8217
|
||||
|
@ -951,7 +952,7 @@ pip/_vendor/urllib3/packages/backports/makefile.py,sha256=nbzt3i0agPVP07jqqgjhaY
|
|||
pip/_vendor/urllib3/packages/six.py,sha256=b9LM0wBXv7E7SrbCjAm4wwN-hrH-iNxv18LgWNMMKPo,34665
|
||||
pip/_vendor/urllib3/poolmanager.py,sha256=0KOOJECoeLYVjUHvv-0h4Oq3FFQQ2yb-Fnjkbj8gJO0,19786
|
||||
pip/_vendor/urllib3/request.py,sha256=ZFSIqX0C6WizixecChZ3_okyu7BEv0lZu1VT0s6h4SM,5985
|
||||
pip/_vendor/urllib3/response.py,sha256=36JUM28H4dHsuCQgIPeN91LNcK8r1wBUJGFLk3ALfJc,28156
|
||||
pip/_vendor/urllib3/response.py,sha256=p3VBYPhwBca77wCZfmoXvEDVVC3SdF7yxQ6TXuxy1BI,30109
|
||||
pip/_vendor/urllib3/util/__init__.py,sha256=JEmSmmqqLyaw8P51gUImZh8Gwg9i1zSe-DoqAitn2nc,1155
|
||||
pip/_vendor/urllib3/util/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/util/__pycache__/connection.cpython-310.pyc,,
|
||||
|
@ -978,7 +979,7 @@ pip/_vendor/urllib3/util/ssltransport.py,sha256=NA-u5rMTrDFDFC8QzRKUEKMG0561hOD4
|
|||
pip/_vendor/urllib3/util/timeout.py,sha256=QSbBUNOB9yh6AnDn61SrLQ0hg5oz0I9-uXEG91AJuIg,10003
|
||||
pip/_vendor/urllib3/util/url.py,sha256=49HwObaTUUjqVe4qvSUvIjZyf3ghgNA6-OLm3kmkFKM,14287
|
||||
pip/_vendor/urllib3/util/wait.py,sha256=fOX0_faozG2P7iVojQoE1mbydweNyTcm-hXEfFrTtLI,5403
|
||||
pip/_vendor/vendor.txt,sha256=8XILGklF_LcEc20OonK8_bpFH7tG7wLotFxI0k3FMU0,469
|
||||
pip/_vendor/vendor.txt,sha256=07gLL_CcEHdl1XM0g4PH2L4gsTTMlJr8WWIC11yEyMo,469
|
||||
pip/_vendor/webencodings/__init__.py,sha256=qOBJIuPy_4ByYH6W_bNgJF-qYQ2DoU-dKsDu5yRWCXg,10579
|
||||
pip/_vendor/webencodings/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/webencodings/__pycache__/labels.cpython-310.pyc,,
|
|
@ -1,4 +1,4 @@
|
|||
[console_scripts]
|
||||
pip = pip._internal.cli.main:main
|
||||
pip3 = pip._internal.cli.main:main
|
||||
pip3.8 = pip._internal.cli.main:main
|
||||
pip3.10 = pip._internal.cli.main:main
|
|
@ -1,6 +1,6 @@
|
|||
from typing import List, Optional
|
||||
|
||||
__version__ = "22.2.2"
|
||||
__version__ = "22.3"
|
||||
|
||||
|
||||
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.
|
||||
"""
|
||||
|
||||
import runpy
|
||||
# /!\ This version compatibility check section must be Python 2 compatible. /!\
|
||||
|
||||
import sys
|
||||
import types
|
||||
from importlib.machinery import ModuleSpec, PathFinder
|
||||
from os.path import dirname
|
||||
from typing import Optional, Sequence, Union
|
||||
|
||||
# Copied from setup.py
|
||||
PYTHON_REQUIRES = (3, 7)
|
||||
|
||||
|
||||
def version_str(version): # type: ignore
|
||||
return ".".join(str(v) for v in version)
|
||||
|
||||
|
||||
if sys.version_info[:2] < PYTHON_REQUIRES:
|
||||
raise SystemExit(
|
||||
"This version of pip does not support python {} (requires >={}).".format(
|
||||
version_str(sys.version_info[:2]), version_str(PYTHON_REQUIRES)
|
||||
)
|
||||
)
|
||||
|
||||
# From here on, we can use Python 3 features, but the syntax must remain
|
||||
# Python 2 compatible.
|
||||
|
||||
import runpy # noqa: E402
|
||||
from importlib.machinery import PathFinder # noqa: E402
|
||||
from os.path import dirname # noqa: E402
|
||||
|
||||
PIP_SOURCES_ROOT = dirname(dirname(__file__))
|
||||
|
||||
|
||||
class PipImportRedirectingFinder:
|
||||
@classmethod
|
||||
def find_spec(
|
||||
self,
|
||||
fullname: str,
|
||||
path: Optional[Sequence[Union[bytes, str]]] = None,
|
||||
target: Optional[types.ModuleType] = None,
|
||||
) -> Optional[ModuleSpec]:
|
||||
def find_spec(self, fullname, path=None, target=None): # type: ignore
|
||||
if fullname != "pip":
|
||||
return None
|
||||
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
import logging
|
||||
import os
|
||||
import pathlib
|
||||
import site
|
||||
import sys
|
||||
import textwrap
|
||||
from collections import OrderedDict
|
||||
|
@ -39,7 +40,7 @@ class _Prefix:
|
|||
self.lib_dirs = get_prefixed_libs(path)
|
||||
|
||||
|
||||
def _get_runnable_pip() -> str:
|
||||
def get_runnable_pip() -> str:
|
||||
"""Get a file to pass to a Python executable, to run the currently-running pip.
|
||||
|
||||
This is used to run a pip subprocess, for installing requirements into the build
|
||||
|
@ -55,6 +56,26 @@ def _get_runnable_pip() -> str:
|
|||
return os.fsdecode(source / "__pip-runner__.py")
|
||||
|
||||
|
||||
def _get_system_sitepackages() -> Set[str]:
|
||||
"""Get system site packages
|
||||
|
||||
Usually from site.getsitepackages,
|
||||
but fallback on `get_purelib()/get_platlib()` if unavailable
|
||||
(e.g. in a virtualenv created by virtualenv<20)
|
||||
|
||||
Returns normalized set of strings.
|
||||
"""
|
||||
if hasattr(site, "getsitepackages"):
|
||||
system_sites = site.getsitepackages()
|
||||
else:
|
||||
# virtualenv < 20 overwrites site.py without getsitepackages
|
||||
# fallback on get_purelib/get_platlib.
|
||||
# this is known to miss things, but shouldn't in the cases
|
||||
# where getsitepackages() has been removed (inside a virtualenv)
|
||||
system_sites = [get_purelib(), get_platlib()]
|
||||
return {os.path.normcase(path) for path in system_sites}
|
||||
|
||||
|
||||
class BuildEnvironment:
|
||||
"""Creates and manages an isolated environment to install build deps"""
|
||||
|
||||
|
@ -75,9 +96,8 @@ class BuildEnvironment:
|
|||
# Customize site to:
|
||||
# - ensure .pth files are honored
|
||||
# - prevent access to system site packages
|
||||
system_sites = {
|
||||
os.path.normcase(site) for site in (get_purelib(), get_platlib())
|
||||
}
|
||||
system_sites = _get_system_sitepackages()
|
||||
|
||||
self._site_dir = os.path.join(temp_dir.path, "site")
|
||||
if not os.path.exists(self._site_dir):
|
||||
os.mkdir(self._site_dir)
|
||||
|
@ -194,7 +214,7 @@ class BuildEnvironment:
|
|||
if not requirements:
|
||||
return
|
||||
self._install_requirements(
|
||||
_get_runnable_pip(),
|
||||
get_runnable_pip(),
|
||||
finder,
|
||||
requirements,
|
||||
prefix,
|
||||
|
|
|
@ -221,7 +221,11 @@ class WheelCache(Cache):
|
|||
when a certain link is not found in the simple wheel cache first.
|
||||
"""
|
||||
|
||||
def __init__(self, cache_dir: str, format_control: FormatControl) -> None:
|
||||
def __init__(
|
||||
self, cache_dir: str, format_control: Optional[FormatControl] = None
|
||||
) -> None:
|
||||
if format_control is None:
|
||||
format_control = FormatControl()
|
||||
super().__init__(cache_dir, format_control, {"binary"})
|
||||
self._wheel_cache = SimpleWheelCache(cache_dir, format_control)
|
||||
self._ephem_cache = EphemWheelCache(format_control)
|
||||
|
|
|
@ -151,13 +151,6 @@ class Command(CommandContextMixIn):
|
|||
)
|
||||
options.cache_dir = None
|
||||
|
||||
if "2020-resolver" in options.features_enabled:
|
||||
logger.warning(
|
||||
"--use-feature=2020-resolver no longer has any effect, "
|
||||
"since it is now the default dependency resolver in pip. "
|
||||
"This will become an error in pip 21.0."
|
||||
)
|
||||
|
||||
def intercepts_unhandled_exc(
|
||||
run_func: Callable[..., int]
|
||||
) -> Callable[..., int]:
|
||||
|
|
|
@ -59,31 +59,6 @@ def make_option_group(group: Dict[str, Any], parser: ConfigOptionParser) -> Opti
|
|||
return option_group
|
||||
|
||||
|
||||
def check_install_build_global(
|
||||
options: Values, check_options: Optional[Values] = None
|
||||
) -> None:
|
||||
"""Disable wheels if per-setup.py call options are set.
|
||||
|
||||
:param options: The OptionParser options to update.
|
||||
:param check_options: The options to check, if not supplied defaults to
|
||||
options.
|
||||
"""
|
||||
if check_options is None:
|
||||
check_options = options
|
||||
|
||||
def getname(n: str) -> Optional[Any]:
|
||||
return getattr(check_options, n, None)
|
||||
|
||||
names = ["build_options", "global_options", "install_options"]
|
||||
if any(map(getname, names)):
|
||||
control = options.format_control
|
||||
control.disallow_binaries()
|
||||
logger.warning(
|
||||
"Disabling all use of wheels due to the use of --build-option "
|
||||
"/ --global-option / --install-option.",
|
||||
)
|
||||
|
||||
|
||||
def check_dist_restriction(options: Values, check_target: bool = False) -> None:
|
||||
"""Function for determining if custom platform options are allowed.
|
||||
|
||||
|
@ -189,6 +164,13 @@ require_virtualenv: Callable[..., Option] = partial(
|
|||
),
|
||||
)
|
||||
|
||||
python: Callable[..., Option] = partial(
|
||||
Option,
|
||||
"--python",
|
||||
dest="python",
|
||||
help="Run pip with the specified Python interpreter.",
|
||||
)
|
||||
|
||||
verbose: Callable[..., Option] = partial(
|
||||
Option,
|
||||
"-v",
|
||||
|
@ -1000,7 +982,11 @@ use_new_feature: Callable[..., Option] = partial(
|
|||
metavar="feature",
|
||||
action="append",
|
||||
default=[],
|
||||
choices=["2020-resolver", "fast-deps", "truststore"],
|
||||
choices=[
|
||||
"fast-deps",
|
||||
"truststore",
|
||||
"no-binary-enable-wheel-cache",
|
||||
],
|
||||
help="Enable new functionality, that may be backward incompatible.",
|
||||
)
|
||||
|
||||
|
@ -1029,6 +1015,7 @@ general_group: Dict[str, Any] = {
|
|||
debug_mode,
|
||||
isolated_mode,
|
||||
require_virtualenv,
|
||||
python,
|
||||
verbose,
|
||||
version,
|
||||
quiet,
|
||||
|
|
|
@ -2,9 +2,11 @@
|
|||
"""
|
||||
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
from typing import List, Tuple
|
||||
from typing import List, Optional, Tuple
|
||||
|
||||
from pip._internal.build_env import get_runnable_pip
|
||||
from pip._internal.cli import cmdoptions
|
||||
from pip._internal.cli.parser import ConfigOptionParser, UpdatingDefaultsHelpFormatter
|
||||
from pip._internal.commands import commands_dict, get_similar_commands
|
||||
|
@ -45,6 +47,25 @@ def create_main_parser() -> ConfigOptionParser:
|
|||
return parser
|
||||
|
||||
|
||||
def identify_python_interpreter(python: str) -> Optional[str]:
|
||||
# If the named file exists, use it.
|
||||
# If it's a directory, assume it's a virtual environment and
|
||||
# look for the environment's Python executable.
|
||||
if os.path.exists(python):
|
||||
if os.path.isdir(python):
|
||||
# bin/python for Unix, Scripts/python.exe for Windows
|
||||
# Try both in case of odd cases like cygwin.
|
||||
for exe in ("bin/python", "Scripts/python.exe"):
|
||||
py = os.path.join(python, exe)
|
||||
if os.path.exists(py):
|
||||
return py
|
||||
else:
|
||||
return python
|
||||
|
||||
# Could not find the interpreter specified
|
||||
return None
|
||||
|
||||
|
||||
def parse_command(args: List[str]) -> Tuple[str, List[str]]:
|
||||
parser = create_main_parser()
|
||||
|
||||
|
@ -57,6 +78,32 @@ def parse_command(args: List[str]) -> Tuple[str, List[str]]:
|
|||
# args_else: ['install', '--user', 'INITools']
|
||||
general_options, args_else = parser.parse_args(args)
|
||||
|
||||
# --python
|
||||
if general_options.python and "_PIP_RUNNING_IN_SUBPROCESS" not in os.environ:
|
||||
# Re-invoke pip using the specified Python interpreter
|
||||
interpreter = identify_python_interpreter(general_options.python)
|
||||
if interpreter is None:
|
||||
raise CommandError(
|
||||
f"Could not locate Python interpreter {general_options.python}"
|
||||
)
|
||||
|
||||
pip_cmd = [
|
||||
interpreter,
|
||||
get_runnable_pip(),
|
||||
]
|
||||
pip_cmd.extend(args)
|
||||
|
||||
# Set a flag so the child doesn't re-invoke itself, causing
|
||||
# an infinite loop.
|
||||
os.environ["_PIP_RUNNING_IN_SUBPROCESS"] = "1"
|
||||
returncode = 0
|
||||
try:
|
||||
proc = subprocess.run(pip_cmd)
|
||||
returncode = proc.returncode
|
||||
except (subprocess.SubprocessError, OSError) as exc:
|
||||
raise CommandError(f"Failed to run pip under {interpreter}: {exc}")
|
||||
sys.exit(returncode)
|
||||
|
||||
# --version
|
||||
if general_options.version:
|
||||
sys.stdout.write(parser.version)
|
||||
|
|
|
@ -3,7 +3,7 @@ import itertools
|
|||
import logging
|
||||
import sys
|
||||
import time
|
||||
from typing import IO, Generator
|
||||
from typing import IO, Generator, Optional
|
||||
|
||||
from pip._internal.utils.compat import WINDOWS
|
||||
from pip._internal.utils.logging import get_indentation
|
||||
|
@ -23,7 +23,7 @@ class InteractiveSpinner(SpinnerInterface):
|
|||
def __init__(
|
||||
self,
|
||||
message: str,
|
||||
file: IO[str] = None,
|
||||
file: Optional[IO[str]] = None,
|
||||
spin_chars: str = "-\\|/",
|
||||
# Empirically, 8 updates/second looks nice
|
||||
min_update_interval_seconds: float = 0.125,
|
||||
|
|
|
@ -228,9 +228,15 @@ class ConfigurationCommand(Command):
|
|||
fname = self.configuration.get_file_to_edit()
|
||||
if fname is None:
|
||||
raise PipError("Could not determine appropriate file.")
|
||||
elif '"' in fname:
|
||||
# This shouldn't happen, unless we see a username like that.
|
||||
# If that happens, we'd appreciate a pull request fixing this.
|
||||
raise PipError(
|
||||
f'Can not open an editor for a file name containing "\n{fname}'
|
||||
)
|
||||
|
||||
try:
|
||||
subprocess.check_call([editor, fname])
|
||||
subprocess.check_call(f'{editor} "{fname}"', shell=True)
|
||||
except FileNotFoundError as e:
|
||||
if not e.filename:
|
||||
e.filename = editor
|
||||
|
|
|
@ -8,6 +8,10 @@ from pip._internal.cli.cmdoptions import make_target_python
|
|||
from pip._internal.cli.req_command import RequirementCommand, with_cleanup
|
||||
from pip._internal.cli.status_codes import SUCCESS
|
||||
from pip._internal.operations.build.build_tracker import get_build_tracker
|
||||
from pip._internal.req.req_install import (
|
||||
LegacySetupPyOptionsCheckMode,
|
||||
check_legacy_setup_py_options,
|
||||
)
|
||||
from pip._internal.utils.misc import ensure_dir, normalize_path, write_output
|
||||
from pip._internal.utils.temp_dir import TempDirectory
|
||||
|
||||
|
@ -105,6 +109,9 @@ class DownloadCommand(RequirementCommand):
|
|||
)
|
||||
|
||||
reqs = self.get_requirements(args, options, finder, session)
|
||||
check_legacy_setup_py_options(
|
||||
options, reqs, LegacySetupPyOptionsCheckMode.DOWNLOAD
|
||||
)
|
||||
|
||||
preparer = self.make_requirement_preparer(
|
||||
temp_build_dir=directory,
|
||||
|
|
|
@ -27,8 +27,16 @@ from pip._internal.models.installation_report import InstallationReport
|
|||
from pip._internal.operations.build.build_tracker import get_build_tracker
|
||||
from pip._internal.operations.check import ConflictDetails, check_install_conflicts
|
||||
from pip._internal.req import install_given_reqs
|
||||
from pip._internal.req.req_install import InstallRequirement
|
||||
from pip._internal.req.req_install import (
|
||||
InstallRequirement,
|
||||
LegacySetupPyOptionsCheckMode,
|
||||
check_legacy_setup_py_options,
|
||||
)
|
||||
from pip._internal.utils.compat import WINDOWS
|
||||
from pip._internal.utils.deprecation import (
|
||||
LegacyInstallReasonFailedBdistWheel,
|
||||
deprecated,
|
||||
)
|
||||
from pip._internal.utils.distutils_args import parse_distutils_args
|
||||
from pip._internal.utils.filesystem import test_writable_dir
|
||||
from pip._internal.utils.logging import getLogger
|
||||
|
@ -44,7 +52,7 @@ from pip._internal.utils.virtualenv import (
|
|||
virtualenv_no_global,
|
||||
)
|
||||
from pip._internal.wheel_builder import (
|
||||
BinaryAllowedPredicate,
|
||||
BdistWheelAllowedPredicate,
|
||||
build,
|
||||
should_build_for_install_command,
|
||||
)
|
||||
|
@ -52,7 +60,9 @@ from pip._internal.wheel_builder import (
|
|||
logger = getLogger(__name__)
|
||||
|
||||
|
||||
def get_check_binary_allowed(format_control: FormatControl) -> BinaryAllowedPredicate:
|
||||
def get_check_bdist_wheel_allowed(
|
||||
format_control: FormatControl,
|
||||
) -> BdistWheelAllowedPredicate:
|
||||
def check_binary_allowed(req: InstallRequirement) -> bool:
|
||||
canonical_name = canonicalize_name(req.name or "")
|
||||
allowed_formats = format_control.get_allowed_formats(canonical_name)
|
||||
|
@ -263,7 +273,9 @@ class InstallCommand(RequirementCommand):
|
|||
"the provided requirements. "
|
||||
"Can be used in combination with --dry-run and --ignore-installed "
|
||||
"to 'resolve' the requirements. "
|
||||
"When - is used as file name it writes to stdout."
|
||||
"When - is used as file name it writes to stdout. "
|
||||
"When writing to stdout, please combine with the --quiet option "
|
||||
"to avoid mixing pip logging output with JSON output."
|
||||
),
|
||||
)
|
||||
|
||||
|
@ -272,7 +284,6 @@ class InstallCommand(RequirementCommand):
|
|||
if options.use_user_site and options.target_dir is not None:
|
||||
raise CommandError("Can not combine '--user' and '--target'")
|
||||
|
||||
cmdoptions.check_install_build_global(options)
|
||||
upgrade_strategy = "to-satisfy-only"
|
||||
if options.upgrade:
|
||||
upgrade_strategy = options.upgrade_strategy
|
||||
|
@ -321,8 +332,6 @@ class InstallCommand(RequirementCommand):
|
|||
target_python=target_python,
|
||||
ignore_requires_python=options.ignore_requires_python,
|
||||
)
|
||||
wheel_cache = WheelCache(options.cache_dir, options.format_control)
|
||||
|
||||
build_tracker = self.enter_context(get_build_tracker())
|
||||
|
||||
directory = TempDirectory(
|
||||
|
@ -333,6 +342,28 @@ class InstallCommand(RequirementCommand):
|
|||
|
||||
try:
|
||||
reqs = self.get_requirements(args, options, finder, session)
|
||||
check_legacy_setup_py_options(
|
||||
options, reqs, LegacySetupPyOptionsCheckMode.INSTALL
|
||||
)
|
||||
|
||||
if "no-binary-enable-wheel-cache" in options.features_enabled:
|
||||
# TODO: remove format_control from WheelCache when the deprecation cycle
|
||||
# is over
|
||||
wheel_cache = WheelCache(options.cache_dir)
|
||||
else:
|
||||
if options.format_control.no_binary:
|
||||
deprecated(
|
||||
reason=(
|
||||
"--no-binary currently disables reading from "
|
||||
"the cache of locally built wheels. In the future "
|
||||
"--no-binary will not influence the wheel cache."
|
||||
),
|
||||
replacement="to use the --no-cache-dir option",
|
||||
feature_flag="no-binary-enable-wheel-cache",
|
||||
issue=11453,
|
||||
gone_in="23.1",
|
||||
)
|
||||
wheel_cache = WheelCache(options.cache_dir, options.format_control)
|
||||
|
||||
# Only when installing is it permitted to use PEP 660.
|
||||
# In other circumstances (pip wheel, pip download) we generate
|
||||
|
@ -406,12 +437,14 @@ class InstallCommand(RequirementCommand):
|
|||
modifying_pip = pip_req.satisfied_by is None
|
||||
protect_pip_from_modification_on_windows(modifying_pip=modifying_pip)
|
||||
|
||||
check_binary_allowed = get_check_binary_allowed(finder.format_control)
|
||||
check_bdist_wheel_allowed = get_check_bdist_wheel_allowed(
|
||||
finder.format_control
|
||||
)
|
||||
|
||||
reqs_to_build = [
|
||||
r
|
||||
for r in requirement_set.requirements.values()
|
||||
if should_build_for_install_command(r, check_binary_allowed)
|
||||
if should_build_for_install_command(r, check_bdist_wheel_allowed)
|
||||
]
|
||||
|
||||
_, build_failures = build(
|
||||
|
@ -419,7 +452,7 @@ class InstallCommand(RequirementCommand):
|
|||
wheel_cache=wheel_cache,
|
||||
verify=True,
|
||||
build_options=[],
|
||||
global_options=[],
|
||||
global_options=global_options,
|
||||
)
|
||||
|
||||
# If we're using PEP 517, we cannot do a legacy setup.py install
|
||||
|
@ -440,7 +473,7 @@ class InstallCommand(RequirementCommand):
|
|||
# those.
|
||||
for r in build_failures:
|
||||
if not r.use_pep517:
|
||||
r.legacy_install_reason = 8368
|
||||
r.legacy_install_reason = LegacyInstallReasonFailedBdistWheel
|
||||
|
||||
to_install = resolver.get_installation_order(requirement_set)
|
||||
|
||||
|
|
|
@ -155,6 +155,11 @@ class ListCommand(IndexGroupCommand):
|
|||
if options.outdated and options.uptodate:
|
||||
raise CommandError("Options --outdated and --uptodate cannot be combined.")
|
||||
|
||||
if options.outdated and options.list_format == "freeze":
|
||||
raise CommandError(
|
||||
"List format 'freeze' can not be used with the --outdated option."
|
||||
)
|
||||
|
||||
cmdoptions.check_list_path_option(options)
|
||||
|
||||
skip = set(stdlib_pkgs)
|
||||
|
|
|
@ -10,7 +10,12 @@ from pip._internal.cli.req_command import RequirementCommand, with_cleanup
|
|||
from pip._internal.cli.status_codes import SUCCESS
|
||||
from pip._internal.exceptions import CommandError
|
||||
from pip._internal.operations.build.build_tracker import get_build_tracker
|
||||
from pip._internal.req.req_install import InstallRequirement
|
||||
from pip._internal.req.req_install import (
|
||||
InstallRequirement,
|
||||
LegacySetupPyOptionsCheckMode,
|
||||
check_legacy_setup_py_options,
|
||||
)
|
||||
from pip._internal.utils.deprecation import deprecated
|
||||
from pip._internal.utils.misc import ensure_dir, normalize_path
|
||||
from pip._internal.utils.temp_dir import TempDirectory
|
||||
from pip._internal.wheel_builder import build, should_build_for_wheel_command
|
||||
|
@ -100,8 +105,6 @@ class WheelCommand(RequirementCommand):
|
|||
|
||||
@with_cleanup
|
||||
def run(self, options: Values, args: List[str]) -> int:
|
||||
cmdoptions.check_install_build_global(options)
|
||||
|
||||
session = self.get_default_session(options)
|
||||
|
||||
finder = self._build_package_finder(options, session)
|
||||
|
@ -119,6 +122,28 @@ class WheelCommand(RequirementCommand):
|
|||
)
|
||||
|
||||
reqs = self.get_requirements(args, options, finder, session)
|
||||
check_legacy_setup_py_options(
|
||||
options, reqs, LegacySetupPyOptionsCheckMode.WHEEL
|
||||
)
|
||||
|
||||
if "no-binary-enable-wheel-cache" in options.features_enabled:
|
||||
# TODO: remove format_control from WheelCache when the deprecation cycle
|
||||
# is over
|
||||
wheel_cache = WheelCache(options.cache_dir)
|
||||
else:
|
||||
if options.format_control.no_binary:
|
||||
deprecated(
|
||||
reason=(
|
||||
"--no-binary currently disables reading from "
|
||||
"the cache of locally built wheels. In the future "
|
||||
"--no-binary will not influence the wheel cache."
|
||||
),
|
||||
replacement="to use the --no-cache-dir option",
|
||||
feature_flag="no-binary-enable-wheel-cache",
|
||||
issue=11453,
|
||||
gone_in="23.1",
|
||||
)
|
||||
wheel_cache = WheelCache(options.cache_dir, options.format_control)
|
||||
|
||||
preparer = self.make_requirement_preparer(
|
||||
temp_build_dir=directory,
|
||||
|
|
|
@ -288,7 +288,10 @@ class NetworkConnectionError(PipError):
|
|||
"""HTTP connection error"""
|
||||
|
||||
def __init__(
|
||||
self, error_msg: str, response: Response = None, request: Request = None
|
||||
self,
|
||||
error_msg: str,
|
||||
response: Optional[Response] = None,
|
||||
request: Optional[Request] = None,
|
||||
) -> None:
|
||||
"""
|
||||
Initialize NetworkConnectionError with `request` and `response`
|
||||
|
@ -332,8 +335,8 @@ class MetadataInconsistent(InstallationError):
|
|||
"""Built metadata contains inconsistent information.
|
||||
|
||||
This is raised when the metadata contains values (e.g. name and version)
|
||||
that do not match the information previously obtained from sdist filename
|
||||
or user-supplied ``#egg=`` value.
|
||||
that do not match the information previously obtained from sdist filename,
|
||||
user-supplied ``#egg=`` value, or an install requirement name.
|
||||
"""
|
||||
|
||||
def __init__(
|
||||
|
@ -345,11 +348,10 @@ class MetadataInconsistent(InstallationError):
|
|||
self.m_val = m_val
|
||||
|
||||
def __str__(self) -> str:
|
||||
template = (
|
||||
"Requested {} has inconsistent {}: "
|
||||
"filename has {!r}, but metadata has {!r}"
|
||||
return (
|
||||
f"Requested {self.ireq} has inconsistent {self.field}: "
|
||||
f"expected {self.f_val!r}, but metadata has {self.m_val!r}"
|
||||
)
|
||||
return template.format(self.ireq, self.field, self.f_val, self.m_val)
|
||||
|
||||
|
||||
class LegacyInstallFailure(DiagnosticPipError):
|
||||
|
|
|
@ -9,10 +9,8 @@ import itertools
|
|||
import json
|
||||
import logging
|
||||
import os
|
||||
import re
|
||||
import urllib.parse
|
||||
import urllib.request
|
||||
import xml.etree.ElementTree
|
||||
from html.parser import HTMLParser
|
||||
from optparse import Values
|
||||
from typing import (
|
||||
|
@ -39,7 +37,7 @@ from pip._internal.models.search_scope import SearchScope
|
|||
from pip._internal.network.session import PipSession
|
||||
from pip._internal.network.utils import raise_for_status
|
||||
from pip._internal.utils.filetypes import is_archive_file
|
||||
from pip._internal.utils.misc import pairwise, redact_auth_from_url
|
||||
from pip._internal.utils.misc import redact_auth_from_url
|
||||
from pip._internal.vcs import vcs
|
||||
|
||||
from .sources import CandidatesFromPage, LinkSource, build_source
|
||||
|
@ -51,7 +49,6 @@ else:
|
|||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
HTMLElement = xml.etree.ElementTree.Element
|
||||
ResponseHeaders = MutableMapping[str, str]
|
||||
|
||||
|
||||
|
@ -191,94 +188,6 @@ def _get_encoding_from_headers(headers: ResponseHeaders) -> Optional[str]:
|
|||
return None
|
||||
|
||||
|
||||
def _clean_url_path_part(part: str) -> str:
|
||||
"""
|
||||
Clean a "part" of a URL path (i.e. after splitting on "@" characters).
|
||||
"""
|
||||
# We unquote prior to quoting to make sure nothing is double quoted.
|
||||
return urllib.parse.quote(urllib.parse.unquote(part))
|
||||
|
||||
|
||||
def _clean_file_url_path(part: str) -> str:
|
||||
"""
|
||||
Clean the first part of a URL path that corresponds to a local
|
||||
filesystem path (i.e. the first part after splitting on "@" characters).
|
||||
"""
|
||||
# We unquote prior to quoting to make sure nothing is double quoted.
|
||||
# Also, on Windows the path part might contain a drive letter which
|
||||
# should not be quoted. On Linux where drive letters do not
|
||||
# exist, the colon should be quoted. We rely on urllib.request
|
||||
# to do the right thing here.
|
||||
return urllib.request.pathname2url(urllib.request.url2pathname(part))
|
||||
|
||||
|
||||
# percent-encoded: /
|
||||
_reserved_chars_re = re.compile("(@|%2F)", re.IGNORECASE)
|
||||
|
||||
|
||||
def _clean_url_path(path: str, is_local_path: bool) -> str:
|
||||
"""
|
||||
Clean the path portion of a URL.
|
||||
"""
|
||||
if is_local_path:
|
||||
clean_func = _clean_file_url_path
|
||||
else:
|
||||
clean_func = _clean_url_path_part
|
||||
|
||||
# Split on the reserved characters prior to cleaning so that
|
||||
# revision strings in VCS URLs are properly preserved.
|
||||
parts = _reserved_chars_re.split(path)
|
||||
|
||||
cleaned_parts = []
|
||||
for to_clean, reserved in pairwise(itertools.chain(parts, [""])):
|
||||
cleaned_parts.append(clean_func(to_clean))
|
||||
# Normalize %xx escapes (e.g. %2f -> %2F)
|
||||
cleaned_parts.append(reserved.upper())
|
||||
|
||||
return "".join(cleaned_parts)
|
||||
|
||||
|
||||
def _clean_link(url: str) -> str:
|
||||
"""
|
||||
Make sure a link is fully quoted.
|
||||
For example, if ' ' occurs in the URL, it will be replaced with "%20",
|
||||
and without double-quoting other characters.
|
||||
"""
|
||||
# Split the URL into parts according to the general structure
|
||||
# `scheme://netloc/path;parameters?query#fragment`.
|
||||
result = urllib.parse.urlparse(url)
|
||||
# If the netloc is empty, then the URL refers to a local filesystem path.
|
||||
is_local_path = not result.netloc
|
||||
path = _clean_url_path(result.path, is_local_path=is_local_path)
|
||||
return urllib.parse.urlunparse(result._replace(path=path))
|
||||
|
||||
|
||||
def _create_link_from_element(
|
||||
element_attribs: Dict[str, Optional[str]],
|
||||
page_url: str,
|
||||
base_url: str,
|
||||
) -> Optional[Link]:
|
||||
"""
|
||||
Convert an anchor element's attributes in a simple repository page to a Link.
|
||||
"""
|
||||
href = element_attribs.get("href")
|
||||
if not href:
|
||||
return None
|
||||
|
||||
url = _clean_link(urllib.parse.urljoin(base_url, href))
|
||||
pyrequire = element_attribs.get("data-requires-python")
|
||||
yanked_reason = element_attribs.get("data-yanked")
|
||||
|
||||
link = Link(
|
||||
url,
|
||||
comes_from=page_url,
|
||||
requires_python=pyrequire,
|
||||
yanked_reason=yanked_reason,
|
||||
)
|
||||
|
||||
return link
|
||||
|
||||
|
||||
class CacheablePageContent:
|
||||
def __init__(self, page: "IndexContent") -> None:
|
||||
assert page.cache_link_parsing
|
||||
|
@ -326,25 +235,10 @@ def parse_links(page: "IndexContent") -> Iterable[Link]:
|
|||
if content_type_l.startswith("application/vnd.pypi.simple.v1+json"):
|
||||
data = json.loads(page.content)
|
||||
for file in data.get("files", []):
|
||||
file_url = file.get("url")
|
||||
if file_url is None:
|
||||
link = Link.from_json(file, page.url)
|
||||
if link is None:
|
||||
continue
|
||||
|
||||
# The Link.yanked_reason expects an empty string instead of a boolean.
|
||||
yanked_reason = file.get("yanked")
|
||||
if yanked_reason and not isinstance(yanked_reason, str):
|
||||
yanked_reason = ""
|
||||
# The Link.yanked_reason expects None instead of False
|
||||
elif not yanked_reason:
|
||||
yanked_reason = None
|
||||
|
||||
yield Link(
|
||||
_clean_link(urllib.parse.urljoin(page.url, file_url)),
|
||||
comes_from=page.url,
|
||||
requires_python=file.get("requires-python"),
|
||||
yanked_reason=yanked_reason,
|
||||
hashes=file.get("hashes", {}),
|
||||
)
|
||||
yield link
|
||||
return
|
||||
|
||||
parser = HTMLLinkParser(page.url)
|
||||
|
@ -354,11 +248,7 @@ def parse_links(page: "IndexContent") -> Iterable[Link]:
|
|||
url = page.url
|
||||
base_url = parser.base_url or url
|
||||
for anchor in parser.anchors:
|
||||
link = _create_link_from_element(
|
||||
anchor,
|
||||
page_url=url,
|
||||
base_url=base_url,
|
||||
)
|
||||
link = Link.from_element(anchor, page_url=url, base_url=base_url)
|
||||
if link is None:
|
||||
continue
|
||||
yield link
|
||||
|
@ -443,14 +333,7 @@ def _make_index_content(
|
|||
)
|
||||
|
||||
|
||||
def _get_index_content(
|
||||
link: Link, session: Optional[PipSession] = None
|
||||
) -> Optional["IndexContent"]:
|
||||
if session is None:
|
||||
raise TypeError(
|
||||
"_get_html_page() missing 1 required keyword argument: 'session'"
|
||||
)
|
||||
|
||||
def _get_index_content(link: Link, *, session: PipSession) -> Optional["IndexContent"]:
|
||||
url = link.url.split("#", 1)[0]
|
||||
|
||||
# Check for VCS schemes that do not support lookup as web pages.
|
||||
|
@ -559,6 +442,7 @@ class LinkCollector:
|
|||
search_scope = SearchScope.create(
|
||||
find_links=find_links,
|
||||
index_urls=index_urls,
|
||||
no_index=options.no_index,
|
||||
)
|
||||
link_collector = LinkCollector(
|
||||
session=session,
|
||||
|
|
|
@ -35,10 +35,10 @@ logger = logging.getLogger(__name__)
|
|||
def distutils_scheme(
|
||||
dist_name: str,
|
||||
user: bool = False,
|
||||
home: str = None,
|
||||
root: str = None,
|
||||
home: Optional[str] = None,
|
||||
root: Optional[str] = None,
|
||||
isolated: bool = False,
|
||||
prefix: str = None,
|
||||
prefix: Optional[str] = None,
|
||||
*,
|
||||
ignore_config_files: bool = False,
|
||||
) -> Dict[str, str]:
|
||||
|
|
|
@ -103,3 +103,25 @@ def get_wheel_distribution(wheel: Wheel, canonical_name: str) -> BaseDistributio
|
|||
:param canonical_name: Normalized project name of the given wheel.
|
||||
"""
|
||||
return select_backend().Distribution.from_wheel(wheel, canonical_name)
|
||||
|
||||
|
||||
def get_metadata_distribution(
|
||||
metadata_contents: bytes,
|
||||
filename: str,
|
||||
canonical_name: str,
|
||||
) -> BaseDistribution:
|
||||
"""Get the dist representation of the specified METADATA file contents.
|
||||
|
||||
This returns a Distribution instance from the chosen backend sourced from the data
|
||||
in `metadata_contents`.
|
||||
|
||||
:param metadata_contents: Contents of a METADATA file within a dist, or one served
|
||||
via PEP 658.
|
||||
:param filename: Filename for the dist this metadata represents.
|
||||
:param canonical_name: Normalized project name of the given dist.
|
||||
"""
|
||||
return select_backend().Distribution.from_metadata_file_contents(
|
||||
metadata_contents,
|
||||
filename,
|
||||
canonical_name,
|
||||
)
|
||||
|
|
|
@ -113,6 +113,24 @@ class BaseDistribution(Protocol):
|
|||
"""
|
||||
raise NotImplementedError()
|
||||
|
||||
@classmethod
|
||||
def from_metadata_file_contents(
|
||||
cls,
|
||||
metadata_contents: bytes,
|
||||
filename: str,
|
||||
project_name: str,
|
||||
) -> "BaseDistribution":
|
||||
"""Load the distribution from the contents of a METADATA file.
|
||||
|
||||
This is used to implement PEP 658 by generating a "shallow" dist object that can
|
||||
be used for resolution without downloading or building the actual dist yet.
|
||||
|
||||
:param metadata_contents: The contents of a METADATA file.
|
||||
:param filename: File name for the dist with this metadata.
|
||||
:param project_name: Name of the project this dist represents.
|
||||
"""
|
||||
raise NotImplementedError()
|
||||
|
||||
@classmethod
|
||||
def from_wheel(cls, wheel: "Wheel", name: str) -> "BaseDistribution":
|
||||
"""Load the distribution from a given wheel.
|
||||
|
|
|
@ -2,6 +2,15 @@ import importlib.metadata
|
|||
from typing import Any, Optional, Protocol, cast
|
||||
|
||||
|
||||
class BadMetadata(ValueError):
|
||||
def __init__(self, dist: importlib.metadata.Distribution, *, reason: str) -> None:
|
||||
self.dist = dist
|
||||
self.reason = reason
|
||||
|
||||
def __str__(self) -> str:
|
||||
return f"Bad metadata in {self.dist} ({self.reason})"
|
||||
|
||||
|
||||
class BasePath(Protocol):
|
||||
"""A protocol that various path objects conform.
|
||||
|
||||
|
@ -40,4 +49,7 @@ def get_dist_name(dist: importlib.metadata.Distribution) -> str:
|
|||
The ``name`` attribute is only available in Python 3.10 or later. We are
|
||||
targeting exactly that, but Mypy does not know this.
|
||||
"""
|
||||
return cast(Any, dist).name
|
||||
name = cast(Any, dist).name
|
||||
if not isinstance(name, str):
|
||||
raise BadMetadata(dist, reason="invalid metadata entry 'name'")
|
||||
return name
|
||||
|
|
|
@ -28,6 +28,7 @@ from pip._internal.metadata.base import (
|
|||
)
|
||||
from pip._internal.utils.misc import normalize_path
|
||||
from pip._internal.utils.packaging import safe_extra
|
||||
from pip._internal.utils.temp_dir import TempDirectory
|
||||
from pip._internal.utils.wheel import parse_wheel, read_wheel_metadata_file
|
||||
|
||||
from ._compat import BasePath, get_dist_name
|
||||
|
@ -109,6 +110,23 @@ class Distribution(BaseDistribution):
|
|||
dist = importlib.metadata.Distribution.at(info_location)
|
||||
return cls(dist, info_location, info_location.parent)
|
||||
|
||||
@classmethod
|
||||
def from_metadata_file_contents(
|
||||
cls,
|
||||
metadata_contents: bytes,
|
||||
filename: str,
|
||||
project_name: str,
|
||||
) -> BaseDistribution:
|
||||
# Generate temp dir to contain the metadata file, and write the file contents.
|
||||
temp_dir = pathlib.Path(
|
||||
TempDirectory(kind="metadata", globally_managed=True).path
|
||||
)
|
||||
metadata_path = temp_dir / "METADATA"
|
||||
metadata_path.write_bytes(metadata_contents)
|
||||
# Construct dist pointing to the newly created directory.
|
||||
dist = importlib.metadata.Distribution.at(metadata_path.parent)
|
||||
return cls(dist, metadata_path.parent, None)
|
||||
|
||||
@classmethod
|
||||
def from_wheel(cls, wheel: Wheel, name: str) -> BaseDistribution:
|
||||
try:
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
import functools
|
||||
import importlib.metadata
|
||||
import logging
|
||||
import os
|
||||
import pathlib
|
||||
import sys
|
||||
|
@ -14,9 +15,11 @@ from pip._internal.models.wheel import Wheel
|
|||
from pip._internal.utils.deprecation import deprecated
|
||||
from pip._internal.utils.filetypes import WHEEL_EXTENSION
|
||||
|
||||
from ._compat import BasePath, get_dist_name, get_info_location
|
||||
from ._compat import BadMetadata, BasePath, get_dist_name, get_info_location
|
||||
from ._dists import Distribution
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def _looks_like_wheel(location: str) -> bool:
|
||||
if not location.endswith(WHEEL_EXTENSION):
|
||||
|
@ -56,11 +59,16 @@ class _DistributionFinder:
|
|||
# To know exactly where we find a distribution, we have to feed in the
|
||||
# paths one by one, instead of dumping the list to importlib.metadata.
|
||||
for dist in importlib.metadata.distributions(path=[location]):
|
||||
normalized_name = canonicalize_name(get_dist_name(dist))
|
||||
info_location = get_info_location(dist)
|
||||
try:
|
||||
raw_name = get_dist_name(dist)
|
||||
except BadMetadata as e:
|
||||
logger.warning("Skipping %s due to %s", info_location, e.reason)
|
||||
continue
|
||||
normalized_name = canonicalize_name(raw_name)
|
||||
if normalized_name in self._found_names:
|
||||
continue
|
||||
self._found_names.add(normalized_name)
|
||||
info_location = get_info_location(dist)
|
||||
yield dist, info_location
|
||||
|
||||
def find(self, location: str) -> Iterator[BaseDistribution]:
|
||||
|
|
|
@ -33,7 +33,7 @@ class EntryPoint(NamedTuple):
|
|||
group: str
|
||||
|
||||
|
||||
class WheelMetadata:
|
||||
class InMemoryMetadata:
|
||||
"""IMetadataProvider that reads metadata files from a dictionary.
|
||||
|
||||
This also maps metadata decoding exceptions to our internal exception type.
|
||||
|
@ -92,12 +92,29 @@ class Distribution(BaseDistribution):
|
|||
dist = dist_cls(base_dir, project_name=dist_name, metadata=metadata)
|
||||
return cls(dist)
|
||||
|
||||
@classmethod
|
||||
def from_metadata_file_contents(
|
||||
cls,
|
||||
metadata_contents: bytes,
|
||||
filename: str,
|
||||
project_name: str,
|
||||
) -> BaseDistribution:
|
||||
metadata_dict = {
|
||||
"METADATA": metadata_contents,
|
||||
}
|
||||
dist = pkg_resources.DistInfoDistribution(
|
||||
location=filename,
|
||||
metadata=InMemoryMetadata(metadata_dict, filename),
|
||||
project_name=project_name,
|
||||
)
|
||||
return cls(dist)
|
||||
|
||||
@classmethod
|
||||
def from_wheel(cls, wheel: Wheel, name: str) -> BaseDistribution:
|
||||
try:
|
||||
with wheel.as_zipfile() as zf:
|
||||
info_dir, _ = parse_wheel(zf, name)
|
||||
metadata_text = {
|
||||
metadata_dict = {
|
||||
path.split("/", 1)[-1]: read_wheel_metadata_file(zf, path)
|
||||
for path in zf.namelist()
|
||||
if path.startswith(f"{info_dir}/")
|
||||
|
@ -108,7 +125,7 @@ class Distribution(BaseDistribution):
|
|||
raise UnsupportedWheel(f"{name} has an invalid wheel, {e}")
|
||||
dist = pkg_resources.DistInfoDistribution(
|
||||
location=wheel.location,
|
||||
metadata=WheelMetadata(metadata_text, wheel.location),
|
||||
metadata=InMemoryMetadata(metadata_dict, wheel.location),
|
||||
project_name=name,
|
||||
)
|
||||
return cls(dist)
|
||||
|
|
|
@ -1,11 +1,14 @@
|
|||
import functools
|
||||
import itertools
|
||||
import logging
|
||||
import os
|
||||
import posixpath
|
||||
import re
|
||||
import urllib.parse
|
||||
from dataclasses import dataclass
|
||||
from typing import (
|
||||
TYPE_CHECKING,
|
||||
Any,
|
||||
Dict,
|
||||
List,
|
||||
Mapping,
|
||||
|
@ -18,6 +21,7 @@ from typing import (
|
|||
from pip._internal.utils.filetypes import WHEEL_EXTENSION
|
||||
from pip._internal.utils.hashes import Hashes
|
||||
from pip._internal.utils.misc import (
|
||||
pairwise,
|
||||
redact_auth_from_url,
|
||||
split_auth_from_netloc,
|
||||
splitext,
|
||||
|
@ -36,6 +40,119 @@ logger = logging.getLogger(__name__)
|
|||
_SUPPORTED_HASHES = ("sha512", "sha384", "sha256", "sha224", "sha1", "md5")
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class LinkHash:
|
||||
"""Links to content may have embedded hash values. This class parses those.
|
||||
|
||||
`name` must be any member of `_SUPPORTED_HASHES`.
|
||||
|
||||
This class can be converted to and from `ArchiveInfo`. While ArchiveInfo intends to
|
||||
be JSON-serializable to conform to PEP 610, this class contains the logic for
|
||||
parsing a hash name and value for correctness, and then checking whether that hash
|
||||
conforms to a schema with `.is_hash_allowed()`."""
|
||||
|
||||
name: str
|
||||
value: str
|
||||
|
||||
_hash_re = re.compile(
|
||||
# NB: we do not validate that the second group (.*) is a valid hex
|
||||
# digest. Instead, we simply keep that string in this class, and then check it
|
||||
# against Hashes when hash-checking is needed. This is easier to debug than
|
||||
# proactively discarding an invalid hex digest, as we handle incorrect hashes
|
||||
# and malformed hashes in the same place.
|
||||
r"({choices})=(.*)".format(
|
||||
choices="|".join(re.escape(hash_name) for hash_name in _SUPPORTED_HASHES)
|
||||
),
|
||||
)
|
||||
|
||||
def __post_init__(self) -> None:
|
||||
assert self._hash_re.match(f"{self.name}={self.value}")
|
||||
|
||||
@classmethod
|
||||
@functools.lru_cache(maxsize=None)
|
||||
def split_hash_name_and_value(cls, url: str) -> Optional["LinkHash"]:
|
||||
"""Search a string for a checksum algorithm name and encoded output value."""
|
||||
match = cls._hash_re.search(url)
|
||||
if match is None:
|
||||
return None
|
||||
name, value = match.groups()
|
||||
return cls(name=name, value=value)
|
||||
|
||||
def as_hashes(self) -> Hashes:
|
||||
"""Return a Hashes instance which checks only for the current hash."""
|
||||
return Hashes({self.name: [self.value]})
|
||||
|
||||
def is_hash_allowed(self, hashes: Optional[Hashes]) -> bool:
|
||||
"""
|
||||
Return True if the current hash is allowed by `hashes`.
|
||||
"""
|
||||
if hashes is None:
|
||||
return False
|
||||
return hashes.is_hash_allowed(self.name, hex_digest=self.value)
|
||||
|
||||
|
||||
def _clean_url_path_part(part: str) -> str:
|
||||
"""
|
||||
Clean a "part" of a URL path (i.e. after splitting on "@" characters).
|
||||
"""
|
||||
# We unquote prior to quoting to make sure nothing is double quoted.
|
||||
return urllib.parse.quote(urllib.parse.unquote(part))
|
||||
|
||||
|
||||
def _clean_file_url_path(part: str) -> str:
|
||||
"""
|
||||
Clean the first part of a URL path that corresponds to a local
|
||||
filesystem path (i.e. the first part after splitting on "@" characters).
|
||||
"""
|
||||
# We unquote prior to quoting to make sure nothing is double quoted.
|
||||
# Also, on Windows the path part might contain a drive letter which
|
||||
# should not be quoted. On Linux where drive letters do not
|
||||
# exist, the colon should be quoted. We rely on urllib.request
|
||||
# to do the right thing here.
|
||||
return urllib.request.pathname2url(urllib.request.url2pathname(part))
|
||||
|
||||
|
||||
# percent-encoded: /
|
||||
_reserved_chars_re = re.compile("(@|%2F)", re.IGNORECASE)
|
||||
|
||||
|
||||
def _clean_url_path(path: str, is_local_path: bool) -> str:
|
||||
"""
|
||||
Clean the path portion of a URL.
|
||||
"""
|
||||
if is_local_path:
|
||||
clean_func = _clean_file_url_path
|
||||
else:
|
||||
clean_func = _clean_url_path_part
|
||||
|
||||
# Split on the reserved characters prior to cleaning so that
|
||||
# revision strings in VCS URLs are properly preserved.
|
||||
parts = _reserved_chars_re.split(path)
|
||||
|
||||
cleaned_parts = []
|
||||
for to_clean, reserved in pairwise(itertools.chain(parts, [""])):
|
||||
cleaned_parts.append(clean_func(to_clean))
|
||||
# Normalize %xx escapes (e.g. %2f -> %2F)
|
||||
cleaned_parts.append(reserved.upper())
|
||||
|
||||
return "".join(cleaned_parts)
|
||||
|
||||
|
||||
def _ensure_quoted_url(url: str) -> str:
|
||||
"""
|
||||
Make sure a link is fully quoted.
|
||||
For example, if ' ' occurs in the URL, it will be replaced with "%20",
|
||||
and without double-quoting other characters.
|
||||
"""
|
||||
# Split the URL into parts according to the general structure
|
||||
# `scheme://netloc/path;parameters?query#fragment`.
|
||||
result = urllib.parse.urlparse(url)
|
||||
# If the netloc is empty, then the URL refers to a local filesystem path.
|
||||
is_local_path = not result.netloc
|
||||
path = _clean_url_path(result.path, is_local_path=is_local_path)
|
||||
return urllib.parse.urlunparse(result._replace(path=path))
|
||||
|
||||
|
||||
class Link(KeyBasedCompareMixin):
|
||||
"""Represents a parsed link from a Package Index's simple URL"""
|
||||
|
||||
|
@ -46,6 +163,8 @@ class Link(KeyBasedCompareMixin):
|
|||
"comes_from",
|
||||
"requires_python",
|
||||
"yanked_reason",
|
||||
"dist_info_metadata",
|
||||
"link_hash",
|
||||
"cache_link_parsing",
|
||||
]
|
||||
|
||||
|
@ -55,6 +174,8 @@ class Link(KeyBasedCompareMixin):
|
|||
comes_from: Optional[Union[str, "IndexContent"]] = None,
|
||||
requires_python: Optional[str] = None,
|
||||
yanked_reason: Optional[str] = None,
|
||||
dist_info_metadata: Optional[str] = None,
|
||||
link_hash: Optional[LinkHash] = None,
|
||||
cache_link_parsing: bool = True,
|
||||
hashes: Optional[Mapping[str, str]] = None,
|
||||
) -> None:
|
||||
|
@ -72,6 +193,14 @@ class Link(KeyBasedCompareMixin):
|
|||
a simple repository HTML link. If the file has been yanked but
|
||||
no reason was provided, this should be the empty string. See
|
||||
PEP 592 for more information and the specification.
|
||||
:param dist_info_metadata: the metadata attached to the file, or None if no such
|
||||
metadata is provided. This is the value of the "data-dist-info-metadata"
|
||||
attribute, if present, in a simple repository HTML link. This may be parsed
|
||||
into its own `Link` by `self.metadata_link()`. See PEP 658 for more
|
||||
information and the specification.
|
||||
:param link_hash: a checksum for the content the link points to. If not
|
||||
provided, this will be extracted from the link URL, if the URL has
|
||||
any checksum.
|
||||
:param cache_link_parsing: A flag that is used elsewhere to determine
|
||||
whether resources retrieved from this link
|
||||
should be cached. PyPI index urls should
|
||||
|
@ -94,11 +223,75 @@ class Link(KeyBasedCompareMixin):
|
|||
self.comes_from = comes_from
|
||||
self.requires_python = requires_python if requires_python else None
|
||||
self.yanked_reason = yanked_reason
|
||||
self.dist_info_metadata = dist_info_metadata
|
||||
self.link_hash = link_hash or LinkHash.split_hash_name_and_value(self._url)
|
||||
|
||||
super().__init__(key=url, defining_class=Link)
|
||||
|
||||
self.cache_link_parsing = cache_link_parsing
|
||||
|
||||
@classmethod
|
||||
def from_json(
|
||||
cls,
|
||||
file_data: Dict[str, Any],
|
||||
page_url: str,
|
||||
) -> Optional["Link"]:
|
||||
"""
|
||||
Convert an pypi json document from a simple repository page into a Link.
|
||||
"""
|
||||
file_url = file_data.get("url")
|
||||
if file_url is None:
|
||||
return None
|
||||
|
||||
url = _ensure_quoted_url(urllib.parse.urljoin(page_url, file_url))
|
||||
pyrequire = file_data.get("requires-python")
|
||||
yanked_reason = file_data.get("yanked")
|
||||
dist_info_metadata = file_data.get("dist-info-metadata")
|
||||
hashes = file_data.get("hashes", {})
|
||||
|
||||
# The Link.yanked_reason expects an empty string instead of a boolean.
|
||||
if yanked_reason and not isinstance(yanked_reason, str):
|
||||
yanked_reason = ""
|
||||
# The Link.yanked_reason expects None instead of False.
|
||||
elif not yanked_reason:
|
||||
yanked_reason = None
|
||||
|
||||
return cls(
|
||||
url,
|
||||
comes_from=page_url,
|
||||
requires_python=pyrequire,
|
||||
yanked_reason=yanked_reason,
|
||||
hashes=hashes,
|
||||
dist_info_metadata=dist_info_metadata,
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def from_element(
|
||||
cls,
|
||||
anchor_attribs: Dict[str, Optional[str]],
|
||||
page_url: str,
|
||||
base_url: str,
|
||||
) -> Optional["Link"]:
|
||||
"""
|
||||
Convert an anchor element's attributes in a simple repository page to a Link.
|
||||
"""
|
||||
href = anchor_attribs.get("href")
|
||||
if not href:
|
||||
return None
|
||||
|
||||
url = _ensure_quoted_url(urllib.parse.urljoin(base_url, href))
|
||||
pyrequire = anchor_attribs.get("data-requires-python")
|
||||
yanked_reason = anchor_attribs.get("data-yanked")
|
||||
dist_info_metadata = anchor_attribs.get("data-dist-info-metadata")
|
||||
|
||||
return cls(
|
||||
url,
|
||||
comes_from=page_url,
|
||||
requires_python=pyrequire,
|
||||
yanked_reason=yanked_reason,
|
||||
dist_info_metadata=dist_info_metadata,
|
||||
)
|
||||
|
||||
def __str__(self) -> str:
|
||||
if self.requires_python:
|
||||
rp = f" (requires-python:{self.requires_python})"
|
||||
|
@ -181,32 +374,36 @@ class Link(KeyBasedCompareMixin):
|
|||
return None
|
||||
return match.group(1)
|
||||
|
||||
_hash_re = re.compile(
|
||||
r"({choices})=([a-f0-9]+)".format(choices="|".join(_SUPPORTED_HASHES))
|
||||
)
|
||||
def metadata_link(self) -> Optional["Link"]:
|
||||
"""Implementation of PEP 658 parsing."""
|
||||
# Note that Link.from_element() parsing the "data-dist-info-metadata" attribute
|
||||
# from an HTML anchor tag is typically how the Link.dist_info_metadata attribute
|
||||
# gets set.
|
||||
if self.dist_info_metadata is None:
|
||||
return None
|
||||
metadata_url = f"{self.url_without_fragment}.metadata"
|
||||
link_hash: Optional[LinkHash] = None
|
||||
# If data-dist-info-metadata="true" is set, then the metadata file exists,
|
||||
# but there is no information about its checksum or anything else.
|
||||
if self.dist_info_metadata != "true":
|
||||
link_hash = LinkHash.split_hash_name_and_value(self.dist_info_metadata)
|
||||
return Link(metadata_url, link_hash=link_hash)
|
||||
|
||||
def as_hashes(self) -> Optional[Hashes]:
|
||||
if self.link_hash is not None:
|
||||
return self.link_hash.as_hashes()
|
||||
return None
|
||||
|
||||
@property
|
||||
def hash(self) -> Optional[str]:
|
||||
for hashname in _SUPPORTED_HASHES:
|
||||
if hashname in self._hashes:
|
||||
return self._hashes[hashname]
|
||||
|
||||
match = self._hash_re.search(self._url)
|
||||
if match:
|
||||
return match.group(2)
|
||||
|
||||
if self.link_hash is not None:
|
||||
return self.link_hash.value
|
||||
return None
|
||||
|
||||
@property
|
||||
def hash_name(self) -> Optional[str]:
|
||||
for hashname in _SUPPORTED_HASHES:
|
||||
if hashname in self._hashes:
|
||||
return hashname
|
||||
|
||||
match = self._hash_re.search(self._url)
|
||||
if match:
|
||||
return match.group(1)
|
||||
|
||||
if self.link_hash is not None:
|
||||
return self.link_hash.name
|
||||
return None
|
||||
|
||||
@property
|
||||
|
@ -236,19 +433,15 @@ class Link(KeyBasedCompareMixin):
|
|||
|
||||
@property
|
||||
def has_hash(self) -> bool:
|
||||
return self.hash_name is not None
|
||||
return self.link_hash is not None
|
||||
|
||||
def is_hash_allowed(self, hashes: Optional[Hashes]) -> bool:
|
||||
"""
|
||||
Return True if the link has a hash and it is allowed.
|
||||
Return True if the link has a hash and it is allowed by `hashes`.
|
||||
"""
|
||||
if hashes is None or not self.has_hash:
|
||||
if self.link_hash is None:
|
||||
return False
|
||||
# Assert non-None so mypy knows self.hash_name and self.hash are str.
|
||||
assert self.hash_name is not None
|
||||
assert self.hash is not None
|
||||
|
||||
return hashes.is_hash_allowed(self.hash_name, hex_digest=self.hash)
|
||||
return self.link_hash.is_hash_allowed(hashes)
|
||||
|
||||
|
||||
class _CleanResult(NamedTuple):
|
||||
|
|
|
@ -20,13 +20,14 @@ class SearchScope:
|
|||
Encapsulates the locations that pip is configured to search.
|
||||
"""
|
||||
|
||||
__slots__ = ["find_links", "index_urls"]
|
||||
__slots__ = ["find_links", "index_urls", "no_index"]
|
||||
|
||||
@classmethod
|
||||
def create(
|
||||
cls,
|
||||
find_links: List[str],
|
||||
index_urls: List[str],
|
||||
no_index: bool,
|
||||
) -> "SearchScope":
|
||||
"""
|
||||
Create a SearchScope object after normalizing the `find_links`.
|
||||
|
@ -60,15 +61,18 @@ class SearchScope:
|
|||
return cls(
|
||||
find_links=built_find_links,
|
||||
index_urls=index_urls,
|
||||
no_index=no_index,
|
||||
)
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
find_links: List[str],
|
||||
index_urls: List[str],
|
||||
no_index: bool,
|
||||
) -> None:
|
||||
self.find_links = find_links
|
||||
self.index_urls = index_urls
|
||||
self.no_index = no_index
|
||||
|
||||
def get_formatted_locations(self) -> str:
|
||||
lines = []
|
||||
|
|
|
@ -13,8 +13,8 @@ class Wheel:
|
|||
"""A wheel file"""
|
||||
|
||||
wheel_file_re = re.compile(
|
||||
r"""^(?P<namever>(?P<name>.+?)-(?P<ver>.*?))
|
||||
((-(?P<build>\d[^-]*?))?-(?P<pyver>.+?)-(?P<abi>.+?)-(?P<plat>.+?)
|
||||
r"""^(?P<namever>(?P<name>[^\s-]+?)-(?P<ver>[^\s-]*?))
|
||||
((-(?P<build>\d[^-]*?))?-(?P<pyver>[^\s-]+?)-(?P<abi>[^\s-]+?)-(?P<plat>[^\s-]+?)
|
||||
\.whl|\.dist-info)$""",
|
||||
re.VERBOSE,
|
||||
)
|
||||
|
|
|
@ -23,7 +23,7 @@ class HTTPRangeRequestUnsupported(Exception):
|
|||
def dist_from_wheel_url(name: str, url: str, session: PipSession) -> BaseDistribution:
|
||||
"""Return a distribution object from the given wheel URL.
|
||||
|
||||
This uses HTTP range requests to only fetch the potion of the wheel
|
||||
This uses HTTP range requests to only fetch the portion of the wheel
|
||||
containing metadata, just enough for the object to be constructed.
|
||||
If such requests are not supported, HTTPRangeRequestUnsupported
|
||||
is raised.
|
||||
|
|
|
@ -420,7 +420,9 @@ def _raise_for_invalid_entrypoint(specification: str) -> None:
|
|||
|
||||
|
||||
class PipScriptMaker(ScriptMaker):
|
||||
def make(self, specification: str, options: Dict[str, Any] = None) -> List[str]:
|
||||
def make(
|
||||
self, specification: str, options: Optional[Dict[str, Any]] = None
|
||||
) -> List[str]:
|
||||
_raise_for_invalid_entrypoint(specification)
|
||||
return super().make(specification, options)
|
||||
|
||||
|
|
|
@ -19,12 +19,13 @@ from pip._internal.exceptions import (
|
|||
HashMismatch,
|
||||
HashUnpinned,
|
||||
InstallationError,
|
||||
MetadataInconsistent,
|
||||
NetworkConnectionError,
|
||||
PreviousBuildDirError,
|
||||
VcsHashUnsupported,
|
||||
)
|
||||
from pip._internal.index.package_finder import PackageFinder
|
||||
from pip._internal.metadata import BaseDistribution
|
||||
from pip._internal.metadata import BaseDistribution, get_metadata_distribution
|
||||
from pip._internal.models.direct_url import ArchiveInfo
|
||||
from pip._internal.models.link import Link
|
||||
from pip._internal.models.wheel import Wheel
|
||||
|
@ -346,19 +347,72 @@ class RequirementPreparer:
|
|||
# showing the user what the hash should be.
|
||||
return req.hashes(trust_internet=False) or MissingHashes()
|
||||
|
||||
def _fetch_metadata_only(
|
||||
self,
|
||||
req: InstallRequirement,
|
||||
) -> Optional[BaseDistribution]:
|
||||
if self.require_hashes:
|
||||
logger.debug(
|
||||
"Metadata-only fetching is not used as hash checking is required",
|
||||
)
|
||||
return None
|
||||
# Try PEP 658 metadata first, then fall back to lazy wheel if unavailable.
|
||||
return self._fetch_metadata_using_link_data_attr(
|
||||
req
|
||||
) or self._fetch_metadata_using_lazy_wheel(req.link)
|
||||
|
||||
def _fetch_metadata_using_link_data_attr(
|
||||
self,
|
||||
req: InstallRequirement,
|
||||
) -> Optional[BaseDistribution]:
|
||||
"""Fetch metadata from the data-dist-info-metadata attribute, if possible."""
|
||||
# (1) Get the link to the metadata file, if provided by the backend.
|
||||
metadata_link = req.link.metadata_link()
|
||||
if metadata_link is None:
|
||||
return None
|
||||
assert req.req is not None
|
||||
logger.info(
|
||||
"Obtaining dependency information for %s from %s",
|
||||
req.req,
|
||||
metadata_link,
|
||||
)
|
||||
# (2) Download the contents of the METADATA file, separate from the dist itself.
|
||||
metadata_file = get_http_url(
|
||||
metadata_link,
|
||||
self._download,
|
||||
hashes=metadata_link.as_hashes(),
|
||||
)
|
||||
with open(metadata_file.path, "rb") as f:
|
||||
metadata_contents = f.read()
|
||||
# (3) Generate a dist just from those file contents.
|
||||
metadata_dist = get_metadata_distribution(
|
||||
metadata_contents,
|
||||
req.link.filename,
|
||||
req.req.name,
|
||||
)
|
||||
# (4) Ensure the Name: field from the METADATA file matches the name from the
|
||||
# install requirement.
|
||||
#
|
||||
# NB: raw_name will fall back to the name from the install requirement if
|
||||
# the Name: field is not present, but it's noted in the raw_name docstring
|
||||
# that that should NEVER happen anyway.
|
||||
if metadata_dist.raw_name != req.req.name:
|
||||
raise MetadataInconsistent(
|
||||
req, "Name", req.req.name, metadata_dist.raw_name
|
||||
)
|
||||
return metadata_dist
|
||||
|
||||
def _fetch_metadata_using_lazy_wheel(
|
||||
self,
|
||||
link: Link,
|
||||
) -> Optional[BaseDistribution]:
|
||||
"""Fetch metadata using lazy wheel, if possible."""
|
||||
# --use-feature=fast-deps must be provided.
|
||||
if not self.use_lazy_wheel:
|
||||
return None
|
||||
if self.require_hashes:
|
||||
logger.debug("Lazy wheel is not used as hash checking is required")
|
||||
return None
|
||||
if link.is_file or not link.is_wheel:
|
||||
logger.debug(
|
||||
"Lazy wheel is not used as %r does not points to a remote wheel",
|
||||
"Lazy wheel is not used as %r does not point to a remote wheel",
|
||||
link,
|
||||
)
|
||||
return None
|
||||
|
@ -414,13 +468,12 @@ class RequirementPreparer:
|
|||
) -> BaseDistribution:
|
||||
"""Prepare a requirement to be obtained from req.link."""
|
||||
assert req.link
|
||||
link = req.link
|
||||
self._log_preparing_link(req)
|
||||
with indent_log():
|
||||
# Check if the relevant file is already available
|
||||
# in the download directory
|
||||
file_path = None
|
||||
if self.download_dir is not None and link.is_wheel:
|
||||
if self.download_dir is not None and req.link.is_wheel:
|
||||
hashes = self._get_linked_req_hashes(req)
|
||||
file_path = _check_download_dir(req.link, self.download_dir, hashes)
|
||||
|
||||
|
@ -429,10 +482,10 @@ class RequirementPreparer:
|
|||
self._downloaded[req.link.url] = file_path
|
||||
else:
|
||||
# The file is not available, attempt to fetch only metadata
|
||||
wheel_dist = self._fetch_metadata_using_lazy_wheel(link)
|
||||
if wheel_dist is not None:
|
||||
metadata_dist = self._fetch_metadata_only(req)
|
||||
if metadata_dist is not None:
|
||||
req.needs_more_preparation = True
|
||||
return wheel_dist
|
||||
return metadata_dist
|
||||
|
||||
# None of the optimizations worked, fully prepare the requirement
|
||||
return self._prepare_linked_requirement(req, parallel_builds)
|
||||
|
|
|
@ -186,10 +186,6 @@ def handle_requirement_line(
|
|||
constraint=line.constraint,
|
||||
)
|
||||
else:
|
||||
if options:
|
||||
# Disable wheels if the user has specified build options
|
||||
cmdoptions.check_install_build_global(options, line.opts)
|
||||
|
||||
# get the options that apply to requirements
|
||||
req_options = {}
|
||||
for dest in SUPPORTED_OPTIONS_REQ_DEST:
|
||||
|
@ -229,11 +225,13 @@ def handle_option_line(
|
|||
if finder:
|
||||
find_links = finder.find_links
|
||||
index_urls = finder.index_urls
|
||||
if opts.index_url:
|
||||
index_urls = [opts.index_url]
|
||||
no_index = finder.search_scope.no_index
|
||||
if opts.no_index is True:
|
||||
no_index = True
|
||||
index_urls = []
|
||||
if opts.extra_index_urls:
|
||||
if opts.index_url and not no_index:
|
||||
index_urls = [opts.index_url]
|
||||
if opts.extra_index_urls and not no_index:
|
||||
index_urls.extend(opts.extra_index_urls)
|
||||
if opts.find_links:
|
||||
# FIXME: it would be nice to keep track of the source
|
||||
|
@ -253,6 +251,7 @@ def handle_option_line(
|
|||
search_scope = SearchScope(
|
||||
find_links=find_links,
|
||||
index_urls=index_urls,
|
||||
no_index=no_index,
|
||||
)
|
||||
finder.search_scope = search_scope
|
||||
|
||||
|
@ -394,7 +393,12 @@ def get_line_parser(finder: Optional["PackageFinder"]) -> LineParser:
|
|||
|
||||
args_str, options_str = break_args_options(line)
|
||||
|
||||
opts, _ = parser.parse_args(shlex.split(options_str), defaults)
|
||||
try:
|
||||
options = shlex.split(options_str)
|
||||
except ValueError as e:
|
||||
raise OptionParsingError(f"Could not split options: {options_str}") from e
|
||||
|
||||
opts, _ = parser.parse_args(options, defaults)
|
||||
|
||||
return args_str, opts
|
||||
|
||||
|
|
|
@ -8,6 +8,8 @@ import shutil
|
|||
import sys
|
||||
import uuid
|
||||
import zipfile
|
||||
from enum import Enum
|
||||
from optparse import Values
|
||||
from typing import Any, Collection, Dict, Iterable, List, Optional, Sequence, Union
|
||||
|
||||
from pip._vendor.packaging.markers import Marker
|
||||
|
@ -42,7 +44,7 @@ from pip._internal.operations.install.legacy import install as install_legacy
|
|||
from pip._internal.operations.install.wheel import install_wheel
|
||||
from pip._internal.pyproject import load_pyproject_toml, make_pyproject_path
|
||||
from pip._internal.req.req_uninstall import UninstallPathSet
|
||||
from pip._internal.utils.deprecation import deprecated
|
||||
from pip._internal.utils.deprecation import LegacyInstallReason, deprecated
|
||||
from pip._internal.utils.direct_url_helpers import (
|
||||
direct_url_for_editable,
|
||||
direct_url_from_link,
|
||||
|
@ -96,7 +98,7 @@ class InstallRequirement:
|
|||
self.constraint = constraint
|
||||
self.editable = editable
|
||||
self.permit_editable_wheels = permit_editable_wheels
|
||||
self.legacy_install_reason: Optional[int] = None
|
||||
self.legacy_install_reason: Optional[LegacyInstallReason] = None
|
||||
|
||||
# source_dir is the local directory where the linked requirement is
|
||||
# located, or unpacked. In case unpacking is needed, creating and
|
||||
|
@ -811,6 +813,11 @@ class InstallRequirement:
|
|||
install_options = list(install_options) + self.install_options
|
||||
|
||||
try:
|
||||
if (
|
||||
self.legacy_install_reason is not None
|
||||
and self.legacy_install_reason.emit_before_install
|
||||
):
|
||||
self.legacy_install_reason.emit_deprecation(self.name)
|
||||
success = install_legacy(
|
||||
install_options=install_options,
|
||||
global_options=global_options,
|
||||
|
@ -836,18 +843,12 @@ class InstallRequirement:
|
|||
|
||||
self.install_succeeded = success
|
||||
|
||||
if success and self.legacy_install_reason == 8368:
|
||||
deprecated(
|
||||
reason=(
|
||||
"{} was installed using the legacy 'setup.py install' "
|
||||
"method, because a wheel could not be built for it.".format(
|
||||
self.name
|
||||
)
|
||||
),
|
||||
replacement="to fix the wheel build issue reported above",
|
||||
gone_in=None,
|
||||
issue=8368,
|
||||
)
|
||||
if (
|
||||
success
|
||||
and self.legacy_install_reason is not None
|
||||
and self.legacy_install_reason.emit_after_success
|
||||
):
|
||||
self.legacy_install_reason.emit_deprecation(self.name)
|
||||
|
||||
|
||||
def check_invalid_constraint_type(req: InstallRequirement) -> str:
|
||||
|
@ -877,3 +878,65 @@ def check_invalid_constraint_type(req: InstallRequirement) -> str:
|
|||
)
|
||||
|
||||
return problem
|
||||
|
||||
|
||||
def _has_option(options: Values, reqs: List[InstallRequirement], option: str) -> bool:
|
||||
if getattr(options, option, None):
|
||||
return True
|
||||
for req in reqs:
|
||||
if getattr(req, option, None):
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def _install_option_ignored(
|
||||
install_options: List[str], reqs: List[InstallRequirement]
|
||||
) -> bool:
|
||||
for req in reqs:
|
||||
if (install_options or req.install_options) and not req.use_pep517:
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
class LegacySetupPyOptionsCheckMode(Enum):
|
||||
INSTALL = 1
|
||||
WHEEL = 2
|
||||
DOWNLOAD = 3
|
||||
|
||||
|
||||
def check_legacy_setup_py_options(
|
||||
options: Values,
|
||||
reqs: List[InstallRequirement],
|
||||
mode: LegacySetupPyOptionsCheckMode,
|
||||
) -> None:
|
||||
has_install_options = _has_option(options, reqs, "install_options")
|
||||
has_build_options = _has_option(options, reqs, "build_options")
|
||||
has_global_options = _has_option(options, reqs, "global_options")
|
||||
legacy_setup_py_options_present = (
|
||||
has_install_options or has_build_options or has_global_options
|
||||
)
|
||||
if not legacy_setup_py_options_present:
|
||||
return
|
||||
|
||||
options.format_control.disallow_binaries()
|
||||
logger.warning(
|
||||
"Implying --no-binary=:all: due to the presence of "
|
||||
"--build-option / --global-option / --install-option. "
|
||||
"Consider using --config-settings for more flexibility.",
|
||||
)
|
||||
if mode == LegacySetupPyOptionsCheckMode.INSTALL and has_install_options:
|
||||
if _install_option_ignored(options.install_options, reqs):
|
||||
logger.warning(
|
||||
"Ignoring --install-option when building using PEP 517",
|
||||
)
|
||||
else:
|
||||
deprecated(
|
||||
reason=(
|
||||
"--install-option is deprecated because "
|
||||
"it forces pip to use the 'setup.py install' "
|
||||
"command which is itself deprecated."
|
||||
),
|
||||
issue=11358,
|
||||
replacement="to use --config-settings",
|
||||
gone_in="23.1",
|
||||
)
|
||||
|
|
|
@ -118,3 +118,71 @@ def deprecated(
|
|||
raise PipDeprecationWarning(message)
|
||||
|
||||
warnings.warn(message, category=PipDeprecationWarning, stacklevel=2)
|
||||
|
||||
|
||||
class LegacyInstallReason:
|
||||
def __init__(
|
||||
self,
|
||||
reason: str,
|
||||
replacement: Optional[str] = None,
|
||||
gone_in: Optional[str] = None,
|
||||
feature_flag: Optional[str] = None,
|
||||
issue: Optional[int] = None,
|
||||
emit_after_success: bool = False,
|
||||
emit_before_install: bool = False,
|
||||
):
|
||||
self._reason = reason
|
||||
self._replacement = replacement
|
||||
self._gone_in = gone_in
|
||||
self._feature_flag = feature_flag
|
||||
self._issue = issue
|
||||
self.emit_after_success = emit_after_success
|
||||
self.emit_before_install = emit_before_install
|
||||
|
||||
def emit_deprecation(self, name: str) -> None:
|
||||
deprecated(
|
||||
reason=self._reason.format(name=name),
|
||||
replacement=self._replacement,
|
||||
gone_in=self._gone_in,
|
||||
feature_flag=self._feature_flag,
|
||||
issue=self._issue,
|
||||
)
|
||||
|
||||
|
||||
LegacyInstallReasonFailedBdistWheel = LegacyInstallReason(
|
||||
reason=(
|
||||
"{name} was installed using the legacy 'setup.py install' "
|
||||
"method, because a wheel could not be built for it."
|
||||
),
|
||||
replacement="to fix the wheel build issue reported above",
|
||||
gone_in="23.1",
|
||||
issue=8368,
|
||||
emit_after_success=True,
|
||||
)
|
||||
|
||||
|
||||
LegacyInstallReasonMissingWheelPackage = LegacyInstallReason(
|
||||
reason=(
|
||||
"{name} is being installed using the legacy "
|
||||
"'setup.py install' method, because it does not have a "
|
||||
"'pyproject.toml' and the 'wheel' package "
|
||||
"is not installed."
|
||||
),
|
||||
replacement="to enable the '--use-pep517' option",
|
||||
gone_in="23.1",
|
||||
issue=8559,
|
||||
emit_before_install=True,
|
||||
)
|
||||
|
||||
LegacyInstallReasonNoBinaryForcesSetuptoolsInstall = LegacyInstallReason(
|
||||
reason=(
|
||||
"{name} is being installed using the legacy "
|
||||
"'setup.py install' method, because the '--no-binary' option was enabled "
|
||||
"for it and this currently disables local wheel building for projects that "
|
||||
"don't have a 'pyproject.toml' file."
|
||||
),
|
||||
replacement="to enable the '--use-pep517' option",
|
||||
gone_in="23.1",
|
||||
issue=11451,
|
||||
emit_before_install=True,
|
||||
)
|
||||
|
|
|
@ -55,9 +55,14 @@ def get_best_invocation_for_this_pip() -> str:
|
|||
if exe_are_in_PATH:
|
||||
for exe_name in _EXECUTABLE_NAMES:
|
||||
found_executable = shutil.which(exe_name)
|
||||
if found_executable and os.path.samefile(
|
||||
binary_executable = os.path.join(binary_prefix, exe_name)
|
||||
if (
|
||||
found_executable
|
||||
and os.path.exists(binary_executable)
|
||||
and os.path.samefile(
|
||||
found_executable,
|
||||
os.path.join(binary_prefix, exe_name),
|
||||
binary_executable,
|
||||
)
|
||||
):
|
||||
return exe_name
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import hashlib
|
||||
from typing import TYPE_CHECKING, BinaryIO, Dict, Iterable, List
|
||||
from typing import TYPE_CHECKING, BinaryIO, Dict, Iterable, List, Optional
|
||||
|
||||
from pip._internal.exceptions import HashMismatch, HashMissing, InstallationError
|
||||
from pip._internal.utils.misc import read_chunks
|
||||
|
@ -28,7 +28,7 @@ class Hashes:
|
|||
|
||||
"""
|
||||
|
||||
def __init__(self, hashes: Dict[str, List[str]] = None) -> None:
|
||||
def __init__(self, hashes: Optional[Dict[str, List[str]]] = None) -> None:
|
||||
"""
|
||||
:param hashes: A dict of algorithm names pointing to lists of allowed
|
||||
hex digests
|
||||
|
|
|
@ -48,7 +48,7 @@ _SETUPTOOLS_SHIM = textwrap.dedent(
|
|||
|
||||
def make_setuptools_shim_args(
|
||||
setup_py_path: str,
|
||||
global_options: Sequence[str] = None,
|
||||
global_options: Optional[Sequence[str]] = None,
|
||||
no_user_config: bool = False,
|
||||
unbuffered_output: bool = False,
|
||||
) -> List[str]:
|
||||
|
|
|
@ -49,14 +49,25 @@ class Bazaar(VersionControl):
|
|||
flag = ""
|
||||
else:
|
||||
flag = f"-{'v'*verbosity}"
|
||||
cmd_args = make_command("branch", flag, rev_options.to_args(), url, dest)
|
||||
cmd_args = make_command(
|
||||
"checkout", "--lightweight", flag, rev_options.to_args(), url, dest
|
||||
)
|
||||
self.run_command(cmd_args)
|
||||
|
||||
def switch(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None:
|
||||
self.run_command(make_command("switch", url), cwd=dest)
|
||||
|
||||
def update(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None:
|
||||
cmd_args = make_command("pull", "-q", rev_options.to_args())
|
||||
output = self.run_command(
|
||||
make_command("info"), show_stdout=False, stdout_only=True, cwd=dest
|
||||
)
|
||||
if output.startswith("Standalone "):
|
||||
# Older versions of pip used to create standalone branches.
|
||||
# Convert the standalone branch to a checkout by calling "bzr bind".
|
||||
cmd_args = make_command("bind", "-q", url)
|
||||
self.run_command(cmd_args, cwd=dest)
|
||||
|
||||
cmd_args = make_command("update", "-q", rev_options.to_args())
|
||||
self.run_command(cmd_args, cwd=dest)
|
||||
|
||||
@classmethod
|
||||
|
|
|
@ -184,7 +184,7 @@ class Subversion(VersionControl):
|
|||
"""Always assume the versions don't match"""
|
||||
return False
|
||||
|
||||
def __init__(self, use_interactive: bool = None) -> None:
|
||||
def __init__(self, use_interactive: Optional[bool] = None) -> None:
|
||||
if use_interactive is None:
|
||||
use_interactive = is_console_interactive()
|
||||
self.use_interactive = use_interactive
|
||||
|
|
|
@ -5,7 +5,7 @@ import logging
|
|||
import os.path
|
||||
import re
|
||||
import shutil
|
||||
from typing import Any, Callable, Iterable, List, Optional, Tuple
|
||||
from typing import Callable, Iterable, List, Optional, Tuple
|
||||
|
||||
from pip._vendor.packaging.utils import canonicalize_name, canonicalize_version
|
||||
from pip._vendor.packaging.version import InvalidVersion, Version
|
||||
|
@ -19,6 +19,10 @@ from pip._internal.operations.build.wheel import build_wheel_pep517
|
|||
from pip._internal.operations.build.wheel_editable import build_wheel_editable
|
||||
from pip._internal.operations.build.wheel_legacy import build_wheel_legacy
|
||||
from pip._internal.req.req_install import InstallRequirement
|
||||
from pip._internal.utils.deprecation import (
|
||||
LegacyInstallReasonMissingWheelPackage,
|
||||
LegacyInstallReasonNoBinaryForcesSetuptoolsInstall,
|
||||
)
|
||||
from pip._internal.utils.logging import indent_log
|
||||
from pip._internal.utils.misc import ensure_dir, hash_file, is_wheel_installed
|
||||
from pip._internal.utils.setuptools_build import make_setuptools_clean_args
|
||||
|
@ -31,7 +35,7 @@ logger = logging.getLogger(__name__)
|
|||
|
||||
_egg_info_re = re.compile(r"([a-z0-9_.]+)-([a-z0-9_.!+-]+)", re.IGNORECASE)
|
||||
|
||||
BinaryAllowedPredicate = Callable[[InstallRequirement], bool]
|
||||
BdistWheelAllowedPredicate = Callable[[InstallRequirement], bool]
|
||||
BuildResult = Tuple[List[InstallRequirement], List[InstallRequirement]]
|
||||
|
||||
|
||||
|
@ -46,7 +50,7 @@ def _contains_egg_info(s: str) -> bool:
|
|||
def _should_build(
|
||||
req: InstallRequirement,
|
||||
need_wheel: bool,
|
||||
check_binary_allowed: BinaryAllowedPredicate,
|
||||
check_bdist_wheel: Optional[BdistWheelAllowedPredicate] = None,
|
||||
) -> bool:
|
||||
"""Return whether an InstallRequirement should be built into a wheel."""
|
||||
if req.constraint:
|
||||
|
@ -77,20 +81,19 @@ def _should_build(
|
|||
if req.use_pep517:
|
||||
return True
|
||||
|
||||
if not check_binary_allowed(req):
|
||||
logger.info(
|
||||
"Skipping wheel build for %s, due to binaries being disabled for it.",
|
||||
req.name,
|
||||
)
|
||||
assert check_bdist_wheel is not None
|
||||
if not check_bdist_wheel(req):
|
||||
# /!\ When we change this to unconditionally return True, we must also remove
|
||||
# support for `--install-option`. Indeed, `--install-option` implies
|
||||
# `--no-binary` so we can return False here and run `setup.py install`.
|
||||
# `--global-option` and `--build-option` can remain until we drop support for
|
||||
# building with `setup.py bdist_wheel`.
|
||||
req.legacy_install_reason = LegacyInstallReasonNoBinaryForcesSetuptoolsInstall
|
||||
return False
|
||||
|
||||
if not is_wheel_installed():
|
||||
# we don't build legacy requirements if wheel is not installed
|
||||
logger.info(
|
||||
"Using legacy 'setup.py install' for %s, "
|
||||
"since package 'wheel' is not installed.",
|
||||
req.name,
|
||||
)
|
||||
req.legacy_install_reason = LegacyInstallReasonMissingWheelPackage
|
||||
return False
|
||||
|
||||
return True
|
||||
|
@ -99,15 +102,15 @@ def _should_build(
|
|||
def should_build_for_wheel_command(
|
||||
req: InstallRequirement,
|
||||
) -> bool:
|
||||
return _should_build(req, need_wheel=True, check_binary_allowed=_always_true)
|
||||
return _should_build(req, need_wheel=True)
|
||||
|
||||
|
||||
def should_build_for_install_command(
|
||||
req: InstallRequirement,
|
||||
check_binary_allowed: BinaryAllowedPredicate,
|
||||
check_bdist_wheel_allowed: BdistWheelAllowedPredicate,
|
||||
) -> bool:
|
||||
return _should_build(
|
||||
req, need_wheel=False, check_binary_allowed=check_binary_allowed
|
||||
req, need_wheel=False, check_bdist_wheel=check_bdist_wheel_allowed
|
||||
)
|
||||
|
||||
|
||||
|
@ -159,10 +162,6 @@ def _get_cache_dir(
|
|||
return cache_dir
|
||||
|
||||
|
||||
def _always_true(_: Any) -> bool:
|
||||
return True
|
||||
|
||||
|
||||
def _verify_one(req: InstallRequirement, wheel_path: str) -> None:
|
||||
canonical_name = canonicalize_name(req.name or "")
|
||||
w = Wheel(os.path.basename(wheel_path))
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
from .core import contents, where
|
||||
|
||||
__all__ = ["contents", "where"]
|
||||
__version__ = "2022.06.15"
|
||||
__version__ = "2022.09.24"
|
||||
|
|
|
@ -1323,45 +1323,6 @@ t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy
|
|||
SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
# Issuer: CN=EC-ACC O=Agencia Catalana de Certificacio (NIF Q-0801176-I) OU=Serveis Publics de Certificacio/Vegeu https://www.catcert.net/verarrel (c)03/Jerarquia Entitats de Certificacio Catalanes
|
||||
# Subject: CN=EC-ACC O=Agencia Catalana de Certificacio (NIF Q-0801176-I) OU=Serveis Publics de Certificacio/Vegeu https://www.catcert.net/verarrel (c)03/Jerarquia Entitats de Certificacio Catalanes
|
||||
# Label: "EC-ACC"
|
||||
# Serial: -23701579247955709139626555126524820479
|
||||
# MD5 Fingerprint: eb:f5:9d:29:0d:61:f9:42:1f:7c:c2:ba:6d:e3:15:09
|
||||
# SHA1 Fingerprint: 28:90:3a:63:5b:52:80:fa:e6:77:4c:0b:6d:a7:d6:ba:a6:4a:f2:e8
|
||||
# SHA256 Fingerprint: 88:49:7f:01:60:2f:31:54:24:6a:e2:8c:4d:5a:ef:10:f1:d8:7e:bb:76:62:6f:4a:e0:b7:f9:5b:a7:96:87:99
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB
|
||||
8zELMAkGA1UEBhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2Vy
|
||||
dGlmaWNhY2lvIChOSUYgUS0wODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1
|
||||
YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYDVQQLEyxWZWdldSBodHRwczovL3d3
|
||||
dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UECxMsSmVyYXJxdWlh
|
||||
IEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMTBkVD
|
||||
LUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQG
|
||||
EwJFUzE7MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8g
|
||||
KE5JRiBRLTA4MDExNzYtSSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBD
|
||||
ZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZlZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQu
|
||||
bmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJhcnF1aWEgRW50aXRhdHMg
|
||||
ZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUNDMIIBIjAN
|
||||
BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R
|
||||
85iKw5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm
|
||||
4CgPukLjbo73FCeTae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaV
|
||||
HMf5NLWUhdWZXqBIoH7nF2W4onW4HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNd
|
||||
QlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0aE9jD2z3Il3rucO2n5nzbcc8t
|
||||
lGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw0JDnJwIDAQAB
|
||||
o4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E
|
||||
BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4
|
||||
opvpXY0wfwYDVR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBo
|
||||
dHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidW
|
||||
ZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAwDQYJKoZIhvcN
|
||||
AQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJlF7W2u++AVtd0x7Y
|
||||
/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNaAl6k
|
||||
SBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhy
|
||||
Rp/7SNVel+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOS
|
||||
Agu+TGbrIP65y7WZf+a2E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xl
|
||||
nJ2lYJU6Un/10asIbvPuW/mIPX64b24D5EI=
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967
|
||||
# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967
|
||||
# Label: "Actalis Authentication Root CA"
|
||||
|
@ -4683,3 +4644,65 @@ ADBmAjEA5gVYaWHlLcoNy/EZCL3W/VGSGn5jVASQkZo1kTmZ+gepZpO6yGjUij/6
|
|||
7W4WAie3AjEA3VoXK3YdZUKWpqxdinlW2Iob35reX8dQj7FbcQwm32pAAOwzkSFx
|
||||
vmjkI6TZraE3
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
# Issuer: CN=Security Communication RootCA3 O=SECOM Trust Systems CO.,LTD.
|
||||
# Subject: CN=Security Communication RootCA3 O=SECOM Trust Systems CO.,LTD.
|
||||
# Label: "Security Communication RootCA3"
|
||||
# Serial: 16247922307909811815
|
||||
# MD5 Fingerprint: 1c:9a:16:ff:9e:5c:e0:4d:8a:14:01:f4:35:5d:29:26
|
||||
# SHA1 Fingerprint: c3:03:c8:22:74:92:e5:61:a2:9c:5f:79:91:2b:1e:44:13:91:30:3a
|
||||
# SHA256 Fingerprint: 24:a5:5c:2a:b0:51:44:2d:06:17:76:65:41:23:9a:4a:d0:32:d7:c5:51:75:aa:34:ff:de:2f:bc:4f:5c:52:94
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIFfzCCA2egAwIBAgIJAOF8N0D9G/5nMA0GCSqGSIb3DQEBDAUAMF0xCzAJBgNV
|
||||
BAYTAkpQMSUwIwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMScw
|
||||
JQYDVQQDEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTMwHhcNMTYwNjE2
|
||||
MDYxNzE2WhcNMzgwMTE4MDYxNzE2WjBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
|
||||
U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UEAxMeU2VjdXJpdHkg
|
||||
Q29tbXVuaWNhdGlvbiBSb290Q0EzMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
|
||||
CgKCAgEA48lySfcw3gl8qUCBWNO0Ot26YQ+TUG5pPDXC7ltzkBtnTCHsXzW7OT4r
|
||||
CmDvu20rhvtxosis5FaU+cmvsXLUIKx00rgVrVH+hXShuRD+BYD5UpOzQD11EKzA
|
||||
lrenfna84xtSGc4RHwsENPXY9Wk8d/Nk9A2qhd7gCVAEF5aEt8iKvE1y/By7z/MG
|
||||
TfmfZPd+pmaGNXHIEYBMwXFAWB6+oHP2/D5Q4eAvJj1+XCO1eXDe+uDRpdYMQXF7
|
||||
9+qMHIjH7Iv10S9VlkZ8WjtYO/u62C21Jdp6Ts9EriGmnpjKIG58u4iFW/vAEGK7
|
||||
8vknR+/RiTlDxN/e4UG/VHMgly1s2vPUB6PmudhvrvyMGS7TZ2crldtYXLVqAvO4
|
||||
g160a75BflcJdURQVc1aEWEhCmHCqYj9E7wtiS/NYeCVvsq1e+F7NGcLH7YMx3we
|
||||
GVPKp7FKFSBWFHA9K4IsD50VHUeAR/94mQ4xr28+j+2GaR57GIgUssL8gjMunEst
|
||||
+3A7caoreyYn8xrC3PsXuKHqy6C0rtOUfnrQq8PsOC0RLoi/1D+tEjtCrI8Cbn3M
|
||||
0V9hvqG8OmpI6iZVIhZdXw3/JzOfGAN0iltSIEdrRU0id4xVJ/CvHozJgyJUt5rQ
|
||||
T9nO/NkuHJYosQLTA70lUhw0Zk8jq/R3gpYd0VcwCBEF/VfR2ccCAwEAAaNCMEAw
|
||||
HQYDVR0OBBYEFGQUfPxYchamCik0FW8qy7z8r6irMA4GA1UdDwEB/wQEAwIBBjAP
|
||||
BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBDAUAA4ICAQDcAiMI4u8hOscNtybS
|
||||
YpOnpSNyByCCYN8Y11StaSWSntkUz5m5UoHPrmyKO1o5yGwBQ8IibQLwYs1OY0PA
|
||||
FNr0Y/Dq9HHuTofjcan0yVflLl8cebsjqodEV+m9NU1Bu0soo5iyG9kLFwfl9+qd
|
||||
9XbXv8S2gVj/yP9kaWJ5rW4OH3/uHWnlt3Jxs/6lATWUVCvAUm2PVcTJ0rjLyjQI
|
||||
UYWg9by0F1jqClx6vWPGOi//lkkZhOpn2ASxYfQAW0q3nHE3GYV5v4GwxxMOdnE+
|
||||
OoAGrgYWp421wsTL/0ClXI2lyTrtcoHKXJg80jQDdwj98ClZXSEIx2C/pHF7uNke
|
||||
gr4Jr2VvKKu/S7XuPghHJ6APbw+LP6yVGPO5DtxnVW5inkYO0QR4ynKudtml+LLf
|
||||
iAlhi+8kTtFZP1rUPcmTPCtk9YENFpb3ksP+MW/oKjJ0DvRMmEoYDjBU1cXrvMUV
|
||||
nuiZIesnKwkK2/HmcBhWuwzkvvnoEKQTkrgc4NtnHVMDpCKn3F2SEDzq//wbEBrD
|
||||
2NCcnWXL0CsnMQMeNuE9dnUM/0Umud1RvCPHX9jYhxBAEg09ODfnRDwYwFMJZI//
|
||||
1ZqmfHAuc1Uh6N//g7kdPjIe1qZ9LPFm6Vwdp6POXiUyK+OVrCoHzrQoeIY8Laad
|
||||
TdJ0MN1kURXbg4NR16/9M51NZg==
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
# Issuer: CN=Security Communication ECC RootCA1 O=SECOM Trust Systems CO.,LTD.
|
||||
# Subject: CN=Security Communication ECC RootCA1 O=SECOM Trust Systems CO.,LTD.
|
||||
# Label: "Security Communication ECC RootCA1"
|
||||
# Serial: 15446673492073852651
|
||||
# MD5 Fingerprint: 7e:43:b0:92:68:ec:05:43:4c:98:ab:5d:35:2e:7e:86
|
||||
# SHA1 Fingerprint: b8:0e:26:a9:bf:d2:b2:3b:c0:ef:46:c9:ba:c7:bb:f6:1d:0d:41:41
|
||||
# SHA256 Fingerprint: e7:4f:bd:a5:5b:d5:64:c4:73:a3:6b:44:1a:a7:99:c8:a6:8e:07:74:40:e8:28:8b:9f:a1:e5:0e:4b:ba:ca:11
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIICODCCAb6gAwIBAgIJANZdm7N4gS7rMAoGCCqGSM49BAMDMGExCzAJBgNVBAYT
|
||||
AkpQMSUwIwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMSswKQYD
|
||||
VQQDEyJTZWN1cml0eSBDb21tdW5pY2F0aW9uIEVDQyBSb290Q0ExMB4XDTE2MDYx
|
||||
NjA1MTUyOFoXDTM4MDExODA1MTUyOFowYTELMAkGA1UEBhMCSlAxJTAjBgNVBAoT
|
||||
HFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKzApBgNVBAMTIlNlY3VyaXR5
|
||||
IENvbW11bmljYXRpb24gRUNDIFJvb3RDQTEwdjAQBgcqhkjOPQIBBgUrgQQAIgNi
|
||||
AASkpW9gAwPDvTH00xecK4R1rOX9PVdu12O/5gSJko6BnOPpR27KkBLIE+Cnnfdl
|
||||
dB9sELLo5OnvbYUymUSxXv3MdhDYW72ixvnWQuRXdtyQwjWpS4g8EkdtXP9JTxpK
|
||||
ULGjQjBAMB0GA1UdDgQWBBSGHOf+LaVKiwj+KBH6vqNm+GBZLzAOBgNVHQ8BAf8E
|
||||
BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu
|
||||
9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3LsnNdo4gIxwwCMQDAqy0O
|
||||
be0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70eN9k=
|
||||
-----END CERTIFICATE-----
|
||||
|
|
|
@ -4,26 +4,12 @@ certifi.py
|
|||
|
||||
This module returns the installation location of cacert.pem or its contents.
|
||||
"""
|
||||
import os
|
||||
import types
|
||||
from typing import Union
|
||||
import sys
|
||||
|
||||
|
||||
class _PipPatchedCertificate(Exception):
|
||||
pass
|
||||
if sys.version_info >= (3, 11):
|
||||
|
||||
|
||||
try:
|
||||
# Return a certificate file on disk for a standalone pip zipapp running in
|
||||
# an isolated build environment to use. Passing --cert to the standalone
|
||||
# pip does not work since requests calls where() unconditionally on import.
|
||||
_PIP_STANDALONE_CERT = os.environ.get("_PIP_STANDALONE_CERT")
|
||||
if _PIP_STANDALONE_CERT:
|
||||
def where():
|
||||
return _PIP_STANDALONE_CERT
|
||||
raise _PipPatchedCertificate()
|
||||
|
||||
from importlib.resources import path as get_path, read_text
|
||||
from importlib.resources import as_file, files
|
||||
|
||||
_CACERT_CTX = None
|
||||
_CACERT_PATH = None
|
||||
|
@ -47,15 +33,54 @@ try:
|
|||
# We also have to hold onto the actual context manager, because
|
||||
# it will do the cleanup whenever it gets garbage collected, so
|
||||
# we will also store that at the global level as well.
|
||||
_CACERT_CTX = as_file(files("pip._vendor.certifi").joinpath("cacert.pem"))
|
||||
_CACERT_PATH = str(_CACERT_CTX.__enter__())
|
||||
|
||||
return _CACERT_PATH
|
||||
|
||||
def contents() -> str:
|
||||
return files("pip._vendor.certifi").joinpath("cacert.pem").read_text(encoding="ascii")
|
||||
|
||||
elif sys.version_info >= (3, 7):
|
||||
|
||||
from importlib.resources import path as get_path, read_text
|
||||
|
||||
_CACERT_CTX = None
|
||||
_CACERT_PATH = None
|
||||
|
||||
def where() -> str:
|
||||
# This is slightly terrible, but we want to delay extracting the
|
||||
# file in cases where we're inside of a zipimport situation until
|
||||
# someone actually calls where(), but we don't want to re-extract
|
||||
# the file on every call of where(), so we'll do it once then store
|
||||
# it in a global variable.
|
||||
global _CACERT_CTX
|
||||
global _CACERT_PATH
|
||||
if _CACERT_PATH is None:
|
||||
# This is slightly janky, the importlib.resources API wants you
|
||||
# to manage the cleanup of this file, so it doesn't actually
|
||||
# return a path, it returns a context manager that will give
|
||||
# you the path when you enter it and will do any cleanup when
|
||||
# you leave it. In the common case of not needing a temporary
|
||||
# file, it will just return the file system location and the
|
||||
# __exit__() is a no-op.
|
||||
#
|
||||
# We also have to hold onto the actual context manager, because
|
||||
# it will do the cleanup whenever it gets garbage collected, so
|
||||
# we will also store that at the global level as well.
|
||||
_CACERT_CTX = get_path("pip._vendor.certifi", "cacert.pem")
|
||||
_CACERT_PATH = str(_CACERT_CTX.__enter__())
|
||||
|
||||
return _CACERT_PATH
|
||||
|
||||
except _PipPatchedCertificate:
|
||||
pass
|
||||
def contents() -> str:
|
||||
return read_text("pip._vendor.certifi", "cacert.pem", encoding="ascii")
|
||||
|
||||
else:
|
||||
import os
|
||||
import types
|
||||
from typing import Union
|
||||
|
||||
except ImportError:
|
||||
Package = Union[types.ModuleType, str]
|
||||
Resource = Union[str, "os.PathLike"]
|
||||
|
||||
|
@ -79,6 +104,5 @@ except ImportError:
|
|||
|
||||
return os.path.join(f, "cacert.pem")
|
||||
|
||||
|
||||
def contents() -> str:
|
||||
return read_text("certifi", "cacert.pem", encoding="ascii")
|
||||
def contents() -> str:
|
||||
return read_text("pip._vendor.certifi", "cacert.pem", encoding="ascii")
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# Copyright (C) 2012-2019 Vinay Sajip.
|
||||
# Copyright (C) 2012-2022 Vinay Sajip.
|
||||
# Licensed to the Python Software Foundation under a contributor agreement.
|
||||
# See LICENSE.txt and CONTRIBUTORS.txt.
|
||||
#
|
||||
import logging
|
||||
|
||||
__version__ = '0.3.5'
|
||||
__version__ = '0.3.6'
|
||||
|
||||
class DistlibException(Exception):
|
||||
pass
|
||||
|
|
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:
|
||||
if isinstance(s, (bytes, bytearray)):
|
||||
try:
|
||||
s = s.decode('ascii')
|
||||
except UnicodeDecodeError:
|
||||
raise IDNAError('should pass a unicode string to the function rather than a byte string.')
|
||||
if uts46:
|
||||
s = uts46_remap(s, std3_rules, transitional)
|
||||
trailing_dot = False
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
# This file is automatically generated by tools/idna-data
|
||||
|
||||
__version__ = '14.0.0'
|
||||
__version__ = '15.0.0'
|
||||
scripts = {
|
||||
'Greek': (
|
||||
0x37000000374,
|
||||
|
@ -55,12 +55,13 @@ scripts = {
|
|||
0x16fe200016fe4,
|
||||
0x16ff000016ff2,
|
||||
0x200000002a6e0,
|
||||
0x2a7000002b739,
|
||||
0x2a7000002b73a,
|
||||
0x2b7400002b81e,
|
||||
0x2b8200002cea2,
|
||||
0x2ceb00002ebe1,
|
||||
0x2f8000002fa1e,
|
||||
0x300000003134b,
|
||||
0x31350000323b0,
|
||||
),
|
||||
'Hebrew': (
|
||||
0x591000005c8,
|
||||
|
@ -77,6 +78,7 @@ scripts = {
|
|||
0x304100003097,
|
||||
0x309d000030a0,
|
||||
0x1b0010001b120,
|
||||
0x1b1320001b133,
|
||||
0x1b1500001b153,
|
||||
0x1f2000001f201,
|
||||
),
|
||||
|
@ -93,6 +95,7 @@ scripts = {
|
|||
0x1affd0001afff,
|
||||
0x1b0000001b001,
|
||||
0x1b1200001b123,
|
||||
0x1b1550001b156,
|
||||
0x1b1640001b168,
|
||||
),
|
||||
}
|
||||
|
@ -1331,7 +1334,7 @@ codepoint_classes = {
|
|||
0xcdd00000cdf,
|
||||
0xce000000ce4,
|
||||
0xce600000cf0,
|
||||
0xcf100000cf3,
|
||||
0xcf100000cf4,
|
||||
0xd0000000d0d,
|
||||
0xd0e00000d11,
|
||||
0xd1200000d45,
|
||||
|
@ -1366,7 +1369,7 @@ codepoint_classes = {
|
|||
0xeb400000ebe,
|
||||
0xec000000ec5,
|
||||
0xec600000ec7,
|
||||
0xec800000ece,
|
||||
0xec800000ecf,
|
||||
0xed000000eda,
|
||||
0xede00000ee0,
|
||||
0xf0000000f01,
|
||||
|
@ -1859,7 +1862,7 @@ codepoint_classes = {
|
|||
0xab200000ab27,
|
||||
0xab280000ab2f,
|
||||
0xab300000ab5b,
|
||||
0xab600000ab6a,
|
||||
0xab600000ab69,
|
||||
0xabc00000abeb,
|
||||
0xabec0000abee,
|
||||
0xabf00000abfa,
|
||||
|
@ -1943,7 +1946,7 @@ codepoint_classes = {
|
|||
0x10e8000010eaa,
|
||||
0x10eab00010ead,
|
||||
0x10eb000010eb2,
|
||||
0x10f0000010f1d,
|
||||
0x10efd00010f1d,
|
||||
0x10f2700010f28,
|
||||
0x10f3000010f51,
|
||||
0x10f7000010f86,
|
||||
|
@ -1966,7 +1969,7 @@ codepoint_classes = {
|
|||
0x111dc000111dd,
|
||||
0x1120000011212,
|
||||
0x1121300011238,
|
||||
0x1123e0001123f,
|
||||
0x1123e00011242,
|
||||
0x1128000011287,
|
||||
0x1128800011289,
|
||||
0x1128a0001128e,
|
||||
|
@ -2047,11 +2050,16 @@ codepoint_classes = {
|
|||
0x11d9300011d99,
|
||||
0x11da000011daa,
|
||||
0x11ee000011ef7,
|
||||
0x11f0000011f11,
|
||||
0x11f1200011f3b,
|
||||
0x11f3e00011f43,
|
||||
0x11f5000011f5a,
|
||||
0x11fb000011fb1,
|
||||
0x120000001239a,
|
||||
0x1248000012544,
|
||||
0x12f9000012ff1,
|
||||
0x130000001342f,
|
||||
0x1300000013430,
|
||||
0x1344000013456,
|
||||
0x1440000014647,
|
||||
0x1680000016a39,
|
||||
0x16a4000016a5f,
|
||||
|
@ -2079,7 +2087,9 @@ codepoint_classes = {
|
|||
0x1aff50001affc,
|
||||
0x1affd0001afff,
|
||||
0x1b0000001b123,
|
||||
0x1b1320001b133,
|
||||
0x1b1500001b153,
|
||||
0x1b1550001b156,
|
||||
0x1b1640001b168,
|
||||
0x1b1700001b2fc,
|
||||
0x1bc000001bc6b,
|
||||
|
@ -2096,17 +2106,21 @@ codepoint_classes = {
|
|||
0x1da9b0001daa0,
|
||||
0x1daa10001dab0,
|
||||
0x1df000001df1f,
|
||||
0x1df250001df2b,
|
||||
0x1e0000001e007,
|
||||
0x1e0080001e019,
|
||||
0x1e01b0001e022,
|
||||
0x1e0230001e025,
|
||||
0x1e0260001e02b,
|
||||
0x1e0300001e06e,
|
||||
0x1e08f0001e090,
|
||||
0x1e1000001e12d,
|
||||
0x1e1300001e13e,
|
||||
0x1e1400001e14a,
|
||||
0x1e14e0001e14f,
|
||||
0x1e2900001e2af,
|
||||
0x1e2c00001e2fa,
|
||||
0x1e4d00001e4fa,
|
||||
0x1e7e00001e7e7,
|
||||
0x1e7e80001e7ec,
|
||||
0x1e7ed0001e7ef,
|
||||
|
@ -2115,13 +2129,13 @@ codepoint_classes = {
|
|||
0x1e8d00001e8d7,
|
||||
0x1e9220001e94c,
|
||||
0x1e9500001e95a,
|
||||
0x1fbf00001fbfa,
|
||||
0x200000002a6e0,
|
||||
0x2a7000002b739,
|
||||
0x2a7000002b73a,
|
||||
0x2b7400002b81e,
|
||||
0x2b8200002cea2,
|
||||
0x2ceb00002ebe1,
|
||||
0x300000003134b,
|
||||
0x31350000323b0,
|
||||
),
|
||||
'CONTEXTJ': (
|
||||
0x200c0000200e,
|
||||
|
|
|
@ -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."""
|
||||
|
||||
|
||||
__version__ = '14.0.0'
|
||||
__version__ = '15.0.0'
|
||||
def _seg_0() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x0, '3'),
|
||||
|
@ -1300,7 +1300,7 @@ def _seg_12() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0xCE6, 'V'),
|
||||
(0xCF0, 'X'),
|
||||
(0xCF1, 'V'),
|
||||
(0xCF3, 'X'),
|
||||
(0xCF4, 'X'),
|
||||
(0xD00, 'V'),
|
||||
(0xD0D, 'X'),
|
||||
(0xD0E, 'V'),
|
||||
|
@ -1368,7 +1368,7 @@ def _seg_13() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0xEC6, 'V'),
|
||||
(0xEC7, 'X'),
|
||||
(0xEC8, 'V'),
|
||||
(0xECE, 'X'),
|
||||
(0xECF, 'X'),
|
||||
(0xED0, 'V'),
|
||||
(0xEDA, 'X'),
|
||||
(0xEDC, 'M', 'ຫນ'),
|
||||
|
@ -5917,7 +5917,7 @@ def _seg_56() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x10EAE, 'X'),
|
||||
(0x10EB0, 'V'),
|
||||
(0x10EB2, 'X'),
|
||||
(0x10F00, 'V'),
|
||||
(0x10EFD, 'V'),
|
||||
(0x10F28, 'X'),
|
||||
(0x10F30, 'V'),
|
||||
(0x10F5A, 'X'),
|
||||
|
@ -5956,7 +5956,7 @@ def _seg_57() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x11200, 'V'),
|
||||
(0x11212, 'X'),
|
||||
(0x11213, 'V'),
|
||||
(0x1123F, 'X'),
|
||||
(0x11242, 'X'),
|
||||
(0x11280, 'V'),
|
||||
(0x11287, 'X'),
|
||||
(0x11288, 'V'),
|
||||
|
@ -6097,6 +6097,8 @@ def _seg_58() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x11AA3, 'X'),
|
||||
(0x11AB0, 'V'),
|
||||
(0x11AF9, 'X'),
|
||||
(0x11B00, 'V'),
|
||||
(0x11B0A, 'X'),
|
||||
(0x11C00, 'V'),
|
||||
(0x11C09, 'X'),
|
||||
(0x11C0A, 'V'),
|
||||
|
@ -6139,13 +6141,19 @@ def _seg_58() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x11DAA, 'X'),
|
||||
(0x11EE0, 'V'),
|
||||
(0x11EF9, 'X'),
|
||||
(0x11FB0, 'V'),
|
||||
(0x11FB1, 'X'),
|
||||
(0x11FC0, 'V'),
|
||||
(0x11F00, 'V'),
|
||||
]
|
||||
|
||||
def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x11F11, 'X'),
|
||||
(0x11F12, 'V'),
|
||||
(0x11F3B, 'X'),
|
||||
(0x11F3E, 'V'),
|
||||
(0x11F5A, 'X'),
|
||||
(0x11FB0, 'V'),
|
||||
(0x11FB1, 'X'),
|
||||
(0x11FC0, 'V'),
|
||||
(0x11FF2, 'X'),
|
||||
(0x11FFF, 'V'),
|
||||
(0x1239A, 'X'),
|
||||
|
@ -6158,7 +6166,9 @@ def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x12F90, 'V'),
|
||||
(0x12FF3, 'X'),
|
||||
(0x13000, 'V'),
|
||||
(0x1342F, 'X'),
|
||||
(0x13430, 'X'),
|
||||
(0x13440, 'V'),
|
||||
(0x13456, 'X'),
|
||||
(0x14400, 'V'),
|
||||
(0x14647, 'X'),
|
||||
(0x16800, 'V'),
|
||||
|
@ -6236,6 +6246,10 @@ def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x18D00, 'V'),
|
||||
(0x18D09, 'X'),
|
||||
(0x1AFF0, 'V'),
|
||||
]
|
||||
|
||||
def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x1AFF4, 'X'),
|
||||
(0x1AFF5, 'V'),
|
||||
(0x1AFFC, 'X'),
|
||||
|
@ -6243,13 +6257,13 @@ def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x1AFFF, 'X'),
|
||||
(0x1B000, 'V'),
|
||||
(0x1B123, 'X'),
|
||||
(0x1B132, 'V'),
|
||||
(0x1B133, 'X'),
|
||||
(0x1B150, 'V'),
|
||||
(0x1B153, 'X'),
|
||||
(0x1B155, 'V'),
|
||||
(0x1B156, 'X'),
|
||||
(0x1B164, 'V'),
|
||||
]
|
||||
|
||||
def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x1B168, 'X'),
|
||||
(0x1B170, 'V'),
|
||||
(0x1B2FC, 'X'),
|
||||
|
@ -6295,6 +6309,8 @@ def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x1D1EB, 'X'),
|
||||
(0x1D200, 'V'),
|
||||
(0x1D246, 'X'),
|
||||
(0x1D2C0, 'V'),
|
||||
(0x1D2D4, 'X'),
|
||||
(0x1D2E0, 'V'),
|
||||
(0x1D2F4, 'X'),
|
||||
(0x1D300, 'V'),
|
||||
|
@ -6334,6 +6350,10 @@ def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x1D41E, 'M', 'e'),
|
||||
(0x1D41F, 'M', 'f'),
|
||||
(0x1D420, 'M', 'g'),
|
||||
]
|
||||
|
||||
def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x1D421, 'M', 'h'),
|
||||
(0x1D422, 'M', 'i'),
|
||||
(0x1D423, 'M', 'j'),
|
||||
|
@ -6350,10 +6370,6 @@ def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x1D42E, 'M', 'u'),
|
||||
(0x1D42F, 'M', 'v'),
|
||||
(0x1D430, 'M', 'w'),
|
||||
]
|
||||
|
||||
def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x1D431, 'M', 'x'),
|
||||
(0x1D432, 'M', 'y'),
|
||||
(0x1D433, 'M', 'z'),
|
||||
|
@ -6438,6 +6454,10 @@ def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x1D482, 'M', 'a'),
|
||||
(0x1D483, 'M', 'b'),
|
||||
(0x1D484, 'M', 'c'),
|
||||
]
|
||||
|
||||
def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x1D485, 'M', 'd'),
|
||||
(0x1D486, 'M', 'e'),
|
||||
(0x1D487, 'M', 'f'),
|
||||
|
@ -6454,10 +6474,6 @@ def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x1D492, 'M', 'q'),
|
||||
(0x1D493, 'M', 'r'),
|
||||
(0x1D494, 'M', 's'),
|
||||
]
|
||||
|
||||
def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x1D495, 'M', 't'),
|
||||
(0x1D496, 'M', 'u'),
|
||||
(0x1D497, 'M', 'v'),
|
||||
|
@ -6542,6 +6558,10 @@ def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x1D4E9, 'M', 'z'),
|
||||
(0x1D4EA, 'M', 'a'),
|
||||
(0x1D4EB, 'M', 'b'),
|
||||
]
|
||||
|
||||
def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x1D4EC, 'M', 'c'),
|
||||
(0x1D4ED, 'M', 'd'),
|
||||
(0x1D4EE, 'M', 'e'),
|
||||
|
@ -6558,10 +6578,6 @@ def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x1D4F9, 'M', 'p'),
|
||||
(0x1D4FA, 'M', 'q'),
|
||||
(0x1D4FB, 'M', 'r'),
|
||||
]
|
||||
|
||||
def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x1D4FC, 'M', 's'),
|
||||
(0x1D4FD, 'M', 't'),
|
||||
(0x1D4FE, 'M', 'u'),
|
||||
|
@ -6646,6 +6662,10 @@ def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x1D550, 'M', 'y'),
|
||||
(0x1D551, 'X'),
|
||||
(0x1D552, 'M', 'a'),
|
||||
]
|
||||
|
||||
def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x1D553, 'M', 'b'),
|
||||
(0x1D554, 'M', 'c'),
|
||||
(0x1D555, 'M', 'd'),
|
||||
|
@ -6662,10 +6682,6 @@ def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x1D560, 'M', 'o'),
|
||||
(0x1D561, 'M', 'p'),
|
||||
(0x1D562, 'M', 'q'),
|
||||
]
|
||||
|
||||
def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x1D563, 'M', 'r'),
|
||||
(0x1D564, 'M', 's'),
|
||||
(0x1D565, 'M', 't'),
|
||||
|
@ -6750,6 +6766,10 @@ def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x1D5B4, 'M', 'u'),
|
||||
(0x1D5B5, 'M', 'v'),
|
||||
(0x1D5B6, 'M', 'w'),
|
||||
]
|
||||
|
||||
def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x1D5B7, 'M', 'x'),
|
||||
(0x1D5B8, 'M', 'y'),
|
||||
(0x1D5B9, 'M', 'z'),
|
||||
|
@ -6766,10 +6786,6 @@ def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x1D5C4, 'M', 'k'),
|
||||
(0x1D5C5, 'M', 'l'),
|
||||
(0x1D5C6, 'M', 'm'),
|
||||
]
|
||||
|
||||
def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x1D5C7, 'M', 'n'),
|
||||
(0x1D5C8, 'M', 'o'),
|
||||
(0x1D5C9, 'M', 'p'),
|
||||
|
@ -6854,6 +6870,10 @@ def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x1D618, 'M', 'q'),
|
||||
(0x1D619, 'M', 'r'),
|
||||
(0x1D61A, 'M', 's'),
|
||||
]
|
||||
|
||||
def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x1D61B, 'M', 't'),
|
||||
(0x1D61C, 'M', 'u'),
|
||||
(0x1D61D, 'M', 'v'),
|
||||
|
@ -6870,10 +6890,6 @@ def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x1D628, 'M', 'g'),
|
||||
(0x1D629, 'M', 'h'),
|
||||
(0x1D62A, 'M', 'i'),
|
||||
]
|
||||
|
||||
def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x1D62B, 'M', 'j'),
|
||||
(0x1D62C, 'M', 'k'),
|
||||
(0x1D62D, 'M', 'l'),
|
||||
|
@ -6958,6 +6974,10 @@ def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x1D67C, 'M', 'm'),
|
||||
(0x1D67D, 'M', 'n'),
|
||||
(0x1D67E, 'M', 'o'),
|
||||
]
|
||||
|
||||
def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x1D67F, 'M', 'p'),
|
||||
(0x1D680, 'M', 'q'),
|
||||
(0x1D681, 'M', 'r'),
|
||||
|
@ -6974,10 +6994,6 @@ def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x1D68C, 'M', 'c'),
|
||||
(0x1D68D, 'M', 'd'),
|
||||
(0x1D68E, 'M', 'e'),
|
||||
]
|
||||
|
||||
def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x1D68F, 'M', 'f'),
|
||||
(0x1D690, 'M', 'g'),
|
||||
(0x1D691, 'M', 'h'),
|
||||
|
@ -7062,6 +7078,10 @@ def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x1D6E2, 'M', 'α'),
|
||||
(0x1D6E3, 'M', 'β'),
|
||||
(0x1D6E4, 'M', 'γ'),
|
||||
]
|
||||
|
||||
def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x1D6E5, 'M', 'δ'),
|
||||
(0x1D6E6, 'M', 'ε'),
|
||||
(0x1D6E7, 'M', 'ζ'),
|
||||
|
@ -7078,10 +7098,6 @@ def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x1D6F2, 'M', 'ρ'),
|
||||
(0x1D6F3, 'M', 'θ'),
|
||||
(0x1D6F4, 'M', 'σ'),
|
||||
]
|
||||
|
||||
def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x1D6F5, 'M', 'τ'),
|
||||
(0x1D6F6, 'M', 'υ'),
|
||||
(0x1D6F7, 'M', 'φ'),
|
||||
|
@ -7166,6 +7182,10 @@ def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x1D747, 'M', 'σ'),
|
||||
(0x1D749, 'M', 'τ'),
|
||||
(0x1D74A, 'M', 'υ'),
|
||||
]
|
||||
|
||||
def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x1D74B, 'M', 'φ'),
|
||||
(0x1D74C, 'M', 'χ'),
|
||||
(0x1D74D, 'M', 'ψ'),
|
||||
|
@ -7182,10 +7202,6 @@ def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x1D758, 'M', 'γ'),
|
||||
(0x1D759, 'M', 'δ'),
|
||||
(0x1D75A, 'M', 'ε'),
|
||||
]
|
||||
|
||||
def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x1D75B, 'M', 'ζ'),
|
||||
(0x1D75C, 'M', 'η'),
|
||||
(0x1D75D, 'M', 'θ'),
|
||||
|
@ -7270,6 +7286,10 @@ def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x1D7AD, 'M', 'δ'),
|
||||
(0x1D7AE, 'M', 'ε'),
|
||||
(0x1D7AF, 'M', 'ζ'),
|
||||
]
|
||||
|
||||
def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x1D7B0, 'M', 'η'),
|
||||
(0x1D7B1, 'M', 'θ'),
|
||||
(0x1D7B2, 'M', 'ι'),
|
||||
|
@ -7286,10 +7306,6 @@ def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x1D7BE, 'M', 'υ'),
|
||||
(0x1D7BF, 'M', 'φ'),
|
||||
(0x1D7C0, 'M', 'χ'),
|
||||
]
|
||||
|
||||
def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x1D7C1, 'M', 'ψ'),
|
||||
(0x1D7C2, 'M', 'ω'),
|
||||
(0x1D7C3, 'M', '∂'),
|
||||
|
@ -7359,6 +7375,8 @@ def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x1DAB0, 'X'),
|
||||
(0x1DF00, 'V'),
|
||||
(0x1DF1F, 'X'),
|
||||
(0x1DF25, 'V'),
|
||||
(0x1DF2B, 'X'),
|
||||
(0x1E000, 'V'),
|
||||
(0x1E007, 'X'),
|
||||
(0x1E008, 'V'),
|
||||
|
@ -7369,6 +7387,75 @@ def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x1E025, 'X'),
|
||||
(0x1E026, 'V'),
|
||||
(0x1E02B, 'X'),
|
||||
(0x1E030, 'M', 'а'),
|
||||
(0x1E031, 'M', 'б'),
|
||||
(0x1E032, 'M', 'в'),
|
||||
]
|
||||
|
||||
def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x1E033, 'M', 'г'),
|
||||
(0x1E034, 'M', 'д'),
|
||||
(0x1E035, 'M', 'е'),
|
||||
(0x1E036, 'M', 'ж'),
|
||||
(0x1E037, 'M', 'з'),
|
||||
(0x1E038, 'M', 'и'),
|
||||
(0x1E039, 'M', 'к'),
|
||||
(0x1E03A, 'M', 'л'),
|
||||
(0x1E03B, 'M', 'м'),
|
||||
(0x1E03C, 'M', 'о'),
|
||||
(0x1E03D, 'M', 'п'),
|
||||
(0x1E03E, 'M', 'р'),
|
||||
(0x1E03F, 'M', 'с'),
|
||||
(0x1E040, 'M', 'т'),
|
||||
(0x1E041, 'M', 'у'),
|
||||
(0x1E042, 'M', 'ф'),
|
||||
(0x1E043, 'M', 'х'),
|
||||
(0x1E044, 'M', 'ц'),
|
||||
(0x1E045, 'M', 'ч'),
|
||||
(0x1E046, 'M', 'ш'),
|
||||
(0x1E047, 'M', 'ы'),
|
||||
(0x1E048, 'M', 'э'),
|
||||
(0x1E049, 'M', 'ю'),
|
||||
(0x1E04A, 'M', 'ꚉ'),
|
||||
(0x1E04B, 'M', 'ә'),
|
||||
(0x1E04C, 'M', 'і'),
|
||||
(0x1E04D, 'M', 'ј'),
|
||||
(0x1E04E, 'M', 'ө'),
|
||||
(0x1E04F, 'M', 'ү'),
|
||||
(0x1E050, 'M', 'ӏ'),
|
||||
(0x1E051, 'M', 'а'),
|
||||
(0x1E052, 'M', 'б'),
|
||||
(0x1E053, 'M', 'в'),
|
||||
(0x1E054, 'M', 'г'),
|
||||
(0x1E055, 'M', 'д'),
|
||||
(0x1E056, 'M', 'е'),
|
||||
(0x1E057, 'M', 'ж'),
|
||||
(0x1E058, 'M', 'з'),
|
||||
(0x1E059, 'M', 'и'),
|
||||
(0x1E05A, 'M', 'к'),
|
||||
(0x1E05B, 'M', 'л'),
|
||||
(0x1E05C, 'M', 'о'),
|
||||
(0x1E05D, 'M', 'п'),
|
||||
(0x1E05E, 'M', 'с'),
|
||||
(0x1E05F, 'M', 'у'),
|
||||
(0x1E060, 'M', 'ф'),
|
||||
(0x1E061, 'M', 'х'),
|
||||
(0x1E062, 'M', 'ц'),
|
||||
(0x1E063, 'M', 'ч'),
|
||||
(0x1E064, 'M', 'ш'),
|
||||
(0x1E065, 'M', 'ъ'),
|
||||
(0x1E066, 'M', 'ы'),
|
||||
(0x1E067, 'M', 'ґ'),
|
||||
(0x1E068, 'M', 'і'),
|
||||
(0x1E069, 'M', 'ѕ'),
|
||||
(0x1E06A, 'M', 'џ'),
|
||||
(0x1E06B, 'M', 'ҫ'),
|
||||
(0x1E06C, 'M', 'ꙑ'),
|
||||
(0x1E06D, 'M', 'ұ'),
|
||||
(0x1E06E, 'X'),
|
||||
(0x1E08F, 'V'),
|
||||
(0x1E090, 'X'),
|
||||
(0x1E100, 'V'),
|
||||
(0x1E12D, 'X'),
|
||||
(0x1E130, 'V'),
|
||||
|
@ -7383,6 +7470,8 @@ def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x1E2FA, 'X'),
|
||||
(0x1E2FF, 'V'),
|
||||
(0x1E300, 'X'),
|
||||
(0x1E4D0, 'V'),
|
||||
(0x1E4FA, 'X'),
|
||||
(0x1E7E0, 'V'),
|
||||
(0x1E7E7, 'X'),
|
||||
(0x1E7E8, 'V'),
|
||||
|
@ -7390,10 +7479,6 @@ def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x1E7ED, 'V'),
|
||||
(0x1E7EF, 'X'),
|
||||
(0x1E7F0, 'V'),
|
||||
]
|
||||
|
||||
def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x1E7FF, 'X'),
|
||||
(0x1E800, 'V'),
|
||||
(0x1E8C5, 'X'),
|
||||
|
@ -7409,6 +7494,10 @@ def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x1E907, 'M', '𞤩'),
|
||||
(0x1E908, 'M', '𞤪'),
|
||||
(0x1E909, 'M', '𞤫'),
|
||||
]
|
||||
|
||||
def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x1E90A, 'M', '𞤬'),
|
||||
(0x1E90B, 'M', '𞤭'),
|
||||
(0x1E90C, 'M', '𞤮'),
|
||||
|
@ -7494,10 +7583,6 @@ def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x1EE31, 'M', 'ص'),
|
||||
(0x1EE32, 'M', 'ق'),
|
||||
(0x1EE33, 'X'),
|
||||
]
|
||||
|
||||
def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x1EE34, 'M', 'ش'),
|
||||
(0x1EE35, 'M', 'ت'),
|
||||
(0x1EE36, 'M', 'ث'),
|
||||
|
@ -7513,6 +7598,10 @@ def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x1EE48, 'X'),
|
||||
(0x1EE49, 'M', 'ي'),
|
||||
(0x1EE4A, 'X'),
|
||||
]
|
||||
|
||||
def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x1EE4B, 'M', 'ل'),
|
||||
(0x1EE4C, 'X'),
|
||||
(0x1EE4D, 'M', 'ن'),
|
||||
|
@ -7598,10 +7687,6 @@ def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x1EEA3, 'M', 'د'),
|
||||
(0x1EEA4, 'X'),
|
||||
(0x1EEA5, 'M', 'و'),
|
||||
]
|
||||
|
||||
def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x1EEA6, 'M', 'ز'),
|
||||
(0x1EEA7, 'M', 'ح'),
|
||||
(0x1EEA8, 'M', 'ط'),
|
||||
|
@ -7617,6 +7702,10 @@ def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x1EEB2, 'M', 'ق'),
|
||||
(0x1EEB3, 'M', 'ر'),
|
||||
(0x1EEB4, 'M', 'ش'),
|
||||
]
|
||||
|
||||
def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x1EEB5, 'M', 'ت'),
|
||||
(0x1EEB6, 'M', 'ث'),
|
||||
(0x1EEB7, 'M', 'خ'),
|
||||
|
@ -7702,10 +7791,6 @@ def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x1F141, 'M', 'r'),
|
||||
(0x1F142, 'M', 's'),
|
||||
(0x1F143, 'M', 't'),
|
||||
]
|
||||
|
||||
def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x1F144, 'M', 'u'),
|
||||
(0x1F145, 'M', 'v'),
|
||||
(0x1F146, 'M', 'w'),
|
||||
|
@ -7721,6 +7806,10 @@ def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x1F150, 'V'),
|
||||
(0x1F16A, 'M', 'mc'),
|
||||
(0x1F16B, 'M', 'md'),
|
||||
]
|
||||
|
||||
def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x1F16C, 'M', 'mr'),
|
||||
(0x1F16D, 'V'),
|
||||
(0x1F190, 'M', 'dj'),
|
||||
|
@ -7793,23 +7882,19 @@ def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x1F266, 'X'),
|
||||
(0x1F300, 'V'),
|
||||
(0x1F6D8, 'X'),
|
||||
(0x1F6DD, 'V'),
|
||||
(0x1F6DC, 'V'),
|
||||
(0x1F6ED, 'X'),
|
||||
(0x1F6F0, 'V'),
|
||||
(0x1F6FD, 'X'),
|
||||
(0x1F700, 'V'),
|
||||
(0x1F774, 'X'),
|
||||
(0x1F780, 'V'),
|
||||
(0x1F7D9, 'X'),
|
||||
(0x1F777, 'X'),
|
||||
(0x1F77B, 'V'),
|
||||
(0x1F7DA, 'X'),
|
||||
(0x1F7E0, 'V'),
|
||||
(0x1F7EC, 'X'),
|
||||
(0x1F7F0, 'V'),
|
||||
(0x1F7F1, 'X'),
|
||||
(0x1F800, 'V'),
|
||||
]
|
||||
|
||||
def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x1F80C, 'X'),
|
||||
(0x1F810, 'V'),
|
||||
(0x1F848, 'X'),
|
||||
|
@ -7825,24 +7910,24 @@ def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x1FA54, 'X'),
|
||||
(0x1FA60, 'V'),
|
||||
(0x1FA6E, 'X'),
|
||||
]
|
||||
|
||||
def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x1FA70, 'V'),
|
||||
(0x1FA75, 'X'),
|
||||
(0x1FA78, 'V'),
|
||||
(0x1FA7D, 'X'),
|
||||
(0x1FA80, 'V'),
|
||||
(0x1FA87, 'X'),
|
||||
(0x1FA89, 'X'),
|
||||
(0x1FA90, 'V'),
|
||||
(0x1FAAD, 'X'),
|
||||
(0x1FAB0, 'V'),
|
||||
(0x1FABB, 'X'),
|
||||
(0x1FAC0, 'V'),
|
||||
(0x1FABE, 'X'),
|
||||
(0x1FABF, 'V'),
|
||||
(0x1FAC6, 'X'),
|
||||
(0x1FAD0, 'V'),
|
||||
(0x1FADA, 'X'),
|
||||
(0x1FACE, 'V'),
|
||||
(0x1FADC, 'X'),
|
||||
(0x1FAE0, 'V'),
|
||||
(0x1FAE8, 'X'),
|
||||
(0x1FAE9, 'X'),
|
||||
(0x1FAF0, 'V'),
|
||||
(0x1FAF7, 'X'),
|
||||
(0x1FAF9, 'X'),
|
||||
(0x1FB00, 'V'),
|
||||
(0x1FB93, 'X'),
|
||||
(0x1FB94, 'V'),
|
||||
|
@ -7861,7 +7946,7 @@ def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x20000, 'V'),
|
||||
(0x2A6E0, 'X'),
|
||||
(0x2A700, 'V'),
|
||||
(0x2B739, 'X'),
|
||||
(0x2B73A, 'X'),
|
||||
(0x2B740, 'V'),
|
||||
(0x2B81E, 'X'),
|
||||
(0x2B820, 'V'),
|
||||
|
@ -7910,10 +7995,6 @@ def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x2F827, 'M', '勤'),
|
||||
(0x2F828, 'M', '勺'),
|
||||
(0x2F829, 'M', '包'),
|
||||
]
|
||||
|
||||
def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x2F82A, 'M', '匆'),
|
||||
(0x2F82B, 'M', '北'),
|
||||
(0x2F82C, 'M', '卉'),
|
||||
|
@ -7933,6 +8014,10 @@ def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x2F83C, 'M', '咞'),
|
||||
(0x2F83D, 'M', '吸'),
|
||||
(0x2F83E, 'M', '呈'),
|
||||
]
|
||||
|
||||
def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x2F83F, 'M', '周'),
|
||||
(0x2F840, 'M', '咢'),
|
||||
(0x2F841, 'M', '哶'),
|
||||
|
@ -8014,10 +8099,6 @@ def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x2F88F, 'M', '𪎒'),
|
||||
(0x2F890, 'M', '廾'),
|
||||
(0x2F891, 'M', '𢌱'),
|
||||
]
|
||||
|
||||
def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x2F893, 'M', '舁'),
|
||||
(0x2F894, 'M', '弢'),
|
||||
(0x2F896, 'M', '㣇'),
|
||||
|
@ -8037,6 +8118,10 @@ def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x2F8A4, 'M', '𢛔'),
|
||||
(0x2F8A5, 'M', '惇'),
|
||||
(0x2F8A6, 'M', '慈'),
|
||||
]
|
||||
|
||||
def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x2F8A7, 'M', '慌'),
|
||||
(0x2F8A8, 'M', '慎'),
|
||||
(0x2F8A9, 'M', '慌'),
|
||||
|
@ -8118,10 +8203,6 @@ def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x2F8F5, 'M', '殺'),
|
||||
(0x2F8F6, 'M', '殻'),
|
||||
(0x2F8F7, 'M', '𣪍'),
|
||||
]
|
||||
|
||||
def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x2F8F8, 'M', '𡴋'),
|
||||
(0x2F8F9, 'M', '𣫺'),
|
||||
(0x2F8FA, 'M', '汎'),
|
||||
|
@ -8141,6 +8222,10 @@ def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x2F908, 'M', '港'),
|
||||
(0x2F909, 'M', '湮'),
|
||||
(0x2F90A, 'M', '㴳'),
|
||||
]
|
||||
|
||||
def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x2F90B, 'M', '滋'),
|
||||
(0x2F90C, 'M', '滇'),
|
||||
(0x2F90D, 'M', '𣻑'),
|
||||
|
@ -8222,10 +8307,6 @@ def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x2F95B, 'M', '穏'),
|
||||
(0x2F95C, 'M', '𥥼'),
|
||||
(0x2F95D, 'M', '𥪧'),
|
||||
]
|
||||
|
||||
def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x2F95F, 'X'),
|
||||
(0x2F960, 'M', '䈂'),
|
||||
(0x2F961, 'M', '𥮫'),
|
||||
|
@ -8245,6 +8326,10 @@ def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x2F96F, 'M', '縂'),
|
||||
(0x2F970, 'M', '繅'),
|
||||
(0x2F971, 'M', '䌴'),
|
||||
]
|
||||
|
||||
def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x2F972, 'M', '𦈨'),
|
||||
(0x2F973, 'M', '𦉇'),
|
||||
(0x2F974, 'M', '䍙'),
|
||||
|
@ -8326,10 +8411,6 @@ def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x2F9C0, 'M', '蟡'),
|
||||
(0x2F9C1, 'M', '蠁'),
|
||||
(0x2F9C2, 'M', '䗹'),
|
||||
]
|
||||
|
||||
def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x2F9C3, 'M', '衠'),
|
||||
(0x2F9C4, 'M', '衣'),
|
||||
(0x2F9C5, 'M', '𧙧'),
|
||||
|
@ -8349,6 +8430,10 @@ def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x2F9D3, 'M', '𧲨'),
|
||||
(0x2F9D4, 'M', '貫'),
|
||||
(0x2F9D5, 'M', '賁'),
|
||||
]
|
||||
|
||||
def _seg_81() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
||||
return [
|
||||
(0x2F9D6, 'M', '贛'),
|
||||
(0x2F9D7, 'M', '起'),
|
||||
(0x2F9D8, 'M', '𧼯'),
|
||||
|
@ -8423,6 +8508,8 @@ def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
|
|||
(0x2FA1E, 'X'),
|
||||
(0x30000, 'V'),
|
||||
(0x3134B, 'X'),
|
||||
(0x31350, 'V'),
|
||||
(0x323B0, 'X'),
|
||||
(0xE0100, 'I'),
|
||||
(0xE01F0, 'X'),
|
||||
]
|
||||
|
@ -8509,4 +8596,5 @@ uts46data = tuple(
|
|||
+ _seg_78()
|
||||
+ _seg_79()
|
||||
+ _seg_80()
|
||||
+ _seg_81()
|
||||
) # type: Tuple[Union[Tuple[int, str], Tuple[int, str, str]], ...]
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
"""Wrappers to build Python packages using PEP 517 hooks
|
||||
"""
|
||||
|
||||
__version__ = '0.12.0'
|
||||
__version__ = '0.13.0'
|
||||
|
||||
from .wrappers import * # noqa: F401, F403
|
||||
|
|
|
@ -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.
|
||||
"""
|
||||
import argparse
|
||||
import io
|
||||
import logging
|
||||
import os
|
||||
import shutil
|
||||
import tempfile
|
||||
|
||||
from ._compat import tomllib
|
||||
from .envbuild import BuildEnvironment
|
||||
from .wrappers import Pep517HookCaller
|
||||
from .dirtools import tempdir, mkdir_p
|
||||
from .compat import FileNotFoundError, toml_load
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
@ -31,8 +30,8 @@ def load_system(source_dir):
|
|||
Load the build system from a source dir (pyproject.toml).
|
||||
"""
|
||||
pyproject = os.path.join(source_dir, 'pyproject.toml')
|
||||
with io.open(pyproject, 'rb') as f:
|
||||
pyproject_data = toml_load(f)
|
||||
with open(pyproject, 'rb') as f:
|
||||
pyproject_data = tomllib.load(f)
|
||||
return pyproject_data['build-system']
|
||||
|
||||
|
||||
|
@ -64,7 +63,7 @@ def _do_build(hooks, env, dist, dest):
|
|||
env.pip_install(reqs)
|
||||
log.info('Installed dynamic build dependencies')
|
||||
|
||||
with tempdir() as td:
|
||||
with tempfile.TemporaryDirectory() as td:
|
||||
log.info('Trying to build %s in %s', dist, td)
|
||||
build_name = 'build_{dist}'.format(**locals())
|
||||
build = getattr(hooks, build_name)
|
||||
|
@ -76,7 +75,7 @@ def _do_build(hooks, env, dist, dest):
|
|||
def build(source_dir, dist, dest=None, system=None):
|
||||
system = system or load_system(source_dir)
|
||||
dest = os.path.join(source_dir, dest or 'dist')
|
||||
mkdir_p(dest)
|
||||
os.makedirs(dest, exist_ok=True)
|
||||
|
||||
validate_system(system)
|
||||
hooks = Pep517HookCaller(
|
||||
|
|
|
@ -1,19 +1,19 @@
|
|||
"""Check a project and backend by attempting to build using PEP 517 hooks.
|
||||
"""
|
||||
import argparse
|
||||
import io
|
||||
import logging
|
||||
import os
|
||||
from os.path import isfile, join as pjoin
|
||||
import shutil
|
||||
from subprocess import CalledProcessError
|
||||
import sys
|
||||
import tarfile
|
||||
from tempfile import mkdtemp
|
||||
import zipfile
|
||||
from os.path import isfile
|
||||
from os.path import join as pjoin
|
||||
from subprocess import CalledProcessError
|
||||
from tempfile import mkdtemp
|
||||
|
||||
from ._compat import tomllib
|
||||
from .colorlog import enable_colourful_output
|
||||
from .compat import TOMLDecodeError, toml_load
|
||||
from .envbuild import BuildEnvironment
|
||||
from .wrappers import Pep517HookCaller
|
||||
|
||||
|
@ -142,15 +142,15 @@ def check(source_dir):
|
|||
return False
|
||||
|
||||
try:
|
||||
with io.open(pyproject, 'rb') as f:
|
||||
pyproject_data = toml_load(f)
|
||||
with open(pyproject, 'rb') as f:
|
||||
pyproject_data = tomllib.load(f)
|
||||
# Ensure the mandatory data can be loaded
|
||||
buildsys = pyproject_data['build-system']
|
||||
requires = buildsys['requires']
|
||||
backend = buildsys['build-backend']
|
||||
backend_path = buildsys.get('backend-path')
|
||||
log.info('Loaded pyproject.toml')
|
||||
except (TOMLDecodeError, KeyError):
|
||||
except (tomllib.TOMLDecodeError, KeyError):
|
||||
log.error("Invalid pyproject.toml", exc_info=True)
|
||||
return False
|
||||
|
||||
|
|
|
@ -73,8 +73,6 @@ class LogFormatter(logging.Formatter):
|
|||
# right conversion in python 3.
|
||||
fg_color = (curses.tigetstr("setaf") or
|
||||
curses.tigetstr("setf") or "")
|
||||
if (3, 0) < sys.version_info < (3, 2, 3):
|
||||
fg_color = str(fg_color, "ascii")
|
||||
|
||||
for levelno, code in self.DEFAULT_COLORS.items():
|
||||
self._colors[levelno] = str(
|
||||
|
|
|
@ -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 contextlib
|
||||
import tempfile
|
||||
import shutil
|
||||
import errno
|
||||
import os
|
||||
import zipfile
|
||||
|
||||
|
||||
@contextlib.contextmanager
|
||||
def tempdir():
|
||||
"""Create a temporary directory in a context manager."""
|
||||
td = tempfile.mkdtemp()
|
||||
try:
|
||||
yield td
|
||||
finally:
|
||||
shutil.rmtree(td)
|
||||
|
||||
|
||||
def mkdir_p(*args, **kwargs):
|
||||
"""Like `mkdir`, but does not raise an exception if the
|
||||
directory already exists.
|
||||
"""
|
||||
try:
|
||||
return os.mkdir(*args, **kwargs)
|
||||
except OSError as exc:
|
||||
if exc.errno != errno.EEXIST:
|
||||
raise
|
||||
|
||||
|
||||
def dir_to_zipfile(root):
|
||||
"""Construct an in-memory zip file for a directory."""
|
||||
buffer = io.BytesIO()
|
||||
|
|
|
@ -1,27 +1,26 @@
|
|||
"""Build wheels/sdists by installing build deps to a temporary environment.
|
||||
"""
|
||||
|
||||
import io
|
||||
import os
|
||||
import logging
|
||||
import os
|
||||
import shutil
|
||||
from subprocess import check_call
|
||||
import sys
|
||||
from subprocess import check_call
|
||||
from sysconfig import get_paths
|
||||
from tempfile import mkdtemp
|
||||
|
||||
from .compat import toml_load
|
||||
from .wrappers import Pep517HookCaller, LoggerWrapper
|
||||
from ._compat import tomllib
|
||||
from .wrappers import LoggerWrapper, Pep517HookCaller
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def _load_pyproject(source_dir):
|
||||
with io.open(
|
||||
with open(
|
||||
os.path.join(source_dir, 'pyproject.toml'),
|
||||
'rb',
|
||||
) as f:
|
||||
pyproject_data = toml_load(f)
|
||||
pyproject_data = tomllib.load(f)
|
||||
buildsys = pyproject_data['build-system']
|
||||
return (
|
||||
buildsys['requires'],
|
||||
|
@ -30,7 +29,7 @@ def _load_pyproject(source_dir):
|
|||
)
|
||||
|
||||
|
||||
class BuildEnvironment(object):
|
||||
class BuildEnvironment:
|
||||
"""Context manager to install build deps in a simple temporary environment
|
||||
|
||||
Based on code I wrote for pip, which is MIT licensed.
|
||||
|
|
|
@ -3,15 +3,24 @@
|
|||
The subpackage should stay as empty as possible to avoid shadowing modules that
|
||||
the backend might import.
|
||||
"""
|
||||
from os.path import dirname, abspath, join as pjoin
|
||||
from contextlib import contextmanager
|
||||
from os.path import abspath, dirname
|
||||
from os.path import join as pjoin
|
||||
|
||||
try:
|
||||
import importlib.resources as resources
|
||||
|
||||
try:
|
||||
resources.files
|
||||
except AttributeError:
|
||||
# Python 3.8 compatibility
|
||||
def _in_proc_script_path():
|
||||
return resources.path(__package__, '_in_process.py')
|
||||
else:
|
||||
def _in_proc_script_path():
|
||||
return resources.as_file(
|
||||
resources.files(__package__).joinpath('_in_process.py'))
|
||||
except ImportError:
|
||||
# Python 3.6 compatibility
|
||||
@contextmanager
|
||||
def _in_proc_script_path():
|
||||
yield pjoin(dirname(abspath(__file__)), '_in_process.py')
|
||||
|
|
|
@ -12,40 +12,28 @@ Results:
|
|||
- control_dir/output.json
|
||||
- {"return_val": ...}
|
||||
"""
|
||||
from glob import glob
|
||||
from importlib import import_module
|
||||
import json
|
||||
import os
|
||||
import os.path
|
||||
from os.path import join as pjoin
|
||||
import re
|
||||
import shutil
|
||||
import sys
|
||||
import traceback
|
||||
from glob import glob
|
||||
from importlib import import_module
|
||||
from os.path import join as pjoin
|
||||
|
||||
# This file is run as a script, and `import compat` is not zip-safe, so we
|
||||
# include write_json() and read_json() from compat.py.
|
||||
#
|
||||
# Handle reading and writing JSON in UTF-8, on Python 3 and 2.
|
||||
# This file is run as a script, and `import wrappers` is not zip-safe, so we
|
||||
# include write_json() and read_json() from wrappers.py.
|
||||
|
||||
if sys.version_info[0] >= 3:
|
||||
# Python 3
|
||||
def write_json(obj, path, **kwargs):
|
||||
|
||||
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:
|
||||
def read_json(path):
|
||||
with open(path, encoding='utf-8') as f:
|
||||
return json.load(f)
|
||||
|
||||
|
||||
|
@ -64,7 +52,7 @@ class BackendInvalid(Exception):
|
|||
class HookMissing(Exception):
|
||||
"""Raised if a hook is missing and we are not executing the fallback"""
|
||||
def __init__(self, hook_name=None):
|
||||
super(HookMissing, self).__init__(hook_name)
|
||||
super().__init__(hook_name)
|
||||
self.hook_name = hook_name
|
||||
|
||||
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
"""Build metadata for a project using PEP 517 hooks.
|
||||
"""
|
||||
import argparse
|
||||
import functools
|
||||
import logging
|
||||
import os
|
||||
import shutil
|
||||
import functools
|
||||
import tempfile
|
||||
|
||||
try:
|
||||
import importlib.metadata as imp_meta
|
||||
|
@ -16,10 +17,10 @@ try:
|
|||
except ImportError:
|
||||
from zipp import Path
|
||||
|
||||
from .build import compat_system, load_system, validate_system
|
||||
from .dirtools import dir_to_zipfile
|
||||
from .envbuild import BuildEnvironment
|
||||
from .wrappers import Pep517HookCaller, quiet_subprocess_runner
|
||||
from .dirtools import tempdir, mkdir_p, dir_to_zipfile
|
||||
from .build import validate_system, load_system, compat_system
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
@ -31,7 +32,7 @@ def _prep_meta(hooks, env, dest):
|
|||
env.pip_install(reqs)
|
||||
log.info('Installed dynamic build dependencies')
|
||||
|
||||
with tempdir() as td:
|
||||
with tempfile.TemporaryDirectory() as td:
|
||||
log.info('Trying to build metadata in %s', td)
|
||||
filename = hooks.prepare_metadata_for_build_wheel(td, {})
|
||||
source = os.path.join(td, filename)
|
||||
|
@ -41,7 +42,7 @@ def _prep_meta(hooks, env, dest):
|
|||
def build(source_dir='.', dest=None, system=None):
|
||||
system = system or load_system(source_dir)
|
||||
dest = os.path.join(source_dir, dest or 'dist')
|
||||
mkdir_p(dest)
|
||||
os.makedirs(dest, exist_ok=True)
|
||||
validate_system(system)
|
||||
hooks = Pep517HookCaller(
|
||||
source_dir, system['build-backend'], system.get('backend-path')
|
||||
|
@ -54,7 +55,7 @@ def build(source_dir='.', dest=None, system=None):
|
|||
|
||||
|
||||
def build_as_zip(builder=build):
|
||||
with tempdir() as out_dir:
|
||||
with tempfile.TemporaryDirectory() as out_dir:
|
||||
builder(dest=out_dir)
|
||||
return dir_to_zipfile(out_dir)
|
||||
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
import json
|
||||
import os
|
||||
import sys
|
||||
import tempfile
|
||||
import threading
|
||||
from contextlib import contextmanager
|
||||
import os
|
||||
from os.path import abspath, join as pjoin
|
||||
import shutil
|
||||
from subprocess import check_call, check_output, STDOUT
|
||||
import sys
|
||||
from tempfile import mkdtemp
|
||||
from os.path import abspath
|
||||
from os.path import join as pjoin
|
||||
from subprocess import STDOUT, check_call, check_output
|
||||
|
||||
from . import compat
|
||||
from .in_process import _in_proc_script_path
|
||||
|
||||
__all__ = [
|
||||
|
@ -21,13 +21,14 @@ __all__ = [
|
|||
]
|
||||
|
||||
|
||||
@contextmanager
|
||||
def tempdir():
|
||||
td = mkdtemp()
|
||||
try:
|
||||
yield td
|
||||
finally:
|
||||
shutil.rmtree(td)
|
||||
def write_json(obj, path, **kwargs):
|
||||
with open(path, 'w', encoding='utf-8') as f:
|
||||
json.dump(obj, f, **kwargs)
|
||||
|
||||
|
||||
def read_json(path):
|
||||
with open(path, encoding='utf-8') as f:
|
||||
return json.load(f)
|
||||
|
||||
|
||||
class BackendUnavailable(Exception):
|
||||
|
@ -47,7 +48,7 @@ class BackendInvalid(Exception):
|
|||
class HookMissing(Exception):
|
||||
"""Will be raised on missing hooks."""
|
||||
def __init__(self, hook_name):
|
||||
super(HookMissing, self).__init__(hook_name)
|
||||
super().__init__(hook_name)
|
||||
self.hook_name = hook_name
|
||||
|
||||
|
||||
|
@ -99,7 +100,7 @@ def norm_and_check(source_tree, requested):
|
|||
return abs_requested
|
||||
|
||||
|
||||
class Pep517HookCaller(object):
|
||||
class Pep517HookCaller:
|
||||
"""A wrapper around a source directory to be built with a PEP 517 backend.
|
||||
|
||||
:param source_dir: The path to the source directory, containing
|
||||
|
@ -292,29 +293,15 @@ class Pep517HookCaller(object):
|
|||
})
|
||||
|
||||
def _call_hook(self, hook_name, kwargs):
|
||||
# On Python 2, pytoml returns Unicode values (which is correct) but the
|
||||
# environment passed to check_call needs to contain string values. We
|
||||
# convert here by encoding using ASCII (the backend can only contain
|
||||
# letters, digits and _, . and : characters, and will be used as a
|
||||
# Python identifier, so non-ASCII content is wrong on Python 2 in
|
||||
# any case).
|
||||
# For backend_path, we use sys.getfilesystemencoding.
|
||||
if sys.version_info[0] == 2:
|
||||
build_backend = self.build_backend.encode('ASCII')
|
||||
else:
|
||||
build_backend = self.build_backend
|
||||
extra_environ = {'PEP517_BUILD_BACKEND': build_backend}
|
||||
extra_environ = {'PEP517_BUILD_BACKEND': self.build_backend}
|
||||
|
||||
if self.backend_path:
|
||||
backend_path = os.pathsep.join(self.backend_path)
|
||||
if sys.version_info[0] == 2:
|
||||
backend_path = backend_path.encode(sys.getfilesystemencoding())
|
||||
extra_environ['PEP517_BACKEND_PATH'] = backend_path
|
||||
|
||||
with tempdir() as td:
|
||||
with tempfile.TemporaryDirectory() as td:
|
||||
hook_input = {'kwargs': kwargs}
|
||||
compat.write_json(hook_input, pjoin(td, 'input.json'),
|
||||
indent=2)
|
||||
write_json(hook_input, pjoin(td, 'input.json'), indent=2)
|
||||
|
||||
# Run the hook in a subprocess
|
||||
with _in_proc_script_path() as script:
|
||||
|
@ -325,7 +312,7 @@ class Pep517HookCaller(object):
|
|||
extra_environ=extra_environ
|
||||
)
|
||||
|
||||
data = compat.read_json(pjoin(td, 'output.json'))
|
||||
data = read_json(pjoin(td, 'output.json'))
|
||||
if data.get('unsupported'):
|
||||
raise UnsupportedOperation(data.get('traceback', ''))
|
||||
if data.get('no_backend'):
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
"""
|
||||
from io import StringIO, BytesIO
|
||||
|
||||
__version__ = '2.12.0'
|
||||
__version__ = '2.13.0'
|
||||
__docformat__ = 'restructuredtext'
|
||||
|
||||
__all__ = ['lex', 'format', 'highlight']
|
||||
|
@ -38,10 +38,10 @@ def lex(code, lexer):
|
|||
"""
|
||||
try:
|
||||
return lexer.get_tokens(code)
|
||||
except TypeError as err:
|
||||
if (isinstance(err.args[0], str) and
|
||||
('unbound method get_tokens' in err.args[0] or
|
||||
'missing 1 required positional argument' in err.args[0])):
|
||||
except TypeError:
|
||||
# Heuristic to catch a common mistake.
|
||||
from pip._vendor.pygments.lexer import RegexLexer
|
||||
if isinstance(lexer, type) and issubclass(lexer, RegexLexer):
|
||||
raise TypeError('lex() argument must be a lexer instance, '
|
||||
'not a class')
|
||||
raise
|
||||
|
@ -62,10 +62,10 @@ def format(tokens, formatter, outfile=None): # pylint: disable=redefined-builti
|
|||
return realoutfile.getvalue()
|
||||
else:
|
||||
formatter.format(tokens, outfile)
|
||||
except TypeError as err:
|
||||
if (isinstance(err.args[0], str) and
|
||||
('unbound method format' in err.args[0] or
|
||||
'missing 1 required positional argument' in err.args[0])):
|
||||
except TypeError:
|
||||
# Heuristic to catch a common mistake.
|
||||
from pip._vendor.pygments.formatter import Formatter
|
||||
if isinstance(formatter, type) and issubclass(formatter, Formatter):
|
||||
raise TypeError('format() argument must be a formatter instance, '
|
||||
'not a class')
|
||||
raise
|
||||
|
@ -80,4 +80,3 @@ def highlight(code, lexer, formatter, outfile=None):
|
|||
it is returned as a string.
|
||||
"""
|
||||
return format(lex(code, lexer), formatter, outfile)
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@ from pip._vendor.pygments.formatters.latex import LatexEmbeddedLexer, LatexForma
|
|||
from pip._vendor.pygments.formatters import get_all_formatters, get_formatter_by_name, \
|
||||
load_formatter_from_file, get_formatter_for_filename, find_formatter_class
|
||||
from pip._vendor.pygments.formatters.terminal import TerminalFormatter
|
||||
from pip._vendor.pygments.formatters.terminal256 import Terminal256Formatter
|
||||
from pip._vendor.pygments.formatters.terminal256 import Terminal256Formatter, TerminalTrueColorFormatter
|
||||
from pip._vendor.pygments.filters import get_all_filters, find_filter_class
|
||||
from pip._vendor.pygments.styles import get_all_styles, get_style_by_name
|
||||
|
||||
|
@ -445,7 +445,9 @@ def main_inner(parser, argns):
|
|||
return 1
|
||||
else:
|
||||
if not fmter:
|
||||
if '256' in os.environ.get('TERM', ''):
|
||||
if os.environ.get('COLORTERM','') in ('truecolor', '24bit'):
|
||||
fmter = TerminalTrueColorFormatter(**parsed_opts)
|
||||
elif '256' in os.environ.get('TERM', ''):
|
||||
fmter = Terminal256Formatter(**parsed_opts)
|
||||
else:
|
||||
fmter = TerminalFormatter(**parsed_opts)
|
||||
|
@ -636,6 +638,9 @@ def main(args=sys.argv):
|
|||
|
||||
try:
|
||||
return main_inner(parser, argns)
|
||||
except BrokenPipeError:
|
||||
# someone closed our stdout, e.g. by quitting a pager.
|
||||
return 0
|
||||
except Exception:
|
||||
if argns.v:
|
||||
print(file=sys.stderr)
|
||||
|
|
|
@ -69,13 +69,16 @@ class CodeTagFilter(Filter):
|
|||
|
||||
`codetags` : list of strings
|
||||
A list of strings that are flagged as code tags. The default is to
|
||||
highlight ``XXX``, ``TODO``, ``BUG`` and ``NOTE``.
|
||||
highlight ``XXX``, ``TODO``, ``FIXME``, ``BUG`` and ``NOTE``.
|
||||
|
||||
.. versionchanged:: 2.13
|
||||
Now recognizes ``FIXME`` by default.
|
||||
"""
|
||||
|
||||
def __init__(self, **options):
|
||||
Filter.__init__(self, **options)
|
||||
tags = get_list_opt(options, 'codetags',
|
||||
['XXX', 'TODO', 'BUG', 'NOTE'])
|
||||
['XXX', 'TODO', 'FIXME', 'BUG', 'NOTE'])
|
||||
self.tag_re = re.compile(r'\b(%s)\b' % '|'.join([
|
||||
re.escape(tag) for tag in tags if tag
|
||||
]))
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
import re
|
||||
import sys
|
||||
import types
|
||||
import fnmatch
|
||||
from fnmatch import fnmatch
|
||||
from os.path import basename
|
||||
|
||||
from pip._vendor.pygments.formatters._mapping import FORMATTERS
|
||||
|
@ -22,16 +22,6 @@ __all__ = ['get_formatter_by_name', 'get_formatter_for_filename',
|
|||
'get_all_formatters', 'load_formatter_from_file'] + list(FORMATTERS)
|
||||
|
||||
_formatter_cache = {} # classes by name
|
||||
_pattern_cache = {}
|
||||
|
||||
|
||||
def _fn_matches(fn, glob):
|
||||
"""Return whether the supplied file name fn matches pattern filename."""
|
||||
if glob not in _pattern_cache:
|
||||
pattern = _pattern_cache[glob] = re.compile(fnmatch.translate(glob))
|
||||
return pattern.match(fn)
|
||||
return _pattern_cache[glob].match(fn)
|
||||
|
||||
|
||||
def _load_formatters(module_name):
|
||||
"""Load a formatter (and all others in the module too)."""
|
||||
|
@ -122,13 +112,13 @@ def get_formatter_for_filename(fn, **options):
|
|||
fn = basename(fn)
|
||||
for modname, name, _, filenames, _ in FORMATTERS.values():
|
||||
for filename in filenames:
|
||||
if _fn_matches(fn, filename):
|
||||
if fnmatch(fn, filename):
|
||||
if name not in _formatter_cache:
|
||||
_load_formatters(modname)
|
||||
return _formatter_cache[name](**options)
|
||||
for cls in find_plugin_formatters():
|
||||
for filename in cls.filenames:
|
||||
if _fn_matches(fn, filename):
|
||||
if fnmatch(fn, filename):
|
||||
return cls(**options)
|
||||
raise ClassNotFound("no formatter found for file name %r" % fn)
|
||||
|
||||
|
|
|
@ -1,16 +1,5 @@
|
|||
"""
|
||||
pygments.formatters._mapping
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Formatter mapping definitions. This file is generated by itself. Every time
|
||||
you change something on a builtin formatter definition, run this script from
|
||||
the formatters folder to update it.
|
||||
|
||||
Do not alter the FORMATTERS dictionary by hand.
|
||||
|
||||
:copyright: Copyright 2006-2022 by the Pygments team, see AUTHORS.
|
||||
:license: BSD, see LICENSE for details.
|
||||
"""
|
||||
# Automatically generated by scripts/gen_mapfiles.py.
|
||||
# DO NOT EDIT BY HAND; run `make mapfiles` instead.
|
||||
|
||||
FORMATTERS = {
|
||||
'BBCodeFormatter': ('pygments.formatters.bbcode', 'BBCode', ('bbcode', 'bb'), (), 'Format tokens with BBcodes. These formatting codes are used by many bulletin boards, so you can highlight your sourcecode with pygments before posting it there.'),
|
||||
|
@ -30,55 +19,5 @@ FORMATTERS = {
|
|||
'Terminal256Formatter': ('pygments.formatters.terminal256', 'Terminal256', ('terminal256', 'console256', '256'), (), 'Format tokens with ANSI color sequences, for output in a 256-color terminal or console. Like in `TerminalFormatter` color sequences are terminated at newlines, so that paging the output works correctly.'),
|
||||
'TerminalFormatter': ('pygments.formatters.terminal', 'Terminal', ('terminal', 'console'), (), 'Format tokens with ANSI color sequences, for output in a text console. Color sequences are terminated at newlines, so that paging the output works correctly.'),
|
||||
'TerminalTrueColorFormatter': ('pygments.formatters.terminal256', 'TerminalTrueColor', ('terminal16m', 'console16m', '16m'), (), 'Format tokens with ANSI color sequences, for output in a true-color terminal or console. Like in `TerminalFormatter` color sequences are terminated at newlines, so that paging the output works correctly.'),
|
||||
'TestcaseFormatter': ('pygments.formatters.other', 'Testcase', ('testcase',), (), 'Format tokens as appropriate for a new testcase.')
|
||||
'TestcaseFormatter': ('pygments.formatters.other', 'Testcase', ('testcase',), (), 'Format tokens as appropriate for a new testcase.'),
|
||||
}
|
||||
|
||||
if __name__ == '__main__': # pragma: no cover
|
||||
import sys
|
||||
import os
|
||||
|
||||
# lookup formatters
|
||||
found_formatters = []
|
||||
imports = []
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', '..'))
|
||||
from pip._vendor.pygments.util import docstring_headline
|
||||
|
||||
for root, dirs, files in os.walk('.'):
|
||||
for filename in files:
|
||||
if filename.endswith('.py') and not filename.startswith('_'):
|
||||
module_name = 'pygments.formatters%s.%s' % (
|
||||
root[1:].replace('/', '.'), filename[:-3])
|
||||
print(module_name)
|
||||
module = __import__(module_name, None, None, [''])
|
||||
for formatter_name in module.__all__:
|
||||
formatter = getattr(module, formatter_name)
|
||||
found_formatters.append(
|
||||
'%r: %r' % (formatter_name,
|
||||
(module_name,
|
||||
formatter.name,
|
||||
tuple(formatter.aliases),
|
||||
tuple(formatter.filenames),
|
||||
docstring_headline(formatter))))
|
||||
# sort them to make the diff minimal
|
||||
found_formatters.sort()
|
||||
|
||||
# extract useful sourcecode from this file
|
||||
with open(__file__) as fp:
|
||||
content = fp.read()
|
||||
# replace crnl to nl for Windows.
|
||||
#
|
||||
# Note that, originally, contributors should keep nl of master
|
||||
# repository, for example by using some kind of automatic
|
||||
# management EOL, like `EolExtension
|
||||
# <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.
|
||||
"""
|
||||
return self.fonts['NORMAL'].getsize('M')
|
||||
return self.get_text_size('M')
|
||||
|
||||
def get_text_size(self, text):
|
||||
"""
|
||||
Get the text size(width, height).
|
||||
Get the text size (width, height).
|
||||
"""
|
||||
return self.fonts['NORMAL'].getsize(text)
|
||||
font = self.fonts['NORMAL']
|
||||
if hasattr(font, 'getbbox'): # Pillow >= 9.2.0
|
||||
return font.getbbox(text)[2:4]
|
||||
else:
|
||||
return font.getsize(text)
|
||||
|
||||
def get_font(self, bold, oblique):
|
||||
"""
|
||||
|
@ -520,7 +524,7 @@ class ImageFormatter(Formatter):
|
|||
text_fg = self._get_text_color(style),
|
||||
text_bg = self._get_text_bg_color(style),
|
||||
)
|
||||
temp_width, temp_hight = self.fonts.get_text_size(temp)
|
||||
temp_width, _ = self.fonts.get_text_size(temp)
|
||||
linelength += temp_width
|
||||
maxlinelength = max(maxlinelength, linelength)
|
||||
charno += len(temp)
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
import re
|
||||
import sys
|
||||
import types
|
||||
import fnmatch
|
||||
from fnmatch import fnmatch
|
||||
from os.path import basename
|
||||
|
||||
from pip._vendor.pygments.lexers._mapping import LEXERS
|
||||
|
@ -28,16 +28,6 @@ __all__ = ['get_lexer_by_name', 'get_lexer_for_filename', 'find_lexer_class',
|
|||
'guess_lexer', 'load_lexer_from_file'] + list(LEXERS) + list(COMPAT)
|
||||
|
||||
_lexer_cache = {}
|
||||
_pattern_cache = {}
|
||||
|
||||
|
||||
def _fn_matches(fn, glob):
|
||||
"""Return whether the supplied file name fn matches pattern filename."""
|
||||
if glob not in _pattern_cache:
|
||||
pattern = _pattern_cache[glob] = re.compile(fnmatch.translate(glob))
|
||||
return pattern.match(fn)
|
||||
return _pattern_cache[glob].match(fn)
|
||||
|
||||
|
||||
def _load_lexers(module_name):
|
||||
"""Load a lexer (and all others in the module too)."""
|
||||
|
@ -169,13 +159,13 @@ def find_lexer_class_for_filename(_fn, code=None):
|
|||
fn = basename(_fn)
|
||||
for modname, name, _, filenames, _ in LEXERS.values():
|
||||
for filename in filenames:
|
||||
if _fn_matches(fn, filename):
|
||||
if fnmatch(fn, filename):
|
||||
if name not in _lexer_cache:
|
||||
_load_lexers(modname)
|
||||
matches.append((_lexer_cache[name], filename))
|
||||
for cls in find_plugin_lexers():
|
||||
for filename in cls.filenames:
|
||||
if _fn_matches(fn, filename):
|
||||
if fnmatch(fn, filename):
|
||||
matches.append((cls, filename))
|
||||
|
||||
if isinstance(code, bytes):
|
||||
|
@ -262,11 +252,11 @@ def guess_lexer_for_filename(_fn, _text, **options):
|
|||
matching_lexers = set()
|
||||
for lexer in _iter_lexerclasses():
|
||||
for filename in lexer.filenames:
|
||||
if _fn_matches(fn, filename):
|
||||
if fnmatch(fn, filename):
|
||||
matching_lexers.add(lexer)
|
||||
primary[lexer] = True
|
||||
for filename in lexer.alias_filenames:
|
||||
if _fn_matches(fn, filename):
|
||||
if fnmatch(fn, filename):
|
||||
matching_lexers.add(lexer)
|
||||
primary[lexer] = False
|
||||
if not matching_lexers:
|
||||
|
|
|
@ -1,16 +1,5 @@
|
|||
"""
|
||||
pygments.lexers._mapping
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Lexer mapping definitions. This file is generated by itself. Every time
|
||||
you change something on a builtin lexer definition, run this script from
|
||||
the lexers folder to update it.
|
||||
|
||||
Do not alter the LEXERS dictionary by hand.
|
||||
|
||||
:copyright: Copyright 2006-2014, 2016 by the Pygments team, see AUTHORS.
|
||||
:license: BSD, see LICENSE for details.
|
||||
"""
|
||||
# Automatically generated by scripts/gen_mapfiles.py.
|
||||
# DO NOT EDIT BY HAND; run `make mapfiles` instead.
|
||||
|
||||
LEXERS = {
|
||||
'ABAPLexer': ('pip._vendor.pygments.lexers.business', 'ABAP', ('abap',), ('*.abap', '*.ABAP'), ('text/x-abap',)),
|
||||
|
@ -103,6 +92,7 @@ LEXERS = {
|
|||
'ColdfusionCFCLexer': ('pip._vendor.pygments.lexers.templates', 'Coldfusion CFC', ('cfc',), ('*.cfc',), ()),
|
||||
'ColdfusionHtmlLexer': ('pip._vendor.pygments.lexers.templates', 'Coldfusion HTML', ('cfm',), ('*.cfm', '*.cfml'), ('application/x-coldfusion',)),
|
||||
'ColdfusionLexer': ('pip._vendor.pygments.lexers.templates', 'cfstatement', ('cfs',), (), ()),
|
||||
'Comal80Lexer': ('pip._vendor.pygments.lexers.comal', 'COMAL-80', ('comal', 'comal80'), ('*.cml', '*.comal'), ()),
|
||||
'CommonLispLexer': ('pip._vendor.pygments.lexers.lisp', 'Common Lisp', ('common-lisp', 'cl', 'lisp'), ('*.cl', '*.lisp'), ('text/x-common-lisp',)),
|
||||
'ComponentPascalLexer': ('pip._vendor.pygments.lexers.oberon', 'Component Pascal', ('componentpascal', 'cp'), ('*.cp', '*.cps'), ('text/x-component-pascal',)),
|
||||
'CoqLexer': ('pip._vendor.pygments.lexers.theorem', 'Coq', ('coq',), ('*.v',), ('text/x-coq',)),
|
||||
|
@ -229,6 +219,7 @@ LEXERS = {
|
|||
'IrcLogsLexer': ('pip._vendor.pygments.lexers.textfmts', 'IRC logs', ('irc',), ('*.weechatlog',), ('text/x-irclog',)),
|
||||
'IsabelleLexer': ('pip._vendor.pygments.lexers.theorem', 'Isabelle', ('isabelle',), ('*.thy',), ('text/x-isabelle',)),
|
||||
'JLexer': ('pip._vendor.pygments.lexers.j', 'J', ('j',), ('*.ijs',), ('text/x-j',)),
|
||||
'JMESPathLexer': ('pip._vendor.pygments.lexers.jmespath', 'JMESPath', ('jmespath', 'jp'), ('*.jp',), ()),
|
||||
'JSLTLexer': ('pip._vendor.pygments.lexers.jslt', 'JSLT', ('jslt',), ('*.jslt',), ('text/x-jslt',)),
|
||||
'JagsLexer': ('pip._vendor.pygments.lexers.modeling', 'JAGS', ('jags',), ('*.jag', '*.bug'), ()),
|
||||
'JasminLexer': ('pip._vendor.pygments.lexers.jvm', 'Jasmin', ('jasmin', 'jasminxt'), ('*.j',), ()),
|
||||
|
@ -462,6 +453,7 @@ LEXERS = {
|
|||
'SourcesListLexer': ('pip._vendor.pygments.lexers.installers', 'Debian Sourcelist', ('debsources', 'sourceslist', 'sources.list'), ('sources.list',), ()),
|
||||
'SparqlLexer': ('pip._vendor.pygments.lexers.rdf', 'SPARQL', ('sparql',), ('*.rq', '*.sparql'), ('application/sparql-query',)),
|
||||
'SpiceLexer': ('pip._vendor.pygments.lexers.spice', 'Spice', ('spice', 'spicelang'), ('*.spice',), ('text/x-spice',)),
|
||||
'SqlJinjaLexer': ('pip._vendor.pygments.lexers.templates', 'SQL+Jinja', ('sql+jinja',), ('*.sql', '*.sql.j2', '*.sql.jinja2'), ()),
|
||||
'SqlLexer': ('pip._vendor.pygments.lexers.sql', 'SQL', ('sql',), ('*.sql',), ('text/x-sql',)),
|
||||
'SqliteConsoleLexer': ('pip._vendor.pygments.lexers.sql', 'sqlite3con', ('sqlite3',), ('*.sqlite3-console',), ('text/x-sqlite3-console',)),
|
||||
'SquidConfLexer': ('pip._vendor.pygments.lexers.configs', 'SquidConf', ('squidconf', 'squid.conf', 'squid'), ('squid.conf',), ('text/x-squidconf',)),
|
||||
|
@ -516,7 +508,7 @@ LEXERS = {
|
|||
'VGLLexer': ('pip._vendor.pygments.lexers.dsls', 'VGL', ('vgl',), ('*.rpf',), ()),
|
||||
'ValaLexer': ('pip._vendor.pygments.lexers.c_like', 'Vala', ('vala', 'vapi'), ('*.vala', '*.vapi'), ('text/x-vala',)),
|
||||
'VbNetAspxLexer': ('pip._vendor.pygments.lexers.dotnet', 'aspx-vb', ('aspx-vb',), ('*.aspx', '*.asax', '*.ascx', '*.ashx', '*.asmx', '*.axd'), ()),
|
||||
'VbNetLexer': ('pip._vendor.pygments.lexers.dotnet', 'VB.net', ('vb.net', 'vbnet'), ('*.vb', '*.bas'), ('text/x-vbnet', 'text/x-vba')),
|
||||
'VbNetLexer': ('pip._vendor.pygments.lexers.dotnet', 'VB.net', ('vb.net', 'vbnet', 'lobas', 'oobas', 'sobas'), ('*.vb', '*.bas'), ('text/x-vbnet', 'text/x-vba')),
|
||||
'VelocityHtmlLexer': ('pip._vendor.pygments.lexers.templates', 'HTML+Velocity', ('html+velocity',), (), ('text/html+velocity',)),
|
||||
'VelocityLexer': ('pip._vendor.pygments.lexers.templates', 'Velocity', ('velocity',), ('*.vm', '*.fhtml'), ()),
|
||||
'VelocityXmlLexer': ('pip._vendor.pygments.lexers.templates', 'XML+Velocity', ('xml+velocity',), (), ('application/xml+velocity',)),
|
||||
|
@ -547,50 +539,3 @@ LEXERS = {
|
|||
'ZigLexer': ('pip._vendor.pygments.lexers.zig', 'Zig', ('zig',), ('*.zig',), ('text/zig',)),
|
||||
'apdlexer': ('pip._vendor.pygments.lexers.apdlexer', 'ANSYS parametric design language', ('ansys', 'apdl'), ('*.ans',), ()),
|
||||
}
|
||||
|
||||
if __name__ == '__main__': # pragma: no cover
|
||||
import sys
|
||||
import os
|
||||
|
||||
# lookup lexers
|
||||
found_lexers = []
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', '..'))
|
||||
for root, dirs, files in os.walk('.'):
|
||||
for filename in files:
|
||||
if filename.endswith('.py') and not filename.startswith('_'):
|
||||
module_name = 'pygments.lexers%s.%s' % (
|
||||
root[1:].replace('/', '.'), filename[:-3])
|
||||
print(module_name)
|
||||
module = __import__(module_name, None, None, [''])
|
||||
for lexer_name in module.__all__:
|
||||
lexer = getattr(module, lexer_name)
|
||||
found_lexers.append(
|
||||
'%r: %r' % (lexer_name,
|
||||
(module_name,
|
||||
lexer.name,
|
||||
tuple(lexer.aliases),
|
||||
tuple(lexer.filenames),
|
||||
tuple(lexer.mimetypes))))
|
||||
# sort them to make the diff minimal
|
||||
found_lexers.sort()
|
||||
|
||||
# extract useful sourcecode from this file
|
||||
with open(__file__) as fp:
|
||||
content = fp.read()
|
||||
# replace crnl to nl for Windows.
|
||||
#
|
||||
# Note that, originally, contributors should keep nl of master
|
||||
# repository, for example by using some kind of automatic
|
||||
# management EOL, like `EolExtension
|
||||
# <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')),
|
||||
("([fF])(')", bygroups(String.Affix, String.Single),
|
||||
combined('fstringescape', 'sqf')),
|
||||
# raw strings
|
||||
# raw bytes and strings
|
||||
('(?i)(rb|br|r)(""")',
|
||||
bygroups(String.Affix, String.Double), 'tdqs'),
|
||||
("(?i)(rb|br|r)(''')",
|
||||
|
@ -152,14 +152,24 @@ class PythonLexer(RegexLexer):
|
|||
("(?i)(rb|br|r)(')",
|
||||
bygroups(String.Affix, String.Single), 'sqs'),
|
||||
# non-raw strings
|
||||
('([uUbB]?)(""")', bygroups(String.Affix, String.Double),
|
||||
('([uU]?)(""")', bygroups(String.Affix, String.Double),
|
||||
combined('stringescape', 'tdqs')),
|
||||
("([uUbB]?)(''')", bygroups(String.Affix, String.Single),
|
||||
("([uU]?)(''')", bygroups(String.Affix, String.Single),
|
||||
combined('stringescape', 'tsqs')),
|
||||
('([uUbB]?)(")', bygroups(String.Affix, String.Double),
|
||||
('([uU]?)(")', bygroups(String.Affix, String.Double),
|
||||
combined('stringescape', 'dqs')),
|
||||
("([uUbB]?)(')", bygroups(String.Affix, String.Single),
|
||||
("([uU]?)(')", bygroups(String.Affix, String.Single),
|
||||
combined('stringescape', 'sqs')),
|
||||
# non-raw bytes
|
||||
('([bB])(""")', bygroups(String.Affix, String.Double),
|
||||
combined('bytesescape', 'tdqs')),
|
||||
("([bB])(''')", bygroups(String.Affix, String.Single),
|
||||
combined('bytesescape', 'tsqs')),
|
||||
('([bB])(")', bygroups(String.Affix, String.Double),
|
||||
combined('bytesescape', 'dqs')),
|
||||
("([bB])(')", bygroups(String.Affix, String.Single),
|
||||
combined('bytesescape', 'sqs')),
|
||||
|
||||
(r'[^\S\n]+', Text),
|
||||
include('numbers'),
|
||||
(r'!=|==|<<|>>|:=|[-~+/*%=<>&^|.]', Operator),
|
||||
|
@ -343,9 +353,12 @@ class PythonLexer(RegexLexer):
|
|||
include('rfstringescape'),
|
||||
include('stringescape'),
|
||||
],
|
||||
'bytesescape': [
|
||||
(r'\\([\\abfnrtv"\']|\n|x[a-fA-F0-9]{2}|[0-7]{1,3})', String.Escape)
|
||||
],
|
||||
'stringescape': [
|
||||
(r'\\([\\abfnrtv"\']|\n|N\{.*?\}|u[a-fA-F0-9]{4}|'
|
||||
r'U[a-fA-F0-9]{8}|x[a-fA-F0-9]{2}|[0-7]{1,3})', String.Escape)
|
||||
(r'\\(N\{.*?\}|u[a-fA-F0-9]{4}|U[a-fA-F0-9]{8})', String.Escape),
|
||||
include('bytesescape')
|
||||
],
|
||||
'fstrings-single': fstring_rules(String.Single),
|
||||
'fstrings-double': fstring_rules(String.Double),
|
||||
|
|
|
@ -2,9 +2,12 @@
|
|||
pygments.plugin
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
Pygments setuptools plugin interface. The methods defined
|
||||
here also work if setuptools isn't installed but they just
|
||||
return nothing.
|
||||
Pygments plugin interface. By default, this tries to use
|
||||
``importlib.metadata``, which is in the Python standard
|
||||
library since Python 3.8, or its ``importlib_metadata``
|
||||
backport for earlier versions of Python. It falls back on
|
||||
``pkg_resources`` if not found. Finally, if ``pkg_resources``
|
||||
is not found either, no plugins are loaded at all.
|
||||
|
||||
lexer plugins::
|
||||
|
||||
|
@ -34,6 +37,7 @@
|
|||
:copyright: Copyright 2006-2022 by the Pygments team, see AUTHORS.
|
||||
:license: BSD, see LICENSE for details.
|
||||
"""
|
||||
|
||||
LEXER_ENTRY_POINT = 'pygments.lexers'
|
||||
FORMATTER_ENTRY_POINT = 'pygments.formatters'
|
||||
STYLE_ENTRY_POINT = 'pygments.styles'
|
||||
|
@ -42,11 +46,26 @@ FILTER_ENTRY_POINT = 'pygments.filters'
|
|||
|
||||
def iter_entry_points(group_name):
|
||||
try:
|
||||
from pip._vendor import pkg_resources
|
||||
from importlib.metadata import entry_points
|
||||
except ImportError:
|
||||
try:
|
||||
from importlib_metadata import entry_points
|
||||
except ImportError:
|
||||
try:
|
||||
from pip._vendor.pkg_resources import iter_entry_points
|
||||
except (ImportError, OSError):
|
||||
return []
|
||||
|
||||
return pkg_resources.iter_entry_points(group_name)
|
||||
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():
|
||||
|
|
|
@ -48,6 +48,7 @@ STYLE_MAP = {
|
|||
'solarized-dark': 'solarized::SolarizedDarkStyle',
|
||||
'solarized-light': 'solarized::SolarizedLightStyle',
|
||||
'sas': 'sas::SasStyle',
|
||||
'staroffice' : 'staroffice::StarofficeStyle',
|
||||
'stata': 'stata_light::StataLightStyle',
|
||||
'stata-light': 'stata_light::StataLightStyle',
|
||||
'stata-dark': 'stata_dark::StataDarkStyle',
|
||||
|
@ -58,6 +59,9 @@ STYLE_MAP = {
|
|||
'dracula': 'dracula::DraculaStyle',
|
||||
'one-dark': 'onedark::OneDarkStyle',
|
||||
'lilypond' : 'lilypond::LilyPondStyle',
|
||||
'nord': 'nord::NordStyle',
|
||||
'nord-darker': 'nord::NordDarkerStyle',
|
||||
'github-dark': 'gh_dark::GhDarkStyle'
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -189,6 +189,7 @@ STANDARD_TYPES = {
|
|||
Operator.Word: 'ow',
|
||||
|
||||
Punctuation: 'p',
|
||||
Punctuation.Marker: 'pm',
|
||||
|
||||
Comment: 'c',
|
||||
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
|
||||
packaged CA bundle.
|
||||
"""
|
||||
from pip._vendor.certifi import where
|
||||
|
||||
import os
|
||||
|
||||
if "_PIP_STANDALONE_CERT" not in os.environ:
|
||||
from pip._vendor.certifi import where
|
||||
else:
|
||||
def where():
|
||||
return os.environ["_PIP_STANDALONE_CERT"]
|
||||
|
||||
if __name__ == "__main__":
|
||||
print(where())
|
||||
|
|
|
@ -33,6 +33,7 @@ from .retry import retry_always # noqa
|
|||
from .retry import retry_any # noqa
|
||||
from .retry import retry_if_exception # noqa
|
||||
from .retry import retry_if_exception_type # noqa
|
||||
from .retry import retry_if_exception_cause_type # noqa
|
||||
from .retry import retry_if_not_exception_type # noqa
|
||||
from .retry import retry_if_not_result # noqa
|
||||
from .retry import retry_if_result # noqa
|
||||
|
@ -63,6 +64,7 @@ from .wait import wait_none # noqa
|
|||
from .wait import wait_random # noqa
|
||||
from .wait import wait_random_exponential # noqa
|
||||
from .wait import wait_random_exponential as wait_full_jitter # noqa
|
||||
from .wait import wait_exponential_jitter # noqa
|
||||
|
||||
# Import all built-in before strategies for easier usage.
|
||||
from .before import before_log # noqa
|
||||
|
|
|
@ -117,6 +117,33 @@ class retry_unless_exception_type(retry_if_exception):
|
|||
return self.predicate(retry_state.outcome.exception())
|
||||
|
||||
|
||||
class retry_if_exception_cause_type(retry_base):
|
||||
"""Retries if any of the causes of the raised exception is of one or more types.
|
||||
|
||||
The check on the type of the cause of the exception is done recursively (until finding
|
||||
an exception in the chain that has no `__cause__`)
|
||||
"""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
exception_types: typing.Union[
|
||||
typing.Type[BaseException],
|
||||
typing.Tuple[typing.Type[BaseException], ...],
|
||||
] = Exception,
|
||||
) -> None:
|
||||
self.exception_cause_types = exception_types
|
||||
|
||||
def __call__(self, retry_state: "RetryCallState") -> bool:
|
||||
if retry_state.outcome.failed:
|
||||
exc = retry_state.outcome.exception()
|
||||
while exc is not None:
|
||||
if isinstance(exc.__cause__, self.exception_cause_types):
|
||||
return True
|
||||
exc = exc.__cause__
|
||||
|
||||
return False
|
||||
|
||||
|
||||
class retry_if_result(retry_base):
|
||||
"""Retries if the result verifies a predicate."""
|
||||
|
||||
|
|
|
@ -17,12 +17,19 @@
|
|||
import abc
|
||||
import random
|
||||
import typing
|
||||
from datetime import timedelta
|
||||
|
||||
from pip._vendor.tenacity import _utils
|
||||
|
||||
if typing.TYPE_CHECKING:
|
||||
from pip._vendor.tenacity import RetryCallState
|
||||
|
||||
wait_unit_type = typing.Union[int, float, timedelta]
|
||||
|
||||
|
||||
def to_seconds(wait_unit: wait_unit_type) -> float:
|
||||
return float(wait_unit.total_seconds() if isinstance(wait_unit, timedelta) else wait_unit)
|
||||
|
||||
|
||||
class wait_base(abc.ABC):
|
||||
"""Abstract base class for wait strategies."""
|
||||
|
@ -44,8 +51,8 @@ class wait_base(abc.ABC):
|
|||
class wait_fixed(wait_base):
|
||||
"""Wait strategy that waits a fixed amount of time between each retry."""
|
||||
|
||||
def __init__(self, wait: float) -> None:
|
||||
self.wait_fixed = wait
|
||||
def __init__(self, wait: wait_unit_type) -> None:
|
||||
self.wait_fixed = to_seconds(wait)
|
||||
|
||||
def __call__(self, retry_state: "RetryCallState") -> float:
|
||||
return self.wait_fixed
|
||||
|
@ -61,9 +68,9 @@ class wait_none(wait_fixed):
|
|||
class wait_random(wait_base):
|
||||
"""Wait strategy that waits a random amount of time between min/max."""
|
||||
|
||||
def __init__(self, min: typing.Union[int, float] = 0, max: typing.Union[int, float] = 1) -> None: # noqa
|
||||
self.wait_random_min = min
|
||||
self.wait_random_max = max
|
||||
def __init__(self, min: wait_unit_type = 0, max: wait_unit_type = 1) -> None: # noqa
|
||||
self.wait_random_min = to_seconds(min)
|
||||
self.wait_random_max = to_seconds(max)
|
||||
|
||||
def __call__(self, retry_state: "RetryCallState") -> float:
|
||||
return self.wait_random_min + (random.random() * (self.wait_random_max - self.wait_random_min))
|
||||
|
@ -113,13 +120,13 @@ class wait_incrementing(wait_base):
|
|||
|
||||
def __init__(
|
||||
self,
|
||||
start: typing.Union[int, float] = 0,
|
||||
increment: typing.Union[int, float] = 100,
|
||||
max: typing.Union[int, float] = _utils.MAX_WAIT, # noqa
|
||||
start: wait_unit_type = 0,
|
||||
increment: wait_unit_type = 100,
|
||||
max: wait_unit_type = _utils.MAX_WAIT, # noqa
|
||||
) -> None:
|
||||
self.start = start
|
||||
self.increment = increment
|
||||
self.max = max
|
||||
self.start = to_seconds(start)
|
||||
self.increment = to_seconds(increment)
|
||||
self.max = to_seconds(max)
|
||||
|
||||
def __call__(self, retry_state: "RetryCallState") -> float:
|
||||
result = self.start + (self.increment * (retry_state.attempt_number - 1))
|
||||
|
@ -142,13 +149,13 @@ class wait_exponential(wait_base):
|
|||
def __init__(
|
||||
self,
|
||||
multiplier: typing.Union[int, float] = 1,
|
||||
max: typing.Union[int, float] = _utils.MAX_WAIT, # noqa
|
||||
max: wait_unit_type = _utils.MAX_WAIT, # noqa
|
||||
exp_base: typing.Union[int, float] = 2,
|
||||
min: typing.Union[int, float] = 0, # noqa
|
||||
min: wait_unit_type = 0, # noqa
|
||||
) -> None:
|
||||
self.multiplier = multiplier
|
||||
self.min = min
|
||||
self.max = max
|
||||
self.min = to_seconds(min)
|
||||
self.max = to_seconds(max)
|
||||
self.exp_base = exp_base
|
||||
|
||||
def __call__(self, retry_state: "RetryCallState") -> float:
|
||||
|
@ -189,3 +196,37 @@ class wait_random_exponential(wait_exponential):
|
|||
def __call__(self, retry_state: "RetryCallState") -> float:
|
||||
high = super().__call__(retry_state=retry_state)
|
||||
return random.uniform(0, high)
|
||||
|
||||
|
||||
class wait_exponential_jitter(wait_base):
|
||||
"""Wait strategy that applies exponential backoff and jitter.
|
||||
|
||||
It allows for a customized initial wait, maximum wait and jitter.
|
||||
|
||||
This implements the strategy described here:
|
||||
https://cloud.google.com/storage/docs/retry-strategy
|
||||
|
||||
The wait time is min(initial * (2**n + random.uniform(0, jitter)), maximum)
|
||||
where n is the retry count.
|
||||
"""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
initial: float = 1,
|
||||
max: float = _utils.MAX_WAIT, # noqa
|
||||
exp_base: float = 2,
|
||||
jitter: float = 1,
|
||||
) -> None:
|
||||
self.initial = initial
|
||||
self.max = max
|
||||
self.exp_base = exp_base
|
||||
self.jitter = jitter
|
||||
|
||||
def __call__(self, retry_state: "RetryCallState") -> float:
|
||||
jitter = random.uniform(0, self.jitter)
|
||||
try:
|
||||
exp = self.exp_base ** (retry_state.attempt_number - 1)
|
||||
result = self.initial * exp + jitter
|
||||
except OverflowError:
|
||||
result = self.max
|
||||
return max(0, min(result, self.max))
|
||||
|
|
|
@ -8,9 +8,9 @@ import types as _types
|
|||
import typing
|
||||
|
||||
|
||||
# Please keep __all__ alphabetized within each category.
|
||||
__all__ = [
|
||||
# Super-special typing primitives.
|
||||
'Any',
|
||||
'ClassVar',
|
||||
'Concatenate',
|
||||
'Final',
|
||||
|
@ -20,6 +20,7 @@ __all__ = [
|
|||
'ParamSpecKwargs',
|
||||
'Self',
|
||||
'Type',
|
||||
'TypeVar',
|
||||
'TypeVarTuple',
|
||||
'Unpack',
|
||||
|
||||
|
@ -60,6 +61,7 @@ __all__ = [
|
|||
'Literal',
|
||||
'NewType',
|
||||
'overload',
|
||||
'override',
|
||||
'Protocol',
|
||||
'reveal_type',
|
||||
'runtime',
|
||||
|
@ -149,6 +151,37 @@ VT = typing.TypeVar('VT') # Value type.
|
|||
T_co = typing.TypeVar('T_co', covariant=True) # Any type covariant containers.
|
||||
T_contra = typing.TypeVar('T_contra', contravariant=True) # Ditto contravariant.
|
||||
|
||||
|
||||
if sys.version_info >= (3, 11):
|
||||
from typing import Any
|
||||
else:
|
||||
|
||||
class _AnyMeta(type):
|
||||
def __instancecheck__(self, obj):
|
||||
if self is Any:
|
||||
raise TypeError("typing_extensions.Any cannot be used with isinstance()")
|
||||
return super().__instancecheck__(obj)
|
||||
|
||||
def __repr__(self):
|
||||
if self is Any:
|
||||
return "typing_extensions.Any"
|
||||
return super().__repr__()
|
||||
|
||||
class Any(metaclass=_AnyMeta):
|
||||
"""Special type indicating an unconstrained type.
|
||||
- Any is compatible with every type.
|
||||
- Any assumed to have all methods.
|
||||
- All values assumed to be instances of Any.
|
||||
Note that all the above statements are true from the point of view of
|
||||
static type checkers. At runtime, Any should not be used with instance
|
||||
checks.
|
||||
"""
|
||||
def __new__(cls, *args, **kwargs):
|
||||
if cls is Any:
|
||||
raise TypeError("Any cannot be instantiated")
|
||||
return super().__new__(cls, *args, **kwargs)
|
||||
|
||||
|
||||
ClassVar = typing.ClassVar
|
||||
|
||||
# On older versions of typing there is an internal class named "Final".
|
||||
|
@ -431,7 +464,7 @@ else:
|
|||
if type(self)._is_protocol:
|
||||
raise TypeError('Protocols cannot be instantiated')
|
||||
|
||||
class _ProtocolMeta(abc.ABCMeta):
|
||||
class _ProtocolMeta(abc.ABCMeta): # noqa: B024
|
||||
# This metaclass is a bit unfortunate and exists only because of the lack
|
||||
# of __instancehook__.
|
||||
def __instancecheck__(cls, instance):
|
||||
|
@ -1115,6 +1148,44 @@ else:
|
|||
above.""")
|
||||
|
||||
|
||||
class _DefaultMixin:
|
||||
"""Mixin for TypeVarLike defaults."""
|
||||
|
||||
__slots__ = ()
|
||||
|
||||
def __init__(self, default):
|
||||
if isinstance(default, (tuple, list)):
|
||||
self.__default__ = tuple((typing._type_check(d, "Default must be a type")
|
||||
for d in default))
|
||||
elif default:
|
||||
self.__default__ = typing._type_check(default, "Default must be a type")
|
||||
else:
|
||||
self.__default__ = None
|
||||
|
||||
|
||||
# Add default and infer_variance parameters from PEP 696 and 695
|
||||
class TypeVar(typing.TypeVar, _DefaultMixin, _root=True):
|
||||
"""Type variable."""
|
||||
|
||||
__module__ = 'typing'
|
||||
|
||||
def __init__(self, name, *constraints, bound=None,
|
||||
covariant=False, contravariant=False,
|
||||
default=None, infer_variance=False):
|
||||
super().__init__(name, *constraints, bound=bound, covariant=covariant,
|
||||
contravariant=contravariant)
|
||||
_DefaultMixin.__init__(self, default)
|
||||
self.__infer_variance__ = infer_variance
|
||||
|
||||
# for pickling:
|
||||
try:
|
||||
def_mod = sys._getframe(1).f_globals.get('__name__', '__main__')
|
||||
except (AttributeError, ValueError):
|
||||
def_mod = None
|
||||
if def_mod != 'typing_extensions':
|
||||
self.__module__ = def_mod
|
||||
|
||||
|
||||
# Python 3.10+ has PEP 612
|
||||
if hasattr(typing, 'ParamSpecArgs'):
|
||||
ParamSpecArgs = typing.ParamSpecArgs
|
||||
|
@ -1179,12 +1250,32 @@ else:
|
|||
|
||||
# 3.10+
|
||||
if hasattr(typing, 'ParamSpec'):
|
||||
ParamSpec = typing.ParamSpec
|
||||
|
||||
# Add default Parameter - PEP 696
|
||||
class ParamSpec(typing.ParamSpec, _DefaultMixin, _root=True):
|
||||
"""Parameter specification variable."""
|
||||
|
||||
__module__ = 'typing'
|
||||
|
||||
def __init__(self, name, *, bound=None, covariant=False, contravariant=False,
|
||||
default=None):
|
||||
super().__init__(name, bound=bound, covariant=covariant,
|
||||
contravariant=contravariant)
|
||||
_DefaultMixin.__init__(self, default)
|
||||
|
||||
# for pickling:
|
||||
try:
|
||||
def_mod = sys._getframe(1).f_globals.get('__name__', '__main__')
|
||||
except (AttributeError, ValueError):
|
||||
def_mod = None
|
||||
if def_mod != 'typing_extensions':
|
||||
self.__module__ = def_mod
|
||||
|
||||
# 3.7-3.9
|
||||
else:
|
||||
|
||||
# Inherits from list as a workaround for Callable checks in Python < 3.9.2.
|
||||
class ParamSpec(list):
|
||||
class ParamSpec(list, _DefaultMixin):
|
||||
"""Parameter specification variable.
|
||||
|
||||
Usage::
|
||||
|
@ -1242,7 +1333,8 @@ else:
|
|||
def kwargs(self):
|
||||
return ParamSpecKwargs(self)
|
||||
|
||||
def __init__(self, name, *, bound=None, covariant=False, contravariant=False):
|
||||
def __init__(self, name, *, bound=None, covariant=False, contravariant=False,
|
||||
default=None):
|
||||
super().__init__([self])
|
||||
self.__name__ = name
|
||||
self.__covariant__ = bool(covariant)
|
||||
|
@ -1251,6 +1343,7 @@ else:
|
|||
self.__bound__ = typing._type_check(bound, 'Bound must be a type.')
|
||||
else:
|
||||
self.__bound__ = None
|
||||
_DefaultMixin.__init__(self, default)
|
||||
|
||||
# for pickling:
|
||||
try:
|
||||
|
@ -1752,9 +1845,25 @@ else:
|
|||
|
||||
|
||||
if hasattr(typing, "TypeVarTuple"): # 3.11+
|
||||
TypeVarTuple = typing.TypeVarTuple
|
||||
|
||||
# Add default Parameter - PEP 696
|
||||
class TypeVarTuple(typing.TypeVarTuple, _DefaultMixin, _root=True):
|
||||
"""Type variable tuple."""
|
||||
|
||||
def __init__(self, name, *, default=None):
|
||||
super().__init__(name)
|
||||
_DefaultMixin.__init__(self, default)
|
||||
|
||||
# for pickling:
|
||||
try:
|
||||
def_mod = sys._getframe(1).f_globals.get('__name__', '__main__')
|
||||
except (AttributeError, ValueError):
|
||||
def_mod = None
|
||||
if def_mod != 'typing_extensions':
|
||||
self.__module__ = def_mod
|
||||
|
||||
else:
|
||||
class TypeVarTuple:
|
||||
class TypeVarTuple(_DefaultMixin):
|
||||
"""Type variable tuple.
|
||||
|
||||
Usage::
|
||||
|
@ -1804,8 +1913,9 @@ else:
|
|||
def __iter__(self):
|
||||
yield self.__unpacked__
|
||||
|
||||
def __init__(self, name):
|
||||
def __init__(self, name, *, default=None):
|
||||
self.__name__ = name
|
||||
_DefaultMixin.__init__(self, default)
|
||||
|
||||
# for pickling:
|
||||
try:
|
||||
|
@ -1968,6 +2078,36 @@ else:
|
|||
return decorator
|
||||
|
||||
|
||||
if hasattr(typing, "override"):
|
||||
override = typing.override
|
||||
else:
|
||||
_F = typing.TypeVar("_F", bound=typing.Callable[..., typing.Any])
|
||||
|
||||
def override(__arg: _F) -> _F:
|
||||
"""Indicate that a method is intended to override a method in a base class.
|
||||
|
||||
Usage:
|
||||
|
||||
class Base:
|
||||
def method(self) -> None: ...
|
||||
pass
|
||||
|
||||
class Child(Base):
|
||||
@override
|
||||
def method(self) -> None:
|
||||
super().method()
|
||||
|
||||
When this decorator is applied to a method, the type checker will
|
||||
validate that it overrides a method with the same name on a base class.
|
||||
This helps prevent bugs that may occur when a base class is changed
|
||||
without an equivalent change to a child class.
|
||||
|
||||
See PEP 698 for details.
|
||||
|
||||
"""
|
||||
return __arg
|
||||
|
||||
|
||||
# We have to do some monkey patching to deal with the dual nature of
|
||||
# Unpack/TypeVarTuple:
|
||||
# - We want Unpack to be a kind of TypeVar so it gets accepted in
|
||||
|
|
|
@ -19,6 +19,23 @@ from .util.retry import Retry
|
|||
from .util.timeout import Timeout
|
||||
from .util.url import get_host
|
||||
|
||||
# === NOTE TO REPACKAGERS AND VENDORS ===
|
||||
# Please delete this block, this logic is only
|
||||
# for urllib3 being distributed via PyPI.
|
||||
# See: https://github.com/urllib3/urllib3/issues/2680
|
||||
try:
|
||||
import urllib3_secure_extra # type: ignore # noqa: F401
|
||||
except ImportError:
|
||||
pass
|
||||
else:
|
||||
warnings.warn(
|
||||
"'urllib3[secure]' extra is deprecated and will be removed "
|
||||
"in a future release of urllib3 2.x. Read more in this issue: "
|
||||
"https://github.com/urllib3/urllib3/issues/2680",
|
||||
category=DeprecationWarning,
|
||||
stacklevel=2,
|
||||
)
|
||||
|
||||
__author__ = "Andrey Petrov (andrey.petrov@shazow.net)"
|
||||
__license__ = "MIT"
|
||||
__version__ = __version__
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
# 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 ssl
|
||||
import sys
|
||||
import warnings
|
||||
|
||||
from .. import util
|
||||
from ..packages import six
|
||||
from ..util.ssl_ import PROTOCOL_TLS_CLIENT
|
||||
|
||||
warnings.warn(
|
||||
"'urllib3.contrib.pyopenssl' module is deprecated and will be removed "
|
||||
"in a future release of urllib3 2.x. Read more in this issue: "
|
||||
"https://github.com/urllib3/urllib3/issues/2680",
|
||||
category=DeprecationWarning,
|
||||
stacklevel=2,
|
||||
)
|
||||
|
||||
__all__ = ["inject_into_urllib3", "extract_from_urllib3"]
|
||||
|
||||
# SNI always works.
|
||||
|
|
|
@ -2,6 +2,7 @@ from __future__ import absolute_import
|
|||
|
||||
import io
|
||||
import logging
|
||||
import sys
|
||||
import zlib
|
||||
from contextlib import contextmanager
|
||||
from socket import error as SocketError
|
||||
|
@ -9,6 +10,7 @@ from socket import timeout as SocketTimeout
|
|||
|
||||
brotli = None
|
||||
|
||||
from . import util
|
||||
from ._collections import HTTPHeaderDict
|
||||
from .connection import BaseSSLError, HTTPException
|
||||
from .exceptions import (
|
||||
|
@ -475,6 +477,54 @@ class HTTPResponse(io.IOBase):
|
|||
if self._original_response and self._original_response.isclosed():
|
||||
self.release_conn()
|
||||
|
||||
def _fp_read(self, amt):
|
||||
"""
|
||||
Read a response with the thought that reading the number of bytes
|
||||
larger than can fit in a 32-bit int at a time via SSL in some
|
||||
known cases leads to an overflow error that has to be prevented
|
||||
if `amt` or `self.length_remaining` indicate that a problem may
|
||||
happen.
|
||||
|
||||
The known cases:
|
||||
* 3.8 <= CPython < 3.9.7 because of a bug
|
||||
https://github.com/urllib3/urllib3/issues/2513#issuecomment-1152559900.
|
||||
* urllib3 injected with pyOpenSSL-backed SSL-support.
|
||||
* CPython < 3.10 only when `amt` does not fit 32-bit int.
|
||||
"""
|
||||
assert self._fp
|
||||
c_int_max = 2 ** 31 - 1
|
||||
if (
|
||||
(
|
||||
(amt and amt > c_int_max)
|
||||
or (self.length_remaining and self.length_remaining > c_int_max)
|
||||
)
|
||||
and not util.IS_SECURETRANSPORT
|
||||
and (util.IS_PYOPENSSL or sys.version_info < (3, 10))
|
||||
):
|
||||
buffer = io.BytesIO()
|
||||
# Besides `max_chunk_amt` being a maximum chunk size, it
|
||||
# affects memory overhead of reading a response by this
|
||||
# method in CPython.
|
||||
# `c_int_max` equal to 2 GiB - 1 byte is the actual maximum
|
||||
# chunk size that does not lead to an overflow error, but
|
||||
# 256 MiB is a compromise.
|
||||
max_chunk_amt = 2 ** 28
|
||||
while amt is None or amt != 0:
|
||||
if amt is not None:
|
||||
chunk_amt = min(amt, max_chunk_amt)
|
||||
amt -= chunk_amt
|
||||
else:
|
||||
chunk_amt = max_chunk_amt
|
||||
data = self._fp.read(chunk_amt)
|
||||
if not data:
|
||||
break
|
||||
buffer.write(data)
|
||||
del data # to reduce peak memory usage by `max_chunk_amt`.
|
||||
return buffer.getvalue()
|
||||
else:
|
||||
# StringIO doesn't like amt=None
|
||||
return self._fp.read(amt) if amt is not None else self._fp.read()
|
||||
|
||||
def read(self, amt=None, decode_content=None, cache_content=False):
|
||||
"""
|
||||
Similar to :meth:`http.client.HTTPResponse.read`, but with two additional
|
||||
|
@ -507,13 +557,11 @@ class HTTPResponse(io.IOBase):
|
|||
fp_closed = getattr(self._fp, "closed", False)
|
||||
|
||||
with self._error_catcher():
|
||||
data = self._fp_read(amt) if not fp_closed else b""
|
||||
if amt is None:
|
||||
# cStringIO doesn't like amt=None
|
||||
data = self._fp.read() if not fp_closed else b""
|
||||
flush_decoder = True
|
||||
else:
|
||||
cache_content = False
|
||||
data = self._fp.read(amt) if not fp_closed else b""
|
||||
if (
|
||||
amt != 0 and not data
|
||||
): # Platform-specific: Buggy versions of Python.
|
||||
|
|
|
@ -1,23 +1,23 @@
|
|||
CacheControl==0.12.11 # Make sure to update the license in pyproject.toml for this.
|
||||
colorama==0.4.5
|
||||
distlib==0.3.5
|
||||
distlib==0.3.6
|
||||
distro==1.7.0
|
||||
msgpack==1.0.4
|
||||
packaging==21.3
|
||||
pep517==0.12.0
|
||||
pep517==0.13.0
|
||||
platformdirs==2.5.2
|
||||
pyparsing==3.0.9
|
||||
requests==2.28.1
|
||||
certifi==2022.06.15
|
||||
certifi==2022.09.24
|
||||
chardet==5.0.0
|
||||
idna==3.3
|
||||
urllib3==1.26.10
|
||||
idna==3.4
|
||||
urllib3==1.26.12
|
||||
rich==12.5.1
|
||||
pygments==2.12.0
|
||||
typing_extensions==4.3.0
|
||||
pygments==2.13.0
|
||||
typing_extensions==4.4.0
|
||||
resolvelib==0.8.1
|
||||
setuptools==44.0.0
|
||||
six==1.16.0
|
||||
tenacity==8.0.1
|
||||
tenacity==8.1.0
|
||||
tomli==2.0.1
|
||||
webencodings==0.5.1
|
||||
|
|
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
|
||||
import os
|
||||
import time
|
||||
|
|
|
@ -107,7 +107,7 @@ for i in path_img:
|
|||
while strenght <= endStrength:
|
||||
with autocast("cuda"):
|
||||
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")
|
||||
|
||||
exif_dict = piexif.load(
|
||||
|
|
Loading…
Reference in New Issue