py2docfx 0.1.16.dev2064350__py3-none-any.whl → 0.1.17__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- py2docfx/convert_prepare/environment.py +1 -3
- py2docfx/convert_prepare/get_source.py +1 -6
- py2docfx/convert_prepare/package_info.py +1 -1
- py2docfx/docfx_yaml/miss_reference.py +1 -1
- py2docfx/docfx_yaml/parameter_utils.py +58 -6
- py2docfx/docfx_yaml/tests/roots/test-translator-typing/code_with_typing.py +14 -0
- py2docfx/docfx_yaml/tests/roots/test-translator-typing/conf.py +18 -0
- py2docfx/docfx_yaml/tests/test_translator_typing.py +39 -0
- py2docfx/docfx_yaml/utils.py +2 -2
- py2docfx/venv/basevenv/Lib/site-packages/certifi/__init__.py +1 -1
- py2docfx/venv/basevenv/Lib/site-packages/certifi/core.py +1 -32
- py2docfx/venv/basevenv/Lib/site-packages/charset_normalizer/cli/__main__.py +62 -2
- py2docfx/venv/basevenv/Lib/site-packages/charset_normalizer/constant.py +17 -0
- py2docfx/venv/basevenv/Lib/site-packages/charset_normalizer/legacy.py +1 -3
- py2docfx/venv/basevenv/Lib/site-packages/charset_normalizer/md.py +19 -14
- py2docfx/venv/basevenv/Lib/site-packages/charset_normalizer/utils.py +6 -0
- py2docfx/venv/basevenv/Lib/site-packages/charset_normalizer/version.py +1 -1
- py2docfx/venv/basevenv/Lib/site-packages/packaging/__init__.py +1 -1
- py2docfx/venv/basevenv/Lib/site-packages/packaging/_elffile.py +1 -2
- py2docfx/venv/basevenv/Lib/site-packages/packaging/_manylinux.py +1 -2
- py2docfx/venv/basevenv/Lib/site-packages/packaging/_parser.py +1 -2
- py2docfx/venv/basevenv/Lib/site-packages/packaging/_tokenizer.py +5 -4
- py2docfx/venv/basevenv/Lib/site-packages/packaging/licenses/__init__.py +1 -1
- py2docfx/venv/basevenv/Lib/site-packages/packaging/markers.py +53 -22
- py2docfx/venv/basevenv/Lib/site-packages/packaging/metadata.py +1 -2
- py2docfx/venv/basevenv/Lib/site-packages/packaging/specifiers.py +1 -2
- py2docfx/venv/basevenv/Lib/site-packages/packaging/tags.py +39 -0
- py2docfx/venv/basevenv/Lib/site-packages/pkg_resources/__init__.py +6 -7
- py2docfx/venv/basevenv/Lib/site-packages/pygments/__init__.py +1 -1
- py2docfx/venv/basevenv/Lib/site-packages/pygments/lexers/_sql_builtins.py +106 -0
- py2docfx/venv/basevenv/Lib/site-packages/pygments/lexers/scripting.py +5 -3
- py2docfx/venv/basevenv/Lib/site-packages/pygments/lexers/sql.py +24 -118
- py2docfx/venv/basevenv/Lib/site-packages/requests/__version__.py +2 -2
- py2docfx/venv/basevenv/Lib/site-packages/requests/compat.py +12 -0
- py2docfx/venv/basevenv/Lib/site-packages/requests/models.py +3 -1
- py2docfx/venv/basevenv/Lib/site-packages/requests/utils.py +6 -16
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/__init__.py +0 -38
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_discovery.py +33 -0
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/command/build_scripts.py +1 -1
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/command/config.py +0 -2
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/compilers/C/tests/test_unix.py +63 -0
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/compilers/C/unix.py +5 -6
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_entry_points.py +4 -0
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_normalization.py +0 -2
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_path.py +12 -3
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_reqs.py +1 -1
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_scripts.py +361 -0
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_shutil.py +6 -0
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/build_meta.py +25 -37
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/bdist_egg.py +9 -11
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/bdist_wheel.py +1 -1
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/build_ext.py +29 -28
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/develop.py +39 -179
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/easy_install.py +17 -2352
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/editable_wheel.py +14 -31
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/egg_info.py +0 -2
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/install.py +3 -55
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/install_scripts.py +5 -11
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/sdist.py +1 -1
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/compat/py310.py +11 -0
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/dist.py +10 -12
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/installer.py +34 -29
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/contexts.py +0 -14
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/fixtures.py +235 -0
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/integration/test_pbr.py +20 -0
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_build_meta.py +0 -24
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_develop.py +1 -64
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_dist.py +2 -2
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_dist_info.py +0 -63
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_editable_install.py +15 -41
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_egg_info.py +3 -2
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_scripts.py +12 -0
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_wheel.py +12 -36
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_windows_wrappers.py +3 -4
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/wheel.py +49 -24
- py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/__init__.py +6 -0
- py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/arabic_stemmer.py +798 -797
- py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/armenian_stemmer.py +212 -213
- py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/basestemmer.py +20 -54
- py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/basque_stemmer.py +202 -228
- py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/catalan_stemmer.py +370 -375
- py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/danish_stemmer.py +63 -61
- py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/dutch_porter_stemmer.py +466 -0
- py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/dutch_stemmer.py +1217 -343
- py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/english_stemmer.py +295 -264
- py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/esperanto_stemmer.py +588 -0
- py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/estonian_stemmer.py +850 -0
- py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/finnish_stemmer.py +144 -143
- py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/french_stemmer.py +308 -246
- py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/german_stemmer.py +224 -167
- py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/greek_stemmer.py +1314 -1313
- py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/hindi_stemmer.py +39 -38
- py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/hungarian_stemmer.py +231 -256
- py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/indonesian_stemmer.py +61 -64
- py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/irish_stemmer.py +101 -106
- py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/italian_stemmer.py +272 -272
- py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/lithuanian_stemmer.py +233 -240
- py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/nepali_stemmer.py +108 -134
- py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/norwegian_stemmer.py +108 -63
- py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/porter_stemmer.py +101 -108
- py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/portuguese_stemmer.py +241 -250
- py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/romanian_stemmer.py +332 -296
- py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/russian_stemmer.py +178 -179
- py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/serbian_stemmer.py +2331 -2332
- py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/spanish_stemmer.py +254 -259
- py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/swedish_stemmer.py +143 -70
- py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/tamil_stemmer.py +638 -1491
- py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/turkish_stemmer.py +326 -292
- py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/yiddish_stemmer.py +245 -246
- py2docfx/venv/basevenv/Lib/site-packages/urllib3/_version.py +2 -2
- py2docfx/venv/basevenv/Lib/site-packages/urllib3/connection.py +87 -38
- py2docfx/venv/basevenv/Lib/site-packages/urllib3/contrib/emscripten/fetch.py +20 -0
- py2docfx/venv/basevenv/Lib/site-packages/urllib3/poolmanager.py +17 -1
- py2docfx/venv/basevenv/Lib/site-packages/urllib3/response.py +53 -24
- py2docfx/venv/basevenv/Lib/site-packages/urllib3/util/request.py +12 -4
- py2docfx/venv/basevenv/Lib/site-packages/urllib3/util/ssl_.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/azure/core/_version.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/azure/core/pipeline/_base_async.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/azure/core/pipeline/transport/_aiohttp.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/azure/core/pipeline/transport/_base_async.py +2 -1
- py2docfx/venv/venv1/Lib/site-packages/azure/core/pipeline/transport/_requests_asyncio.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/azure/core/rest/_aiohttp.py +2 -2
- py2docfx/venv/venv1/Lib/site-packages/azure/core/rest/_requests_asyncio.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/azure/core/tracing/opentelemetry.py +13 -1
- py2docfx/venv/venv1/Lib/site-packages/azure/core/utils/_pipeline_transport_rest_shared_async.py +2 -1
- py2docfx/venv/venv1/Lib/site-packages/azure/core/utils/_utils.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/_constants.py +1 -0
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/default.py +23 -2
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/environment.py +12 -16
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/service_fabric.py +22 -1
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/user_password.py +10 -6
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/vscode.py +13 -4
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/auth_code_redirect_handler.py +3 -5
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/msal_client.py +2 -1
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/_persistent_cache.py +3 -2
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/_version.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/azd_cli.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/azure_cli.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/azure_powershell.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/chained.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/default.py +22 -2
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/environment.py +2 -2
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/service_fabric.py +17 -1
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/vscode.py +4 -4
- py2docfx/venv/venv1/Lib/site-packages/certifi/__init__.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/certifi/core.py +1 -32
- py2docfx/venv/venv1/Lib/site-packages/charset_normalizer/cli/__main__.py +62 -2
- py2docfx/venv/venv1/Lib/site-packages/charset_normalizer/constant.py +17 -0
- py2docfx/venv/venv1/Lib/site-packages/charset_normalizer/legacy.py +1 -3
- py2docfx/venv/venv1/Lib/site-packages/charset_normalizer/md.py +19 -14
- py2docfx/venv/venv1/Lib/site-packages/charset_normalizer/utils.py +6 -0
- py2docfx/venv/venv1/Lib/site-packages/charset_normalizer/version.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/cryptography/__about__.py +2 -2
- py2docfx/venv/venv1/Lib/site-packages/cryptography/__init__.py +2 -2
- py2docfx/venv/venv1/Lib/site-packages/cryptography/fernet.py +2 -1
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/_oid.py +35 -2
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/backends/openssl/backend.py +33 -10
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/_rust/__init__.pyi +14 -5
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/_rust/ocsp.pyi +2 -2
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/_rust/openssl/__init__.pyi +3 -0
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/_rust/openssl/aead.pyi +49 -45
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/_rust/openssl/ciphers.pyi +2 -2
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/_rust/openssl/ed25519.pyi +2 -1
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/_rust/openssl/ed448.pyi +2 -1
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/_rust/openssl/hashes.pyi +10 -1
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/_rust/openssl/hmac.pyi +3 -2
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/_rust/openssl/kdf.pyi +8 -2
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/_rust/openssl/keys.pyi +3 -2
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/_rust/openssl/poly1305.pyi +6 -4
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/_rust/openssl/x25519.pyi +2 -1
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/_rust/openssl/x448.pyi +2 -1
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/_rust/pkcs12.pyi +9 -3
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/_rust/pkcs7.pyi +7 -6
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/_rust/test_support.pyi +2 -1
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/_rust/x509.pyi +79 -12
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/openssl/_conditional.py +9 -1
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/openssl/binding.py +2 -1
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/decrepit/ciphers/algorithms.py +5 -0
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/_cipheralgorithm.py +4 -2
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/_serialization.py +1 -2
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/asymmetric/dh.py +12 -0
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/asymmetric/dsa.py +16 -3
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/asymmetric/ec.py +47 -3
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/asymmetric/ed25519.py +16 -3
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/asymmetric/ed448.py +16 -3
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/asymmetric/rsa.py +14 -0
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/asymmetric/x25519.py +14 -1
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/asymmetric/x448.py +14 -1
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/ciphers/algorithms.py +6 -6
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/ciphers/base.py +5 -4
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/ciphers/modes.py +18 -18
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/hashes.py +5 -1
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/kdf/concatkdf.py +5 -4
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/kdf/hkdf.py +4 -4
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/kdf/kbkdf.py +7 -4
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/kdf/pbkdf2.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/kdf/x963kdf.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/padding.py +7 -121
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/serialization/__init__.py +2 -0
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/serialization/pkcs12.py +21 -1
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/serialization/pkcs7.py +48 -6
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/serialization/ssh.py +68 -18
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/twofactor/hotp.py +3 -2
- py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/twofactor/totp.py +2 -1
- py2docfx/venv/venv1/Lib/site-packages/cryptography/utils.py +15 -3
- py2docfx/venv/venv1/Lib/site-packages/cryptography/x509/__init__.py +3 -0
- py2docfx/venv/venv1/Lib/site-packages/cryptography/x509/base.py +39 -6
- py2docfx/venv/venv1/Lib/site-packages/cryptography/x509/extensions.py +100 -49
- py2docfx/venv/venv1/Lib/site-packages/cryptography/x509/name.py +27 -15
- py2docfx/venv/venv1/Lib/site-packages/cryptography/x509/ocsp.py +60 -25
- py2docfx/venv/venv1/Lib/site-packages/cryptography/x509/oid.py +2 -0
- py2docfx/venv/venv1/Lib/site-packages/cryptography/x509/verification.py +6 -0
- py2docfx/venv/venv1/Lib/site-packages/google/api_core/bidi.py +17 -4
- py2docfx/venv/venv1/Lib/site-packages/google/api_core/client_info.py +6 -0
- py2docfx/venv/venv1/Lib/site-packages/google/api_core/gapic_v1/client_info.py +1 -0
- py2docfx/venv/venv1/Lib/site-packages/google/api_core/retry/retry_base.py +13 -4
- py2docfx/venv/venv1/Lib/site-packages/google/api_core/retry/retry_streaming.py +7 -6
- py2docfx/venv/venv1/Lib/site-packages/google/api_core/retry/retry_streaming_async.py +8 -5
- py2docfx/venv/venv1/Lib/site-packages/google/api_core/retry/retry_unary.py +7 -6
- py2docfx/venv/venv1/Lib/site-packages/google/api_core/retry/retry_unary_async.py +7 -6
- py2docfx/venv/venv1/Lib/site-packages/google/api_core/version.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/google/auth/_default.py +2 -36
- py2docfx/venv/venv1/Lib/site-packages/google/auth/_helpers.py +240 -0
- py2docfx/venv/venv1/Lib/site-packages/google/auth/aio/_helpers.py +62 -0
- py2docfx/venv/venv1/Lib/site-packages/google/auth/aio/transport/aiohttp.py +6 -0
- py2docfx/venv/venv1/Lib/site-packages/google/auth/compute_engine/_metadata.py +5 -1
- py2docfx/venv/venv1/Lib/site-packages/google/auth/compute_engine/credentials.py +2 -1
- py2docfx/venv/venv1/Lib/site-packages/google/auth/identity_pool.py +91 -2
- py2docfx/venv/venv1/Lib/site-packages/google/auth/impersonated_credentials.py +75 -0
- py2docfx/venv/venv1/Lib/site-packages/google/auth/transport/__init__.py +1 -0
- py2docfx/venv/venv1/Lib/site-packages/google/auth/transport/_aiohttp_requests.py +8 -1
- py2docfx/venv/venv1/Lib/site-packages/google/auth/transport/_http_client.py +3 -1
- py2docfx/venv/venv1/Lib/site-packages/google/auth/transport/requests.py +4 -1
- py2docfx/venv/venv1/Lib/site-packages/google/auth/transport/urllib3.py +15 -5
- py2docfx/venv/venv1/Lib/site-packages/google/auth/version.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/google/oauth2/id_token.py +12 -0
- py2docfx/venv/venv1/Lib/site-packages/google/oauth2/webauthn_types.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/__init__.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/any.py +15 -1
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/any_pb2.py +3 -3
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/api_pb2.py +3 -3
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/compiler/plugin_pb2.py +3 -3
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/descriptor.py +15 -2
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/descriptor_pb2.py +258 -113
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/descriptor_pool.py +22 -8
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/duration_pb2.py +3 -3
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/empty_pb2.py +3 -3
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/field_mask_pb2.py +3 -3
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/internal/decoder.py +106 -23
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/internal/field_mask.py +3 -1
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/internal/python_edition_defaults.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/internal/python_message.py +21 -18
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/internal/testing_refleaks.py +8 -2
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/internal/well_known_types.py +60 -43
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/json_format.py +4 -5
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/message_factory.py +16 -0
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/runtime_version.py +2 -2
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/source_context_pb2.py +3 -3
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/struct_pb2.py +3 -3
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/text_format.py +11 -7
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/timestamp_pb2.py +3 -3
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/type_pb2.py +3 -3
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/wrappers_pb2.py +3 -3
- py2docfx/venv/venv1/Lib/site-packages/google/rpc/error_details_pb2.py +29 -23
- py2docfx/venv/venv1/Lib/site-packages/google/rpc/error_details_pb2.pyi +41 -2
- py2docfx/venv/venv1/Lib/site-packages/msal/application.py +1 -0
- py2docfx/venv/venv1/Lib/site-packages/msal/individual_cache.py +9 -5
- py2docfx/venv/venv1/Lib/site-packages/msal/managed_identity.py +4 -5
- py2docfx/venv/venv1/Lib/site-packages/msal/sku.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/msal/throttled_http_client.py +58 -30
- py2docfx/venv/venv1/Lib/site-packages/opencensus/__init__.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/__init__.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/__init__.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/common/__init__.py +138 -138
- py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/common/exporter.py +93 -93
- py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/common/processor.py +63 -63
- py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/common/protocol.py +206 -206
- py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/common/storage.py +205 -205
- py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/common/transport.py +355 -355
- py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/common/utils.py +79 -79
- py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/common/version.py +15 -15
- py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/log_exporter/__init__.py +314 -314
- py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/metrics_exporter/__init__.py +190 -190
- py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/metrics_exporter/standard_metrics/__init__.py +62 -62
- py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/metrics_exporter/standard_metrics/cpu.py +50 -50
- py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/metrics_exporter/standard_metrics/http_requests.py +176 -176
- py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/metrics_exporter/standard_metrics/memory.py +42 -42
- py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/metrics_exporter/standard_metrics/process.py +87 -87
- py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/statsbeat/__init__.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/statsbeat/state.py +50 -50
- py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/statsbeat/statsbeat.py +100 -100
- py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/statsbeat/statsbeat_metrics.py +480 -480
- py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/trace_exporter/__init__.py +236 -236
- py2docfx/venv/venv1/Lib/site-packages/packaging/__init__.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/packaging/_elffile.py +1 -2
- py2docfx/venv/venv1/Lib/site-packages/packaging/_manylinux.py +1 -2
- py2docfx/venv/venv1/Lib/site-packages/packaging/_parser.py +1 -2
- py2docfx/venv/venv1/Lib/site-packages/packaging/_tokenizer.py +5 -4
- py2docfx/venv/venv1/Lib/site-packages/packaging/licenses/__init__.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/packaging/markers.py +53 -22
- py2docfx/venv/venv1/Lib/site-packages/packaging/metadata.py +1 -2
- py2docfx/venv/venv1/Lib/site-packages/packaging/specifiers.py +1 -2
- py2docfx/venv/venv1/Lib/site-packages/packaging/tags.py +39 -0
- py2docfx/venv/venv1/Lib/site-packages/pkg_resources/__init__.py +6 -7
- py2docfx/venv/venv1/Lib/site-packages/requests/__version__.py +2 -2
- py2docfx/venv/venv1/Lib/site-packages/requests/compat.py +12 -0
- py2docfx/venv/venv1/Lib/site-packages/requests/models.py +3 -1
- py2docfx/venv/venv1/Lib/site-packages/requests/utils.py +6 -16
- py2docfx/venv/venv1/Lib/site-packages/rsa/__init__.py +2 -2
- py2docfx/venv/venv1/Lib/site-packages/rsa/asn1.py +52 -52
- py2docfx/venv/venv1/Lib/site-packages/rsa/cli.py +321 -321
- py2docfx/venv/venv1/Lib/site-packages/rsa/common.py +184 -184
- py2docfx/venv/venv1/Lib/site-packages/rsa/core.py +53 -53
- py2docfx/venv/venv1/Lib/site-packages/rsa/key.py +858 -858
- py2docfx/venv/venv1/Lib/site-packages/rsa/parallel.py +96 -96
- py2docfx/venv/venv1/Lib/site-packages/rsa/pem.py +134 -134
- py2docfx/venv/venv1/Lib/site-packages/rsa/pkcs1.py +485 -485
- py2docfx/venv/venv1/Lib/site-packages/rsa/pkcs1_v2.py +100 -100
- py2docfx/venv/venv1/Lib/site-packages/rsa/prime.py +198 -198
- py2docfx/venv/venv1/Lib/site-packages/rsa/py.typed +1 -1
- py2docfx/venv/venv1/Lib/site-packages/rsa/randnum.py +95 -95
- py2docfx/venv/venv1/Lib/site-packages/rsa/transform.py +72 -72
- py2docfx/venv/venv1/Lib/site-packages/rsa/util.py +97 -97
- py2docfx/venv/venv1/Lib/site-packages/setuptools/__init__.py +0 -38
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_discovery.py +33 -0
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/command/build_scripts.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/command/config.py +0 -2
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/compilers/C/tests/test_unix.py +63 -0
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/compilers/C/unix.py +5 -6
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_entry_points.py +4 -0
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_normalization.py +0 -2
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_path.py +12 -3
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_reqs.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_scripts.py +361 -0
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_shutil.py +6 -0
- py2docfx/venv/venv1/Lib/site-packages/setuptools/build_meta.py +25 -37
- py2docfx/venv/venv1/Lib/site-packages/setuptools/command/bdist_egg.py +9 -11
- py2docfx/venv/venv1/Lib/site-packages/setuptools/command/bdist_wheel.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/setuptools/command/build_ext.py +29 -28
- py2docfx/venv/venv1/Lib/site-packages/setuptools/command/develop.py +39 -179
- py2docfx/venv/venv1/Lib/site-packages/setuptools/command/easy_install.py +17 -2352
- py2docfx/venv/venv1/Lib/site-packages/setuptools/command/editable_wheel.py +14 -31
- py2docfx/venv/venv1/Lib/site-packages/setuptools/command/egg_info.py +0 -2
- py2docfx/venv/venv1/Lib/site-packages/setuptools/command/install.py +3 -55
- py2docfx/venv/venv1/Lib/site-packages/setuptools/command/install_scripts.py +5 -11
- py2docfx/venv/venv1/Lib/site-packages/setuptools/command/sdist.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/setuptools/compat/py310.py +11 -0
- py2docfx/venv/venv1/Lib/site-packages/setuptools/dist.py +10 -12
- py2docfx/venv/venv1/Lib/site-packages/setuptools/installer.py +34 -29
- py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/contexts.py +0 -14
- py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/fixtures.py +235 -0
- py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/integration/test_pbr.py +20 -0
- py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_build_meta.py +0 -24
- py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_develop.py +1 -64
- py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_dist.py +2 -2
- py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_dist_info.py +0 -63
- py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_editable_install.py +15 -41
- py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_egg_info.py +3 -2
- py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_scripts.py +12 -0
- py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_wheel.py +12 -36
- py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_windows_wrappers.py +3 -4
- py2docfx/venv/venv1/Lib/site-packages/setuptools/wheel.py +49 -24
- py2docfx/venv/venv1/Lib/site-packages/typing_extensions.py +357 -703
- py2docfx/venv/venv1/Lib/site-packages/urllib3/_version.py +2 -2
- py2docfx/venv/venv1/Lib/site-packages/urllib3/connection.py +87 -38
- py2docfx/venv/venv1/Lib/site-packages/urllib3/contrib/emscripten/fetch.py +20 -0
- py2docfx/venv/venv1/Lib/site-packages/urllib3/poolmanager.py +17 -1
- py2docfx/venv/venv1/Lib/site-packages/urllib3/response.py +53 -24
- py2docfx/venv/venv1/Lib/site-packages/urllib3/util/request.py +12 -4
- py2docfx/venv/venv1/Lib/site-packages/urllib3/util/ssl_.py +1 -1
- {py2docfx-0.1.16.dev2064350.dist-info → py2docfx-0.1.17.dist-info}/METADATA +1 -1
- {py2docfx-0.1.16.dev2064350.dist-info → py2docfx-0.1.17.dist-info}/RECORD +374 -372
- {py2docfx-0.1.16.dev2064350.dist-info → py2docfx-0.1.17.dist-info}/WHEEL +1 -1
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/package_index.py +0 -1137
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/sandbox.py +0 -536
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/server.py +0 -86
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_easy_install.py +0 -1476
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_packageindex.py +0 -267
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_sandbox.py +0 -134
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/application.py +0 -119
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/application.py +0 -121
- py2docfx/venv/venv1/Lib/site-packages/setuptools/package_index.py +0 -1137
- py2docfx/venv/venv1/Lib/site-packages/setuptools/sandbox.py +0 -536
- py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/server.py +0 -86
- py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_easy_install.py +0 -1476
- py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_packageindex.py +0 -267
- py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_sandbox.py +0 -134
- {py2docfx-0.1.16.dev2064350.dist-info → py2docfx-0.1.17.dist-info}/top_level.txt +0 -0
@@ -244,6 +244,69 @@ class TestUnixCCompiler(support.TempdirManager):
|
|
244
244
|
sysconfig.customize_compiler(self.cc)
|
245
245
|
assert self.cc.linker_so[0] == 'my_cc'
|
246
246
|
|
247
|
+
@pytest.mark.skipif('platform.system == "Windows"')
|
248
|
+
def test_cxx_commands_used_are_correct(self):
|
249
|
+
def gcv(v):
|
250
|
+
if v == 'LDSHARED':
|
251
|
+
return 'ccache gcc-4.2 -bundle -undefined dynamic_lookup'
|
252
|
+
elif v == 'LDCXXSHARED':
|
253
|
+
return 'ccache g++-4.2 -bundle -undefined dynamic_lookup'
|
254
|
+
elif v == 'CXX':
|
255
|
+
return 'ccache g++-4.2'
|
256
|
+
elif v == 'CC':
|
257
|
+
return 'ccache gcc-4.2'
|
258
|
+
return ''
|
259
|
+
|
260
|
+
def gcvs(*args, _orig=sysconfig.get_config_vars):
|
261
|
+
if args:
|
262
|
+
return list(map(sysconfig.get_config_var, args))
|
263
|
+
return _orig() # pragma: no cover
|
264
|
+
|
265
|
+
sysconfig.get_config_var = gcv
|
266
|
+
sysconfig.get_config_vars = gcvs
|
267
|
+
with (
|
268
|
+
mock.patch.object(self.cc, 'spawn', return_value=None) as mock_spawn,
|
269
|
+
mock.patch.object(self.cc, '_need_link', return_value=True),
|
270
|
+
mock.patch.object(self.cc, 'mkpath', return_value=None),
|
271
|
+
EnvironmentVarGuard() as env,
|
272
|
+
):
|
273
|
+
# override environment overrides in case they're specified by CI
|
274
|
+
del env['CXX']
|
275
|
+
del env['LDCXXSHARED']
|
276
|
+
|
277
|
+
sysconfig.customize_compiler(self.cc)
|
278
|
+
assert self.cc.linker_so_cxx[0:2] == ['ccache', 'g++-4.2']
|
279
|
+
assert self.cc.linker_exe_cxx[0:2] == ['ccache', 'g++-4.2']
|
280
|
+
self.cc.link(None, [], 'a.out', target_lang='c++')
|
281
|
+
call_args = mock_spawn.call_args[0][0]
|
282
|
+
expected = ['ccache', 'g++-4.2', '-bundle', '-undefined', 'dynamic_lookup']
|
283
|
+
assert call_args[:5] == expected
|
284
|
+
|
285
|
+
self.cc.link_executable([], 'a.out', target_lang='c++')
|
286
|
+
call_args = mock_spawn.call_args[0][0]
|
287
|
+
expected = ['ccache', 'g++-4.2', '-o', self.cc.executable_filename('a.out')]
|
288
|
+
assert call_args[:4] == expected
|
289
|
+
|
290
|
+
env['LDCXXSHARED'] = 'wrapper g++-4.2 -bundle -undefined dynamic_lookup'
|
291
|
+
env['CXX'] = 'wrapper g++-4.2'
|
292
|
+
sysconfig.customize_compiler(self.cc)
|
293
|
+
assert self.cc.linker_so_cxx[0:2] == ['wrapper', 'g++-4.2']
|
294
|
+
assert self.cc.linker_exe_cxx[0:2] == ['wrapper', 'g++-4.2']
|
295
|
+
self.cc.link(None, [], 'a.out', target_lang='c++')
|
296
|
+
call_args = mock_spawn.call_args[0][0]
|
297
|
+
expected = ['wrapper', 'g++-4.2', '-bundle', '-undefined', 'dynamic_lookup']
|
298
|
+
assert call_args[:5] == expected
|
299
|
+
|
300
|
+
self.cc.link_executable([], 'a.out', target_lang='c++')
|
301
|
+
call_args = mock_spawn.call_args[0][0]
|
302
|
+
expected = [
|
303
|
+
'wrapper',
|
304
|
+
'g++-4.2',
|
305
|
+
'-o',
|
306
|
+
self.cc.executable_filename('a.out'),
|
307
|
+
]
|
308
|
+
assert call_args[:4] == expected
|
309
|
+
|
247
310
|
@pytest.mark.skipif('platform.system == "Windows"')
|
248
311
|
@pytest.mark.usefixtures('disable_macos_customization')
|
249
312
|
def test_cc_overrides_ldshared_for_cxx_correctly(self):
|
@@ -286,19 +286,18 @@ class Compiler(base.Compiler):
|
|
286
286
|
# building an executable or linker_so (with shared options)
|
287
287
|
# when building a shared library.
|
288
288
|
building_exe = target_desc == base.Compiler.EXECUTABLE
|
289
|
+
target_cxx = target_lang == "c++"
|
289
290
|
linker = (
|
290
|
-
self.linker_exe
|
291
|
+
(self.linker_exe_cxx if target_cxx else self.linker_exe)
|
291
292
|
if building_exe
|
292
|
-
else (
|
293
|
-
self.linker_so_cxx if target_lang == "c++" else self.linker_so
|
294
|
-
)
|
293
|
+
else (self.linker_so_cxx if target_cxx else self.linker_so)
|
295
294
|
)[:]
|
296
295
|
|
297
|
-
if
|
296
|
+
if target_cxx and self.compiler_cxx:
|
298
297
|
env, linker_ne = _split_env(linker)
|
299
298
|
aix, linker_na = _split_aix(linker_ne)
|
300
299
|
_, compiler_cxx_ne = _split_env(self.compiler_cxx)
|
301
|
-
_, linker_exe_ne = _split_env(self.
|
300
|
+
_, linker_exe_ne = _split_env(self.linker_exe_cxx)
|
302
301
|
|
303
302
|
params = _linker_params(linker_na, linker_exe_ne)
|
304
303
|
linker = env + aix + compiler_cxx_ne + params
|
@@ -15,6 +15,10 @@ def ensure_valid(ep):
|
|
15
15
|
"""
|
16
16
|
Exercise one of the dynamic properties to trigger
|
17
17
|
the pattern match.
|
18
|
+
|
19
|
+
This function is deprecated in favor of importlib_metadata 8.7 and
|
20
|
+
Python 3.14 importlib.metadata, which validates entry points on
|
21
|
+
construction.
|
18
22
|
"""
|
19
23
|
try:
|
20
24
|
ep.extras
|
@@ -36,7 +36,6 @@ def safe_name(component: str) -> str:
|
|
36
36
|
>>> safe_name("hello_world")
|
37
37
|
'hello_world'
|
38
38
|
"""
|
39
|
-
# See pkg_resources.safe_name
|
40
39
|
return _UNSAFE_NAME_CHARS.sub("-", component)
|
41
40
|
|
42
41
|
|
@@ -81,7 +80,6 @@ def best_effort_version(version: str) -> str:
|
|
81
80
|
>>> best_effort_version("42.+?1")
|
82
81
|
'42.dev0+sanitized.1'
|
83
82
|
"""
|
84
|
-
# See pkg_resources._forgiving_version
|
85
83
|
try:
|
86
84
|
return safe_version(version)
|
87
85
|
except packaging.version.InvalidVersion:
|
@@ -39,11 +39,20 @@ def same_path(p1: StrPath, p2: StrPath) -> bool:
|
|
39
39
|
return normpath(p1) == normpath(p2)
|
40
40
|
|
41
41
|
|
42
|
+
def _cygwin_patch(filename: StrPath): # pragma: nocover
|
43
|
+
"""
|
44
|
+
Contrary to POSIX 2008, on Cygwin, getcwd (3) contains
|
45
|
+
symlink components. Using
|
46
|
+
os.path.abspath() works around this limitation. A fix in os.getcwd()
|
47
|
+
would probably better, in Cygwin even more so, except
|
48
|
+
that this seems to be by design...
|
49
|
+
"""
|
50
|
+
return os.path.abspath(filename) if sys.platform == 'cygwin' else filename
|
51
|
+
|
52
|
+
|
42
53
|
def normpath(filename: StrPath) -> str:
|
43
54
|
"""Normalize a file/dir name for comparison purposes."""
|
44
|
-
|
45
|
-
file = os.path.abspath(filename) if sys.platform == 'cygwin' else filename
|
46
|
-
return os.path.normcase(os.path.realpath(os.path.normpath(file)))
|
55
|
+
return os.path.normcase(os.path.realpath(os.path.normpath(_cygwin_patch(filename))))
|
47
56
|
|
48
57
|
|
49
58
|
@contextlib.contextmanager
|
@@ -37,6 +37,6 @@ def parse(strs: _StrOrIter) -> Iterator[Requirement]: ...
|
|
37
37
|
def parse(strs: _StrOrIter, parser: Callable[[str], _T]) -> Iterator[_T]: ...
|
38
38
|
def parse(strs: _StrOrIter, parser: Callable[[str], _T] = parse_req) -> Iterator[_T]: # type: ignore[assignment]
|
39
39
|
"""
|
40
|
-
|
40
|
+
Parse requirements.
|
41
41
|
"""
|
42
42
|
return map(parser, parse_strings(strs))
|
@@ -0,0 +1,361 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
import os
|
4
|
+
import re
|
5
|
+
import shlex
|
6
|
+
import shutil
|
7
|
+
import struct
|
8
|
+
import subprocess
|
9
|
+
import sys
|
10
|
+
import textwrap
|
11
|
+
from collections.abc import Iterable
|
12
|
+
from typing import TYPE_CHECKING, TypedDict
|
13
|
+
|
14
|
+
from ._importlib import metadata, resources
|
15
|
+
|
16
|
+
if TYPE_CHECKING:
|
17
|
+
from typing_extensions import Self
|
18
|
+
|
19
|
+
from .warnings import SetuptoolsWarning
|
20
|
+
|
21
|
+
from distutils.command.build_scripts import first_line_re
|
22
|
+
from distutils.util import get_platform
|
23
|
+
|
24
|
+
|
25
|
+
class _SplitArgs(TypedDict, total=False):
|
26
|
+
comments: bool
|
27
|
+
posix: bool
|
28
|
+
|
29
|
+
|
30
|
+
class CommandSpec(list):
|
31
|
+
"""
|
32
|
+
A command spec for a #! header, specified as a list of arguments akin to
|
33
|
+
those passed to Popen.
|
34
|
+
"""
|
35
|
+
|
36
|
+
options: list[str] = []
|
37
|
+
split_args = _SplitArgs()
|
38
|
+
|
39
|
+
@classmethod
|
40
|
+
def best(cls):
|
41
|
+
"""
|
42
|
+
Choose the best CommandSpec class based on environmental conditions.
|
43
|
+
"""
|
44
|
+
return cls
|
45
|
+
|
46
|
+
@classmethod
|
47
|
+
def _sys_executable(cls):
|
48
|
+
_default = os.path.normpath(sys.executable)
|
49
|
+
return os.environ.get('__PYVENV_LAUNCHER__', _default)
|
50
|
+
|
51
|
+
@classmethod
|
52
|
+
def from_param(cls, param: Self | str | Iterable[str] | None) -> Self:
|
53
|
+
"""
|
54
|
+
Construct a CommandSpec from a parameter to build_scripts, which may
|
55
|
+
be None.
|
56
|
+
"""
|
57
|
+
if isinstance(param, cls):
|
58
|
+
return param
|
59
|
+
if isinstance(param, str):
|
60
|
+
return cls.from_string(param)
|
61
|
+
if isinstance(param, Iterable):
|
62
|
+
return cls(param)
|
63
|
+
if param is None:
|
64
|
+
return cls.from_environment()
|
65
|
+
raise TypeError(f"Argument has an unsupported type {type(param)}")
|
66
|
+
|
67
|
+
@classmethod
|
68
|
+
def from_environment(cls):
|
69
|
+
return cls([cls._sys_executable()])
|
70
|
+
|
71
|
+
@classmethod
|
72
|
+
def from_string(cls, string: str) -> Self:
|
73
|
+
"""
|
74
|
+
Construct a command spec from a simple string representing a command
|
75
|
+
line parseable by shlex.split.
|
76
|
+
"""
|
77
|
+
items = shlex.split(string, **cls.split_args)
|
78
|
+
return cls(items)
|
79
|
+
|
80
|
+
def install_options(self, script_text: str):
|
81
|
+
self.options = shlex.split(self._extract_options(script_text))
|
82
|
+
cmdline = subprocess.list2cmdline(self)
|
83
|
+
if not isascii(cmdline):
|
84
|
+
self.options[:0] = ['-x']
|
85
|
+
|
86
|
+
@staticmethod
|
87
|
+
def _extract_options(orig_script):
|
88
|
+
"""
|
89
|
+
Extract any options from the first line of the script.
|
90
|
+
"""
|
91
|
+
first = (orig_script + '\n').splitlines()[0]
|
92
|
+
match = _first_line_re().match(first)
|
93
|
+
options = match.group(1) or '' if match else ''
|
94
|
+
return options.strip()
|
95
|
+
|
96
|
+
def as_header(self):
|
97
|
+
return self._render(self + list(self.options))
|
98
|
+
|
99
|
+
@staticmethod
|
100
|
+
def _strip_quotes(item):
|
101
|
+
_QUOTES = '"\''
|
102
|
+
for q in _QUOTES:
|
103
|
+
if item.startswith(q) and item.endswith(q):
|
104
|
+
return item[1:-1]
|
105
|
+
return item
|
106
|
+
|
107
|
+
@staticmethod
|
108
|
+
def _render(items):
|
109
|
+
cmdline = subprocess.list2cmdline(
|
110
|
+
CommandSpec._strip_quotes(item.strip()) for item in items
|
111
|
+
)
|
112
|
+
return '#!' + cmdline + '\n'
|
113
|
+
|
114
|
+
|
115
|
+
class WindowsCommandSpec(CommandSpec):
|
116
|
+
split_args = _SplitArgs(posix=False)
|
117
|
+
|
118
|
+
|
119
|
+
class ScriptWriter:
|
120
|
+
"""
|
121
|
+
Encapsulates behavior around writing entry point scripts for console and
|
122
|
+
gui apps.
|
123
|
+
"""
|
124
|
+
|
125
|
+
template = textwrap.dedent(
|
126
|
+
r"""
|
127
|
+
# EASY-INSTALL-ENTRY-SCRIPT: %(spec)r,%(group)r,%(name)r
|
128
|
+
import re
|
129
|
+
import sys
|
130
|
+
|
131
|
+
# for compatibility with easy_install; see #2198
|
132
|
+
__requires__ = %(spec)r
|
133
|
+
|
134
|
+
try:
|
135
|
+
from importlib.metadata import distribution
|
136
|
+
except ImportError:
|
137
|
+
try:
|
138
|
+
from importlib_metadata import distribution
|
139
|
+
except ImportError:
|
140
|
+
from pkg_resources import load_entry_point
|
141
|
+
|
142
|
+
|
143
|
+
def importlib_load_entry_point(spec, group, name):
|
144
|
+
dist_name, _, _ = spec.partition('==')
|
145
|
+
matches = (
|
146
|
+
entry_point
|
147
|
+
for entry_point in distribution(dist_name).entry_points
|
148
|
+
if entry_point.group == group and entry_point.name == name
|
149
|
+
)
|
150
|
+
return next(matches).load()
|
151
|
+
|
152
|
+
|
153
|
+
globals().setdefault('load_entry_point', importlib_load_entry_point)
|
154
|
+
|
155
|
+
|
156
|
+
if __name__ == '__main__':
|
157
|
+
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
|
158
|
+
sys.exit(load_entry_point(%(spec)r, %(group)r, %(name)r)())
|
159
|
+
"""
|
160
|
+
).lstrip()
|
161
|
+
|
162
|
+
command_spec_class = CommandSpec
|
163
|
+
|
164
|
+
@classmethod
|
165
|
+
def get_args(cls, dist, header=None):
|
166
|
+
"""
|
167
|
+
Yield write_script() argument tuples for a distribution's
|
168
|
+
console_scripts and gui_scripts entry points.
|
169
|
+
"""
|
170
|
+
|
171
|
+
# If distribution is not an importlib.metadata.Distribution, assume
|
172
|
+
# it's a pkg_resources.Distribution and transform it.
|
173
|
+
if not hasattr(dist, 'entry_points'):
|
174
|
+
SetuptoolsWarning.emit("Unsupported distribution encountered.")
|
175
|
+
dist = metadata.Distribution.at(dist.egg_info)
|
176
|
+
|
177
|
+
if header is None:
|
178
|
+
header = cls.get_header()
|
179
|
+
spec = f'{dist.name}=={dist.version}'
|
180
|
+
for type_ in 'console', 'gui':
|
181
|
+
group = f'{type_}_scripts'
|
182
|
+
for ep in dist.entry_points.select(group=group):
|
183
|
+
name = ep.name
|
184
|
+
cls._ensure_safe_name(ep.name)
|
185
|
+
script_text = cls.template % locals()
|
186
|
+
args = cls._get_script_args(type_, ep.name, header, script_text)
|
187
|
+
yield from args
|
188
|
+
|
189
|
+
@staticmethod
|
190
|
+
def _ensure_safe_name(name):
|
191
|
+
"""
|
192
|
+
Prevent paths in *_scripts entry point names.
|
193
|
+
"""
|
194
|
+
has_path_sep = re.search(r'[\\/]', name)
|
195
|
+
if has_path_sep:
|
196
|
+
raise ValueError("Path separators not allowed in script names")
|
197
|
+
|
198
|
+
@classmethod
|
199
|
+
def best(cls):
|
200
|
+
"""
|
201
|
+
Select the best ScriptWriter for this environment.
|
202
|
+
"""
|
203
|
+
if sys.platform == 'win32' or (os.name == 'java' and os._name == 'nt'):
|
204
|
+
return WindowsScriptWriter.best()
|
205
|
+
else:
|
206
|
+
return cls
|
207
|
+
|
208
|
+
@classmethod
|
209
|
+
def _get_script_args(cls, type_, name, header, script_text):
|
210
|
+
# Simply write the stub with no extension.
|
211
|
+
yield (name, header + script_text)
|
212
|
+
|
213
|
+
@classmethod
|
214
|
+
def get_header(
|
215
|
+
cls,
|
216
|
+
script_text: str = "",
|
217
|
+
executable: str | CommandSpec | Iterable[str] | None = None,
|
218
|
+
) -> str:
|
219
|
+
"""Create a #! line, getting options (if any) from script_text"""
|
220
|
+
cmd = cls.command_spec_class.best().from_param(executable)
|
221
|
+
cmd.install_options(script_text)
|
222
|
+
return cmd.as_header()
|
223
|
+
|
224
|
+
|
225
|
+
class WindowsScriptWriter(ScriptWriter):
|
226
|
+
command_spec_class = WindowsCommandSpec
|
227
|
+
|
228
|
+
@classmethod
|
229
|
+
def best(cls):
|
230
|
+
"""
|
231
|
+
Select the best ScriptWriter suitable for Windows
|
232
|
+
"""
|
233
|
+
writer_lookup = dict(
|
234
|
+
executable=WindowsExecutableLauncherWriter,
|
235
|
+
natural=cls,
|
236
|
+
)
|
237
|
+
# for compatibility, use the executable launcher by default
|
238
|
+
launcher = os.environ.get('SETUPTOOLS_LAUNCHER', 'executable')
|
239
|
+
return writer_lookup[launcher]
|
240
|
+
|
241
|
+
@classmethod
|
242
|
+
def _get_script_args(cls, type_, name, header, script_text):
|
243
|
+
"For Windows, add a .py extension"
|
244
|
+
ext = dict(console='.pya', gui='.pyw')[type_]
|
245
|
+
if ext not in os.environ['PATHEXT'].lower().split(';'):
|
246
|
+
msg = (
|
247
|
+
"{ext} not listed in PATHEXT; scripts will not be "
|
248
|
+
"recognized as executables."
|
249
|
+
).format(**locals())
|
250
|
+
SetuptoolsWarning.emit(msg)
|
251
|
+
old = ['.pya', '.py', '-script.py', '.pyc', '.pyo', '.pyw', '.exe']
|
252
|
+
old.remove(ext)
|
253
|
+
header = cls._adjust_header(type_, header)
|
254
|
+
blockers = [name + x for x in old]
|
255
|
+
yield name + ext, header + script_text, 't', blockers
|
256
|
+
|
257
|
+
@classmethod
|
258
|
+
def _adjust_header(cls, type_, orig_header):
|
259
|
+
"""
|
260
|
+
Make sure 'pythonw' is used for gui and 'python' is used for
|
261
|
+
console (regardless of what sys.executable is).
|
262
|
+
"""
|
263
|
+
pattern = 'pythonw.exe'
|
264
|
+
repl = 'python.exe'
|
265
|
+
if type_ == 'gui':
|
266
|
+
pattern, repl = repl, pattern
|
267
|
+
pattern_ob = re.compile(re.escape(pattern), re.IGNORECASE)
|
268
|
+
new_header = pattern_ob.sub(string=orig_header, repl=repl)
|
269
|
+
return new_header if cls._use_header(new_header) else orig_header
|
270
|
+
|
271
|
+
@staticmethod
|
272
|
+
def _use_header(new_header):
|
273
|
+
"""
|
274
|
+
Should _adjust_header use the replaced header?
|
275
|
+
|
276
|
+
On non-windows systems, always use. On
|
277
|
+
Windows systems, only use the replaced header if it resolves
|
278
|
+
to an executable on the system.
|
279
|
+
"""
|
280
|
+
clean_header = new_header[2:-1].strip('"')
|
281
|
+
return sys.platform != 'win32' or shutil.which(clean_header)
|
282
|
+
|
283
|
+
|
284
|
+
class WindowsExecutableLauncherWriter(WindowsScriptWriter):
|
285
|
+
@classmethod
|
286
|
+
def _get_script_args(cls, type_, name, header, script_text):
|
287
|
+
"""
|
288
|
+
For Windows, add a .py extension and an .exe launcher
|
289
|
+
"""
|
290
|
+
if type_ == 'gui':
|
291
|
+
launcher_type = 'gui'
|
292
|
+
ext = '-script.pyw'
|
293
|
+
old = ['.pyw']
|
294
|
+
else:
|
295
|
+
launcher_type = 'cli'
|
296
|
+
ext = '-script.py'
|
297
|
+
old = ['.py', '.pyc', '.pyo']
|
298
|
+
hdr = cls._adjust_header(type_, header)
|
299
|
+
blockers = [name + x for x in old]
|
300
|
+
yield (name + ext, hdr + script_text, 't', blockers)
|
301
|
+
yield (
|
302
|
+
name + '.exe',
|
303
|
+
get_win_launcher(launcher_type),
|
304
|
+
'b', # write in binary mode
|
305
|
+
)
|
306
|
+
if not is_64bit():
|
307
|
+
# install a manifest for the launcher to prevent Windows
|
308
|
+
# from detecting it as an installer (which it will for
|
309
|
+
# launchers like easy_install.exe). Consider only
|
310
|
+
# adding a manifest for launchers detected as installers.
|
311
|
+
# See Distribute #143 for details.
|
312
|
+
m_name = name + '.exe.manifest'
|
313
|
+
yield (m_name, load_launcher_manifest(name), 't')
|
314
|
+
|
315
|
+
|
316
|
+
def get_win_launcher(type):
|
317
|
+
"""
|
318
|
+
Load the Windows launcher (executable) suitable for launching a script.
|
319
|
+
|
320
|
+
`type` should be either 'cli' or 'gui'
|
321
|
+
|
322
|
+
Returns the executable as a byte string.
|
323
|
+
"""
|
324
|
+
launcher_fn = f'{type}.exe'
|
325
|
+
if is_64bit():
|
326
|
+
if get_platform() == "win-arm64":
|
327
|
+
launcher_fn = launcher_fn.replace(".", "-arm64.")
|
328
|
+
else:
|
329
|
+
launcher_fn = launcher_fn.replace(".", "-64.")
|
330
|
+
else:
|
331
|
+
launcher_fn = launcher_fn.replace(".", "-32.")
|
332
|
+
return resources.files('setuptools').joinpath(launcher_fn).read_bytes()
|
333
|
+
|
334
|
+
|
335
|
+
def load_launcher_manifest(name):
|
336
|
+
res = resources.files(__name__).joinpath('launcher manifest.xml')
|
337
|
+
return res.read_text(encoding='utf-8') % vars()
|
338
|
+
|
339
|
+
|
340
|
+
def _first_line_re():
|
341
|
+
"""
|
342
|
+
Return a regular expression based on first_line_re suitable for matching
|
343
|
+
strings.
|
344
|
+
"""
|
345
|
+
if isinstance(first_line_re.pattern, str):
|
346
|
+
return first_line_re
|
347
|
+
|
348
|
+
# first_line_re in Python >=3.1.4 and >=3.2.1 is a bytes pattern.
|
349
|
+
return re.compile(first_line_re.pattern.decode())
|
350
|
+
|
351
|
+
|
352
|
+
def is_64bit():
|
353
|
+
return struct.calcsize("P") == 8
|
354
|
+
|
355
|
+
|
356
|
+
def isascii(s):
|
357
|
+
try:
|
358
|
+
s.encode('ascii')
|
359
|
+
except UnicodeError:
|
360
|
+
return False
|
361
|
+
return True
|
@@ -67,9 +67,6 @@ __all__ = [
|
|
67
67
|
'SetupRequirementsError',
|
68
68
|
]
|
69
69
|
|
70
|
-
SETUPTOOLS_ENABLE_FEATURES = os.getenv("SETUPTOOLS_ENABLE_FEATURES", "").lower()
|
71
|
-
LEGACY_EDITABLE = "legacy-editable" in SETUPTOOLS_ENABLE_FEATURES.replace("_", "-")
|
72
|
-
|
73
70
|
|
74
71
|
class SetupRequirementsError(BaseException):
|
75
72
|
def __init__(self, specifiers) -> None:
|
@@ -457,37 +454,30 @@ class _BuildMetaBackend(_ConfigSettingsTranslator):
|
|
457
454
|
assert len(dist_info_candidates) <= 1
|
458
455
|
return str(dist_info_candidates[0]) if dist_info_candidates else None
|
459
456
|
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
):
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
cmd = ["editable_wheel", *opts, *self._editable_args(config_settings)]
|
475
|
-
with suppress_known_deprecation():
|
476
|
-
return self._build_with_temp_dir(
|
477
|
-
cmd, ".whl", wheel_directory, config_settings
|
478
|
-
)
|
457
|
+
def build_editable(
|
458
|
+
self,
|
459
|
+
wheel_directory: StrPath,
|
460
|
+
config_settings: _ConfigSettings = None,
|
461
|
+
metadata_directory: StrPath | None = None,
|
462
|
+
):
|
463
|
+
# XXX can or should we hide our editable_wheel command normally?
|
464
|
+
info_dir = self._get_dist_info_dir(metadata_directory)
|
465
|
+
opts = ["--dist-info-dir", info_dir] if info_dir else []
|
466
|
+
cmd = ["editable_wheel", *opts, *self._editable_args(config_settings)]
|
467
|
+
with suppress_known_deprecation():
|
468
|
+
return self._build_with_temp_dir(
|
469
|
+
cmd, ".whl", wheel_directory, config_settings
|
470
|
+
)
|
479
471
|
|
480
|
-
|
481
|
-
|
482
|
-
):
|
483
|
-
return self.get_requires_for_build_wheel(config_settings)
|
472
|
+
def get_requires_for_build_editable(self, config_settings: _ConfigSettings = None):
|
473
|
+
return self.get_requires_for_build_wheel(config_settings)
|
484
474
|
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
475
|
+
def prepare_metadata_for_build_editable(
|
476
|
+
self, metadata_directory: StrPath, config_settings: _ConfigSettings = None
|
477
|
+
):
|
478
|
+
return self.prepare_metadata_for_build_wheel(
|
479
|
+
metadata_directory, config_settings
|
480
|
+
)
|
491
481
|
|
492
482
|
|
493
483
|
class _BuildMetaLegacyBackend(_BuildMetaBackend):
|
@@ -549,11 +539,9 @@ get_requires_for_build_sdist = _BACKEND.get_requires_for_build_sdist
|
|
549
539
|
prepare_metadata_for_build_wheel = _BACKEND.prepare_metadata_for_build_wheel
|
550
540
|
build_wheel = _BACKEND.build_wheel
|
551
541
|
build_sdist = _BACKEND.build_sdist
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
prepare_metadata_for_build_editable = _BACKEND.prepare_metadata_for_build_editable
|
556
|
-
build_editable = _BACKEND.build_editable
|
542
|
+
get_requires_for_build_editable = _BACKEND.get_requires_for_build_editable
|
543
|
+
prepare_metadata_for_build_editable = _BACKEND.prepare_metadata_for_build_editable
|
544
|
+
build_editable = _BACKEND.build_editable
|
557
545
|
|
558
546
|
|
559
547
|
# The legacy backend
|
@@ -9,7 +9,7 @@ import os
|
|
9
9
|
import re
|
10
10
|
import sys
|
11
11
|
import textwrap
|
12
|
-
from sysconfig import get_path, get_python_version
|
12
|
+
from sysconfig import get_path, get_platform, get_python_version
|
13
13
|
from types import CodeType
|
14
14
|
from typing import TYPE_CHECKING, Literal
|
15
15
|
|
@@ -55,12 +55,12 @@ def write_stub(resource, pyfile) -> None:
|
|
55
55
|
"""
|
56
56
|
def __bootstrap__():
|
57
57
|
global __bootstrap__, __loader__, __file__
|
58
|
-
import sys,
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
58
|
+
import sys, importlib.resources as irs, importlib.util
|
59
|
+
with irs.as_file(irs.files(__name__).joinpath(%r)) as __file__:
|
60
|
+
__loader__ = None; del __bootstrap__, __loader__
|
61
|
+
spec = importlib.util.spec_from_file_location(__name__,__file__)
|
62
|
+
mod = importlib.util.module_from_spec(spec)
|
63
|
+
spec.loader.exec_module(mod)
|
64
64
|
__bootstrap__()
|
65
65
|
"""
|
66
66
|
).lstrip()
|
@@ -77,7 +77,7 @@ class bdist_egg(Command):
|
|
77
77
|
'plat-name=',
|
78
78
|
'p',
|
79
79
|
"platform name to embed in generated filenames "
|
80
|
-
"(by default uses `
|
80
|
+
"(by default uses `sysconfig.get_platform()`)",
|
81
81
|
),
|
82
82
|
('exclude-source-files', None, "remove all .py files from the generated egg"),
|
83
83
|
(
|
@@ -110,9 +110,7 @@ class bdist_egg(Command):
|
|
110
110
|
self.bdist_dir = os.path.join(bdist_base, 'egg')
|
111
111
|
|
112
112
|
if self.plat_name is None:
|
113
|
-
|
114
|
-
|
115
|
-
self.plat_name = get_build_platform()
|
113
|
+
self.plat_name = get_platform()
|
116
114
|
|
117
115
|
self.set_undefined_options('bdist', ('dist_dir', 'dist_dir'))
|
118
116
|
|
@@ -285,7 +285,7 @@ class bdist_wheel(Command):
|
|
285
285
|
raise ValueError(
|
286
286
|
f"`py_limited_api={self.py_limited_api!r}` not supported. "
|
287
287
|
"`Py_LIMITED_API` is currently incompatible with "
|
288
|
-
"`Py_GIL_DISABLED`."
|
288
|
+
"`Py_GIL_DISABLED`. "
|
289
289
|
"See https://github.com/python/cpython/issues/111506."
|
290
290
|
)
|
291
291
|
|