claude-all-hands 1.0.0 → 1.0.1
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.
- package/.claude/agents/curator.md +185 -51
- package/.claude/agents/explorer.md +28 -36
- package/.claude/agents/parallel-worker.md +24 -7
- package/.claude/agents/planner.md +48 -3
- package/.claude/agents/researcher.md +24 -14
- package/.claude/commands/curation-fix.md +27 -3
- package/.claude/commands/new-branch.md +25 -0
- package/.claude/commands/parallel-discovery.md +26 -8
- package/.claude/commands/parallel-orchestration.md +26 -8
- package/.claude/commands/plan-checkpoint.md +25 -0
- package/.claude/commands/plan.md +52 -1
- package/.claude/commands/whats-next.md +147 -0
- package/.claude/skills/claude-code-patterns/SKILL.md +24 -11
- package/.claude/skills/claude-envoy-curation/SKILL.md +81 -18
- package/.claude/skills/claude-envoy-usage/SKILL.md +22 -14
- package/.claude/skills/command-development/SKILL.md +44 -54
- package/.claude/skills/git-ops/SKILL.md +48 -18
- package/.claude/skills/hook-development/SKILL.md +36 -12
- package/.claude/skills/orchestration-idols/SKILL.md +45 -27
- package/.claude/skills/repomix-extraction/SKILL.md +41 -39
- package/.claude/skills/research-tools/SKILL.md +60 -82
- package/.claude/skills/skill-development/SKILL.md +48 -116
- package/.claude/skills/specialist-builder/SKILL.md +81 -102
- package/.claude/skills/specialist-builder/examples/complete-agent-examples.md +4 -4
- package/bin/cli.js +22 -37
- package/package.json +5 -1
- package/.claude/envoy/.venv/.requirements.txt +0 -2
- package/.claude/envoy/.venv/bin/Activate.ps1 +0 -241
- package/.claude/envoy/.venv/bin/activate +0 -66
- package/.claude/envoy/.venv/bin/activate.csh +0 -25
- package/.claude/envoy/.venv/bin/activate.fish +0 -64
- package/.claude/envoy/.venv/bin/httpx +0 -8
- package/.claude/envoy/.venv/bin/normalizer +0 -8
- package/.claude/envoy/.venv/bin/pip +0 -8
- package/.claude/envoy/.venv/bin/pip3 +0 -8
- package/.claude/envoy/.venv/bin/pip3.9 +0 -8
- package/.claude/envoy/.venv/bin/pyrsa-decrypt +0 -8
- package/.claude/envoy/.venv/bin/pyrsa-encrypt +0 -8
- package/.claude/envoy/.venv/bin/pyrsa-keygen +0 -8
- package/.claude/envoy/.venv/bin/pyrsa-priv2pub +0 -8
- package/.claude/envoy/.venv/bin/pyrsa-sign +0 -8
- package/.claude/envoy/.venv/bin/pyrsa-verify +0 -8
- package/.claude/envoy/.venv/bin/websockets +0 -8
- package/.claude/envoy/.venv/lib/python3.9/site-packages/_distutils_hack/__init__.py +0 -128
- package/.claude/envoy/.venv/lib/python3.9/site-packages/_distutils_hack/override.py +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/annotated_types/__init__.py +0 -432
- package/.claude/envoy/.venv/lib/python3.9/site-packages/annotated_types/py.typed +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/annotated_types/test_cases.py +0 -151
- package/.claude/envoy/.venv/lib/python3.9/site-packages/annotated_types-0.7.0.dist-info/INSTALLER +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/annotated_types-0.7.0.dist-info/METADATA +0 -295
- package/.claude/envoy/.venv/lib/python3.9/site-packages/annotated_types-0.7.0.dist-info/RECORD +0 -10
- package/.claude/envoy/.venv/lib/python3.9/site-packages/annotated_types-0.7.0.dist-info/WHEEL +0 -4
- package/.claude/envoy/.venv/lib/python3.9/site-packages/annotated_types-0.7.0.dist-info/licenses/LICENSE +0 -21
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/__init__.py +0 -111
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/_backends/__init__.py +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/_backends/_asyncio.py +0 -3007
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/_backends/_trio.py +0 -1384
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/_core/__init__.py +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/_core/_asyncio_selector_thread.py +0 -167
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/_core/_contextmanagers.py +0 -200
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/_core/_eventloop.py +0 -229
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/_core/_exceptions.py +0 -153
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/_core/_fileio.py +0 -797
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/_core/_resources.py +0 -18
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/_core/_signals.py +0 -27
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/_core/_sockets.py +0 -991
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/_core/_streams.py +0 -52
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/_core/_subprocesses.py +0 -202
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/_core/_synchronization.py +0 -753
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/_core/_tasks.py +0 -163
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/_core/_tempfile.py +0 -616
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/_core/_testing.py +0 -78
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/_core/_typedattr.py +0 -81
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/abc/__init__.py +0 -58
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/abc/_eventloop.py +0 -420
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/abc/_resources.py +0 -33
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/abc/_sockets.py +0 -405
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/abc/_streams.py +0 -239
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/abc/_subprocesses.py +0 -79
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/abc/_tasks.py +0 -117
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/abc/_testing.py +0 -65
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/from_thread.py +0 -570
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/functools.py +0 -347
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/lowlevel.py +0 -195
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/py.typed +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/pytest_plugin.py +0 -302
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/streams/__init__.py +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/streams/buffered.py +0 -188
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/streams/file.py +0 -154
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/streams/memory.py +0 -325
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/streams/stapled.py +0 -147
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/streams/text.py +0 -176
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/streams/tls.py +0 -424
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/to_interpreter.py +0 -246
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/to_process.py +0 -264
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio/to_thread.py +0 -74
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio-4.12.0.dist-info/INSTALLER +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio-4.12.0.dist-info/METADATA +0 -96
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio-4.12.0.dist-info/RECORD +0 -92
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio-4.12.0.dist-info/WHEEL +0 -5
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio-4.12.0.dist-info/entry_points.txt +0 -2
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio-4.12.0.dist-info/licenses/LICENSE +0 -20
- package/.claude/envoy/.venv/lib/python3.9/site-packages/anyio-4.12.0.dist-info/top_level.txt +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/cachetools/__init__.py +0 -718
- package/.claude/envoy/.venv/lib/python3.9/site-packages/cachetools/_cached.py +0 -247
- package/.claude/envoy/.venv/lib/python3.9/site-packages/cachetools/_cachedmethod.py +0 -128
- package/.claude/envoy/.venv/lib/python3.9/site-packages/cachetools/func.py +0 -102
- package/.claude/envoy/.venv/lib/python3.9/site-packages/cachetools/keys.py +0 -62
- package/.claude/envoy/.venv/lib/python3.9/site-packages/cachetools-6.2.2.dist-info/INSTALLER +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/cachetools-6.2.2.dist-info/METADATA +0 -156
- package/.claude/envoy/.venv/lib/python3.9/site-packages/cachetools-6.2.2.dist-info/RECORD +0 -16
- package/.claude/envoy/.venv/lib/python3.9/site-packages/cachetools-6.2.2.dist-info/WHEEL +0 -5
- package/.claude/envoy/.venv/lib/python3.9/site-packages/cachetools-6.2.2.dist-info/licenses/LICENSE +0 -20
- package/.claude/envoy/.venv/lib/python3.9/site-packages/cachetools-6.2.2.dist-info/top_level.txt +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/certifi/__init__.py +0 -4
- package/.claude/envoy/.venv/lib/python3.9/site-packages/certifi/__main__.py +0 -12
- package/.claude/envoy/.venv/lib/python3.9/site-packages/certifi/cacert.pem +0 -4678
- package/.claude/envoy/.venv/lib/python3.9/site-packages/certifi/core.py +0 -83
- package/.claude/envoy/.venv/lib/python3.9/site-packages/certifi/py.typed +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/certifi-2025.11.12.dist-info/INSTALLER +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/certifi-2025.11.12.dist-info/METADATA +0 -78
- package/.claude/envoy/.venv/lib/python3.9/site-packages/certifi-2025.11.12.dist-info/RECORD +0 -14
- package/.claude/envoy/.venv/lib/python3.9/site-packages/certifi-2025.11.12.dist-info/WHEEL +0 -5
- package/.claude/envoy/.venv/lib/python3.9/site-packages/certifi-2025.11.12.dist-info/licenses/LICENSE +0 -20
- package/.claude/envoy/.venv/lib/python3.9/site-packages/certifi-2025.11.12.dist-info/top_level.txt +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/charset_normalizer/__init__.py +0 -48
- package/.claude/envoy/.venv/lib/python3.9/site-packages/charset_normalizer/__main__.py +0 -6
- package/.claude/envoy/.venv/lib/python3.9/site-packages/charset_normalizer/api.py +0 -669
- package/.claude/envoy/.venv/lib/python3.9/site-packages/charset_normalizer/cd.py +0 -395
- package/.claude/envoy/.venv/lib/python3.9/site-packages/charset_normalizer/cli/__init__.py +0 -8
- package/.claude/envoy/.venv/lib/python3.9/site-packages/charset_normalizer/cli/__main__.py +0 -381
- package/.claude/envoy/.venv/lib/python3.9/site-packages/charset_normalizer/constant.py +0 -2015
- package/.claude/envoy/.venv/lib/python3.9/site-packages/charset_normalizer/legacy.py +0 -80
- package/.claude/envoy/.venv/lib/python3.9/site-packages/charset_normalizer/md.cpython-39-darwin.so +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/charset_normalizer/md.py +0 -635
- package/.claude/envoy/.venv/lib/python3.9/site-packages/charset_normalizer/md__mypyc.cpython-39-darwin.so +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/charset_normalizer/models.py +0 -360
- package/.claude/envoy/.venv/lib/python3.9/site-packages/charset_normalizer/py.typed +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/charset_normalizer/utils.py +0 -414
- package/.claude/envoy/.venv/lib/python3.9/site-packages/charset_normalizer/version.py +0 -8
- package/.claude/envoy/.venv/lib/python3.9/site-packages/charset_normalizer-3.4.4.dist-info/INSTALLER +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/charset_normalizer-3.4.4.dist-info/METADATA +0 -764
- package/.claude/envoy/.venv/lib/python3.9/site-packages/charset_normalizer-3.4.4.dist-info/RECORD +0 -35
- package/.claude/envoy/.venv/lib/python3.9/site-packages/charset_normalizer-3.4.4.dist-info/WHEEL +0 -6
- package/.claude/envoy/.venv/lib/python3.9/site-packages/charset_normalizer-3.4.4.dist-info/entry_points.txt +0 -2
- package/.claude/envoy/.venv/lib/python3.9/site-packages/charset_normalizer-3.4.4.dist-info/licenses/LICENSE +0 -21
- package/.claude/envoy/.venv/lib/python3.9/site-packages/charset_normalizer-3.4.4.dist-info/top_level.txt +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/distutils-precedence.pth +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/exceptiongroup/__init__.py +0 -46
- package/.claude/envoy/.venv/lib/python3.9/site-packages/exceptiongroup/_catch.py +0 -138
- package/.claude/envoy/.venv/lib/python3.9/site-packages/exceptiongroup/_exceptions.py +0 -336
- package/.claude/envoy/.venv/lib/python3.9/site-packages/exceptiongroup/_formatting.py +0 -602
- package/.claude/envoy/.venv/lib/python3.9/site-packages/exceptiongroup/_suppress.py +0 -55
- package/.claude/envoy/.venv/lib/python3.9/site-packages/exceptiongroup/_version.py +0 -34
- package/.claude/envoy/.venv/lib/python3.9/site-packages/exceptiongroup/py.typed +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/exceptiongroup-1.3.1.dist-info/INSTALLER +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/exceptiongroup-1.3.1.dist-info/METADATA +0 -159
- package/.claude/envoy/.venv/lib/python3.9/site-packages/exceptiongroup-1.3.1.dist-info/RECORD +0 -18
- package/.claude/envoy/.venv/lib/python3.9/site-packages/exceptiongroup-1.3.1.dist-info/WHEEL +0 -4
- package/.claude/envoy/.venv/lib/python3.9/site-packages/exceptiongroup-1.3.1.dist-info/licenses/LICENSE +0 -73
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/__init__.py +0 -53
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/_cloud_sdk.py +0 -153
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/_constants.py +0 -5
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/_credentials_async.py +0 -171
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/_credentials_base.py +0 -75
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/_default.py +0 -739
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/_default_async.py +0 -288
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/_exponential_backoff.py +0 -164
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/_helpers.py +0 -554
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/_jwt_async.py +0 -164
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/_oauth2client.py +0 -167
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/_refresh_worker.py +0 -109
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/_service_account_info.py +0 -80
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/aio/__init__.py +0 -25
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/aio/_helpers.py +0 -62
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/aio/credentials.py +0 -143
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/aio/transport/__init__.py +0 -144
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/aio/transport/aiohttp.py +0 -190
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/aio/transport/sessions.py +0 -268
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/api_key.py +0 -76
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/app_engine.py +0 -180
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/aws.py +0 -861
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/compute_engine/__init__.py +0 -22
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/compute_engine/_metadata.py +0 -379
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/compute_engine/credentials.py +0 -558
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/credentials.py +0 -665
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/crypt/__init__.py +0 -98
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/crypt/_cryptography_rsa.py +0 -151
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/crypt/_helpers.py +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/crypt/_python_rsa.py +0 -175
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/crypt/base.py +0 -127
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/crypt/es256.py +0 -175
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/crypt/rsa.py +0 -30
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/downscoped.py +0 -512
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/environment_vars.py +0 -88
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/exceptions.py +0 -108
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/external_account.py +0 -708
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/external_account_authorized_user.py +0 -433
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/iam.py +0 -136
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/identity_pool.py +0 -552
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/impersonated_credentials.py +0 -705
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/jwt.py +0 -878
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/metrics.py +0 -154
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/pluggable.py +0 -453
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/py.typed +0 -2
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/transport/__init__.py +0 -104
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/transport/_aiohttp_requests.py +0 -398
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/transport/_custom_tls_signer.py +0 -283
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/transport/_http_client.py +0 -115
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/transport/_mtls_helper.py +0 -446
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/transport/_requests_base.py +0 -53
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/transport/grpc.py +0 -337
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/transport/mtls.py +0 -129
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/transport/requests.py +0 -597
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/transport/urllib3.py +0 -449
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/auth/version.py +0 -15
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/genai/__init__.py +0 -25
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/genai/_adapters.py +0 -55
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/genai/_api_client.py +0 -1840
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/genai/_api_module.py +0 -29
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/genai/_automatic_function_calling_util.py +0 -325
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/genai/_base_transformers.py +0 -26
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/genai/_base_url.py +0 -50
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/genai/_common.py +0 -778
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/genai/_extra_utils.py +0 -618
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/genai/_live_converters.py +0 -1424
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/genai/_local_tokenizer_loader.py +0 -223
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/genai/_mcp_utils.py +0 -117
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/genai/_operations_converters.py +0 -298
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/genai/_replay_api_client.py +0 -686
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/genai/_test_api_client.py +0 -149
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/genai/_tokens_converters.py +0 -480
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/genai/_transformers.py +0 -1368
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/genai/batches.py +0 -2461
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/genai/caches.py +0 -1489
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/genai/chats.py +0 -531
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/genai/client.py +0 -403
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/genai/errors.py +0 -202
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/genai/files.py +0 -1019
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/genai/live.py +0 -1165
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/genai/live_music.py +0 -197
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/genai/local_tokenizer.py +0 -395
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/genai/models.py +0 -7335
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/genai/operations.py +0 -498
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/genai/pagers.py +0 -262
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/genai/py.typed +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/genai/tokens.py +0 -362
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/genai/tunings.py +0 -1970
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/genai/types.py +0 -16507
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/genai/version.py +0 -16
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/oauth2/__init__.py +0 -36
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/oauth2/_client.py +0 -625
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/oauth2/_client_async.py +0 -286
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/oauth2/_credentials_async.py +0 -118
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/oauth2/_id_token_async.py +0 -285
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/oauth2/_reauth_async.py +0 -328
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/oauth2/_service_account_async.py +0 -132
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/oauth2/challenges.py +0 -281
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/oauth2/credentials.py +0 -614
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/oauth2/gdch_credentials.py +0 -251
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/oauth2/id_token.py +0 -370
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/oauth2/py.typed +0 -2
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/oauth2/reauth.py +0 -369
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/oauth2/service_account.py +0 -881
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/oauth2/sts.py +0 -176
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/oauth2/utils.py +0 -168
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/oauth2/webauthn_handler.py +0 -82
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/oauth2/webauthn_handler_factory.py +0 -16
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google/oauth2/webauthn_types.py +0 -156
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google_auth-2.43.0.dist-info/INSTALLER +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google_auth-2.43.0.dist-info/METADATA +0 -181
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google_auth-2.43.0.dist-info/RECORD +0 -154
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google_auth-2.43.0.dist-info/WHEEL +0 -6
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google_auth-2.43.0.dist-info/licenses/LICENSE +0 -201
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google_auth-2.43.0.dist-info/top_level.txt +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google_genai-1.47.0.dist-info/INSTALLER +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google_genai-1.47.0.dist-info/METADATA +0 -1864
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google_genai-1.47.0.dist-info/RECORD +0 -74
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google_genai-1.47.0.dist-info/REQUESTED +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google_genai-1.47.0.dist-info/WHEEL +0 -5
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google_genai-1.47.0.dist-info/licenses/LICENSE +0 -202
- package/.claude/envoy/.venv/lib/python3.9/site-packages/google_genai-1.47.0.dist-info/top_level.txt +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/h11/__init__.py +0 -62
- package/.claude/envoy/.venv/lib/python3.9/site-packages/h11/_abnf.py +0 -132
- package/.claude/envoy/.venv/lib/python3.9/site-packages/h11/_connection.py +0 -659
- package/.claude/envoy/.venv/lib/python3.9/site-packages/h11/_events.py +0 -369
- package/.claude/envoy/.venv/lib/python3.9/site-packages/h11/_headers.py +0 -282
- package/.claude/envoy/.venv/lib/python3.9/site-packages/h11/_readers.py +0 -250
- package/.claude/envoy/.venv/lib/python3.9/site-packages/h11/_receivebuffer.py +0 -153
- package/.claude/envoy/.venv/lib/python3.9/site-packages/h11/_state.py +0 -365
- package/.claude/envoy/.venv/lib/python3.9/site-packages/h11/_util.py +0 -135
- package/.claude/envoy/.venv/lib/python3.9/site-packages/h11/_version.py +0 -16
- package/.claude/envoy/.venv/lib/python3.9/site-packages/h11/_writers.py +0 -145
- package/.claude/envoy/.venv/lib/python3.9/site-packages/h11/py.typed +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/h11-0.16.0.dist-info/INSTALLER +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/h11-0.16.0.dist-info/METADATA +0 -202
- package/.claude/envoy/.venv/lib/python3.9/site-packages/h11-0.16.0.dist-info/RECORD +0 -29
- package/.claude/envoy/.venv/lib/python3.9/site-packages/h11-0.16.0.dist-info/WHEEL +0 -5
- package/.claude/envoy/.venv/lib/python3.9/site-packages/h11-0.16.0.dist-info/licenses/LICENSE.txt +0 -22
- package/.claude/envoy/.venv/lib/python3.9/site-packages/h11-0.16.0.dist-info/top_level.txt +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpcore/__init__.py +0 -141
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpcore/_api.py +0 -94
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpcore/_async/__init__.py +0 -39
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpcore/_async/connection.py +0 -222
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpcore/_async/connection_pool.py +0 -420
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpcore/_async/http11.py +0 -379
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpcore/_async/http2.py +0 -592
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpcore/_async/http_proxy.py +0 -367
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpcore/_async/interfaces.py +0 -137
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpcore/_async/socks_proxy.py +0 -341
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpcore/_backends/__init__.py +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpcore/_backends/anyio.py +0 -146
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpcore/_backends/auto.py +0 -52
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpcore/_backends/base.py +0 -101
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpcore/_backends/mock.py +0 -143
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpcore/_backends/sync.py +0 -241
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpcore/_backends/trio.py +0 -159
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpcore/_exceptions.py +0 -81
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpcore/_models.py +0 -516
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpcore/_ssl.py +0 -9
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpcore/_sync/__init__.py +0 -39
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpcore/_sync/connection.py +0 -222
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpcore/_sync/connection_pool.py +0 -420
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpcore/_sync/http11.py +0 -379
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpcore/_sync/http2.py +0 -592
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpcore/_sync/http_proxy.py +0 -367
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpcore/_sync/interfaces.py +0 -137
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpcore/_sync/socks_proxy.py +0 -341
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpcore/_synchronization.py +0 -318
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpcore/_trace.py +0 -107
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpcore/_utils.py +0 -37
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpcore/py.typed +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpcore-1.0.9.dist-info/INSTALLER +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpcore-1.0.9.dist-info/METADATA +0 -625
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpcore-1.0.9.dist-info/RECORD +0 -68
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpcore-1.0.9.dist-info/WHEEL +0 -4
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpcore-1.0.9.dist-info/licenses/LICENSE.md +0 -27
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpx/__init__.py +0 -105
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpx/__version__.py +0 -3
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpx/_api.py +0 -438
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpx/_auth.py +0 -348
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpx/_client.py +0 -2019
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpx/_config.py +0 -248
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpx/_content.py +0 -240
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpx/_decoders.py +0 -393
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpx/_exceptions.py +0 -379
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpx/_main.py +0 -506
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpx/_models.py +0 -1277
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpx/_multipart.py +0 -300
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpx/_status_codes.py +0 -162
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpx/_transports/__init__.py +0 -15
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpx/_transports/asgi.py +0 -187
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpx/_transports/base.py +0 -86
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpx/_transports/default.py +0 -406
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpx/_transports/mock.py +0 -43
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpx/_transports/wsgi.py +0 -149
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpx/_types.py +0 -114
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpx/_urlparse.py +0 -527
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpx/_urls.py +0 -641
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpx/_utils.py +0 -242
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpx/py.typed +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpx-0.28.1.dist-info/INSTALLER +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpx-0.28.1.dist-info/METADATA +0 -203
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpx-0.28.1.dist-info/RECORD +0 -54
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpx-0.28.1.dist-info/WHEEL +0 -4
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpx-0.28.1.dist-info/entry_points.txt +0 -2
- package/.claude/envoy/.venv/lib/python3.9/site-packages/httpx-0.28.1.dist-info/licenses/LICENSE.md +0 -12
- package/.claude/envoy/.venv/lib/python3.9/site-packages/idna/__init__.py +0 -45
- package/.claude/envoy/.venv/lib/python3.9/site-packages/idna/codec.py +0 -122
- package/.claude/envoy/.venv/lib/python3.9/site-packages/idna/compat.py +0 -15
- package/.claude/envoy/.venv/lib/python3.9/site-packages/idna/core.py +0 -437
- package/.claude/envoy/.venv/lib/python3.9/site-packages/idna/idnadata.py +0 -4309
- package/.claude/envoy/.venv/lib/python3.9/site-packages/idna/intranges.py +0 -57
- package/.claude/envoy/.venv/lib/python3.9/site-packages/idna/package_data.py +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/idna/py.typed +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/idna/uts46data.py +0 -8841
- package/.claude/envoy/.venv/lib/python3.9/site-packages/idna-3.11.dist-info/INSTALLER +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/idna-3.11.dist-info/METADATA +0 -209
- package/.claude/envoy/.venv/lib/python3.9/site-packages/idna-3.11.dist-info/RECORD +0 -22
- package/.claude/envoy/.venv/lib/python3.9/site-packages/idna-3.11.dist-info/WHEEL +0 -4
- package/.claude/envoy/.venv/lib/python3.9/site-packages/idna-3.11.dist-info/licenses/LICENSE.md +0 -31
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/__init__.py +0 -13
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/__main__.py +0 -31
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/__init__.py +0 -19
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/build_env.py +0 -294
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/cache.py +0 -287
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/cli/__init__.py +0 -4
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/cli/autocompletion.py +0 -163
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/cli/base_command.py +0 -214
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/cli/cmdoptions.py +0 -1009
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/cli/command_context.py +0 -27
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/cli/main.py +0 -70
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/cli/main_parser.py +0 -87
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/cli/parser.py +0 -292
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/cli/progress_bars.py +0 -250
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/cli/req_command.py +0 -453
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/cli/spinners.py +0 -157
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/cli/status_codes.py +0 -6
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/commands/__init__.py +0 -112
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/commands/cache.py +0 -216
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/commands/check.py +0 -47
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/commands/completion.py +0 -91
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/commands/configuration.py +0 -266
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/commands/debug.py +0 -204
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/commands/download.py +0 -139
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/commands/freeze.py +0 -84
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/commands/hash.py +0 -55
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/commands/help.py +0 -41
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/commands/index.py +0 -139
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/commands/install.py +0 -750
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/commands/list.py +0 -337
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/commands/search.py +0 -164
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/commands/show.py +0 -234
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/commands/uninstall.py +0 -100
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/commands/wheel.py +0 -176
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/configuration.py +0 -403
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/distributions/__init__.py +0 -21
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/distributions/base.py +0 -38
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/distributions/installed.py +0 -22
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/distributions/sdist.py +0 -95
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/distributions/wheel.py +0 -34
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/exceptions.py +0 -397
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/index/__init__.py +0 -2
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/index/collector.py +0 -534
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/index/package_finder.py +0 -982
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/index/sources.py +0 -224
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/locations/__init__.py +0 -408
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/locations/_distutils.py +0 -169
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/locations/_sysconfig.py +0 -219
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/locations/base.py +0 -52
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/main.py +0 -13
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/metadata/__init__.py +0 -48
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/metadata/base.py +0 -242
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/metadata/pkg_resources.py +0 -153
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/models/__init__.py +0 -2
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/models/candidate.py +0 -31
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/models/direct_url.py +0 -220
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/models/format_control.py +0 -84
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/models/index.py +0 -32
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/models/link.py +0 -288
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/models/scheme.py +0 -31
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/models/search_scope.py +0 -126
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/models/selection_prefs.py +0 -46
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/models/target_python.py +0 -111
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/models/wheel.py +0 -92
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/network/__init__.py +0 -2
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/network/auth.py +0 -316
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/network/cache.py +0 -69
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/network/download.py +0 -184
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/network/lazy_wheel.py +0 -210
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/network/session.py +0 -454
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/network/utils.py +0 -96
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/network/xmlrpc.py +0 -60
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/operations/__init__.py +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/operations/build/__init__.py +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/operations/build/metadata.py +0 -35
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/operations/build/metadata_legacy.py +0 -74
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/operations/build/wheel.py +0 -38
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/operations/build/wheel_legacy.py +0 -110
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/operations/check.py +0 -153
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/operations/freeze.py +0 -277
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/operations/install/__init__.py +0 -2
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/operations/install/editable_legacy.py +0 -47
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/operations/install/legacy.py +0 -132
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/operations/install/wheel.py +0 -803
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/operations/prepare.py +0 -655
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/pyproject.py +0 -183
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/req/__init__.py +0 -94
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/req/constructors.py +0 -474
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/req/req_file.py +0 -528
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/req/req_install.py +0 -846
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/req/req_set.py +0 -190
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/req/req_tracker.py +0 -130
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/req/req_uninstall.py +0 -629
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/resolution/__init__.py +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/resolution/base.py +0 -18
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/resolution/legacy/__init__.py +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/resolution/legacy/resolver.py +0 -453
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/resolution/resolvelib/__init__.py +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/resolution/resolvelib/base.py +0 -144
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/resolution/resolvelib/candidates.py +0 -555
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/resolution/resolvelib/factory.py +0 -700
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py +0 -142
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/resolution/resolvelib/provider.py +0 -197
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/resolution/resolvelib/reporter.py +0 -69
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/resolution/resolvelib/requirements.py +0 -166
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/resolution/resolvelib/resolver.py +0 -272
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/self_outdated_check.py +0 -187
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/utils/__init__.py +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/utils/_log.py +0 -38
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/utils/appdirs.py +0 -35
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/utils/compat.py +0 -63
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/utils/compatibility_tags.py +0 -168
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/utils/datetime.py +0 -11
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/utils/deprecation.py +0 -104
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/utils/direct_url_helpers.py +0 -79
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/utils/distutils_args.py +0 -42
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/utils/encoding.py +0 -36
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/utils/entrypoints.py +0 -27
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/utils/filesystem.py +0 -182
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/utils/filetypes.py +0 -28
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/utils/glibc.py +0 -92
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/utils/hashes.py +0 -165
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/utils/inject_securetransport.py +0 -36
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/utils/logging.py +0 -391
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/utils/misc.py +0 -828
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/utils/models.py +0 -47
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/utils/packaging.py +0 -89
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/utils/parallel.py +0 -101
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/utils/pkg_resources.py +0 -40
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/utils/setuptools_build.py +0 -173
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/utils/subprocess.py +0 -281
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/utils/temp_dir.py +0 -260
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/utils/unpacking.py +0 -267
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/utils/urls.py +0 -65
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/utils/virtualenv.py +0 -111
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/utils/wheel.py +0 -189
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/vcs/__init__.py +0 -15
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/vcs/bazaar.py +0 -96
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/vcs/git.py +0 -506
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/vcs/mercurial.py +0 -158
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/vcs/subversion.py +0 -329
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/vcs/versioncontrol.py +0 -722
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_internal/wheel_builder.py +0 -360
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/__init__.py +0 -111
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/appdirs.py +0 -633
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/cachecontrol/__init__.py +0 -11
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/cachecontrol/_cmd.py +0 -57
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/cachecontrol/adapter.py +0 -133
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/cachecontrol/cache.py +0 -39
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/cachecontrol/caches/__init__.py +0 -2
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py +0 -146
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py +0 -33
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/cachecontrol/compat.py +0 -29
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/cachecontrol/controller.py +0 -376
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/cachecontrol/filewrapper.py +0 -80
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/cachecontrol/heuristics.py +0 -135
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/cachecontrol/serialize.py +0 -188
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/cachecontrol/wrapper.py +0 -29
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/certifi/__init__.py +0 -3
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/certifi/__main__.py +0 -12
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/certifi/cacert.pem +0 -4257
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/certifi/core.py +0 -76
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/__init__.py +0 -83
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/big5freq.py +0 -386
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/big5prober.py +0 -47
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/chardistribution.py +0 -233
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/charsetgroupprober.py +0 -107
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/charsetprober.py +0 -145
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/cli/__init__.py +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/cli/chardetect.py +0 -84
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/codingstatemachine.py +0 -88
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/compat.py +0 -36
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/cp949prober.py +0 -49
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/enums.py +0 -76
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/escprober.py +0 -101
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/escsm.py +0 -246
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/eucjpprober.py +0 -92
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/euckrfreq.py +0 -195
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/euckrprober.py +0 -47
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/euctwfreq.py +0 -387
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/euctwprober.py +0 -46
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/gb2312freq.py +0 -283
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/gb2312prober.py +0 -46
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/hebrewprober.py +0 -292
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/jisfreq.py +0 -325
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/jpcntx.py +0 -233
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/langbulgarianmodel.py +0 -4650
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/langgreekmodel.py +0 -4398
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/langhebrewmodel.py +0 -4383
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/langhungarianmodel.py +0 -4650
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/langrussianmodel.py +0 -5718
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/langthaimodel.py +0 -4383
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/langturkishmodel.py +0 -4383
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/latin1prober.py +0 -145
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/mbcharsetprober.py +0 -91
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/mbcsgroupprober.py +0 -54
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/mbcssm.py +0 -572
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/metadata/__init__.py +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/metadata/languages.py +0 -310
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/sbcharsetprober.py +0 -145
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/sbcsgroupprober.py +0 -83
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/sjisprober.py +0 -92
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/universaldetector.py +0 -286
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/utf8prober.py +0 -82
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/chardet/version.py +0 -9
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/colorama/__init__.py +0 -6
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/colorama/ansi.py +0 -102
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/colorama/ansitowin32.py +0 -258
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/colorama/initialise.py +0 -80
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/colorama/win32.py +0 -152
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/colorama/winterm.py +0 -169
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/__init__.py +0 -23
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/_backport/__init__.py +0 -6
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/_backport/misc.py +0 -41
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/_backport/shutil.py +0 -764
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg +0 -84
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/_backport/sysconfig.py +0 -786
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/_backport/tarfile.py +0 -2607
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/compat.py +0 -1120
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/database.py +0 -1339
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/index.py +0 -509
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/locators.py +0 -1300
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/manifest.py +0 -393
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/markers.py +0 -130
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/metadata.py +0 -1058
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/resources.py +0 -358
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/scripts.py +0 -423
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/t32.exe +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/t64.exe +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/util.py +0 -1965
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/version.py +0 -739
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/w32.exe +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/w64.exe +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/distlib/wheel.py +0 -1056
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/distro.py +0 -1230
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/__init__.py +0 -35
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/_ihatexml.py +0 -289
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/_inputstream.py +0 -918
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/_tokenizer.py +0 -1735
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/_trie/__init__.py +0 -5
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/_trie/_base.py +0 -40
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/_trie/py.py +0 -67
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/_utils.py +0 -159
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/constants.py +0 -2946
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/filters/__init__.py +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py +0 -29
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/filters/base.py +0 -12
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py +0 -73
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/filters/lint.py +0 -93
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/filters/optionaltags.py +0 -207
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/filters/sanitizer.py +0 -916
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/filters/whitespace.py +0 -38
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/html5parser.py +0 -2795
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/serializer.py +0 -409
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py +0 -30
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py +0 -54
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/treeadapters/sax.py +0 -50
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py +0 -88
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/treebuilders/base.py +0 -417
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/treebuilders/dom.py +0 -239
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/treebuilders/etree.py +0 -343
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py +0 -392
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py +0 -154
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/treewalkers/base.py +0 -252
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/treewalkers/dom.py +0 -43
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/treewalkers/etree.py +0 -131
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py +0 -215
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py +0 -69
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/idna/__init__.py +0 -44
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/idna/codec.py +0 -117
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/idna/compat.py +0 -16
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/idna/core.py +0 -409
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/idna/idnadata.py +0 -2050
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/idna/intranges.py +0 -58
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/idna/package_data.py +0 -2
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/idna/uts46data.py +0 -8438
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/msgpack/__init__.py +0 -54
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/msgpack/_version.py +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/msgpack/exceptions.py +0 -48
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/msgpack/ext.py +0 -193
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/msgpack/fallback.py +0 -1087
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/packaging/__about__.py +0 -26
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/packaging/__init__.py +0 -25
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/packaging/_manylinux.py +0 -301
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/packaging/_musllinux.py +0 -136
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/packaging/_structures.py +0 -67
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/packaging/markers.py +0 -304
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/packaging/requirements.py +0 -146
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/packaging/specifiers.py +0 -828
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/packaging/tags.py +0 -484
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/packaging/utils.py +0 -136
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/packaging/version.py +0 -504
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/pep517/__init__.py +0 -6
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/pep517/build.py +0 -127
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/pep517/check.py +0 -207
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/pep517/colorlog.py +0 -115
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/pep517/compat.py +0 -42
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/pep517/dirtools.py +0 -44
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/pep517/envbuild.py +0 -171
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/pep517/in_process/__init__.py +0 -17
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/pep517/in_process/_in_process.py +0 -349
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/pep517/meta.py +0 -92
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/pep517/wrappers.py +0 -371
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/pkg_resources/__init__.py +0 -3296
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/pkg_resources/py31compat.py +0 -23
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/progress/__init__.py +0 -177
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/progress/bar.py +0 -91
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/progress/counter.py +0 -41
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/progress/spinner.py +0 -43
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/pyparsing.py +0 -7107
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/requests/__init__.py +0 -154
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/requests/__version__.py +0 -14
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/requests/_internal_utils.py +0 -42
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/requests/adapters.py +0 -533
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/requests/api.py +0 -159
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/requests/auth.py +0 -305
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/requests/certs.py +0 -18
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/requests/compat.py +0 -76
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/requests/cookies.py +0 -549
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/requests/exceptions.py +0 -127
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/requests/help.py +0 -132
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/requests/hooks.py +0 -34
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/requests/models.py +0 -966
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/requests/packages.py +0 -16
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/requests/sessions.py +0 -781
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/requests/status_codes.py +0 -123
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/requests/structures.py +0 -105
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/requests/utils.py +0 -1013
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/resolvelib/__init__.py +0 -26
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/resolvelib/compat/__init__.py +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py +0 -6
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/resolvelib/providers.py +0 -124
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/resolvelib/reporters.py +0 -37
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/resolvelib/resolvers.py +0 -473
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/resolvelib/structs.py +0 -165
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/six.py +0 -998
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/tenacity/__init__.py +0 -517
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/tenacity/_asyncio.py +0 -92
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/tenacity/_utils.py +0 -68
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/tenacity/after.py +0 -46
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/tenacity/before.py +0 -41
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/tenacity/before_sleep.py +0 -58
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/tenacity/nap.py +0 -43
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/tenacity/retry.py +0 -213
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/tenacity/stop.py +0 -96
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/tenacity/tornadoweb.py +0 -59
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/tenacity/wait.py +0 -191
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/tomli/__init__.py +0 -6
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/tomli/_parser.py +0 -703
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/tomli/_re.py +0 -83
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/__init__.py +0 -85
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/_collections.py +0 -337
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/_version.py +0 -2
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/connection.py +0 -539
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/connectionpool.py +0 -1067
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/contrib/__init__.py +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py +0 -36
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py +0 -519
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py +0 -396
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/contrib/appengine.py +0 -314
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py +0 -130
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py +0 -511
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/contrib/securetransport.py +0 -922
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/contrib/socks.py +0 -216
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/exceptions.py +0 -323
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/fields.py +0 -274
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/filepost.py +0 -98
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/packages/__init__.py +0 -5
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py +0 -51
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/packages/six.py +0 -1077
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py +0 -24
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py +0 -160
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/poolmanager.py +0 -536
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/request.py +0 -170
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/response.py +0 -821
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/util/__init__.py +0 -49
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/util/connection.py +0 -150
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/util/proxy.py +0 -56
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/util/queue.py +0 -22
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/util/request.py +0 -143
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/util/response.py +0 -107
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/util/retry.py +0 -602
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/util/ssl_.py +0 -495
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/util/ssltransport.py +0 -221
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/util/timeout.py +0 -268
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/util/url.py +0 -432
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/urllib3/util/wait.py +0 -153
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/vendor.txt +0 -22
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/webencodings/__init__.py +0 -342
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/webencodings/labels.py +0 -231
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/webencodings/mklabels.py +0 -59
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/webencodings/tests.py +0 -153
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/_vendor/webencodings/x_user_defined.py +0 -325
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip/py.typed +0 -4
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip-21.2.4.dist-info/INSTALLER +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip-21.2.4.dist-info/LICENSE.txt +0 -20
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip-21.2.4.dist-info/METADATA +0 -92
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip-21.2.4.dist-info/RECORD +0 -795
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip-21.2.4.dist-info/REQUESTED +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip-21.2.4.dist-info/WHEEL +0 -5
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip-21.2.4.dist-info/entry_points.txt +0 -5
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pip-21.2.4.dist-info/top_level.txt +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pkg_resources/__init__.py +0 -3288
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pkg_resources/_vendor/__init__.py +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pkg_resources/_vendor/appdirs.py +0 -608
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pkg_resources/_vendor/packaging/__about__.py +0 -27
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pkg_resources/_vendor/packaging/__init__.py +0 -26
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pkg_resources/_vendor/packaging/_compat.py +0 -38
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pkg_resources/_vendor/packaging/_structures.py +0 -86
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pkg_resources/_vendor/packaging/_typing.py +0 -48
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pkg_resources/_vendor/packaging/markers.py +0 -328
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pkg_resources/_vendor/packaging/requirements.py +0 -145
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pkg_resources/_vendor/packaging/specifiers.py +0 -863
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pkg_resources/_vendor/packaging/tags.py +0 -751
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pkg_resources/_vendor/packaging/utils.py +0 -65
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pkg_resources/_vendor/packaging/version.py +0 -535
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pkg_resources/_vendor/pyparsing.py +0 -5742
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pkg_resources/extern/__init__.py +0 -73
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pkg_resources/tests/data/my-test-package-source/setup.py +0 -6
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1/__init__.py +0 -2
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1/codec/__init__.py +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1/codec/ber/__init__.py +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1/codec/ber/decoder.py +0 -2189
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1/codec/ber/encoder.py +0 -954
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1/codec/ber/eoo.py +0 -28
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1/codec/cer/__init__.py +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1/codec/cer/decoder.py +0 -149
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1/codec/cer/encoder.py +0 -331
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1/codec/der/__init__.py +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1/codec/der/decoder.py +0 -120
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1/codec/der/encoder.py +0 -126
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1/codec/native/__init__.py +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1/codec/native/decoder.py +0 -244
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1/codec/native/encoder.py +0 -285
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1/codec/streaming.py +0 -234
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1/compat/__init__.py +0 -4
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1/compat/integer.py +0 -13
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1/debug.py +0 -146
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1/error.py +0 -116
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1/type/__init__.py +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1/type/base.py +0 -699
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1/type/char.py +0 -288
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1/type/constraint.py +0 -751
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1/type/error.py +0 -11
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1/type/namedtype.py +0 -550
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1/type/namedval.py +0 -192
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1/type/opentype.py +0 -104
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1/type/tag.py +0 -335
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1/type/tagmap.py +0 -96
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1/type/univ.py +0 -3327
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1/type/useful.py +0 -189
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1-0.6.1.dist-info/INSTALLER +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1-0.6.1.dist-info/LICENSE.rst +0 -24
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1-0.6.1.dist-info/METADATA +0 -228
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1-0.6.1.dist-info/RECORD +0 -71
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1-0.6.1.dist-info/WHEEL +0 -5
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1-0.6.1.dist-info/top_level.txt +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1-0.6.1.dist-info/zip-safe +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/__init__.py +0 -2
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/pem.py +0 -58
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc1155.py +0 -96
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc1157.py +0 -126
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc1901.py +0 -22
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc1902.py +0 -129
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc1905.py +0 -135
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc2251.py +0 -563
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc2314.py +0 -48
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc2315.py +0 -294
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc2437.py +0 -69
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc2459.py +0 -1339
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc2511.py +0 -258
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc2560.py +0 -225
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc2631.py +0 -37
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc2634.py +0 -336
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc2876.py +0 -56
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc2985.py +0 -588
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc2986.py +0 -75
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc3058.py +0 -42
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc3114.py +0 -77
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc3125.py +0 -469
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc3161.py +0 -142
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc3274.py +0 -59
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc3279.py +0 -260
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc3280.py +0 -1543
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc3281.py +0 -331
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc3370.py +0 -146
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc3412.py +0 -53
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc3414.py +0 -28
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc3447.py +0 -45
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc3537.py +0 -34
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc3560.py +0 -74
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc3565.py +0 -57
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc3657.py +0 -66
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc3709.py +0 -207
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc3739.py +0 -203
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc3770.py +0 -75
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc3779.py +0 -137
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc3820.py +0 -65
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc3852.py +0 -706
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc4010.py +0 -58
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc4043.py +0 -43
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc4055.py +0 -258
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc4073.py +0 -59
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc4108.py +0 -350
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc4210.py +0 -803
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc4211.py +0 -396
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc4334.py +0 -75
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc4357.py +0 -477
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc4387.py +0 -23
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc4476.py +0 -93
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc4490.py +0 -113
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc4491.py +0 -44
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc4683.py +0 -72
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc4985.py +0 -49
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc5035.py +0 -199
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc5083.py +0 -52
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc5084.py +0 -97
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc5126.py +0 -577
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc5208.py +0 -56
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc5275.py +0 -404
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc5280.py +0 -1658
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc5480.py +0 -190
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc5636.py +0 -113
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc5639.py +0 -49
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc5649.py +0 -33
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc5652.py +0 -761
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc5697.py +0 -70
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc5751.py +0 -124
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc5752.py +0 -49
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc5753.py +0 -157
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc5755.py +0 -398
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc5913.py +0 -44
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc5914.py +0 -119
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc5915.py +0 -32
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc5916.py +0 -35
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc5917.py +0 -55
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc5924.py +0 -19
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc5934.py +0 -786
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc5940.py +0 -59
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc5958.py +0 -98
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc5990.py +0 -237
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc6010.py +0 -88
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc6019.py +0 -45
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc6031.py +0 -469
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc6032.py +0 -68
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc6120.py +0 -43
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc6170.py +0 -17
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc6187.py +0 -22
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc6210.py +0 -42
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc6211.py +0 -72
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc6402.py +0 -628
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc6482.py +0 -74
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc6486.py +0 -68
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc6487.py +0 -22
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc6664.py +0 -147
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc6955.py +0 -108
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc6960.py +0 -223
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc7030.py +0 -66
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc7191.py +0 -261
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc7229.py +0 -29
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc7292.py +0 -357
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc7296.py +0 -32
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc7508.py +0 -90
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc7585.py +0 -50
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc7633.py +0 -38
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc7773.py +0 -52
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc7894.py +0 -92
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc7906.py +0 -736
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc7914.py +0 -49
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc8017.py +0 -153
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc8018.py +0 -260
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc8103.py +0 -36
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc8209.py +0 -20
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc8226.py +0 -149
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc8358.py +0 -50
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc8360.py +0 -44
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc8398.py +0 -52
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc8410.py +0 -43
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc8418.py +0 -36
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc8419.py +0 -68
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc8479.py +0 -45
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc8494.py +0 -80
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc8520.py +0 -63
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc8619.py +0 -45
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc8649.py +0 -40
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc8692.py +0 -79
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc8696.py +0 -104
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc8702.py +0 -105
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc8708.py +0 -41
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules/rfc8769.py +0 -21
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules-0.4.2.dist-info/INSTALLER +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules-0.4.2.dist-info/METADATA +0 -73
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules-0.4.2.dist-info/RECORD +0 -271
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules-0.4.2.dist-info/WHEEL +0 -5
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules-0.4.2.dist-info/licenses/LICENSE.txt +0 -24
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules-0.4.2.dist-info/top_level.txt +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pyasn1_modules-0.4.2.dist-info/zip-safe +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/__init__.py +0 -456
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/_internal/__init__.py +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/_internal/_config.py +0 -383
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/_internal/_core_metadata.py +0 -97
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/_internal/_core_utils.py +0 -174
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/_internal/_dataclasses.py +0 -315
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/_internal/_decorators.py +0 -858
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/_internal/_decorators_v1.py +0 -174
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/_internal/_discriminated_union.py +0 -479
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/_internal/_docs_extraction.py +0 -113
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/_internal/_fields.py +0 -635
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/_internal/_forward_ref.py +0 -23
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/_internal/_generate_schema.py +0 -2867
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/_internal/_generics.py +0 -543
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/_internal/_git.py +0 -27
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/_internal/_import_utils.py +0 -20
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/_internal/_internal_dataclass.py +0 -7
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/_internal/_known_annotated_metadata.py +0 -401
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/_internal/_mock_val_ser.py +0 -228
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/_internal/_model_construction.py +0 -848
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/_internal/_namespace_utils.py +0 -293
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/_internal/_repr.py +0 -124
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/_internal/_schema_gather.py +0 -209
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/_internal/_schema_generation_shared.py +0 -125
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/_internal/_serializers.py +0 -53
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/_internal/_signature.py +0 -188
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/_internal/_typing_extra.py +0 -760
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/_internal/_utils.py +0 -446
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/_internal/_validate_call.py +0 -140
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/_internal/_validators.py +0 -533
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/_migration.py +0 -316
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/alias_generators.py +0 -62
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/aliases.py +0 -135
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/annotated_handlers.py +0 -122
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/class_validators.py +0 -5
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/color.py +0 -604
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/config.py +0 -1288
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/dataclasses.py +0 -413
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/datetime_parse.py +0 -5
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/decorator.py +0 -5
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/deprecated/__init__.py +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/deprecated/class_validators.py +0 -256
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/deprecated/config.py +0 -72
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/deprecated/copy_internals.py +0 -224
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/deprecated/decorator.py +0 -284
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/deprecated/json.py +0 -141
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/deprecated/parse.py +0 -80
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/deprecated/tools.py +0 -103
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/env_settings.py +0 -5
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/error_wrappers.py +0 -5
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/errors.py +0 -189
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/experimental/__init__.py +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/experimental/arguments_schema.py +0 -44
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/experimental/missing_sentinel.py +0 -5
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/experimental/pipeline.py +0 -654
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/fields.py +0 -1834
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/functional_serializers.py +0 -451
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/functional_validators.py +0 -893
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/generics.py +0 -5
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/json.py +0 -5
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/json_schema.py +0 -2854
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/main.py +0 -1819
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/mypy.py +0 -1374
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/networks.py +0 -1331
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/parse.py +0 -5
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/plugin/__init__.py +0 -193
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/plugin/_loader.py +0 -58
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/plugin/_schema_validator.py +0 -140
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/py.typed +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/root_model.py +0 -155
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/schema.py +0 -5
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/tools.py +0 -5
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/type_adapter.py +0 -795
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/types.py +0 -3295
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/typing.py +0 -5
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/utils.py +0 -5
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/v1/__init__.py +0 -142
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/v1/_hypothesis_plugin.py +0 -391
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/v1/annotated_types.py +0 -72
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/v1/class_validators.py +0 -361
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/v1/color.py +0 -494
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/v1/config.py +0 -191
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/v1/dataclasses.py +0 -500
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/v1/datetime_parse.py +0 -248
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/v1/decorator.py +0 -264
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/v1/env_settings.py +0 -350
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/v1/error_wrappers.py +0 -161
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/v1/errors.py +0 -646
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/v1/fields.py +0 -1253
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/v1/generics.py +0 -400
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/v1/json.py +0 -112
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/v1/main.py +0 -1113
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/v1/mypy.py +0 -949
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/v1/networks.py +0 -747
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/v1/parse.py +0 -66
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/v1/py.typed +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/v1/schema.py +0 -1163
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/v1/tools.py +0 -92
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/v1/types.py +0 -1205
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/v1/typing.py +0 -614
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/v1/utils.py +0 -806
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/v1/validators.py +0 -768
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/v1/version.py +0 -38
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/validate_call_decorator.py +0 -116
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/validators.py +0 -5
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/version.py +0 -113
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic/warnings.py +0 -122
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic-2.12.5.dist-info/INSTALLER +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic-2.12.5.dist-info/METADATA +0 -1029
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic-2.12.5.dist-info/RECORD +0 -217
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic-2.12.5.dist-info/WHEEL +0 -4
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic-2.12.5.dist-info/licenses/LICENSE +0 -21
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic_core/__init__.py +0 -171
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic_core/_pydantic_core.cpython-39-darwin.so +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic_core/_pydantic_core.pyi +0 -1046
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic_core/core_schema.py +0 -4435
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic_core/py.typed +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic_core-2.41.5.dist-info/INSTALLER +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic_core-2.41.5.dist-info/METADATA +0 -180
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic_core-2.41.5.dist-info/RECORD +0 -12
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic_core-2.41.5.dist-info/WHEEL +0 -4
- package/.claude/envoy/.venv/lib/python3.9/site-packages/pydantic_core-2.41.5.dist-info/licenses/LICENSE +0 -21
- package/.claude/envoy/.venv/lib/python3.9/site-packages/requests/__init__.py +0 -184
- package/.claude/envoy/.venv/lib/python3.9/site-packages/requests/__version__.py +0 -14
- package/.claude/envoy/.venv/lib/python3.9/site-packages/requests/_internal_utils.py +0 -50
- package/.claude/envoy/.venv/lib/python3.9/site-packages/requests/adapters.py +0 -696
- package/.claude/envoy/.venv/lib/python3.9/site-packages/requests/api.py +0 -157
- package/.claude/envoy/.venv/lib/python3.9/site-packages/requests/auth.py +0 -314
- package/.claude/envoy/.venv/lib/python3.9/site-packages/requests/certs.py +0 -17
- package/.claude/envoy/.venv/lib/python3.9/site-packages/requests/compat.py +0 -106
- package/.claude/envoy/.venv/lib/python3.9/site-packages/requests/cookies.py +0 -561
- package/.claude/envoy/.venv/lib/python3.9/site-packages/requests/exceptions.py +0 -151
- package/.claude/envoy/.venv/lib/python3.9/site-packages/requests/help.py +0 -134
- package/.claude/envoy/.venv/lib/python3.9/site-packages/requests/hooks.py +0 -33
- package/.claude/envoy/.venv/lib/python3.9/site-packages/requests/models.py +0 -1039
- package/.claude/envoy/.venv/lib/python3.9/site-packages/requests/packages.py +0 -23
- package/.claude/envoy/.venv/lib/python3.9/site-packages/requests/sessions.py +0 -831
- package/.claude/envoy/.venv/lib/python3.9/site-packages/requests/status_codes.py +0 -128
- package/.claude/envoy/.venv/lib/python3.9/site-packages/requests/structures.py +0 -99
- package/.claude/envoy/.venv/lib/python3.9/site-packages/requests/utils.py +0 -1086
- package/.claude/envoy/.venv/lib/python3.9/site-packages/requests-2.32.5.dist-info/INSTALLER +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/requests-2.32.5.dist-info/METADATA +0 -133
- package/.claude/envoy/.venv/lib/python3.9/site-packages/requests-2.32.5.dist-info/RECORD +0 -43
- package/.claude/envoy/.venv/lib/python3.9/site-packages/requests-2.32.5.dist-info/REQUESTED +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/requests-2.32.5.dist-info/WHEEL +0 -5
- package/.claude/envoy/.venv/lib/python3.9/site-packages/requests-2.32.5.dist-info/licenses/LICENSE +0 -175
- package/.claude/envoy/.venv/lib/python3.9/site-packages/requests-2.32.5.dist-info/top_level.txt +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/rsa/__init__.py +0 -60
- package/.claude/envoy/.venv/lib/python3.9/site-packages/rsa/asn1.py +0 -52
- package/.claude/envoy/.venv/lib/python3.9/site-packages/rsa/cli.py +0 -321
- package/.claude/envoy/.venv/lib/python3.9/site-packages/rsa/common.py +0 -184
- package/.claude/envoy/.venv/lib/python3.9/site-packages/rsa/core.py +0 -53
- package/.claude/envoy/.venv/lib/python3.9/site-packages/rsa/key.py +0 -858
- package/.claude/envoy/.venv/lib/python3.9/site-packages/rsa/parallel.py +0 -96
- package/.claude/envoy/.venv/lib/python3.9/site-packages/rsa/pem.py +0 -134
- package/.claude/envoy/.venv/lib/python3.9/site-packages/rsa/pkcs1.py +0 -485
- package/.claude/envoy/.venv/lib/python3.9/site-packages/rsa/pkcs1_v2.py +0 -100
- package/.claude/envoy/.venv/lib/python3.9/site-packages/rsa/prime.py +0 -198
- package/.claude/envoy/.venv/lib/python3.9/site-packages/rsa/py.typed +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/rsa/randnum.py +0 -95
- package/.claude/envoy/.venv/lib/python3.9/site-packages/rsa/transform.py +0 -72
- package/.claude/envoy/.venv/lib/python3.9/site-packages/rsa/util.py +0 -97
- package/.claude/envoy/.venv/lib/python3.9/site-packages/rsa-4.9.1.dist-info/INSTALLER +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/rsa-4.9.1.dist-info/LICENSE +0 -13
- package/.claude/envoy/.venv/lib/python3.9/site-packages/rsa-4.9.1.dist-info/METADATA +0 -140
- package/.claude/envoy/.venv/lib/python3.9/site-packages/rsa-4.9.1.dist-info/RECORD +0 -41
- package/.claude/envoy/.venv/lib/python3.9/site-packages/rsa-4.9.1.dist-info/WHEEL +0 -4
- package/.claude/envoy/.venv/lib/python3.9/site-packages/rsa-4.9.1.dist-info/entry_points.txt +0 -8
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/__init__.py +0 -242
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_deprecation_warning.py +0 -7
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/__init__.py +0 -15
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/_msvccompiler.py +0 -561
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/archive_util.py +0 -256
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/bcppcompiler.py +0 -393
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/ccompiler.py +0 -1123
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/cmd.py +0 -403
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/command/__init__.py +0 -31
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/command/bdist.py +0 -143
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/command/bdist_dumb.py +0 -123
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/command/bdist_msi.py +0 -749
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/command/bdist_rpm.py +0 -579
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/command/bdist_wininst.py +0 -377
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/command/build.py +0 -157
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/command/build_clib.py +0 -209
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/command/build_ext.py +0 -757
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/command/build_py.py +0 -392
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/command/build_scripts.py +0 -152
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/command/check.py +0 -148
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/command/clean.py +0 -76
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/command/config.py +0 -344
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/command/install.py +0 -677
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/command/install_data.py +0 -79
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/command/install_egg_info.py +0 -77
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/command/install_headers.py +0 -47
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/command/install_lib.py +0 -217
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/command/install_scripts.py +0 -60
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/command/py37compat.py +0 -30
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/command/register.py +0 -304
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/command/sdist.py +0 -494
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/command/upload.py +0 -214
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/config.py +0 -130
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/core.py +0 -234
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/cygwinccompiler.py +0 -414
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/debug.py +0 -5
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/dep_util.py +0 -92
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/dir_util.py +0 -210
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/dist.py +0 -1257
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/errors.py +0 -97
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/extension.py +0 -240
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/fancy_getopt.py +0 -457
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/file_util.py +0 -238
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/filelist.py +0 -355
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/log.py +0 -77
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/msvc9compiler.py +0 -788
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/msvccompiler.py +0 -643
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/py35compat.py +0 -19
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/py38compat.py +0 -7
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/spawn.py +0 -106
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/sysconfig.py +0 -573
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/text_file.py +0 -286
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/unixccompiler.py +0 -332
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/util.py +0 -535
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/version.py +0 -347
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_distutils/versionpredicate.py +0 -166
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_imp.py +0 -82
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_vendor/__init__.py +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_vendor/more_itertools/__init__.py +0 -4
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_vendor/more_itertools/more.py +0 -3825
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_vendor/more_itertools/recipes.py +0 -620
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_vendor/ordered_set.py +0 -488
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_vendor/packaging/__about__.py +0 -27
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_vendor/packaging/__init__.py +0 -26
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_vendor/packaging/_compat.py +0 -38
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_vendor/packaging/_structures.py +0 -86
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_vendor/packaging/_typing.py +0 -48
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_vendor/packaging/markers.py +0 -328
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_vendor/packaging/requirements.py +0 -145
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_vendor/packaging/specifiers.py +0 -863
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_vendor/packaging/tags.py +0 -751
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_vendor/packaging/utils.py +0 -65
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_vendor/packaging/version.py +0 -535
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/_vendor/pyparsing.py +0 -5742
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/archive_util.py +0 -205
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/build_meta.py +0 -281
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/cli-32.exe +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/cli-64.exe +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/cli.exe +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/command/__init__.py +0 -8
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/command/alias.py +0 -78
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/command/bdist_egg.py +0 -456
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/command/bdist_rpm.py +0 -31
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/command/build_clib.py +0 -101
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/command/build_ext.py +0 -328
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/command/build_py.py +0 -232
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/command/develop.py +0 -193
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/command/dist_info.py +0 -36
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/command/easy_install.py +0 -2290
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/command/egg_info.py +0 -734
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/command/install.py +0 -125
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/command/install_egg_info.py +0 -62
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/command/install_lib.py +0 -122
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/command/install_scripts.py +0 -69
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/command/launcher manifest.xml +0 -15
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/command/py36compat.py +0 -134
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/command/register.py +0 -18
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/command/rotate.py +0 -64
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/command/saveopts.py +0 -22
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/command/sdist.py +0 -189
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/command/setopt.py +0 -149
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/command/test.py +0 -252
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/command/upload.py +0 -17
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/command/upload_docs.py +0 -202
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/config.py +0 -749
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/dep_util.py +0 -25
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/depends.py +0 -175
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/dist.py +0 -1150
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/errors.py +0 -16
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/extension.py +0 -55
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/extern/__init__.py +0 -73
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/glob.py +0 -167
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/gui-32.exe +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/gui-64.exe +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/gui.exe +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/installer.py +0 -97
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/launch.py +0 -36
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/monkey.py +0 -177
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/msvc.py +0 -1805
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/namespaces.py +0 -107
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/package_index.py +0 -1119
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/py34compat.py +0 -13
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/sandbox.py +0 -530
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/script (dev).tmpl +0 -6
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/script.tmpl +0 -3
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/unicode_utils.py +0 -42
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/version.py +0 -6
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/wheel.py +0 -213
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools/windows_support.py +0 -29
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools-58.0.4.dist-info/INSTALLER +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools-58.0.4.dist-info/LICENSE +0 -19
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools-58.0.4.dist-info/METADATA +0 -119
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools-58.0.4.dist-info/RECORD +0 -296
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools-58.0.4.dist-info/REQUESTED +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools-58.0.4.dist-info/WHEEL +0 -5
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools-58.0.4.dist-info/entry_points.txt +0 -56
- package/.claude/envoy/.venv/lib/python3.9/site-packages/setuptools-58.0.4.dist-info/top_level.txt +0 -3
- package/.claude/envoy/.venv/lib/python3.9/site-packages/tenacity/__init__.py +0 -722
- package/.claude/envoy/.venv/lib/python3.9/site-packages/tenacity/_utils.py +0 -101
- package/.claude/envoy/.venv/lib/python3.9/site-packages/tenacity/after.py +0 -51
- package/.claude/envoy/.venv/lib/python3.9/site-packages/tenacity/asyncio/__init__.py +0 -206
- package/.claude/envoy/.venv/lib/python3.9/site-packages/tenacity/asyncio/retry.py +0 -125
- package/.claude/envoy/.venv/lib/python3.9/site-packages/tenacity/before.py +0 -48
- package/.claude/envoy/.venv/lib/python3.9/site-packages/tenacity/before_sleep.py +0 -72
- package/.claude/envoy/.venv/lib/python3.9/site-packages/tenacity/nap.py +0 -43
- package/.claude/envoy/.venv/lib/python3.9/site-packages/tenacity/py.typed +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/tenacity/retry.py +0 -282
- package/.claude/envoy/.venv/lib/python3.9/site-packages/tenacity/stop.py +0 -130
- package/.claude/envoy/.venv/lib/python3.9/site-packages/tenacity/tornadoweb.py +0 -63
- package/.claude/envoy/.venv/lib/python3.9/site-packages/tenacity/wait.py +0 -234
- package/.claude/envoy/.venv/lib/python3.9/site-packages/tenacity-9.1.2.dist-info/INSTALLER +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/tenacity-9.1.2.dist-info/METADATA +0 -31
- package/.claude/envoy/.venv/lib/python3.9/site-packages/tenacity-9.1.2.dist-info/RECORD +0 -31
- package/.claude/envoy/.venv/lib/python3.9/site-packages/tenacity-9.1.2.dist-info/WHEEL +0 -5
- package/.claude/envoy/.venv/lib/python3.9/site-packages/tenacity-9.1.2.dist-info/licenses/LICENSE +0 -202
- package/.claude/envoy/.venv/lib/python3.9/site-packages/tenacity-9.1.2.dist-info/top_level.txt +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/typing_extensions-4.15.0.dist-info/INSTALLER +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/typing_extensions-4.15.0.dist-info/METADATA +0 -72
- package/.claude/envoy/.venv/lib/python3.9/site-packages/typing_extensions-4.15.0.dist-info/RECORD +0 -7
- package/.claude/envoy/.venv/lib/python3.9/site-packages/typing_extensions-4.15.0.dist-info/WHEEL +0 -4
- package/.claude/envoy/.venv/lib/python3.9/site-packages/typing_extensions-4.15.0.dist-info/licenses/LICENSE +0 -279
- package/.claude/envoy/.venv/lib/python3.9/site-packages/typing_extensions.py +0 -4317
- package/.claude/envoy/.venv/lib/python3.9/site-packages/typing_inspection/__init__.py +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/typing_inspection/introspection.py +0 -587
- package/.claude/envoy/.venv/lib/python3.9/site-packages/typing_inspection/py.typed +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/typing_inspection/typing_objects.py +0 -607
- package/.claude/envoy/.venv/lib/python3.9/site-packages/typing_inspection/typing_objects.pyi +0 -417
- package/.claude/envoy/.venv/lib/python3.9/site-packages/typing_inspection-0.4.2.dist-info/INSTALLER +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/typing_inspection-0.4.2.dist-info/METADATA +0 -49
- package/.claude/envoy/.venv/lib/python3.9/site-packages/typing_inspection-0.4.2.dist-info/RECORD +0 -13
- package/.claude/envoy/.venv/lib/python3.9/site-packages/typing_inspection-0.4.2.dist-info/WHEEL +0 -4
- package/.claude/envoy/.venv/lib/python3.9/site-packages/typing_inspection-0.4.2.dist-info/licenses/LICENSE +0 -21
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3/__init__.py +0 -211
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3/_base_connection.py +0 -165
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3/_collections.py +0 -487
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3/_request_methods.py +0 -278
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3/_version.py +0 -34
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3/connection.py +0 -1099
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3/connectionpool.py +0 -1178
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3/contrib/__init__.py +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3/contrib/emscripten/__init__.py +0 -16
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3/contrib/emscripten/connection.py +0 -259
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3/contrib/emscripten/emscripten_fetch_worker.js +0 -110
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3/contrib/emscripten/fetch.py +0 -726
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3/contrib/emscripten/request.py +0 -22
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3/contrib/emscripten/response.py +0 -277
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3/contrib/pyopenssl.py +0 -564
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3/contrib/socks.py +0 -228
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3/exceptions.py +0 -335
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3/fields.py +0 -341
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3/filepost.py +0 -89
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3/http2/__init__.py +0 -53
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3/http2/connection.py +0 -356
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3/http2/probe.py +0 -87
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3/poolmanager.py +0 -651
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3/py.typed +0 -2
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3/response.py +0 -1465
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3/util/__init__.py +0 -42
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3/util/connection.py +0 -137
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3/util/proxy.py +0 -43
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3/util/request.py +0 -263
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3/util/response.py +0 -101
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3/util/retry.py +0 -533
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3/util/ssl_.py +0 -527
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3/util/ssl_match_hostname.py +0 -159
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3/util/ssltransport.py +0 -271
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3/util/timeout.py +0 -275
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3/util/url.py +0 -469
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3/util/util.py +0 -42
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3/util/wait.py +0 -124
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3-2.6.0.dist-info/INSTALLER +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3-2.6.0.dist-info/METADATA +0 -156
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3-2.6.0.dist-info/RECORD +0 -79
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3-2.6.0.dist-info/WHEEL +0 -4
- package/.claude/envoy/.venv/lib/python3.9/site-packages/urllib3-2.6.0.dist-info/licenses/LICENSE.txt +0 -21
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/__init__.py +0 -236
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/__main__.py +0 -5
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/asyncio/__init__.py +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/asyncio/async_timeout.py +0 -282
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/asyncio/client.py +0 -820
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/asyncio/compatibility.py +0 -30
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/asyncio/connection.py +0 -1237
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/asyncio/messages.py +0 -314
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/asyncio/router.py +0 -198
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/asyncio/server.py +0 -981
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/auth.py +0 -18
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/cli.py +0 -178
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/client.py +0 -389
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/connection.py +0 -12
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/datastructures.py +0 -187
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/exceptions.py +0 -473
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/extensions/__init__.py +0 -4
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/extensions/base.py +0 -123
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/extensions/permessage_deflate.py +0 -697
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/frames.py +0 -430
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/headers.py +0 -586
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/http.py +0 -20
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/http11.py +0 -427
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/imports.py +0 -100
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/legacy/__init__.py +0 -11
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/legacy/auth.py +0 -190
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/legacy/client.py +0 -705
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/legacy/exceptions.py +0 -71
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/legacy/framing.py +0 -225
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/legacy/handshake.py +0 -158
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/legacy/http.py +0 -201
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/legacy/protocol.py +0 -1641
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/legacy/server.py +0 -1191
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/protocol.py +0 -758
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/py.typed +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/server.py +0 -587
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/speedups.c +0 -222
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/speedups.cpython-39-darwin.so +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/speedups.pyi +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/streams.py +0 -151
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/sync/__init__.py +0 -0
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/sync/client.py +0 -648
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/sync/connection.py +0 -1072
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/sync/messages.py +0 -345
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/sync/router.py +0 -192
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/sync/server.py +0 -763
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/sync/utils.py +0 -45
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/typing.py +0 -74
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/uri.py +0 -225
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/utils.py +0 -51
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets/version.py +0 -92
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets-15.0.1.dist-info/INSTALLER +0 -1
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets-15.0.1.dist-info/LICENSE +0 -24
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets-15.0.1.dist-info/METADATA +0 -179
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets-15.0.1.dist-info/RECORD +0 -106
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets-15.0.1.dist-info/WHEEL +0 -5
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets-15.0.1.dist-info/entry_points.txt +0 -2
- package/.claude/envoy/.venv/lib/python3.9/site-packages/websockets-15.0.1.dist-info/top_level.txt +0 -1
- package/.claude/envoy/.venv/pyvenv.cfg +0 -3
- package/.claude/plans/feat-npm-package-cli/plan.md +0 -85
- package/.claude/plans/feat-specialist-builder-patterns/plan.md +0 -298
|
@@ -1,3007 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
import array
|
|
4
|
-
import asyncio
|
|
5
|
-
import concurrent.futures
|
|
6
|
-
import contextvars
|
|
7
|
-
import math
|
|
8
|
-
import os
|
|
9
|
-
import socket
|
|
10
|
-
import sys
|
|
11
|
-
import threading
|
|
12
|
-
import weakref
|
|
13
|
-
from asyncio import (
|
|
14
|
-
AbstractEventLoop,
|
|
15
|
-
CancelledError,
|
|
16
|
-
all_tasks,
|
|
17
|
-
create_task,
|
|
18
|
-
current_task,
|
|
19
|
-
get_running_loop,
|
|
20
|
-
sleep,
|
|
21
|
-
)
|
|
22
|
-
from asyncio.base_events import _run_until_complete_cb # type: ignore[attr-defined]
|
|
23
|
-
from collections import OrderedDict, deque
|
|
24
|
-
from collections.abc import (
|
|
25
|
-
AsyncGenerator,
|
|
26
|
-
AsyncIterator,
|
|
27
|
-
Awaitable,
|
|
28
|
-
Callable,
|
|
29
|
-
Collection,
|
|
30
|
-
Coroutine,
|
|
31
|
-
Iterable,
|
|
32
|
-
Sequence,
|
|
33
|
-
)
|
|
34
|
-
from concurrent.futures import Future
|
|
35
|
-
from contextlib import AbstractContextManager, suppress
|
|
36
|
-
from contextvars import Context, copy_context
|
|
37
|
-
from dataclasses import dataclass, field
|
|
38
|
-
from functools import partial, wraps
|
|
39
|
-
from inspect import (
|
|
40
|
-
CORO_RUNNING,
|
|
41
|
-
CORO_SUSPENDED,
|
|
42
|
-
getcoroutinestate,
|
|
43
|
-
iscoroutine,
|
|
44
|
-
)
|
|
45
|
-
from io import IOBase
|
|
46
|
-
from os import PathLike
|
|
47
|
-
from queue import Queue
|
|
48
|
-
from signal import Signals
|
|
49
|
-
from socket import AddressFamily, SocketKind
|
|
50
|
-
from threading import Thread
|
|
51
|
-
from types import CodeType, TracebackType
|
|
52
|
-
from typing import (
|
|
53
|
-
IO,
|
|
54
|
-
TYPE_CHECKING,
|
|
55
|
-
Any,
|
|
56
|
-
Optional,
|
|
57
|
-
TypeVar,
|
|
58
|
-
cast,
|
|
59
|
-
)
|
|
60
|
-
from weakref import WeakKeyDictionary
|
|
61
|
-
|
|
62
|
-
from .. import (
|
|
63
|
-
CapacityLimiterStatistics,
|
|
64
|
-
EventStatistics,
|
|
65
|
-
LockStatistics,
|
|
66
|
-
TaskInfo,
|
|
67
|
-
abc,
|
|
68
|
-
)
|
|
69
|
-
from .._core._eventloop import (
|
|
70
|
-
claim_worker_thread,
|
|
71
|
-
set_current_async_library,
|
|
72
|
-
threadlocals,
|
|
73
|
-
)
|
|
74
|
-
from .._core._exceptions import (
|
|
75
|
-
BrokenResourceError,
|
|
76
|
-
BusyResourceError,
|
|
77
|
-
ClosedResourceError,
|
|
78
|
-
EndOfStream,
|
|
79
|
-
RunFinishedError,
|
|
80
|
-
WouldBlock,
|
|
81
|
-
iterate_exceptions,
|
|
82
|
-
)
|
|
83
|
-
from .._core._sockets import convert_ipv6_sockaddr
|
|
84
|
-
from .._core._streams import create_memory_object_stream
|
|
85
|
-
from .._core._synchronization import (
|
|
86
|
-
CapacityLimiter as BaseCapacityLimiter,
|
|
87
|
-
)
|
|
88
|
-
from .._core._synchronization import Event as BaseEvent
|
|
89
|
-
from .._core._synchronization import Lock as BaseLock
|
|
90
|
-
from .._core._synchronization import (
|
|
91
|
-
ResourceGuard,
|
|
92
|
-
SemaphoreStatistics,
|
|
93
|
-
)
|
|
94
|
-
from .._core._synchronization import Semaphore as BaseSemaphore
|
|
95
|
-
from .._core._tasks import CancelScope as BaseCancelScope
|
|
96
|
-
from ..abc import (
|
|
97
|
-
AsyncBackend,
|
|
98
|
-
IPSockAddrType,
|
|
99
|
-
SocketListener,
|
|
100
|
-
UDPPacketType,
|
|
101
|
-
UNIXDatagramPacketType,
|
|
102
|
-
)
|
|
103
|
-
from ..abc._eventloop import StrOrBytesPath
|
|
104
|
-
from ..lowlevel import RunVar
|
|
105
|
-
from ..streams.memory import MemoryObjectReceiveStream, MemoryObjectSendStream
|
|
106
|
-
|
|
107
|
-
if TYPE_CHECKING:
|
|
108
|
-
from _typeshed import FileDescriptorLike
|
|
109
|
-
else:
|
|
110
|
-
FileDescriptorLike = object
|
|
111
|
-
|
|
112
|
-
if sys.version_info >= (3, 10):
|
|
113
|
-
from typing import ParamSpec
|
|
114
|
-
else:
|
|
115
|
-
from typing_extensions import ParamSpec
|
|
116
|
-
|
|
117
|
-
if sys.version_info >= (3, 11):
|
|
118
|
-
from asyncio import Runner
|
|
119
|
-
from typing import TypeVarTuple, Unpack
|
|
120
|
-
else:
|
|
121
|
-
import contextvars
|
|
122
|
-
import enum
|
|
123
|
-
import signal
|
|
124
|
-
from asyncio import coroutines, events, exceptions, tasks
|
|
125
|
-
|
|
126
|
-
from exceptiongroup import BaseExceptionGroup
|
|
127
|
-
from typing_extensions import TypeVarTuple, Unpack
|
|
128
|
-
|
|
129
|
-
class _State(enum.Enum):
|
|
130
|
-
CREATED = "created"
|
|
131
|
-
INITIALIZED = "initialized"
|
|
132
|
-
CLOSED = "closed"
|
|
133
|
-
|
|
134
|
-
class Runner:
|
|
135
|
-
# Copied from CPython 3.11
|
|
136
|
-
def __init__(
|
|
137
|
-
self,
|
|
138
|
-
*,
|
|
139
|
-
debug: bool | None = None,
|
|
140
|
-
loop_factory: Callable[[], AbstractEventLoop] | None = None,
|
|
141
|
-
):
|
|
142
|
-
self._state = _State.CREATED
|
|
143
|
-
self._debug = debug
|
|
144
|
-
self._loop_factory = loop_factory
|
|
145
|
-
self._loop: AbstractEventLoop | None = None
|
|
146
|
-
self._context = None
|
|
147
|
-
self._interrupt_count = 0
|
|
148
|
-
self._set_event_loop = False
|
|
149
|
-
|
|
150
|
-
def __enter__(self) -> Runner:
|
|
151
|
-
self._lazy_init()
|
|
152
|
-
return self
|
|
153
|
-
|
|
154
|
-
def __exit__(
|
|
155
|
-
self,
|
|
156
|
-
exc_type: type[BaseException] | None,
|
|
157
|
-
exc_val: BaseException | None,
|
|
158
|
-
exc_tb: TracebackType | None,
|
|
159
|
-
) -> None:
|
|
160
|
-
self.close()
|
|
161
|
-
|
|
162
|
-
def close(self) -> None:
|
|
163
|
-
"""Shutdown and close event loop."""
|
|
164
|
-
loop = self._loop
|
|
165
|
-
if self._state is not _State.INITIALIZED or loop is None:
|
|
166
|
-
return
|
|
167
|
-
try:
|
|
168
|
-
_cancel_all_tasks(loop)
|
|
169
|
-
loop.run_until_complete(loop.shutdown_asyncgens())
|
|
170
|
-
if hasattr(loop, "shutdown_default_executor"):
|
|
171
|
-
loop.run_until_complete(loop.shutdown_default_executor())
|
|
172
|
-
else:
|
|
173
|
-
loop.run_until_complete(_shutdown_default_executor(loop))
|
|
174
|
-
finally:
|
|
175
|
-
if self._set_event_loop:
|
|
176
|
-
events.set_event_loop(None)
|
|
177
|
-
loop.close()
|
|
178
|
-
self._loop = None
|
|
179
|
-
self._state = _State.CLOSED
|
|
180
|
-
|
|
181
|
-
def get_loop(self) -> AbstractEventLoop:
|
|
182
|
-
"""Return embedded event loop."""
|
|
183
|
-
self._lazy_init()
|
|
184
|
-
return self._loop
|
|
185
|
-
|
|
186
|
-
def run(self, coro: Coroutine[T_Retval], *, context=None) -> T_Retval:
|
|
187
|
-
"""Run a coroutine inside the embedded event loop."""
|
|
188
|
-
if not coroutines.iscoroutine(coro):
|
|
189
|
-
raise ValueError(f"a coroutine was expected, got {coro!r}")
|
|
190
|
-
|
|
191
|
-
if events._get_running_loop() is not None:
|
|
192
|
-
# fail fast with short traceback
|
|
193
|
-
raise RuntimeError(
|
|
194
|
-
"Runner.run() cannot be called from a running event loop"
|
|
195
|
-
)
|
|
196
|
-
|
|
197
|
-
self._lazy_init()
|
|
198
|
-
|
|
199
|
-
if context is None:
|
|
200
|
-
context = self._context
|
|
201
|
-
task = context.run(self._loop.create_task, coro)
|
|
202
|
-
|
|
203
|
-
if (
|
|
204
|
-
threading.current_thread() is threading.main_thread()
|
|
205
|
-
and signal.getsignal(signal.SIGINT) is signal.default_int_handler
|
|
206
|
-
):
|
|
207
|
-
sigint_handler = partial(self._on_sigint, main_task=task)
|
|
208
|
-
try:
|
|
209
|
-
signal.signal(signal.SIGINT, sigint_handler)
|
|
210
|
-
except ValueError:
|
|
211
|
-
# `signal.signal` may throw if `threading.main_thread` does
|
|
212
|
-
# not support signals (e.g. embedded interpreter with signals
|
|
213
|
-
# not registered - see gh-91880)
|
|
214
|
-
sigint_handler = None
|
|
215
|
-
else:
|
|
216
|
-
sigint_handler = None
|
|
217
|
-
|
|
218
|
-
self._interrupt_count = 0
|
|
219
|
-
try:
|
|
220
|
-
return self._loop.run_until_complete(task)
|
|
221
|
-
except exceptions.CancelledError:
|
|
222
|
-
if self._interrupt_count > 0:
|
|
223
|
-
uncancel = getattr(task, "uncancel", None)
|
|
224
|
-
if uncancel is not None and uncancel() == 0:
|
|
225
|
-
raise KeyboardInterrupt # noqa: B904
|
|
226
|
-
raise # CancelledError
|
|
227
|
-
finally:
|
|
228
|
-
if (
|
|
229
|
-
sigint_handler is not None
|
|
230
|
-
and signal.getsignal(signal.SIGINT) is sigint_handler
|
|
231
|
-
):
|
|
232
|
-
signal.signal(signal.SIGINT, signal.default_int_handler)
|
|
233
|
-
|
|
234
|
-
def _lazy_init(self) -> None:
|
|
235
|
-
if self._state is _State.CLOSED:
|
|
236
|
-
raise RuntimeError("Runner is closed")
|
|
237
|
-
if self._state is _State.INITIALIZED:
|
|
238
|
-
return
|
|
239
|
-
if self._loop_factory is None:
|
|
240
|
-
self._loop = events.new_event_loop()
|
|
241
|
-
if not self._set_event_loop:
|
|
242
|
-
# Call set_event_loop only once to avoid calling
|
|
243
|
-
# attach_loop multiple times on child watchers
|
|
244
|
-
events.set_event_loop(self._loop)
|
|
245
|
-
self._set_event_loop = True
|
|
246
|
-
else:
|
|
247
|
-
self._loop = self._loop_factory()
|
|
248
|
-
if self._debug is not None:
|
|
249
|
-
self._loop.set_debug(self._debug)
|
|
250
|
-
self._context = contextvars.copy_context()
|
|
251
|
-
self._state = _State.INITIALIZED
|
|
252
|
-
|
|
253
|
-
def _on_sigint(self, signum, frame, main_task: asyncio.Task) -> None:
|
|
254
|
-
self._interrupt_count += 1
|
|
255
|
-
if self._interrupt_count == 1 and not main_task.done():
|
|
256
|
-
main_task.cancel()
|
|
257
|
-
# wakeup loop if it is blocked by select() with long timeout
|
|
258
|
-
self._loop.call_soon_threadsafe(lambda: None)
|
|
259
|
-
return
|
|
260
|
-
raise KeyboardInterrupt()
|
|
261
|
-
|
|
262
|
-
def _cancel_all_tasks(loop: AbstractEventLoop) -> None:
|
|
263
|
-
to_cancel = tasks.all_tasks(loop)
|
|
264
|
-
if not to_cancel:
|
|
265
|
-
return
|
|
266
|
-
|
|
267
|
-
for task in to_cancel:
|
|
268
|
-
task.cancel()
|
|
269
|
-
|
|
270
|
-
loop.run_until_complete(tasks.gather(*to_cancel, return_exceptions=True))
|
|
271
|
-
|
|
272
|
-
for task in to_cancel:
|
|
273
|
-
if task.cancelled():
|
|
274
|
-
continue
|
|
275
|
-
if task.exception() is not None:
|
|
276
|
-
loop.call_exception_handler(
|
|
277
|
-
{
|
|
278
|
-
"message": "unhandled exception during asyncio.run() shutdown",
|
|
279
|
-
"exception": task.exception(),
|
|
280
|
-
"task": task,
|
|
281
|
-
}
|
|
282
|
-
)
|
|
283
|
-
|
|
284
|
-
async def _shutdown_default_executor(loop: AbstractEventLoop) -> None:
|
|
285
|
-
"""Schedule the shutdown of the default executor."""
|
|
286
|
-
|
|
287
|
-
def _do_shutdown(future: asyncio.futures.Future) -> None:
|
|
288
|
-
try:
|
|
289
|
-
loop._default_executor.shutdown(wait=True) # type: ignore[attr-defined]
|
|
290
|
-
loop.call_soon_threadsafe(future.set_result, None)
|
|
291
|
-
except Exception as ex:
|
|
292
|
-
loop.call_soon_threadsafe(future.set_exception, ex)
|
|
293
|
-
|
|
294
|
-
loop._executor_shutdown_called = True
|
|
295
|
-
if loop._default_executor is None:
|
|
296
|
-
return
|
|
297
|
-
future = loop.create_future()
|
|
298
|
-
thread = threading.Thread(target=_do_shutdown, args=(future,))
|
|
299
|
-
thread.start()
|
|
300
|
-
try:
|
|
301
|
-
await future
|
|
302
|
-
finally:
|
|
303
|
-
thread.join()
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
T_Retval = TypeVar("T_Retval")
|
|
307
|
-
T_contra = TypeVar("T_contra", contravariant=True)
|
|
308
|
-
PosArgsT = TypeVarTuple("PosArgsT")
|
|
309
|
-
P = ParamSpec("P")
|
|
310
|
-
|
|
311
|
-
_root_task: RunVar[asyncio.Task | None] = RunVar("_root_task")
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
def find_root_task() -> asyncio.Task:
|
|
315
|
-
root_task = _root_task.get(None)
|
|
316
|
-
if root_task is not None and not root_task.done():
|
|
317
|
-
return root_task
|
|
318
|
-
|
|
319
|
-
# Look for a task that has been started via run_until_complete()
|
|
320
|
-
for task in all_tasks():
|
|
321
|
-
if task._callbacks and not task.done():
|
|
322
|
-
callbacks = [cb for cb, context in task._callbacks]
|
|
323
|
-
for cb in callbacks:
|
|
324
|
-
if (
|
|
325
|
-
cb is _run_until_complete_cb
|
|
326
|
-
or getattr(cb, "__module__", None) == "uvloop.loop"
|
|
327
|
-
):
|
|
328
|
-
_root_task.set(task)
|
|
329
|
-
return task
|
|
330
|
-
|
|
331
|
-
# Look up the topmost task in the AnyIO task tree, if possible
|
|
332
|
-
task = cast(asyncio.Task, current_task())
|
|
333
|
-
state = _task_states.get(task)
|
|
334
|
-
if state:
|
|
335
|
-
cancel_scope = state.cancel_scope
|
|
336
|
-
while cancel_scope and cancel_scope._parent_scope is not None:
|
|
337
|
-
cancel_scope = cancel_scope._parent_scope
|
|
338
|
-
|
|
339
|
-
if cancel_scope is not None:
|
|
340
|
-
return cast(asyncio.Task, cancel_scope._host_task)
|
|
341
|
-
|
|
342
|
-
return task
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
def get_callable_name(func: Callable) -> str:
|
|
346
|
-
module = getattr(func, "__module__", None)
|
|
347
|
-
qualname = getattr(func, "__qualname__", None)
|
|
348
|
-
return ".".join([x for x in (module, qualname) if x])
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
#
|
|
352
|
-
# Event loop
|
|
353
|
-
#
|
|
354
|
-
|
|
355
|
-
_run_vars: WeakKeyDictionary[asyncio.AbstractEventLoop, Any] = WeakKeyDictionary()
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
def _task_started(task: asyncio.Task) -> bool:
|
|
359
|
-
"""Return ``True`` if the task has been started and has not finished."""
|
|
360
|
-
# The task coro should never be None here, as we never add finished tasks to the
|
|
361
|
-
# task list
|
|
362
|
-
coro = task.get_coro()
|
|
363
|
-
assert coro is not None
|
|
364
|
-
try:
|
|
365
|
-
return getcoroutinestate(coro) in (CORO_RUNNING, CORO_SUSPENDED)
|
|
366
|
-
except AttributeError:
|
|
367
|
-
# task coro is async_genenerator_asend https://bugs.python.org/issue37771
|
|
368
|
-
raise Exception(f"Cannot determine if task {task} has started or not") from None
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
#
|
|
372
|
-
# Timeouts and cancellation
|
|
373
|
-
#
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
def is_anyio_cancellation(exc: CancelledError) -> bool:
|
|
377
|
-
# Sometimes third party frameworks catch a CancelledError and raise a new one, so as
|
|
378
|
-
# a workaround we have to look at the previous ones in __context__ too for a
|
|
379
|
-
# matching cancel message
|
|
380
|
-
while True:
|
|
381
|
-
if (
|
|
382
|
-
exc.args
|
|
383
|
-
and isinstance(exc.args[0], str)
|
|
384
|
-
and exc.args[0].startswith("Cancelled via cancel scope ")
|
|
385
|
-
):
|
|
386
|
-
return True
|
|
387
|
-
|
|
388
|
-
if isinstance(exc.__context__, CancelledError):
|
|
389
|
-
exc = exc.__context__
|
|
390
|
-
continue
|
|
391
|
-
|
|
392
|
-
return False
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
class CancelScope(BaseCancelScope):
|
|
396
|
-
def __new__(
|
|
397
|
-
cls, *, deadline: float = math.inf, shield: bool = False
|
|
398
|
-
) -> CancelScope:
|
|
399
|
-
return object.__new__(cls)
|
|
400
|
-
|
|
401
|
-
def __init__(self, deadline: float = math.inf, shield: bool = False):
|
|
402
|
-
self._deadline = deadline
|
|
403
|
-
self._shield = shield
|
|
404
|
-
self._parent_scope: CancelScope | None = None
|
|
405
|
-
self._child_scopes: set[CancelScope] = set()
|
|
406
|
-
self._cancel_called = False
|
|
407
|
-
self._cancel_reason: str | None = None
|
|
408
|
-
self._cancelled_caught = False
|
|
409
|
-
self._active = False
|
|
410
|
-
self._timeout_handle: asyncio.TimerHandle | None = None
|
|
411
|
-
self._cancel_handle: asyncio.Handle | None = None
|
|
412
|
-
self._tasks: set[asyncio.Task] = set()
|
|
413
|
-
self._host_task: asyncio.Task | None = None
|
|
414
|
-
if sys.version_info >= (3, 11):
|
|
415
|
-
self._pending_uncancellations: int | None = 0
|
|
416
|
-
else:
|
|
417
|
-
self._pending_uncancellations = None
|
|
418
|
-
|
|
419
|
-
def __enter__(self) -> CancelScope:
|
|
420
|
-
if self._active:
|
|
421
|
-
raise RuntimeError(
|
|
422
|
-
"Each CancelScope may only be used for a single 'with' block"
|
|
423
|
-
)
|
|
424
|
-
|
|
425
|
-
self._host_task = host_task = cast(asyncio.Task, current_task())
|
|
426
|
-
self._tasks.add(host_task)
|
|
427
|
-
try:
|
|
428
|
-
task_state = _task_states[host_task]
|
|
429
|
-
except KeyError:
|
|
430
|
-
task_state = TaskState(None, self)
|
|
431
|
-
_task_states[host_task] = task_state
|
|
432
|
-
else:
|
|
433
|
-
self._parent_scope = task_state.cancel_scope
|
|
434
|
-
task_state.cancel_scope = self
|
|
435
|
-
if self._parent_scope is not None:
|
|
436
|
-
# If using an eager task factory, the parent scope may not even contain
|
|
437
|
-
# the host task
|
|
438
|
-
self._parent_scope._child_scopes.add(self)
|
|
439
|
-
self._parent_scope._tasks.discard(host_task)
|
|
440
|
-
|
|
441
|
-
self._timeout()
|
|
442
|
-
self._active = True
|
|
443
|
-
|
|
444
|
-
# Start cancelling the host task if the scope was cancelled before entering
|
|
445
|
-
if self._cancel_called:
|
|
446
|
-
self._deliver_cancellation(self)
|
|
447
|
-
|
|
448
|
-
return self
|
|
449
|
-
|
|
450
|
-
def __exit__(
|
|
451
|
-
self,
|
|
452
|
-
exc_type: type[BaseException] | None,
|
|
453
|
-
exc_val: BaseException | None,
|
|
454
|
-
exc_tb: TracebackType | None,
|
|
455
|
-
) -> bool:
|
|
456
|
-
del exc_tb
|
|
457
|
-
|
|
458
|
-
if not self._active:
|
|
459
|
-
raise RuntimeError("This cancel scope is not active")
|
|
460
|
-
if current_task() is not self._host_task:
|
|
461
|
-
raise RuntimeError(
|
|
462
|
-
"Attempted to exit cancel scope in a different task than it was "
|
|
463
|
-
"entered in"
|
|
464
|
-
)
|
|
465
|
-
|
|
466
|
-
assert self._host_task is not None
|
|
467
|
-
host_task_state = _task_states.get(self._host_task)
|
|
468
|
-
if host_task_state is None or host_task_state.cancel_scope is not self:
|
|
469
|
-
raise RuntimeError(
|
|
470
|
-
"Attempted to exit a cancel scope that isn't the current tasks's "
|
|
471
|
-
"current cancel scope"
|
|
472
|
-
)
|
|
473
|
-
|
|
474
|
-
try:
|
|
475
|
-
self._active = False
|
|
476
|
-
if self._timeout_handle:
|
|
477
|
-
self._timeout_handle.cancel()
|
|
478
|
-
self._timeout_handle = None
|
|
479
|
-
|
|
480
|
-
self._tasks.remove(self._host_task)
|
|
481
|
-
if self._parent_scope is not None:
|
|
482
|
-
self._parent_scope._child_scopes.remove(self)
|
|
483
|
-
self._parent_scope._tasks.add(self._host_task)
|
|
484
|
-
|
|
485
|
-
host_task_state.cancel_scope = self._parent_scope
|
|
486
|
-
|
|
487
|
-
# Restart the cancellation effort in the closest visible, cancelled parent
|
|
488
|
-
# scope if necessary
|
|
489
|
-
self._restart_cancellation_in_parent()
|
|
490
|
-
|
|
491
|
-
# We only swallow the exception iff it was an AnyIO CancelledError, either
|
|
492
|
-
# directly as exc_val or inside an exception group and there are no cancelled
|
|
493
|
-
# parent cancel scopes visible to us here
|
|
494
|
-
if self._cancel_called and not self._parent_cancellation_is_visible_to_us:
|
|
495
|
-
# For each level-cancel() call made on the host task, call uncancel()
|
|
496
|
-
while self._pending_uncancellations:
|
|
497
|
-
self._host_task.uncancel()
|
|
498
|
-
self._pending_uncancellations -= 1
|
|
499
|
-
|
|
500
|
-
# Update cancelled_caught and check for exceptions we must not swallow
|
|
501
|
-
cannot_swallow_exc_val = False
|
|
502
|
-
if exc_val is not None:
|
|
503
|
-
for exc in iterate_exceptions(exc_val):
|
|
504
|
-
if isinstance(exc, CancelledError) and is_anyio_cancellation(
|
|
505
|
-
exc
|
|
506
|
-
):
|
|
507
|
-
self._cancelled_caught = True
|
|
508
|
-
else:
|
|
509
|
-
cannot_swallow_exc_val = True
|
|
510
|
-
|
|
511
|
-
return self._cancelled_caught and not cannot_swallow_exc_val
|
|
512
|
-
else:
|
|
513
|
-
if self._pending_uncancellations:
|
|
514
|
-
assert self._parent_scope is not None
|
|
515
|
-
assert self._parent_scope._pending_uncancellations is not None
|
|
516
|
-
self._parent_scope._pending_uncancellations += (
|
|
517
|
-
self._pending_uncancellations
|
|
518
|
-
)
|
|
519
|
-
self._pending_uncancellations = 0
|
|
520
|
-
|
|
521
|
-
return False
|
|
522
|
-
finally:
|
|
523
|
-
self._host_task = None
|
|
524
|
-
del exc_val
|
|
525
|
-
|
|
526
|
-
@property
|
|
527
|
-
def _effectively_cancelled(self) -> bool:
|
|
528
|
-
cancel_scope: CancelScope | None = self
|
|
529
|
-
while cancel_scope is not None:
|
|
530
|
-
if cancel_scope._cancel_called:
|
|
531
|
-
return True
|
|
532
|
-
|
|
533
|
-
if cancel_scope.shield:
|
|
534
|
-
return False
|
|
535
|
-
|
|
536
|
-
cancel_scope = cancel_scope._parent_scope
|
|
537
|
-
|
|
538
|
-
return False
|
|
539
|
-
|
|
540
|
-
@property
|
|
541
|
-
def _parent_cancellation_is_visible_to_us(self) -> bool:
|
|
542
|
-
return (
|
|
543
|
-
self._parent_scope is not None
|
|
544
|
-
and not self.shield
|
|
545
|
-
and self._parent_scope._effectively_cancelled
|
|
546
|
-
)
|
|
547
|
-
|
|
548
|
-
def _timeout(self) -> None:
|
|
549
|
-
if self._deadline != math.inf:
|
|
550
|
-
loop = get_running_loop()
|
|
551
|
-
if loop.time() >= self._deadline:
|
|
552
|
-
self.cancel("deadline exceeded")
|
|
553
|
-
else:
|
|
554
|
-
self._timeout_handle = loop.call_at(self._deadline, self._timeout)
|
|
555
|
-
|
|
556
|
-
def _deliver_cancellation(self, origin: CancelScope) -> bool:
|
|
557
|
-
"""
|
|
558
|
-
Deliver cancellation to directly contained tasks and nested cancel scopes.
|
|
559
|
-
|
|
560
|
-
Schedule another run at the end if we still have tasks eligible for
|
|
561
|
-
cancellation.
|
|
562
|
-
|
|
563
|
-
:param origin: the cancel scope that originated the cancellation
|
|
564
|
-
:return: ``True`` if the delivery needs to be retried on the next cycle
|
|
565
|
-
|
|
566
|
-
"""
|
|
567
|
-
should_retry = False
|
|
568
|
-
current = current_task()
|
|
569
|
-
for task in self._tasks:
|
|
570
|
-
should_retry = True
|
|
571
|
-
if task._must_cancel: # type: ignore[attr-defined]
|
|
572
|
-
continue
|
|
573
|
-
|
|
574
|
-
# The task is eligible for cancellation if it has started
|
|
575
|
-
if task is not current and (task is self._host_task or _task_started(task)):
|
|
576
|
-
waiter = task._fut_waiter # type: ignore[attr-defined]
|
|
577
|
-
if not isinstance(waiter, asyncio.Future) or not waiter.done():
|
|
578
|
-
task.cancel(origin._cancel_reason)
|
|
579
|
-
if (
|
|
580
|
-
task is origin._host_task
|
|
581
|
-
and origin._pending_uncancellations is not None
|
|
582
|
-
):
|
|
583
|
-
origin._pending_uncancellations += 1
|
|
584
|
-
|
|
585
|
-
# Deliver cancellation to child scopes that aren't shielded or running their own
|
|
586
|
-
# cancellation callbacks
|
|
587
|
-
for scope in self._child_scopes:
|
|
588
|
-
if not scope._shield and not scope.cancel_called:
|
|
589
|
-
should_retry = scope._deliver_cancellation(origin) or should_retry
|
|
590
|
-
|
|
591
|
-
# Schedule another callback if there are still tasks left
|
|
592
|
-
if origin is self:
|
|
593
|
-
if should_retry:
|
|
594
|
-
self._cancel_handle = get_running_loop().call_soon(
|
|
595
|
-
self._deliver_cancellation, origin
|
|
596
|
-
)
|
|
597
|
-
else:
|
|
598
|
-
self._cancel_handle = None
|
|
599
|
-
|
|
600
|
-
return should_retry
|
|
601
|
-
|
|
602
|
-
def _restart_cancellation_in_parent(self) -> None:
|
|
603
|
-
"""
|
|
604
|
-
Restart the cancellation effort in the closest directly cancelled parent scope.
|
|
605
|
-
|
|
606
|
-
"""
|
|
607
|
-
scope = self._parent_scope
|
|
608
|
-
while scope is not None:
|
|
609
|
-
if scope._cancel_called:
|
|
610
|
-
if scope._cancel_handle is None:
|
|
611
|
-
scope._deliver_cancellation(scope)
|
|
612
|
-
|
|
613
|
-
break
|
|
614
|
-
|
|
615
|
-
# No point in looking beyond any shielded scope
|
|
616
|
-
if scope._shield:
|
|
617
|
-
break
|
|
618
|
-
|
|
619
|
-
scope = scope._parent_scope
|
|
620
|
-
|
|
621
|
-
def cancel(self, reason: str | None = None) -> None:
|
|
622
|
-
if not self._cancel_called:
|
|
623
|
-
if self._timeout_handle:
|
|
624
|
-
self._timeout_handle.cancel()
|
|
625
|
-
self._timeout_handle = None
|
|
626
|
-
|
|
627
|
-
self._cancel_called = True
|
|
628
|
-
self._cancel_reason = f"Cancelled via cancel scope {id(self):x}"
|
|
629
|
-
if task := current_task():
|
|
630
|
-
self._cancel_reason += f" by {task}"
|
|
631
|
-
|
|
632
|
-
if reason:
|
|
633
|
-
self._cancel_reason += f"; reason: {reason}"
|
|
634
|
-
|
|
635
|
-
if self._host_task is not None:
|
|
636
|
-
self._deliver_cancellation(self)
|
|
637
|
-
|
|
638
|
-
@property
|
|
639
|
-
def deadline(self) -> float:
|
|
640
|
-
return self._deadline
|
|
641
|
-
|
|
642
|
-
@deadline.setter
|
|
643
|
-
def deadline(self, value: float) -> None:
|
|
644
|
-
self._deadline = float(value)
|
|
645
|
-
if self._timeout_handle is not None:
|
|
646
|
-
self._timeout_handle.cancel()
|
|
647
|
-
self._timeout_handle = None
|
|
648
|
-
|
|
649
|
-
if self._active and not self._cancel_called:
|
|
650
|
-
self._timeout()
|
|
651
|
-
|
|
652
|
-
@property
|
|
653
|
-
def cancel_called(self) -> bool:
|
|
654
|
-
return self._cancel_called
|
|
655
|
-
|
|
656
|
-
@property
|
|
657
|
-
def cancelled_caught(self) -> bool:
|
|
658
|
-
return self._cancelled_caught
|
|
659
|
-
|
|
660
|
-
@property
|
|
661
|
-
def shield(self) -> bool:
|
|
662
|
-
return self._shield
|
|
663
|
-
|
|
664
|
-
@shield.setter
|
|
665
|
-
def shield(self, value: bool) -> None:
|
|
666
|
-
if self._shield != value:
|
|
667
|
-
self._shield = value
|
|
668
|
-
if not value:
|
|
669
|
-
self._restart_cancellation_in_parent()
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
#
|
|
673
|
-
# Task states
|
|
674
|
-
#
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
class TaskState:
|
|
678
|
-
"""
|
|
679
|
-
Encapsulates auxiliary task information that cannot be added to the Task instance
|
|
680
|
-
itself because there are no guarantees about its implementation.
|
|
681
|
-
"""
|
|
682
|
-
|
|
683
|
-
__slots__ = "parent_id", "cancel_scope", "__weakref__"
|
|
684
|
-
|
|
685
|
-
def __init__(self, parent_id: int | None, cancel_scope: CancelScope | None):
|
|
686
|
-
self.parent_id = parent_id
|
|
687
|
-
self.cancel_scope = cancel_scope
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
_task_states: WeakKeyDictionary[asyncio.Task, TaskState] = WeakKeyDictionary()
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
#
|
|
694
|
-
# Task groups
|
|
695
|
-
#
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
class _AsyncioTaskStatus(abc.TaskStatus):
|
|
699
|
-
def __init__(self, future: asyncio.Future, parent_id: int):
|
|
700
|
-
self._future = future
|
|
701
|
-
self._parent_id = parent_id
|
|
702
|
-
|
|
703
|
-
def started(self, value: T_contra | None = None) -> None:
|
|
704
|
-
try:
|
|
705
|
-
self._future.set_result(value)
|
|
706
|
-
except asyncio.InvalidStateError:
|
|
707
|
-
if not self._future.cancelled():
|
|
708
|
-
raise RuntimeError(
|
|
709
|
-
"called 'started' twice on the same task status"
|
|
710
|
-
) from None
|
|
711
|
-
|
|
712
|
-
task = cast(asyncio.Task, current_task())
|
|
713
|
-
_task_states[task].parent_id = self._parent_id
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
if sys.version_info >= (3, 12):
|
|
717
|
-
_eager_task_factory_code: CodeType | None = asyncio.eager_task_factory.__code__
|
|
718
|
-
else:
|
|
719
|
-
_eager_task_factory_code = None
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
class TaskGroup(abc.TaskGroup):
|
|
723
|
-
def __init__(self) -> None:
|
|
724
|
-
self.cancel_scope: CancelScope = CancelScope()
|
|
725
|
-
self._active = False
|
|
726
|
-
self._exceptions: list[BaseException] = []
|
|
727
|
-
self._tasks: set[asyncio.Task] = set()
|
|
728
|
-
self._on_completed_fut: asyncio.Future[None] | None = None
|
|
729
|
-
|
|
730
|
-
async def __aenter__(self) -> TaskGroup:
|
|
731
|
-
self.cancel_scope.__enter__()
|
|
732
|
-
self._active = True
|
|
733
|
-
return self
|
|
734
|
-
|
|
735
|
-
async def __aexit__(
|
|
736
|
-
self,
|
|
737
|
-
exc_type: type[BaseException] | None,
|
|
738
|
-
exc_val: BaseException | None,
|
|
739
|
-
exc_tb: TracebackType | None,
|
|
740
|
-
) -> bool:
|
|
741
|
-
try:
|
|
742
|
-
if exc_val is not None:
|
|
743
|
-
self.cancel_scope.cancel()
|
|
744
|
-
if not isinstance(exc_val, CancelledError):
|
|
745
|
-
self._exceptions.append(exc_val)
|
|
746
|
-
|
|
747
|
-
loop = get_running_loop()
|
|
748
|
-
try:
|
|
749
|
-
if self._tasks:
|
|
750
|
-
with CancelScope() as wait_scope:
|
|
751
|
-
while self._tasks:
|
|
752
|
-
self._on_completed_fut = loop.create_future()
|
|
753
|
-
|
|
754
|
-
try:
|
|
755
|
-
await self._on_completed_fut
|
|
756
|
-
except CancelledError as exc:
|
|
757
|
-
# Shield the scope against further cancellation attempts,
|
|
758
|
-
# as they're not productive (#695)
|
|
759
|
-
wait_scope.shield = True
|
|
760
|
-
self.cancel_scope.cancel()
|
|
761
|
-
|
|
762
|
-
# Set exc_val from the cancellation exception if it was
|
|
763
|
-
# previously unset. However, we should not replace a native
|
|
764
|
-
# cancellation exception with one raise by a cancel scope.
|
|
765
|
-
if exc_val is None or (
|
|
766
|
-
isinstance(exc_val, CancelledError)
|
|
767
|
-
and not is_anyio_cancellation(exc)
|
|
768
|
-
):
|
|
769
|
-
exc_val = exc
|
|
770
|
-
|
|
771
|
-
self._on_completed_fut = None
|
|
772
|
-
else:
|
|
773
|
-
# If there are no child tasks to wait on, run at least one checkpoint
|
|
774
|
-
# anyway
|
|
775
|
-
await AsyncIOBackend.cancel_shielded_checkpoint()
|
|
776
|
-
|
|
777
|
-
self._active = False
|
|
778
|
-
if self._exceptions:
|
|
779
|
-
# The exception that got us here should already have been
|
|
780
|
-
# added to self._exceptions so it's ok to break exception
|
|
781
|
-
# chaining and avoid adding a "During handling of above..."
|
|
782
|
-
# for each nesting level.
|
|
783
|
-
raise BaseExceptionGroup(
|
|
784
|
-
"unhandled errors in a TaskGroup", self._exceptions
|
|
785
|
-
) from None
|
|
786
|
-
elif exc_val:
|
|
787
|
-
raise exc_val
|
|
788
|
-
except BaseException as exc:
|
|
789
|
-
if self.cancel_scope.__exit__(type(exc), exc, exc.__traceback__):
|
|
790
|
-
return True
|
|
791
|
-
|
|
792
|
-
raise
|
|
793
|
-
|
|
794
|
-
return self.cancel_scope.__exit__(exc_type, exc_val, exc_tb)
|
|
795
|
-
finally:
|
|
796
|
-
del exc_val, exc_tb, self._exceptions
|
|
797
|
-
|
|
798
|
-
def _spawn(
|
|
799
|
-
self,
|
|
800
|
-
func: Callable[[Unpack[PosArgsT]], Awaitable[Any]],
|
|
801
|
-
args: tuple[Unpack[PosArgsT]],
|
|
802
|
-
name: object,
|
|
803
|
-
task_status_future: asyncio.Future | None = None,
|
|
804
|
-
) -> asyncio.Task:
|
|
805
|
-
def task_done(_task: asyncio.Task) -> None:
|
|
806
|
-
if sys.version_info >= (3, 14) and self.cancel_scope._host_task is not None:
|
|
807
|
-
asyncio.future_discard_from_awaited_by(
|
|
808
|
-
_task, self.cancel_scope._host_task
|
|
809
|
-
)
|
|
810
|
-
|
|
811
|
-
task_state = _task_states[_task]
|
|
812
|
-
assert task_state.cancel_scope is not None
|
|
813
|
-
assert _task in task_state.cancel_scope._tasks
|
|
814
|
-
task_state.cancel_scope._tasks.remove(_task)
|
|
815
|
-
self._tasks.remove(task)
|
|
816
|
-
del _task_states[_task]
|
|
817
|
-
|
|
818
|
-
if self._on_completed_fut is not None and not self._tasks:
|
|
819
|
-
try:
|
|
820
|
-
self._on_completed_fut.set_result(None)
|
|
821
|
-
except asyncio.InvalidStateError:
|
|
822
|
-
pass
|
|
823
|
-
|
|
824
|
-
try:
|
|
825
|
-
exc = _task.exception()
|
|
826
|
-
except CancelledError as e:
|
|
827
|
-
while isinstance(e.__context__, CancelledError):
|
|
828
|
-
e = e.__context__
|
|
829
|
-
|
|
830
|
-
exc = e
|
|
831
|
-
|
|
832
|
-
if exc is not None:
|
|
833
|
-
# The future can only be in the cancelled state if the host task was
|
|
834
|
-
# cancelled, so return immediately instead of adding one more
|
|
835
|
-
# CancelledError to the exceptions list
|
|
836
|
-
if task_status_future is not None and task_status_future.cancelled():
|
|
837
|
-
return
|
|
838
|
-
|
|
839
|
-
if task_status_future is None or task_status_future.done():
|
|
840
|
-
if not isinstance(exc, CancelledError):
|
|
841
|
-
self._exceptions.append(exc)
|
|
842
|
-
|
|
843
|
-
if not self.cancel_scope._effectively_cancelled:
|
|
844
|
-
self.cancel_scope.cancel()
|
|
845
|
-
else:
|
|
846
|
-
task_status_future.set_exception(exc)
|
|
847
|
-
elif task_status_future is not None and not task_status_future.done():
|
|
848
|
-
task_status_future.set_exception(
|
|
849
|
-
RuntimeError("Child exited without calling task_status.started()")
|
|
850
|
-
)
|
|
851
|
-
|
|
852
|
-
if not self._active:
|
|
853
|
-
raise RuntimeError(
|
|
854
|
-
"This task group is not active; no new tasks can be started."
|
|
855
|
-
)
|
|
856
|
-
|
|
857
|
-
kwargs = {}
|
|
858
|
-
if task_status_future:
|
|
859
|
-
parent_id = id(current_task())
|
|
860
|
-
kwargs["task_status"] = _AsyncioTaskStatus(
|
|
861
|
-
task_status_future, id(self.cancel_scope._host_task)
|
|
862
|
-
)
|
|
863
|
-
else:
|
|
864
|
-
parent_id = id(self.cancel_scope._host_task)
|
|
865
|
-
|
|
866
|
-
coro = func(*args, **kwargs)
|
|
867
|
-
if not iscoroutine(coro):
|
|
868
|
-
prefix = f"{func.__module__}." if hasattr(func, "__module__") else ""
|
|
869
|
-
raise TypeError(
|
|
870
|
-
f"Expected {prefix}{func.__qualname__}() to return a coroutine, but "
|
|
871
|
-
f"the return value ({coro!r}) is not a coroutine object"
|
|
872
|
-
)
|
|
873
|
-
|
|
874
|
-
name = get_callable_name(func) if name is None else str(name)
|
|
875
|
-
loop = asyncio.get_running_loop()
|
|
876
|
-
if (
|
|
877
|
-
(factory := loop.get_task_factory())
|
|
878
|
-
and getattr(factory, "__code__", None) is _eager_task_factory_code
|
|
879
|
-
and (closure := getattr(factory, "__closure__", None))
|
|
880
|
-
):
|
|
881
|
-
custom_task_constructor = closure[0].cell_contents
|
|
882
|
-
task = custom_task_constructor(coro, loop=loop, name=name)
|
|
883
|
-
else:
|
|
884
|
-
task = create_task(coro, name=name)
|
|
885
|
-
|
|
886
|
-
# Make the spawned task inherit the task group's cancel scope
|
|
887
|
-
_task_states[task] = TaskState(
|
|
888
|
-
parent_id=parent_id, cancel_scope=self.cancel_scope
|
|
889
|
-
)
|
|
890
|
-
self.cancel_scope._tasks.add(task)
|
|
891
|
-
self._tasks.add(task)
|
|
892
|
-
if sys.version_info >= (3, 14) and self.cancel_scope._host_task is not None:
|
|
893
|
-
asyncio.future_add_to_awaited_by(task, self.cancel_scope._host_task)
|
|
894
|
-
|
|
895
|
-
task.add_done_callback(task_done)
|
|
896
|
-
return task
|
|
897
|
-
|
|
898
|
-
def start_soon(
|
|
899
|
-
self,
|
|
900
|
-
func: Callable[[Unpack[PosArgsT]], Awaitable[Any]],
|
|
901
|
-
*args: Unpack[PosArgsT],
|
|
902
|
-
name: object = None,
|
|
903
|
-
) -> None:
|
|
904
|
-
self._spawn(func, args, name)
|
|
905
|
-
|
|
906
|
-
async def start(
|
|
907
|
-
self, func: Callable[..., Awaitable[Any]], *args: object, name: object = None
|
|
908
|
-
) -> Any:
|
|
909
|
-
future: asyncio.Future = asyncio.Future()
|
|
910
|
-
task = self._spawn(func, args, name, future)
|
|
911
|
-
|
|
912
|
-
# If the task raises an exception after sending a start value without a switch
|
|
913
|
-
# point between, the task group is cancelled and this method never proceeds to
|
|
914
|
-
# process the completed future. That's why we have to have a shielded cancel
|
|
915
|
-
# scope here.
|
|
916
|
-
try:
|
|
917
|
-
return await future
|
|
918
|
-
except CancelledError:
|
|
919
|
-
# Cancel the task and wait for it to exit before returning
|
|
920
|
-
task.cancel()
|
|
921
|
-
with CancelScope(shield=True), suppress(CancelledError):
|
|
922
|
-
await task
|
|
923
|
-
|
|
924
|
-
raise
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
#
|
|
928
|
-
# Threads
|
|
929
|
-
#
|
|
930
|
-
|
|
931
|
-
_Retval_Queue_Type = tuple[Optional[T_Retval], Optional[BaseException]]
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
class WorkerThread(Thread):
|
|
935
|
-
MAX_IDLE_TIME = 10 # seconds
|
|
936
|
-
|
|
937
|
-
def __init__(
|
|
938
|
-
self,
|
|
939
|
-
root_task: asyncio.Task,
|
|
940
|
-
workers: set[WorkerThread],
|
|
941
|
-
idle_workers: deque[WorkerThread],
|
|
942
|
-
):
|
|
943
|
-
super().__init__(name="AnyIO worker thread")
|
|
944
|
-
self.root_task = root_task
|
|
945
|
-
self.workers = workers
|
|
946
|
-
self.idle_workers = idle_workers
|
|
947
|
-
self.loop = root_task._loop
|
|
948
|
-
self.queue: Queue[
|
|
949
|
-
tuple[Context, Callable, tuple, asyncio.Future, CancelScope] | None
|
|
950
|
-
] = Queue(2)
|
|
951
|
-
self.idle_since = AsyncIOBackend.current_time()
|
|
952
|
-
self.stopping = False
|
|
953
|
-
|
|
954
|
-
def _report_result(
|
|
955
|
-
self, future: asyncio.Future, result: Any, exc: BaseException | None
|
|
956
|
-
) -> None:
|
|
957
|
-
self.idle_since = AsyncIOBackend.current_time()
|
|
958
|
-
if not self.stopping:
|
|
959
|
-
self.idle_workers.append(self)
|
|
960
|
-
|
|
961
|
-
if not future.cancelled():
|
|
962
|
-
if exc is not None:
|
|
963
|
-
if isinstance(exc, StopIteration):
|
|
964
|
-
new_exc = RuntimeError("coroutine raised StopIteration")
|
|
965
|
-
new_exc.__cause__ = exc
|
|
966
|
-
exc = new_exc
|
|
967
|
-
|
|
968
|
-
future.set_exception(exc)
|
|
969
|
-
else:
|
|
970
|
-
future.set_result(result)
|
|
971
|
-
|
|
972
|
-
def run(self) -> None:
|
|
973
|
-
with claim_worker_thread(AsyncIOBackend, self.loop):
|
|
974
|
-
while True:
|
|
975
|
-
item = self.queue.get()
|
|
976
|
-
if item is None:
|
|
977
|
-
# Shutdown command received
|
|
978
|
-
return
|
|
979
|
-
|
|
980
|
-
context, func, args, future, cancel_scope = item
|
|
981
|
-
if not future.cancelled():
|
|
982
|
-
result = None
|
|
983
|
-
exception: BaseException | None = None
|
|
984
|
-
threadlocals.current_cancel_scope = cancel_scope
|
|
985
|
-
try:
|
|
986
|
-
result = context.run(func, *args)
|
|
987
|
-
except BaseException as exc:
|
|
988
|
-
exception = exc
|
|
989
|
-
finally:
|
|
990
|
-
del threadlocals.current_cancel_scope
|
|
991
|
-
|
|
992
|
-
if not self.loop.is_closed():
|
|
993
|
-
self.loop.call_soon_threadsafe(
|
|
994
|
-
self._report_result, future, result, exception
|
|
995
|
-
)
|
|
996
|
-
|
|
997
|
-
del result, exception
|
|
998
|
-
|
|
999
|
-
self.queue.task_done()
|
|
1000
|
-
del item, context, func, args, future, cancel_scope
|
|
1001
|
-
|
|
1002
|
-
def stop(self, f: asyncio.Task | None = None) -> None:
|
|
1003
|
-
self.stopping = True
|
|
1004
|
-
self.queue.put_nowait(None)
|
|
1005
|
-
self.workers.discard(self)
|
|
1006
|
-
try:
|
|
1007
|
-
self.idle_workers.remove(self)
|
|
1008
|
-
except ValueError:
|
|
1009
|
-
pass
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
_threadpool_idle_workers: RunVar[deque[WorkerThread]] = RunVar(
|
|
1013
|
-
"_threadpool_idle_workers"
|
|
1014
|
-
)
|
|
1015
|
-
_threadpool_workers: RunVar[set[WorkerThread]] = RunVar("_threadpool_workers")
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
class BlockingPortal(abc.BlockingPortal):
|
|
1019
|
-
def __new__(cls) -> BlockingPortal:
|
|
1020
|
-
return object.__new__(cls)
|
|
1021
|
-
|
|
1022
|
-
def __init__(self) -> None:
|
|
1023
|
-
super().__init__()
|
|
1024
|
-
self._loop = get_running_loop()
|
|
1025
|
-
|
|
1026
|
-
def _spawn_task_from_thread(
|
|
1027
|
-
self,
|
|
1028
|
-
func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval] | T_Retval],
|
|
1029
|
-
args: tuple[Unpack[PosArgsT]],
|
|
1030
|
-
kwargs: dict[str, Any],
|
|
1031
|
-
name: object,
|
|
1032
|
-
future: Future[T_Retval],
|
|
1033
|
-
) -> None:
|
|
1034
|
-
AsyncIOBackend.run_sync_from_thread(
|
|
1035
|
-
partial(self._task_group.start_soon, name=name),
|
|
1036
|
-
(self._call_func, func, args, kwargs, future),
|
|
1037
|
-
self._loop,
|
|
1038
|
-
)
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
#
|
|
1042
|
-
# Subprocesses
|
|
1043
|
-
#
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
@dataclass(eq=False)
|
|
1047
|
-
class StreamReaderWrapper(abc.ByteReceiveStream):
|
|
1048
|
-
_stream: asyncio.StreamReader
|
|
1049
|
-
|
|
1050
|
-
async def receive(self, max_bytes: int = 65536) -> bytes:
|
|
1051
|
-
data = await self._stream.read(max_bytes)
|
|
1052
|
-
if data:
|
|
1053
|
-
return data
|
|
1054
|
-
else:
|
|
1055
|
-
raise EndOfStream
|
|
1056
|
-
|
|
1057
|
-
async def aclose(self) -> None:
|
|
1058
|
-
self._stream.set_exception(ClosedResourceError())
|
|
1059
|
-
await AsyncIOBackend.checkpoint()
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
@dataclass(eq=False)
|
|
1063
|
-
class StreamWriterWrapper(abc.ByteSendStream):
|
|
1064
|
-
_stream: asyncio.StreamWriter
|
|
1065
|
-
_closed: bool = field(init=False, default=False)
|
|
1066
|
-
|
|
1067
|
-
async def send(self, item: bytes) -> None:
|
|
1068
|
-
await AsyncIOBackend.checkpoint_if_cancelled()
|
|
1069
|
-
stream_paused = self._stream._protocol._paused # type: ignore[attr-defined]
|
|
1070
|
-
try:
|
|
1071
|
-
self._stream.write(item)
|
|
1072
|
-
await self._stream.drain()
|
|
1073
|
-
except (ConnectionResetError, BrokenPipeError, RuntimeError) as exc:
|
|
1074
|
-
# If closed by us and/or the peer:
|
|
1075
|
-
# * on stdlib, drain() raises ConnectionResetError or BrokenPipeError
|
|
1076
|
-
# * on uvloop and Winloop, write() eventually starts raising RuntimeError
|
|
1077
|
-
if self._closed:
|
|
1078
|
-
raise ClosedResourceError from exc
|
|
1079
|
-
elif self._stream.is_closing():
|
|
1080
|
-
raise BrokenResourceError from exc
|
|
1081
|
-
|
|
1082
|
-
raise
|
|
1083
|
-
|
|
1084
|
-
if not stream_paused:
|
|
1085
|
-
await AsyncIOBackend.cancel_shielded_checkpoint()
|
|
1086
|
-
|
|
1087
|
-
async def aclose(self) -> None:
|
|
1088
|
-
self._closed = True
|
|
1089
|
-
self._stream.close()
|
|
1090
|
-
await AsyncIOBackend.checkpoint()
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
@dataclass(eq=False)
|
|
1094
|
-
class Process(abc.Process):
|
|
1095
|
-
_process: asyncio.subprocess.Process
|
|
1096
|
-
_stdin: StreamWriterWrapper | None
|
|
1097
|
-
_stdout: StreamReaderWrapper | None
|
|
1098
|
-
_stderr: StreamReaderWrapper | None
|
|
1099
|
-
|
|
1100
|
-
async def aclose(self) -> None:
|
|
1101
|
-
with CancelScope(shield=True) as scope:
|
|
1102
|
-
if self._stdin:
|
|
1103
|
-
await self._stdin.aclose()
|
|
1104
|
-
if self._stdout:
|
|
1105
|
-
await self._stdout.aclose()
|
|
1106
|
-
if self._stderr:
|
|
1107
|
-
await self._stderr.aclose()
|
|
1108
|
-
|
|
1109
|
-
scope.shield = False
|
|
1110
|
-
try:
|
|
1111
|
-
await self.wait()
|
|
1112
|
-
except BaseException:
|
|
1113
|
-
scope.shield = True
|
|
1114
|
-
self.kill()
|
|
1115
|
-
await self.wait()
|
|
1116
|
-
raise
|
|
1117
|
-
|
|
1118
|
-
async def wait(self) -> int:
|
|
1119
|
-
return await self._process.wait()
|
|
1120
|
-
|
|
1121
|
-
def terminate(self) -> None:
|
|
1122
|
-
self._process.terminate()
|
|
1123
|
-
|
|
1124
|
-
def kill(self) -> None:
|
|
1125
|
-
self._process.kill()
|
|
1126
|
-
|
|
1127
|
-
def send_signal(self, signal: int) -> None:
|
|
1128
|
-
self._process.send_signal(signal)
|
|
1129
|
-
|
|
1130
|
-
@property
|
|
1131
|
-
def pid(self) -> int:
|
|
1132
|
-
return self._process.pid
|
|
1133
|
-
|
|
1134
|
-
@property
|
|
1135
|
-
def returncode(self) -> int | None:
|
|
1136
|
-
return self._process.returncode
|
|
1137
|
-
|
|
1138
|
-
@property
|
|
1139
|
-
def stdin(self) -> abc.ByteSendStream | None:
|
|
1140
|
-
return self._stdin
|
|
1141
|
-
|
|
1142
|
-
@property
|
|
1143
|
-
def stdout(self) -> abc.ByteReceiveStream | None:
|
|
1144
|
-
return self._stdout
|
|
1145
|
-
|
|
1146
|
-
@property
|
|
1147
|
-
def stderr(self) -> abc.ByteReceiveStream | None:
|
|
1148
|
-
return self._stderr
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
def _forcibly_shutdown_process_pool_on_exit(
|
|
1152
|
-
workers: set[Process], _task: object
|
|
1153
|
-
) -> None:
|
|
1154
|
-
"""
|
|
1155
|
-
Forcibly shuts down worker processes belonging to this event loop."""
|
|
1156
|
-
child_watcher: asyncio.AbstractChildWatcher | None = None # type: ignore[name-defined]
|
|
1157
|
-
if sys.version_info < (3, 12):
|
|
1158
|
-
try:
|
|
1159
|
-
child_watcher = asyncio.get_event_loop_policy().get_child_watcher()
|
|
1160
|
-
except NotImplementedError:
|
|
1161
|
-
pass
|
|
1162
|
-
|
|
1163
|
-
# Close as much as possible (w/o async/await) to avoid warnings
|
|
1164
|
-
for process in workers.copy():
|
|
1165
|
-
if process.returncode is None:
|
|
1166
|
-
continue
|
|
1167
|
-
|
|
1168
|
-
process._stdin._stream._transport.close() # type: ignore[union-attr]
|
|
1169
|
-
process._stdout._stream._transport.close() # type: ignore[union-attr]
|
|
1170
|
-
process._stderr._stream._transport.close() # type: ignore[union-attr]
|
|
1171
|
-
process.kill()
|
|
1172
|
-
if child_watcher:
|
|
1173
|
-
child_watcher.remove_child_handler(process.pid)
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
async def _shutdown_process_pool_on_exit(workers: set[abc.Process]) -> None:
|
|
1177
|
-
"""
|
|
1178
|
-
Shuts down worker processes belonging to this event loop.
|
|
1179
|
-
|
|
1180
|
-
NOTE: this only works when the event loop was started using asyncio.run() or
|
|
1181
|
-
anyio.run().
|
|
1182
|
-
|
|
1183
|
-
"""
|
|
1184
|
-
process: abc.Process
|
|
1185
|
-
try:
|
|
1186
|
-
await sleep(math.inf)
|
|
1187
|
-
except asyncio.CancelledError:
|
|
1188
|
-
workers = workers.copy()
|
|
1189
|
-
for process in workers:
|
|
1190
|
-
if process.returncode is None:
|
|
1191
|
-
process.kill()
|
|
1192
|
-
|
|
1193
|
-
for process in workers:
|
|
1194
|
-
await process.aclose()
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
#
|
|
1198
|
-
# Sockets and networking
|
|
1199
|
-
#
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
class StreamProtocol(asyncio.Protocol):
|
|
1203
|
-
read_queue: deque[bytes]
|
|
1204
|
-
read_event: asyncio.Event
|
|
1205
|
-
write_event: asyncio.Event
|
|
1206
|
-
exception: Exception | None = None
|
|
1207
|
-
is_at_eof: bool = False
|
|
1208
|
-
|
|
1209
|
-
def connection_made(self, transport: asyncio.BaseTransport) -> None:
|
|
1210
|
-
self.read_queue = deque()
|
|
1211
|
-
self.read_event = asyncio.Event()
|
|
1212
|
-
self.write_event = asyncio.Event()
|
|
1213
|
-
self.write_event.set()
|
|
1214
|
-
cast(asyncio.Transport, transport).set_write_buffer_limits(0)
|
|
1215
|
-
|
|
1216
|
-
def connection_lost(self, exc: Exception | None) -> None:
|
|
1217
|
-
if exc:
|
|
1218
|
-
self.exception = BrokenResourceError()
|
|
1219
|
-
self.exception.__cause__ = exc
|
|
1220
|
-
|
|
1221
|
-
self.read_event.set()
|
|
1222
|
-
self.write_event.set()
|
|
1223
|
-
|
|
1224
|
-
def data_received(self, data: bytes) -> None:
|
|
1225
|
-
# ProactorEventloop sometimes sends bytearray instead of bytes
|
|
1226
|
-
self.read_queue.append(bytes(data))
|
|
1227
|
-
self.read_event.set()
|
|
1228
|
-
|
|
1229
|
-
def eof_received(self) -> bool | None:
|
|
1230
|
-
self.is_at_eof = True
|
|
1231
|
-
self.read_event.set()
|
|
1232
|
-
return True
|
|
1233
|
-
|
|
1234
|
-
def pause_writing(self) -> None:
|
|
1235
|
-
self.write_event = asyncio.Event()
|
|
1236
|
-
|
|
1237
|
-
def resume_writing(self) -> None:
|
|
1238
|
-
self.write_event.set()
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
class DatagramProtocol(asyncio.DatagramProtocol):
|
|
1242
|
-
read_queue: deque[tuple[bytes, IPSockAddrType]]
|
|
1243
|
-
read_event: asyncio.Event
|
|
1244
|
-
write_event: asyncio.Event
|
|
1245
|
-
exception: Exception | None = None
|
|
1246
|
-
|
|
1247
|
-
def connection_made(self, transport: asyncio.BaseTransport) -> None:
|
|
1248
|
-
self.read_queue = deque(maxlen=100) # arbitrary value
|
|
1249
|
-
self.read_event = asyncio.Event()
|
|
1250
|
-
self.write_event = asyncio.Event()
|
|
1251
|
-
self.write_event.set()
|
|
1252
|
-
|
|
1253
|
-
def connection_lost(self, exc: Exception | None) -> None:
|
|
1254
|
-
self.read_event.set()
|
|
1255
|
-
self.write_event.set()
|
|
1256
|
-
|
|
1257
|
-
def datagram_received(self, data: bytes, addr: IPSockAddrType) -> None:
|
|
1258
|
-
addr = convert_ipv6_sockaddr(addr)
|
|
1259
|
-
self.read_queue.append((data, addr))
|
|
1260
|
-
self.read_event.set()
|
|
1261
|
-
|
|
1262
|
-
def error_received(self, exc: Exception) -> None:
|
|
1263
|
-
self.exception = exc
|
|
1264
|
-
|
|
1265
|
-
def pause_writing(self) -> None:
|
|
1266
|
-
self.write_event.clear()
|
|
1267
|
-
|
|
1268
|
-
def resume_writing(self) -> None:
|
|
1269
|
-
self.write_event.set()
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
class SocketStream(abc.SocketStream):
|
|
1273
|
-
def __init__(self, transport: asyncio.Transport, protocol: StreamProtocol):
|
|
1274
|
-
self._transport = transport
|
|
1275
|
-
self._protocol = protocol
|
|
1276
|
-
self._receive_guard = ResourceGuard("reading from")
|
|
1277
|
-
self._send_guard = ResourceGuard("writing to")
|
|
1278
|
-
self._closed = False
|
|
1279
|
-
|
|
1280
|
-
@property
|
|
1281
|
-
def _raw_socket(self) -> socket.socket:
|
|
1282
|
-
return self._transport.get_extra_info("socket")
|
|
1283
|
-
|
|
1284
|
-
async def receive(self, max_bytes: int = 65536) -> bytes:
|
|
1285
|
-
with self._receive_guard:
|
|
1286
|
-
if (
|
|
1287
|
-
not self._protocol.read_event.is_set()
|
|
1288
|
-
and not self._transport.is_closing()
|
|
1289
|
-
and not self._protocol.is_at_eof
|
|
1290
|
-
):
|
|
1291
|
-
self._transport.resume_reading()
|
|
1292
|
-
await self._protocol.read_event.wait()
|
|
1293
|
-
self._transport.pause_reading()
|
|
1294
|
-
else:
|
|
1295
|
-
await AsyncIOBackend.checkpoint()
|
|
1296
|
-
|
|
1297
|
-
try:
|
|
1298
|
-
chunk = self._protocol.read_queue.popleft()
|
|
1299
|
-
except IndexError:
|
|
1300
|
-
if self._closed:
|
|
1301
|
-
raise ClosedResourceError from None
|
|
1302
|
-
elif self._protocol.exception:
|
|
1303
|
-
raise self._protocol.exception from None
|
|
1304
|
-
else:
|
|
1305
|
-
raise EndOfStream from None
|
|
1306
|
-
|
|
1307
|
-
if len(chunk) > max_bytes:
|
|
1308
|
-
# Split the oversized chunk
|
|
1309
|
-
chunk, leftover = chunk[:max_bytes], chunk[max_bytes:]
|
|
1310
|
-
self._protocol.read_queue.appendleft(leftover)
|
|
1311
|
-
|
|
1312
|
-
# If the read queue is empty, clear the flag so that the next call will
|
|
1313
|
-
# block until data is available
|
|
1314
|
-
if not self._protocol.read_queue:
|
|
1315
|
-
self._protocol.read_event.clear()
|
|
1316
|
-
|
|
1317
|
-
return chunk
|
|
1318
|
-
|
|
1319
|
-
async def send(self, item: bytes) -> None:
|
|
1320
|
-
with self._send_guard:
|
|
1321
|
-
await AsyncIOBackend.checkpoint()
|
|
1322
|
-
|
|
1323
|
-
if self._closed:
|
|
1324
|
-
raise ClosedResourceError
|
|
1325
|
-
elif self._protocol.exception is not None:
|
|
1326
|
-
raise self._protocol.exception
|
|
1327
|
-
|
|
1328
|
-
try:
|
|
1329
|
-
self._transport.write(item)
|
|
1330
|
-
except RuntimeError as exc:
|
|
1331
|
-
if self._transport.is_closing():
|
|
1332
|
-
raise BrokenResourceError from exc
|
|
1333
|
-
else:
|
|
1334
|
-
raise
|
|
1335
|
-
|
|
1336
|
-
await self._protocol.write_event.wait()
|
|
1337
|
-
|
|
1338
|
-
async def send_eof(self) -> None:
|
|
1339
|
-
try:
|
|
1340
|
-
self._transport.write_eof()
|
|
1341
|
-
except OSError:
|
|
1342
|
-
pass
|
|
1343
|
-
|
|
1344
|
-
async def aclose(self) -> None:
|
|
1345
|
-
self._closed = True
|
|
1346
|
-
if not self._transport.is_closing():
|
|
1347
|
-
try:
|
|
1348
|
-
self._transport.write_eof()
|
|
1349
|
-
except OSError:
|
|
1350
|
-
pass
|
|
1351
|
-
|
|
1352
|
-
self._transport.close()
|
|
1353
|
-
await sleep(0)
|
|
1354
|
-
self._transport.abort()
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
class _RawSocketMixin:
|
|
1358
|
-
_receive_future: asyncio.Future | None = None
|
|
1359
|
-
_send_future: asyncio.Future | None = None
|
|
1360
|
-
_closing = False
|
|
1361
|
-
|
|
1362
|
-
def __init__(self, raw_socket: socket.socket):
|
|
1363
|
-
self.__raw_socket = raw_socket
|
|
1364
|
-
self._receive_guard = ResourceGuard("reading from")
|
|
1365
|
-
self._send_guard = ResourceGuard("writing to")
|
|
1366
|
-
|
|
1367
|
-
@property
|
|
1368
|
-
def _raw_socket(self) -> socket.socket:
|
|
1369
|
-
return self.__raw_socket
|
|
1370
|
-
|
|
1371
|
-
def _wait_until_readable(self, loop: asyncio.AbstractEventLoop) -> asyncio.Future:
|
|
1372
|
-
def callback(f: object) -> None:
|
|
1373
|
-
del self._receive_future
|
|
1374
|
-
loop.remove_reader(self.__raw_socket)
|
|
1375
|
-
|
|
1376
|
-
f = self._receive_future = asyncio.Future()
|
|
1377
|
-
loop.add_reader(self.__raw_socket, f.set_result, None)
|
|
1378
|
-
f.add_done_callback(callback)
|
|
1379
|
-
return f
|
|
1380
|
-
|
|
1381
|
-
def _wait_until_writable(self, loop: asyncio.AbstractEventLoop) -> asyncio.Future:
|
|
1382
|
-
def callback(f: object) -> None:
|
|
1383
|
-
del self._send_future
|
|
1384
|
-
loop.remove_writer(self.__raw_socket)
|
|
1385
|
-
|
|
1386
|
-
f = self._send_future = asyncio.Future()
|
|
1387
|
-
loop.add_writer(self.__raw_socket, f.set_result, None)
|
|
1388
|
-
f.add_done_callback(callback)
|
|
1389
|
-
return f
|
|
1390
|
-
|
|
1391
|
-
async def aclose(self) -> None:
|
|
1392
|
-
if not self._closing:
|
|
1393
|
-
self._closing = True
|
|
1394
|
-
if self.__raw_socket.fileno() != -1:
|
|
1395
|
-
self.__raw_socket.close()
|
|
1396
|
-
|
|
1397
|
-
if self._receive_future:
|
|
1398
|
-
self._receive_future.set_result(None)
|
|
1399
|
-
if self._send_future:
|
|
1400
|
-
self._send_future.set_result(None)
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
class UNIXSocketStream(_RawSocketMixin, abc.UNIXSocketStream):
|
|
1404
|
-
async def send_eof(self) -> None:
|
|
1405
|
-
with self._send_guard:
|
|
1406
|
-
self._raw_socket.shutdown(socket.SHUT_WR)
|
|
1407
|
-
|
|
1408
|
-
async def receive(self, max_bytes: int = 65536) -> bytes:
|
|
1409
|
-
loop = get_running_loop()
|
|
1410
|
-
await AsyncIOBackend.checkpoint()
|
|
1411
|
-
with self._receive_guard:
|
|
1412
|
-
while True:
|
|
1413
|
-
try:
|
|
1414
|
-
data = self._raw_socket.recv(max_bytes)
|
|
1415
|
-
except BlockingIOError:
|
|
1416
|
-
await self._wait_until_readable(loop)
|
|
1417
|
-
except OSError as exc:
|
|
1418
|
-
if self._closing:
|
|
1419
|
-
raise ClosedResourceError from None
|
|
1420
|
-
else:
|
|
1421
|
-
raise BrokenResourceError from exc
|
|
1422
|
-
else:
|
|
1423
|
-
if not data:
|
|
1424
|
-
raise EndOfStream
|
|
1425
|
-
|
|
1426
|
-
return data
|
|
1427
|
-
|
|
1428
|
-
async def send(self, item: bytes) -> None:
|
|
1429
|
-
loop = get_running_loop()
|
|
1430
|
-
await AsyncIOBackend.checkpoint()
|
|
1431
|
-
with self._send_guard:
|
|
1432
|
-
view = memoryview(item)
|
|
1433
|
-
while view:
|
|
1434
|
-
try:
|
|
1435
|
-
bytes_sent = self._raw_socket.send(view)
|
|
1436
|
-
except BlockingIOError:
|
|
1437
|
-
await self._wait_until_writable(loop)
|
|
1438
|
-
except OSError as exc:
|
|
1439
|
-
if self._closing:
|
|
1440
|
-
raise ClosedResourceError from None
|
|
1441
|
-
else:
|
|
1442
|
-
raise BrokenResourceError from exc
|
|
1443
|
-
else:
|
|
1444
|
-
view = view[bytes_sent:]
|
|
1445
|
-
|
|
1446
|
-
async def receive_fds(self, msglen: int, maxfds: int) -> tuple[bytes, list[int]]:
|
|
1447
|
-
if not isinstance(msglen, int) or msglen < 0:
|
|
1448
|
-
raise ValueError("msglen must be a non-negative integer")
|
|
1449
|
-
if not isinstance(maxfds, int) or maxfds < 1:
|
|
1450
|
-
raise ValueError("maxfds must be a positive integer")
|
|
1451
|
-
|
|
1452
|
-
loop = get_running_loop()
|
|
1453
|
-
fds = array.array("i")
|
|
1454
|
-
await AsyncIOBackend.checkpoint()
|
|
1455
|
-
with self._receive_guard:
|
|
1456
|
-
while True:
|
|
1457
|
-
try:
|
|
1458
|
-
message, ancdata, flags, addr = self._raw_socket.recvmsg(
|
|
1459
|
-
msglen, socket.CMSG_LEN(maxfds * fds.itemsize)
|
|
1460
|
-
)
|
|
1461
|
-
except BlockingIOError:
|
|
1462
|
-
await self._wait_until_readable(loop)
|
|
1463
|
-
except OSError as exc:
|
|
1464
|
-
if self._closing:
|
|
1465
|
-
raise ClosedResourceError from None
|
|
1466
|
-
else:
|
|
1467
|
-
raise BrokenResourceError from exc
|
|
1468
|
-
else:
|
|
1469
|
-
if not message and not ancdata:
|
|
1470
|
-
raise EndOfStream
|
|
1471
|
-
|
|
1472
|
-
break
|
|
1473
|
-
|
|
1474
|
-
for cmsg_level, cmsg_type, cmsg_data in ancdata:
|
|
1475
|
-
if cmsg_level != socket.SOL_SOCKET or cmsg_type != socket.SCM_RIGHTS:
|
|
1476
|
-
raise RuntimeError(
|
|
1477
|
-
f"Received unexpected ancillary data; message = {message!r}, "
|
|
1478
|
-
f"cmsg_level = {cmsg_level}, cmsg_type = {cmsg_type}"
|
|
1479
|
-
)
|
|
1480
|
-
|
|
1481
|
-
fds.frombytes(cmsg_data[: len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
|
|
1482
|
-
|
|
1483
|
-
return message, list(fds)
|
|
1484
|
-
|
|
1485
|
-
async def send_fds(self, message: bytes, fds: Collection[int | IOBase]) -> None:
|
|
1486
|
-
if not message:
|
|
1487
|
-
raise ValueError("message must not be empty")
|
|
1488
|
-
if not fds:
|
|
1489
|
-
raise ValueError("fds must not be empty")
|
|
1490
|
-
|
|
1491
|
-
loop = get_running_loop()
|
|
1492
|
-
filenos: list[int] = []
|
|
1493
|
-
for fd in fds:
|
|
1494
|
-
if isinstance(fd, int):
|
|
1495
|
-
filenos.append(fd)
|
|
1496
|
-
elif isinstance(fd, IOBase):
|
|
1497
|
-
filenos.append(fd.fileno())
|
|
1498
|
-
|
|
1499
|
-
fdarray = array.array("i", filenos)
|
|
1500
|
-
await AsyncIOBackend.checkpoint()
|
|
1501
|
-
with self._send_guard:
|
|
1502
|
-
while True:
|
|
1503
|
-
try:
|
|
1504
|
-
# The ignore can be removed after mypy picks up
|
|
1505
|
-
# https://github.com/python/typeshed/pull/5545
|
|
1506
|
-
self._raw_socket.sendmsg(
|
|
1507
|
-
[message], [(socket.SOL_SOCKET, socket.SCM_RIGHTS, fdarray)]
|
|
1508
|
-
)
|
|
1509
|
-
break
|
|
1510
|
-
except BlockingIOError:
|
|
1511
|
-
await self._wait_until_writable(loop)
|
|
1512
|
-
except OSError as exc:
|
|
1513
|
-
if self._closing:
|
|
1514
|
-
raise ClosedResourceError from None
|
|
1515
|
-
else:
|
|
1516
|
-
raise BrokenResourceError from exc
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
class TCPSocketListener(abc.SocketListener):
|
|
1520
|
-
_accept_scope: CancelScope | None = None
|
|
1521
|
-
_closed = False
|
|
1522
|
-
|
|
1523
|
-
def __init__(self, raw_socket: socket.socket):
|
|
1524
|
-
self.__raw_socket = raw_socket
|
|
1525
|
-
self._loop = cast(asyncio.BaseEventLoop, get_running_loop())
|
|
1526
|
-
self._accept_guard = ResourceGuard("accepting connections from")
|
|
1527
|
-
|
|
1528
|
-
@property
|
|
1529
|
-
def _raw_socket(self) -> socket.socket:
|
|
1530
|
-
return self.__raw_socket
|
|
1531
|
-
|
|
1532
|
-
async def accept(self) -> abc.SocketStream:
|
|
1533
|
-
if self._closed:
|
|
1534
|
-
raise ClosedResourceError
|
|
1535
|
-
|
|
1536
|
-
with self._accept_guard:
|
|
1537
|
-
await AsyncIOBackend.checkpoint()
|
|
1538
|
-
with CancelScope() as self._accept_scope:
|
|
1539
|
-
try:
|
|
1540
|
-
client_sock, _addr = await self._loop.sock_accept(self._raw_socket)
|
|
1541
|
-
except asyncio.CancelledError:
|
|
1542
|
-
# Workaround for https://bugs.python.org/issue41317
|
|
1543
|
-
try:
|
|
1544
|
-
self._loop.remove_reader(self._raw_socket)
|
|
1545
|
-
except (ValueError, NotImplementedError):
|
|
1546
|
-
pass
|
|
1547
|
-
|
|
1548
|
-
if self._closed:
|
|
1549
|
-
raise ClosedResourceError from None
|
|
1550
|
-
|
|
1551
|
-
raise
|
|
1552
|
-
finally:
|
|
1553
|
-
self._accept_scope = None
|
|
1554
|
-
|
|
1555
|
-
client_sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
|
|
1556
|
-
transport, protocol = await self._loop.connect_accepted_socket(
|
|
1557
|
-
StreamProtocol, client_sock
|
|
1558
|
-
)
|
|
1559
|
-
return SocketStream(transport, protocol)
|
|
1560
|
-
|
|
1561
|
-
async def aclose(self) -> None:
|
|
1562
|
-
if self._closed:
|
|
1563
|
-
return
|
|
1564
|
-
|
|
1565
|
-
self._closed = True
|
|
1566
|
-
if self._accept_scope:
|
|
1567
|
-
# Workaround for https://bugs.python.org/issue41317
|
|
1568
|
-
try:
|
|
1569
|
-
self._loop.remove_reader(self._raw_socket)
|
|
1570
|
-
except (ValueError, NotImplementedError):
|
|
1571
|
-
pass
|
|
1572
|
-
|
|
1573
|
-
self._accept_scope.cancel()
|
|
1574
|
-
await sleep(0)
|
|
1575
|
-
|
|
1576
|
-
self._raw_socket.close()
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
class UNIXSocketListener(abc.SocketListener):
|
|
1580
|
-
def __init__(self, raw_socket: socket.socket):
|
|
1581
|
-
self.__raw_socket = raw_socket
|
|
1582
|
-
self._loop = get_running_loop()
|
|
1583
|
-
self._accept_guard = ResourceGuard("accepting connections from")
|
|
1584
|
-
self._closed = False
|
|
1585
|
-
|
|
1586
|
-
async def accept(self) -> abc.SocketStream:
|
|
1587
|
-
await AsyncIOBackend.checkpoint()
|
|
1588
|
-
with self._accept_guard:
|
|
1589
|
-
while True:
|
|
1590
|
-
try:
|
|
1591
|
-
client_sock, _ = self.__raw_socket.accept()
|
|
1592
|
-
client_sock.setblocking(False)
|
|
1593
|
-
return UNIXSocketStream(client_sock)
|
|
1594
|
-
except BlockingIOError:
|
|
1595
|
-
f: asyncio.Future = asyncio.Future()
|
|
1596
|
-
self._loop.add_reader(self.__raw_socket, f.set_result, None)
|
|
1597
|
-
f.add_done_callback(
|
|
1598
|
-
lambda _: self._loop.remove_reader(self.__raw_socket)
|
|
1599
|
-
)
|
|
1600
|
-
await f
|
|
1601
|
-
except OSError as exc:
|
|
1602
|
-
if self._closed:
|
|
1603
|
-
raise ClosedResourceError from None
|
|
1604
|
-
else:
|
|
1605
|
-
raise BrokenResourceError from exc
|
|
1606
|
-
|
|
1607
|
-
async def aclose(self) -> None:
|
|
1608
|
-
self._closed = True
|
|
1609
|
-
self.__raw_socket.close()
|
|
1610
|
-
|
|
1611
|
-
@property
|
|
1612
|
-
def _raw_socket(self) -> socket.socket:
|
|
1613
|
-
return self.__raw_socket
|
|
1614
|
-
|
|
1615
|
-
|
|
1616
|
-
class UDPSocket(abc.UDPSocket):
|
|
1617
|
-
def __init__(
|
|
1618
|
-
self, transport: asyncio.DatagramTransport, protocol: DatagramProtocol
|
|
1619
|
-
):
|
|
1620
|
-
self._transport = transport
|
|
1621
|
-
self._protocol = protocol
|
|
1622
|
-
self._receive_guard = ResourceGuard("reading from")
|
|
1623
|
-
self._send_guard = ResourceGuard("writing to")
|
|
1624
|
-
self._closed = False
|
|
1625
|
-
|
|
1626
|
-
@property
|
|
1627
|
-
def _raw_socket(self) -> socket.socket:
|
|
1628
|
-
return self._transport.get_extra_info("socket")
|
|
1629
|
-
|
|
1630
|
-
async def aclose(self) -> None:
|
|
1631
|
-
self._closed = True
|
|
1632
|
-
if not self._transport.is_closing():
|
|
1633
|
-
self._transport.close()
|
|
1634
|
-
|
|
1635
|
-
async def receive(self) -> tuple[bytes, IPSockAddrType]:
|
|
1636
|
-
with self._receive_guard:
|
|
1637
|
-
await AsyncIOBackend.checkpoint()
|
|
1638
|
-
|
|
1639
|
-
# If the buffer is empty, ask for more data
|
|
1640
|
-
if not self._protocol.read_queue and not self._transport.is_closing():
|
|
1641
|
-
self._protocol.read_event.clear()
|
|
1642
|
-
await self._protocol.read_event.wait()
|
|
1643
|
-
|
|
1644
|
-
try:
|
|
1645
|
-
return self._protocol.read_queue.popleft()
|
|
1646
|
-
except IndexError:
|
|
1647
|
-
if self._closed:
|
|
1648
|
-
raise ClosedResourceError from None
|
|
1649
|
-
else:
|
|
1650
|
-
raise BrokenResourceError from None
|
|
1651
|
-
|
|
1652
|
-
async def send(self, item: UDPPacketType) -> None:
|
|
1653
|
-
with self._send_guard:
|
|
1654
|
-
await AsyncIOBackend.checkpoint()
|
|
1655
|
-
await self._protocol.write_event.wait()
|
|
1656
|
-
if self._closed:
|
|
1657
|
-
raise ClosedResourceError
|
|
1658
|
-
elif self._transport.is_closing():
|
|
1659
|
-
raise BrokenResourceError
|
|
1660
|
-
else:
|
|
1661
|
-
self._transport.sendto(*item)
|
|
1662
|
-
|
|
1663
|
-
|
|
1664
|
-
class ConnectedUDPSocket(abc.ConnectedUDPSocket):
|
|
1665
|
-
def __init__(
|
|
1666
|
-
self, transport: asyncio.DatagramTransport, protocol: DatagramProtocol
|
|
1667
|
-
):
|
|
1668
|
-
self._transport = transport
|
|
1669
|
-
self._protocol = protocol
|
|
1670
|
-
self._receive_guard = ResourceGuard("reading from")
|
|
1671
|
-
self._send_guard = ResourceGuard("writing to")
|
|
1672
|
-
self._closed = False
|
|
1673
|
-
|
|
1674
|
-
@property
|
|
1675
|
-
def _raw_socket(self) -> socket.socket:
|
|
1676
|
-
return self._transport.get_extra_info("socket")
|
|
1677
|
-
|
|
1678
|
-
async def aclose(self) -> None:
|
|
1679
|
-
self._closed = True
|
|
1680
|
-
if not self._transport.is_closing():
|
|
1681
|
-
self._transport.close()
|
|
1682
|
-
|
|
1683
|
-
async def receive(self) -> bytes:
|
|
1684
|
-
with self._receive_guard:
|
|
1685
|
-
await AsyncIOBackend.checkpoint()
|
|
1686
|
-
|
|
1687
|
-
# If the buffer is empty, ask for more data
|
|
1688
|
-
if not self._protocol.read_queue and not self._transport.is_closing():
|
|
1689
|
-
self._protocol.read_event.clear()
|
|
1690
|
-
await self._protocol.read_event.wait()
|
|
1691
|
-
|
|
1692
|
-
try:
|
|
1693
|
-
packet = self._protocol.read_queue.popleft()
|
|
1694
|
-
except IndexError:
|
|
1695
|
-
if self._closed:
|
|
1696
|
-
raise ClosedResourceError from None
|
|
1697
|
-
else:
|
|
1698
|
-
raise BrokenResourceError from None
|
|
1699
|
-
|
|
1700
|
-
return packet[0]
|
|
1701
|
-
|
|
1702
|
-
async def send(self, item: bytes) -> None:
|
|
1703
|
-
with self._send_guard:
|
|
1704
|
-
await AsyncIOBackend.checkpoint()
|
|
1705
|
-
await self._protocol.write_event.wait()
|
|
1706
|
-
if self._closed:
|
|
1707
|
-
raise ClosedResourceError
|
|
1708
|
-
elif self._transport.is_closing():
|
|
1709
|
-
raise BrokenResourceError
|
|
1710
|
-
else:
|
|
1711
|
-
self._transport.sendto(item)
|
|
1712
|
-
|
|
1713
|
-
|
|
1714
|
-
class UNIXDatagramSocket(_RawSocketMixin, abc.UNIXDatagramSocket):
|
|
1715
|
-
async def receive(self) -> UNIXDatagramPacketType:
|
|
1716
|
-
loop = get_running_loop()
|
|
1717
|
-
await AsyncIOBackend.checkpoint()
|
|
1718
|
-
with self._receive_guard:
|
|
1719
|
-
while True:
|
|
1720
|
-
try:
|
|
1721
|
-
data = self._raw_socket.recvfrom(65536)
|
|
1722
|
-
except BlockingIOError:
|
|
1723
|
-
await self._wait_until_readable(loop)
|
|
1724
|
-
except OSError as exc:
|
|
1725
|
-
if self._closing:
|
|
1726
|
-
raise ClosedResourceError from None
|
|
1727
|
-
else:
|
|
1728
|
-
raise BrokenResourceError from exc
|
|
1729
|
-
else:
|
|
1730
|
-
return data
|
|
1731
|
-
|
|
1732
|
-
async def send(self, item: UNIXDatagramPacketType) -> None:
|
|
1733
|
-
loop = get_running_loop()
|
|
1734
|
-
await AsyncIOBackend.checkpoint()
|
|
1735
|
-
with self._send_guard:
|
|
1736
|
-
while True:
|
|
1737
|
-
try:
|
|
1738
|
-
self._raw_socket.sendto(*item)
|
|
1739
|
-
except BlockingIOError:
|
|
1740
|
-
await self._wait_until_writable(loop)
|
|
1741
|
-
except OSError as exc:
|
|
1742
|
-
if self._closing:
|
|
1743
|
-
raise ClosedResourceError from None
|
|
1744
|
-
else:
|
|
1745
|
-
raise BrokenResourceError from exc
|
|
1746
|
-
else:
|
|
1747
|
-
return
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
class ConnectedUNIXDatagramSocket(_RawSocketMixin, abc.ConnectedUNIXDatagramSocket):
|
|
1751
|
-
async def receive(self) -> bytes:
|
|
1752
|
-
loop = get_running_loop()
|
|
1753
|
-
await AsyncIOBackend.checkpoint()
|
|
1754
|
-
with self._receive_guard:
|
|
1755
|
-
while True:
|
|
1756
|
-
try:
|
|
1757
|
-
data = self._raw_socket.recv(65536)
|
|
1758
|
-
except BlockingIOError:
|
|
1759
|
-
await self._wait_until_readable(loop)
|
|
1760
|
-
except OSError as exc:
|
|
1761
|
-
if self._closing:
|
|
1762
|
-
raise ClosedResourceError from None
|
|
1763
|
-
else:
|
|
1764
|
-
raise BrokenResourceError from exc
|
|
1765
|
-
else:
|
|
1766
|
-
return data
|
|
1767
|
-
|
|
1768
|
-
async def send(self, item: bytes) -> None:
|
|
1769
|
-
loop = get_running_loop()
|
|
1770
|
-
await AsyncIOBackend.checkpoint()
|
|
1771
|
-
with self._send_guard:
|
|
1772
|
-
while True:
|
|
1773
|
-
try:
|
|
1774
|
-
self._raw_socket.send(item)
|
|
1775
|
-
except BlockingIOError:
|
|
1776
|
-
await self._wait_until_writable(loop)
|
|
1777
|
-
except OSError as exc:
|
|
1778
|
-
if self._closing:
|
|
1779
|
-
raise ClosedResourceError from None
|
|
1780
|
-
else:
|
|
1781
|
-
raise BrokenResourceError from exc
|
|
1782
|
-
else:
|
|
1783
|
-
return
|
|
1784
|
-
|
|
1785
|
-
|
|
1786
|
-
_read_events: RunVar[dict[int, asyncio.Future[bool]]] = RunVar("read_events")
|
|
1787
|
-
_write_events: RunVar[dict[int, asyncio.Future[bool]]] = RunVar("write_events")
|
|
1788
|
-
|
|
1789
|
-
|
|
1790
|
-
#
|
|
1791
|
-
# Synchronization
|
|
1792
|
-
#
|
|
1793
|
-
|
|
1794
|
-
|
|
1795
|
-
class Event(BaseEvent):
|
|
1796
|
-
def __new__(cls) -> Event:
|
|
1797
|
-
return object.__new__(cls)
|
|
1798
|
-
|
|
1799
|
-
def __init__(self) -> None:
|
|
1800
|
-
self._event = asyncio.Event()
|
|
1801
|
-
|
|
1802
|
-
def set(self) -> None:
|
|
1803
|
-
self._event.set()
|
|
1804
|
-
|
|
1805
|
-
def is_set(self) -> bool:
|
|
1806
|
-
return self._event.is_set()
|
|
1807
|
-
|
|
1808
|
-
async def wait(self) -> None:
|
|
1809
|
-
if self.is_set():
|
|
1810
|
-
await AsyncIOBackend.checkpoint()
|
|
1811
|
-
else:
|
|
1812
|
-
await self._event.wait()
|
|
1813
|
-
|
|
1814
|
-
def statistics(self) -> EventStatistics:
|
|
1815
|
-
return EventStatistics(len(self._event._waiters))
|
|
1816
|
-
|
|
1817
|
-
|
|
1818
|
-
class Lock(BaseLock):
|
|
1819
|
-
def __new__(cls, *, fast_acquire: bool = False) -> Lock:
|
|
1820
|
-
return object.__new__(cls)
|
|
1821
|
-
|
|
1822
|
-
def __init__(self, *, fast_acquire: bool = False) -> None:
|
|
1823
|
-
self._fast_acquire = fast_acquire
|
|
1824
|
-
self._owner_task: asyncio.Task | None = None
|
|
1825
|
-
self._waiters: deque[tuple[asyncio.Task, asyncio.Future]] = deque()
|
|
1826
|
-
|
|
1827
|
-
async def acquire(self) -> None:
|
|
1828
|
-
task = cast(asyncio.Task, current_task())
|
|
1829
|
-
if self._owner_task is None and not self._waiters:
|
|
1830
|
-
await AsyncIOBackend.checkpoint_if_cancelled()
|
|
1831
|
-
self._owner_task = task
|
|
1832
|
-
|
|
1833
|
-
# Unless on the "fast path", yield control of the event loop so that other
|
|
1834
|
-
# tasks can run too
|
|
1835
|
-
if not self._fast_acquire:
|
|
1836
|
-
try:
|
|
1837
|
-
await AsyncIOBackend.cancel_shielded_checkpoint()
|
|
1838
|
-
except CancelledError:
|
|
1839
|
-
self.release()
|
|
1840
|
-
raise
|
|
1841
|
-
|
|
1842
|
-
return
|
|
1843
|
-
|
|
1844
|
-
if self._owner_task == task:
|
|
1845
|
-
raise RuntimeError("Attempted to acquire an already held Lock")
|
|
1846
|
-
|
|
1847
|
-
fut: asyncio.Future[None] = asyncio.Future()
|
|
1848
|
-
item = task, fut
|
|
1849
|
-
self._waiters.append(item)
|
|
1850
|
-
try:
|
|
1851
|
-
await fut
|
|
1852
|
-
except CancelledError:
|
|
1853
|
-
self._waiters.remove(item)
|
|
1854
|
-
if self._owner_task is task:
|
|
1855
|
-
self.release()
|
|
1856
|
-
|
|
1857
|
-
raise
|
|
1858
|
-
|
|
1859
|
-
self._waiters.remove(item)
|
|
1860
|
-
|
|
1861
|
-
def acquire_nowait(self) -> None:
|
|
1862
|
-
task = cast(asyncio.Task, current_task())
|
|
1863
|
-
if self._owner_task is None and not self._waiters:
|
|
1864
|
-
self._owner_task = task
|
|
1865
|
-
return
|
|
1866
|
-
|
|
1867
|
-
if self._owner_task is task:
|
|
1868
|
-
raise RuntimeError("Attempted to acquire an already held Lock")
|
|
1869
|
-
|
|
1870
|
-
raise WouldBlock
|
|
1871
|
-
|
|
1872
|
-
def locked(self) -> bool:
|
|
1873
|
-
return self._owner_task is not None
|
|
1874
|
-
|
|
1875
|
-
def release(self) -> None:
|
|
1876
|
-
if self._owner_task != current_task():
|
|
1877
|
-
raise RuntimeError("The current task is not holding this lock")
|
|
1878
|
-
|
|
1879
|
-
for task, fut in self._waiters:
|
|
1880
|
-
if not fut.cancelled():
|
|
1881
|
-
self._owner_task = task
|
|
1882
|
-
fut.set_result(None)
|
|
1883
|
-
return
|
|
1884
|
-
|
|
1885
|
-
self._owner_task = None
|
|
1886
|
-
|
|
1887
|
-
def statistics(self) -> LockStatistics:
|
|
1888
|
-
task_info = AsyncIOTaskInfo(self._owner_task) if self._owner_task else None
|
|
1889
|
-
return LockStatistics(self.locked(), task_info, len(self._waiters))
|
|
1890
|
-
|
|
1891
|
-
|
|
1892
|
-
class Semaphore(BaseSemaphore):
|
|
1893
|
-
def __new__(
|
|
1894
|
-
cls,
|
|
1895
|
-
initial_value: int,
|
|
1896
|
-
*,
|
|
1897
|
-
max_value: int | None = None,
|
|
1898
|
-
fast_acquire: bool = False,
|
|
1899
|
-
) -> Semaphore:
|
|
1900
|
-
return object.__new__(cls)
|
|
1901
|
-
|
|
1902
|
-
def __init__(
|
|
1903
|
-
self,
|
|
1904
|
-
initial_value: int,
|
|
1905
|
-
*,
|
|
1906
|
-
max_value: int | None = None,
|
|
1907
|
-
fast_acquire: bool = False,
|
|
1908
|
-
):
|
|
1909
|
-
super().__init__(initial_value, max_value=max_value)
|
|
1910
|
-
self._value = initial_value
|
|
1911
|
-
self._max_value = max_value
|
|
1912
|
-
self._fast_acquire = fast_acquire
|
|
1913
|
-
self._waiters: deque[asyncio.Future[None]] = deque()
|
|
1914
|
-
|
|
1915
|
-
async def acquire(self) -> None:
|
|
1916
|
-
if self._value > 0 and not self._waiters:
|
|
1917
|
-
await AsyncIOBackend.checkpoint_if_cancelled()
|
|
1918
|
-
self._value -= 1
|
|
1919
|
-
|
|
1920
|
-
# Unless on the "fast path", yield control of the event loop so that other
|
|
1921
|
-
# tasks can run too
|
|
1922
|
-
if not self._fast_acquire:
|
|
1923
|
-
try:
|
|
1924
|
-
await AsyncIOBackend.cancel_shielded_checkpoint()
|
|
1925
|
-
except CancelledError:
|
|
1926
|
-
self.release()
|
|
1927
|
-
raise
|
|
1928
|
-
|
|
1929
|
-
return
|
|
1930
|
-
|
|
1931
|
-
fut: asyncio.Future[None] = asyncio.Future()
|
|
1932
|
-
self._waiters.append(fut)
|
|
1933
|
-
try:
|
|
1934
|
-
await fut
|
|
1935
|
-
except CancelledError:
|
|
1936
|
-
try:
|
|
1937
|
-
self._waiters.remove(fut)
|
|
1938
|
-
except ValueError:
|
|
1939
|
-
self.release()
|
|
1940
|
-
|
|
1941
|
-
raise
|
|
1942
|
-
|
|
1943
|
-
def acquire_nowait(self) -> None:
|
|
1944
|
-
if self._value == 0:
|
|
1945
|
-
raise WouldBlock
|
|
1946
|
-
|
|
1947
|
-
self._value -= 1
|
|
1948
|
-
|
|
1949
|
-
def release(self) -> None:
|
|
1950
|
-
if self._max_value is not None and self._value == self._max_value:
|
|
1951
|
-
raise ValueError("semaphore released too many times")
|
|
1952
|
-
|
|
1953
|
-
for fut in self._waiters:
|
|
1954
|
-
if not fut.cancelled():
|
|
1955
|
-
fut.set_result(None)
|
|
1956
|
-
self._waiters.remove(fut)
|
|
1957
|
-
return
|
|
1958
|
-
|
|
1959
|
-
self._value += 1
|
|
1960
|
-
|
|
1961
|
-
@property
|
|
1962
|
-
def value(self) -> int:
|
|
1963
|
-
return self._value
|
|
1964
|
-
|
|
1965
|
-
@property
|
|
1966
|
-
def max_value(self) -> int | None:
|
|
1967
|
-
return self._max_value
|
|
1968
|
-
|
|
1969
|
-
def statistics(self) -> SemaphoreStatistics:
|
|
1970
|
-
return SemaphoreStatistics(len(self._waiters))
|
|
1971
|
-
|
|
1972
|
-
|
|
1973
|
-
class CapacityLimiter(BaseCapacityLimiter):
|
|
1974
|
-
_total_tokens: float = 0
|
|
1975
|
-
|
|
1976
|
-
def __new__(cls, total_tokens: float) -> CapacityLimiter:
|
|
1977
|
-
return object.__new__(cls)
|
|
1978
|
-
|
|
1979
|
-
def __init__(self, total_tokens: float):
|
|
1980
|
-
self._borrowers: set[Any] = set()
|
|
1981
|
-
self._wait_queue: OrderedDict[Any, asyncio.Event] = OrderedDict()
|
|
1982
|
-
self.total_tokens = total_tokens
|
|
1983
|
-
|
|
1984
|
-
async def __aenter__(self) -> None:
|
|
1985
|
-
await self.acquire()
|
|
1986
|
-
|
|
1987
|
-
async def __aexit__(
|
|
1988
|
-
self,
|
|
1989
|
-
exc_type: type[BaseException] | None,
|
|
1990
|
-
exc_val: BaseException | None,
|
|
1991
|
-
exc_tb: TracebackType | None,
|
|
1992
|
-
) -> None:
|
|
1993
|
-
self.release()
|
|
1994
|
-
|
|
1995
|
-
@property
|
|
1996
|
-
def total_tokens(self) -> float:
|
|
1997
|
-
return self._total_tokens
|
|
1998
|
-
|
|
1999
|
-
@total_tokens.setter
|
|
2000
|
-
def total_tokens(self, value: float) -> None:
|
|
2001
|
-
if not isinstance(value, int) and not math.isinf(value):
|
|
2002
|
-
raise TypeError("total_tokens must be an int or math.inf")
|
|
2003
|
-
|
|
2004
|
-
if value < 0:
|
|
2005
|
-
raise ValueError("total_tokens must be >= 0")
|
|
2006
|
-
|
|
2007
|
-
waiters_to_notify = max(value - self._total_tokens, 0)
|
|
2008
|
-
self._total_tokens = value
|
|
2009
|
-
|
|
2010
|
-
# Notify waiting tasks that they have acquired the limiter
|
|
2011
|
-
while self._wait_queue and waiters_to_notify:
|
|
2012
|
-
event = self._wait_queue.popitem(last=False)[1]
|
|
2013
|
-
event.set()
|
|
2014
|
-
waiters_to_notify -= 1
|
|
2015
|
-
|
|
2016
|
-
@property
|
|
2017
|
-
def borrowed_tokens(self) -> int:
|
|
2018
|
-
return len(self._borrowers)
|
|
2019
|
-
|
|
2020
|
-
@property
|
|
2021
|
-
def available_tokens(self) -> float:
|
|
2022
|
-
return self._total_tokens - len(self._borrowers)
|
|
2023
|
-
|
|
2024
|
-
def _notify_next_waiter(self) -> None:
|
|
2025
|
-
"""Notify the next task in line if this limiter has free capacity now."""
|
|
2026
|
-
if self._wait_queue and len(self._borrowers) < self._total_tokens:
|
|
2027
|
-
event = self._wait_queue.popitem(last=False)[1]
|
|
2028
|
-
event.set()
|
|
2029
|
-
|
|
2030
|
-
def acquire_nowait(self) -> None:
|
|
2031
|
-
self.acquire_on_behalf_of_nowait(current_task())
|
|
2032
|
-
|
|
2033
|
-
def acquire_on_behalf_of_nowait(self, borrower: object) -> None:
|
|
2034
|
-
if borrower in self._borrowers:
|
|
2035
|
-
raise RuntimeError(
|
|
2036
|
-
"this borrower is already holding one of this CapacityLimiter's tokens"
|
|
2037
|
-
)
|
|
2038
|
-
|
|
2039
|
-
if self._wait_queue or len(self._borrowers) >= self._total_tokens:
|
|
2040
|
-
raise WouldBlock
|
|
2041
|
-
|
|
2042
|
-
self._borrowers.add(borrower)
|
|
2043
|
-
|
|
2044
|
-
async def acquire(self) -> None:
|
|
2045
|
-
return await self.acquire_on_behalf_of(current_task())
|
|
2046
|
-
|
|
2047
|
-
async def acquire_on_behalf_of(self, borrower: object) -> None:
|
|
2048
|
-
await AsyncIOBackend.checkpoint_if_cancelled()
|
|
2049
|
-
try:
|
|
2050
|
-
self.acquire_on_behalf_of_nowait(borrower)
|
|
2051
|
-
except WouldBlock:
|
|
2052
|
-
event = asyncio.Event()
|
|
2053
|
-
self._wait_queue[borrower] = event
|
|
2054
|
-
try:
|
|
2055
|
-
await event.wait()
|
|
2056
|
-
except BaseException:
|
|
2057
|
-
self._wait_queue.pop(borrower, None)
|
|
2058
|
-
if event.is_set():
|
|
2059
|
-
self._notify_next_waiter()
|
|
2060
|
-
|
|
2061
|
-
raise
|
|
2062
|
-
|
|
2063
|
-
self._borrowers.add(borrower)
|
|
2064
|
-
else:
|
|
2065
|
-
try:
|
|
2066
|
-
await AsyncIOBackend.cancel_shielded_checkpoint()
|
|
2067
|
-
except BaseException:
|
|
2068
|
-
self.release()
|
|
2069
|
-
raise
|
|
2070
|
-
|
|
2071
|
-
def release(self) -> None:
|
|
2072
|
-
self.release_on_behalf_of(current_task())
|
|
2073
|
-
|
|
2074
|
-
def release_on_behalf_of(self, borrower: object) -> None:
|
|
2075
|
-
try:
|
|
2076
|
-
self._borrowers.remove(borrower)
|
|
2077
|
-
except KeyError:
|
|
2078
|
-
raise RuntimeError(
|
|
2079
|
-
"this borrower isn't holding any of this CapacityLimiter's tokens"
|
|
2080
|
-
) from None
|
|
2081
|
-
|
|
2082
|
-
self._notify_next_waiter()
|
|
2083
|
-
|
|
2084
|
-
def statistics(self) -> CapacityLimiterStatistics:
|
|
2085
|
-
return CapacityLimiterStatistics(
|
|
2086
|
-
self.borrowed_tokens,
|
|
2087
|
-
self.total_tokens,
|
|
2088
|
-
tuple(self._borrowers),
|
|
2089
|
-
len(self._wait_queue),
|
|
2090
|
-
)
|
|
2091
|
-
|
|
2092
|
-
|
|
2093
|
-
_default_thread_limiter: RunVar[CapacityLimiter] = RunVar("_default_thread_limiter")
|
|
2094
|
-
|
|
2095
|
-
|
|
2096
|
-
#
|
|
2097
|
-
# Operating system signals
|
|
2098
|
-
#
|
|
2099
|
-
|
|
2100
|
-
|
|
2101
|
-
class _SignalReceiver:
|
|
2102
|
-
def __init__(self, signals: tuple[Signals, ...]):
|
|
2103
|
-
self._signals = signals
|
|
2104
|
-
self._loop = get_running_loop()
|
|
2105
|
-
self._signal_queue: deque[Signals] = deque()
|
|
2106
|
-
self._future: asyncio.Future = asyncio.Future()
|
|
2107
|
-
self._handled_signals: set[Signals] = set()
|
|
2108
|
-
|
|
2109
|
-
def _deliver(self, signum: Signals) -> None:
|
|
2110
|
-
self._signal_queue.append(signum)
|
|
2111
|
-
if not self._future.done():
|
|
2112
|
-
self._future.set_result(None)
|
|
2113
|
-
|
|
2114
|
-
def __enter__(self) -> _SignalReceiver:
|
|
2115
|
-
for sig in set(self._signals):
|
|
2116
|
-
self._loop.add_signal_handler(sig, self._deliver, sig)
|
|
2117
|
-
self._handled_signals.add(sig)
|
|
2118
|
-
|
|
2119
|
-
return self
|
|
2120
|
-
|
|
2121
|
-
def __exit__(
|
|
2122
|
-
self,
|
|
2123
|
-
exc_type: type[BaseException] | None,
|
|
2124
|
-
exc_val: BaseException | None,
|
|
2125
|
-
exc_tb: TracebackType | None,
|
|
2126
|
-
) -> None:
|
|
2127
|
-
for sig in self._handled_signals:
|
|
2128
|
-
self._loop.remove_signal_handler(sig)
|
|
2129
|
-
|
|
2130
|
-
def __aiter__(self) -> _SignalReceiver:
|
|
2131
|
-
return self
|
|
2132
|
-
|
|
2133
|
-
async def __anext__(self) -> Signals:
|
|
2134
|
-
await AsyncIOBackend.checkpoint()
|
|
2135
|
-
if not self._signal_queue:
|
|
2136
|
-
self._future = asyncio.Future()
|
|
2137
|
-
await self._future
|
|
2138
|
-
|
|
2139
|
-
return self._signal_queue.popleft()
|
|
2140
|
-
|
|
2141
|
-
|
|
2142
|
-
#
|
|
2143
|
-
# Testing and debugging
|
|
2144
|
-
#
|
|
2145
|
-
|
|
2146
|
-
|
|
2147
|
-
class AsyncIOTaskInfo(TaskInfo):
|
|
2148
|
-
def __init__(self, task: asyncio.Task):
|
|
2149
|
-
task_state = _task_states.get(task)
|
|
2150
|
-
if task_state is None:
|
|
2151
|
-
parent_id = None
|
|
2152
|
-
else:
|
|
2153
|
-
parent_id = task_state.parent_id
|
|
2154
|
-
|
|
2155
|
-
coro = task.get_coro()
|
|
2156
|
-
assert coro is not None, "created TaskInfo from a completed Task"
|
|
2157
|
-
super().__init__(id(task), parent_id, task.get_name(), coro)
|
|
2158
|
-
self._task = weakref.ref(task)
|
|
2159
|
-
|
|
2160
|
-
def has_pending_cancellation(self) -> bool:
|
|
2161
|
-
if not (task := self._task()):
|
|
2162
|
-
# If the task isn't around anymore, it won't have a pending cancellation
|
|
2163
|
-
return False
|
|
2164
|
-
|
|
2165
|
-
if task._must_cancel: # type: ignore[attr-defined]
|
|
2166
|
-
return True
|
|
2167
|
-
elif (
|
|
2168
|
-
isinstance(task._fut_waiter, asyncio.Future) # type: ignore[attr-defined]
|
|
2169
|
-
and task._fut_waiter.cancelled() # type: ignore[attr-defined]
|
|
2170
|
-
):
|
|
2171
|
-
return True
|
|
2172
|
-
|
|
2173
|
-
if task_state := _task_states.get(task):
|
|
2174
|
-
if cancel_scope := task_state.cancel_scope:
|
|
2175
|
-
return cancel_scope._effectively_cancelled
|
|
2176
|
-
|
|
2177
|
-
return False
|
|
2178
|
-
|
|
2179
|
-
|
|
2180
|
-
class TestRunner(abc.TestRunner):
|
|
2181
|
-
_send_stream: MemoryObjectSendStream[tuple[Awaitable[Any], asyncio.Future[Any]]]
|
|
2182
|
-
|
|
2183
|
-
def __init__(
|
|
2184
|
-
self,
|
|
2185
|
-
*,
|
|
2186
|
-
debug: bool | None = None,
|
|
2187
|
-
use_uvloop: bool = False,
|
|
2188
|
-
loop_factory: Callable[[], AbstractEventLoop] | None = None,
|
|
2189
|
-
) -> None:
|
|
2190
|
-
if use_uvloop and loop_factory is None:
|
|
2191
|
-
if sys.platform != "win32":
|
|
2192
|
-
import uvloop
|
|
2193
|
-
|
|
2194
|
-
loop_factory = uvloop.new_event_loop
|
|
2195
|
-
else:
|
|
2196
|
-
import winloop
|
|
2197
|
-
|
|
2198
|
-
loop_factory = winloop.new_event_loop
|
|
2199
|
-
|
|
2200
|
-
self._runner = Runner(debug=debug, loop_factory=loop_factory)
|
|
2201
|
-
self._exceptions: list[BaseException] = []
|
|
2202
|
-
self._runner_task: asyncio.Task | None = None
|
|
2203
|
-
|
|
2204
|
-
def __enter__(self) -> TestRunner:
|
|
2205
|
-
self._runner.__enter__()
|
|
2206
|
-
self.get_loop().set_exception_handler(self._exception_handler)
|
|
2207
|
-
return self
|
|
2208
|
-
|
|
2209
|
-
def __exit__(
|
|
2210
|
-
self,
|
|
2211
|
-
exc_type: type[BaseException] | None,
|
|
2212
|
-
exc_val: BaseException | None,
|
|
2213
|
-
exc_tb: TracebackType | None,
|
|
2214
|
-
) -> None:
|
|
2215
|
-
self._runner.__exit__(exc_type, exc_val, exc_tb)
|
|
2216
|
-
|
|
2217
|
-
def get_loop(self) -> AbstractEventLoop:
|
|
2218
|
-
return self._runner.get_loop()
|
|
2219
|
-
|
|
2220
|
-
def _exception_handler(
|
|
2221
|
-
self, loop: asyncio.AbstractEventLoop, context: dict[str, Any]
|
|
2222
|
-
) -> None:
|
|
2223
|
-
if isinstance(context.get("exception"), Exception):
|
|
2224
|
-
self._exceptions.append(context["exception"])
|
|
2225
|
-
else:
|
|
2226
|
-
loop.default_exception_handler(context)
|
|
2227
|
-
|
|
2228
|
-
def _raise_async_exceptions(self) -> None:
|
|
2229
|
-
# Re-raise any exceptions raised in asynchronous callbacks
|
|
2230
|
-
if self._exceptions:
|
|
2231
|
-
exceptions, self._exceptions = self._exceptions, []
|
|
2232
|
-
if len(exceptions) == 1:
|
|
2233
|
-
raise exceptions[0]
|
|
2234
|
-
elif exceptions:
|
|
2235
|
-
raise BaseExceptionGroup(
|
|
2236
|
-
"Multiple exceptions occurred in asynchronous callbacks", exceptions
|
|
2237
|
-
)
|
|
2238
|
-
|
|
2239
|
-
async def _run_tests_and_fixtures(
|
|
2240
|
-
self,
|
|
2241
|
-
receive_stream: MemoryObjectReceiveStream[
|
|
2242
|
-
tuple[Awaitable[T_Retval], asyncio.Future[T_Retval]]
|
|
2243
|
-
],
|
|
2244
|
-
) -> None:
|
|
2245
|
-
from _pytest.outcomes import OutcomeException
|
|
2246
|
-
|
|
2247
|
-
with receive_stream, self._send_stream:
|
|
2248
|
-
async for coro, future in receive_stream:
|
|
2249
|
-
try:
|
|
2250
|
-
retval = await coro
|
|
2251
|
-
except CancelledError as exc:
|
|
2252
|
-
if not future.cancelled():
|
|
2253
|
-
future.cancel(*exc.args)
|
|
2254
|
-
|
|
2255
|
-
raise
|
|
2256
|
-
except BaseException as exc:
|
|
2257
|
-
if not future.cancelled():
|
|
2258
|
-
future.set_exception(exc)
|
|
2259
|
-
|
|
2260
|
-
if not isinstance(exc, (Exception, OutcomeException)):
|
|
2261
|
-
raise
|
|
2262
|
-
else:
|
|
2263
|
-
if not future.cancelled():
|
|
2264
|
-
future.set_result(retval)
|
|
2265
|
-
|
|
2266
|
-
async def _call_in_runner_task(
|
|
2267
|
-
self,
|
|
2268
|
-
func: Callable[P, Awaitable[T_Retval]],
|
|
2269
|
-
*args: P.args,
|
|
2270
|
-
**kwargs: P.kwargs,
|
|
2271
|
-
) -> T_Retval:
|
|
2272
|
-
if not self._runner_task:
|
|
2273
|
-
self._send_stream, receive_stream = create_memory_object_stream[
|
|
2274
|
-
tuple[Awaitable[Any], asyncio.Future]
|
|
2275
|
-
](1)
|
|
2276
|
-
self._runner_task = self.get_loop().create_task(
|
|
2277
|
-
self._run_tests_and_fixtures(receive_stream)
|
|
2278
|
-
)
|
|
2279
|
-
|
|
2280
|
-
coro = func(*args, **kwargs)
|
|
2281
|
-
future: asyncio.Future[T_Retval] = self.get_loop().create_future()
|
|
2282
|
-
self._send_stream.send_nowait((coro, future))
|
|
2283
|
-
return await future
|
|
2284
|
-
|
|
2285
|
-
def run_asyncgen_fixture(
|
|
2286
|
-
self,
|
|
2287
|
-
fixture_func: Callable[..., AsyncGenerator[T_Retval, Any]],
|
|
2288
|
-
kwargs: dict[str, Any],
|
|
2289
|
-
) -> Iterable[T_Retval]:
|
|
2290
|
-
asyncgen = fixture_func(**kwargs)
|
|
2291
|
-
fixturevalue: T_Retval = self.get_loop().run_until_complete(
|
|
2292
|
-
self._call_in_runner_task(asyncgen.asend, None)
|
|
2293
|
-
)
|
|
2294
|
-
self._raise_async_exceptions()
|
|
2295
|
-
|
|
2296
|
-
yield fixturevalue
|
|
2297
|
-
|
|
2298
|
-
try:
|
|
2299
|
-
self.get_loop().run_until_complete(
|
|
2300
|
-
self._call_in_runner_task(asyncgen.asend, None)
|
|
2301
|
-
)
|
|
2302
|
-
except StopAsyncIteration:
|
|
2303
|
-
self._raise_async_exceptions()
|
|
2304
|
-
else:
|
|
2305
|
-
self.get_loop().run_until_complete(asyncgen.aclose())
|
|
2306
|
-
raise RuntimeError("Async generator fixture did not stop")
|
|
2307
|
-
|
|
2308
|
-
def run_fixture(
|
|
2309
|
-
self,
|
|
2310
|
-
fixture_func: Callable[..., Coroutine[Any, Any, T_Retval]],
|
|
2311
|
-
kwargs: dict[str, Any],
|
|
2312
|
-
) -> T_Retval:
|
|
2313
|
-
retval = self.get_loop().run_until_complete(
|
|
2314
|
-
self._call_in_runner_task(fixture_func, **kwargs)
|
|
2315
|
-
)
|
|
2316
|
-
self._raise_async_exceptions()
|
|
2317
|
-
return retval
|
|
2318
|
-
|
|
2319
|
-
def run_test(
|
|
2320
|
-
self, test_func: Callable[..., Coroutine[Any, Any, Any]], kwargs: dict[str, Any]
|
|
2321
|
-
) -> None:
|
|
2322
|
-
try:
|
|
2323
|
-
self.get_loop().run_until_complete(
|
|
2324
|
-
self._call_in_runner_task(test_func, **kwargs)
|
|
2325
|
-
)
|
|
2326
|
-
except Exception as exc:
|
|
2327
|
-
self._exceptions.append(exc)
|
|
2328
|
-
|
|
2329
|
-
self._raise_async_exceptions()
|
|
2330
|
-
|
|
2331
|
-
|
|
2332
|
-
class AsyncIOBackend(AsyncBackend):
|
|
2333
|
-
@classmethod
|
|
2334
|
-
def run(
|
|
2335
|
-
cls,
|
|
2336
|
-
func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]],
|
|
2337
|
-
args: tuple[Unpack[PosArgsT]],
|
|
2338
|
-
kwargs: dict[str, Any],
|
|
2339
|
-
options: dict[str, Any],
|
|
2340
|
-
) -> T_Retval:
|
|
2341
|
-
@wraps(func)
|
|
2342
|
-
async def wrapper() -> T_Retval:
|
|
2343
|
-
task = cast(asyncio.Task, current_task())
|
|
2344
|
-
task.set_name(get_callable_name(func))
|
|
2345
|
-
_task_states[task] = TaskState(None, None)
|
|
2346
|
-
|
|
2347
|
-
try:
|
|
2348
|
-
return await func(*args)
|
|
2349
|
-
finally:
|
|
2350
|
-
del _task_states[task]
|
|
2351
|
-
|
|
2352
|
-
debug = options.get("debug", None)
|
|
2353
|
-
loop_factory = options.get("loop_factory", None)
|
|
2354
|
-
if loop_factory is None and options.get("use_uvloop", False):
|
|
2355
|
-
if sys.platform != "win32":
|
|
2356
|
-
import uvloop
|
|
2357
|
-
|
|
2358
|
-
loop_factory = uvloop.new_event_loop
|
|
2359
|
-
else:
|
|
2360
|
-
import winloop
|
|
2361
|
-
|
|
2362
|
-
loop_factory = winloop.new_event_loop
|
|
2363
|
-
|
|
2364
|
-
with Runner(debug=debug, loop_factory=loop_factory) as runner:
|
|
2365
|
-
return runner.run(wrapper())
|
|
2366
|
-
|
|
2367
|
-
@classmethod
|
|
2368
|
-
def current_token(cls) -> object:
|
|
2369
|
-
return get_running_loop()
|
|
2370
|
-
|
|
2371
|
-
@classmethod
|
|
2372
|
-
def current_time(cls) -> float:
|
|
2373
|
-
return get_running_loop().time()
|
|
2374
|
-
|
|
2375
|
-
@classmethod
|
|
2376
|
-
def cancelled_exception_class(cls) -> type[BaseException]:
|
|
2377
|
-
return CancelledError
|
|
2378
|
-
|
|
2379
|
-
@classmethod
|
|
2380
|
-
async def checkpoint(cls) -> None:
|
|
2381
|
-
await sleep(0)
|
|
2382
|
-
|
|
2383
|
-
@classmethod
|
|
2384
|
-
async def checkpoint_if_cancelled(cls) -> None:
|
|
2385
|
-
task = current_task()
|
|
2386
|
-
if task is None:
|
|
2387
|
-
return
|
|
2388
|
-
|
|
2389
|
-
try:
|
|
2390
|
-
cancel_scope = _task_states[task].cancel_scope
|
|
2391
|
-
except KeyError:
|
|
2392
|
-
return
|
|
2393
|
-
|
|
2394
|
-
while cancel_scope:
|
|
2395
|
-
if cancel_scope.cancel_called:
|
|
2396
|
-
await sleep(0)
|
|
2397
|
-
elif cancel_scope.shield:
|
|
2398
|
-
break
|
|
2399
|
-
else:
|
|
2400
|
-
cancel_scope = cancel_scope._parent_scope
|
|
2401
|
-
|
|
2402
|
-
@classmethod
|
|
2403
|
-
async def cancel_shielded_checkpoint(cls) -> None:
|
|
2404
|
-
with CancelScope(shield=True):
|
|
2405
|
-
await sleep(0)
|
|
2406
|
-
|
|
2407
|
-
@classmethod
|
|
2408
|
-
async def sleep(cls, delay: float) -> None:
|
|
2409
|
-
await sleep(delay)
|
|
2410
|
-
|
|
2411
|
-
@classmethod
|
|
2412
|
-
def create_cancel_scope(
|
|
2413
|
-
cls, *, deadline: float = math.inf, shield: bool = False
|
|
2414
|
-
) -> CancelScope:
|
|
2415
|
-
return CancelScope(deadline=deadline, shield=shield)
|
|
2416
|
-
|
|
2417
|
-
@classmethod
|
|
2418
|
-
def current_effective_deadline(cls) -> float:
|
|
2419
|
-
if (task := current_task()) is None:
|
|
2420
|
-
return math.inf
|
|
2421
|
-
|
|
2422
|
-
try:
|
|
2423
|
-
cancel_scope = _task_states[task].cancel_scope
|
|
2424
|
-
except KeyError:
|
|
2425
|
-
return math.inf
|
|
2426
|
-
|
|
2427
|
-
deadline = math.inf
|
|
2428
|
-
while cancel_scope:
|
|
2429
|
-
deadline = min(deadline, cancel_scope.deadline)
|
|
2430
|
-
if cancel_scope._cancel_called:
|
|
2431
|
-
deadline = -math.inf
|
|
2432
|
-
break
|
|
2433
|
-
elif cancel_scope.shield:
|
|
2434
|
-
break
|
|
2435
|
-
else:
|
|
2436
|
-
cancel_scope = cancel_scope._parent_scope
|
|
2437
|
-
|
|
2438
|
-
return deadline
|
|
2439
|
-
|
|
2440
|
-
@classmethod
|
|
2441
|
-
def create_task_group(cls) -> abc.TaskGroup:
|
|
2442
|
-
return TaskGroup()
|
|
2443
|
-
|
|
2444
|
-
@classmethod
|
|
2445
|
-
def create_event(cls) -> abc.Event:
|
|
2446
|
-
return Event()
|
|
2447
|
-
|
|
2448
|
-
@classmethod
|
|
2449
|
-
def create_lock(cls, *, fast_acquire: bool) -> abc.Lock:
|
|
2450
|
-
return Lock(fast_acquire=fast_acquire)
|
|
2451
|
-
|
|
2452
|
-
@classmethod
|
|
2453
|
-
def create_semaphore(
|
|
2454
|
-
cls,
|
|
2455
|
-
initial_value: int,
|
|
2456
|
-
*,
|
|
2457
|
-
max_value: int | None = None,
|
|
2458
|
-
fast_acquire: bool = False,
|
|
2459
|
-
) -> abc.Semaphore:
|
|
2460
|
-
return Semaphore(initial_value, max_value=max_value, fast_acquire=fast_acquire)
|
|
2461
|
-
|
|
2462
|
-
@classmethod
|
|
2463
|
-
def create_capacity_limiter(cls, total_tokens: float) -> abc.CapacityLimiter:
|
|
2464
|
-
return CapacityLimiter(total_tokens)
|
|
2465
|
-
|
|
2466
|
-
@classmethod
|
|
2467
|
-
async def run_sync_in_worker_thread( # type: ignore[return]
|
|
2468
|
-
cls,
|
|
2469
|
-
func: Callable[[Unpack[PosArgsT]], T_Retval],
|
|
2470
|
-
args: tuple[Unpack[PosArgsT]],
|
|
2471
|
-
abandon_on_cancel: bool = False,
|
|
2472
|
-
limiter: abc.CapacityLimiter | None = None,
|
|
2473
|
-
) -> T_Retval:
|
|
2474
|
-
await cls.checkpoint()
|
|
2475
|
-
|
|
2476
|
-
# If this is the first run in this event loop thread, set up the necessary
|
|
2477
|
-
# variables
|
|
2478
|
-
try:
|
|
2479
|
-
idle_workers = _threadpool_idle_workers.get()
|
|
2480
|
-
workers = _threadpool_workers.get()
|
|
2481
|
-
except LookupError:
|
|
2482
|
-
idle_workers = deque()
|
|
2483
|
-
workers = set()
|
|
2484
|
-
_threadpool_idle_workers.set(idle_workers)
|
|
2485
|
-
_threadpool_workers.set(workers)
|
|
2486
|
-
|
|
2487
|
-
async with limiter or cls.current_default_thread_limiter():
|
|
2488
|
-
with CancelScope(shield=not abandon_on_cancel) as scope:
|
|
2489
|
-
future = asyncio.Future[T_Retval]()
|
|
2490
|
-
root_task = find_root_task()
|
|
2491
|
-
if not idle_workers:
|
|
2492
|
-
worker = WorkerThread(root_task, workers, idle_workers)
|
|
2493
|
-
worker.start()
|
|
2494
|
-
workers.add(worker)
|
|
2495
|
-
root_task.add_done_callback(
|
|
2496
|
-
worker.stop, context=contextvars.Context()
|
|
2497
|
-
)
|
|
2498
|
-
else:
|
|
2499
|
-
worker = idle_workers.pop()
|
|
2500
|
-
|
|
2501
|
-
# Prune any other workers that have been idle for MAX_IDLE_TIME
|
|
2502
|
-
# seconds or longer
|
|
2503
|
-
now = cls.current_time()
|
|
2504
|
-
while idle_workers:
|
|
2505
|
-
if (
|
|
2506
|
-
now - idle_workers[0].idle_since
|
|
2507
|
-
< WorkerThread.MAX_IDLE_TIME
|
|
2508
|
-
):
|
|
2509
|
-
break
|
|
2510
|
-
|
|
2511
|
-
expired_worker = idle_workers.popleft()
|
|
2512
|
-
expired_worker.root_task.remove_done_callback(
|
|
2513
|
-
expired_worker.stop
|
|
2514
|
-
)
|
|
2515
|
-
expired_worker.stop()
|
|
2516
|
-
|
|
2517
|
-
context = copy_context()
|
|
2518
|
-
context.run(set_current_async_library, None)
|
|
2519
|
-
if abandon_on_cancel or scope._parent_scope is None:
|
|
2520
|
-
worker_scope = scope
|
|
2521
|
-
else:
|
|
2522
|
-
worker_scope = scope._parent_scope
|
|
2523
|
-
|
|
2524
|
-
worker.queue.put_nowait((context, func, args, future, worker_scope))
|
|
2525
|
-
return await future
|
|
2526
|
-
|
|
2527
|
-
@classmethod
|
|
2528
|
-
def check_cancelled(cls) -> None:
|
|
2529
|
-
scope: CancelScope | None = threadlocals.current_cancel_scope
|
|
2530
|
-
while scope is not None:
|
|
2531
|
-
if scope.cancel_called:
|
|
2532
|
-
raise CancelledError(f"Cancelled by cancel scope {id(scope):x}")
|
|
2533
|
-
|
|
2534
|
-
if scope.shield:
|
|
2535
|
-
return
|
|
2536
|
-
|
|
2537
|
-
scope = scope._parent_scope
|
|
2538
|
-
|
|
2539
|
-
@classmethod
|
|
2540
|
-
def run_async_from_thread(
|
|
2541
|
-
cls,
|
|
2542
|
-
func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]],
|
|
2543
|
-
args: tuple[Unpack[PosArgsT]],
|
|
2544
|
-
token: object,
|
|
2545
|
-
) -> T_Retval:
|
|
2546
|
-
async def task_wrapper() -> T_Retval:
|
|
2547
|
-
__tracebackhide__ = True
|
|
2548
|
-
if scope is not None:
|
|
2549
|
-
task = cast(asyncio.Task, current_task())
|
|
2550
|
-
_task_states[task] = TaskState(None, scope)
|
|
2551
|
-
scope._tasks.add(task)
|
|
2552
|
-
try:
|
|
2553
|
-
return await func(*args)
|
|
2554
|
-
except CancelledError as exc:
|
|
2555
|
-
raise concurrent.futures.CancelledError(str(exc)) from None
|
|
2556
|
-
finally:
|
|
2557
|
-
if scope is not None:
|
|
2558
|
-
scope._tasks.discard(task)
|
|
2559
|
-
|
|
2560
|
-
loop = cast(
|
|
2561
|
-
"AbstractEventLoop", token or threadlocals.current_token.native_token
|
|
2562
|
-
)
|
|
2563
|
-
if loop.is_closed():
|
|
2564
|
-
raise RunFinishedError
|
|
2565
|
-
|
|
2566
|
-
context = copy_context()
|
|
2567
|
-
context.run(set_current_async_library, "asyncio")
|
|
2568
|
-
scope = getattr(threadlocals, "current_cancel_scope", None)
|
|
2569
|
-
f: concurrent.futures.Future[T_Retval] = context.run(
|
|
2570
|
-
asyncio.run_coroutine_threadsafe, task_wrapper(), loop=loop
|
|
2571
|
-
)
|
|
2572
|
-
return f.result()
|
|
2573
|
-
|
|
2574
|
-
@classmethod
|
|
2575
|
-
def run_sync_from_thread(
|
|
2576
|
-
cls,
|
|
2577
|
-
func: Callable[[Unpack[PosArgsT]], T_Retval],
|
|
2578
|
-
args: tuple[Unpack[PosArgsT]],
|
|
2579
|
-
token: object,
|
|
2580
|
-
) -> T_Retval:
|
|
2581
|
-
@wraps(func)
|
|
2582
|
-
def wrapper() -> None:
|
|
2583
|
-
try:
|
|
2584
|
-
set_current_async_library("asyncio")
|
|
2585
|
-
f.set_result(func(*args))
|
|
2586
|
-
except BaseException as exc:
|
|
2587
|
-
f.set_exception(exc)
|
|
2588
|
-
if not isinstance(exc, Exception):
|
|
2589
|
-
raise
|
|
2590
|
-
|
|
2591
|
-
loop = cast(
|
|
2592
|
-
"AbstractEventLoop", token or threadlocals.current_token.native_token
|
|
2593
|
-
)
|
|
2594
|
-
if loop.is_closed():
|
|
2595
|
-
raise RunFinishedError
|
|
2596
|
-
|
|
2597
|
-
f: concurrent.futures.Future[T_Retval] = Future()
|
|
2598
|
-
loop.call_soon_threadsafe(wrapper)
|
|
2599
|
-
return f.result()
|
|
2600
|
-
|
|
2601
|
-
@classmethod
|
|
2602
|
-
def create_blocking_portal(cls) -> abc.BlockingPortal:
|
|
2603
|
-
return BlockingPortal()
|
|
2604
|
-
|
|
2605
|
-
@classmethod
|
|
2606
|
-
async def open_process(
|
|
2607
|
-
cls,
|
|
2608
|
-
command: StrOrBytesPath | Sequence[StrOrBytesPath],
|
|
2609
|
-
*,
|
|
2610
|
-
stdin: int | IO[Any] | None,
|
|
2611
|
-
stdout: int | IO[Any] | None,
|
|
2612
|
-
stderr: int | IO[Any] | None,
|
|
2613
|
-
**kwargs: Any,
|
|
2614
|
-
) -> Process:
|
|
2615
|
-
await cls.checkpoint()
|
|
2616
|
-
if isinstance(command, PathLike):
|
|
2617
|
-
command = os.fspath(command)
|
|
2618
|
-
|
|
2619
|
-
if isinstance(command, (str, bytes)):
|
|
2620
|
-
process = await asyncio.create_subprocess_shell(
|
|
2621
|
-
command,
|
|
2622
|
-
stdin=stdin,
|
|
2623
|
-
stdout=stdout,
|
|
2624
|
-
stderr=stderr,
|
|
2625
|
-
**kwargs,
|
|
2626
|
-
)
|
|
2627
|
-
else:
|
|
2628
|
-
process = await asyncio.create_subprocess_exec(
|
|
2629
|
-
*command,
|
|
2630
|
-
stdin=stdin,
|
|
2631
|
-
stdout=stdout,
|
|
2632
|
-
stderr=stderr,
|
|
2633
|
-
**kwargs,
|
|
2634
|
-
)
|
|
2635
|
-
|
|
2636
|
-
stdin_stream = StreamWriterWrapper(process.stdin) if process.stdin else None
|
|
2637
|
-
stdout_stream = StreamReaderWrapper(process.stdout) if process.stdout else None
|
|
2638
|
-
stderr_stream = StreamReaderWrapper(process.stderr) if process.stderr else None
|
|
2639
|
-
return Process(process, stdin_stream, stdout_stream, stderr_stream)
|
|
2640
|
-
|
|
2641
|
-
@classmethod
|
|
2642
|
-
def setup_process_pool_exit_at_shutdown(cls, workers: set[abc.Process]) -> None:
|
|
2643
|
-
create_task(
|
|
2644
|
-
_shutdown_process_pool_on_exit(workers),
|
|
2645
|
-
name="AnyIO process pool shutdown task",
|
|
2646
|
-
)
|
|
2647
|
-
find_root_task().add_done_callback(
|
|
2648
|
-
partial(_forcibly_shutdown_process_pool_on_exit, workers) # type:ignore[arg-type]
|
|
2649
|
-
)
|
|
2650
|
-
|
|
2651
|
-
@classmethod
|
|
2652
|
-
async def connect_tcp(
|
|
2653
|
-
cls, host: str, port: int, local_address: IPSockAddrType | None = None
|
|
2654
|
-
) -> abc.SocketStream:
|
|
2655
|
-
transport, protocol = cast(
|
|
2656
|
-
tuple[asyncio.Transport, StreamProtocol],
|
|
2657
|
-
await get_running_loop().create_connection(
|
|
2658
|
-
StreamProtocol, host, port, local_addr=local_address
|
|
2659
|
-
),
|
|
2660
|
-
)
|
|
2661
|
-
transport.pause_reading()
|
|
2662
|
-
return SocketStream(transport, protocol)
|
|
2663
|
-
|
|
2664
|
-
@classmethod
|
|
2665
|
-
async def connect_unix(cls, path: str | bytes) -> abc.UNIXSocketStream:
|
|
2666
|
-
await cls.checkpoint()
|
|
2667
|
-
loop = get_running_loop()
|
|
2668
|
-
raw_socket = socket.socket(socket.AF_UNIX)
|
|
2669
|
-
raw_socket.setblocking(False)
|
|
2670
|
-
while True:
|
|
2671
|
-
try:
|
|
2672
|
-
raw_socket.connect(path)
|
|
2673
|
-
except BlockingIOError:
|
|
2674
|
-
f: asyncio.Future = asyncio.Future()
|
|
2675
|
-
loop.add_writer(raw_socket, f.set_result, None)
|
|
2676
|
-
f.add_done_callback(lambda _: loop.remove_writer(raw_socket))
|
|
2677
|
-
await f
|
|
2678
|
-
except BaseException:
|
|
2679
|
-
raw_socket.close()
|
|
2680
|
-
raise
|
|
2681
|
-
else:
|
|
2682
|
-
return UNIXSocketStream(raw_socket)
|
|
2683
|
-
|
|
2684
|
-
@classmethod
|
|
2685
|
-
def create_tcp_listener(cls, sock: socket.socket) -> SocketListener:
|
|
2686
|
-
return TCPSocketListener(sock)
|
|
2687
|
-
|
|
2688
|
-
@classmethod
|
|
2689
|
-
def create_unix_listener(cls, sock: socket.socket) -> SocketListener:
|
|
2690
|
-
return UNIXSocketListener(sock)
|
|
2691
|
-
|
|
2692
|
-
@classmethod
|
|
2693
|
-
async def create_udp_socket(
|
|
2694
|
-
cls,
|
|
2695
|
-
family: AddressFamily,
|
|
2696
|
-
local_address: IPSockAddrType | None,
|
|
2697
|
-
remote_address: IPSockAddrType | None,
|
|
2698
|
-
reuse_port: bool,
|
|
2699
|
-
) -> UDPSocket | ConnectedUDPSocket:
|
|
2700
|
-
transport, protocol = await get_running_loop().create_datagram_endpoint(
|
|
2701
|
-
DatagramProtocol,
|
|
2702
|
-
local_addr=local_address,
|
|
2703
|
-
remote_addr=remote_address,
|
|
2704
|
-
family=family,
|
|
2705
|
-
reuse_port=reuse_port,
|
|
2706
|
-
)
|
|
2707
|
-
if protocol.exception:
|
|
2708
|
-
transport.close()
|
|
2709
|
-
raise protocol.exception
|
|
2710
|
-
|
|
2711
|
-
if not remote_address:
|
|
2712
|
-
return UDPSocket(transport, protocol)
|
|
2713
|
-
else:
|
|
2714
|
-
return ConnectedUDPSocket(transport, protocol)
|
|
2715
|
-
|
|
2716
|
-
@classmethod
|
|
2717
|
-
async def create_unix_datagram_socket( # type: ignore[override]
|
|
2718
|
-
cls, raw_socket: socket.socket, remote_path: str | bytes | None
|
|
2719
|
-
) -> abc.UNIXDatagramSocket | abc.ConnectedUNIXDatagramSocket:
|
|
2720
|
-
await cls.checkpoint()
|
|
2721
|
-
loop = get_running_loop()
|
|
2722
|
-
|
|
2723
|
-
if remote_path:
|
|
2724
|
-
while True:
|
|
2725
|
-
try:
|
|
2726
|
-
raw_socket.connect(remote_path)
|
|
2727
|
-
except BlockingIOError:
|
|
2728
|
-
f: asyncio.Future = asyncio.Future()
|
|
2729
|
-
loop.add_writer(raw_socket, f.set_result, None)
|
|
2730
|
-
f.add_done_callback(lambda _: loop.remove_writer(raw_socket))
|
|
2731
|
-
await f
|
|
2732
|
-
except BaseException:
|
|
2733
|
-
raw_socket.close()
|
|
2734
|
-
raise
|
|
2735
|
-
else:
|
|
2736
|
-
return ConnectedUNIXDatagramSocket(raw_socket)
|
|
2737
|
-
else:
|
|
2738
|
-
return UNIXDatagramSocket(raw_socket)
|
|
2739
|
-
|
|
2740
|
-
@classmethod
|
|
2741
|
-
async def getaddrinfo(
|
|
2742
|
-
cls,
|
|
2743
|
-
host: bytes | str | None,
|
|
2744
|
-
port: str | int | None,
|
|
2745
|
-
*,
|
|
2746
|
-
family: int | AddressFamily = 0,
|
|
2747
|
-
type: int | SocketKind = 0,
|
|
2748
|
-
proto: int = 0,
|
|
2749
|
-
flags: int = 0,
|
|
2750
|
-
) -> Sequence[
|
|
2751
|
-
tuple[
|
|
2752
|
-
AddressFamily,
|
|
2753
|
-
SocketKind,
|
|
2754
|
-
int,
|
|
2755
|
-
str,
|
|
2756
|
-
tuple[str, int] | tuple[str, int, int, int] | tuple[int, bytes],
|
|
2757
|
-
]
|
|
2758
|
-
]:
|
|
2759
|
-
return await get_running_loop().getaddrinfo(
|
|
2760
|
-
host, port, family=family, type=type, proto=proto, flags=flags
|
|
2761
|
-
)
|
|
2762
|
-
|
|
2763
|
-
@classmethod
|
|
2764
|
-
async def getnameinfo(
|
|
2765
|
-
cls, sockaddr: IPSockAddrType, flags: int = 0
|
|
2766
|
-
) -> tuple[str, str]:
|
|
2767
|
-
return await get_running_loop().getnameinfo(sockaddr, flags)
|
|
2768
|
-
|
|
2769
|
-
@classmethod
|
|
2770
|
-
async def wait_readable(cls, obj: FileDescriptorLike) -> None:
|
|
2771
|
-
try:
|
|
2772
|
-
read_events = _read_events.get()
|
|
2773
|
-
except LookupError:
|
|
2774
|
-
read_events = {}
|
|
2775
|
-
_read_events.set(read_events)
|
|
2776
|
-
|
|
2777
|
-
fd = obj if isinstance(obj, int) else obj.fileno()
|
|
2778
|
-
if read_events.get(fd):
|
|
2779
|
-
raise BusyResourceError("reading from")
|
|
2780
|
-
|
|
2781
|
-
loop = get_running_loop()
|
|
2782
|
-
fut: asyncio.Future[bool] = loop.create_future()
|
|
2783
|
-
|
|
2784
|
-
def cb() -> None:
|
|
2785
|
-
try:
|
|
2786
|
-
del read_events[fd]
|
|
2787
|
-
except KeyError:
|
|
2788
|
-
pass
|
|
2789
|
-
else:
|
|
2790
|
-
remove_reader(fd)
|
|
2791
|
-
|
|
2792
|
-
try:
|
|
2793
|
-
fut.set_result(True)
|
|
2794
|
-
except asyncio.InvalidStateError:
|
|
2795
|
-
pass
|
|
2796
|
-
|
|
2797
|
-
try:
|
|
2798
|
-
loop.add_reader(fd, cb)
|
|
2799
|
-
except NotImplementedError:
|
|
2800
|
-
from anyio._core._asyncio_selector_thread import get_selector
|
|
2801
|
-
|
|
2802
|
-
selector = get_selector()
|
|
2803
|
-
selector.add_reader(fd, cb)
|
|
2804
|
-
remove_reader = selector.remove_reader
|
|
2805
|
-
else:
|
|
2806
|
-
remove_reader = loop.remove_reader
|
|
2807
|
-
|
|
2808
|
-
read_events[fd] = fut
|
|
2809
|
-
try:
|
|
2810
|
-
success = await fut
|
|
2811
|
-
finally:
|
|
2812
|
-
try:
|
|
2813
|
-
del read_events[fd]
|
|
2814
|
-
except KeyError:
|
|
2815
|
-
pass
|
|
2816
|
-
else:
|
|
2817
|
-
remove_reader(fd)
|
|
2818
|
-
|
|
2819
|
-
if not success:
|
|
2820
|
-
raise ClosedResourceError
|
|
2821
|
-
|
|
2822
|
-
@classmethod
|
|
2823
|
-
async def wait_writable(cls, obj: FileDescriptorLike) -> None:
|
|
2824
|
-
try:
|
|
2825
|
-
write_events = _write_events.get()
|
|
2826
|
-
except LookupError:
|
|
2827
|
-
write_events = {}
|
|
2828
|
-
_write_events.set(write_events)
|
|
2829
|
-
|
|
2830
|
-
fd = obj if isinstance(obj, int) else obj.fileno()
|
|
2831
|
-
if write_events.get(fd):
|
|
2832
|
-
raise BusyResourceError("writing to")
|
|
2833
|
-
|
|
2834
|
-
loop = get_running_loop()
|
|
2835
|
-
fut: asyncio.Future[bool] = loop.create_future()
|
|
2836
|
-
|
|
2837
|
-
def cb() -> None:
|
|
2838
|
-
try:
|
|
2839
|
-
del write_events[fd]
|
|
2840
|
-
except KeyError:
|
|
2841
|
-
pass
|
|
2842
|
-
else:
|
|
2843
|
-
remove_writer(fd)
|
|
2844
|
-
|
|
2845
|
-
try:
|
|
2846
|
-
fut.set_result(True)
|
|
2847
|
-
except asyncio.InvalidStateError:
|
|
2848
|
-
pass
|
|
2849
|
-
|
|
2850
|
-
try:
|
|
2851
|
-
loop.add_writer(fd, cb)
|
|
2852
|
-
except NotImplementedError:
|
|
2853
|
-
from anyio._core._asyncio_selector_thread import get_selector
|
|
2854
|
-
|
|
2855
|
-
selector = get_selector()
|
|
2856
|
-
selector.add_writer(fd, cb)
|
|
2857
|
-
remove_writer = selector.remove_writer
|
|
2858
|
-
else:
|
|
2859
|
-
remove_writer = loop.remove_writer
|
|
2860
|
-
|
|
2861
|
-
write_events[fd] = fut
|
|
2862
|
-
try:
|
|
2863
|
-
success = await fut
|
|
2864
|
-
finally:
|
|
2865
|
-
try:
|
|
2866
|
-
del write_events[fd]
|
|
2867
|
-
except KeyError:
|
|
2868
|
-
pass
|
|
2869
|
-
else:
|
|
2870
|
-
remove_writer(fd)
|
|
2871
|
-
|
|
2872
|
-
if not success:
|
|
2873
|
-
raise ClosedResourceError
|
|
2874
|
-
|
|
2875
|
-
@classmethod
|
|
2876
|
-
def notify_closing(cls, obj: FileDescriptorLike) -> None:
|
|
2877
|
-
fd = obj if isinstance(obj, int) else obj.fileno()
|
|
2878
|
-
loop = get_running_loop()
|
|
2879
|
-
|
|
2880
|
-
try:
|
|
2881
|
-
write_events = _write_events.get()
|
|
2882
|
-
except LookupError:
|
|
2883
|
-
pass
|
|
2884
|
-
else:
|
|
2885
|
-
try:
|
|
2886
|
-
fut = write_events.pop(fd)
|
|
2887
|
-
except KeyError:
|
|
2888
|
-
pass
|
|
2889
|
-
else:
|
|
2890
|
-
try:
|
|
2891
|
-
fut.set_result(False)
|
|
2892
|
-
except asyncio.InvalidStateError:
|
|
2893
|
-
pass
|
|
2894
|
-
|
|
2895
|
-
try:
|
|
2896
|
-
loop.remove_writer(fd)
|
|
2897
|
-
except NotImplementedError:
|
|
2898
|
-
from anyio._core._asyncio_selector_thread import get_selector
|
|
2899
|
-
|
|
2900
|
-
get_selector().remove_writer(fd)
|
|
2901
|
-
|
|
2902
|
-
try:
|
|
2903
|
-
read_events = _read_events.get()
|
|
2904
|
-
except LookupError:
|
|
2905
|
-
pass
|
|
2906
|
-
else:
|
|
2907
|
-
try:
|
|
2908
|
-
fut = read_events.pop(fd)
|
|
2909
|
-
except KeyError:
|
|
2910
|
-
pass
|
|
2911
|
-
else:
|
|
2912
|
-
try:
|
|
2913
|
-
fut.set_result(False)
|
|
2914
|
-
except asyncio.InvalidStateError:
|
|
2915
|
-
pass
|
|
2916
|
-
|
|
2917
|
-
try:
|
|
2918
|
-
loop.remove_reader(fd)
|
|
2919
|
-
except NotImplementedError:
|
|
2920
|
-
from anyio._core._asyncio_selector_thread import get_selector
|
|
2921
|
-
|
|
2922
|
-
get_selector().remove_reader(fd)
|
|
2923
|
-
|
|
2924
|
-
@classmethod
|
|
2925
|
-
async def wrap_listener_socket(cls, sock: socket.socket) -> SocketListener:
|
|
2926
|
-
return TCPSocketListener(sock)
|
|
2927
|
-
|
|
2928
|
-
@classmethod
|
|
2929
|
-
async def wrap_stream_socket(cls, sock: socket.socket) -> SocketStream:
|
|
2930
|
-
transport, protocol = await get_running_loop().create_connection(
|
|
2931
|
-
StreamProtocol, sock=sock
|
|
2932
|
-
)
|
|
2933
|
-
return SocketStream(transport, protocol)
|
|
2934
|
-
|
|
2935
|
-
@classmethod
|
|
2936
|
-
async def wrap_unix_stream_socket(cls, sock: socket.socket) -> UNIXSocketStream:
|
|
2937
|
-
return UNIXSocketStream(sock)
|
|
2938
|
-
|
|
2939
|
-
@classmethod
|
|
2940
|
-
async def wrap_udp_socket(cls, sock: socket.socket) -> UDPSocket:
|
|
2941
|
-
transport, protocol = await get_running_loop().create_datagram_endpoint(
|
|
2942
|
-
DatagramProtocol, sock=sock
|
|
2943
|
-
)
|
|
2944
|
-
return UDPSocket(transport, protocol)
|
|
2945
|
-
|
|
2946
|
-
@classmethod
|
|
2947
|
-
async def wrap_connected_udp_socket(cls, sock: socket.socket) -> ConnectedUDPSocket:
|
|
2948
|
-
transport, protocol = await get_running_loop().create_datagram_endpoint(
|
|
2949
|
-
DatagramProtocol, sock=sock
|
|
2950
|
-
)
|
|
2951
|
-
return ConnectedUDPSocket(transport, protocol)
|
|
2952
|
-
|
|
2953
|
-
@classmethod
|
|
2954
|
-
async def wrap_unix_datagram_socket(cls, sock: socket.socket) -> UNIXDatagramSocket:
|
|
2955
|
-
return UNIXDatagramSocket(sock)
|
|
2956
|
-
|
|
2957
|
-
@classmethod
|
|
2958
|
-
async def wrap_connected_unix_datagram_socket(
|
|
2959
|
-
cls, sock: socket.socket
|
|
2960
|
-
) -> ConnectedUNIXDatagramSocket:
|
|
2961
|
-
return ConnectedUNIXDatagramSocket(sock)
|
|
2962
|
-
|
|
2963
|
-
@classmethod
|
|
2964
|
-
def current_default_thread_limiter(cls) -> CapacityLimiter:
|
|
2965
|
-
try:
|
|
2966
|
-
return _default_thread_limiter.get()
|
|
2967
|
-
except LookupError:
|
|
2968
|
-
limiter = CapacityLimiter(40)
|
|
2969
|
-
_default_thread_limiter.set(limiter)
|
|
2970
|
-
return limiter
|
|
2971
|
-
|
|
2972
|
-
@classmethod
|
|
2973
|
-
def open_signal_receiver(
|
|
2974
|
-
cls, *signals: Signals
|
|
2975
|
-
) -> AbstractContextManager[AsyncIterator[Signals]]:
|
|
2976
|
-
return _SignalReceiver(signals)
|
|
2977
|
-
|
|
2978
|
-
@classmethod
|
|
2979
|
-
def get_current_task(cls) -> TaskInfo:
|
|
2980
|
-
return AsyncIOTaskInfo(current_task()) # type: ignore[arg-type]
|
|
2981
|
-
|
|
2982
|
-
@classmethod
|
|
2983
|
-
def get_running_tasks(cls) -> Sequence[TaskInfo]:
|
|
2984
|
-
return [AsyncIOTaskInfo(task) for task in all_tasks() if not task.done()]
|
|
2985
|
-
|
|
2986
|
-
@classmethod
|
|
2987
|
-
async def wait_all_tasks_blocked(cls) -> None:
|
|
2988
|
-
await cls.checkpoint()
|
|
2989
|
-
this_task = current_task()
|
|
2990
|
-
while True:
|
|
2991
|
-
for task in all_tasks():
|
|
2992
|
-
if task is this_task:
|
|
2993
|
-
continue
|
|
2994
|
-
|
|
2995
|
-
waiter = task._fut_waiter # type: ignore[attr-defined]
|
|
2996
|
-
if waiter is None or waiter.done():
|
|
2997
|
-
await sleep(0.1)
|
|
2998
|
-
break
|
|
2999
|
-
else:
|
|
3000
|
-
return
|
|
3001
|
-
|
|
3002
|
-
@classmethod
|
|
3003
|
-
def create_test_runner(cls, options: dict[str, Any]) -> TestRunner:
|
|
3004
|
-
return TestRunner(**options)
|
|
3005
|
-
|
|
3006
|
-
|
|
3007
|
-
backend_class = AsyncIOBackend
|