From 8082124adaa578dcfad31525111a5d6c4670efe7 Mon Sep 17 00:00:00 2001 From: b-long Date: Wed, 3 Jun 2026 19:57:50 -0400 Subject: [PATCH 1/8] chore: switch to uv workspace with packages layout --- .github/workflows/test-suite.yaml | 13 +- .release-please-config-develop.json | 11 +- .release-please-config.json | 11 +- .release-please-manifest-develop.json | 2 +- .release-please-manifest.json | 2 +- README.md | 135 +--- otdf-python-proto/uv.lock | 465 ------------ .../otdf-python-proto}/README.md | 0 .../otdf-python-proto}/buf.gen.yaml | 2 +- .../otdf-python-proto}/buf.lock | 0 .../otdf-python-proto}/buf.yaml | 0 .../otdf-python-proto}/generated/__init__.py | 0 .../authorization/authorization.proto | 0 .../authorization/v2/authorization.proto | 0 .../proto-files/common/common.proto | 0 .../proto-files/entity/entity.proto | 0 .../entityresolution/entity_resolution.proto | 0 .../v2/entity_resolution.proto | 0 .../proto-files/kas/kas.proto | 0 .../proto-files/logger/audit/test.proto | 0 .../proto-files/policy/actions/actions.proto | 0 .../policy/attributes/attributes.proto | 0 .../key_access_server_registry.proto | 0 .../policy/keymanagement/key_management.proto | 0 .../policy/namespaces/namespaces.proto | 0 .../proto-files/policy/objects.proto | 0 .../policy/obligations/obligations.proto | 0 .../registered_resources.proto | 0 .../resourcemapping/resource_mapping.proto | 0 .../proto-files/policy/selectors.proto | 0 .../subjectmapping/subject_mapping.proto | 0 .../proto-files/policy/unsafe/unsafe.proto | 0 .../wellknown_configuration.proto | 0 .../otdf-python-proto}/pyproject.toml | 0 .../scripts/build_connect_proto.sh | 0 .../scripts/generate_connect_proto.py | 0 .../scripts/setup_connect_rpc.py | 0 .../src/otdf_python_proto/__init__.py | 0 .../authorization/__init__.py | 0 .../authorization/authorization_connect.py | 0 .../authorization/authorization_pb2.py | 0 .../authorization/authorization_pb2.pyi | 0 .../authorization/v2/__init__.py | 0 .../authorization/v2/authorization_connect.py | 0 .../authorization/v2/authorization_pb2.py | 0 .../authorization/v2/authorization_pb2.pyi | 0 .../src/otdf_python_proto/common/__init__.py | 0 .../otdf_python_proto/common/common_pb2.py | 0 .../otdf_python_proto/common/common_pb2.pyi | 0 .../src/otdf_python_proto/entity/__init__.py | 0 .../otdf_python_proto/entity/entity_pb2.py | 0 .../otdf_python_proto/entity/entity_pb2.pyi | 0 .../entityresolution/__init__.py | 0 .../entity_resolution_connect.py | 0 .../entityresolution/entity_resolution_pb2.py | 0 .../entity_resolution_pb2.pyi | 0 .../entityresolution/v2/__init__.py | 0 .../v2/entity_resolution_connect.py | 0 .../v2/entity_resolution_pb2.py | 0 .../v2/entity_resolution_pb2.pyi | 0 .../src/otdf_python_proto/kas/__init__.py | 0 .../src/otdf_python_proto/kas/kas_connect.py | 0 .../src/otdf_python_proto/kas/kas_pb2.py | 0 .../src/otdf_python_proto/kas/kas_pb2.pyi | 0 .../otdf_python_proto/legacy_grpc/__init__.py | 0 .../legacy_grpc/authorization/__init__.py | 0 .../authorization/authorization_pb2_grpc.py | 0 .../legacy_grpc/authorization/v2/__init__.py | 0 .../v2/authorization_pb2_grpc.py | 0 .../legacy_grpc/common/__init__.py | 0 .../legacy_grpc/common/common_pb2_grpc.py | 0 .../legacy_grpc/entity/__init__.py | 0 .../legacy_grpc/entity/entity_pb2_grpc.py | 0 .../legacy_grpc/entityresolution/__init__.py | 0 .../entity_resolution_pb2_grpc.py | 0 .../entityresolution/v2/__init__.py | 0 .../v2/entity_resolution_pb2_grpc.py | 0 .../legacy_grpc/kas/__init__.py | 0 .../legacy_grpc/kas/kas_pb2_grpc.py | 0 .../legacy_grpc/logger/__init__.py | 0 .../legacy_grpc/logger/audit/__init__.py | 0 .../legacy_grpc/logger/audit/test_pb2_grpc.py | 0 .../legacy_grpc/policy/__init__.py | 0 .../legacy_grpc/policy/actions/__init__.py | 0 .../policy/actions/actions_pb2_grpc.py | 0 .../legacy_grpc/policy/attributes/__init__.py | 0 .../policy/attributes/attributes_pb2_grpc.py | 0 .../policy/kasregistry/__init__.py | 0 .../key_access_server_registry_pb2_grpc.py | 0 .../policy/keymanagement/__init__.py | 0 .../keymanagement/key_management_pb2_grpc.py | 0 .../legacy_grpc/policy/namespaces/__init__.py | 0 .../policy/namespaces/namespaces_pb2_grpc.py | 0 .../legacy_grpc/policy/objects_pb2_grpc.py | 0 .../policy/obligations/__init__.py | 0 .../obligations/obligations_pb2_grpc.py | 0 .../policy/registeredresources/__init__.py | 0 .../registered_resources_pb2_grpc.py | 0 .../policy/resourcemapping/__init__.py | 0 .../resource_mapping_pb2_grpc.py | 0 .../legacy_grpc/policy/selectors_pb2_grpc.py | 0 .../policy/subjectmapping/__init__.py | 0 .../subject_mapping_pb2_grpc.py | 0 .../legacy_grpc/policy/unsafe/__init__.py | 0 .../policy/unsafe/unsafe_pb2_grpc.py | 0 .../wellknownconfiguration/__init__.py | 0 .../wellknown_configuration_pb2_grpc.py | 0 .../src/otdf_python_proto/logger/__init__.py | 0 .../logger/audit/__init__.py | 0 .../logger/audit/test_pb2.py | 0 .../logger/audit/test_pb2.pyi | 0 .../src/otdf_python_proto/policy/__init__.py | 0 .../policy/actions/__init__.py | 0 .../policy/actions/actions_connect.py | 0 .../policy/actions/actions_pb2.py | 0 .../policy/actions/actions_pb2.pyi | 0 .../policy/attributes/__init__.py | 0 .../policy/attributes/attributes_connect.py | 0 .../policy/attributes/attributes_pb2.py | 0 .../policy/attributes/attributes_pb2.pyi | 0 .../policy/kasregistry/__init__.py | 0 .../key_access_server_registry_connect.py | 0 .../key_access_server_registry_pb2.py | 0 .../key_access_server_registry_pb2.pyi | 0 .../policy/keymanagement/__init__.py | 0 .../keymanagement/key_management_connect.py | 0 .../keymanagement/key_management_pb2.py | 0 .../keymanagement/key_management_pb2.pyi | 0 .../policy/namespaces/__init__.py | 0 .../policy/namespaces/namespaces_connect.py | 0 .../policy/namespaces/namespaces_pb2.py | 0 .../policy/namespaces/namespaces_pb2.pyi | 0 .../otdf_python_proto/policy/objects_pb2.py | 0 .../otdf_python_proto/policy/objects_pb2.pyi | 0 .../policy/obligations/__init__.py | 0 .../policy/obligations/obligations_connect.py | 0 .../policy/obligations/obligations_pb2.py | 0 .../policy/obligations/obligations_pb2.pyi | 0 .../policy/registeredresources/__init__.py | 0 .../registered_resources_connect.py | 0 .../registered_resources_pb2.py | 0 .../registered_resources_pb2.pyi | 0 .../policy/resourcemapping/__init__.py | 0 .../resource_mapping_connect.py | 0 .../resourcemapping/resource_mapping_pb2.py | 0 .../resourcemapping/resource_mapping_pb2.pyi | 0 .../otdf_python_proto/policy/selectors_pb2.py | 0 .../policy/selectors_pb2.pyi | 0 .../policy/subjectmapping/__init__.py | 0 .../subjectmapping/subject_mapping_connect.py | 0 .../subjectmapping/subject_mapping_pb2.py | 0 .../subjectmapping/subject_mapping_pb2.pyi | 0 .../policy/unsafe/__init__.py | 0 .../policy/unsafe/unsafe_connect.py | 0 .../policy/unsafe/unsafe_pb2.py | 0 .../policy/unsafe/unsafe_pb2.pyi | 0 .../wellknownconfiguration/__init__.py | 0 .../wellknown_configuration_connect.py | 0 .../wellknown_configuration_pb2.py | 0 .../wellknown_configuration_pb2.pyi | 0 .../otdf-python-proto}/tests/__init__.py | 0 .../tests/test_generate_connect_proto.py | 0 .../tests/test_package_imports.py | 0 packages/otdf-python/README.md | 134 ++++ packages/otdf-python/pyproject.toml | 64 ++ .../otdf-python/src}/otdf_python/__init__.py | 0 .../otdf-python/src}/otdf_python/__main__.py | 0 .../src}/otdf_python/address_normalizer.py | 0 .../otdf-python/src}/otdf_python/aesgcm.py | 0 .../src}/otdf_python/assertion_config.py | 0 .../src}/otdf_python/asym_crypto.py | 0 .../src}/otdf_python/auth_headers.py | 0 .../src}/otdf_python/autoconfigure_utils.py | 0 .../otdf-python/src}/otdf_python/cli.py | 0 .../src}/otdf_python/collection_store.py | 0 .../src}/otdf_python/collection_store_impl.py | 0 .../otdf-python/src}/otdf_python/config.py | 0 .../src}/otdf_python/connect_client.py | 0 .../otdf-python/src}/otdf_python/constants.py | 0 .../src}/otdf_python/crypto_utils.py | 0 .../otdf-python/src}/otdf_python/dpop.py | 0 .../src}/otdf_python/ecc_constants.py | 0 .../otdf-python/src}/otdf_python/ecc_mode.py | 0 .../otdf-python/src}/otdf_python/ecdh.py | 0 .../otdf-python/src}/otdf_python/eckeypair.py | 0 .../otdf-python/src}/otdf_python/header.py | 0 .../src}/otdf_python/invalid_zip_exception.py | 0 .../src}/otdf_python/kas_allowlist.py | 0 .../src}/otdf_python/kas_client.py | 0 .../otdf_python/kas_connect_rpc_client.py | 0 .../otdf-python/src}/otdf_python/kas_info.py | 0 .../src}/otdf_python/kas_key_cache.py | 0 .../otdf-python/src}/otdf_python/key_type.py | 0 .../src}/otdf_python/key_type_constants.py | 0 .../otdf-python/src}/otdf_python/manifest.py | 0 .../otdf-python/src}/otdf_python/nanotdf.py | 0 .../src}/otdf_python/nanotdf_ecdsa_struct.py | 0 .../src}/otdf_python/nanotdf_type.py | 0 .../otdf_python/policy_binding_serializer.py | 0 .../src}/otdf_python/policy_info.py | 0 .../src}/otdf_python/policy_object.py | 0 .../src}/otdf_python/policy_stub.py | 0 .../src}/otdf_python/resource_locator.py | 0 .../otdf-python/src}/otdf_python/sdk.py | 0 .../src}/otdf_python/sdk_builder.py | 0 .../src}/otdf_python/sdk_exceptions.py | 0 .../symmetric_and_payload_config.py | 0 .../otdf-python/src}/otdf_python/tdf.py | 0 .../src}/otdf_python/tdf_reader.py | 0 .../src}/otdf_python/tdf_writer.py | 0 .../src}/otdf_python/token_source.py | 0 .../otdf-python/src}/otdf_python/version.py | 0 .../src}/otdf_python/zip_reader.py | 0 .../src}/otdf_python/zip_writer.py | 0 pyproject.toml | 76 +- .../test_tdf_reader_integration.py | 2 +- .../test_kas_client_integration.py | 2 +- tests/integration/support_sdk.py | 2 +- tests/integration/test_cli_tdf_validation.py | 2 +- tests/integration/test_pe_interaction.py | 2 +- tests/test_address_normalizer.py | 1 - tests/test_asym_encryption.py | 1 + tests/test_cli.py | 4 +- tests/test_crypto_utils.py | 1 - tests/test_ecdh.py | 1 - tests/test_kas_allowlist.py | 1 - tests/test_kas_client.py | 1 - tests/test_kas_key_management.py | 1 - tests/test_manifest_format.py | 1 + tests/test_nanotdf.py | 2 +- tests/test_nanotdf_ecdh.py | 1 - tests/test_nanotdf_ecdsa_struct.py | 1 - tests/test_nanotdf_integration.py | 1 - tests/test_sdk_builder.py | 1 - tests/test_sdk_tdf_integration.py | 1 + tests/test_tdf.py | 2 +- tests/test_tdf_reader.py | 1 - tests/test_url_normalization.py | 2 +- uv.lock | 679 ++++++++++-------- 239 files changed, 607 insertions(+), 1021 deletions(-) mode change 100644 => 120000 README.md delete mode 100644 otdf-python-proto/uv.lock rename {otdf-python-proto => packages/otdf-python-proto}/README.md (100%) rename {otdf-python-proto => packages/otdf-python-proto}/buf.gen.yaml (93%) rename {otdf-python-proto => packages/otdf-python-proto}/buf.lock (100%) rename {otdf-python-proto => packages/otdf-python-proto}/buf.yaml (100%) rename {otdf-python-proto => packages/otdf-python-proto}/generated/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/proto-files/authorization/authorization.proto (100%) rename {otdf-python-proto => packages/otdf-python-proto}/proto-files/authorization/v2/authorization.proto (100%) rename {otdf-python-proto => packages/otdf-python-proto}/proto-files/common/common.proto (100%) rename {otdf-python-proto => packages/otdf-python-proto}/proto-files/entity/entity.proto (100%) rename {otdf-python-proto => packages/otdf-python-proto}/proto-files/entityresolution/entity_resolution.proto (100%) rename {otdf-python-proto => packages/otdf-python-proto}/proto-files/entityresolution/v2/entity_resolution.proto (100%) rename {otdf-python-proto => packages/otdf-python-proto}/proto-files/kas/kas.proto (100%) rename {otdf-python-proto => packages/otdf-python-proto}/proto-files/logger/audit/test.proto (100%) rename {otdf-python-proto => packages/otdf-python-proto}/proto-files/policy/actions/actions.proto (100%) rename {otdf-python-proto => packages/otdf-python-proto}/proto-files/policy/attributes/attributes.proto (100%) rename {otdf-python-proto => packages/otdf-python-proto}/proto-files/policy/kasregistry/key_access_server_registry.proto (100%) rename {otdf-python-proto => packages/otdf-python-proto}/proto-files/policy/keymanagement/key_management.proto (100%) rename {otdf-python-proto => packages/otdf-python-proto}/proto-files/policy/namespaces/namespaces.proto (100%) rename {otdf-python-proto => packages/otdf-python-proto}/proto-files/policy/objects.proto (100%) rename {otdf-python-proto => packages/otdf-python-proto}/proto-files/policy/obligations/obligations.proto (100%) rename {otdf-python-proto => packages/otdf-python-proto}/proto-files/policy/registeredresources/registered_resources.proto (100%) rename {otdf-python-proto => packages/otdf-python-proto}/proto-files/policy/resourcemapping/resource_mapping.proto (100%) rename {otdf-python-proto => packages/otdf-python-proto}/proto-files/policy/selectors.proto (100%) rename {otdf-python-proto => packages/otdf-python-proto}/proto-files/policy/subjectmapping/subject_mapping.proto (100%) rename {otdf-python-proto => packages/otdf-python-proto}/proto-files/policy/unsafe/unsafe.proto (100%) rename {otdf-python-proto => packages/otdf-python-proto}/proto-files/wellknownconfiguration/wellknown_configuration.proto (100%) rename {otdf-python-proto => packages/otdf-python-proto}/pyproject.toml (100%) rename {otdf-python-proto => packages/otdf-python-proto}/scripts/build_connect_proto.sh (100%) rename {otdf-python-proto => packages/otdf-python-proto}/scripts/generate_connect_proto.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/scripts/setup_connect_rpc.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/authorization/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/authorization/authorization_connect.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/authorization/authorization_pb2.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/authorization/authorization_pb2.pyi (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/authorization/v2/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/authorization/v2/authorization_connect.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/authorization/v2/authorization_pb2.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/authorization/v2/authorization_pb2.pyi (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/common/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/common/common_pb2.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/common/common_pb2.pyi (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/entity/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/entity/entity_pb2.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/entity/entity_pb2.pyi (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/entityresolution/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/entityresolution/entity_resolution_connect.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/entityresolution/entity_resolution_pb2.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/entityresolution/entity_resolution_pb2.pyi (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/entityresolution/v2/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/entityresolution/v2/entity_resolution_connect.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/entityresolution/v2/entity_resolution_pb2.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/entityresolution/v2/entity_resolution_pb2.pyi (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/kas/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/kas/kas_connect.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/kas/kas_pb2.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/kas/kas_pb2.pyi (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/authorization/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/authorization/authorization_pb2_grpc.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/authorization/v2/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/authorization/v2/authorization_pb2_grpc.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/common/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/common/common_pb2_grpc.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/entity/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/entity/entity_pb2_grpc.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/entityresolution/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/entityresolution/entity_resolution_pb2_grpc.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/entityresolution/v2/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/entityresolution/v2/entity_resolution_pb2_grpc.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/kas/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/kas/kas_pb2_grpc.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/logger/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/logger/audit/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/logger/audit/test_pb2_grpc.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/policy/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/policy/actions/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/policy/actions/actions_pb2_grpc.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/policy/attributes/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/policy/attributes/attributes_pb2_grpc.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/policy/kasregistry/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/policy/kasregistry/key_access_server_registry_pb2_grpc.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/policy/keymanagement/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/policy/keymanagement/key_management_pb2_grpc.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/policy/namespaces/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/policy/namespaces/namespaces_pb2_grpc.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/policy/objects_pb2_grpc.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/policy/obligations/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/policy/obligations/obligations_pb2_grpc.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/policy/registeredresources/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/policy/registeredresources/registered_resources_pb2_grpc.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/policy/resourcemapping/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/policy/resourcemapping/resource_mapping_pb2_grpc.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/policy/selectors_pb2_grpc.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/policy/subjectmapping/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/policy/subjectmapping/subject_mapping_pb2_grpc.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/policy/unsafe/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/policy/unsafe/unsafe_pb2_grpc.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/wellknownconfiguration/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/legacy_grpc/wellknownconfiguration/wellknown_configuration_pb2_grpc.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/logger/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/logger/audit/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/logger/audit/test_pb2.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/logger/audit/test_pb2.pyi (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/actions/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/actions/actions_connect.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/actions/actions_pb2.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/actions/actions_pb2.pyi (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/attributes/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/attributes/attributes_connect.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/attributes/attributes_pb2.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/attributes/attributes_pb2.pyi (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/kasregistry/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/kasregistry/key_access_server_registry_connect.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/kasregistry/key_access_server_registry_pb2.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/kasregistry/key_access_server_registry_pb2.pyi (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/keymanagement/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/keymanagement/key_management_connect.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/keymanagement/key_management_pb2.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/keymanagement/key_management_pb2.pyi (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/namespaces/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/namespaces/namespaces_connect.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/namespaces/namespaces_pb2.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/namespaces/namespaces_pb2.pyi (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/objects_pb2.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/objects_pb2.pyi (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/obligations/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/obligations/obligations_connect.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/obligations/obligations_pb2.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/obligations/obligations_pb2.pyi (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/registeredresources/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/registeredresources/registered_resources_connect.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/registeredresources/registered_resources_pb2.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/registeredresources/registered_resources_pb2.pyi (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/resourcemapping/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/resourcemapping/resource_mapping_connect.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/resourcemapping/resource_mapping_pb2.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/resourcemapping/resource_mapping_pb2.pyi (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/selectors_pb2.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/selectors_pb2.pyi (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/subjectmapping/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/subjectmapping/subject_mapping_connect.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/subjectmapping/subject_mapping_pb2.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/subjectmapping/subject_mapping_pb2.pyi (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/unsafe/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/unsafe/unsafe_connect.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/unsafe/unsafe_pb2.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/policy/unsafe/unsafe_pb2.pyi (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/wellknownconfiguration/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/wellknownconfiguration/wellknown_configuration_connect.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/wellknownconfiguration/wellknown_configuration_pb2.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/src/otdf_python_proto/wellknownconfiguration/wellknown_configuration_pb2.pyi (100%) rename {otdf-python-proto => packages/otdf-python-proto}/tests/__init__.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/tests/test_generate_connect_proto.py (100%) rename {otdf-python-proto => packages/otdf-python-proto}/tests/test_package_imports.py (100%) create mode 100644 packages/otdf-python/README.md create mode 100644 packages/otdf-python/pyproject.toml rename {src => packages/otdf-python/src}/otdf_python/__init__.py (100%) rename {src => packages/otdf-python/src}/otdf_python/__main__.py (100%) rename {src => packages/otdf-python/src}/otdf_python/address_normalizer.py (100%) rename {src => packages/otdf-python/src}/otdf_python/aesgcm.py (100%) rename {src => packages/otdf-python/src}/otdf_python/assertion_config.py (100%) rename {src => packages/otdf-python/src}/otdf_python/asym_crypto.py (100%) rename {src => packages/otdf-python/src}/otdf_python/auth_headers.py (100%) rename {src => packages/otdf-python/src}/otdf_python/autoconfigure_utils.py (100%) rename {src => packages/otdf-python/src}/otdf_python/cli.py (100%) rename {src => packages/otdf-python/src}/otdf_python/collection_store.py (100%) rename {src => packages/otdf-python/src}/otdf_python/collection_store_impl.py (100%) rename {src => packages/otdf-python/src}/otdf_python/config.py (100%) rename {src => packages/otdf-python/src}/otdf_python/connect_client.py (100%) rename {src => packages/otdf-python/src}/otdf_python/constants.py (100%) rename {src => packages/otdf-python/src}/otdf_python/crypto_utils.py (100%) rename {src => packages/otdf-python/src}/otdf_python/dpop.py (100%) rename {src => packages/otdf-python/src}/otdf_python/ecc_constants.py (100%) rename {src => packages/otdf-python/src}/otdf_python/ecc_mode.py (100%) rename {src => packages/otdf-python/src}/otdf_python/ecdh.py (100%) rename {src => packages/otdf-python/src}/otdf_python/eckeypair.py (100%) rename {src => packages/otdf-python/src}/otdf_python/header.py (100%) rename {src => packages/otdf-python/src}/otdf_python/invalid_zip_exception.py (100%) rename {src => packages/otdf-python/src}/otdf_python/kas_allowlist.py (100%) rename {src => packages/otdf-python/src}/otdf_python/kas_client.py (100%) rename {src => packages/otdf-python/src}/otdf_python/kas_connect_rpc_client.py (100%) rename {src => packages/otdf-python/src}/otdf_python/kas_info.py (100%) rename {src => packages/otdf-python/src}/otdf_python/kas_key_cache.py (100%) rename {src => packages/otdf-python/src}/otdf_python/key_type.py (100%) rename {src => packages/otdf-python/src}/otdf_python/key_type_constants.py (100%) rename {src => packages/otdf-python/src}/otdf_python/manifest.py (100%) rename {src => packages/otdf-python/src}/otdf_python/nanotdf.py (100%) rename {src => packages/otdf-python/src}/otdf_python/nanotdf_ecdsa_struct.py (100%) rename {src => packages/otdf-python/src}/otdf_python/nanotdf_type.py (100%) rename {src => packages/otdf-python/src}/otdf_python/policy_binding_serializer.py (100%) rename {src => packages/otdf-python/src}/otdf_python/policy_info.py (100%) rename {src => packages/otdf-python/src}/otdf_python/policy_object.py (100%) rename {src => packages/otdf-python/src}/otdf_python/policy_stub.py (100%) rename {src => packages/otdf-python/src}/otdf_python/resource_locator.py (100%) rename {src => packages/otdf-python/src}/otdf_python/sdk.py (100%) rename {src => packages/otdf-python/src}/otdf_python/sdk_builder.py (100%) rename {src => packages/otdf-python/src}/otdf_python/sdk_exceptions.py (100%) rename {src => packages/otdf-python/src}/otdf_python/symmetric_and_payload_config.py (100%) rename {src => packages/otdf-python/src}/otdf_python/tdf.py (100%) rename {src => packages/otdf-python/src}/otdf_python/tdf_reader.py (100%) rename {src => packages/otdf-python/src}/otdf_python/tdf_writer.py (100%) rename {src => packages/otdf-python/src}/otdf_python/token_source.py (100%) rename {src => packages/otdf-python/src}/otdf_python/version.py (100%) rename {src => packages/otdf-python/src}/otdf_python/zip_reader.py (100%) rename {src => packages/otdf-python/src}/otdf_python/zip_writer.py (100%) diff --git a/.github/workflows/test-suite.yaml b/.github/workflows/test-suite.yaml index 5dbbc2e3..7c42931a 100644 --- a/.github/workflows/test-suite.yaml +++ b/.github/workflows/test-suite.yaml @@ -28,7 +28,7 @@ jobs: - name: Run linting (fail fast) run: | - uv sync --frozen + uv sync --frozen --all-groups uv run ruff check uv run ruff format --check @@ -43,13 +43,12 @@ jobs: uses: astral-sh/setup-uv@v6 with: enable-cache: true - cache-dependency-glob: "otdf-python-proto/uv.lock" + cache-dependency-glob: "uv.lock" - name: Run otdf-python-proto unit tests - working-directory: otdf-python-proto run: | - uv sync --frozen --group dev - uv run pytest --tb=short -v tests/ + uv sync --frozen --all-groups + uv run --package otdf-python-proto pytest --tb=short -v packages/otdf-python-proto/tests/ # Step 2b: Build (only after linting passes) build: @@ -70,7 +69,7 @@ jobs: - name: Build otdf-python wheel using uv run: | uv sync --frozen - uv build + uv build --wheel --package otdf-python shell: bash - name: Find built wheel @@ -101,7 +100,7 @@ jobs: - name: Run unit tests run: | - uv sync --frozen + uv sync --frozen --all-groups uv run pytest -m "not integration" --tb=short -v tests/ # Step 4: Integration tests (only after unit tests pass) diff --git a/.release-please-config-develop.json b/.release-please-config-develop.json index bd65fb3e..b2ebf127 100644 --- a/.release-please-config-develop.json +++ b/.release-please-config-develop.json @@ -3,27 +3,22 @@ "include-v-in-tag": true, "bootstrap-sha": "5ed358b3e2e0fd12dc336133f701b4ba5d8a298c", "packages": { - ".": { + "packages/otdf-python": { "release-type": "python", "package-name": "otdf-python", "prerelease": true, "prerelease-type": "alpha", "extra-files": [ - "pyproject.toml", + "packages/otdf-python/pyproject.toml", { "path": "uv.lock", "type": "toml", "jsonpath": "$.package[?(@.name.value=='otdf-python')].version" }, { - "path": "otdf-python-proto/pyproject.toml", + "path": "packages/otdf-python-proto/pyproject.toml", "type": "toml", "jsonpath": "$.project.version" - }, - { - "path": "otdf-python-proto/uv.lock", - "type": "toml", - "jsonpath": "$.package[?(@.name.value=='otdf-python-proto')].version" } ] } diff --git a/.release-please-config.json b/.release-please-config.json index 801e4983..e27f4da8 100644 --- a/.release-please-config.json +++ b/.release-please-config.json @@ -3,25 +3,20 @@ "include-v-in-tag": true, "bootstrap-sha": "5ed358b3e2e0fd12dc336133f701b4ba5d8a298c", "packages": { - ".": { + "packages/otdf-python": { "release-type": "python", "package-name": "otdf-python", "extra-files": [ - "pyproject.toml", + "packages/otdf-python/pyproject.toml", { "path": "uv.lock", "type": "toml", "jsonpath": "$.package[?(@.name.value=='otdf-python')].version" }, { - "path": "otdf-python-proto/pyproject.toml", + "path": "packages/otdf-python-proto/pyproject.toml", "type": "toml", "jsonpath": "$.project.version" - }, - { - "path": "otdf-python-proto/uv.lock", - "type": "toml", - "jsonpath": "$.package[?(@.name.value=='otdf-python-proto')].version" } ] } diff --git a/.release-please-manifest-develop.json b/.release-please-manifest-develop.json index beea3f73..90f74136 100644 --- a/.release-please-manifest-develop.json +++ b/.release-please-manifest-develop.json @@ -1,3 +1,3 @@ { - ".": "0.3.1" + "packages/otdf-python": "0.3.1" } diff --git a/.release-please-manifest.json b/.release-please-manifest.json index b5b966fb..021b981b 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.6.0" + "packages/otdf-python": "0.6.0" } diff --git a/README.md b/README.md deleted file mode 100644 index 719a2216..00000000 --- a/README.md +++ /dev/null @@ -1,134 +0,0 @@ -# OpenTDF Python SDK - -Unofficial OpenTDF SDK for Python - - -## Features - -- **TDF Encryption/Decryption**: Create and decrypt TDF files with policy-based access control -- **Flexible Configuration**: Support for various authentication methods and platform endpoints -- **Comprehensive Testing**: Full test suite with unit and integration tests - -## Legacy Version - -A legacy version (0.2.x) of this project is available for users who need the previous implementation. For more information, see [LEGACY_VERSION.md](docs/LEGACY_VERSION.md) or visit the [legacy branch on GitHub](https://github.com/b-long/opentdf-python-sdk/tree/0.2.x). - - -## Installation - -Install from PyPI: -```bash -pip install otdf-python -``` - -## Quick Start - -### Basic Configuration - -```python -from otdf_python.sdk_builder import SDKBuilder - -# Create and configure SDK using builder pattern -builder = SDKBuilder() -builder.set_platform_endpoint("https://platform.example.com") -builder.client_secret("your-client-id", "your-client-secret") - -# Build the SDK instance -sdk = builder.build() -``` - -### Advanced Configuration - -```python -from otdf_python.sdk_builder import SDKBuilder - -# Create SDK with additional configuration options -builder = SDKBuilder() -builder.set_platform_endpoint("https://platform.example.com") -builder.set_issuer_endpoint("https://auth.example.com") -builder.client_secret("your-client-id", "your-client-secret") - -# Examples, for local development - -# Use HTTP instead of HTTPS -builder.use_insecure_plaintext_connection(True) - -# Or -# Skip TLS verification -builder.use_insecure_skip_verify(True) - -# Build the SDK instance -sdk = builder.build() -``` - -### Encrypt Data - -```python -from io import BytesIO - -# Create TDF configuration with attributes -config = sdk.new_tdf_config(attributes=["https://example.net/attr/attr1/value/value1"]) - -# Encrypt data to TDF format -input_data = b"Hello, World!" -output_stream = BytesIO() -manifest, size, _ = sdk.create_tdf(BytesIO(input_data), config, output_stream) -encrypted_data = output_stream.getvalue() - -# Save encrypted data to file -with open("encrypted.tdf", "wb") as f: - f.write(encrypted_data) -``` - -### Decrypt Data - -```python -# Read encrypted TDF file -with open("encrypted.tdf", "rb") as f: - encrypted_data = f.read() - -# Decrypt TDF -tdf_reader = sdk.load_tdf(encrypted_data) -decrypted_data = tdf_reader.payload - -# Save decrypted data -with open("decrypted.txt", "wb") as f: - f.write(decrypted_data) - -``` - -## Project Structure - -``` -src/otdf_python/ -├── sdk.py # Main SDK interface -├── config.py # Configuration management -├── tdf.py # TDF format handling -├── nanotdf.py # NanoTDF format handling -├── crypto_utils.py # Cryptographic utilities -├── kas_client.py # Key Access Service client -└── ... # Additional modules -tests/ -└── ... # Various tests -``` - -## Contributing - -1. Fork the repository -2. Create a feature branch: `git checkout -b feature-name` -3. Make your changes -4. Run tests: `uv run pytest tests/` -5. Commit your changes: `git commit -am 'feat: add feature'` -6. Push to the branch: `git push origin feature-name` -7. Submit a pull request - -### Release Process - -For maintainers and contributors working on releases: -- See [RELEASES.md](docs/RELEASES.md) for comprehensive release documentation -- Feature branch alpha releases available for testing changes before merge -- Automated releases via Release Please on the main branch - -## License - -This project is licensed under the MIT License - see the LICENSE file for details. diff --git a/README.md b/README.md new file mode 120000 index 00000000..e4fb0d68 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +packages/otdf-python/README.md \ No newline at end of file diff --git a/otdf-python-proto/uv.lock b/otdf-python-proto/uv.lock deleted file mode 100644 index 23821676..00000000 --- a/otdf-python-proto/uv.lock +++ /dev/null @@ -1,465 +0,0 @@ -version = 1 -revision = 3 -requires-python = ">=3.10" - -[[package]] -name = "colorama" -version = "0.4.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, -] - -[[package]] -name = "connect-python" -version = "0.9.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "protobuf" }, - { name = "pyqwest" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/74/fc/0e4798c53e2754f5de36ecf4d198706cb23711d603df6c008f6e7b5b21ae/connect_python-0.9.0.tar.gz", hash = "sha256:a188ec843b0f5953b7e1b88061af50ad91c9aaa2e982d7a89a63ae5c1fff932e", size = 46094, upload-time = "2026-03-19T02:40:42.279Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4c/15/5b42df2d9d34e5103f2b69e4f6a4aeb47c52589eaac8d53eb5b0a40eabaa/connect_python-0.9.0-py3-none-any.whl", hash = "sha256:896171fa7236d4e1557e3f7eee76daa8c9dd762f2c21662515f2060f1b542574", size = 63381, upload-time = "2026-03-19T02:40:40.743Z" }, -] - -[[package]] -name = "exceptiongroup" -version = "1.3.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, -] - -[[package]] -name = "googleapis-common-protos" -version = "1.72.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "protobuf" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e5/7b/adfd75544c415c487b33061fe7ae526165241c1ea133f9a9125a56b39fd8/googleapis_common_protos-1.72.0.tar.gz", hash = "sha256:e55a601c1b32b52d7a3e65f43563e2aa61bcd737998ee672ac9b951cd49319f5", size = 147433, upload-time = "2025-11-06T18:29:24.087Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c4/ab/09169d5a4612a5f92490806649ac8d41e3ec9129c636754575b3553f4ea4/googleapis_common_protos-1.72.0-py3-none-any.whl", hash = "sha256:4299c5a82d5ae1a9702ada957347726b167f9f8d1fc352477702a1e851ff4038", size = 297515, upload-time = "2025-11-06T18:29:13.14Z" }, -] - -[[package]] -name = "grpcio" -version = "1.76.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b6/e0/318c1ce3ae5a17894d5791e87aea147587c9e702f24122cc7a5c8bbaeeb1/grpcio-1.76.0.tar.gz", hash = "sha256:7be78388d6da1a25c0d5ec506523db58b18be22d9c37d8d3a32c08be4987bd73", size = 12785182, upload-time = "2025-10-21T16:23:12.106Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/88/17/ff4795dc9a34b6aee6ec379f1b66438a3789cd1315aac0cbab60d92f74b3/grpcio-1.76.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:65a20de41e85648e00305c1bb09a3598f840422e522277641145a32d42dcefcc", size = 5840037, upload-time = "2025-10-21T16:20:25.069Z" }, - { url = "https://files.pythonhosted.org/packages/4e/ff/35f9b96e3fa2f12e1dcd58a4513a2e2294a001d64dec81677361b7040c9a/grpcio-1.76.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:40ad3afe81676fd9ec6d9d406eda00933f218038433980aa19d401490e46ecde", size = 11836482, upload-time = "2025-10-21T16:20:30.113Z" }, - { url = "https://files.pythonhosted.org/packages/3e/1c/8374990f9545e99462caacea5413ed783014b3b66ace49e35c533f07507b/grpcio-1.76.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:035d90bc79eaa4bed83f524331d55e35820725c9fbb00ffa1904d5550ed7ede3", size = 6407178, upload-time = "2025-10-21T16:20:32.733Z" }, - { url = "https://files.pythonhosted.org/packages/1e/77/36fd7d7c75a6c12542c90a6d647a27935a1ecaad03e0ffdb7c42db6b04d2/grpcio-1.76.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:4215d3a102bd95e2e11b5395c78562967959824156af11fa93d18fdd18050990", size = 7075684, upload-time = "2025-10-21T16:20:35.435Z" }, - { url = "https://files.pythonhosted.org/packages/38/f7/e3cdb252492278e004722306c5a8935eae91e64ea11f0af3437a7de2e2b7/grpcio-1.76.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:49ce47231818806067aea3324d4bf13825b658ad662d3b25fada0bdad9b8a6af", size = 6611133, upload-time = "2025-10-21T16:20:37.541Z" }, - { url = "https://files.pythonhosted.org/packages/7e/20/340db7af162ccd20a0893b5f3c4a5d676af7b71105517e62279b5b61d95a/grpcio-1.76.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8cc3309d8e08fd79089e13ed4819d0af72aa935dd8f435a195fd152796752ff2", size = 7195507, upload-time = "2025-10-21T16:20:39.643Z" }, - { url = "https://files.pythonhosted.org/packages/10/f0/b2160addc1487bd8fa4810857a27132fb4ce35c1b330c2f3ac45d697b106/grpcio-1.76.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:971fd5a1d6e62e00d945423a567e42eb1fa678ba89072832185ca836a94daaa6", size = 8160651, upload-time = "2025-10-21T16:20:42.492Z" }, - { url = "https://files.pythonhosted.org/packages/2c/2c/ac6f98aa113c6ef111b3f347854e99ebb7fb9d8f7bb3af1491d438f62af4/grpcio-1.76.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9d9adda641db7207e800a7f089068f6f645959f2df27e870ee81d44701dd9db3", size = 7620568, upload-time = "2025-10-21T16:20:45.995Z" }, - { url = "https://files.pythonhosted.org/packages/90/84/7852f7e087285e3ac17a2703bc4129fafee52d77c6c82af97d905566857e/grpcio-1.76.0-cp310-cp310-win32.whl", hash = "sha256:063065249d9e7e0782d03d2bca50787f53bd0fb89a67de9a7b521c4a01f1989b", size = 3998879, upload-time = "2025-10-21T16:20:48.592Z" }, - { url = "https://files.pythonhosted.org/packages/10/30/d3d2adcbb6dd3ff59d6ac3df6ef830e02b437fb5c90990429fd180e52f30/grpcio-1.76.0-cp310-cp310-win_amd64.whl", hash = "sha256:a6ae758eb08088d36812dd5d9af7a9859c05b1e0f714470ea243694b49278e7b", size = 4706892, upload-time = "2025-10-21T16:20:50.697Z" }, - { url = "https://files.pythonhosted.org/packages/a0/00/8163a1beeb6971f66b4bbe6ac9457b97948beba8dd2fc8e1281dce7f79ec/grpcio-1.76.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:2e1743fbd7f5fa713a1b0a8ac8ebabf0ec980b5d8809ec358d488e273b9cf02a", size = 5843567, upload-time = "2025-10-21T16:20:52.829Z" }, - { url = "https://files.pythonhosted.org/packages/10/c1/934202f5cf335e6d852530ce14ddb0fef21be612ba9ecbbcbd4d748ca32d/grpcio-1.76.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:a8c2cf1209497cf659a667d7dea88985e834c24b7c3b605e6254cbb5076d985c", size = 11848017, upload-time = "2025-10-21T16:20:56.705Z" }, - { url = "https://files.pythonhosted.org/packages/11/0b/8dec16b1863d74af6eb3543928600ec2195af49ca58b16334972f6775663/grpcio-1.76.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:08caea849a9d3c71a542827d6df9d5a69067b0a1efbea8a855633ff5d9571465", size = 6412027, upload-time = "2025-10-21T16:20:59.3Z" }, - { url = "https://files.pythonhosted.org/packages/d7/64/7b9e6e7ab910bea9d46f2c090380bab274a0b91fb0a2fe9b0cd399fffa12/grpcio-1.76.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:f0e34c2079d47ae9f6188211db9e777c619a21d4faba6977774e8fa43b085e48", size = 7075913, upload-time = "2025-10-21T16:21:01.645Z" }, - { url = "https://files.pythonhosted.org/packages/68/86/093c46e9546073cefa789bd76d44c5cb2abc824ca62af0c18be590ff13ba/grpcio-1.76.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8843114c0cfce61b40ad48df65abcfc00d4dba82eae8718fab5352390848c5da", size = 6615417, upload-time = "2025-10-21T16:21:03.844Z" }, - { url = "https://files.pythonhosted.org/packages/f7/b6/5709a3a68500a9c03da6fb71740dcdd5ef245e39266461a03f31a57036d8/grpcio-1.76.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8eddfb4d203a237da6f3cc8a540dad0517d274b5a1e9e636fd8d2c79b5c1d397", size = 7199683, upload-time = "2025-10-21T16:21:06.195Z" }, - { url = "https://files.pythonhosted.org/packages/91/d3/4b1f2bf16ed52ce0b508161df3a2d186e4935379a159a834cb4a7d687429/grpcio-1.76.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:32483fe2aab2c3794101c2a159070584e5db11d0aa091b2c0ea9c4fc43d0d749", size = 8163109, upload-time = "2025-10-21T16:21:08.498Z" }, - { url = "https://files.pythonhosted.org/packages/5c/61/d9043f95f5f4cf085ac5dd6137b469d41befb04bd80280952ffa2a4c3f12/grpcio-1.76.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dcfe41187da8992c5f40aa8c5ec086fa3672834d2be57a32384c08d5a05b4c00", size = 7626676, upload-time = "2025-10-21T16:21:10.693Z" }, - { url = "https://files.pythonhosted.org/packages/36/95/fd9a5152ca02d8881e4dd419cdd790e11805979f499a2e5b96488b85cf27/grpcio-1.76.0-cp311-cp311-win32.whl", hash = "sha256:2107b0c024d1b35f4083f11245c0e23846ae64d02f40b2b226684840260ed054", size = 3997688, upload-time = "2025-10-21T16:21:12.746Z" }, - { url = "https://files.pythonhosted.org/packages/60/9c/5c359c8d4c9176cfa3c61ecd4efe5affe1f38d9bae81e81ac7186b4c9cc8/grpcio-1.76.0-cp311-cp311-win_amd64.whl", hash = "sha256:522175aba7af9113c48ec10cc471b9b9bd4f6ceb36aeb4544a8e2c80ed9d252d", size = 4709315, upload-time = "2025-10-21T16:21:15.26Z" }, - { url = "https://files.pythonhosted.org/packages/bf/05/8e29121994b8d959ffa0afd28996d452f291b48cfc0875619de0bde2c50c/grpcio-1.76.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:81fd9652b37b36f16138611c7e884eb82e0cec137c40d3ef7c3f9b3ed00f6ed8", size = 5799718, upload-time = "2025-10-21T16:21:17.939Z" }, - { url = "https://files.pythonhosted.org/packages/d9/75/11d0e66b3cdf998c996489581bdad8900db79ebd83513e45c19548f1cba4/grpcio-1.76.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:04bbe1bfe3a68bbfd4e52402ab7d4eb59d72d02647ae2042204326cf4bbad280", size = 11825627, upload-time = "2025-10-21T16:21:20.466Z" }, - { url = "https://files.pythonhosted.org/packages/28/50/2f0aa0498bc188048f5d9504dcc5c2c24f2eb1a9337cd0fa09a61a2e75f0/grpcio-1.76.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d388087771c837cdb6515539f43b9d4bf0b0f23593a24054ac16f7a960be16f4", size = 6359167, upload-time = "2025-10-21T16:21:23.122Z" }, - { url = "https://files.pythonhosted.org/packages/66/e5/bbf0bb97d29ede1d59d6588af40018cfc345b17ce979b7b45424628dc8bb/grpcio-1.76.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:9f8f757bebaaea112c00dba718fc0d3260052ce714e25804a03f93f5d1c6cc11", size = 7044267, upload-time = "2025-10-21T16:21:25.995Z" }, - { url = "https://files.pythonhosted.org/packages/f5/86/f6ec2164f743d9609691115ae8ece098c76b894ebe4f7c94a655c6b03e98/grpcio-1.76.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:980a846182ce88c4f2f7e2c22c56aefd515daeb36149d1c897f83cf57999e0b6", size = 6573963, upload-time = "2025-10-21T16:21:28.631Z" }, - { url = "https://files.pythonhosted.org/packages/60/bc/8d9d0d8505feccfdf38a766d262c71e73639c165b311c9457208b56d92ae/grpcio-1.76.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f92f88e6c033db65a5ae3d97905c8fea9c725b63e28d5a75cb73b49bda5024d8", size = 7164484, upload-time = "2025-10-21T16:21:30.837Z" }, - { url = "https://files.pythonhosted.org/packages/67/e6/5d6c2fc10b95edf6df9b8f19cf10a34263b7fd48493936fffd5085521292/grpcio-1.76.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4baf3cbe2f0be3289eb68ac8ae771156971848bb8aaff60bad42005539431980", size = 8127777, upload-time = "2025-10-21T16:21:33.577Z" }, - { url = "https://files.pythonhosted.org/packages/3f/c8/dce8ff21c86abe025efe304d9e31fdb0deaaa3b502b6a78141080f206da0/grpcio-1.76.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:615ba64c208aaceb5ec83bfdce7728b80bfeb8be97562944836a7a0a9647d882", size = 7594014, upload-time = "2025-10-21T16:21:41.882Z" }, - { url = "https://files.pythonhosted.org/packages/e0/42/ad28191ebf983a5d0ecef90bab66baa5a6b18f2bfdef9d0a63b1973d9f75/grpcio-1.76.0-cp312-cp312-win32.whl", hash = "sha256:45d59a649a82df5718fd9527ce775fd66d1af35e6d31abdcdc906a49c6822958", size = 3984750, upload-time = "2025-10-21T16:21:44.006Z" }, - { url = "https://files.pythonhosted.org/packages/9e/00/7bd478cbb851c04a48baccaa49b75abaa8e4122f7d86da797500cccdd771/grpcio-1.76.0-cp312-cp312-win_amd64.whl", hash = "sha256:c088e7a90b6017307f423efbb9d1ba97a22aa2170876223f9709e9d1de0b5347", size = 4704003, upload-time = "2025-10-21T16:21:46.244Z" }, - { url = "https://files.pythonhosted.org/packages/fc/ed/71467ab770effc9e8cef5f2e7388beb2be26ed642d567697bb103a790c72/grpcio-1.76.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:26ef06c73eb53267c2b319f43e6634c7556ea37672029241a056629af27c10e2", size = 5807716, upload-time = "2025-10-21T16:21:48.475Z" }, - { url = "https://files.pythonhosted.org/packages/2c/85/c6ed56f9817fab03fa8a111ca91469941fb514e3e3ce6d793cb8f1e1347b/grpcio-1.76.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:45e0111e73f43f735d70786557dc38141185072d7ff8dc1829d6a77ac1471468", size = 11821522, upload-time = "2025-10-21T16:21:51.142Z" }, - { url = "https://files.pythonhosted.org/packages/ac/31/2b8a235ab40c39cbc141ef647f8a6eb7b0028f023015a4842933bc0d6831/grpcio-1.76.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:83d57312a58dcfe2a3a0f9d1389b299438909a02db60e2f2ea2ae2d8034909d3", size = 6362558, upload-time = "2025-10-21T16:21:54.213Z" }, - { url = "https://files.pythonhosted.org/packages/bd/64/9784eab483358e08847498ee56faf8ff6ea8e0a4592568d9f68edc97e9e9/grpcio-1.76.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:3e2a27c89eb9ac3d81ec8835e12414d73536c6e620355d65102503064a4ed6eb", size = 7049990, upload-time = "2025-10-21T16:21:56.476Z" }, - { url = "https://files.pythonhosted.org/packages/2b/94/8c12319a6369434e7a184b987e8e9f3b49a114c489b8315f029e24de4837/grpcio-1.76.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:61f69297cba3950a524f61c7c8ee12e55c486cb5f7db47ff9dcee33da6f0d3ae", size = 6575387, upload-time = "2025-10-21T16:21:59.051Z" }, - { url = "https://files.pythonhosted.org/packages/15/0f/f12c32b03f731f4a6242f771f63039df182c8b8e2cf8075b245b409259d4/grpcio-1.76.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6a15c17af8839b6801d554263c546c69c4d7718ad4321e3166175b37eaacca77", size = 7166668, upload-time = "2025-10-21T16:22:02.049Z" }, - { url = "https://files.pythonhosted.org/packages/ff/2d/3ec9ce0c2b1d92dd59d1c3264aaec9f0f7c817d6e8ac683b97198a36ed5a/grpcio-1.76.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:25a18e9810fbc7e7f03ec2516addc116a957f8cbb8cbc95ccc80faa072743d03", size = 8124928, upload-time = "2025-10-21T16:22:04.984Z" }, - { url = "https://files.pythonhosted.org/packages/1a/74/fd3317be5672f4856bcdd1a9e7b5e17554692d3db9a3b273879dc02d657d/grpcio-1.76.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:931091142fd8cc14edccc0845a79248bc155425eee9a98b2db2ea4f00a235a42", size = 7589983, upload-time = "2025-10-21T16:22:07.881Z" }, - { url = "https://files.pythonhosted.org/packages/45/bb/ca038cf420f405971f19821c8c15bcbc875505f6ffadafe9ffd77871dc4c/grpcio-1.76.0-cp313-cp313-win32.whl", hash = "sha256:5e8571632780e08526f118f74170ad8d50fb0a48c23a746bef2a6ebade3abd6f", size = 3984727, upload-time = "2025-10-21T16:22:10.032Z" }, - { url = "https://files.pythonhosted.org/packages/41/80/84087dc56437ced7cdd4b13d7875e7439a52a261e3ab4e06488ba6173b0a/grpcio-1.76.0-cp313-cp313-win_amd64.whl", hash = "sha256:f9f7bd5faab55f47231ad8dba7787866b69f5e93bc306e3915606779bbfb4ba8", size = 4702799, upload-time = "2025-10-21T16:22:12.709Z" }, - { url = "https://files.pythonhosted.org/packages/b4/46/39adac80de49d678e6e073b70204091e76631e03e94928b9ea4ecf0f6e0e/grpcio-1.76.0-cp314-cp314-linux_armv7l.whl", hash = "sha256:ff8a59ea85a1f2191a0ffcc61298c571bc566332f82e5f5be1b83c9d8e668a62", size = 5808417, upload-time = "2025-10-21T16:22:15.02Z" }, - { url = "https://files.pythonhosted.org/packages/9c/f5/a4531f7fb8b4e2a60b94e39d5d924469b7a6988176b3422487be61fe2998/grpcio-1.76.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:06c3d6b076e7b593905d04fdba6a0525711b3466f43b3400266f04ff735de0cd", size = 11828219, upload-time = "2025-10-21T16:22:17.954Z" }, - { url = "https://files.pythonhosted.org/packages/4b/1c/de55d868ed7a8bd6acc6b1d6ddc4aa36d07a9f31d33c912c804adb1b971b/grpcio-1.76.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fd5ef5932f6475c436c4a55e4336ebbe47bd3272be04964a03d316bbf4afbcbc", size = 6367826, upload-time = "2025-10-21T16:22:20.721Z" }, - { url = "https://files.pythonhosted.org/packages/59/64/99e44c02b5adb0ad13ab3adc89cb33cb54bfa90c74770f2607eea629b86f/grpcio-1.76.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:b331680e46239e090f5b3cead313cc772f6caa7d0fc8de349337563125361a4a", size = 7049550, upload-time = "2025-10-21T16:22:23.637Z" }, - { url = "https://files.pythonhosted.org/packages/43/28/40a5be3f9a86949b83e7d6a2ad6011d993cbe9b6bd27bea881f61c7788b6/grpcio-1.76.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2229ae655ec4e8999599469559e97630185fdd53ae1e8997d147b7c9b2b72cba", size = 6575564, upload-time = "2025-10-21T16:22:26.016Z" }, - { url = "https://files.pythonhosted.org/packages/4b/a9/1be18e6055b64467440208a8559afac243c66a8b904213af6f392dc2212f/grpcio-1.76.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:490fa6d203992c47c7b9e4a9d39003a0c2bcc1c9aa3c058730884bbbb0ee9f09", size = 7176236, upload-time = "2025-10-21T16:22:28.362Z" }, - { url = "https://files.pythonhosted.org/packages/0f/55/dba05d3fcc151ce6e81327541d2cc8394f442f6b350fead67401661bf041/grpcio-1.76.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:479496325ce554792dba6548fae3df31a72cef7bad71ca2e12b0e58f9b336bfc", size = 8125795, upload-time = "2025-10-21T16:22:31.075Z" }, - { url = "https://files.pythonhosted.org/packages/4a/45/122df922d05655f63930cf42c9e3f72ba20aadb26c100ee105cad4ce4257/grpcio-1.76.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1c9b93f79f48b03ada57ea24725d83a30284a012ec27eab2cf7e50a550cbbbcc", size = 7592214, upload-time = "2025-10-21T16:22:33.831Z" }, - { url = "https://files.pythonhosted.org/packages/4a/6e/0b899b7f6b66e5af39e377055fb4a6675c9ee28431df5708139df2e93233/grpcio-1.76.0-cp314-cp314-win32.whl", hash = "sha256:747fa73efa9b8b1488a95d0ba1039c8e2dca0f741612d80415b1e1c560febf4e", size = 4062961, upload-time = "2025-10-21T16:22:36.468Z" }, - { url = "https://files.pythonhosted.org/packages/19/41/0b430b01a2eb38ee887f88c1f07644a1df8e289353b78e82b37ef988fb64/grpcio-1.76.0-cp314-cp314-win_amd64.whl", hash = "sha256:922fa70ba549fce362d2e2871ab542082d66e2aaf0c19480ea453905b01f384e", size = 4834462, upload-time = "2025-10-21T16:22:39.772Z" }, -] - -[[package]] -name = "grpcio-tools" -version = "1.76.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "grpcio" }, - { name = "protobuf" }, - { name = "setuptools" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a0/77/17d60d636ccd86a0db0eccc24d02967bbc3eea86b9db7324b04507ebaa40/grpcio_tools-1.76.0.tar.gz", hash = "sha256:ce80169b5e6adf3e8302f3ebb6cb0c3a9f08089133abca4b76ad67f751f5ad88", size = 5390807, upload-time = "2025-10-21T16:26:55.416Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/57/4b/6fceb806f6d5055793f5db0d7a1e3449ea16482c2aec3ad93b05678c325a/grpcio_tools-1.76.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:9b99086080ca394f1da9894ee20dedf7292dd614e985dcba58209a86a42de602", size = 2545596, upload-time = "2025-10-21T16:24:25.134Z" }, - { url = "https://files.pythonhosted.org/packages/3b/11/57af2f3f32016e6e2aae063a533aae2c0e6c577bc834bef97277a7fa9733/grpcio_tools-1.76.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:8d95b5c2394bbbe911cbfc88d15e24c9e174958cb44dad6aa8c46fe367f6cc2a", size = 5843462, upload-time = "2025-10-21T16:24:31.046Z" }, - { url = "https://files.pythonhosted.org/packages/3f/8b/470bedaf7fb75fb19500b4c160856659746dcf53e3d9241fcc17e3af7155/grpcio_tools-1.76.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d54e9ce2ffc5d01341f0c8898c1471d887ae93d77451884797776e0a505bd503", size = 2591938, upload-time = "2025-10-21T16:24:33.219Z" }, - { url = "https://files.pythonhosted.org/packages/77/3e/530e848e00d6fe2db152984b2c9432bb8497a3699719fd7898d05cb7d95e/grpcio_tools-1.76.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:c83f39f64c2531336bd8d5c846a2159c9ea6635508b0f8ed3ad0d433e25b53c9", size = 2905296, upload-time = "2025-10-21T16:24:34.938Z" }, - { url = "https://files.pythonhosted.org/packages/75/b5/632229d17364eb7db5d3d793131172b2380323c4e6500f528743e477267c/grpcio_tools-1.76.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:be480142fae0d986d127d6cb5cbc0357e4124ba22e96bb8b9ece32c48bc2c8ea", size = 2656266, upload-time = "2025-10-21T16:24:37.485Z" }, - { url = "https://files.pythonhosted.org/packages/ff/71/5756aa9a14d16738b04677b89af8612112d69fb098ffdbc5666020933f23/grpcio_tools-1.76.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7fefd41fc4ca11fab36f42bdf0f3812252988f8798fca8bec8eae049418deacd", size = 3105798, upload-time = "2025-10-21T16:24:40.408Z" }, - { url = "https://files.pythonhosted.org/packages/ab/de/9058021da11be399abe6c5d2a9a2abad1b00d367111018637195d107539b/grpcio_tools-1.76.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:63551f371082173e259e7f6ec24b5f1fe7d66040fadd975c966647bca605a2d3", size = 3654923, upload-time = "2025-10-21T16:24:42.52Z" }, - { url = "https://files.pythonhosted.org/packages/8e/93/29f04cc18f1023b2a4342374a45b1cd87a0e1458fc44aea74baad5431dcd/grpcio_tools-1.76.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:75a2c34584c99ff47e5bb267866e7dec68d30cd3b2158e1ee495bfd6db5ad4f0", size = 3322558, upload-time = "2025-10-21T16:24:44.356Z" }, - { url = "https://files.pythonhosted.org/packages/d9/ab/8936708d30b9a2484f6b093dfc57843c1d0380de0eba78a8ad8693535f26/grpcio_tools-1.76.0-cp310-cp310-win32.whl", hash = "sha256:908758789b0a612102c88e8055b7191eb2c4290d5d6fc50fb9cac737f8011ef1", size = 993621, upload-time = "2025-10-21T16:24:46.7Z" }, - { url = "https://files.pythonhosted.org/packages/3d/d2/c5211feb81a532eca2c4dddd00d4971b91c10837cd083781f6ab3a6fdb5b/grpcio_tools-1.76.0-cp310-cp310-win_amd64.whl", hash = "sha256:ec6e49e7c4b2a222eb26d1e1726a07a572b6e629b2cf37e6bb784c9687904a52", size = 1158401, upload-time = "2025-10-21T16:24:48.416Z" }, - { url = "https://files.pythonhosted.org/packages/73/d1/efbeed1a864c846228c0a3b322e7a2d6545f025e35246aebf96496a36004/grpcio_tools-1.76.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:c6480f6af6833850a85cca1c6b435ef4ffd2ac8e88ef683b4065233827950243", size = 2545931, upload-time = "2025-10-21T16:24:50.201Z" }, - { url = "https://files.pythonhosted.org/packages/af/8e/f257c0f565d9d44658301238b01a9353bc6f3b272bb4191faacae042579d/grpcio_tools-1.76.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:c7c23fe1dc09818e16a48853477806ad77dd628b33996f78c05a293065f8210c", size = 5844794, upload-time = "2025-10-21T16:24:53.312Z" }, - { url = "https://files.pythonhosted.org/packages/c7/c0/6c1e89c67356cb20e19ed670c5099b13e40fd678cac584c778f931666a86/grpcio_tools-1.76.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fcdce7f7770ff052cd4e60161764b0b3498c909bde69138f8bd2e7b24a3ecd8f", size = 2591772, upload-time = "2025-10-21T16:24:55.729Z" }, - { url = "https://files.pythonhosted.org/packages/c0/10/5f33aa7bc3ddaad0cfd2f4e950ac4f1a310e8d0c7b1358622a581e8b7a2f/grpcio_tools-1.76.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:b598fdcebffa931c7da5c9e90b5805fff7e9bc6cf238319358a1b85704c57d33", size = 2905140, upload-time = "2025-10-21T16:24:57.952Z" }, - { url = "https://files.pythonhosted.org/packages/f4/3e/23e3a52a77368f47188ed83c34eb53866d3ce0f73835b2f6764844ae89eb/grpcio_tools-1.76.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6a9818ff884796b12dcf8db32126e40ec1098cacf5697f27af9cfccfca1c1fae", size = 2656475, upload-time = "2025-10-21T16:25:00.811Z" }, - { url = "https://files.pythonhosted.org/packages/51/85/a74ae87ec7dbd3d2243881f5c548215aed1148660df7945be3a125ba9a21/grpcio_tools-1.76.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:105e53435b2eed3961da543db44a2a34479d98d18ea248219856f30a0ca4646b", size = 3106158, upload-time = "2025-10-21T16:25:03.642Z" }, - { url = "https://files.pythonhosted.org/packages/54/d5/a6ed1e5823bc5d55a1eb93e0c14ccee0b75951f914832ab51fb64d522a0f/grpcio_tools-1.76.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:454a1232c7f99410d92fa9923c7851fd4cdaf657ee194eac73ea1fe21b406d6e", size = 3654980, upload-time = "2025-10-21T16:25:05.717Z" }, - { url = "https://files.pythonhosted.org/packages/f9/29/c05d5501ba156a242079ef71d073116d2509c195b5e5e74c545f0a3a3a69/grpcio_tools-1.76.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ca9ccf667afc0268d45ab202af4556c72e57ea36ebddc93535e1a25cbd4f8aba", size = 3322658, upload-time = "2025-10-21T16:25:07.885Z" }, - { url = "https://files.pythonhosted.org/packages/02/b6/ee0317b91da19a7537d93c4161cbc2a45a165c8893209b0bbd470d830ffa/grpcio_tools-1.76.0-cp311-cp311-win32.whl", hash = "sha256:a83c87513b708228b4cad7619311daba65b40937745103cadca3db94a6472d9c", size = 993837, upload-time = "2025-10-21T16:25:10.133Z" }, - { url = "https://files.pythonhosted.org/packages/81/63/9623cadf0406b264737f16d4ed273bb2d65001d87fbd803b565c45d665d1/grpcio_tools-1.76.0-cp311-cp311-win_amd64.whl", hash = "sha256:2ce5e87ec71f2e4041dce4351f2a8e3b713e3bca6b54c69c3fbc6c7ad1f4c386", size = 1158634, upload-time = "2025-10-21T16:25:12.705Z" }, - { url = "https://files.pythonhosted.org/packages/4f/ca/a931c1439cabfe305c9afd07e233150cd0565aa062c20d1ee412ed188852/grpcio_tools-1.76.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:4ad555b8647de1ebaffb25170249f89057721ffb74f7da96834a07b4855bb46a", size = 2546852, upload-time = "2025-10-21T16:25:15.024Z" }, - { url = "https://files.pythonhosted.org/packages/4c/07/935cfbb7dccd602723482a86d43fbd992f91e9867bca0056a1e9f348473e/grpcio_tools-1.76.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:243af7c8fc7ff22a40a42eb8e0f6f66963c1920b75aae2a2ec503a9c3c8b31c1", size = 5841777, upload-time = "2025-10-21T16:25:17.425Z" }, - { url = "https://files.pythonhosted.org/packages/e4/92/8fcb5acebdccb647e0fa3f002576480459f6cf81e79692d7b3c4d6e29605/grpcio_tools-1.76.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8207b890f423142cc0025d041fb058f7286318df6a049565c27869d73534228b", size = 2594004, upload-time = "2025-10-21T16:25:19.809Z" }, - { url = "https://files.pythonhosted.org/packages/9d/ea/64838e8113b7bfd4842b15c815a7354cb63242fdce9d6648d894b5d50897/grpcio_tools-1.76.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:3dafa34c2626a6691d103877e8a145f54c34cf6530975f695b396ed2fc5c98f8", size = 2905563, upload-time = "2025-10-21T16:25:21.889Z" }, - { url = "https://files.pythonhosted.org/packages/a6/d6/53798827d821098219e58518b6db52161ce4985620850aa74ce3795da8a7/grpcio_tools-1.76.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:30f1d2dda6ece285b3d9084e94f66fa721ebdba14ae76b2bc4c581c8a166535c", size = 2656936, upload-time = "2025-10-21T16:25:24.369Z" }, - { url = "https://files.pythonhosted.org/packages/89/a3/d9c1cefc46a790eec520fe4e70e87279abb01a58b1a3b74cf93f62b824a2/grpcio_tools-1.76.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a889af059dc6dbb82d7b417aa581601316e364fe12eb54c1b8d95311ea50916d", size = 3109811, upload-time = "2025-10-21T16:25:26.711Z" }, - { url = "https://files.pythonhosted.org/packages/50/75/5997752644b73b5d59377d333a51c8a916606df077f5a487853e37dca289/grpcio_tools-1.76.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c3f2c3c44c56eb5d479ab178f0174595d0a974c37dade442f05bb73dfec02f31", size = 3658786, upload-time = "2025-10-21T16:25:28.819Z" }, - { url = "https://files.pythonhosted.org/packages/84/47/dcf8380df4bd7931ffba32fc6adc2de635b6569ca27fdec7121733797062/grpcio_tools-1.76.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:479ce02dff684046f909a487d452a83a96b4231f7c70a3b218a075d54e951f56", size = 3325144, upload-time = "2025-10-21T16:25:30.863Z" }, - { url = "https://files.pythonhosted.org/packages/04/88/ea3e5fdb874d8c2d04488e4b9d05056537fba70915593f0c283ac77df188/grpcio_tools-1.76.0-cp312-cp312-win32.whl", hash = "sha256:9ba4bb539936642a44418b38ee6c3e8823c037699e2cb282bd8a44d76a4be833", size = 993523, upload-time = "2025-10-21T16:25:32.594Z" }, - { url = "https://files.pythonhosted.org/packages/de/b1/ce7d59d147675ec191a55816be46bc47a343b5ff07279eef5817c09cc53e/grpcio_tools-1.76.0-cp312-cp312-win_amd64.whl", hash = "sha256:0cd489016766b05f9ed8a6b6596004b62c57d323f49593eac84add032a6d43f7", size = 1158493, upload-time = "2025-10-21T16:25:34.5Z" }, - { url = "https://files.pythonhosted.org/packages/13/01/b16fe73f129df49811d886dc99d3813a33cf4d1c6e101252b81c895e929f/grpcio_tools-1.76.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:ff48969f81858397ef33a36b326f2dbe2053a48b254593785707845db73c8f44", size = 2546312, upload-time = "2025-10-21T16:25:37.138Z" }, - { url = "https://files.pythonhosted.org/packages/25/17/2594c5feb76bb0b25bfbf91ec1075b276e1b2325e4bc7ea649a7b5dbf353/grpcio_tools-1.76.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:aa2f030fd0ef17926026ee8e2b700e388d3439155d145c568fa6b32693277613", size = 5839627, upload-time = "2025-10-21T16:25:40.082Z" }, - { url = "https://files.pythonhosted.org/packages/c7/c6/097b1aa26fbf72fb3cdb30138a2788529e4f10d8759de730a83f5c06726e/grpcio_tools-1.76.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bacbf3c54f88c38de8e28f8d9b97c90b76b105fb9ddef05d2c50df01b32b92af", size = 2592817, upload-time = "2025-10-21T16:25:42.301Z" }, - { url = "https://files.pythonhosted.org/packages/03/78/d1d985b48592a674509a85438c1a3d4c36304ddfc99d1b05d27233b51062/grpcio_tools-1.76.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:0d4e4afe9a0e3c24fad2f1af45f98cf8700b2bfc4d790795756ba035d2ea7bdc", size = 2905186, upload-time = "2025-10-21T16:25:44.395Z" }, - { url = "https://files.pythonhosted.org/packages/b9/0e/770afbb47f0b5f594b93a7b46a95b892abda5eebe60efb511e96cee52170/grpcio_tools-1.76.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fbbd4e1fc5af98001ceef5e780e8c10921d94941c3809238081e73818ef707f1", size = 2656188, upload-time = "2025-10-21T16:25:46.942Z" }, - { url = "https://files.pythonhosted.org/packages/3d/2b/017c2fcf4c5d3cf00cf7d5ce21eb88521de0d89bdcf26538ad2862ec6d07/grpcio_tools-1.76.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b05efe5a59883ab8292d596657273a60e0c3e4f5a9723c32feb9fc3a06f2f3ef", size = 3109141, upload-time = "2025-10-21T16:25:49.137Z" }, - { url = "https://files.pythonhosted.org/packages/e9/5f/2495f88e3d50c6f2c2da2752bad4fa3a30c52ece6c9d8b0c636cd8b1430b/grpcio_tools-1.76.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:be483b90e62b7892eb71fa1fc49750bee5b2ee35b5ec99dd2b32bed4bedb5d71", size = 3657892, upload-time = "2025-10-21T16:25:52.362Z" }, - { url = "https://files.pythonhosted.org/packages/5e/1d/c4f39d31b19d9baf35d900bf3f969ce1c842f63a8560c8003ed2e5474760/grpcio_tools-1.76.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:630cd7fd3e8a63e20703a7ad816979073c2253e591b5422583c27cae2570de73", size = 3324778, upload-time = "2025-10-21T16:25:54.629Z" }, - { url = "https://files.pythonhosted.org/packages/b4/b6/35ee3a6e4af85a93da28428f81f4b29bcb36f6986b486ad71910fcc02e25/grpcio_tools-1.76.0-cp313-cp313-win32.whl", hash = "sha256:eb2567280f9f6da5444043f0e84d8408c7a10df9ba3201026b30e40ef3814736", size = 993084, upload-time = "2025-10-21T16:25:56.52Z" }, - { url = "https://files.pythonhosted.org/packages/f3/7a/5bd72344d86ee860e5920c9a7553cfe3bc7b1fce79f18c00ac2497f5799f/grpcio_tools-1.76.0-cp313-cp313-win_amd64.whl", hash = "sha256:0071b1c0bd0f5f9d292dca4efab32c92725d418e57f9c60acdc33c0172af8b53", size = 1158151, upload-time = "2025-10-21T16:25:58.468Z" }, - { url = "https://files.pythonhosted.org/packages/f0/c0/aa20eebe8f3553b7851643e9c88d237c3a6ca30ade646897e25dbb27be99/grpcio_tools-1.76.0-cp314-cp314-linux_armv7l.whl", hash = "sha256:c53c5719ef2a435997755abde3826ba4087174bd432aa721d8fac781fcea79e4", size = 2546297, upload-time = "2025-10-21T16:26:01.258Z" }, - { url = "https://files.pythonhosted.org/packages/d9/98/6af702804934443c1d0d4d27d21b990d92d22ddd1b6bec6b056558cbbffa/grpcio_tools-1.76.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:e3db1300d7282264639eeee7243f5de7e6a7c0283f8bf05d66c0315b7b0f0b36", size = 5839804, upload-time = "2025-10-21T16:26:05.495Z" }, - { url = "https://files.pythonhosted.org/packages/ea/8d/7725fa7b134ef8405ffe0a37c96eeb626e5af15d70e1bdac4f8f1abf842e/grpcio_tools-1.76.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0b018a4b7455a7e8c16d0fdb3655a6ba6c9536da6de6c5d4f11b6bb73378165b", size = 2593922, upload-time = "2025-10-21T16:26:07.563Z" }, - { url = "https://files.pythonhosted.org/packages/de/ff/5b6b5012c79fa72f9107dc13f7226d9ce7e059ea639fd8c779e0dd284386/grpcio_tools-1.76.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:ec6e4de3866e47cfde56607b1fae83ecc5aa546e06dec53de11f88063f4b5275", size = 2905327, upload-time = "2025-10-21T16:26:09.668Z" }, - { url = "https://files.pythonhosted.org/packages/24/01/2691d369ea462cd6b6c92544122885ca01f7fa5ac75dee023e975e675858/grpcio_tools-1.76.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b8da4d828883913f1852bdd67383713ae5c11842f6c70f93f31893eab530aead", size = 2656214, upload-time = "2025-10-21T16:26:11.773Z" }, - { url = "https://files.pythonhosted.org/packages/6a/e7/3f8856e6ec3dd492336a91572993344966f237b0e3819fbe96437b19d313/grpcio_tools-1.76.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:5c120c2cf4443121800e7f9bcfe2e94519fa25f3bb0b9882359dd3b252c78a7b", size = 3109889, upload-time = "2025-10-21T16:26:15.058Z" }, - { url = "https://files.pythonhosted.org/packages/f3/e4/ce5248072e47db276dc7e069e93978dcde490c959788ce7cce8081d0bfdc/grpcio_tools-1.76.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:8b7df5591d699cd9076065f1f15049e9c3597e0771bea51c8c97790caf5e4197", size = 3657939, upload-time = "2025-10-21T16:26:17.34Z" }, - { url = "https://files.pythonhosted.org/packages/f6/df/81ff88af93c52135e425cd5ec9fe8b186169c7d5f9e0409bdf2bbedc3919/grpcio_tools-1.76.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a25048c5f984d33e3f5b6ad7618e98736542461213ade1bd6f2fcfe8ce804e3d", size = 3324752, upload-time = "2025-10-21T16:26:20.092Z" }, - { url = "https://files.pythonhosted.org/packages/35/3d/f6b83044afbf6522254a3b509515a00fed16a819c87731a478dbdd1d35c1/grpcio_tools-1.76.0-cp314-cp314-win32.whl", hash = "sha256:4b77ce6b6c17869858cfe14681ad09ed3a8a80e960e96035de1fd87f78158740", size = 1015578, upload-time = "2025-10-21T16:26:22.517Z" }, - { url = "https://files.pythonhosted.org/packages/95/4d/31236cddb7ffb09ba4a49f4f56d2608fec3bbb21c7a0a975d93bca7cd22e/grpcio_tools-1.76.0-cp314-cp314-win_amd64.whl", hash = "sha256:2ccd2c8d041351cc29d0fc4a84529b11ee35494a700b535c1f820b642f2a72fc", size = 1190242, upload-time = "2025-10-21T16:26:25.296Z" }, -] - -[[package]] -name = "importlib-metadata" -version = "8.7.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "zipp" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f3/49/3b30cad09e7771a4982d9975a8cbf64f00d4a1ececb53297f1d9a7be1b10/importlib_metadata-8.7.1.tar.gz", hash = "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb", size = 57107, upload-time = "2025-12-21T10:00:19.278Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl", hash = "sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151", size = 27865, upload-time = "2025-12-21T10:00:18.329Z" }, -] - -[[package]] -name = "iniconfig" -version = "2.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, -] - -[[package]] -name = "mypy-protobuf" -version = "4.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "protobuf" }, - { name = "types-protobuf" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f9/95/afd552608fc8b112dd39c99d22ddb1b2da147dfd58c8c74c919e14ae99cd/mypy_protobuf-4.0.0.tar.gz", hash = "sha256:e200c833645dcfdfe8aa47f4a33d3a4b01b6be5b9a58ddbfc441329d5b679274", size = 29538, upload-time = "2025-12-21T05:35:20.57Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cd/78/44d4cfdc39d61a606b8747ca9542fc4f91477098c911295e45af17b1d72a/mypy_protobuf-4.0.0-py3-none-any.whl", hash = "sha256:b859286891c51e420aef711b3e6616444e81c64723c12110d1dda809fad105f6", size = 18609, upload-time = "2025-12-21T05:35:18.956Z" }, -] - -[[package]] -name = "opentelemetry-api" -version = "1.41.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "importlib-metadata" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fa/fc/b7564cbef36601aef0d6c9bc01f7badb64be8e862c2e1c3c5c3b43b53e4f/opentelemetry_api-1.41.1.tar.gz", hash = "sha256:0ad1814d73b875f84494387dae86ce0b12c68556331ce6ce8fe789197c949621", size = 71416, upload-time = "2026-04-24T13:15:38.262Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/29/59/3e7118ed140f76b0982ba4321bdaed1997a0473f9720de2d10788a577033/opentelemetry_api-1.41.1-py3-none-any.whl", hash = "sha256:a22df900e75c76dc08440710e51f52f1aa6b451b429298896023e60db5b3139f", size = 69007, upload-time = "2026-04-24T13:15:15.662Z" }, -] - -[[package]] -name = "otdf-python-proto" -version = "0.6.0" -source = { editable = "." } -dependencies = [ - { name = "connect-python" }, - { name = "googleapis-common-protos" }, - { name = "grpcio" }, - { name = "grpcio-tools" }, - { name = "protobuf" }, - { name = "protoc-gen-openapiv2" }, -] - -[package.dev-dependencies] -dev = [ - { name = "mypy-protobuf" }, - { name = "pytest" }, -] - -[package.metadata] -requires-dist = [ - { name = "connect-python", specifier = ">=0.6.0" }, - { name = "googleapis-common-protos", specifier = ">=1.66.0" }, - { name = "grpcio", specifier = ">=1.74.0" }, - { name = "grpcio-tools", specifier = ">=1.74.0" }, - { name = "protobuf", specifier = ">=6.33.5" }, - { name = "protoc-gen-openapiv2", specifier = ">=0.0.1" }, -] - -[package.metadata.requires-dev] -dev = [ - { name = "mypy-protobuf", specifier = ">=3.6.0" }, - { name = "pytest", specifier = ">=8.0.0" }, -] - -[[package]] -name = "packaging" -version = "26.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, -] - -[[package]] -name = "pluggy" -version = "1.6.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, -] - -[[package]] -name = "protobuf" -version = "6.33.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/66/70/e908e9c5e52ef7c3a6c7902c9dfbb34c7e29c25d2f81ade3856445fd5c94/protobuf-6.33.6.tar.gz", hash = "sha256:a6768d25248312c297558af96a9f9c929e8c4cee0659cb07e780731095f38135", size = 444531, upload-time = "2026-03-18T19:05:00.988Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fc/9f/2f509339e89cfa6f6a4c4ff50438db9ca488dec341f7e454adad60150b00/protobuf-6.33.6-cp310-abi3-win32.whl", hash = "sha256:7d29d9b65f8afef196f8334e80d6bc1d5d4adedb449971fefd3723824e6e77d3", size = 425739, upload-time = "2026-03-18T19:04:48.373Z" }, - { url = "https://files.pythonhosted.org/packages/76/5d/683efcd4798e0030c1bab27374fd13a89f7c2515fb1f3123efdfaa5eab57/protobuf-6.33.6-cp310-abi3-win_amd64.whl", hash = "sha256:0cd27b587afca21b7cfa59a74dcbd48a50f0a6400cfb59391340ad729d91d326", size = 437089, upload-time = "2026-03-18T19:04:50.381Z" }, - { url = "https://files.pythonhosted.org/packages/5c/01/a3c3ed5cd186f39e7880f8303cc51385a198a81469d53d0fdecf1f64d929/protobuf-6.33.6-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:9720e6961b251bde64edfdab7d500725a2af5280f3f4c87e57c0208376aa8c3a", size = 427737, upload-time = "2026-03-18T19:04:51.866Z" }, - { url = "https://files.pythonhosted.org/packages/ee/90/b3c01fdec7d2f627b3a6884243ba328c1217ed2d978def5c12dc50d328a3/protobuf-6.33.6-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:e2afbae9b8e1825e3529f88d514754e094278bb95eadc0e199751cdd9a2e82a2", size = 324610, upload-time = "2026-03-18T19:04:53.096Z" }, - { url = "https://files.pythonhosted.org/packages/9b/ca/25afc144934014700c52e05103c2421997482d561f3101ff352e1292fb81/protobuf-6.33.6-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:c96c37eec15086b79762ed265d59ab204dabc53056e3443e702d2681f4b39ce3", size = 339381, upload-time = "2026-03-18T19:04:54.616Z" }, - { url = "https://files.pythonhosted.org/packages/16/92/d1e32e3e0d894fe00b15ce28ad4944ab692713f2e7f0a99787405e43533a/protobuf-6.33.6-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:e9db7e292e0ab79dd108d7f1a94fe31601ce1ee3f7b79e0692043423020b0593", size = 323436, upload-time = "2026-03-18T19:04:55.768Z" }, - { url = "https://files.pythonhosted.org/packages/c4/72/02445137af02769918a93807b2b7890047c32bfb9f90371cbc12688819eb/protobuf-6.33.6-py3-none-any.whl", hash = "sha256:77179e006c476e69bf8e8ce866640091ec42e1beb80b213c3900006ecfba6901", size = 170656, upload-time = "2026-03-18T19:04:59.826Z" }, -] - -[[package]] -name = "protoc-gen-openapiv2" -version = "0.0.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "googleapis-common-protos" }, - { name = "protobuf" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/d8/d2/84fecd8df61640226c726c12ad7ddd2a7666a7cd7f898b9a5b72e3a66d44/protoc-gen-openapiv2-0.0.1.tar.gz", hash = "sha256:6f79188d842c13177c9c0558845442c340b43011bf67dfef1dfc3bc067506409", size = 7323, upload-time = "2022-12-02T01:40:57.306Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2d/ac/bd8961859d8f3f81530465d2ce9b165627e961c00348939009bac2700cc6/protoc_gen_openapiv2-0.0.1-py3-none-any.whl", hash = "sha256:18090c8be3877c438e7da0f7eb7cace45a9a210306bca4707708dbad367857be", size = 7883, upload-time = "2022-12-02T01:40:55.244Z" }, -] - -[[package]] -name = "pygments" -version = "2.20.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, -] - -[[package]] -name = "pyqwest" -version = "0.5.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "opentelemetry-api" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fc/42/9328a1a057bc191e02514fbd8c9aa899e38ec29420491017f057ac6b5313/pyqwest-0.5.1.tar.gz", hash = "sha256:49535565a55a23830d376c6c0b8ca1276f19bb871e39330e1fbb3df69d9f02df", size = 448653, upload-time = "2026-04-17T03:56:00.279Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d3/48/a869484add1102bbedaf76b1e3840a3f34bb611bf9228ec89a03d51328b1/pyqwest-0.5.1-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:047078c4c3f7c93d8a1df07138c471cfdb234577f60563afe090b160ada1a132", size = 5058870, upload-time = "2026-04-17T03:54:36.807Z" }, - { url = "https://files.pythonhosted.org/packages/4f/b7/f06e56398ea41a183a0494b6557d1e28ed122ac8a20315a7f24ec316b7c1/pyqwest-0.5.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f732aed3498abf5742f0c952f24fc21625d62fe0a701ec8e472257709540d61", size = 5438347, upload-time = "2026-04-17T03:54:39.108Z" }, - { url = "https://files.pythonhosted.org/packages/39/df/6160cab1d48ad2d1a2038ac8a1ff94d72f267cb6a3e3a7181c1ae41d98c9/pyqwest-0.5.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77565ad8e551a101eddbf08328b0e3d54a179efec97a3da195ce831f0474ef92", size = 5457281, upload-time = "2026-04-17T03:54:41.347Z" }, - { url = "https://files.pythonhosted.org/packages/8d/56/343516d26e153a60c19f2dbbe83460238feddd18a27c42ae11f843e79bf1/pyqwest-0.5.1-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:57ea14094f841d735fcf401a6428e94a39aabf22d15762a979cf8d6096fea90b", size = 5600773, upload-time = "2026-04-17T03:54:43.615Z" }, - { url = "https://files.pythonhosted.org/packages/32/f3/56c2cca5b7fcf708d41628cd3bd8a8be48d364a33a469fc056a5e92d5de3/pyqwest-0.5.1-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e6716309fc179b0714978d1f8c32a70724b3b9f43acc9aea3cf9507872e631d6", size = 5763641, upload-time = "2026-04-17T03:54:45.804Z" }, - { url = "https://files.pythonhosted.org/packages/92/c1/ac5dceb438ec71f5a3aaf1d9481ddc3535cf875fa8c8ff3622758d49fe50/pyqwest-0.5.1-cp310-abi3-win_amd64.whl", hash = "sha256:736b560fd2256a41264f554243edf3ff872ead4da347392531576203cf97a4ce", size = 4638049, upload-time = "2026-04-17T03:54:48.108Z" }, - { url = "https://files.pythonhosted.org/packages/c3/e6/42b24a7daba2b900287ee0b89ba24e864c1976b4b371ec5aba3ddcd52f0a/pyqwest-0.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c30bb16da6580d085d86a46e28c3b59813c634c5dd7363faa980c6e53d42ea21", size = 5055607, upload-time = "2026-04-17T03:54:50.139Z" }, - { url = "https://files.pythonhosted.org/packages/7e/51/05ad3a8eba6a14cede32f0446199505782e43734ac1d0ebeb43286e94a64/pyqwest-0.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4540be138c7e4ee498c084fa9f19f34dd135f263653619ec91ccebecefd32a3a", size = 5433373, upload-time = "2026-04-17T03:54:52.275Z" }, - { url = "https://files.pythonhosted.org/packages/ba/02/eeb8bb3cb80dc4449303294e94d7e7b11e2bfd0ca319a93bfa4ce604d50c/pyqwest-0.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae56109419b37be3e90a134f827fda26c6338c432bae5ecef561e93c3df275ab", size = 5457842, upload-time = "2026-04-17T03:54:54.865Z" }, - { url = "https://files.pythonhosted.org/packages/22/32/929fe6f208e18d1ab2b4b188be9830a8d6f22641aa77434d08674f6b0a4f/pyqwest-0.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:82fbf17cf45b5a67c95734934f584045f114a1aa59d179fb79d80e56e653e052", size = 5600494, upload-time = "2026-04-17T03:54:57.485Z" }, - { url = "https://files.pythonhosted.org/packages/9a/b6/3da1250e26e435262a7113e8d8bc5628eba0518d06b5b07e74bbad3efd7f/pyqwest-0.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:717b65ee898bc3e4f29a74e068bb753bbb8a338456f1fb65edc2edabc3f3eaa5", size = 5762097, upload-time = "2026-04-17T03:54:59.536Z" }, - { url = "https://files.pythonhosted.org/packages/eb/b1/159538a856bee250431d4976a3b7731c1402932af94c00d832bf71a7ceda/pyqwest-0.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:26498ead2aaf491430980c06cbee3bd72a26a8f33a025e9a19ddcd7e781a069a", size = 4632471, upload-time = "2026-04-17T03:55:02.369Z" }, - { url = "https://files.pythonhosted.org/packages/28/f6/5f5eaf7357ade38a5e8697935a156ac47ff3bef0bb9cc32ef2f5b4cf0190/pyqwest-0.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:81bf0feb6d07fc25ffbe96be09ef64ff732d444e26c80db1b1de999d74a7a7ed", size = 5054876, upload-time = "2026-04-17T03:55:04.992Z" }, - { url = "https://files.pythonhosted.org/packages/fb/e8/3b17156c13745a17ce39c7bfe9ed9fdec8ba19a5a47ddd762c89f00fb642/pyqwest-0.5.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a7d2c4a162e72b57dfd175f53882558702c3ddd5704f536599f463e46081bd9", size = 5433361, upload-time = "2026-04-17T03:55:07.182Z" }, - { url = "https://files.pythonhosted.org/packages/35/fc/a50cde1003e1c39c2087b1ae50cd074a41ab89f5a1ad2998cc3f481cf10c/pyqwest-0.5.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b33bcba509e07ee79e61f9311880a22e8c11a562382648166f624f0b480266c1", size = 5457142, upload-time = "2026-04-17T03:55:09.358Z" }, - { url = "https://files.pythonhosted.org/packages/a9/65/f8c50d2ebe3e6d41f04a9924baef9f106feec2eb87acdd60fcb1c3ce2e84/pyqwest-0.5.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3a7a7b56e0f9099b50dae2e5907f05fc5e61252cd48cc1561f156765b233dd7b", size = 5601185, upload-time = "2026-04-17T03:55:11.626Z" }, - { url = "https://files.pythonhosted.org/packages/7e/1f/13f250e31d5503d326da8d9874891bedbfd7eeaa86711ab15acce157e59f/pyqwest-0.5.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a3cd54af62f01fd0daf694218074325ccbbea6527f27738a85fc1e38880119f0", size = 5761677, upload-time = "2026-04-17T03:55:13.915Z" }, - { url = "https://files.pythonhosted.org/packages/b3/ab/11a1bf107af0f21fa8f1d9516e59c8b742c19c32f82cae49f6340ffa7336/pyqwest-0.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:938ac244f96730a8c1addb260cbec93e44ef63d73358285bafb00f18526c106b", size = 4631790, upload-time = "2026-04-17T03:55:16.002Z" }, - { url = "https://files.pythonhosted.org/packages/2b/17/f227c99b53890157b737aed6c0840ebedda8eaafb513d1db3092a85c12a3/pyqwest-0.5.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7755dd658c612016c38f0e26938b80dafd37d80ee074c5cc4301f54f385b1e52", size = 5058021, upload-time = "2026-04-17T03:55:18.237Z" }, - { url = "https://files.pythonhosted.org/packages/26/14/c3924ee479fce346124ef07550262e4f91b1d0d6d14f3024d2c2efe38055/pyqwest-0.5.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29015b12242f2feeb24cbad7d1025a78b3239872efcbfa975ce23527e8c05ec7", size = 5420148, upload-time = "2026-04-17T03:55:20.446Z" }, - { url = "https://files.pythonhosted.org/packages/3b/7d/a8f45ea52cb97b410fad96597eccbf6be9417eb0a2bf7c0d6be9a936c897/pyqwest-0.5.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1271fb28a78484e93d09b7c78df5213900538af8cf5a53ce377ed2cbb82e72b2", size = 5443389, upload-time = "2026-04-17T03:55:22.914Z" }, - { url = "https://files.pythonhosted.org/packages/aa/47/9870f5e24f49f5c77fbc9d21f2a6ace3a065cc3c8411ae6d25001605ba5a/pyqwest-0.5.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:eaf970412356f9d6482045a8e7b7c9d36c07b6a7352c96c90a811e730eba906f", size = 5584772, upload-time = "2026-04-17T03:55:25.197Z" }, - { url = "https://files.pythonhosted.org/packages/44/a5/d5b81d67902f0526fb69ff0b71aa5fcadc052133fa4692aa35c7dbfd6c8e/pyqwest-0.5.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:986b787138893459e02485e89a7d4a383ec2864194a5ab7e0650dce9635f5215", size = 5746464, upload-time = "2026-04-17T03:55:27.649Z" }, - { url = "https://files.pythonhosted.org/packages/81/d7/49197597a26186c4a1e3cf0d915b04f0a15a52eaeb82ee8b1659ca131bab/pyqwest-0.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:4d9fb2bcbea6adc365ea3c69727b34dd21dee29edb1551b64531b25babb68f91", size = 4647610, upload-time = "2026-04-17T03:55:29.75Z" }, - { url = "https://files.pythonhosted.org/packages/1a/a3/be43b05f7821e8fba21af2eaee3a8418979da40cf895042e1705aa63e394/pyqwest-0.5.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:dc7a7c65e839057bcc3a5d4f48c6c2202f89fc13ddb12bd8e2f20d95378a95d8", size = 5054843, upload-time = "2026-04-17T03:55:32.655Z" }, - { url = "https://files.pythonhosted.org/packages/5d/e1/0e76b0bb3c71c87e63eebfcc1d5dfbee6ca69332336fea975defc30d8747/pyqwest-0.5.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e30c2268e9f7ec5509874047ebf83ecde1cab29d0bd7dc352fa2a782da2b2abf", size = 5432984, upload-time = "2026-04-17T03:55:34.925Z" }, - { url = "https://files.pythonhosted.org/packages/9d/98/f32513e74f30009eef6979632590df32287a19f85215dd5654a9676da184/pyqwest-0.5.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f632070abff4d0bfd0f6deada3beaaaa42a042809e50c7f2e2b25014687e070", size = 5452771, upload-time = "2026-04-17T03:55:37.44Z" }, - { url = "https://files.pythonhosted.org/packages/ba/40/334e2184dbc4641743f47cbaa0079c32239bdcb972aee659f37196b920fe/pyqwest-0.5.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:78f8b6b41c0206e9605d75b9fc3f20db97c266829f5a0bee8eff7d524de2bf20", size = 5598688, upload-time = "2026-04-17T03:55:39.808Z" }, - { url = "https://files.pythonhosted.org/packages/16/cb/d1a80c6d3cc89207d02bf4abca856420efaecc4e9482fb1c3906f27228ba/pyqwest-0.5.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a1d95a8a7e4246ba37dc3115b10b72c5dcdf4b226447d1a7a51973d686460fa4", size = 5759621, upload-time = "2026-04-17T03:55:41.956Z" }, - { url = "https://files.pythonhosted.org/packages/1e/57/eb4bc81fea27b0f0515e97168bb67145b9d7c81cd2f2f94f9deb0febd639/pyqwest-0.5.1-cp314-cp314t-win_amd64.whl", hash = "sha256:fbd3232cca327bc591d47b0368ba712d929f66658d4822ac5129f5ede1a581df", size = 4623418, upload-time = "2026-04-17T03:55:44.129Z" }, - { url = "https://files.pythonhosted.org/packages/68/05/6340fcb599734691832b60829236c53f813220f0a642af90e05c5df5d6a9/pyqwest-0.5.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:45f9d448fedd6d85c4c9a5cb8e743b83fdd798c335936588f5d90628c6163f73", size = 5059333, upload-time = "2026-04-17T03:55:46.264Z" }, - { url = "https://files.pythonhosted.org/packages/52/65/9d98c421a5ec3283bb77337f51920504c4d770bbd09b36a6164eaa21c4e8/pyqwest-0.5.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:144c22aa18de37f5b6f877939c50fb2aafb94a6433ac47ddab3850793402e46b", size = 5438850, upload-time = "2026-04-17T03:55:48.542Z" }, - { url = "https://files.pythonhosted.org/packages/1f/6e/b5862ef8e6a61c1baf48740e9f9ea256ef63d26c10df8c340a3fbefc35e2/pyqwest-0.5.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:850c58da7df5c0a4c6351ffe66f99768cb5d92e882b55daf9984a96a5c46e11e", size = 5455438, upload-time = "2026-04-17T03:55:51.106Z" }, - { url = "https://files.pythonhosted.org/packages/8b/b5/765fadb80caea4d62e6895a5404264a78746662044a2c64e73a8dceee588/pyqwest-0.5.1-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:03e57c1d58d7f236a08dfe5b27493ee56ae2d5e4b40e5c4bd9e6309000b4b86f", size = 5605021, upload-time = "2026-04-17T03:55:53.508Z" }, - { url = "https://files.pythonhosted.org/packages/98/eb/9d52f55f724edd40a2c2317074e283d8bb4bab564f7354a36e4f4f89e80e/pyqwest-0.5.1-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:958540d4861b9e7a228a775ea8b937c019bdc769d52b6e2e872b5bdc1ebf6870", size = 5761909, upload-time = "2026-04-17T03:55:56.063Z" }, - { url = "https://files.pythonhosted.org/packages/92/8c/7287ef3e34c5045fe1583385cf03a5a5681b7fae62676391444cfa44a4d1/pyqwest-0.5.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:469dfd7baaac6fd6565d396c8d05f19cb5ba279856af38b5f69ff8278e991c49", size = 4630018, upload-time = "2026-04-17T03:55:58.249Z" }, -] - -[[package]] -name = "pytest" -version = "9.0.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, - { name = "iniconfig" }, - { name = "packaging" }, - { name = "pluggy" }, - { name = "pygments" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/7d/0d/549bd94f1a0a402dc8cf64563a117c0f3765662e2e668477624baeec44d5/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c", size = 1572165, upload-time = "2026-04-07T17:16:18.027Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9", size = 375249, upload-time = "2026-04-07T17:16:16.13Z" }, -] - -[[package]] -name = "setuptools" -version = "80.9.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload-time = "2025-05-27T00:56:51.443Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" }, -] - -[[package]] -name = "tomli" -version = "2.4.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/11/db3d5885d8528263d8adc260bb2d28ebf1270b96e98f0e0268d32b8d9900/tomli-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30", size = 154704, upload-time = "2026-03-25T20:21:10.473Z" }, - { url = "https://files.pythonhosted.org/packages/6d/f7/675db52c7e46064a9aa928885a9b20f4124ecb9bc2e1ce74c9106648d202/tomli-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a", size = 149454, upload-time = "2026-03-25T20:21:12.036Z" }, - { url = "https://files.pythonhosted.org/packages/61/71/81c50943cf953efa35bce7646caab3cf457a7d8c030b27cfb40d7235f9ee/tomli-2.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96481a5786729fd470164b47cdb3e0e58062a496f455ee41b4403be77cb5a076", size = 237561, upload-time = "2026-03-25T20:21:13.098Z" }, - { url = "https://files.pythonhosted.org/packages/48/c1/f41d9cb618acccca7df82aaf682f9b49013c9397212cb9f53219e3abac37/tomli-2.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a881ab208c0baf688221f8cecc5401bd291d67e38a1ac884d6736cbcd8247e9", size = 243824, upload-time = "2026-03-25T20:21:14.569Z" }, - { url = "https://files.pythonhosted.org/packages/22/e4/5a816ecdd1f8ca51fb756ef684b90f2780afc52fc67f987e3c61d800a46d/tomli-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47149d5bd38761ac8be13a84864bf0b7b70bc051806bc3669ab1cbc56216b23c", size = 242227, upload-time = "2026-03-25T20:21:15.712Z" }, - { url = "https://files.pythonhosted.org/packages/6b/49/2b2a0ef529aa6eec245d25f0c703e020a73955ad7edf73e7f54ddc608aa5/tomli-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec9bfaf3ad2df51ace80688143a6a4ebc09a248f6ff781a9945e51937008fcbc", size = 247859, upload-time = "2026-03-25T20:21:17.001Z" }, - { url = "https://files.pythonhosted.org/packages/83/bd/6c1a630eaca337e1e78c5903104f831bda934c426f9231429396ce3c3467/tomli-2.4.1-cp311-cp311-win32.whl", hash = "sha256:ff2983983d34813c1aeb0fa89091e76c3a22889ee83ab27c5eeb45100560c049", size = 97204, upload-time = "2026-03-25T20:21:18.079Z" }, - { url = "https://files.pythonhosted.org/packages/42/59/71461df1a885647e10b6bb7802d0b8e66480c61f3f43079e0dcd315b3954/tomli-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:5ee18d9ebdb417e384b58fe414e8d6af9f4e7a0ae761519fb50f721de398dd4e", size = 108084, upload-time = "2026-03-25T20:21:18.978Z" }, - { url = "https://files.pythonhosted.org/packages/b8/83/dceca96142499c069475b790e7913b1044c1a4337e700751f48ed723f883/tomli-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:c2541745709bad0264b7d4705ad453b76ccd191e64aa6f0fc66b69a293a45ece", size = 95285, upload-time = "2026-03-25T20:21:20.309Z" }, - { url = "https://files.pythonhosted.org/packages/c1/ba/42f134a3fe2b370f555f44b1d72feebb94debcab01676bf918d0cb70e9aa/tomli-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a", size = 155924, upload-time = "2026-03-25T20:21:21.626Z" }, - { url = "https://files.pythonhosted.org/packages/dc/c7/62d7a17c26487ade21c5422b646110f2162f1fcc95980ef7f63e73c68f14/tomli-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085", size = 150018, upload-time = "2026-03-25T20:21:23.002Z" }, - { url = "https://files.pythonhosted.org/packages/5c/05/79d13d7c15f13bdef410bdd49a6485b1c37d28968314eabee452c22a7fda/tomli-2.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9", size = 244948, upload-time = "2026-03-25T20:21:24.04Z" }, - { url = "https://files.pythonhosted.org/packages/10/90/d62ce007a1c80d0b2c93e02cab211224756240884751b94ca72df8a875ca/tomli-2.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5", size = 253341, upload-time = "2026-03-25T20:21:25.177Z" }, - { url = "https://files.pythonhosted.org/packages/1a/7e/caf6496d60152ad4ed09282c1885cca4eea150bfd007da84aea07bcc0a3e/tomli-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585", size = 248159, upload-time = "2026-03-25T20:21:26.364Z" }, - { url = "https://files.pythonhosted.org/packages/99/e7/c6f69c3120de34bbd882c6fba7975f3d7a746e9218e56ab46a1bc4b42552/tomli-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1", size = 253290, upload-time = "2026-03-25T20:21:27.46Z" }, - { url = "https://files.pythonhosted.org/packages/d6/2f/4a3c322f22c5c66c4b836ec58211641a4067364f5dcdd7b974b4c5da300c/tomli-2.4.1-cp312-cp312-win32.whl", hash = "sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917", size = 98141, upload-time = "2026-03-25T20:21:28.492Z" }, - { url = "https://files.pythonhosted.org/packages/24/22/4daacd05391b92c55759d55eaee21e1dfaea86ce5c571f10083360adf534/tomli-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9", size = 108847, upload-time = "2026-03-25T20:21:29.386Z" }, - { url = "https://files.pythonhosted.org/packages/68/fd/70e768887666ddd9e9f5d85129e84910f2db2796f9096aa02b721a53098d/tomli-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257", size = 95088, upload-time = "2026-03-25T20:21:30.677Z" }, - { url = "https://files.pythonhosted.org/packages/07/06/b823a7e818c756d9a7123ba2cda7d07bc2dd32835648d1a7b7b7a05d848d/tomli-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54", size = 155866, upload-time = "2026-03-25T20:21:31.65Z" }, - { url = "https://files.pythonhosted.org/packages/14/6f/12645cf7f08e1a20c7eb8c297c6f11d31c1b50f316a7e7e1e1de6e2e7b7e/tomli-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a", size = 149887, upload-time = "2026-03-25T20:21:33.028Z" }, - { url = "https://files.pythonhosted.org/packages/5c/e0/90637574e5e7212c09099c67ad349b04ec4d6020324539297b634a0192b0/tomli-2.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897", size = 243704, upload-time = "2026-03-25T20:21:34.51Z" }, - { url = "https://files.pythonhosted.org/packages/10/8f/d3ddb16c5a4befdf31a23307f72828686ab2096f068eaf56631e136c1fdd/tomli-2.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f", size = 251628, upload-time = "2026-03-25T20:21:36.012Z" }, - { url = "https://files.pythonhosted.org/packages/e3/f1/dbeeb9116715abee2485bf0a12d07a8f31af94d71608c171c45f64c0469d/tomli-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d", size = 247180, upload-time = "2026-03-25T20:21:37.136Z" }, - { url = "https://files.pythonhosted.org/packages/d3/74/16336ffd19ed4da28a70959f92f506233bd7cfc2332b20bdb01591e8b1d1/tomli-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5", size = 251674, upload-time = "2026-03-25T20:21:38.298Z" }, - { url = "https://files.pythonhosted.org/packages/16/f9/229fa3434c590ddf6c0aa9af64d3af4b752540686cace29e6281e3458469/tomli-2.4.1-cp313-cp313-win32.whl", hash = "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd", size = 97976, upload-time = "2026-03-25T20:21:39.316Z" }, - { url = "https://files.pythonhosted.org/packages/6a/1e/71dfd96bcc1c775420cb8befe7a9d35f2e5b1309798f009dca17b7708c1e/tomli-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36", size = 108755, upload-time = "2026-03-25T20:21:40.248Z" }, - { url = "https://files.pythonhosted.org/packages/83/7a/d34f422a021d62420b78f5c538e5b102f62bea616d1d75a13f0a88acb04a/tomli-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd", size = 95265, upload-time = "2026-03-25T20:21:41.219Z" }, - { url = "https://files.pythonhosted.org/packages/3c/fb/9a5c8d27dbab540869f7c1f8eb0abb3244189ce780ba9cd73f3770662072/tomli-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf", size = 155726, upload-time = "2026-03-25T20:21:42.23Z" }, - { url = "https://files.pythonhosted.org/packages/62/05/d2f816630cc771ad836af54f5001f47a6f611d2d39535364f148b6a92d6b/tomli-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac", size = 149859, upload-time = "2026-03-25T20:21:43.386Z" }, - { url = "https://files.pythonhosted.org/packages/ce/48/66341bdb858ad9bd0ceab5a86f90eddab127cf8b046418009f2125630ecb/tomli-2.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662", size = 244713, upload-time = "2026-03-25T20:21:44.474Z" }, - { url = "https://files.pythonhosted.org/packages/df/6d/c5fad00d82b3c7a3ab6189bd4b10e60466f22cfe8a08a9394185c8a8111c/tomli-2.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853", size = 252084, upload-time = "2026-03-25T20:21:45.62Z" }, - { url = "https://files.pythonhosted.org/packages/00/71/3a69e86f3eafe8c7a59d008d245888051005bd657760e96d5fbfb0b740c2/tomli-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15", size = 247973, upload-time = "2026-03-25T20:21:46.937Z" }, - { url = "https://files.pythonhosted.org/packages/67/50/361e986652847fec4bd5e4a0208752fbe64689c603c7ae5ea7cb16b1c0ca/tomli-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba", size = 256223, upload-time = "2026-03-25T20:21:48.467Z" }, - { url = "https://files.pythonhosted.org/packages/8c/9a/b4173689a9203472e5467217e0154b00e260621caa227b6fa01feab16998/tomli-2.4.1-cp314-cp314-win32.whl", hash = "sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6", size = 98973, upload-time = "2026-03-25T20:21:49.526Z" }, - { url = "https://files.pythonhosted.org/packages/14/58/640ac93bf230cd27d002462c9af0d837779f8773bc03dee06b5835208214/tomli-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7", size = 109082, upload-time = "2026-03-25T20:21:50.506Z" }, - { url = "https://files.pythonhosted.org/packages/d5/2f/702d5e05b227401c1068f0d386d79a589bb12bf64c3d2c72ce0631e3bc49/tomli-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232", size = 96490, upload-time = "2026-03-25T20:21:51.474Z" }, - { url = "https://files.pythonhosted.org/packages/45/4b/b877b05c8ba62927d9865dd980e34a755de541eb65fffba52b4cc495d4d2/tomli-2.4.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4", size = 164263, upload-time = "2026-03-25T20:21:52.543Z" }, - { url = "https://files.pythonhosted.org/packages/24/79/6ab420d37a270b89f7195dec5448f79400d9e9c1826df982f3f8e97b24fd/tomli-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c", size = 160736, upload-time = "2026-03-25T20:21:53.674Z" }, - { url = "https://files.pythonhosted.org/packages/02/e0/3630057d8eb170310785723ed5adcdfb7d50cb7e6455f85ba8a3deed642b/tomli-2.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d", size = 270717, upload-time = "2026-03-25T20:21:55.129Z" }, - { url = "https://files.pythonhosted.org/packages/7a/b4/1613716072e544d1a7891f548d8f9ec6ce2faf42ca65acae01d76ea06bb0/tomli-2.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41", size = 278461, upload-time = "2026-03-25T20:21:56.228Z" }, - { url = "https://files.pythonhosted.org/packages/05/38/30f541baf6a3f6df77b3df16b01ba319221389e2da59427e221ef417ac0c/tomli-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c", size = 274855, upload-time = "2026-03-25T20:21:57.653Z" }, - { url = "https://files.pythonhosted.org/packages/77/a3/ec9dd4fd2c38e98de34223b995a3b34813e6bdadf86c75314c928350ed14/tomli-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f", size = 283144, upload-time = "2026-03-25T20:21:59.089Z" }, - { url = "https://files.pythonhosted.org/packages/ef/be/605a6261cac79fba2ec0c9827e986e00323a1945700969b8ee0b30d85453/tomli-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8", size = 108683, upload-time = "2026-03-25T20:22:00.214Z" }, - { url = "https://files.pythonhosted.org/packages/12/64/da524626d3b9cc40c168a13da8335fe1c51be12c0a63685cc6db7308daae/tomli-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26", size = 121196, upload-time = "2026-03-25T20:22:01.169Z" }, - { url = "https://files.pythonhosted.org/packages/5a/cd/e80b62269fc78fc36c9af5a6b89c835baa8af28ff5ad28c7028d60860320/tomli-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396", size = 100393, upload-time = "2026-03-25T20:22:02.137Z" }, - { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, -] - -[[package]] -name = "types-protobuf" -version = "6.32.1.20251210" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c2/59/c743a842911887cd96d56aa8936522b0cd5f7a7f228c96e81b59fced45be/types_protobuf-6.32.1.20251210.tar.gz", hash = "sha256:c698bb3f020274b1a2798ae09dc773728ce3f75209a35187bd11916ebfde6763", size = 63900, upload-time = "2025-12-10T03:14:25.451Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/aa/43/58e75bac4219cbafee83179505ff44cae3153ec279be0e30583a73b8f108/types_protobuf-6.32.1.20251210-py3-none-any.whl", hash = "sha256:2641f78f3696822a048cfb8d0ff42ccd85c25f12f871fbebe86da63793692140", size = 77921, upload-time = "2025-12-10T03:14:24.477Z" }, -] - -[[package]] -name = "typing-extensions" -version = "4.15.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, -] - -[[package]] -name = "zipp" -version = "3.23.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/30/21/093488dfc7cc8964ded15ab726fad40f25fd3d788fd741cc1c5a17d78ee8/zipp-3.23.1.tar.gz", hash = "sha256:32120e378d32cd9714ad503c1d024619063ec28aad2248dc6672ad13edfa5110", size = 25965, upload-time = "2026-04-13T23:21:46.6Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl", hash = "sha256:0b3596c50a5c700c9cb40ba8d86d9f2cc4807e9bedb06bcdf7fac85633e444dc", size = 10378, upload-time = "2026-04-13T23:21:45.386Z" }, -] diff --git a/otdf-python-proto/README.md b/packages/otdf-python-proto/README.md similarity index 100% rename from otdf-python-proto/README.md rename to packages/otdf-python-proto/README.md diff --git a/otdf-python-proto/buf.gen.yaml b/packages/otdf-python-proto/buf.gen.yaml similarity index 93% rename from otdf-python-proto/buf.gen.yaml rename to packages/otdf-python-proto/buf.gen.yaml index 2bb62b1e..e40baf50 100644 --- a/otdf-python-proto/buf.gen.yaml +++ b/packages/otdf-python-proto/buf.gen.yaml @@ -18,7 +18,7 @@ plugins: out: src/otdf_python_proto # Connect Python client generation (preferred) - - local: ../.venv/bin/protoc-gen-connect-python + - local: ../../.venv/bin/protoc-gen-connect-python out: src/otdf_python_proto opt: - paths=source_relative diff --git a/otdf-python-proto/buf.lock b/packages/otdf-python-proto/buf.lock similarity index 100% rename from otdf-python-proto/buf.lock rename to packages/otdf-python-proto/buf.lock diff --git a/otdf-python-proto/buf.yaml b/packages/otdf-python-proto/buf.yaml similarity index 100% rename from otdf-python-proto/buf.yaml rename to packages/otdf-python-proto/buf.yaml diff --git a/otdf-python-proto/generated/__init__.py b/packages/otdf-python-proto/generated/__init__.py similarity index 100% rename from otdf-python-proto/generated/__init__.py rename to packages/otdf-python-proto/generated/__init__.py diff --git a/otdf-python-proto/proto-files/authorization/authorization.proto b/packages/otdf-python-proto/proto-files/authorization/authorization.proto similarity index 100% rename from otdf-python-proto/proto-files/authorization/authorization.proto rename to packages/otdf-python-proto/proto-files/authorization/authorization.proto diff --git a/otdf-python-proto/proto-files/authorization/v2/authorization.proto b/packages/otdf-python-proto/proto-files/authorization/v2/authorization.proto similarity index 100% rename from otdf-python-proto/proto-files/authorization/v2/authorization.proto rename to packages/otdf-python-proto/proto-files/authorization/v2/authorization.proto diff --git a/otdf-python-proto/proto-files/common/common.proto b/packages/otdf-python-proto/proto-files/common/common.proto similarity index 100% rename from otdf-python-proto/proto-files/common/common.proto rename to packages/otdf-python-proto/proto-files/common/common.proto diff --git a/otdf-python-proto/proto-files/entity/entity.proto b/packages/otdf-python-proto/proto-files/entity/entity.proto similarity index 100% rename from otdf-python-proto/proto-files/entity/entity.proto rename to packages/otdf-python-proto/proto-files/entity/entity.proto diff --git a/otdf-python-proto/proto-files/entityresolution/entity_resolution.proto b/packages/otdf-python-proto/proto-files/entityresolution/entity_resolution.proto similarity index 100% rename from otdf-python-proto/proto-files/entityresolution/entity_resolution.proto rename to packages/otdf-python-proto/proto-files/entityresolution/entity_resolution.proto diff --git a/otdf-python-proto/proto-files/entityresolution/v2/entity_resolution.proto b/packages/otdf-python-proto/proto-files/entityresolution/v2/entity_resolution.proto similarity index 100% rename from otdf-python-proto/proto-files/entityresolution/v2/entity_resolution.proto rename to packages/otdf-python-proto/proto-files/entityresolution/v2/entity_resolution.proto diff --git a/otdf-python-proto/proto-files/kas/kas.proto b/packages/otdf-python-proto/proto-files/kas/kas.proto similarity index 100% rename from otdf-python-proto/proto-files/kas/kas.proto rename to packages/otdf-python-proto/proto-files/kas/kas.proto diff --git a/otdf-python-proto/proto-files/logger/audit/test.proto b/packages/otdf-python-proto/proto-files/logger/audit/test.proto similarity index 100% rename from otdf-python-proto/proto-files/logger/audit/test.proto rename to packages/otdf-python-proto/proto-files/logger/audit/test.proto diff --git a/otdf-python-proto/proto-files/policy/actions/actions.proto b/packages/otdf-python-proto/proto-files/policy/actions/actions.proto similarity index 100% rename from otdf-python-proto/proto-files/policy/actions/actions.proto rename to packages/otdf-python-proto/proto-files/policy/actions/actions.proto diff --git a/otdf-python-proto/proto-files/policy/attributes/attributes.proto b/packages/otdf-python-proto/proto-files/policy/attributes/attributes.proto similarity index 100% rename from otdf-python-proto/proto-files/policy/attributes/attributes.proto rename to packages/otdf-python-proto/proto-files/policy/attributes/attributes.proto diff --git a/otdf-python-proto/proto-files/policy/kasregistry/key_access_server_registry.proto b/packages/otdf-python-proto/proto-files/policy/kasregistry/key_access_server_registry.proto similarity index 100% rename from otdf-python-proto/proto-files/policy/kasregistry/key_access_server_registry.proto rename to packages/otdf-python-proto/proto-files/policy/kasregistry/key_access_server_registry.proto diff --git a/otdf-python-proto/proto-files/policy/keymanagement/key_management.proto b/packages/otdf-python-proto/proto-files/policy/keymanagement/key_management.proto similarity index 100% rename from otdf-python-proto/proto-files/policy/keymanagement/key_management.proto rename to packages/otdf-python-proto/proto-files/policy/keymanagement/key_management.proto diff --git a/otdf-python-proto/proto-files/policy/namespaces/namespaces.proto b/packages/otdf-python-proto/proto-files/policy/namespaces/namespaces.proto similarity index 100% rename from otdf-python-proto/proto-files/policy/namespaces/namespaces.proto rename to packages/otdf-python-proto/proto-files/policy/namespaces/namespaces.proto diff --git a/otdf-python-proto/proto-files/policy/objects.proto b/packages/otdf-python-proto/proto-files/policy/objects.proto similarity index 100% rename from otdf-python-proto/proto-files/policy/objects.proto rename to packages/otdf-python-proto/proto-files/policy/objects.proto diff --git a/otdf-python-proto/proto-files/policy/obligations/obligations.proto b/packages/otdf-python-proto/proto-files/policy/obligations/obligations.proto similarity index 100% rename from otdf-python-proto/proto-files/policy/obligations/obligations.proto rename to packages/otdf-python-proto/proto-files/policy/obligations/obligations.proto diff --git a/otdf-python-proto/proto-files/policy/registeredresources/registered_resources.proto b/packages/otdf-python-proto/proto-files/policy/registeredresources/registered_resources.proto similarity index 100% rename from otdf-python-proto/proto-files/policy/registeredresources/registered_resources.proto rename to packages/otdf-python-proto/proto-files/policy/registeredresources/registered_resources.proto diff --git a/otdf-python-proto/proto-files/policy/resourcemapping/resource_mapping.proto b/packages/otdf-python-proto/proto-files/policy/resourcemapping/resource_mapping.proto similarity index 100% rename from otdf-python-proto/proto-files/policy/resourcemapping/resource_mapping.proto rename to packages/otdf-python-proto/proto-files/policy/resourcemapping/resource_mapping.proto diff --git a/otdf-python-proto/proto-files/policy/selectors.proto b/packages/otdf-python-proto/proto-files/policy/selectors.proto similarity index 100% rename from otdf-python-proto/proto-files/policy/selectors.proto rename to packages/otdf-python-proto/proto-files/policy/selectors.proto diff --git a/otdf-python-proto/proto-files/policy/subjectmapping/subject_mapping.proto b/packages/otdf-python-proto/proto-files/policy/subjectmapping/subject_mapping.proto similarity index 100% rename from otdf-python-proto/proto-files/policy/subjectmapping/subject_mapping.proto rename to packages/otdf-python-proto/proto-files/policy/subjectmapping/subject_mapping.proto diff --git a/otdf-python-proto/proto-files/policy/unsafe/unsafe.proto b/packages/otdf-python-proto/proto-files/policy/unsafe/unsafe.proto similarity index 100% rename from otdf-python-proto/proto-files/policy/unsafe/unsafe.proto rename to packages/otdf-python-proto/proto-files/policy/unsafe/unsafe.proto diff --git a/otdf-python-proto/proto-files/wellknownconfiguration/wellknown_configuration.proto b/packages/otdf-python-proto/proto-files/wellknownconfiguration/wellknown_configuration.proto similarity index 100% rename from otdf-python-proto/proto-files/wellknownconfiguration/wellknown_configuration.proto rename to packages/otdf-python-proto/proto-files/wellknownconfiguration/wellknown_configuration.proto diff --git a/otdf-python-proto/pyproject.toml b/packages/otdf-python-proto/pyproject.toml similarity index 100% rename from otdf-python-proto/pyproject.toml rename to packages/otdf-python-proto/pyproject.toml diff --git a/otdf-python-proto/scripts/build_connect_proto.sh b/packages/otdf-python-proto/scripts/build_connect_proto.sh similarity index 100% rename from otdf-python-proto/scripts/build_connect_proto.sh rename to packages/otdf-python-proto/scripts/build_connect_proto.sh diff --git a/otdf-python-proto/scripts/generate_connect_proto.py b/packages/otdf-python-proto/scripts/generate_connect_proto.py similarity index 100% rename from otdf-python-proto/scripts/generate_connect_proto.py rename to packages/otdf-python-proto/scripts/generate_connect_proto.py diff --git a/otdf-python-proto/scripts/setup_connect_rpc.py b/packages/otdf-python-proto/scripts/setup_connect_rpc.py similarity index 100% rename from otdf-python-proto/scripts/setup_connect_rpc.py rename to packages/otdf-python-proto/scripts/setup_connect_rpc.py diff --git a/otdf-python-proto/src/otdf_python_proto/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/authorization/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/authorization/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/authorization/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/authorization/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/authorization/authorization_connect.py b/packages/otdf-python-proto/src/otdf_python_proto/authorization/authorization_connect.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/authorization/authorization_connect.py rename to packages/otdf-python-proto/src/otdf_python_proto/authorization/authorization_connect.py diff --git a/otdf-python-proto/src/otdf_python_proto/authorization/authorization_pb2.py b/packages/otdf-python-proto/src/otdf_python_proto/authorization/authorization_pb2.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/authorization/authorization_pb2.py rename to packages/otdf-python-proto/src/otdf_python_proto/authorization/authorization_pb2.py diff --git a/otdf-python-proto/src/otdf_python_proto/authorization/authorization_pb2.pyi b/packages/otdf-python-proto/src/otdf_python_proto/authorization/authorization_pb2.pyi similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/authorization/authorization_pb2.pyi rename to packages/otdf-python-proto/src/otdf_python_proto/authorization/authorization_pb2.pyi diff --git a/otdf-python-proto/src/otdf_python_proto/authorization/v2/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/authorization/v2/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/authorization/v2/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/authorization/v2/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/authorization/v2/authorization_connect.py b/packages/otdf-python-proto/src/otdf_python_proto/authorization/v2/authorization_connect.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/authorization/v2/authorization_connect.py rename to packages/otdf-python-proto/src/otdf_python_proto/authorization/v2/authorization_connect.py diff --git a/otdf-python-proto/src/otdf_python_proto/authorization/v2/authorization_pb2.py b/packages/otdf-python-proto/src/otdf_python_proto/authorization/v2/authorization_pb2.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/authorization/v2/authorization_pb2.py rename to packages/otdf-python-proto/src/otdf_python_proto/authorization/v2/authorization_pb2.py diff --git a/otdf-python-proto/src/otdf_python_proto/authorization/v2/authorization_pb2.pyi b/packages/otdf-python-proto/src/otdf_python_proto/authorization/v2/authorization_pb2.pyi similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/authorization/v2/authorization_pb2.pyi rename to packages/otdf-python-proto/src/otdf_python_proto/authorization/v2/authorization_pb2.pyi diff --git a/otdf-python-proto/src/otdf_python_proto/common/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/common/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/common/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/common/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/common/common_pb2.py b/packages/otdf-python-proto/src/otdf_python_proto/common/common_pb2.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/common/common_pb2.py rename to packages/otdf-python-proto/src/otdf_python_proto/common/common_pb2.py diff --git a/otdf-python-proto/src/otdf_python_proto/common/common_pb2.pyi b/packages/otdf-python-proto/src/otdf_python_proto/common/common_pb2.pyi similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/common/common_pb2.pyi rename to packages/otdf-python-proto/src/otdf_python_proto/common/common_pb2.pyi diff --git a/otdf-python-proto/src/otdf_python_proto/entity/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/entity/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/entity/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/entity/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/entity/entity_pb2.py b/packages/otdf-python-proto/src/otdf_python_proto/entity/entity_pb2.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/entity/entity_pb2.py rename to packages/otdf-python-proto/src/otdf_python_proto/entity/entity_pb2.py diff --git a/otdf-python-proto/src/otdf_python_proto/entity/entity_pb2.pyi b/packages/otdf-python-proto/src/otdf_python_proto/entity/entity_pb2.pyi similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/entity/entity_pb2.pyi rename to packages/otdf-python-proto/src/otdf_python_proto/entity/entity_pb2.pyi diff --git a/otdf-python-proto/src/otdf_python_proto/entityresolution/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/entityresolution/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/entityresolution/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/entityresolution/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/entityresolution/entity_resolution_connect.py b/packages/otdf-python-proto/src/otdf_python_proto/entityresolution/entity_resolution_connect.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/entityresolution/entity_resolution_connect.py rename to packages/otdf-python-proto/src/otdf_python_proto/entityresolution/entity_resolution_connect.py diff --git a/otdf-python-proto/src/otdf_python_proto/entityresolution/entity_resolution_pb2.py b/packages/otdf-python-proto/src/otdf_python_proto/entityresolution/entity_resolution_pb2.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/entityresolution/entity_resolution_pb2.py rename to packages/otdf-python-proto/src/otdf_python_proto/entityresolution/entity_resolution_pb2.py diff --git a/otdf-python-proto/src/otdf_python_proto/entityresolution/entity_resolution_pb2.pyi b/packages/otdf-python-proto/src/otdf_python_proto/entityresolution/entity_resolution_pb2.pyi similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/entityresolution/entity_resolution_pb2.pyi rename to packages/otdf-python-proto/src/otdf_python_proto/entityresolution/entity_resolution_pb2.pyi diff --git a/otdf-python-proto/src/otdf_python_proto/entityresolution/v2/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/entityresolution/v2/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/entityresolution/v2/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/entityresolution/v2/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/entityresolution/v2/entity_resolution_connect.py b/packages/otdf-python-proto/src/otdf_python_proto/entityresolution/v2/entity_resolution_connect.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/entityresolution/v2/entity_resolution_connect.py rename to packages/otdf-python-proto/src/otdf_python_proto/entityresolution/v2/entity_resolution_connect.py diff --git a/otdf-python-proto/src/otdf_python_proto/entityresolution/v2/entity_resolution_pb2.py b/packages/otdf-python-proto/src/otdf_python_proto/entityresolution/v2/entity_resolution_pb2.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/entityresolution/v2/entity_resolution_pb2.py rename to packages/otdf-python-proto/src/otdf_python_proto/entityresolution/v2/entity_resolution_pb2.py diff --git a/otdf-python-proto/src/otdf_python_proto/entityresolution/v2/entity_resolution_pb2.pyi b/packages/otdf-python-proto/src/otdf_python_proto/entityresolution/v2/entity_resolution_pb2.pyi similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/entityresolution/v2/entity_resolution_pb2.pyi rename to packages/otdf-python-proto/src/otdf_python_proto/entityresolution/v2/entity_resolution_pb2.pyi diff --git a/otdf-python-proto/src/otdf_python_proto/kas/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/kas/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/kas/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/kas/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/kas/kas_connect.py b/packages/otdf-python-proto/src/otdf_python_proto/kas/kas_connect.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/kas/kas_connect.py rename to packages/otdf-python-proto/src/otdf_python_proto/kas/kas_connect.py diff --git a/otdf-python-proto/src/otdf_python_proto/kas/kas_pb2.py b/packages/otdf-python-proto/src/otdf_python_proto/kas/kas_pb2.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/kas/kas_pb2.py rename to packages/otdf-python-proto/src/otdf_python_proto/kas/kas_pb2.py diff --git a/otdf-python-proto/src/otdf_python_proto/kas/kas_pb2.pyi b/packages/otdf-python-proto/src/otdf_python_proto/kas/kas_pb2.pyi similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/kas/kas_pb2.pyi rename to packages/otdf-python-proto/src/otdf_python_proto/kas/kas_pb2.pyi diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/authorization/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/authorization/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/authorization/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/authorization/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/authorization/authorization_pb2_grpc.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/authorization/authorization_pb2_grpc.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/authorization/authorization_pb2_grpc.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/authorization/authorization_pb2_grpc.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/authorization/v2/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/authorization/v2/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/authorization/v2/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/authorization/v2/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/authorization/v2/authorization_pb2_grpc.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/authorization/v2/authorization_pb2_grpc.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/authorization/v2/authorization_pb2_grpc.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/authorization/v2/authorization_pb2_grpc.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/common/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/common/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/common/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/common/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/common/common_pb2_grpc.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/common/common_pb2_grpc.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/common/common_pb2_grpc.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/common/common_pb2_grpc.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/entity/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/entity/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/entity/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/entity/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/entity/entity_pb2_grpc.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/entity/entity_pb2_grpc.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/entity/entity_pb2_grpc.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/entity/entity_pb2_grpc.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/entityresolution/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/entityresolution/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/entityresolution/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/entityresolution/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/entityresolution/entity_resolution_pb2_grpc.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/entityresolution/entity_resolution_pb2_grpc.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/entityresolution/entity_resolution_pb2_grpc.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/entityresolution/entity_resolution_pb2_grpc.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/entityresolution/v2/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/entityresolution/v2/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/entityresolution/v2/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/entityresolution/v2/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/entityresolution/v2/entity_resolution_pb2_grpc.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/entityresolution/v2/entity_resolution_pb2_grpc.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/entityresolution/v2/entity_resolution_pb2_grpc.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/entityresolution/v2/entity_resolution_pb2_grpc.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/kas/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/kas/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/kas/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/kas/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/kas/kas_pb2_grpc.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/kas/kas_pb2_grpc.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/kas/kas_pb2_grpc.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/kas/kas_pb2_grpc.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/logger/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/logger/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/logger/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/logger/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/logger/audit/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/logger/audit/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/logger/audit/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/logger/audit/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/logger/audit/test_pb2_grpc.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/logger/audit/test_pb2_grpc.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/logger/audit/test_pb2_grpc.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/logger/audit/test_pb2_grpc.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/actions/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/actions/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/actions/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/actions/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/actions/actions_pb2_grpc.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/actions/actions_pb2_grpc.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/actions/actions_pb2_grpc.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/actions/actions_pb2_grpc.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/attributes/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/attributes/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/attributes/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/attributes/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/attributes/attributes_pb2_grpc.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/attributes/attributes_pb2_grpc.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/attributes/attributes_pb2_grpc.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/attributes/attributes_pb2_grpc.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/kasregistry/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/kasregistry/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/kasregistry/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/kasregistry/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/kasregistry/key_access_server_registry_pb2_grpc.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/kasregistry/key_access_server_registry_pb2_grpc.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/kasregistry/key_access_server_registry_pb2_grpc.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/kasregistry/key_access_server_registry_pb2_grpc.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/keymanagement/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/keymanagement/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/keymanagement/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/keymanagement/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/keymanagement/key_management_pb2_grpc.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/keymanagement/key_management_pb2_grpc.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/keymanagement/key_management_pb2_grpc.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/keymanagement/key_management_pb2_grpc.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/namespaces/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/namespaces/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/namespaces/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/namespaces/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/namespaces/namespaces_pb2_grpc.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/namespaces/namespaces_pb2_grpc.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/namespaces/namespaces_pb2_grpc.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/namespaces/namespaces_pb2_grpc.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/objects_pb2_grpc.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/objects_pb2_grpc.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/objects_pb2_grpc.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/objects_pb2_grpc.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/obligations/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/obligations/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/obligations/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/obligations/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/obligations/obligations_pb2_grpc.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/obligations/obligations_pb2_grpc.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/obligations/obligations_pb2_grpc.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/obligations/obligations_pb2_grpc.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/registeredresources/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/registeredresources/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/registeredresources/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/registeredresources/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/registeredresources/registered_resources_pb2_grpc.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/registeredresources/registered_resources_pb2_grpc.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/registeredresources/registered_resources_pb2_grpc.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/registeredresources/registered_resources_pb2_grpc.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/resourcemapping/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/resourcemapping/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/resourcemapping/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/resourcemapping/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/resourcemapping/resource_mapping_pb2_grpc.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/resourcemapping/resource_mapping_pb2_grpc.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/resourcemapping/resource_mapping_pb2_grpc.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/resourcemapping/resource_mapping_pb2_grpc.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/selectors_pb2_grpc.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/selectors_pb2_grpc.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/selectors_pb2_grpc.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/selectors_pb2_grpc.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/subjectmapping/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/subjectmapping/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/subjectmapping/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/subjectmapping/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/subjectmapping/subject_mapping_pb2_grpc.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/subjectmapping/subject_mapping_pb2_grpc.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/subjectmapping/subject_mapping_pb2_grpc.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/subjectmapping/subject_mapping_pb2_grpc.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/unsafe/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/unsafe/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/unsafe/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/unsafe/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/unsafe/unsafe_pb2_grpc.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/unsafe/unsafe_pb2_grpc.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/unsafe/unsafe_pb2_grpc.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/unsafe/unsafe_pb2_grpc.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/wellknownconfiguration/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/wellknownconfiguration/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/wellknownconfiguration/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/wellknownconfiguration/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/legacy_grpc/wellknownconfiguration/wellknown_configuration_pb2_grpc.py b/packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/wellknownconfiguration/wellknown_configuration_pb2_grpc.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/legacy_grpc/wellknownconfiguration/wellknown_configuration_pb2_grpc.py rename to packages/otdf-python-proto/src/otdf_python_proto/legacy_grpc/wellknownconfiguration/wellknown_configuration_pb2_grpc.py diff --git a/otdf-python-proto/src/otdf_python_proto/logger/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/logger/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/logger/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/logger/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/logger/audit/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/logger/audit/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/logger/audit/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/logger/audit/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/logger/audit/test_pb2.py b/packages/otdf-python-proto/src/otdf_python_proto/logger/audit/test_pb2.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/logger/audit/test_pb2.py rename to packages/otdf-python-proto/src/otdf_python_proto/logger/audit/test_pb2.py diff --git a/otdf-python-proto/src/otdf_python_proto/logger/audit/test_pb2.pyi b/packages/otdf-python-proto/src/otdf_python_proto/logger/audit/test_pb2.pyi similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/logger/audit/test_pb2.pyi rename to packages/otdf-python-proto/src/otdf_python_proto/logger/audit/test_pb2.pyi diff --git a/otdf-python-proto/src/otdf_python_proto/policy/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/policy/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/policy/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/policy/actions/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/policy/actions/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/actions/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/policy/actions/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/policy/actions/actions_connect.py b/packages/otdf-python-proto/src/otdf_python_proto/policy/actions/actions_connect.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/actions/actions_connect.py rename to packages/otdf-python-proto/src/otdf_python_proto/policy/actions/actions_connect.py diff --git a/otdf-python-proto/src/otdf_python_proto/policy/actions/actions_pb2.py b/packages/otdf-python-proto/src/otdf_python_proto/policy/actions/actions_pb2.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/actions/actions_pb2.py rename to packages/otdf-python-proto/src/otdf_python_proto/policy/actions/actions_pb2.py diff --git a/otdf-python-proto/src/otdf_python_proto/policy/actions/actions_pb2.pyi b/packages/otdf-python-proto/src/otdf_python_proto/policy/actions/actions_pb2.pyi similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/actions/actions_pb2.pyi rename to packages/otdf-python-proto/src/otdf_python_proto/policy/actions/actions_pb2.pyi diff --git a/otdf-python-proto/src/otdf_python_proto/policy/attributes/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/policy/attributes/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/attributes/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/policy/attributes/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/policy/attributes/attributes_connect.py b/packages/otdf-python-proto/src/otdf_python_proto/policy/attributes/attributes_connect.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/attributes/attributes_connect.py rename to packages/otdf-python-proto/src/otdf_python_proto/policy/attributes/attributes_connect.py diff --git a/otdf-python-proto/src/otdf_python_proto/policy/attributes/attributes_pb2.py b/packages/otdf-python-proto/src/otdf_python_proto/policy/attributes/attributes_pb2.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/attributes/attributes_pb2.py rename to packages/otdf-python-proto/src/otdf_python_proto/policy/attributes/attributes_pb2.py diff --git a/otdf-python-proto/src/otdf_python_proto/policy/attributes/attributes_pb2.pyi b/packages/otdf-python-proto/src/otdf_python_proto/policy/attributes/attributes_pb2.pyi similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/attributes/attributes_pb2.pyi rename to packages/otdf-python-proto/src/otdf_python_proto/policy/attributes/attributes_pb2.pyi diff --git a/otdf-python-proto/src/otdf_python_proto/policy/kasregistry/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/policy/kasregistry/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/kasregistry/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/policy/kasregistry/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/policy/kasregistry/key_access_server_registry_connect.py b/packages/otdf-python-proto/src/otdf_python_proto/policy/kasregistry/key_access_server_registry_connect.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/kasregistry/key_access_server_registry_connect.py rename to packages/otdf-python-proto/src/otdf_python_proto/policy/kasregistry/key_access_server_registry_connect.py diff --git a/otdf-python-proto/src/otdf_python_proto/policy/kasregistry/key_access_server_registry_pb2.py b/packages/otdf-python-proto/src/otdf_python_proto/policy/kasregistry/key_access_server_registry_pb2.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/kasregistry/key_access_server_registry_pb2.py rename to packages/otdf-python-proto/src/otdf_python_proto/policy/kasregistry/key_access_server_registry_pb2.py diff --git a/otdf-python-proto/src/otdf_python_proto/policy/kasregistry/key_access_server_registry_pb2.pyi b/packages/otdf-python-proto/src/otdf_python_proto/policy/kasregistry/key_access_server_registry_pb2.pyi similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/kasregistry/key_access_server_registry_pb2.pyi rename to packages/otdf-python-proto/src/otdf_python_proto/policy/kasregistry/key_access_server_registry_pb2.pyi diff --git a/otdf-python-proto/src/otdf_python_proto/policy/keymanagement/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/policy/keymanagement/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/keymanagement/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/policy/keymanagement/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/policy/keymanagement/key_management_connect.py b/packages/otdf-python-proto/src/otdf_python_proto/policy/keymanagement/key_management_connect.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/keymanagement/key_management_connect.py rename to packages/otdf-python-proto/src/otdf_python_proto/policy/keymanagement/key_management_connect.py diff --git a/otdf-python-proto/src/otdf_python_proto/policy/keymanagement/key_management_pb2.py b/packages/otdf-python-proto/src/otdf_python_proto/policy/keymanagement/key_management_pb2.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/keymanagement/key_management_pb2.py rename to packages/otdf-python-proto/src/otdf_python_proto/policy/keymanagement/key_management_pb2.py diff --git a/otdf-python-proto/src/otdf_python_proto/policy/keymanagement/key_management_pb2.pyi b/packages/otdf-python-proto/src/otdf_python_proto/policy/keymanagement/key_management_pb2.pyi similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/keymanagement/key_management_pb2.pyi rename to packages/otdf-python-proto/src/otdf_python_proto/policy/keymanagement/key_management_pb2.pyi diff --git a/otdf-python-proto/src/otdf_python_proto/policy/namespaces/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/policy/namespaces/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/namespaces/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/policy/namespaces/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/policy/namespaces/namespaces_connect.py b/packages/otdf-python-proto/src/otdf_python_proto/policy/namespaces/namespaces_connect.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/namespaces/namespaces_connect.py rename to packages/otdf-python-proto/src/otdf_python_proto/policy/namespaces/namespaces_connect.py diff --git a/otdf-python-proto/src/otdf_python_proto/policy/namespaces/namespaces_pb2.py b/packages/otdf-python-proto/src/otdf_python_proto/policy/namespaces/namespaces_pb2.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/namespaces/namespaces_pb2.py rename to packages/otdf-python-proto/src/otdf_python_proto/policy/namespaces/namespaces_pb2.py diff --git a/otdf-python-proto/src/otdf_python_proto/policy/namespaces/namespaces_pb2.pyi b/packages/otdf-python-proto/src/otdf_python_proto/policy/namespaces/namespaces_pb2.pyi similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/namespaces/namespaces_pb2.pyi rename to packages/otdf-python-proto/src/otdf_python_proto/policy/namespaces/namespaces_pb2.pyi diff --git a/otdf-python-proto/src/otdf_python_proto/policy/objects_pb2.py b/packages/otdf-python-proto/src/otdf_python_proto/policy/objects_pb2.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/objects_pb2.py rename to packages/otdf-python-proto/src/otdf_python_proto/policy/objects_pb2.py diff --git a/otdf-python-proto/src/otdf_python_proto/policy/objects_pb2.pyi b/packages/otdf-python-proto/src/otdf_python_proto/policy/objects_pb2.pyi similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/objects_pb2.pyi rename to packages/otdf-python-proto/src/otdf_python_proto/policy/objects_pb2.pyi diff --git a/otdf-python-proto/src/otdf_python_proto/policy/obligations/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/policy/obligations/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/obligations/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/policy/obligations/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/policy/obligations/obligations_connect.py b/packages/otdf-python-proto/src/otdf_python_proto/policy/obligations/obligations_connect.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/obligations/obligations_connect.py rename to packages/otdf-python-proto/src/otdf_python_proto/policy/obligations/obligations_connect.py diff --git a/otdf-python-proto/src/otdf_python_proto/policy/obligations/obligations_pb2.py b/packages/otdf-python-proto/src/otdf_python_proto/policy/obligations/obligations_pb2.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/obligations/obligations_pb2.py rename to packages/otdf-python-proto/src/otdf_python_proto/policy/obligations/obligations_pb2.py diff --git a/otdf-python-proto/src/otdf_python_proto/policy/obligations/obligations_pb2.pyi b/packages/otdf-python-proto/src/otdf_python_proto/policy/obligations/obligations_pb2.pyi similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/obligations/obligations_pb2.pyi rename to packages/otdf-python-proto/src/otdf_python_proto/policy/obligations/obligations_pb2.pyi diff --git a/otdf-python-proto/src/otdf_python_proto/policy/registeredresources/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/policy/registeredresources/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/registeredresources/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/policy/registeredresources/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/policy/registeredresources/registered_resources_connect.py b/packages/otdf-python-proto/src/otdf_python_proto/policy/registeredresources/registered_resources_connect.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/registeredresources/registered_resources_connect.py rename to packages/otdf-python-proto/src/otdf_python_proto/policy/registeredresources/registered_resources_connect.py diff --git a/otdf-python-proto/src/otdf_python_proto/policy/registeredresources/registered_resources_pb2.py b/packages/otdf-python-proto/src/otdf_python_proto/policy/registeredresources/registered_resources_pb2.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/registeredresources/registered_resources_pb2.py rename to packages/otdf-python-proto/src/otdf_python_proto/policy/registeredresources/registered_resources_pb2.py diff --git a/otdf-python-proto/src/otdf_python_proto/policy/registeredresources/registered_resources_pb2.pyi b/packages/otdf-python-proto/src/otdf_python_proto/policy/registeredresources/registered_resources_pb2.pyi similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/registeredresources/registered_resources_pb2.pyi rename to packages/otdf-python-proto/src/otdf_python_proto/policy/registeredresources/registered_resources_pb2.pyi diff --git a/otdf-python-proto/src/otdf_python_proto/policy/resourcemapping/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/policy/resourcemapping/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/resourcemapping/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/policy/resourcemapping/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/policy/resourcemapping/resource_mapping_connect.py b/packages/otdf-python-proto/src/otdf_python_proto/policy/resourcemapping/resource_mapping_connect.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/resourcemapping/resource_mapping_connect.py rename to packages/otdf-python-proto/src/otdf_python_proto/policy/resourcemapping/resource_mapping_connect.py diff --git a/otdf-python-proto/src/otdf_python_proto/policy/resourcemapping/resource_mapping_pb2.py b/packages/otdf-python-proto/src/otdf_python_proto/policy/resourcemapping/resource_mapping_pb2.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/resourcemapping/resource_mapping_pb2.py rename to packages/otdf-python-proto/src/otdf_python_proto/policy/resourcemapping/resource_mapping_pb2.py diff --git a/otdf-python-proto/src/otdf_python_proto/policy/resourcemapping/resource_mapping_pb2.pyi b/packages/otdf-python-proto/src/otdf_python_proto/policy/resourcemapping/resource_mapping_pb2.pyi similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/resourcemapping/resource_mapping_pb2.pyi rename to packages/otdf-python-proto/src/otdf_python_proto/policy/resourcemapping/resource_mapping_pb2.pyi diff --git a/otdf-python-proto/src/otdf_python_proto/policy/selectors_pb2.py b/packages/otdf-python-proto/src/otdf_python_proto/policy/selectors_pb2.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/selectors_pb2.py rename to packages/otdf-python-proto/src/otdf_python_proto/policy/selectors_pb2.py diff --git a/otdf-python-proto/src/otdf_python_proto/policy/selectors_pb2.pyi b/packages/otdf-python-proto/src/otdf_python_proto/policy/selectors_pb2.pyi similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/selectors_pb2.pyi rename to packages/otdf-python-proto/src/otdf_python_proto/policy/selectors_pb2.pyi diff --git a/otdf-python-proto/src/otdf_python_proto/policy/subjectmapping/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/policy/subjectmapping/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/subjectmapping/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/policy/subjectmapping/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/policy/subjectmapping/subject_mapping_connect.py b/packages/otdf-python-proto/src/otdf_python_proto/policy/subjectmapping/subject_mapping_connect.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/subjectmapping/subject_mapping_connect.py rename to packages/otdf-python-proto/src/otdf_python_proto/policy/subjectmapping/subject_mapping_connect.py diff --git a/otdf-python-proto/src/otdf_python_proto/policy/subjectmapping/subject_mapping_pb2.py b/packages/otdf-python-proto/src/otdf_python_proto/policy/subjectmapping/subject_mapping_pb2.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/subjectmapping/subject_mapping_pb2.py rename to packages/otdf-python-proto/src/otdf_python_proto/policy/subjectmapping/subject_mapping_pb2.py diff --git a/otdf-python-proto/src/otdf_python_proto/policy/subjectmapping/subject_mapping_pb2.pyi b/packages/otdf-python-proto/src/otdf_python_proto/policy/subjectmapping/subject_mapping_pb2.pyi similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/subjectmapping/subject_mapping_pb2.pyi rename to packages/otdf-python-proto/src/otdf_python_proto/policy/subjectmapping/subject_mapping_pb2.pyi diff --git a/otdf-python-proto/src/otdf_python_proto/policy/unsafe/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/policy/unsafe/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/unsafe/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/policy/unsafe/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/policy/unsafe/unsafe_connect.py b/packages/otdf-python-proto/src/otdf_python_proto/policy/unsafe/unsafe_connect.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/unsafe/unsafe_connect.py rename to packages/otdf-python-proto/src/otdf_python_proto/policy/unsafe/unsafe_connect.py diff --git a/otdf-python-proto/src/otdf_python_proto/policy/unsafe/unsafe_pb2.py b/packages/otdf-python-proto/src/otdf_python_proto/policy/unsafe/unsafe_pb2.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/unsafe/unsafe_pb2.py rename to packages/otdf-python-proto/src/otdf_python_proto/policy/unsafe/unsafe_pb2.py diff --git a/otdf-python-proto/src/otdf_python_proto/policy/unsafe/unsafe_pb2.pyi b/packages/otdf-python-proto/src/otdf_python_proto/policy/unsafe/unsafe_pb2.pyi similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/policy/unsafe/unsafe_pb2.pyi rename to packages/otdf-python-proto/src/otdf_python_proto/policy/unsafe/unsafe_pb2.pyi diff --git a/otdf-python-proto/src/otdf_python_proto/wellknownconfiguration/__init__.py b/packages/otdf-python-proto/src/otdf_python_proto/wellknownconfiguration/__init__.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/wellknownconfiguration/__init__.py rename to packages/otdf-python-proto/src/otdf_python_proto/wellknownconfiguration/__init__.py diff --git a/otdf-python-proto/src/otdf_python_proto/wellknownconfiguration/wellknown_configuration_connect.py b/packages/otdf-python-proto/src/otdf_python_proto/wellknownconfiguration/wellknown_configuration_connect.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/wellknownconfiguration/wellknown_configuration_connect.py rename to packages/otdf-python-proto/src/otdf_python_proto/wellknownconfiguration/wellknown_configuration_connect.py diff --git a/otdf-python-proto/src/otdf_python_proto/wellknownconfiguration/wellknown_configuration_pb2.py b/packages/otdf-python-proto/src/otdf_python_proto/wellknownconfiguration/wellknown_configuration_pb2.py similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/wellknownconfiguration/wellknown_configuration_pb2.py rename to packages/otdf-python-proto/src/otdf_python_proto/wellknownconfiguration/wellknown_configuration_pb2.py diff --git a/otdf-python-proto/src/otdf_python_proto/wellknownconfiguration/wellknown_configuration_pb2.pyi b/packages/otdf-python-proto/src/otdf_python_proto/wellknownconfiguration/wellknown_configuration_pb2.pyi similarity index 100% rename from otdf-python-proto/src/otdf_python_proto/wellknownconfiguration/wellknown_configuration_pb2.pyi rename to packages/otdf-python-proto/src/otdf_python_proto/wellknownconfiguration/wellknown_configuration_pb2.pyi diff --git a/otdf-python-proto/tests/__init__.py b/packages/otdf-python-proto/tests/__init__.py similarity index 100% rename from otdf-python-proto/tests/__init__.py rename to packages/otdf-python-proto/tests/__init__.py diff --git a/otdf-python-proto/tests/test_generate_connect_proto.py b/packages/otdf-python-proto/tests/test_generate_connect_proto.py similarity index 100% rename from otdf-python-proto/tests/test_generate_connect_proto.py rename to packages/otdf-python-proto/tests/test_generate_connect_proto.py diff --git a/otdf-python-proto/tests/test_package_imports.py b/packages/otdf-python-proto/tests/test_package_imports.py similarity index 100% rename from otdf-python-proto/tests/test_package_imports.py rename to packages/otdf-python-proto/tests/test_package_imports.py diff --git a/packages/otdf-python/README.md b/packages/otdf-python/README.md new file mode 100644 index 00000000..719a2216 --- /dev/null +++ b/packages/otdf-python/README.md @@ -0,0 +1,134 @@ +# OpenTDF Python SDK + +Unofficial OpenTDF SDK for Python + + +## Features + +- **TDF Encryption/Decryption**: Create and decrypt TDF files with policy-based access control +- **Flexible Configuration**: Support for various authentication methods and platform endpoints +- **Comprehensive Testing**: Full test suite with unit and integration tests + +## Legacy Version + +A legacy version (0.2.x) of this project is available for users who need the previous implementation. For more information, see [LEGACY_VERSION.md](docs/LEGACY_VERSION.md) or visit the [legacy branch on GitHub](https://github.com/b-long/opentdf-python-sdk/tree/0.2.x). + + +## Installation + +Install from PyPI: +```bash +pip install otdf-python +``` + +## Quick Start + +### Basic Configuration + +```python +from otdf_python.sdk_builder import SDKBuilder + +# Create and configure SDK using builder pattern +builder = SDKBuilder() +builder.set_platform_endpoint("https://platform.example.com") +builder.client_secret("your-client-id", "your-client-secret") + +# Build the SDK instance +sdk = builder.build() +``` + +### Advanced Configuration + +```python +from otdf_python.sdk_builder import SDKBuilder + +# Create SDK with additional configuration options +builder = SDKBuilder() +builder.set_platform_endpoint("https://platform.example.com") +builder.set_issuer_endpoint("https://auth.example.com") +builder.client_secret("your-client-id", "your-client-secret") + +# Examples, for local development + +# Use HTTP instead of HTTPS +builder.use_insecure_plaintext_connection(True) + +# Or +# Skip TLS verification +builder.use_insecure_skip_verify(True) + +# Build the SDK instance +sdk = builder.build() +``` + +### Encrypt Data + +```python +from io import BytesIO + +# Create TDF configuration with attributes +config = sdk.new_tdf_config(attributes=["https://example.net/attr/attr1/value/value1"]) + +# Encrypt data to TDF format +input_data = b"Hello, World!" +output_stream = BytesIO() +manifest, size, _ = sdk.create_tdf(BytesIO(input_data), config, output_stream) +encrypted_data = output_stream.getvalue() + +# Save encrypted data to file +with open("encrypted.tdf", "wb") as f: + f.write(encrypted_data) +``` + +### Decrypt Data + +```python +# Read encrypted TDF file +with open("encrypted.tdf", "rb") as f: + encrypted_data = f.read() + +# Decrypt TDF +tdf_reader = sdk.load_tdf(encrypted_data) +decrypted_data = tdf_reader.payload + +# Save decrypted data +with open("decrypted.txt", "wb") as f: + f.write(decrypted_data) + +``` + +## Project Structure + +``` +src/otdf_python/ +├── sdk.py # Main SDK interface +├── config.py # Configuration management +├── tdf.py # TDF format handling +├── nanotdf.py # NanoTDF format handling +├── crypto_utils.py # Cryptographic utilities +├── kas_client.py # Key Access Service client +└── ... # Additional modules +tests/ +└── ... # Various tests +``` + +## Contributing + +1. Fork the repository +2. Create a feature branch: `git checkout -b feature-name` +3. Make your changes +4. Run tests: `uv run pytest tests/` +5. Commit your changes: `git commit -am 'feat: add feature'` +6. Push to the branch: `git push origin feature-name` +7. Submit a pull request + +### Release Process + +For maintainers and contributors working on releases: +- See [RELEASES.md](docs/RELEASES.md) for comprehensive release documentation +- Feature branch alpha releases available for testing changes before merge +- Automated releases via Release Please on the main branch + +## License + +This project is licensed under the MIT License - see the LICENSE file for details. diff --git a/packages/otdf-python/pyproject.toml b/packages/otdf-python/pyproject.toml new file mode 100644 index 00000000..f5fa7eb6 --- /dev/null +++ b/packages/otdf-python/pyproject.toml @@ -0,0 +1,64 @@ +[project] +name = "otdf-python" +version = "0.6.0" +description = "Unofficial OpenTDF SDK for Python" +readme = "README.md" +authors = [ + { name = "b-long", email = "b-long@users.noreply.github.com" } +] +requires-python = ">=3.10" +classifiers = [ + "Development Status :: 4 - Beta", + "Intended Audience :: Developers", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", + "Programming Language :: Python :: 3 :: Only", + "Topic :: Security :: Cryptography", + "Topic :: Software Development :: Libraries :: Python Modules", + "Typing :: Typed", +] + +dependencies = [ + "cryptography>=45.0.4", + "connect-python>=0.6.0,<0.7", + "protoc-gen-connect-python>=0.6.0,<0.7", + "httpx>=0.28.1", + "protobuf>=6.31.1", + "pyjwt>=2.10.1", + "typing-extensions>=4.14.1", + # Legacy gRPC support (may be removed in future versions) + "grpcio>=1.74.0", + "grpcio-tools>=1.74.0", + "grpcio-status>=1.74.0", + "protoc-gen-openapiv2>=0.0.1", +] + +[project.urls] +Homepage = "https://github.com/b-long/opentdf-python-sdk" +Repository = "https://github.com/b-long/opentdf-python-sdk" +Issues = "https://github.com/b-long/opentdf-python-sdk/issues" + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.build.targets.wheel] +packages = ["src/otdf_python"] + +[tool.hatch.build.targets.wheel.force-include] +"../otdf-python-proto/src/otdf_python_proto" = "otdf_python_proto" + +[dependency-groups] +dev = [ + "pydantic-settings>=2.10.1", + "pytest>=8.4.1", + "respx>=0.21.1", + "ruff>=0.12.10", + "tomli>=2.2.1 ; python_full_version < '3.11'", +] diff --git a/src/otdf_python/__init__.py b/packages/otdf-python/src/otdf_python/__init__.py similarity index 100% rename from src/otdf_python/__init__.py rename to packages/otdf-python/src/otdf_python/__init__.py diff --git a/src/otdf_python/__main__.py b/packages/otdf-python/src/otdf_python/__main__.py similarity index 100% rename from src/otdf_python/__main__.py rename to packages/otdf-python/src/otdf_python/__main__.py diff --git a/src/otdf_python/address_normalizer.py b/packages/otdf-python/src/otdf_python/address_normalizer.py similarity index 100% rename from src/otdf_python/address_normalizer.py rename to packages/otdf-python/src/otdf_python/address_normalizer.py diff --git a/src/otdf_python/aesgcm.py b/packages/otdf-python/src/otdf_python/aesgcm.py similarity index 100% rename from src/otdf_python/aesgcm.py rename to packages/otdf-python/src/otdf_python/aesgcm.py diff --git a/src/otdf_python/assertion_config.py b/packages/otdf-python/src/otdf_python/assertion_config.py similarity index 100% rename from src/otdf_python/assertion_config.py rename to packages/otdf-python/src/otdf_python/assertion_config.py diff --git a/src/otdf_python/asym_crypto.py b/packages/otdf-python/src/otdf_python/asym_crypto.py similarity index 100% rename from src/otdf_python/asym_crypto.py rename to packages/otdf-python/src/otdf_python/asym_crypto.py diff --git a/src/otdf_python/auth_headers.py b/packages/otdf-python/src/otdf_python/auth_headers.py similarity index 100% rename from src/otdf_python/auth_headers.py rename to packages/otdf-python/src/otdf_python/auth_headers.py diff --git a/src/otdf_python/autoconfigure_utils.py b/packages/otdf-python/src/otdf_python/autoconfigure_utils.py similarity index 100% rename from src/otdf_python/autoconfigure_utils.py rename to packages/otdf-python/src/otdf_python/autoconfigure_utils.py diff --git a/src/otdf_python/cli.py b/packages/otdf-python/src/otdf_python/cli.py similarity index 100% rename from src/otdf_python/cli.py rename to packages/otdf-python/src/otdf_python/cli.py diff --git a/src/otdf_python/collection_store.py b/packages/otdf-python/src/otdf_python/collection_store.py similarity index 100% rename from src/otdf_python/collection_store.py rename to packages/otdf-python/src/otdf_python/collection_store.py diff --git a/src/otdf_python/collection_store_impl.py b/packages/otdf-python/src/otdf_python/collection_store_impl.py similarity index 100% rename from src/otdf_python/collection_store_impl.py rename to packages/otdf-python/src/otdf_python/collection_store_impl.py diff --git a/src/otdf_python/config.py b/packages/otdf-python/src/otdf_python/config.py similarity index 100% rename from src/otdf_python/config.py rename to packages/otdf-python/src/otdf_python/config.py diff --git a/src/otdf_python/connect_client.py b/packages/otdf-python/src/otdf_python/connect_client.py similarity index 100% rename from src/otdf_python/connect_client.py rename to packages/otdf-python/src/otdf_python/connect_client.py diff --git a/src/otdf_python/constants.py b/packages/otdf-python/src/otdf_python/constants.py similarity index 100% rename from src/otdf_python/constants.py rename to packages/otdf-python/src/otdf_python/constants.py diff --git a/src/otdf_python/crypto_utils.py b/packages/otdf-python/src/otdf_python/crypto_utils.py similarity index 100% rename from src/otdf_python/crypto_utils.py rename to packages/otdf-python/src/otdf_python/crypto_utils.py diff --git a/src/otdf_python/dpop.py b/packages/otdf-python/src/otdf_python/dpop.py similarity index 100% rename from src/otdf_python/dpop.py rename to packages/otdf-python/src/otdf_python/dpop.py diff --git a/src/otdf_python/ecc_constants.py b/packages/otdf-python/src/otdf_python/ecc_constants.py similarity index 100% rename from src/otdf_python/ecc_constants.py rename to packages/otdf-python/src/otdf_python/ecc_constants.py diff --git a/src/otdf_python/ecc_mode.py b/packages/otdf-python/src/otdf_python/ecc_mode.py similarity index 100% rename from src/otdf_python/ecc_mode.py rename to packages/otdf-python/src/otdf_python/ecc_mode.py diff --git a/src/otdf_python/ecdh.py b/packages/otdf-python/src/otdf_python/ecdh.py similarity index 100% rename from src/otdf_python/ecdh.py rename to packages/otdf-python/src/otdf_python/ecdh.py diff --git a/src/otdf_python/eckeypair.py b/packages/otdf-python/src/otdf_python/eckeypair.py similarity index 100% rename from src/otdf_python/eckeypair.py rename to packages/otdf-python/src/otdf_python/eckeypair.py diff --git a/src/otdf_python/header.py b/packages/otdf-python/src/otdf_python/header.py similarity index 100% rename from src/otdf_python/header.py rename to packages/otdf-python/src/otdf_python/header.py diff --git a/src/otdf_python/invalid_zip_exception.py b/packages/otdf-python/src/otdf_python/invalid_zip_exception.py similarity index 100% rename from src/otdf_python/invalid_zip_exception.py rename to packages/otdf-python/src/otdf_python/invalid_zip_exception.py diff --git a/src/otdf_python/kas_allowlist.py b/packages/otdf-python/src/otdf_python/kas_allowlist.py similarity index 100% rename from src/otdf_python/kas_allowlist.py rename to packages/otdf-python/src/otdf_python/kas_allowlist.py diff --git a/src/otdf_python/kas_client.py b/packages/otdf-python/src/otdf_python/kas_client.py similarity index 100% rename from src/otdf_python/kas_client.py rename to packages/otdf-python/src/otdf_python/kas_client.py diff --git a/src/otdf_python/kas_connect_rpc_client.py b/packages/otdf-python/src/otdf_python/kas_connect_rpc_client.py similarity index 100% rename from src/otdf_python/kas_connect_rpc_client.py rename to packages/otdf-python/src/otdf_python/kas_connect_rpc_client.py diff --git a/src/otdf_python/kas_info.py b/packages/otdf-python/src/otdf_python/kas_info.py similarity index 100% rename from src/otdf_python/kas_info.py rename to packages/otdf-python/src/otdf_python/kas_info.py diff --git a/src/otdf_python/kas_key_cache.py b/packages/otdf-python/src/otdf_python/kas_key_cache.py similarity index 100% rename from src/otdf_python/kas_key_cache.py rename to packages/otdf-python/src/otdf_python/kas_key_cache.py diff --git a/src/otdf_python/key_type.py b/packages/otdf-python/src/otdf_python/key_type.py similarity index 100% rename from src/otdf_python/key_type.py rename to packages/otdf-python/src/otdf_python/key_type.py diff --git a/src/otdf_python/key_type_constants.py b/packages/otdf-python/src/otdf_python/key_type_constants.py similarity index 100% rename from src/otdf_python/key_type_constants.py rename to packages/otdf-python/src/otdf_python/key_type_constants.py diff --git a/src/otdf_python/manifest.py b/packages/otdf-python/src/otdf_python/manifest.py similarity index 100% rename from src/otdf_python/manifest.py rename to packages/otdf-python/src/otdf_python/manifest.py diff --git a/src/otdf_python/nanotdf.py b/packages/otdf-python/src/otdf_python/nanotdf.py similarity index 100% rename from src/otdf_python/nanotdf.py rename to packages/otdf-python/src/otdf_python/nanotdf.py diff --git a/src/otdf_python/nanotdf_ecdsa_struct.py b/packages/otdf-python/src/otdf_python/nanotdf_ecdsa_struct.py similarity index 100% rename from src/otdf_python/nanotdf_ecdsa_struct.py rename to packages/otdf-python/src/otdf_python/nanotdf_ecdsa_struct.py diff --git a/src/otdf_python/nanotdf_type.py b/packages/otdf-python/src/otdf_python/nanotdf_type.py similarity index 100% rename from src/otdf_python/nanotdf_type.py rename to packages/otdf-python/src/otdf_python/nanotdf_type.py diff --git a/src/otdf_python/policy_binding_serializer.py b/packages/otdf-python/src/otdf_python/policy_binding_serializer.py similarity index 100% rename from src/otdf_python/policy_binding_serializer.py rename to packages/otdf-python/src/otdf_python/policy_binding_serializer.py diff --git a/src/otdf_python/policy_info.py b/packages/otdf-python/src/otdf_python/policy_info.py similarity index 100% rename from src/otdf_python/policy_info.py rename to packages/otdf-python/src/otdf_python/policy_info.py diff --git a/src/otdf_python/policy_object.py b/packages/otdf-python/src/otdf_python/policy_object.py similarity index 100% rename from src/otdf_python/policy_object.py rename to packages/otdf-python/src/otdf_python/policy_object.py diff --git a/src/otdf_python/policy_stub.py b/packages/otdf-python/src/otdf_python/policy_stub.py similarity index 100% rename from src/otdf_python/policy_stub.py rename to packages/otdf-python/src/otdf_python/policy_stub.py diff --git a/src/otdf_python/resource_locator.py b/packages/otdf-python/src/otdf_python/resource_locator.py similarity index 100% rename from src/otdf_python/resource_locator.py rename to packages/otdf-python/src/otdf_python/resource_locator.py diff --git a/src/otdf_python/sdk.py b/packages/otdf-python/src/otdf_python/sdk.py similarity index 100% rename from src/otdf_python/sdk.py rename to packages/otdf-python/src/otdf_python/sdk.py diff --git a/src/otdf_python/sdk_builder.py b/packages/otdf-python/src/otdf_python/sdk_builder.py similarity index 100% rename from src/otdf_python/sdk_builder.py rename to packages/otdf-python/src/otdf_python/sdk_builder.py diff --git a/src/otdf_python/sdk_exceptions.py b/packages/otdf-python/src/otdf_python/sdk_exceptions.py similarity index 100% rename from src/otdf_python/sdk_exceptions.py rename to packages/otdf-python/src/otdf_python/sdk_exceptions.py diff --git a/src/otdf_python/symmetric_and_payload_config.py b/packages/otdf-python/src/otdf_python/symmetric_and_payload_config.py similarity index 100% rename from src/otdf_python/symmetric_and_payload_config.py rename to packages/otdf-python/src/otdf_python/symmetric_and_payload_config.py diff --git a/src/otdf_python/tdf.py b/packages/otdf-python/src/otdf_python/tdf.py similarity index 100% rename from src/otdf_python/tdf.py rename to packages/otdf-python/src/otdf_python/tdf.py diff --git a/src/otdf_python/tdf_reader.py b/packages/otdf-python/src/otdf_python/tdf_reader.py similarity index 100% rename from src/otdf_python/tdf_reader.py rename to packages/otdf-python/src/otdf_python/tdf_reader.py diff --git a/src/otdf_python/tdf_writer.py b/packages/otdf-python/src/otdf_python/tdf_writer.py similarity index 100% rename from src/otdf_python/tdf_writer.py rename to packages/otdf-python/src/otdf_python/tdf_writer.py diff --git a/src/otdf_python/token_source.py b/packages/otdf-python/src/otdf_python/token_source.py similarity index 100% rename from src/otdf_python/token_source.py rename to packages/otdf-python/src/otdf_python/token_source.py diff --git a/src/otdf_python/version.py b/packages/otdf-python/src/otdf_python/version.py similarity index 100% rename from src/otdf_python/version.py rename to packages/otdf-python/src/otdf_python/version.py diff --git a/src/otdf_python/zip_reader.py b/packages/otdf-python/src/otdf_python/zip_reader.py similarity index 100% rename from src/otdf_python/zip_reader.py rename to packages/otdf-python/src/otdf_python/zip_reader.py diff --git a/src/otdf_python/zip_writer.py b/packages/otdf-python/src/otdf_python/zip_writer.py similarity index 100% rename from src/otdf_python/zip_writer.py rename to packages/otdf-python/src/otdf_python/zip_writer.py diff --git a/pyproject.toml b/pyproject.toml index 7420fd64..f02b78b2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,75 +1,15 @@ -[project] -name = "otdf-python" -version = "0.6.0" -description = "Unofficial OpenTDF SDK for Python" -readme = "README.md" -authors = [ - { name = "b-long", email = "b-long@users.noreply.github.com" } -] -requires-python = ">=3.10" -classifiers = [ - "Development Status :: 4 - Beta", - "Intended Audience :: Developers", - "License :: OSI Approved :: MIT License", - "Operating System :: OS Independent", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - "Programming Language :: Python :: 3.14", - "Programming Language :: Python :: 3 :: Only", - "Topic :: Security :: Cryptography", - "Topic :: Software Development :: Libraries :: Python Modules", - "Typing :: Typed", -] - -dependencies = [ - "cryptography>=45.0.4", - "connect-python>=0.6.0,<0.7", - "protoc-gen-connect-python>=0.6.0,<0.7", - "httpx>=0.28.1", - "protobuf>=6.31.1", - "pyjwt>=2.10.1", - "typing-extensions>=4.14.1", - # Legacy gRPC support (may be removed in future versions) - "grpcio>=1.74.0", - "grpcio-tools>=1.74.0", - "grpcio-status>=1.74.0", - "protoc-gen-openapiv2>=0.0.1", -] - -[project.urls] -Homepage = "https://github.com/b-long/opentdf-python-sdk" -Repository = "https://github.com/b-long/opentdf-python-sdk" -Issues = "https://github.com/b-long/opentdf-python-sdk/issues" +[tool.uv] +package = false -[build-system] -requires = ["hatchling"] -build-backend = "hatchling.build" - -[tool.hatch.build.targets.wheel] -packages = [ - "src/otdf_python", - "otdf-python-proto/src/otdf_python_proto", -] - - -[dependency-groups] -dev = [ - "pydantic-settings>=2.10.1", - "pytest>=8.4.1", - "respx>=0.21.1", - "ruff>=0.12.10", - "tomli>=2.2.1 ; python_full_version < '3.11'", -] +[tool.uv.workspace] +members = ["packages/otdf-python", "packages/otdf-python-proto"] [tool.pytest.ini_options] markers = [ "integration: mark a test as an integration test." ] testpaths = ["tests"] -norecursedirs = ["otdf-python-proto"] +norecursedirs = ["packages/otdf-python-proto"] [tool.ruff] line-length = 88 @@ -102,14 +42,14 @@ lint.select = [ "W", # pycodestyle warnings ] # Ignore generated files -extend-exclude = ["otdf-python-proto/src/"] +extend-exclude = ["packages/otdf-python-proto/src/"] [tool.ruff.lint.per-file-ignores] "tests/**" = ["D100", "D101", "D102", "D103", "D107", "D400", "D401", "D415"] -"otdf-python-proto/**" = ["D"] # Ignore all D (docstring) rules for generated proto files +"packages/otdf-python-proto/**" = ["D"] # Ignore all D (docstring) rules for generated proto files # TODO: Remaining work - 4 buckets to fix (140 errors remaining): # Bucket #1: D102 (missing method docstrings) - 98 errors # Bucket #2: D105 (missing magic method docstrings) - 23 errors # Bucket #3: D205 (blank line formatting), D103, D417, D104 - 19 errors -"src/**" = ["D102", "D105", "D205"] +"packages/otdf-python/src/**" = ["D102", "D105", "D205"] diff --git a/tests/integration/otdfctl_to_python/test_tdf_reader_integration.py b/tests/integration/otdfctl_to_python/test_tdf_reader_integration.py index 7cd5f3ad..6dae32c3 100644 --- a/tests/integration/otdfctl_to_python/test_tdf_reader_integration.py +++ b/tests/integration/otdfctl_to_python/test_tdf_reader_integration.py @@ -6,10 +6,10 @@ from pathlib import Path import pytest - from otdf_python.tdf_reader import ( TDFReader, ) + from tests.config_pydantic import CONFIG_TDF from tests.support_common import handle_subprocess_error from tests.support_otdfctl_args import run_otdfctl_encrypt_command diff --git a/tests/integration/python_only/test_kas_client_integration.py b/tests/integration/python_only/test_kas_client_integration.py index e58fb029..2d72c293 100644 --- a/tests/integration/python_only/test_kas_client_integration.py +++ b/tests/integration/python_only/test_kas_client_integration.py @@ -1,10 +1,10 @@ """Integration tests for KASClient.""" import pytest - from otdf_python.kas_client import KASClient, KeyAccess from otdf_python.kas_key_cache import KASKeyCache from otdf_python.sdk_exceptions import SDKException + from tests.config_pydantic import CONFIG_TDF diff --git a/tests/integration/support_sdk.py b/tests/integration/support_sdk.py index 9fe11f99..766ea655 100644 --- a/tests/integration/support_sdk.py +++ b/tests/integration/support_sdk.py @@ -1,7 +1,7 @@ import httpx - from otdf_python.sdk import SDK from otdf_python.sdk_builder import SDKBuilder + from tests.config_pydantic import CONFIG_TDF diff --git a/tests/integration/test_cli_tdf_validation.py b/tests/integration/test_cli_tdf_validation.py index 91d65ec6..dd71ff3e 100644 --- a/tests/integration/test_cli_tdf_validation.py +++ b/tests/integration/test_cli_tdf_validation.py @@ -6,8 +6,8 @@ from pathlib import Path import pytest - from otdf_python.tdf_reader import TDF_MANIFEST_FILE_NAME, TDF_PAYLOAD_FILE_NAME + from tests.support_cli_args import ( run_cli_decrypt, run_cli_encrypt, diff --git a/tests/integration/test_pe_interaction.py b/tests/integration/test_pe_interaction.py index ecf839a4..7df13bfa 100644 --- a/tests/integration/test_pe_interaction.py +++ b/tests/integration/test_pe_interaction.py @@ -5,9 +5,9 @@ from pathlib import Path import pytest - from otdf_python.sdk import SDK from otdf_python.sdk_exceptions import SDKException + from tests.config_pydantic import CONFIG_TDF from tests.integration.support_sdk import get_sdk_for_pe diff --git a/tests/test_address_normalizer.py b/tests/test_address_normalizer.py index cfcdea3b..64cd4592 100644 --- a/tests/test_address_normalizer.py +++ b/tests/test_address_normalizer.py @@ -1,7 +1,6 @@ """Tests for address_normalizer module.""" import pytest - from otdf_python.address_normalizer import normalize_address from otdf_python.sdk_exceptions import SDKException diff --git a/tests/test_asym_encryption.py b/tests/test_asym_encryption.py index 3c804cab..1a5f3028 100644 --- a/tests/test_asym_encryption.py +++ b/tests/test_asym_encryption.py @@ -1,4 +1,5 @@ from otdf_python.asym_crypto import AsymDecryption, AsymEncryption + from tests.mock_crypto import generate_rsa_keypair diff --git a/tests/test_cli.py b/tests/test_cli.py index 5053ca83..d22414b0 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -34,7 +34,9 @@ def test_cli_version(project_root): assert result.returncode == 0 assert "OpenTDF Python SDK" in result.stdout - with (Path(__file__).parent.parent / "pyproject.toml").open("rb") as f: + with ( + Path(__file__).parent.parent / "packages" / "otdf-python" / "pyproject.toml" + ).open("rb") as f: # Use tomli for Python < 3.11, tomllib for 3.11+ if sys.version_info < (3, 11): import tomli diff --git a/tests/test_crypto_utils.py b/tests/test_crypto_utils.py index c4952088..47a8e0fc 100644 --- a/tests/test_crypto_utils.py +++ b/tests/test_crypto_utils.py @@ -1,7 +1,6 @@ import unittest from cryptography.hazmat.primitives.asymmetric import ec - from otdf_python.crypto_utils import CryptoUtils diff --git a/tests/test_ecdh.py b/tests/test_ecdh.py index 6dba667a..ebb978df 100644 --- a/tests/test_ecdh.py +++ b/tests/test_ecdh.py @@ -3,7 +3,6 @@ import pytest from cryptography.hazmat.primitives import serialization from cryptography.hazmat.primitives.asymmetric import ec - from otdf_python.ecc_constants import ECCConstants from otdf_python.ecdh import ( InvalidKeyError, diff --git a/tests/test_kas_allowlist.py b/tests/test_kas_allowlist.py index c2619ff5..e3b740ee 100644 --- a/tests/test_kas_allowlist.py +++ b/tests/test_kas_allowlist.py @@ -8,7 +8,6 @@ import logging import pytest - from otdf_python.kas_allowlist import KASAllowlist from otdf_python.kas_client import KASClient from otdf_python.sdk import SDK diff --git a/tests/test_kas_client.py b/tests/test_kas_client.py index b8df0284..24341059 100644 --- a/tests/test_kas_client.py +++ b/tests/test_kas_client.py @@ -4,7 +4,6 @@ from unittest.mock import MagicMock, patch import pytest - from otdf_python.kas_client import KASClient, KeyAccess from otdf_python.kas_key_cache import KASKeyCache from otdf_python.sdk_exceptions import SDKException diff --git a/tests/test_kas_key_management.py b/tests/test_kas_key_management.py index 110972b9..d4589ab1 100644 --- a/tests/test_kas_key_management.py +++ b/tests/test_kas_key_management.py @@ -6,7 +6,6 @@ from unittest.mock import Mock, patch import pytest - from otdf_python.kas_client import KASClient, KeyAccess from otdf_python.key_type_constants import EC_KEY_TYPE, RSA_KEY_TYPE diff --git a/tests/test_manifest_format.py b/tests/test_manifest_format.py index 9b614313..3eed648d 100644 --- a/tests/test_manifest_format.py +++ b/tests/test_manifest_format.py @@ -4,6 +4,7 @@ from otdf_python.config import KASInfo, TDFConfig from otdf_python.tdf import TDF + from tests.mock_crypto import generate_rsa_keypair diff --git a/tests/test_nanotdf.py b/tests/test_nanotdf.py index 23acbd70..0f7c77c5 100644 --- a/tests/test_nanotdf.py +++ b/tests/test_nanotdf.py @@ -3,7 +3,6 @@ import secrets import pytest - from otdf_python.config import NanoTDFConfig from otdf_python.nanotdf import InvalidNanoTDFConfig, NanoTDF, NanoTDFMaxSizeLimit @@ -45,6 +44,7 @@ def test_nanotdf_integration_encrypt_decrypt(): """Test NanoTDF integration with KAS.""" # Load environment variables for integration from otdf_python.config import KASInfo + from tests.config_pydantic import CONFIG_TDF # Create KAS info from configuration diff --git a/tests/test_nanotdf_ecdh.py b/tests/test_nanotdf_ecdh.py index d1fec60c..303e6292 100644 --- a/tests/test_nanotdf_ecdh.py +++ b/tests/test_nanotdf_ecdh.py @@ -4,7 +4,6 @@ import pytest from cryptography.hazmat.primitives import serialization - from otdf_python.config import KASInfo, NanoTDFConfig from otdf_python.ecdh import generate_ephemeral_keypair from otdf_python.nanotdf import NanoTDF diff --git a/tests/test_nanotdf_ecdsa_struct.py b/tests/test_nanotdf_ecdsa_struct.py index 994f9d76..f1d0b819 100644 --- a/tests/test_nanotdf_ecdsa_struct.py +++ b/tests/test_nanotdf_ecdsa_struct.py @@ -1,7 +1,6 @@ """Tests for NanoTDFECDSAStruct.""" import pytest - from otdf_python.nanotdf_ecdsa_struct import ( IncorrectNanoTDFECDSASignatureSize, NanoTDFECDSAStruct, diff --git a/tests/test_nanotdf_integration.py b/tests/test_nanotdf_integration.py index 945d0207..95a0e5ad 100644 --- a/tests/test_nanotdf_integration.py +++ b/tests/test_nanotdf_integration.py @@ -5,7 +5,6 @@ import pytest from cryptography.hazmat.primitives import serialization from cryptography.hazmat.primitives.asymmetric import ec - from otdf_python.config import KASInfo, NanoTDFConfig from otdf_python.nanotdf import NanoTDF diff --git a/tests/test_sdk_builder.py b/tests/test_sdk_builder.py index 2b499f68..705e2ef9 100644 --- a/tests/test_sdk_builder.py +++ b/tests/test_sdk_builder.py @@ -6,7 +6,6 @@ import pytest import respx - from otdf_python.sdk import SDK from otdf_python.sdk_builder import SDKBuilder from otdf_python.sdk_exceptions import AutoConfigureException diff --git a/tests/test_sdk_tdf_integration.py b/tests/test_sdk_tdf_integration.py index c8143e9e..c596f181 100644 --- a/tests/test_sdk_tdf_integration.py +++ b/tests/test_sdk_tdf_integration.py @@ -3,6 +3,7 @@ import io from otdf_python.sdk_builder import SDKBuilder + from tests.config_pydantic import CONFIG_TDF from tests.mock_crypto import generate_rsa_keypair diff --git a/tests/test_tdf.py b/tests/test_tdf.py index 650eb61c..a12c4784 100644 --- a/tests/test_tdf.py +++ b/tests/test_tdf.py @@ -5,10 +5,10 @@ import zipfile import pytest - from otdf_python.config import KASInfo, TDFConfig from otdf_python.manifest import Manifest from otdf_python.tdf import TDF, TDFReaderConfig + from tests.mock_crypto import generate_rsa_keypair diff --git a/tests/test_tdf_reader.py b/tests/test_tdf_reader.py index 1c605119..40a2d8ee 100644 --- a/tests/test_tdf_reader.py +++ b/tests/test_tdf_reader.py @@ -5,7 +5,6 @@ from unittest.mock import MagicMock, patch import pytest - from otdf_python.policy_object import PolicyObject from otdf_python.tdf_reader import ( TDF_MANIFEST_FILE_NAME, diff --git a/tests/test_url_normalization.py b/tests/test_url_normalization.py index 23504d66..a3460a4c 100644 --- a/tests/test_url_normalization.py +++ b/tests/test_url_normalization.py @@ -5,7 +5,7 @@ the use_plaintext setting when converting URLs. """ -from src.otdf_python.kas_client import KASClient +from otdf_python.kas_client import KASClient def test_url_normalization(): diff --git a/uv.lock b/uv.lock index f03484f3..c3ebd0c0 100644 --- a/uv.lock +++ b/uv.lock @@ -2,6 +2,12 @@ version = 1 revision = 3 requires-python = ">=3.10" +[manifest] +members = [ + "otdf-python", + "otdf-python-proto", +] + [[package]] name = "annotated-types" version = "0.7.0" @@ -27,11 +33,11 @@ wheels = [ [[package]] name = "certifi" -version = "2026.4.22" +version = "2026.5.20" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/25/ee/6caf7a40c36a1220410afe15a1cc64993a1f864871f698c0f93acb72842a/certifi-2026.4.22.tar.gz", hash = "sha256:8d455352a37b71bf76a79caa83a3d6c25afee4a385d632127b6afb3963f1c580", size = 137077, upload-time = "2026-04-22T11:26:11.191Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/ce/ee2ecad540810a79593028e88299baeae54d346cc7a0d94b6199988b89b1/certifi-2026.5.20.tar.gz", hash = "sha256:69dea482ab64caa7b9f6aba1c6bf48bb6a5448d1c0f1b17ab42ad8c763a5344d", size = 135422, upload-time = "2026-05-20T11:46:50.073Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl", hash = "sha256:3cb2210c8f88ba2318d29b0388d1023c8492ff72ecdde4ebdaddbb13a31b1c4a", size = 135707, upload-time = "2026-04-22T11:26:09.372Z" }, + { url = "https://files.pythonhosted.org/packages/59/8c/57e832b7af6d7c5abe66eb3fbe3a3a32f4d11ea23a1aa7131371035be991/certifi-2026.5.20-py3-none-any.whl", hash = "sha256:3c52e209ba0a4ad7aebe60436a4ab349c39e1e602e8c134221e546902ad25897", size = 134134, upload-time = "2026-05-20T11:46:48.578Z" }, ] [[package]] @@ -140,62 +146,62 @@ wheels = [ [[package]] name = "cryptography" -version = "47.0.0" +version = "48.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ef/b2/7ffa7fe8207a8c42147ffe70c3e360b228160c1d85dc3faff16aaa3244c0/cryptography-47.0.0.tar.gz", hash = "sha256:9f8e55fe4e63613a5e1cc5819030f27b97742d720203a087802ce4ce9ceb52bb", size = 830863, upload-time = "2026-04-24T19:54:57.056Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a4/98/40dfe932134bdcae4f6ab5927c87488754bf9eb79297d7e0070b78dd58e9/cryptography-47.0.0-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:160ad728f128972d362e714054f6ba0067cab7fb350c5202a9ae8ae4ce3ef1a0", size = 7912214, upload-time = "2026-04-24T19:53:03.864Z" }, - { url = "https://files.pythonhosted.org/packages/34/c6/2733531243fba725f58611b918056b277692f1033373dcc8bd01af1c05d4/cryptography-47.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b9a8943e359b7615db1a3ba587994618e094ff3d6fa5a390c73d079ce18b3973", size = 4644617, upload-time = "2026-04-24T19:53:06.909Z" }, - { url = "https://files.pythonhosted.org/packages/00/e3/b27be1a670a9b87f855d211cf0e1174a5d721216b7616bd52d8581d912ed/cryptography-47.0.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f5c15764f261394b22aef6b00252f5195f46f2ca300bec57149474e2538b31f8", size = 4668186, upload-time = "2026-04-24T19:53:09.053Z" }, - { url = "https://files.pythonhosted.org/packages/81/b9/8443cfe5d17d482d348cee7048acf502bb89a51b6382f06240fd290d4ca3/cryptography-47.0.0-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:9c59ab0e0fa3a180a5a9c59f3a5abe3ef90d474bc56d7fadfbe80359491b615b", size = 4651244, upload-time = "2026-04-24T19:53:11.217Z" }, - { url = "https://files.pythonhosted.org/packages/5d/5e/13ed0cdd0eb88ba159d6dd5ebfece8cb901dbcf1ae5ac4072e28b55d3153/cryptography-47.0.0-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:34b4358b925a5ea3e14384ca781a2c0ef7ac219b57bb9eacc4457078e2b19f92", size = 5252906, upload-time = "2026-04-24T19:53:13.532Z" }, - { url = "https://files.pythonhosted.org/packages/64/16/ed058e1df0f33d440217cd120d41d5dda9dd215a80b8187f68483185af82/cryptography-47.0.0-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:0024b87d47ae2399165a6bfb20d24888881eeab83ae2566d62467c5ff0030ce7", size = 4701842, upload-time = "2026-04-24T19:53:15.618Z" }, - { url = "https://files.pythonhosted.org/packages/02/e0/3d30986b30fdbd9e969abbdf8ba00ed0618615144341faeb57f395a084fe/cryptography-47.0.0-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:1e47422b5557bb82d3fff997e8d92cff4e28b9789576984f08c248d2b3535d93", size = 4289313, upload-time = "2026-04-24T19:53:17.755Z" }, - { url = "https://files.pythonhosted.org/packages/df/fd/32db38e3ad0cb331f0691cb4c7a8a6f176f679124dee746b3af6633db4d9/cryptography-47.0.0-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:6f29f36582e6151d9686235e586dd35bb67491f024767d10b842e520dc6a07ac", size = 4650964, upload-time = "2026-04-24T19:53:20.062Z" }, - { url = "https://files.pythonhosted.org/packages/86/53/5395d944dfd48cb1f67917f533c609c34347185ef15eb4308024c876f274/cryptography-47.0.0-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:a9b761f012a943b7de0e828843c5688d0de94a0578d44d6c85a1bae32f87791f", size = 5207817, upload-time = "2026-04-24T19:53:22.498Z" }, - { url = "https://files.pythonhosted.org/packages/34/4f/e5711b28e1901f7d480a2b1b688b645aa4c77c73f10731ed17e7f7db3f0d/cryptography-47.0.0-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:4e1de79e047e25d6e9f8cea71c86b4a53aced64134f0f003bbcbf3655fd172c8", size = 4701544, upload-time = "2026-04-24T19:53:24.356Z" }, - { url = "https://files.pythonhosted.org/packages/22/22/c8ddc25de3010fc8da447648f5a092c40e7a8fadf01dd6d255d9c0b9373d/cryptography-47.0.0-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ef6b3634087f18d2155b1e8ce264e5345a753da2c5fa9815e7d41315c90f8318", size = 4783536, upload-time = "2026-04-24T19:53:26.665Z" }, - { url = "https://files.pythonhosted.org/packages/66/b6/d4a68f4ea999c6d89e8498579cba1c5fcba4276284de7773b17e4fa69293/cryptography-47.0.0-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:11dbb9f50a0f1bb9757b3d8c27c1101780efb8f0bdecfb12439c22a74d64c001", size = 4926106, upload-time = "2026-04-24T19:53:28.686Z" }, - { url = "https://files.pythonhosted.org/packages/54/ed/5f524db1fade9c013aa618e1c99c6ed05e8ffc9ceee6cda22fed22dda3f4/cryptography-47.0.0-cp311-abi3-win32.whl", hash = "sha256:7fda2f02c9015db3f42bb8a22324a454516ed10a8c29ca6ece6cdbb5efe2a203", size = 3258581, upload-time = "2026-04-24T19:53:31.058Z" }, - { url = "https://files.pythonhosted.org/packages/b2/dc/1b901990b174786569029f67542b3edf72ac068b6c3c8683c17e6a2f5363/cryptography-47.0.0-cp311-abi3-win_amd64.whl", hash = "sha256:f5c3296dab66202f1b18a91fa266be93d6aa0c2806ea3d67762c69f60adc71aa", size = 3775309, upload-time = "2026-04-24T19:53:33.054Z" }, - { url = "https://files.pythonhosted.org/packages/14/88/7aa18ad9c11bc87689affa5ce4368d884b517502d75739d475fc6f4a03c7/cryptography-47.0.0-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:be12cb6a204f77ed968bcefe68086eb061695b540a3dd05edac507a3111b25f0", size = 7904299, upload-time = "2026-04-24T19:53:35.003Z" }, - { url = "https://files.pythonhosted.org/packages/07/55/c18f75724544872f234678fdedc871391722cb34a2aee19faa9f63100bb2/cryptography-47.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2ebd84adf0728c039a3be2700289378e1c164afc6748df1a5ed456767bef9ba7", size = 4631180, upload-time = "2026-04-24T19:53:37.517Z" }, - { url = "https://files.pythonhosted.org/packages/ee/65/31a5cc0eaca99cec5bafffe155d407115d96136bb161e8b49e0ef73f09a7/cryptography-47.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7f68d6fbc7fbbcfb0939fea72c3b96a9f9a6edfc0e1b1d29778a2066030418b1", size = 4653529, upload-time = "2026-04-24T19:53:39.775Z" }, - { url = "https://files.pythonhosted.org/packages/e5/bc/641c0519a495f3bfd0421b48d7cd325c4336578523ccd76ea322b6c29c7a/cryptography-47.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:6651d32eff255423503aa276739da98c30f26c40cbeffcc6048e0d54ef704c0c", size = 4638570, upload-time = "2026-04-24T19:53:42.129Z" }, - { url = "https://files.pythonhosted.org/packages/2b/f2/300327b0a47f6dc94dd8b71b57052aefe178bb51745073d73d80604f11ab/cryptography-47.0.0-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:3fb8fa48075fad7193f2e5496135c6a76ac4b2aa5a38433df0a539296b377829", size = 5238019, upload-time = "2026-04-24T19:53:44.577Z" }, - { url = "https://files.pythonhosted.org/packages/e9/5a/5b5cf994391d4bf9d9c7efd4c66aabe4d95227256627f8fea6cff7dfadbd/cryptography-47.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:11438c7518132d95f354fa01a4aa2f806d172a061a7bed18cf18cbdacdb204d7", size = 4686832, upload-time = "2026-04-24T19:53:47.015Z" }, - { url = "https://files.pythonhosted.org/packages/dc/2c/ae950e28fd6475c852fc21a44db3e6b5bcc1261d1e370f2b6e42fa800fef/cryptography-47.0.0-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:8c1a736bbb3288005796c3f7ccb9453360d7fed483b13b9f468aea5171432923", size = 4269301, upload-time = "2026-04-24T19:53:48.97Z" }, - { url = "https://files.pythonhosted.org/packages/67/fb/6a39782e150ffe5cc1b0018cb6ddc48bf7ca62b498d7539ffc8a758e977d/cryptography-47.0.0-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:f1557695e5c2b86e204f6ce9470497848634100787935ab7adc5397c54abd7ab", size = 4638110, upload-time = "2026-04-24T19:53:51.011Z" }, - { url = "https://files.pythonhosted.org/packages/8e/d7/0b3c71090a76e5c203164a47688b697635ece006dcd2499ab3a4dbd3f0bd/cryptography-47.0.0-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:f9a034b642b960767fb343766ae5ba6ad653f2e890ddd82955aef288ffea8736", size = 5194988, upload-time = "2026-04-24T19:53:52.962Z" }, - { url = "https://files.pythonhosted.org/packages/63/33/63a961498a9df51721ab578c5a2622661411fc520e00bd83b0cc64eb20c4/cryptography-47.0.0-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:b1c76fca783aa7698eb21eb14f9c4aa09452248ee54a627d125025a43f83e7a7", size = 4686563, upload-time = "2026-04-24T19:53:55.274Z" }, - { url = "https://files.pythonhosted.org/packages/b7/bf/5ee5b145248f92250de86145d1c1d6edebbd57a7fe7caa4dedb5d4cf06a1/cryptography-47.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:4f7722c97826770bab8ae92959a2e7b20a5e9e9bf4deae68fd86c3ca457bab52", size = 4770094, upload-time = "2026-04-24T19:53:57.753Z" }, - { url = "https://files.pythonhosted.org/packages/92/43/21d220b2da5d517773894dacdcdb5c682c28d3fffce65548cb06e87d5501/cryptography-47.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:09f6d7bf6724f8db8b32f11eccf23efc8e759924bc5603800335cf8859a3ddbd", size = 4913811, upload-time = "2026-04-24T19:54:00.236Z" }, - { url = "https://files.pythonhosted.org/packages/31/98/dc4ad376ac5f1a1a7d4a83f7b0c6f2bcad36b5d2d8f30aeb482d3a7d9582/cryptography-47.0.0-cp314-cp314t-win32.whl", hash = "sha256:6eebcaf0df1d21ce1f90605c9b432dd2c4f4ab665ac29a40d5e3fc68f51b5e63", size = 3237158, upload-time = "2026-04-24T19:54:02.606Z" }, - { url = "https://files.pythonhosted.org/packages/bc/da/97f62d18306b5133468bc3f8cc73a3111e8cdc8cf8d3e69474d6e5fd2d1b/cryptography-47.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:51c9313e90bd1690ec5a75ed047c27c0b8e6c570029712943d6116ef9a90620b", size = 3758706, upload-time = "2026-04-24T19:54:04.433Z" }, - { url = "https://files.pythonhosted.org/packages/e0/34/a4fae8ae7c3bc227460c9ae43f56abf1b911da0ec29e0ebac53bb0a4b6b7/cryptography-47.0.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:14432c8a9bcb37009784f9594a62fae211a2ae9543e96c92b2a8e4c3cd5cd0c4", size = 7904072, upload-time = "2026-04-24T19:54:06.411Z" }, - { url = "https://files.pythonhosted.org/packages/01/64/d7b1e54fdb69f22d24a64bb3e88dc718b31c7fb10ef0b9691a3cf7eeea6e/cryptography-47.0.0-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:07efe86201817e7d3c18781ca9770bc0db04e1e48c994be384e4602bc38f8f27", size = 4635767, upload-time = "2026-04-24T19:54:08.519Z" }, - { url = "https://files.pythonhosted.org/packages/8b/7b/cca826391fb2a94efdcdfe4631eb69306ee1cff0b22f664a412c90713877/cryptography-47.0.0-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2b45761c6ec22b7c726d6a829558777e32d0f1c8be7c3f3480f9c912d5ee8a10", size = 4654350, upload-time = "2026-04-24T19:54:10.795Z" }, - { url = "https://files.pythonhosted.org/packages/4c/65/4b57bcc823f42a991627c51c2f68c9fd6eb1393c1756aac876cba2accae2/cryptography-47.0.0-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:edd4da498015da5b9f26d38d3bfc2e90257bfa9cbed1f6767c282a0025ae649b", size = 4643394, upload-time = "2026-04-24T19:54:13.275Z" }, - { url = "https://files.pythonhosted.org/packages/f4/c4/2c5fbeea70adbbca2bbae865e1d605d6a4a7f8dbd9d33eaf69645087f06c/cryptography-47.0.0-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:9af828c0d5a65c70ec729cd7495a4bf1a67ecb66417b8f02ff125ab8a6326a74", size = 5225777, upload-time = "2026-04-24T19:54:15.18Z" }, - { url = "https://files.pythonhosted.org/packages/7e/b8/ac57107ef32749d2b244e36069bb688792a363aaaa3acc9e3cf84c130315/cryptography-47.0.0-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:256d07c78a04d6b276f5df935a9923275f53bd1522f214447fdf365494e2d515", size = 4688771, upload-time = "2026-04-24T19:54:17.835Z" }, - { url = "https://files.pythonhosted.org/packages/56/fc/9f1de22ff8be99d991f240a46863c52d475404c408886c5a38d2b5c3bb26/cryptography-47.0.0-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:5d0e362ff51041b0c0d219cc7d6924d7b8996f57ce5712bdcef71eb3c65a59cc", size = 4270753, upload-time = "2026-04-24T19:54:19.963Z" }, - { url = "https://files.pythonhosted.org/packages/00/68/d70c852797aa68e8e48d12e5a87170c43f67bb4a59403627259dd57d15de/cryptography-47.0.0-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:1581aef4219f7ca2849d0250edaa3866212fb74bf5667284f46aa92f9e65c1ca", size = 4642911, upload-time = "2026-04-24T19:54:21.818Z" }, - { url = "https://files.pythonhosted.org/packages/a5/51/661cbee74f594c5d97ff82d34f10d5551c085ca4668645f4606ebd22bd5d/cryptography-47.0.0-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:a49a3eb5341b9503fa3000a9a0db033161db90d47285291f53c2a9d2cd1b7f76", size = 5181411, upload-time = "2026-04-24T19:54:24.376Z" }, - { url = "https://files.pythonhosted.org/packages/94/87/f2b6c374a82cf076cfa1416992ac8e8ec94d79facc37aec87c1a5cb72352/cryptography-47.0.0-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:2207a498b03275d0051589e326b79d4cf59985c99031b05bb292ac52631c37fe", size = 4688262, upload-time = "2026-04-24T19:54:26.946Z" }, - { url = "https://files.pythonhosted.org/packages/14/e2/8b7462f4acf21ec509616f0245018bb197194ab0b65c2ea21a0bdd53c0eb/cryptography-47.0.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:7a02675e2fabd0c0fc04c868b8781863cbf1967691543c22f5470500ff840b31", size = 4775506, upload-time = "2026-04-24T19:54:28.926Z" }, - { url = "https://files.pythonhosted.org/packages/70/75/158e494e4c08dc05e039da5bb48553826bd26c23930cf8d3cd5f21fa8921/cryptography-47.0.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:80887c5cbd1774683cb126f0ab4184567f080071d5acf62205acb354b4b753b7", size = 4912060, upload-time = "2026-04-24T19:54:30.869Z" }, - { url = "https://files.pythonhosted.org/packages/06/bd/0a9d3edbf5eadbac926d7b9b3cd0c4be584eeeae4a003d24d9eda4affbbd/cryptography-47.0.0-cp38-abi3-win32.whl", hash = "sha256:ed67ea4e0cfb5faa5bc7ecb6e2b8838f3807a03758eec239d6c21c8769355310", size = 3248487, upload-time = "2026-04-24T19:54:33.494Z" }, - { url = "https://files.pythonhosted.org/packages/60/80/5681af756d0da3a599b7bdb586fac5a1540f1bcefd2717a20e611ddade45/cryptography-47.0.0-cp38-abi3-win_amd64.whl", hash = "sha256:835d2d7f47cdc53b3224e90810fb1d36ca94ea29cc1801fb4c1bc43876735769", size = 3755737, upload-time = "2026-04-24T19:54:35.408Z" }, - { url = "https://files.pythonhosted.org/packages/1b/a0/928c9ce0d120a40a81aa99e3ba383e87337b9ac9ef9f6db02e4d7822424d/cryptography-47.0.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:7f1207974a904e005f762869996cf620e9bf79ecb4622f148550bb48e0eb35a7", size = 3909893, upload-time = "2026-04-24T19:54:38.334Z" }, - { url = "https://files.pythonhosted.org/packages/81/75/d691e284750df5d9569f2b1ce4a00a71e1d79566da83b2b3e5549c84917f/cryptography-47.0.0-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:1a405c08857258c11016777e11c02bacbe7ef596faf259305d282272a3a05cbe", size = 4587867, upload-time = "2026-04-24T19:54:40.619Z" }, - { url = "https://files.pythonhosted.org/packages/07/d6/1b90f1a4e453009730b4545286f0b39bb348d805c11181fc31544e4f9a65/cryptography-47.0.0-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:20fdbe3e38fb67c385d233c89371fa27f9909f6ebca1cecc20c13518dae65475", size = 4627192, upload-time = "2026-04-24T19:54:42.849Z" }, - { url = "https://files.pythonhosted.org/packages/dc/53/cb358a80e9e359529f496870dd08c102aa8a4b5b9f9064f00f0d6ed5b527/cryptography-47.0.0-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:f7db373287273d8af1414cf95dc4118b13ffdc62be521997b0f2b270771fef50", size = 4587486, upload-time = "2026-04-24T19:54:44.908Z" }, - { url = "https://files.pythonhosted.org/packages/8b/57/aaa3d53876467a226f9a7a82fd14dd48058ad2de1948493442dfa16e2ffd/cryptography-47.0.0-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:9fe6b7c64926c765f9dff301f9c1b867febcda5768868ca084e18589113732ab", size = 4626327, upload-time = "2026-04-24T19:54:47.813Z" }, - { url = "https://files.pythonhosted.org/packages/ab/9c/51f28c3550276bcf35660703ba0ab829a90b88be8cd98a71ef23c2413913/cryptography-47.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:cffbba3392df0fa8629bb7f43454ee2925059ee158e23c54620b9063912b86c8", size = 3698916, upload-time = "2026-04-24T19:54:49.782Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/9f/a9/db8f313fdcd85d767d4973515e1db101f9c71f95fced83233de224673757/cryptography-48.0.0.tar.gz", hash = "sha256:5c3932f4436d1cccb036cb0eaef46e6e2db91035166f1ad6505c3c9d5a635920", size = 832984, upload-time = "2026-05-04T22:59:38.133Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/3d/01f6dd9190170a5a241e0e98c2d04be3664a9e6f5b9b872cde63aff1c3dd/cryptography-48.0.0-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:0c558d2cdffd8f4bbb30fc7134c74d2ca9a476f830bb053074498fbc86f41ed6", size = 8001587, upload-time = "2026-05-04T22:57:36.803Z" }, + { url = "https://files.pythonhosted.org/packages/b2/6e/e90527eef33f309beb811cf7c982c3aeffcce8e3edb178baa4ca3ae4a6fa/cryptography-48.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f5333311663ea94f75dd408665686aaf426563556bb5283554a3539177e03b8c", size = 4690433, upload-time = "2026-05-04T22:57:40.373Z" }, + { url = "https://files.pythonhosted.org/packages/90/04/673510ed51ddff56575f306cf1617d80411ee76831ccd3097599140efdfe/cryptography-48.0.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7995ef305d7165c3f11ae07f2517e5a4f1d5c18da1376a0a9ed496336b69e5f3", size = 4710620, upload-time = "2026-05-04T22:57:42.935Z" }, + { url = "https://files.pythonhosted.org/packages/14/d5/e9c4ef932c8d800490c34d8bd589d64a31d5890e27ec9e9ad532be893294/cryptography-48.0.0-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:40ba1f85eaa6959837b1d51c9767e230e14612eea4ef110ee8854ada22da1bf5", size = 4696283, upload-time = "2026-05-04T22:57:45.294Z" }, + { url = "https://files.pythonhosted.org/packages/0c/29/174b9dfb60b12d59ecfc6cfa04bc88c21b42a54f01b8aae09bb6e51e4c7f/cryptography-48.0.0-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:369a6348999f94bbd53435c894377b20ab95f25a9065c283570e70150d8abc3c", size = 5296573, upload-time = "2026-05-04T22:57:47.933Z" }, + { url = "https://files.pythonhosted.org/packages/95/38/0d29a6fd7d0d1373f0c0c88a04ba20e359b257753ac497564cd660fc1d55/cryptography-48.0.0-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a0e692c683f4df67815a2d258b324e66f4738bd7a96a218c826dce4f4bd05d8f", size = 4743677, upload-time = "2026-05-04T22:57:50.067Z" }, + { url = "https://files.pythonhosted.org/packages/30/be/eef653013d5c63b6a490529e0316f9ac14a37602965d4903efed1399f32b/cryptography-48.0.0-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:18349bbc56f4743c8b12dc32e2bccb2cf83ee8b69a3bba74ef8ae857e26b3d25", size = 4330808, upload-time = "2026-05-04T22:57:52.301Z" }, + { url = "https://files.pythonhosted.org/packages/84/9e/500463e87abb7a0a0f9f256ec21123ecde0a7b5541a15e840ea54551fd81/cryptography-48.0.0-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:7e8eac43dfca5c4cccc6dad9a80504436fca53bb9bc3100a2386d730fbe6b602", size = 4695941, upload-time = "2026-05-04T22:57:54.603Z" }, + { url = "https://files.pythonhosted.org/packages/e3/dc/7303087450c2ec9e7fbb750e17c2abfbc658f23cbd0e54009509b7cc4091/cryptography-48.0.0-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:9ccdac7d40688ecb5a3b4a604b8a88c8002e3442d6c60aead1db2a89a041560c", size = 5252579, upload-time = "2026-05-04T22:57:57.207Z" }, + { url = "https://files.pythonhosted.org/packages/d0/c0/7101d3b7215edcdc90c45da544961fd8ed2d6448f77577460fa75a8443f7/cryptography-48.0.0-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:bd72e68b06bb1e96913f97dd4901119bc17f39d4586a5adf2d3e47bc2b9d58b5", size = 4743326, upload-time = "2026-05-04T22:57:59.535Z" }, + { url = "https://files.pythonhosted.org/packages/ac/d8/5b833bad13016f562ab9d063d68199a4bd121d18458e439515601d3357ec/cryptography-48.0.0-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:59baa2cb386c4f0b9905bd6eb4c2a79a69a128408fd31d32ca4d7102d4156321", size = 4826672, upload-time = "2026-05-04T22:58:01.996Z" }, + { url = "https://files.pythonhosted.org/packages/98/e1/7074eb8bf3c135558c73fc2bcf0f5633f912e6fb87e868a55c454080ef09/cryptography-48.0.0-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9249e3cd978541d665967ac2cb2787fd6a62bddf1e75b3e347a594d7dacf4f74", size = 4972574, upload-time = "2026-05-04T22:58:03.968Z" }, + { url = "https://files.pythonhosted.org/packages/04/70/e5a1b41d325f797f39427aa44ef8baf0be500065ab6d8e10369d850d4a4f/cryptography-48.0.0-cp311-abi3-win32.whl", hash = "sha256:9c459db21422be75e2809370b829a87eb37f74cd785fc4aa9ea1e5f43b47cda4", size = 3294868, upload-time = "2026-05-04T22:58:06.467Z" }, + { url = "https://files.pythonhosted.org/packages/f4/ac/8ac51b4a5fc5932eb7ee5c517ba7dc8cd834f0048962b6b352f00f41ebf9/cryptography-48.0.0-cp311-abi3-win_amd64.whl", hash = "sha256:5b012212e08b8dd5edc78ef54da83dd9892fd9105323b3993eff6bea65dc21d7", size = 3817107, upload-time = "2026-05-04T22:58:08.845Z" }, + { url = "https://files.pythonhosted.org/packages/6b/84/70e3feea9feea87fd7cbe77efb2712ae1e3e6edf10749dc6e95f4e60e455/cryptography-48.0.0-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:3cb07a3ed6431663cd321ea8a000a1314c74211f823e4177fefa2255e057d1ec", size = 7986556, upload-time = "2026-05-04T22:58:11.172Z" }, + { url = "https://files.pythonhosted.org/packages/89/6e/18e07a618bb5442ba10cf4df16e99c071365528aa570dfcb8c02e25a303b/cryptography-48.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8c7378637d7d88016fa6791c159f698b3d3eed28ebf844ac36b9dc04a14dae18", size = 4684776, upload-time = "2026-05-04T22:58:13.712Z" }, + { url = "https://files.pythonhosted.org/packages/be/6a/4ea3b4c6c6759794d5ee2103c304a5076dc4b19ae1f9fe47dba439e159e9/cryptography-48.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc90c0b39b2e3c65ef52c804b72e3c58f8a04ab2a1871272798e5f9572c17d20", size = 4698121, upload-time = "2026-05-04T22:58:16.448Z" }, + { url = "https://files.pythonhosted.org/packages/2f/59/6ff6ad6cae03bb887da2a5860b2c9805f8dac969ef01ce563336c49bd1d1/cryptography-48.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:76341972e1eff8b4bea859f09c0d3e64b96ce931b084f9b9b7db8ef364c30eff", size = 4690042, upload-time = "2026-05-04T22:58:18.544Z" }, + { url = "https://files.pythonhosted.org/packages/ca/b4/fc334ed8cfd705aca282fe4d8f5ae64a8e0f74932e9feecb344610cf6e4d/cryptography-48.0.0-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:55b7718303bf06a5753dcdccf2f3945cf18ad7bffde41b61226e4db31ab89a9c", size = 5282526, upload-time = "2026-05-04T22:58:20.75Z" }, + { url = "https://files.pythonhosted.org/packages/11/08/9f8c5386cc4cd90d8255c7cdd0f5baf459a08502a09de30dc51f553d38dc/cryptography-48.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:a64697c641c7b1b2178e573cbc31c7c6684cd56883a478d75143dbb7118036db", size = 4733116, upload-time = "2026-05-04T22:58:23.627Z" }, + { url = "https://files.pythonhosted.org/packages/b8/77/99307d7574045699f8805aa500fa0fb83422d115b5400a064ddd306d7750/cryptography-48.0.0-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:561215ea3879cb1cbbf272867e2efda62476f240fb58c64de6b393ae19246741", size = 4316030, upload-time = "2026-05-04T22:58:25.581Z" }, + { url = "https://files.pythonhosted.org/packages/fd/36/a608b98337af3cb2aff4818e406649d30572b7031918b04c87d979495348/cryptography-48.0.0-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:ad64688338ed4bc1a6618076ba75fd7194a5f1797ac60b47afe926285adb3166", size = 4689640, upload-time = "2026-05-04T22:58:27.747Z" }, + { url = "https://files.pythonhosted.org/packages/dd/a6/825010a291b4438aecc1f568bc428189fc1175515223632477c07dc0a6df/cryptography-48.0.0-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:906cbf0670286c6e0044156bc7d4af9cbb0ef6db9f73e52c3ec56ba6bdde5336", size = 5237657, upload-time = "2026-05-04T22:58:29.848Z" }, + { url = "https://files.pythonhosted.org/packages/b9/09/4e76a09b4caa29aad535ddc806f5d4c5d01885bd978bd984fbc6ca032cae/cryptography-48.0.0-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:ea8990436d914540a40ab24b6a77c0969695ed52f4a4874c5137ccf7045a7057", size = 4732362, upload-time = "2026-05-04T22:58:32.009Z" }, + { url = "https://files.pythonhosted.org/packages/18/78/444fa04a77d0cb95f417dda20d450e13c56ba8e5220fc892a1658f44f882/cryptography-48.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c18684a7f0cc9a3cb60328f496b8e3372def7c5d2df39ac267878b05565aaaae", size = 4819580, upload-time = "2026-05-04T22:58:34.254Z" }, + { url = "https://files.pythonhosted.org/packages/38/85/ea67067c70a1fd4be2c63d35eeed82658023021affccc7b17705f8527dd2/cryptography-48.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9be5aafa5736574f8f15f262adc81b2a9869e2cfe9014d52a44633905b40d52c", size = 4963283, upload-time = "2026-05-04T22:58:36.376Z" }, + { url = "https://files.pythonhosted.org/packages/75/54/cc6d0f3deac3e81c7f847e8a189a12b6cdd65059b43dad25d4316abd849a/cryptography-48.0.0-cp314-cp314t-win32.whl", hash = "sha256:c17dfe85494deaeddc5ce251aebd1d60bbe6afc8b62071bb0b469431a000124f", size = 3270954, upload-time = "2026-05-04T22:58:38.791Z" }, + { url = "https://files.pythonhosted.org/packages/49/67/cc947e288c0758a4e5473d1dcb743037ab7785541265a969240b8885441a/cryptography-48.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27241b1dc9962e056062a8eef1991d02c3a24569c95975bd2322a8a52c6e5e12", size = 3797313, upload-time = "2026-05-04T22:58:40.746Z" }, + { url = "https://files.pythonhosted.org/packages/f2/63/61d4a4e1c6b6bab6ce1e213cd36a24c415d90e76d78c5eb8577c5541d2e8/cryptography-48.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:58d00498e8933e4a194f3076aee1b4a97dfec1a6da444535755822fe5d8b0b86", size = 7983482, upload-time = "2026-05-04T22:58:43.769Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ac/f5b5995b87770c693e2596559ffafe195b4033a57f14a82268a2842953f3/cryptography-48.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:614d0949f4790582d2cc25553abd09dd723025f0c0e7c67376a1d77196743d6e", size = 4683266, upload-time = "2026-05-04T22:58:46.064Z" }, + { url = "https://files.pythonhosted.org/packages/ec/c6/8b14f67e18338fbc4adb76f66c001f5c3610b3e2d1837f268f47a347dbbb/cryptography-48.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7ce4bfae76319a532a2dc68f82cc32f5676ee792a983187dac07183690e5c66f", size = 4696228, upload-time = "2026-05-04T22:58:48.22Z" }, + { url = "https://files.pythonhosted.org/packages/ea/73/f808fbae9514bd91b47875b003f13e284c8c6bdfd904b7944e803937eec1/cryptography-48.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:2eb992bbd4661238c5a397594c83f5b4dc2bc5b848c365c8f991b6780efcc5c7", size = 4689097, upload-time = "2026-05-04T22:58:50.9Z" }, + { url = "https://files.pythonhosted.org/packages/93/01/d86632d7d28db8ae83221995752eeb6639ffb374c2d22955648cf8d52797/cryptography-48.0.0-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:22a5cb272895dce158b2cacdfdc3debd299019659f42947dbdac6f32d68fe832", size = 5283582, upload-time = "2026-05-04T22:58:53.017Z" }, + { url = "https://files.pythonhosted.org/packages/02/e1/50edc7a50334807cc4791fc4a0ce7468b4a1416d9138eab358bfc9a3d70b/cryptography-48.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2b4d59804e8408e2fea7d1fbaf218e5ec984325221db76e6a241a9abd6cdd95c", size = 4730479, upload-time = "2026-05-04T22:58:55.611Z" }, + { url = "https://files.pythonhosted.org/packages/6f/af/99a582b1b1641ff5911ac559beb45097cf79efd4ead4657f578ef1af2d47/cryptography-48.0.0-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:984a20b0f62a26f48a3396c72e4bc34c66e356d356bf370053066b3b6d54634a", size = 4326481, upload-time = "2026-05-04T22:58:57.607Z" }, + { url = "https://files.pythonhosted.org/packages/90/ee/89aa26a06ef0a7d7611788ffd571a7c50e368cc6a4d5eef8b4884e866edb/cryptography-48.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:5a5ed8fde7a1d09376ca0b40e68cd59c69fe23b1f9768bd5824f54681626032a", size = 4688713, upload-time = "2026-05-04T22:59:00.077Z" }, + { url = "https://files.pythonhosted.org/packages/70/ba/bcb1b0bb7a33d4c7c0c4d4c7874b4a62ae4f56113a5f4baefa362dfb1f0f/cryptography-48.0.0-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:8cd666227ef7af430aa5914a9910e0ddd703e75f039cef0825cd0da71b6b711a", size = 5238165, upload-time = "2026-05-04T22:59:02.317Z" }, + { url = "https://files.pythonhosted.org/packages/c9/70/ca4003b1ce5ca3dc3186ada51908c8a9b9ff7d5cab83cc0d43ee14ec144f/cryptography-48.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:9071196d81abc88b3516ac8cdfad32e2b66dd4a5393a8e68a961e9161ddc6239", size = 4729947, upload-time = "2026-05-04T22:59:05.255Z" }, + { url = "https://files.pythonhosted.org/packages/44/a0/4ec7cf774207905aef1a8d11c3750d5a1db805eb380ee4e16df317870128/cryptography-48.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1e2d54c8be6152856a36f0882ab231e70f8ec7f14e93cf87db8a2ed056bf160c", size = 4822059, upload-time = "2026-05-04T22:59:07.802Z" }, + { url = "https://files.pythonhosted.org/packages/1e/75/a2e55f99c16fcac7b5d6c1eb19ad8e00799854d6be5ca845f9259eae1681/cryptography-48.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a5da777e32ffed6f85a7b2b3f7c5cbc88c146bfcd0a1d7baf5fcc6c52ee35dd4", size = 4960575, upload-time = "2026-05-04T22:59:09.851Z" }, + { url = "https://files.pythonhosted.org/packages/b8/23/6e6f32143ab5d8b36ca848a502c4bcd477ae75b9e1677e3530d669062578/cryptography-48.0.0-cp39-abi3-win32.whl", hash = "sha256:77a2ccbbe917f6710e05ba9adaa25fb5075620bf3ea6fb751997875aff4ae4bd", size = 3279117, upload-time = "2026-05-04T22:59:12.019Z" }, + { url = "https://files.pythonhosted.org/packages/9d/9a/0fea98a70cf1749d41d738836f6349d97945f7c89433a259a6c2642eefeb/cryptography-48.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:16cd65b9330583e4619939b3a3843eec1e6e789744bb01e7c7e2e62e33c239c8", size = 3792100, upload-time = "2026-05-04T22:59:14.884Z" }, + { url = "https://files.pythonhosted.org/packages/be/d2/024b5e06be9d44cb021fb0e1a03d34d63989cf56a0fe62f3dfbab695b9b4/cryptography-48.0.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:84cf79f0dc8b36ac5da873481716e87aef31fcfa0444f9e1d8b4b2cece142855", size = 3950391, upload-time = "2026-05-04T22:59:17.415Z" }, + { url = "https://files.pythonhosted.org/packages/bc/17/3861e17c56fa0fd37491a14a8673fdb77c57fc5693cafe745ea8b06dba75/cryptography-48.0.0-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:fdfef35d751d510fcef5252703621574364fec16418c4a1e5e1055248401054b", size = 4637126, upload-time = "2026-05-04T22:59:20.197Z" }, + { url = "https://files.pythonhosted.org/packages/f0/0a/7e226dbff530f21480727eb764973a7bff2b912f8e15cd4f129e71b56d1d/cryptography-48.0.0-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:0890f502ddf7d9c6426129c3f49f5c0a39278ed7cd6322c8755ffca6ee675a13", size = 4667270, upload-time = "2026-05-04T22:59:22.647Z" }, + { url = "https://files.pythonhosted.org/packages/3b/f2/5a72274ca9f1b2a8b44a662ee0bf1b435909deb473d6f97bcd035bcdbc71/cryptography-48.0.0-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:ecde28a596bead48b0cfd2a1b4416c3d43074c2d785e3a398d7ec1fc4d0f7fbb", size = 4636797, upload-time = "2026-05-04T22:59:24.912Z" }, + { url = "https://files.pythonhosted.org/packages/b4/e1/48cedb2fe63626e91ded1edad159e2a4fb8b6906c4425eb7749673077ce7/cryptography-48.0.0-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:4defde8685ae324a9eb9d818717e93b4638ef67070ac9bc15b8ca85f63048355", size = 4666800, upload-time = "2026-05-04T22:59:27.474Z" }, + { url = "https://files.pythonhosted.org/packages/a2/ca/7e8365deec19afb2b2c7be7c1c0aa8f99633b54e90c570999acda93260fc/cryptography-48.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:db63bf618e5dea46c07de12e900fe1cdd2541e6dc9dbae772a70b7d4d4765f6a", size = 3739536, upload-time = "2026-05-04T22:59:29.61Z" }, ] [[package]] @@ -212,152 +218,152 @@ wheels = [ [[package]] name = "googleapis-common-protos" -version = "1.74.0" +version = "1.75.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/20/18/a746c8344152d368a5aac738d4c857012f2c5d1fd2eac7e17b647a7861bd/googleapis_common_protos-1.74.0.tar.gz", hash = "sha256:57971e4eeeba6aad1163c1f0fc88543f965bb49129b8bb55b2b7b26ecab084f1", size = 151254, upload-time = "2026-04-02T21:23:26.679Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/c8/f439cffde755cffa462bfbb156278fa6f9d09119719af9814b858fd4f81f/googleapis_common_protos-1.75.0.tar.gz", hash = "sha256:53a062ff3c32552fbd62c11fe23768b78e4ddf0494d5e5fd97d3f4689c75fbbd", size = 151035, upload-time = "2026-05-07T08:04:49.423Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/b0/be5d3329badb9230b765de6eea66b73abd5944bdeb5afb3562ddcd80ae84/googleapis_common_protos-1.74.0-py3-none-any.whl", hash = "sha256:702216f78610bb510e3f12ac3cafd281b7ac45cc5d86e90ad87e4d301a3426b5", size = 300743, upload-time = "2026-04-02T21:22:49.108Z" }, + { url = "https://files.pythonhosted.org/packages/e7/c8/e2645aa8ed02fd4c7a2f59d68783b65b1f3cbdfe39a6308e156509d1fee8/googleapis_common_protos-1.75.0-py3-none-any.whl", hash = "sha256:961ed60399c457ceb0ee8f285a84c870aabc9c6a832b9d37bb281b5bebde43ed", size = 300631, upload-time = "2026-05-07T08:03:30.345Z" }, ] [[package]] name = "grpcio" -version = "1.80.0" +version = "1.81.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b7/48/af6173dbca4454f4637a4678b67f52ca7e0c1ed7d5894d89d434fecede05/grpcio-1.80.0.tar.gz", hash = "sha256:29aca15edd0688c22ba01d7cc01cb000d72b2033f4a3c72a81a19b56fd143257", size = 12978905, upload-time = "2026-03-30T08:49:10.502Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9d/cd/bb7b7e54084a344c03d68144450da7ddd5564e51a298ae1662de65f48e2d/grpcio-1.80.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:886457a7768e408cdce226ad1ca67d2958917d306523a0e21e1a2fdaa75c9c9c", size = 6050363, upload-time = "2026-03-30T08:46:20.894Z" }, - { url = "https://files.pythonhosted.org/packages/16/02/1417f5c3460dea65f7a2e3c14e8b31e77f7ffb730e9bfadd89eda7a9f477/grpcio-1.80.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:7b641fc3f1dc647bfd80bd713addc68f6d145956f64677e56d9ebafc0bd72388", size = 12026037, upload-time = "2026-03-30T08:46:25.144Z" }, - { url = "https://files.pythonhosted.org/packages/43/98/c910254eedf2cae368d78336a2de0678e66a7317d27c02522392f949b5c6/grpcio-1.80.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:33eb763f18f006dc7fee1e69831d38d23f5eccd15b2e0f92a13ee1d9242e5e02", size = 6602306, upload-time = "2026-03-30T08:46:27.593Z" }, - { url = "https://files.pythonhosted.org/packages/7c/f8/88ca4e78c077b2b2113d95da1e1ab43efd43d723c9a0397d26529c2c1a56/grpcio-1.80.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:52d143637e3872633fc7dd7c3c6a1c84e396b359f3a72e215f8bf69fd82084fc", size = 7301535, upload-time = "2026-03-30T08:46:29.556Z" }, - { url = "https://files.pythonhosted.org/packages/f9/96/f28660fe2fe0f153288bf4a04e4910b7309d442395135c88ed4f5b3b8b40/grpcio-1.80.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c51bf8ac4575af2e0678bccfb07e47321fc7acb5049b4482832c5c195e04e13a", size = 6808669, upload-time = "2026-03-30T08:46:31.984Z" }, - { url = "https://files.pythonhosted.org/packages/47/eb/3f68a5e955779c00aeef23850e019c1c1d0e032d90633ba49c01ad5a96e0/grpcio-1.80.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:50a9871536d71c4fba24ee856abc03a87764570f0c457dd8db0b4018f379fed9", size = 7409489, upload-time = "2026-03-30T08:46:34.684Z" }, - { url = "https://files.pythonhosted.org/packages/5b/a7/d2f681a4bfb881be40659a309771f3bdfbfdb1190619442816c3f0ffc079/grpcio-1.80.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a72d84ad0514db063e21887fbacd1fd7acb4d494a564cae22227cd45c7fbf199", size = 8423167, upload-time = "2026-03-30T08:46:36.833Z" }, - { url = "https://files.pythonhosted.org/packages/97/8a/29b4589c204959aa35ce5708400a05bba72181807c45c47b3ec000c39333/grpcio-1.80.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f7691a6788ad9196872f95716df5bc643ebba13c97140b7a5ee5c8e75d1dea81", size = 7846761, upload-time = "2026-03-30T08:46:40.091Z" }, - { url = "https://files.pythonhosted.org/packages/6b/d2/ed143e097230ee121ac5848f6ff14372dba91289b10b536d54fb1b7cbae7/grpcio-1.80.0-cp310-cp310-win32.whl", hash = "sha256:46c2390b59d67f84e882694d489f5b45707c657832d7934859ceb8c33f467069", size = 4156534, upload-time = "2026-03-30T08:46:42.026Z" }, - { url = "https://files.pythonhosted.org/packages/d5/c9/df8279bb49b29409995e95efa85b72973d62f8aeff89abee58c91f393710/grpcio-1.80.0-cp310-cp310-win_amd64.whl", hash = "sha256:dc053420fc75749c961e2a4c906398d7c15725d36ccc04ae6d16093167223b58", size = 4889869, upload-time = "2026-03-30T08:46:44.219Z" }, - { url = "https://files.pythonhosted.org/packages/5d/db/1d56e5f5823257b291962d6c0ce106146c6447f405b60b234c4f222a7cde/grpcio-1.80.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:dfab85db094068ff42e2a3563f60ab3dddcc9d6488a35abf0132daec13209c8a", size = 6055009, upload-time = "2026-03-30T08:46:46.265Z" }, - { url = "https://files.pythonhosted.org/packages/6e/18/c83f3cad64c5ca63bca7e91e5e46b0d026afc5af9d0a9972472ceba294b3/grpcio-1.80.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:5c07e82e822e1161354e32da2662f741a4944ea955f9f580ec8fb409dd6f6060", size = 12035295, upload-time = "2026-03-30T08:46:49.099Z" }, - { url = "https://files.pythonhosted.org/packages/0f/8e/e14966b435be2dda99fbe89db9525ea436edc79780431a1c2875a3582644/grpcio-1.80.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba0915d51fd4ced2db5ff719f84e270afe0e2d4c45a7bdb1e8d036e4502928c2", size = 6610297, upload-time = "2026-03-30T08:46:52.123Z" }, - { url = "https://files.pythonhosted.org/packages/cc/26/d5eb38f42ce0e3fdc8174ea4d52036ef8d58cc4426cb800f2610f625dd75/grpcio-1.80.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:3cb8130ba457d2aa09fa6b7c3ed6b6e4e6a2685fce63cb803d479576c4d80e21", size = 7300208, upload-time = "2026-03-30T08:46:54.859Z" }, - { url = "https://files.pythonhosted.org/packages/25/51/bd267c989f85a17a5b3eea65a6feb4ff672af41ca614e5a0279cc0ea381c/grpcio-1.80.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:09e5e478b3d14afd23f12e49e8b44c8684ac3c5f08561c43a5b9691c54d136ab", size = 6813442, upload-time = "2026-03-30T08:46:57.056Z" }, - { url = "https://files.pythonhosted.org/packages/9e/d9/d80eef735b19e9169e30164bbf889b46f9df9127598a83d174eb13a48b26/grpcio-1.80.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:00168469238b022500e486c1c33916acf2f2a9b2c022202cf8a1885d2e3073c1", size = 7414743, upload-time = "2026-03-30T08:46:59.682Z" }, - { url = "https://files.pythonhosted.org/packages/de/f2/567f5bd5054398ed6b0509b9a30900376dcf2786bd936812098808b49d8d/grpcio-1.80.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8502122a3cc1714038e39a0b071acb1207ca7844208d5ea0d091317555ee7106", size = 8426046, upload-time = "2026-03-30T08:47:02.474Z" }, - { url = "https://files.pythonhosted.org/packages/62/29/73ef0141b4732ff5eacd68430ff2512a65c004696997f70476a83e548e7e/grpcio-1.80.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ce1794f4ea6cc3ca29463f42d665c32ba1b964b48958a66497917fe9069f26e6", size = 7851641, upload-time = "2026-03-30T08:47:05.462Z" }, - { url = "https://files.pythonhosted.org/packages/46/69/abbfa360eb229a8623bab5f5a4f8105e445bd38ce81a89514ba55d281ad0/grpcio-1.80.0-cp311-cp311-win32.whl", hash = "sha256:51b4a7189b0bef2aa30adce3c78f09c83526cf3dddb24c6a96555e3b97340440", size = 4154368, upload-time = "2026-03-30T08:47:08.027Z" }, - { url = "https://files.pythonhosted.org/packages/6f/d4/ae92206d01183b08613e846076115f5ac5991bae358d2a749fa864da5699/grpcio-1.80.0-cp311-cp311-win_amd64.whl", hash = "sha256:02e64bb0bb2da14d947a49e6f120a75e947250aebe65f9629b62bb1f5c14e6e9", size = 4894235, upload-time = "2026-03-30T08:47:10.839Z" }, - { url = "https://files.pythonhosted.org/packages/5c/e8/a2b749265eb3415abc94f2e619bbd9e9707bebdda787e61c593004ec927a/grpcio-1.80.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:c624cc9f1008361014378c9d776de7182b11fe8b2e5a81bc69f23a295f2a1ad0", size = 6015616, upload-time = "2026-03-30T08:47:13.428Z" }, - { url = "https://files.pythonhosted.org/packages/3e/97/b1282161a15d699d1e90c360df18d19165a045ce1c343c7f313f5e8a0b77/grpcio-1.80.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:f49eddcac43c3bf350c0385366a58f36bed8cc2c0ec35ef7b74b49e56552c0c2", size = 12014204, upload-time = "2026-03-30T08:47:15.873Z" }, - { url = "https://files.pythonhosted.org/packages/6e/5e/d319c6e997b50c155ac5a8cb12f5173d5b42677510e886d250d50264949d/grpcio-1.80.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d334591df610ab94714048e0d5b4f3dd5ad1bee74dfec11eee344220077a79de", size = 6563866, upload-time = "2026-03-30T08:47:18.588Z" }, - { url = "https://files.pythonhosted.org/packages/ae/f6/fdd975a2cb4d78eb67769a7b3b3830970bfa2e919f1decf724ae4445f42c/grpcio-1.80.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:0cb517eb1d0d0aaf1d87af7cc5b801d686557c1d88b2619f5e31fab3c2315921", size = 7273060, upload-time = "2026-03-30T08:47:21.113Z" }, - { url = "https://files.pythonhosted.org/packages/db/f0/a3deb5feba60d9538a962913e37bd2e69a195f1c3376a3dd44fe0427e996/grpcio-1.80.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4e78c4ac0d97dc2e569b2f4bcbbb447491167cb358d1a389fc4af71ab6f70411", size = 6782121, upload-time = "2026-03-30T08:47:23.827Z" }, - { url = "https://files.pythonhosted.org/packages/ca/84/36c6dcfddc093e108141f757c407902a05085e0c328007cb090d56646cdf/grpcio-1.80.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2ed770b4c06984f3b47eb0517b1c69ad0b84ef3f40128f51448433be904634cd", size = 7383811, upload-time = "2026-03-30T08:47:26.517Z" }, - { url = "https://files.pythonhosted.org/packages/7c/ef/f3a77e3dc5b471a0ec86c564c98d6adfa3510d38f8ee99010410858d591e/grpcio-1.80.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:256507e2f524092f1473071a05e65a5b10d84b82e3ff24c5b571513cfaa61e2f", size = 8393860, upload-time = "2026-03-30T08:47:29.439Z" }, - { url = "https://files.pythonhosted.org/packages/9b/8d/9d4d27ed7f33d109c50d6b5ce578a9914aa68edab75d65869a17e630a8d1/grpcio-1.80.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9a6284a5d907c37db53350645567c522be314bac859a64a7a5ca63b77bb7958f", size = 7830132, upload-time = "2026-03-30T08:47:33.254Z" }, - { url = "https://files.pythonhosted.org/packages/14/e4/9990b41c6d7a44e1e9dee8ac11d7a9802ba1378b40d77468a7761d1ad288/grpcio-1.80.0-cp312-cp312-win32.whl", hash = "sha256:c71309cfce2f22be26aa4a847357c502db6c621f1a49825ae98aa0907595b193", size = 4140904, upload-time = "2026-03-30T08:47:35.319Z" }, - { url = "https://files.pythonhosted.org/packages/2f/2c/296f6138caca1f4b92a31ace4ae1b87dab692fc16a7a3417af3bb3c805bf/grpcio-1.80.0-cp312-cp312-win_amd64.whl", hash = "sha256:9fe648599c0e37594c4809d81a9e77bd138cc82eb8baa71b6a86af65426723ff", size = 4880944, upload-time = "2026-03-30T08:47:37.831Z" }, - { url = "https://files.pythonhosted.org/packages/2f/3a/7c3c25789e3f069e581dc342e03613c5b1cb012c4e8c7d9d5cf960a75856/grpcio-1.80.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:e9e408fc016dffd20661f0126c53d8a31c2821b5c13c5d67a0f5ed5de93319ad", size = 6017243, upload-time = "2026-03-30T08:47:40.075Z" }, - { url = "https://files.pythonhosted.org/packages/04/19/21a9806eb8240e174fd1ab0cd5b9aa948bb0e05c2f2f55f9d5d7405e6d08/grpcio-1.80.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:92d787312e613754d4d8b9ca6d3297e69994a7912a32fa38c4c4e01c272974b0", size = 12010840, upload-time = "2026-03-30T08:47:43.11Z" }, - { url = "https://files.pythonhosted.org/packages/18/3a/23347d35f76f639e807fb7a36fad3068aed100996849a33809591f26eca6/grpcio-1.80.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8ac393b58aa16991a2f1144ec578084d544038c12242da3a215966b512904d0f", size = 6567644, upload-time = "2026-03-30T08:47:46.806Z" }, - { url = "https://files.pythonhosted.org/packages/ff/40/96e07ecb604a6a67ae6ab151e3e35b132875d98bc68ec65f3e5ab3e781d7/grpcio-1.80.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:68e5851ac4b9afe07e7f84483803ad167852570d65326b34d54ca560bfa53fb6", size = 7277830, upload-time = "2026-03-30T08:47:49.643Z" }, - { url = "https://files.pythonhosted.org/packages/9b/e2/da1506ecea1f34a5e365964644b35edef53803052b763ca214ba3870c856/grpcio-1.80.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:873ff5d17d68992ef6605330127425d2fc4e77e612fa3c3e0ed4e668685e3140", size = 6783216, upload-time = "2026-03-30T08:47:52.817Z" }, - { url = "https://files.pythonhosted.org/packages/44/83/3b20ff58d0c3b7f6caaa3af9a4174d4023701df40a3f39f7f1c8e7c48f9d/grpcio-1.80.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2bea16af2750fd0a899bf1abd9022244418b55d1f37da2202249ba4ba673838d", size = 7385866, upload-time = "2026-03-30T08:47:55.687Z" }, - { url = "https://files.pythonhosted.org/packages/47/45/55c507599c5520416de5eefecc927d6a0d7af55e91cfffb2e410607e5744/grpcio-1.80.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ba0db34f7e1d803a878284cd70e4c63cb6ae2510ba51937bf8f45ba997cefcf7", size = 8391602, upload-time = "2026-03-30T08:47:58.303Z" }, - { url = "https://files.pythonhosted.org/packages/10/bb/dd06f4c24c01db9cf11341b547d0a016b2c90ed7dbbb086a5710df7dd1d7/grpcio-1.80.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8eb613f02d34721f1acf3626dfdb3545bd3c8505b0e52bf8b5710a28d02e8aa7", size = 7826752, upload-time = "2026-03-30T08:48:01.311Z" }, - { url = "https://files.pythonhosted.org/packages/f9/1e/9d67992ba23371fd63d4527096eb8c6b76d74d52b500df992a3343fd7251/grpcio-1.80.0-cp313-cp313-win32.whl", hash = "sha256:93b6f823810720912fd131f561f91f5fed0fda372b6b7028a2681b8194d5d294", size = 4142310, upload-time = "2026-03-30T08:48:04.594Z" }, - { url = "https://files.pythonhosted.org/packages/cf/e6/283326a27da9e2c3038bc93eeea36fb118ce0b2d03922a9cda6688f53c5b/grpcio-1.80.0-cp313-cp313-win_amd64.whl", hash = "sha256:e172cf795a3ba5246d3529e4d34c53db70e888fa582a8ffebd2e6e48bc0cba50", size = 4882833, upload-time = "2026-03-30T08:48:07.363Z" }, - { url = "https://files.pythonhosted.org/packages/c5/6d/e65307ce20f5a09244ba9e9d8476e99fb039de7154f37fb85f26978b59c3/grpcio-1.80.0-cp314-cp314-linux_armv7l.whl", hash = "sha256:3d4147a97c8344d065d01bbf8b6acec2cf86fb0400d40696c8bdad34a64ffc0e", size = 6017376, upload-time = "2026-03-30T08:48:10.005Z" }, - { url = "https://files.pythonhosted.org/packages/69/10/9cef5d9650c72625a699c549940f0abb3c4bfdb5ed45a5ce431f92f31806/grpcio-1.80.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:d8e11f167935b3eb089ac9038e1a063e6d7dbe995c0bb4a661e614583352e76f", size = 12018133, upload-time = "2026-03-30T08:48:12.927Z" }, - { url = "https://files.pythonhosted.org/packages/04/82/983aabaad82ba26113caceeb9091706a0696b25da004fe3defb5b346e15b/grpcio-1.80.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f14b618fc30de822681ee986cfdcc2d9327229dc4c98aed16896761cacd468b9", size = 6574748, upload-time = "2026-03-30T08:48:16.386Z" }, - { url = "https://files.pythonhosted.org/packages/07/d7/031666ef155aa0bf399ed7e19439656c38bbd143779ae0861b038ce82abd/grpcio-1.80.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:4ed39fbdcf9b87370f6e8df4e39ca7b38b3e5e9d1b0013c7b6be9639d6578d14", size = 7277711, upload-time = "2026-03-30T08:48:19.627Z" }, - { url = "https://files.pythonhosted.org/packages/e8/43/f437a78f7f4f1d311804189e8f11fb311a01049b2e08557c1068d470cb2e/grpcio-1.80.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2dcc70e9f0ba987526e8e8603a610fb4f460e42899e74e7a518bf3c68fe1bf05", size = 6785372, upload-time = "2026-03-30T08:48:22.373Z" }, - { url = "https://files.pythonhosted.org/packages/93/3d/f6558e9c6296cb4227faa5c43c54a34c68d32654b829f53288313d16a86e/grpcio-1.80.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:448c884b668b868562b1bda833c5fce6272d26e1926ec46747cda05741d302c1", size = 7395268, upload-time = "2026-03-30T08:48:25.638Z" }, - { url = "https://files.pythonhosted.org/packages/06/21/0fdd77e84720b08843c371a2efa6f2e19dbebf56adc72df73d891f5506f0/grpcio-1.80.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a1dc80fe55685b4a543555e6eef975303b36c8db1023b1599b094b92aa77965f", size = 8392000, upload-time = "2026-03-30T08:48:28.974Z" }, - { url = "https://files.pythonhosted.org/packages/f5/68/67f4947ed55d2e69f2cc199ab9fd85e0a0034d813bbeef84df6d2ba4d4b7/grpcio-1.80.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:31b9ac4ad1aa28ffee5503821fafd09e4da0a261ce1c1281c6c8da0423c83b6e", size = 7828477, upload-time = "2026-03-30T08:48:32.054Z" }, - { url = "https://files.pythonhosted.org/packages/44/b6/8d4096691b2e385e8271911a0de4f35f0a6c7d05aff7098e296c3de86939/grpcio-1.80.0-cp314-cp314-win32.whl", hash = "sha256:367ce30ba67d05e0592470428f0ec1c31714cab9ef19b8f2e37be1f4c7d32fae", size = 4218563, upload-time = "2026-03-30T08:48:34.538Z" }, - { url = "https://files.pythonhosted.org/packages/e5/8c/bbe6baf2557262834f2070cf668515fa308b2d38a4bbf771f8f7872a7036/grpcio-1.80.0-cp314-cp314-win_amd64.whl", hash = "sha256:3b01e1f5464c583d2f567b2e46ff0d516ef979978f72091fd81f5ab7fa6e2e7f", size = 5019457, upload-time = "2026-03-30T08:48:37.308Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/15/f3/23f47b24f8d8c2028eba501db3acfbb2f592cbb5995eaa6e363a627b74d7/grpcio-1.81.0.tar.gz", hash = "sha256:a5acd7efd3b1fe9b4eb0bcaaa1507eed68a0ad0678b654c3f7b464df9ba9dca5", size = 13032272, upload-time = "2026-06-01T05:56:22.827Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/a0/13f7dd9602a44c2852eb5ca29dfcb14de5547e1d37672dbf20e3cf17d5d2/grpcio-1.81.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:b4108e5d9d0f651b7eea749116181fe6c315b145661a80ec31f05ec2dbe21af7", size = 6087534, upload-time = "2026-06-01T05:54:04.541Z" }, + { url = "https://files.pythonhosted.org/packages/da/8a/439070efa430b3c51c8e319b67521957688905f27b294302c6077e9d4ef5/grpcio-1.81.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:b76ea9d55cd08fcdbda25d28e0f76679536710acb7fbd5b1f70cb4ac49317265", size = 12062452, upload-time = "2026-06-01T05:54:10.137Z" }, + { url = "https://files.pythonhosted.org/packages/4a/6f/7802953eb46ab7082f70a139dac02a5544e8b784c4647f9750af28f64348/grpcio-1.81.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4e032feb3bfb4e2749b140a2302a6baa8ead1b9781ff5cf7094e4402b5e9372e", size = 6635199, upload-time = "2026-06-01T05:54:12.739Z" }, + { url = "https://files.pythonhosted.org/packages/09/33/91d7fd2392923407fc89e7f1493011dacd3f1a6972cff5fa2237ac1efd5d/grpcio-1.81.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:725801c7086d7e4cd160e42bb2f54e0aeb976b9568df3cc6f843b15d29b79fb1", size = 7333482, upload-time = "2026-06-01T05:54:15.474Z" }, + { url = "https://files.pythonhosted.org/packages/9a/df/ec0a4e04472df2618f8741151fa026bc877648e952ebb0e421169e0b992b/grpcio-1.81.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f750a091fff3a3991731abc1f818bdc64874bb3528162732cb4d45f2e07821a6", size = 6837709, upload-time = "2026-06-01T05:54:18.036Z" }, + { url = "https://files.pythonhosted.org/packages/86/82/9f69147bbd723ff07fea0242e5877a9026be1819410996e6086aae8f00a6/grpcio-1.81.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8226ba097eed660ef14d36c6a69b85038552bb8b6d17b44a5aa6f9abf48b8e08", size = 7440601, upload-time = "2026-06-01T05:54:20.662Z" }, + { url = "https://files.pythonhosted.org/packages/89/3b/52c1558e94941022b7ee046583fe4a007164c7e18087d55f82fd23c567b8/grpcio-1.81.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:40edffb4ec3689373825d367c4457727047a6e554f03245265ecc8cc03215f22", size = 8442803, upload-time = "2026-06-01T05:54:22.941Z" }, + { url = "https://files.pythonhosted.org/packages/4a/5d/1264d086c5d3cc81c59084de1ccc87d1a037f91ce9cb1f611caaa19b70cc/grpcio-1.81.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f85570a016d794c29b1e76cf22f67af4486ddbe779e0f30674f138fa4e1769ec", size = 7868964, upload-time = "2026-06-01T05:54:25.627Z" }, + { url = "https://files.pythonhosted.org/packages/a5/b4/3b3339e661669d545f09ee7ea33fec3b1b438e623b3105597d3457c39391/grpcio-1.81.0-cp310-cp310-win32.whl", hash = "sha256:3755c9669307cad18e7e009860fdea98118978d2300451bd8530a53048e741e7", size = 4202292, upload-time = "2026-06-01T05:54:28.261Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c3/cd81087855dfd4bbef2db50e58e1f7ce93a9a1675bc89a6cb76aa438ffaa/grpcio-1.81.0-cp310-cp310-win_amd64.whl", hash = "sha256:909bb3222b53235498d2c5817a0596d82b0aaea490ba93fdf1b060e2938a543c", size = 4937038, upload-time = "2026-06-01T05:54:30.376Z" }, + { url = "https://files.pythonhosted.org/packages/45/a8/9916ab10a0201f4c7afb6918125aa2f38a7626ee18ffbc066dd9cb04a74d/grpcio-1.81.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:794e6aa648e8df47d8f908dc8c3b42347d04ec58438f1dcd4e445f09b4f6b0ce", size = 6093557, upload-time = "2026-06-01T05:54:32.64Z" }, + { url = "https://files.pythonhosted.org/packages/a7/43/99e969a048904a65df3129ee53c5f523b7c4e43127786460cac4bee82470/grpcio-1.81.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:cd78145b7f7784661c524624f3526c9c6f891b30a4b54cb93a40806d0d0d61e9", size = 12075345, upload-time = "2026-06-01T05:54:35.77Z" }, + { url = "https://files.pythonhosted.org/packages/83/70/4c3a204e190333768d4f63f4ff56bd0bf405f05b9188f3a59a8bcf161f8b/grpcio-1.81.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:638ccc1b86f7540170a169cb900799b9296a1381e47879ce60b0de9d3db73d33", size = 6640664, upload-time = "2026-06-01T05:54:38.854Z" }, + { url = "https://files.pythonhosted.org/packages/2e/a9/0fa17ac8b4e29cf59b26915be6cab8c0d4583ce24a6208a287b6e5f6d072/grpcio-1.81.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:21ec30b9ea320c8207ea7cd05873ad64aa69fdd0e81b6758b3347983ba20b50a", size = 7332542, upload-time = "2026-06-01T05:54:41.39Z" }, + { url = "https://files.pythonhosted.org/packages/f4/18/7c8e3d0dda2fb7a17076fcd6c9085209eabad3354696c64230f87b3a14eb/grpcio-1.81.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:dbdb99986548a7e87f8343805ef315fd4eb50ffaabf4fb1206e42f2542bb805d", size = 6842564, upload-time = "2026-06-01T05:54:43.57Z" }, + { url = "https://files.pythonhosted.org/packages/f6/19/2f1726c2e03ad3f3fe241e6b41534532ad580d595de14a4054ad84999c80/grpcio-1.81.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c36f5d5e97944cbda2d4096b4ae262e6e68506246b61582acf1b8591607f3ccc", size = 7446236, upload-time = "2026-06-01T05:54:46.042Z" }, + { url = "https://files.pythonhosted.org/packages/a7/dc/0321f892212e2c0bfe248cea24c00d7d7111639688ec5ffd8e36b5c02fe6/grpcio-1.81.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9f355384e5543ab77a755a7085225ecc19f32b76032e851cbd8145715d79dec8", size = 8445633, upload-time = "2026-06-01T05:54:48.809Z" }, + { url = "https://files.pythonhosted.org/packages/e5/20/0e7ea7494955cf1beea3077b2fd2c04c84d4480c2ae85a1e1cfa150c62d7/grpcio-1.81.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:77eb4e9fe61486bd1198cc7236ebb0f70e66234e63c0348f40bc2553ed16a88b", size = 7873958, upload-time = "2026-06-01T05:54:52.135Z" }, + { url = "https://files.pythonhosted.org/packages/d3/9e/6438e226046c2a0778060e2b1d791a4827277bbd9d223013c2c63ee7435e/grpcio-1.81.0-cp311-cp311-win32.whl", hash = "sha256:7915a2e63acdc05264a206e1bddfd8e1fb8a29e406c18d72d30f8c124e021374", size = 4202110, upload-time = "2026-06-01T05:54:54.134Z" }, + { url = "https://files.pythonhosted.org/packages/42/6b/d0895e93d65b186f5f1737fcc186d7faa487e2d9d934eda111a37a309869/grpcio-1.81.0-cp311-cp311-win_amd64.whl", hash = "sha256:5e925a70fe99fe5794f7beca0ea034c75f068afcc356d79047e73f99cdcca34c", size = 4940942, upload-time = "2026-06-01T05:54:56.749Z" }, + { url = "https://files.pythonhosted.org/packages/82/d5/896a3aaf07068d707d88b282a04914b872db4d32d3c7e6d88e43a3b911fa/grpcio-1.81.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:57b3b0e73a518fa286959b40c3eddd02703504ca186e8b7b2945954519bd8b2c", size = 6053538, upload-time = "2026-06-01T05:54:58.965Z" }, + { url = "https://files.pythonhosted.org/packages/68/6a/7e3eafa4727cd405ff917605ed2949e2af162f233f5cbdd773723a5fea7d/grpcio-1.81.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:8bb1789c94322a13336a2b6c58d9c14d68f8628b6e24205a799c69f5bf8516ce", size = 12053447, upload-time = "2026-06-01T05:55:01.862Z" }, + { url = "https://files.pythonhosted.org/packages/16/79/a4302aa82428de48a922421f522b027a1a727ab4d0926368454aa953d36d/grpcio-1.81.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e4d053900a0d24b75d7521139a3872150301b3d6bde3bed5e12318fb25791e4d", size = 6595872, upload-time = "2026-06-01T05:55:04.946Z" }, + { url = "https://files.pythonhosted.org/packages/b4/1f/7ff2850eaefbecf99af3f624dbb28dd1ad6c5fd4c1d8c26909ed6482673b/grpcio-1.81.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:db217c2e52931719f9937bd12082cd4d7b495b35803d5760686975c285924bf8", size = 7303857, upload-time = "2026-06-01T05:55:07.205Z" }, + { url = "https://files.pythonhosted.org/packages/e2/98/1f3896a9baae1f2aedf4e99c55291d6fa1f30ad9603d63bc18bda967b53e/grpcio-1.81.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:19f201da7b4e5c0559198abe5a97157e726f3abe6e8f5e832d4a50740f6dcc22", size = 6809676, upload-time = "2026-06-01T05:55:09.513Z" }, + { url = "https://files.pythonhosted.org/packages/34/8b/3441983718095208c5d797fd3239882e97ea89a629f41c8df94b4eef4df9/grpcio-1.81.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:275144b0115353339dbb8a6f28a9cf8997b5bf40e37f8f66ac0b0ea57e95b43f", size = 7412654, upload-time = "2026-06-01T05:55:12.777Z" }, + { url = "https://files.pythonhosted.org/packages/3c/98/1eddf07df6e4fe85cf67502a793f7b05468b2dca3d1ef35b972cf5d54468/grpcio-1.81.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5192857589f223e5a98ff0e31f6e551b19040e647d17bfe10116c8a2ce3b8696", size = 8408026, upload-time = "2026-06-01T05:55:15.514Z" }, + { url = "https://files.pythonhosted.org/packages/5c/73/3860341e6a1f5347be6ab35c6c0e1e3a8eb59d010388207fd561dcf01a88/grpcio-1.81.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c6ff087cb1f563f47b504b4e29e684129fc5ae4863faf3ebca08a327764ee6cb", size = 7849498, upload-time = "2026-06-01T05:55:18.078Z" }, + { url = "https://files.pythonhosted.org/packages/ae/3f/0ea06bd85c701966aa3f8f37314f2ed83520d2b7590f42d643d445d8bc8b/grpcio-1.81.0-cp312-cp312-win32.whl", hash = "sha256:98c6240f563178fc5877bd50e6ff274463e53e1472128f4110742450739659fa", size = 4184161, upload-time = "2026-06-01T05:55:20.127Z" }, + { url = "https://files.pythonhosted.org/packages/39/e3/a7c387406827a86f99ad7838b995bf9b4a182ffe2d2c439ed2873efec952/grpcio-1.81.0-cp312-cp312-win_amd64.whl", hash = "sha256:87e33b7afcfb3585121b5f007d2c52b8c534104d18f556e840d35193ca2a9141", size = 4929958, upload-time = "2026-06-01T05:55:22.736Z" }, + { url = "https://files.pythonhosted.org/packages/f3/29/779ee53c931d0fd55c1d459fde43e485172caa3ac87cbd43d003a13a0185/grpcio-1.81.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:62bbe463c9f0f2ff24e31bd25f8dd8b4bae78900e315915a3195a0ef1471a855", size = 6054973, upload-time = "2026-06-01T05:55:25.043Z" }, + { url = "https://files.pythonhosted.org/packages/9e/b6/7211807926b5a17f8d9a5d47c739a163d6812fefe3e4714e81cf92945ed7/grpcio-1.81.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:43c121e135ae44d1559b430db2b2dfad7421cbbe40e1deba506c7dc62b439719", size = 12048662, upload-time = "2026-06-01T05:55:28.453Z" }, + { url = "https://files.pythonhosted.org/packages/64/89/b1b93ef6b34bd20bbaf707fa99133bc9cc302139d5ec6f77a165c7169796/grpcio-1.81.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f345de40ef2e65f63645d53d251824e6070e07804827c5b00ec2e44555f9f901", size = 6599116, upload-time = "2026-06-01T05:55:31.185Z" }, + { url = "https://files.pythonhosted.org/packages/eb/bc/c89f9b9d1c22895715356a1e009554dae66319e97826bb4d30bcda7d29e8/grpcio-1.81.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:8c0855a350886f713b9e458e2a10d208009dcaa849f574e39cd6067db1fe1279", size = 7307591, upload-time = "2026-06-01T05:55:33.463Z" }, + { url = "https://files.pythonhosted.org/packages/65/4a/1df2a4cb4a1386e066ab7e4175e34bb884b35ccb60d3621c09c84af6aabb/grpcio-1.81.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a524cd530900bd24511fcb7f2ed144da4ea37711c4b094475d0bceca7a93a170", size = 6811797, upload-time = "2026-06-01T05:55:36.731Z" }, + { url = "https://files.pythonhosted.org/packages/8d/dc/fa189d20601a1be25b08850cfb733879bbb1047b62a8feec3a60e3e1a87b/grpcio-1.81.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e7746ba3e6efc9e2b748eff59470a2b8684d5a9ec607c6580bcaa5be175820bc", size = 7415131, upload-time = "2026-06-01T05:55:39.451Z" }, + { url = "https://files.pythonhosted.org/packages/ad/a3/5625c48cb48d23c6631b3e5294f88e4c751f22a52591ae78859fab96dca1/grpcio-1.81.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:aaaa4f7f2057d795952e4eacf3f342be8b5b156992f6ac85023c8b98794ebd47", size = 8408398, upload-time = "2026-06-01T05:55:42.219Z" }, + { url = "https://files.pythonhosted.org/packages/75/34/0f8202c6809a46c2b4d69125ef3667c40b1c211f8e19930e5fa1f1197039/grpcio-1.81.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0fba53cb96004b2b7fb758b46b2288cb49d0b658316a4e73f3ef67230616ee65", size = 7844481, upload-time = "2026-06-01T05:55:44.849Z" }, + { url = "https://files.pythonhosted.org/packages/c0/95/c3366b5b5edf4c4adc90f2e29ca16e57965a8e56dc8d2ee89565ba1905bb/grpcio-1.81.0-cp313-cp313-win32.whl", hash = "sha256:c197e2ef75a442528072b29e9755da299110e8610e8bcbb59a6b4cf55384f005", size = 4182777, upload-time = "2026-06-01T05:55:47.459Z" }, + { url = "https://files.pythonhosted.org/packages/a9/a7/932f2f748511a32e641a2aba0d30dded3ed6e8bc330e0924e4d5d86853e6/grpcio-1.81.0-cp313-cp313-win_amd64.whl", hash = "sha256:194eddfacc84d80f50512e9fd4ee851d5f2499f18f299c95aa8fb4748f0537e0", size = 4928085, upload-time = "2026-06-01T05:55:50.158Z" }, + { url = "https://files.pythonhosted.org/packages/c5/1d/28b231333857deb840bc3d182ae087510170ea6d68f21393aeb0fe499530/grpcio-1.81.0-cp314-cp314-linux_armv7l.whl", hash = "sha256:a9351055f52660b58f3d4890ea66188b5134399f82b11aa0c55bd4b99eff5390", size = 6055712, upload-time = "2026-06-01T05:55:52.889Z" }, + { url = "https://files.pythonhosted.org/packages/e8/b8/999c14f9dff0fc47549d2e827cba1343ddc18e1d1bf0d06d2cf628eecbd9/grpcio-1.81.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:300f3337b6425fd16ead9a4f9b2ac25801acb64aa5bc0b99eb69901645b2b1d2", size = 12057189, upload-time = "2026-06-01T05:55:55.952Z" }, + { url = "https://files.pythonhosted.org/packages/1e/3d/1fbde079572562af65351151d840525a13879eb7b481d35b55cd64c6127a/grpcio-1.81.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:97bbd623f7ded558fd4f7cb5a4f600c4d4de65c5dd364c83a5b14b2a10a2d3b5", size = 6608136, upload-time = "2026-06-01T05:55:59.069Z" }, + { url = "https://files.pythonhosted.org/packages/32/89/1f17cb6882abfd8e5a303a25d5d1665abef5a8c499a96198c65a651d1b85/grpcio-1.81.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:ff83d889e3ebf6341c8c7864ad8031591ad5ca61599072fc511644d1eb962d2b", size = 7307045, upload-time = "2026-06-01T05:56:02.376Z" }, + { url = "https://files.pythonhosted.org/packages/48/5a/f98e91b2e755652e637ea2144318b0229b290062199f761b445fe1fa6015/grpcio-1.81.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c4fe218c5a35e1d87a5a26544237f1fa41dfd9cbd3c856b0810a30061f8b0aaf", size = 6812794, upload-time = "2026-06-01T05:56:05.777Z" }, + { url = "https://files.pythonhosted.org/packages/0a/0c/77892d715ac41e7ec0ace2a50080ffb64e189188056f607a66fe0014d1ee/grpcio-1.81.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b8b025b6af43ee0ad4a70307025d77bcab5adde7c4597786010d802c203e9fc5", size = 7422767, upload-time = "2026-06-01T05:56:08.524Z" }, + { url = "https://files.pythonhosted.org/packages/3f/b8/aa04590c6564714d94954515f15a236e59d4b9b3ad01e615f1b706d7792d/grpcio-1.81.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:3d4e0ce5a40a998cf608c8ba60ecfe18fdf364a9aa193ae4ac3faeecd0e86757", size = 8408551, upload-time = "2026-06-01T05:56:11.283Z" }, + { url = "https://files.pythonhosted.org/packages/43/3d/4f4a3450a1973568910c6909cb74abbf2126f68aefae5976962f9f7ad50d/grpcio-1.81.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:aa948712c8e5fa40ec250870bda14bc7578e1bb832a8912d9d2a0f720518edbe", size = 7846468, upload-time = "2026-06-01T05:56:14.536Z" }, + { url = "https://files.pythonhosted.org/packages/88/f4/5827fd248221ad3b44161c23ce9b5f4ee405b04fc6da5fd402a9aa87a84a/grpcio-1.81.0-cp314-cp314-win32.whl", hash = "sha256:fbbe81314a9d92156abce8b62c09364eb8bafc0ca2a19919a45ec64b5c6cb664", size = 4264427, upload-time = "2026-06-01T05:56:17.192Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e8/127dc2b246096ad50ef7c8d9b7b31d757787aeb796368bcdd4454e4204c4/grpcio-1.81.0-cp314-cp314-win_amd64.whl", hash = "sha256:b93cee313cae4e113fbb3a0ce1ea5633db6f63cfde2b2dc1d817429026b2a50b", size = 5070848, upload-time = "2026-06-01T05:56:19.735Z" }, ] [[package]] name = "grpcio-status" -version = "1.80.0" +version = "1.81.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "googleapis-common-protos" }, { name = "grpcio" }, { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b1/ed/105f619bdd00cb47a49aa2feea6232ea2bbb04199d52a22cc6a7d603b5cb/grpcio_status-1.80.0.tar.gz", hash = "sha256:df73802a4c89a3ea88aa2aff971e886fccce162bc2e6511408b3d67a144381cd", size = 13901, upload-time = "2026-03-30T08:54:34.784Z" } +sdist = { url = "https://files.pythonhosted.org/packages/01/b6/cdc177114997d15c887fb09ccfd16705c8ceb8b4ca2487902b54a7bfd1af/grpcio_status-1.81.0.tar.gz", hash = "sha256:b6fe9788cfdd1f0f63c0528a1e0bfdb41e8ff0583e920d2d8e8888598c01bb69", size = 13900, upload-time = "2026-06-01T06:00:32.638Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/80/58cd2dfc19a07d022abe44bde7c365627f6c7cb6f692ada6c65ca437d09a/grpcio_status-1.80.0-py3-none-any.whl", hash = "sha256:4b56990363af50dbf2c2ebb80f1967185c07d87aa25aa2bea45ddb75fc181dbe", size = 14638, upload-time = "2026-03-30T08:54:01.569Z" }, + { url = "https://files.pythonhosted.org/packages/f3/b7/5aa346bf1cdecd4ed64b86c10a4d5a089ce3da89145f8328caf0b22b240d/grpcio_status-1.81.0-py3-none-any.whl", hash = "sha256:10eb4c2309db902dc26c1873e80a821bf794be772c10dfd83030f7f59f165fab", size = 14634, upload-time = "2026-06-01T06:00:13.345Z" }, ] [[package]] name = "grpcio-tools" -version = "1.80.0" +version = "1.81.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "grpcio" }, { name = "protobuf" }, { name = "setuptools" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/94/c8/1223f29c84a143ae9a56c084fc96894de0ba84b6e8d60a26241abd81d278/grpcio_tools-1.80.0.tar.gz", hash = "sha256:26052b19c6ce0dcf52d1024496aea3e2bdfa864159f06dc7b97b22d041a94b26", size = 6133212, upload-time = "2026-03-30T08:52:39.077Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7a/54/1de67f5080da305a258758a8deb33f85666fa759f56785042a80b114a53f/grpcio_tools-1.80.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:727477b9afa4b53f5ec70cafb41c3965d893835e0d4ea9b542fe3d0d005602bf", size = 2549601, upload-time = "2026-03-30T08:50:09.498Z" }, - { url = "https://files.pythonhosted.org/packages/9a/b4/6d57ea199c5b880d182a2234aafa9a686f9c54c708ea7be75bd19d5aa825/grpcio_tools-1.80.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:85fe8d15f146c62cb76f38d963e256392d287442b9232717d30ae9e3bbda9bc3", size = 5712717, upload-time = "2026-03-30T08:50:15.028Z" }, - { url = "https://files.pythonhosted.org/packages/6a/1a/5505ee2277d368b409c796c78f22ea34a2a517b7d16755247efd663dc7af/grpcio_tools-1.80.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:95f0fffb5ca00519f3b602f938169b4dfa04b165e03258323965a9dfe8cc4d80", size = 2595941, upload-time = "2026-03-30T08:50:17.299Z" }, - { url = "https://files.pythonhosted.org/packages/4e/39/7fc1d16d8b767805079d76365d73e82c88dfaf179034473dbc9fbccedb77/grpcio_tools-1.80.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:7a0106af212748823a6ebd8ffbd9043414216f47cae3835f3187de0a62c415d3", size = 2909304, upload-time = "2026-03-30T08:50:19.485Z" }, - { url = "https://files.pythonhosted.org/packages/97/d8/276ee759755d8f34f2ca5e9d2debd1a59f29f66059fb790bc369f2236c26/grpcio_tools-1.80.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:31fd01a4038b5dfc4ec79504a17061344f670f851833411717fef66920f13cd7", size = 2660269, upload-time = "2026-03-30T08:50:21.266Z" }, - { url = "https://files.pythonhosted.org/packages/51/04/a6bb47942ad52901d777a649324d3203cf19d487f1d446263637f7a5bf12/grpcio_tools-1.80.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:57da9e19607fac4a01c48ead333c0dd15d91ed38794dce1194eda308f73e2038", size = 3109798, upload-time = "2026-03-30T08:50:23.267Z" }, - { url = "https://files.pythonhosted.org/packages/be/50/7ee69b2919916739787d725f205b878e8d1619dd30422b8278e324664669/grpcio_tools-1.80.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:90968f751851abb8b145593609800fa70c837e1c93ba0792c480b1c8d8bc29ef", size = 3658930, upload-time = "2026-03-30T08:50:25.458Z" }, - { url = "https://files.pythonhosted.org/packages/92/61/6d50783092b0e8bbcb04152d5388bf50ecf3ea2f783d95288ff6c3bb00fa/grpcio_tools-1.80.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b69dc5d6376ab43406304d1e2fc61ccf960b287d4325d77c3d45448c37a9d2da", size = 3326562, upload-time = "2026-03-30T08:50:27.809Z" }, - { url = "https://files.pythonhosted.org/packages/ea/58/d272ba549f6b1f0d8504f5fc4cd0a296f2c495a64d6e987fe871c4151557/grpcio_tools-1.80.0-cp310-cp310-win32.whl", hash = "sha256:3e8dcfebe34cb54df095de3d5871a4562a85a29f26d0f8bb41ee2c3dcfb11c3c", size = 997620, upload-time = "2026-03-30T08:50:29.959Z" }, - { url = "https://files.pythonhosted.org/packages/70/5f/9f45a9946a0298711c72ca48b2c1f46a7d0c207a44cd3e4bb59d04556ba3/grpcio_tools-1.80.0-cp310-cp310-win_amd64.whl", hash = "sha256:fc622ed4ca400695f41c9eae3266276c6ba007e4c28164ce53b44e7ccc5e492b", size = 1162466, upload-time = "2026-03-30T08:50:32.242Z" }, - { url = "https://files.pythonhosted.org/packages/8a/d7/225dc91e6cb4f8d4830f16a478a468e9c6f342dcdf8cacc3772cc1d1f607/grpcio_tools-1.80.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:1c43e5c768578fe0c6de3dbfaabe64af642951e1aa05c487cacedda63fa6c6c4", size = 2549937, upload-time = "2026-03-30T08:50:34.651Z" }, - { url = "https://files.pythonhosted.org/packages/97/3d/a3684cb7677f3bea8db434eae02a9ce30135d7a268cd473b1bc8041c4722/grpcio_tools-1.80.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:a225348456575f3ac7851d8e23163195e76d2a905ee340cf73f33da62fba08aa", size = 5713099, upload-time = "2026-03-30T08:50:37.158Z" }, - { url = "https://files.pythonhosted.org/packages/b1/81/5665c697173ec346076358bfbfed0f7386825852494593ca14386478dfee/grpcio_tools-1.80.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a9396f02820d3f51c368c2c9dee15c55c77636c91be48a4d5c702e98d6fe0fdc", size = 2595776, upload-time = "2026-03-30T08:50:39.087Z" }, - { url = "https://files.pythonhosted.org/packages/03/4f/fb81384f08a8226fa079972ba88272ac6277581fc72e8ab234d74c7e065b/grpcio_tools-1.80.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:797c08460cae16b402326eac329aec720dccf45c9f9279b95a352792eb53cf0f", size = 2909144, upload-time = "2026-03-30T08:50:40.922Z" }, - { url = "https://files.pythonhosted.org/packages/4d/9c/c957618f1c2a3195ecf5e83b03edcb364c2c1391f74183cb76e5763fa536/grpcio_tools-1.80.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1872a867eb6217de19edb70a4ce4a374ced9d94293533dfd42fa649713f55bf4", size = 2660477, upload-time = "2026-03-30T08:50:42.766Z" }, - { url = "https://files.pythonhosted.org/packages/42/c7/23913da184febfd4eaf04de256a26bc5ff0411a5feb753e2adcff10fa86a/grpcio_tools-1.80.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:db122ba5ee357e3bb14e8944d69bbebcbdae91d5eace29ed4df3edc53cbc6528", size = 3110164, upload-time = "2026-03-30T08:50:44.761Z" }, - { url = "https://files.pythonhosted.org/packages/af/fa/b25ed85ebdb0396910eaa250b1346d75527d22fca586265416bd4330dcd5/grpcio_tools-1.80.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ddefd48c227e6f4d640fe576fac5fb2c4a8898196f513604c8ec7671b3b3d421", size = 3658988, upload-time = "2026-03-30T08:50:47.546Z" }, - { url = "https://files.pythonhosted.org/packages/60/85/2a55147cc9645e2ed777d1afcd2dc68cb34ba6f6c726bd4378ddb001a5ea/grpcio_tools-1.80.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:970ec058fa469dd6dae6ebc687501c5da670d95dead75f62f5b0933dce2c9794", size = 3326662, upload-time = "2026-03-30T08:50:49.59Z" }, - { url = "https://files.pythonhosted.org/packages/68/ed/b05bee2a992e6f9bda81909692ea920d0896cfa05c5c9dd77ba03f2d22fb/grpcio_tools-1.80.0-cp311-cp311-win32.whl", hash = "sha256:526b4402d47a0e9b31cd6087e42b7674784617916cc73c764e0bc35ed41b4ee5", size = 997969, upload-time = "2026-03-30T08:50:51.539Z" }, - { url = "https://files.pythonhosted.org/packages/b6/9a/cb50c8270e2f6285ff2761130ae257ac4e51789ded4b9d9710ce0381814d/grpcio_tools-1.80.0-cp311-cp311-win_amd64.whl", hash = "sha256:ee101ecda7231770f6a5da1024a9a6ed587a7785f8fe23ab8283f4a1acb3ffe6", size = 1162742, upload-time = "2026-03-30T08:50:54.232Z" }, - { url = "https://files.pythonhosted.org/packages/0c/b9/65929df8c9614792db900a8e45d4997fadbd1734c827da3f0eb1f2fe4866/grpcio_tools-1.80.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:d19d5a8244311947b96f749c417b32d144641c6953f1164824579e1f0a51d040", size = 2550856, upload-time = "2026-03-30T08:50:57.3Z" }, - { url = "https://files.pythonhosted.org/packages/28/17/af1557544d68d1aeca9d9ea53ed16524022d521fec6ba334ab3530e9c1a6/grpcio_tools-1.80.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:fb599a3dc89ed1bb24489a2724b2f6dd4cddbbf0f7bdd69c073477bab0dc7554", size = 5710883, upload-time = "2026-03-30T08:51:00.077Z" }, - { url = "https://files.pythonhosted.org/packages/cc/48/aa9b4f7519ca972bc40d315d5c28f05ca28fa08de13d4e8b69f551b798ab/grpcio_tools-1.80.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:623ee31fc2ff7df9a987b4f3d139c30af17ce46a861ae0e25fb8c112daa32dd8", size = 2598004, upload-time = "2026-03-30T08:51:02.102Z" }, - { url = "https://files.pythonhosted.org/packages/b4/b8/b01371c119924b3beca1fe3f047b1bc2cdc66b3d37f0f3acc9d10c567a43/grpcio_tools-1.80.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:b46570a68378539ee2b75a5a43202561f8d753c832798b1047099e3c551cf5d6", size = 2909568, upload-time = "2026-03-30T08:51:04.159Z" }, - { url = "https://files.pythonhosted.org/packages/4f/7c/1108f7bdb58475a7e701ec89b55eb494538b6e76acd211ba0d4cc5fd28e8/grpcio_tools-1.80.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:51caf99c28999e7e0f97e9cea190c1405b7681a57bb2e0631205accd92b43fa4", size = 2660938, upload-time = "2026-03-30T08:51:06.126Z" }, - { url = "https://files.pythonhosted.org/packages/67/59/d1c0063d4cd3b85363c7044ff3e5159d6d5df96e2692a9a5312d9c8cb290/grpcio_tools-1.80.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cdaa1c9aa8d3a87891a96700cadd29beec214711d6522818d207277f6452567c", size = 3113814, upload-time = "2026-03-30T08:51:08.834Z" }, - { url = "https://files.pythonhosted.org/packages/76/21/18d34a4efe524c903cf66b0cfa5260d81f277b6ae668b647edf795df9ce5/grpcio_tools-1.80.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3399b5fd7b59bcffd59c6b9975a969d9f37a3c87f3e3d63c3a09c147907acb0d", size = 3662793, upload-time = "2026-03-30T08:51:11.094Z" }, - { url = "https://files.pythonhosted.org/packages/f3/40/cf2d9295a6bd593244ea703858f8fc2efd315046ca3ef7c6f9ebc5b810fa/grpcio_tools-1.80.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9c6abc08d3485b2aac99bb58afcd31dc6cd4316ce36cf263ff09cb6df15f287f", size = 3329149, upload-time = "2026-03-30T08:51:13.066Z" }, - { url = "https://files.pythonhosted.org/packages/0d/1d/fc34b32167966df20d69429b71dfca83c48434b047a5ac4fd6cd91ca4eed/grpcio_tools-1.80.0-cp312-cp312-win32.whl", hash = "sha256:18c51e07652ac7386fcdbd11866f8d55a795de073337c12447b5805575339f74", size = 997519, upload-time = "2026-03-30T08:51:14.87Z" }, - { url = "https://files.pythonhosted.org/packages/91/98/6d6563cdf51085b75f8ec24605c6f2ce84197571878ca8ab4af949c6be2d/grpcio_tools-1.80.0-cp312-cp312-win_amd64.whl", hash = "sha256:ac6fdd42d5bb18f0d903a067e2825be172deff70cf197164b6f65676cb506c9b", size = 1162407, upload-time = "2026-03-30T08:51:16.793Z" }, - { url = "https://files.pythonhosted.org/packages/44/d9/f7887a4805939e9a85d03744b66fc02575dc1df3c3e8b4d9ec000ee7a33d/grpcio_tools-1.80.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:e7046837859bbfd10b01786056145480155c16b222c9e209215b68d3be13060e", size = 2550319, upload-time = "2026-03-30T08:51:19.117Z" }, - { url = "https://files.pythonhosted.org/packages/57/5a/c8a05b32bd7203f1b9f4c0151090a2d6179d6c97692d32f2066dc29c67a6/grpcio_tools-1.80.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:a447f28958a8fe84ff0d9d3d9473868feb27ee4a9c9c805e66f5b670121cec59", size = 5709681, upload-time = "2026-03-30T08:51:21.991Z" }, - { url = "https://files.pythonhosted.org/packages/82/6b/794350ed645c12c310008f97068f6a6fd927150b0d0d08aad1d909e880b1/grpcio_tools-1.80.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:75f00450e08fe648ad8a1eeb25bc52219679d54cdd02f04dfdddc747309d83f6", size = 2596820, upload-time = "2026-03-30T08:51:24.323Z" }, - { url = "https://files.pythonhosted.org/packages/f9/b2/b39e7b79f7c878135e0784a53cd7260ee77260c8c7f2c9e46bca8e05d017/grpcio_tools-1.80.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:3db830eaff1f2c2797328f2fa86c9dcdbd7d81af573a68db81e27afa2182a611", size = 2909193, upload-time = "2026-03-30T08:51:27.025Z" }, - { url = "https://files.pythonhosted.org/packages/10/f3/abe089b058f87f9910c9a458409505cbeb0b3e1c2d993a79721d02ee6a32/grpcio_tools-1.80.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7982b5fe42f012686b667dda12916884de95c4b1c65ff64371fb7232a1474b23", size = 2660197, upload-time = "2026-03-30T08:51:29.392Z" }, - { url = "https://files.pythonhosted.org/packages/09/c3/3f7806ad8b731d8a89fe3c6ed496473abd1ef4c9c42c9e9a8836ce96e377/grpcio_tools-1.80.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6451b3f4eb52d12c7f32d04bf8e0185f80521f3f088ad04b8d222b3a4819c71e", size = 3113144, upload-time = "2026-03-30T08:51:31.671Z" }, - { url = "https://files.pythonhosted.org/packages/fe/f5/415ef205e0b7e75d2a2005df6120145c4f02fda28d7b3715b55d924fe1a4/grpcio_tools-1.80.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:258bc30654a9a2236be4ca8e2ad443e2ac6db7c8cc20454d34cce60265922726", size = 3661897, upload-time = "2026-03-30T08:51:34.849Z" }, - { url = "https://files.pythonhosted.org/packages/e3/d3/2ad54764c2a9547080dd8518f4a4dc7899c7e6e747a1b1de542ce6a12066/grpcio_tools-1.80.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:865a2b8e6334c838976ab02a322cbd55c863d2eaf3c1e1a0255883c63996772a", size = 3328786, upload-time = "2026-03-30T08:51:37.265Z" }, - { url = "https://files.pythonhosted.org/packages/eb/63/23ab7db01f9630ab4f3742a2fc9fbff38b0cfc30c976114f913950664a75/grpcio_tools-1.80.0-cp313-cp313-win32.whl", hash = "sha256:f760ac1722f33e774814c37b6aa0444143f612e85088ead7447a0e9cd306a1f1", size = 997087, upload-time = "2026-03-30T08:51:39.137Z" }, - { url = "https://files.pythonhosted.org/packages/9b/af/b1c1c4423fb49cb7c8e9d2c02196b038c44160b7028b425466743c6c81fa/grpcio_tools-1.80.0-cp313-cp313-win_amd64.whl", hash = "sha256:7843b9ac6ff8ca508424d0dd968bd9a1a4559967e4a290f26be5bd6f04af2234", size = 1162167, upload-time = "2026-03-30T08:51:41.498Z" }, - { url = "https://files.pythonhosted.org/packages/0e/44/7beeee2348f9f412804f5bf80b7d13b81d522bf926a338ae3da46b2213b7/grpcio_tools-1.80.0-cp314-cp314-linux_armv7l.whl", hash = "sha256:12f950470449dbeec78317dbc090add7a00eb6ca812af7b0538ab7441e0a42c3", size = 2550303, upload-time = "2026-03-30T08:51:44.373Z" }, - { url = "https://files.pythonhosted.org/packages/2d/aa/f77dd85409a1855f8c6319ffc69d81e8c3ffe122ee3a7136653e1991d8b6/grpcio_tools-1.80.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:d3f9a376a29c9adf62bb56f7ff5bc81eb4abeaf53d1e7dde5015564832901a51", size = 5709778, upload-time = "2026-03-30T08:51:47.112Z" }, - { url = "https://files.pythonhosted.org/packages/9c/7c/ab7af4883ebdfdc228b853de89fed409703955e8d47285b321a5794856bd/grpcio_tools-1.80.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1ba1ffbf2cff71533615e2c5a138ed5569611eec9ae7f9c67b8898e127b54ac0", size = 2597928, upload-time = "2026-03-30T08:51:49.494Z" }, - { url = "https://files.pythonhosted.org/packages/22/e8/4381a963d472e3ab6690ba067ed2b1f1abf8518b10f402678bd2dcb79a54/grpcio_tools-1.80.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:13f60f8d9397c514c6745a967d22b5c8c698347e88deebca1ff2e1b94555e450", size = 2909333, upload-time = "2026-03-30T08:51:52.124Z" }, - { url = "https://files.pythonhosted.org/packages/94/cb/356b5fdf79dd99455b425fb16302fe60995554ceb721afbf3cf770a19208/grpcio_tools-1.80.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:88d77bad5dd3cd5e6f952c4ecdd0ee33e0c02ecfc2e4b0cbee3391ac19e0a431", size = 2660217, upload-time = "2026-03-30T08:51:55.066Z" }, - { url = "https://files.pythonhosted.org/packages/2b/d7/1752018cc2c36b2c5612051379e2e5f59f2dbe612de23e817d2f066a9487/grpcio_tools-1.80.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:017945c3e98a4ed1c4e21399781b4137fc08dfc1f802c8ace2e64ef52d32b142", size = 3113896, upload-time = "2026-03-30T08:51:57.3Z" }, - { url = "https://files.pythonhosted.org/packages/cc/17/695bbe454f70df35c03e22b48c5314683b913d3e6ed35ec90d065418c1ab/grpcio_tools-1.80.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a33e265d4db803495007a6c623eafb0f6b9bb123ff4a0af89e44567dad809b88", size = 3661950, upload-time = "2026-03-30T08:51:59.867Z" }, - { url = "https://files.pythonhosted.org/packages/9c/d0/533d87629ec823c02c9169ee20228f734c264b209dcdf55268b5a14cde0a/grpcio_tools-1.80.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6c129da370c5f85f569be2e545317dda786a60dd51d7deea29b03b0c05f6aac3", size = 3328755, upload-time = "2026-03-30T08:52:02.942Z" }, - { url = "https://files.pythonhosted.org/packages/08/a1/504d7838770c73a9761e8a8ff4869dba1146b44f297ff0ac6641481942d3/grpcio_tools-1.80.0-cp314-cp314-win32.whl", hash = "sha256:25742de5958ae4325249a37e724e7c0e5120f8e302a24a977ebd1737b48a5e97", size = 1019620, upload-time = "2026-03-30T08:52:05.342Z" }, - { url = "https://files.pythonhosted.org/packages/f3/75/8b7cd281c5cdfb4ca2c308f7e9b2799bab2be6e7a9e9212ea5a82e2aecd4/grpcio_tools-1.80.0-cp314-cp314-win_amd64.whl", hash = "sha256:bbf8eeef78fda1966f732f79c1c802fadd5cfd203d845d2af4d314d18569069c", size = 1194210, upload-time = "2026-03-30T08:52:08.105Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/f3/b5/72f688670ce56ea59b05ea13430f06cbb728dd354dac508544fc7d4b5c95/grpcio_tools-1.81.0.tar.gz", hash = "sha256:0733d773eca8cb461f4f2a1b79c64c123db9661be41b08184b81497b2b991ccb", size = 6235718, upload-time = "2026-06-01T05:58:34.191Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/65/1f/03480308383e55d5189de6fee6d6b4728b2c2fa7129ba450dcf9bcc7b099/grpcio_tools-1.81.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:ffb1e507f9849ee013473f732b1ca5d732457f9b1d0d298efe8a77c33bb65d3a", size = 2586260, upload-time = "2026-06-01T05:56:38.05Z" }, + { url = "https://files.pythonhosted.org/packages/2d/bb/a8846bdaccaa8ec9f32b2a3e9b4fd5f364c142bb63e8159629c0d08cb346/grpcio_tools-1.81.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:fa529a1f7a946cdb6881141a07d8fc8fb074af2fd17323e5f3530c8718101680", size = 5817404, upload-time = "2026-06-01T05:56:43.955Z" }, + { url = "https://files.pythonhosted.org/packages/35/de/31903d2110cb7472aec4d005c2b96bab645fa5bd69d4c63a9b442e3e86ef/grpcio_tools-1.81.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:244619491a12d1f8d4119bb5930272827084a1e7caa8f9d5a0d4ca6595bb1dea", size = 2634107, upload-time = "2026-06-01T05:56:45.844Z" }, + { url = "https://files.pythonhosted.org/packages/fa/e5/aa3bc715bcff192c98893bde79e2ed56cc5fdfdc2d479c9b39a9091db466/grpcio_tools-1.81.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1ecb833118bfa2c3051e534692f2b43f7c6db14e1eac9b1e7f6e66b6b6dc5074", size = 2957944, upload-time = "2026-06-01T05:56:47.915Z" }, + { url = "https://files.pythonhosted.org/packages/ee/8b/48cbc3db78a74323038bd36db26c8ec24d4c69e1361b3f84660d85ad3c9d/grpcio_tools-1.81.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0034997767960644f0f4a2aecf35df5fc426d43fa5639dd1b8317da835bab2a4", size = 2697758, upload-time = "2026-06-01T05:56:49.749Z" }, + { url = "https://files.pythonhosted.org/packages/67/53/2e760230944bf028052d8fd36141e357b9003a38a2928f0714611cf7049a/grpcio_tools-1.81.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5a7c89432a3b200be306e76307b866716663b4c71d7816bdf382af81e00abd51", size = 3147589, upload-time = "2026-06-01T05:56:51.804Z" }, + { url = "https://files.pythonhosted.org/packages/cd/52/06df77cfcc031c4d45eb3e9c5d075ee3ecdfe7d61f73a9a87f1f954b4c1f/grpcio_tools-1.81.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:52687858c044a6a4dd3fc4049b012b131254a3061360d6de2f97c3e38a7aedd9", size = 3708798, upload-time = "2026-06-01T05:56:54.102Z" }, + { url = "https://files.pythonhosted.org/packages/3c/68/1211c5c052e5c1ef682ed2d1fb70b2ace0945f8492b66b3313b28739e52c/grpcio_tools-1.81.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5c5f44305786c1295320fed477f5673be4ca5f6ed1b31f8696f0791d4b12906d", size = 3366971, upload-time = "2026-06-01T05:56:56.066Z" }, + { url = "https://files.pythonhosted.org/packages/e0/17/31f4d9aa43e461bf0641531ee01242fa46407ec8b3153b484725a910d931/grpcio_tools-1.81.0-cp310-cp310-win32.whl", hash = "sha256:bf19fdc8b6258fbf36ea65f5672206483ef4639a16d33e3367d77e4523b4089b", size = 1008713, upload-time = "2026-06-01T05:56:58.154Z" }, + { url = "https://files.pythonhosted.org/packages/9c/83/322502cc56f8eca3e0dae8cd1c2740a5611d6ea03afc3193c7afb8ecda37/grpcio_tools-1.81.0-cp310-cp310-win_amd64.whl", hash = "sha256:f02d796474e58bba879965d228874c2c34164b6a5d96c0faf6bf896a6c3d8a0b", size = 1174751, upload-time = "2026-06-01T05:57:00.91Z" }, + { url = "https://files.pythonhosted.org/packages/fa/c3/f48f4798d20c3db6d17bd35c8132c64ce7136584411c5d260b8d4276535f/grpcio_tools-1.81.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:677207d88b659048f63697c237bf650b123a7a1de36158db57176f84c5bca84a", size = 2586250, upload-time = "2026-06-01T05:57:03.305Z" }, + { url = "https://files.pythonhosted.org/packages/f2/63/cde1c7e7abdc46c3c56de9785e89377f614567ffce506388664f143d1dbc/grpcio_tools-1.81.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:f37ce0440e5dc563662da89d7d1edd20654e6fb615ada5c8027f15f881bd40d0", size = 5818006, upload-time = "2026-06-01T05:57:06.18Z" }, + { url = "https://files.pythonhosted.org/packages/68/ab/3f19ed6d2de1dafb3b542f0132037d84093c4b30fe8333349fd575e1f586/grpcio_tools-1.81.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:404ca893d54f26fddb868bbd4a54b203fbf914264d26c52e2f2aff35851a9f72", size = 2634061, upload-time = "2026-06-01T05:57:08.265Z" }, + { url = "https://files.pythonhosted.org/packages/b5/c5/7d1c6c577e2909f6a94b1e623b01fa993c975aff58283746f48dbcc5e9d7/grpcio_tools-1.81.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:fbe12f98aeddfeaa74d3dbe41dc451f008edf3ab1b82eb62f7a61011003d4833", size = 2958026, upload-time = "2026-06-01T05:57:10.679Z" }, + { url = "https://files.pythonhosted.org/packages/91/c9/73873504d23536c5b31efe0e7f3c2911514433b627433a830d13afaa8097/grpcio_tools-1.81.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:012d580d98db189e4bd231a6529b162bc27a5f52c4854e2d21a4016edc47c760", size = 2698031, upload-time = "2026-06-01T05:57:12.657Z" }, + { url = "https://files.pythonhosted.org/packages/a2/3d/89d9dca7db8d9565a4ab1f47df0579355e53bf066a40e21143b30debc205/grpcio_tools-1.81.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d744ea354c9ca33ca17522436825e2842df9b731bcc924a73f4a7d205ed53006", size = 3147544, upload-time = "2026-06-01T05:57:14.829Z" }, + { url = "https://files.pythonhosted.org/packages/2d/55/b1da79d9b19a9fbc9c5fceac69d9dbe67cc184735f25512bb9bd070a9754/grpcio_tools-1.81.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:40b7a17629e5c944c8ba98a438f051b9affaf30794e6e096578ba0030725f90c", size = 3708524, upload-time = "2026-06-01T05:57:17.077Z" }, + { url = "https://files.pythonhosted.org/packages/a9/08/e019d647311f90ff6ce4eac42c6f2c39282e86ca29ede8cc00039c23011d/grpcio_tools-1.81.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:23831f5c66038c5793cb5d2651120bc24a33705e1ce2887a88f54272b73b240f", size = 3367019, upload-time = "2026-06-01T05:57:19.575Z" }, + { url = "https://files.pythonhosted.org/packages/74/70/6afa8d0dcf7c14727271a6913803f821c0365853b4419a71844cc5cadc76/grpcio_tools-1.81.0-cp311-cp311-win32.whl", hash = "sha256:d56060281599d87e66a0dc6840b68730d81c215dbb1b5c50882f819bc9b6aba5", size = 1008980, upload-time = "2026-06-01T05:57:21.32Z" }, + { url = "https://files.pythonhosted.org/packages/f8/22/d6317bd68ba49b1eb89ba6f1066808d751a57ddfd4b1b964d96bf6dbfa84/grpcio_tools-1.81.0-cp311-cp311-win_amd64.whl", hash = "sha256:42e1eaa98199bd4f900f8af091e27aef804dd53b59c92adafcc9faabc0a92240", size = 1174844, upload-time = "2026-06-01T05:57:23.213Z" }, + { url = "https://files.pythonhosted.org/packages/1c/e3/3c4f9da489413ef3f3dc9f7bc49a270270ec99fb3a00fd4302a2f59a7be2/grpcio_tools-1.81.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:374fe0435447f283e3c69f719ef1bc66f2e187a239ce25444b2de45cb3a6a744", size = 2585927, upload-time = "2026-06-01T05:57:25.397Z" }, + { url = "https://files.pythonhosted.org/packages/d2/b2/de7aba18f87d722c215ae168add975b9e7729cfaf7a1292be43f87685fa1/grpcio_tools-1.81.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:dce33d09851bc15dead814bd9d21023bffdf0f838ecf65995a2456e5692831fd", size = 5815566, upload-time = "2026-06-01T05:57:27.714Z" }, + { url = "https://files.pythonhosted.org/packages/eb/13/8f71b4830f129d896560c66964a3a8f4e33fbd59854396015e7449b75d3a/grpcio_tools-1.81.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:58e65dd13f7ffc25f5a9cd9890fddfd39b3c51e5c3c1acd987813b1dc1173704", size = 2635519, upload-time = "2026-06-01T05:57:29.848Z" }, + { url = "https://files.pythonhosted.org/packages/a2/e0/3ad58f1791c346a1fefc69ef3fcd19d63e3778736d4746f12b39f900b78b/grpcio_tools-1.81.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:760775f79bbefa321cd327fe1019a9d6ad0d93acb1ede7b7905c712679542fd7", size = 2958250, upload-time = "2026-06-01T05:57:31.836Z" }, + { url = "https://files.pythonhosted.org/packages/79/8a/3212db57815df0fa2a02e857e402c1abea15ec6b5fb63ebf306d90f2fb07/grpcio_tools-1.81.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7af4faf34376c57f4f3c42aa05f065d3b10e774b8a8d8b27d659d5cc351e5c75", size = 2698437, upload-time = "2026-06-01T05:57:33.827Z" }, + { url = "https://files.pythonhosted.org/packages/ec/d5/4245bbb4c14b54ac539b5b59f5298750d75211e144e1e8b35e1af5144d6d/grpcio_tools-1.81.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e9945945edc14022abab07caec0ebc16bf51219e586b4f008d09334cc479655c", size = 3152159, upload-time = "2026-06-01T05:57:36.065Z" }, + { url = "https://files.pythonhosted.org/packages/59/b1/59500d9fe41209e0887c66d80879ba80d0cc8e1327e24cc783eb879fe7a7/grpcio_tools-1.81.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:61d9ad6b5c0f3857663701bdc2cbb3da7f7d835ce9a8d597ffca443124a96894", size = 3710468, upload-time = "2026-06-01T05:57:38.367Z" }, + { url = "https://files.pythonhosted.org/packages/0c/14/86fc8b64db62851bf5cb1c945b22da7ab0dec6e0b7002ec374247482d404/grpcio_tools-1.81.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ffa74b84d201bea407f22e00ac0367f12df48a0073b0ffd9f3be9d8126a55245", size = 3370795, upload-time = "2026-06-01T05:57:40.724Z" }, + { url = "https://files.pythonhosted.org/packages/94/95/4fd57d9f948adadbe5b3e8e3b0d3c121ae5fe8276721097ab03361ce7adf/grpcio_tools-1.81.0-cp312-cp312-win32.whl", hash = "sha256:f1f407697873acbf1d961c6fb9223114a3e679938469d4186623b8b872dbdae0", size = 1008449, upload-time = "2026-06-01T05:57:42.491Z" }, + { url = "https://files.pythonhosted.org/packages/33/94/7567ddd3a13e24bbc5e146c6ac735004ab7303048115ccb032d61b5c2305/grpcio_tools-1.81.0-cp312-cp312-win_amd64.whl", hash = "sha256:283bb3465331a4034b14dce35425c47b0cfbd287b09a6e9d15c9f26fbb17e799", size = 1174889, upload-time = "2026-06-01T05:57:44.405Z" }, + { url = "https://files.pythonhosted.org/packages/f2/05/f0606a1b2e830d5fddfcd77c5d8e928f26dc221ced386fccf31a6efda57e/grpcio_tools-1.81.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:33c579bf24040dbdce751e05b5bcedc13dafffa8f2dfa07193bc05960dc95b49", size = 2586070, upload-time = "2026-06-01T05:57:46.677Z" }, + { url = "https://files.pythonhosted.org/packages/c4/4a/3b6817547d65d9f7a106ea6a2352125d08b44ce1d120b64ca0c565d896e6/grpcio_tools-1.81.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:2a369a9e27fcb6279387744778d67a64551de82db0e9cf7e1e9451c22f719e07", size = 5813211, upload-time = "2026-06-01T05:57:49.159Z" }, + { url = "https://files.pythonhosted.org/packages/bf/fc/078422558ebb337233379cdb0e4cc0d3d3218933d105003bae2790ff976f/grpcio_tools-1.81.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b2b26111795d0e7a72fa483d377a75b57203edaac8bbbac1e9b8f174e7b01ff3", size = 2634663, upload-time = "2026-06-01T05:57:51.41Z" }, + { url = "https://files.pythonhosted.org/packages/53/2b/043f2d62d6f28a0962f29f180ae24770020a06985b14a2d8f0d489531d71/grpcio_tools-1.81.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:a741007631248dd903f880b575a63c0662433ed4b966262ab0f437ea860c9b7e", size = 2957926, upload-time = "2026-06-01T05:57:54.103Z" }, + { url = "https://files.pythonhosted.org/packages/76/d3/be8c1f7c5ca6adccba66ef787b4bba304a3247c1319a33ed330719931ba3/grpcio_tools-1.81.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bac1c6ddc5eb3762257e773829b4e00ea7d0592f02498f27e5bdb75cd3182d69", size = 2697761, upload-time = "2026-06-01T05:57:56.494Z" }, + { url = "https://files.pythonhosted.org/packages/19/9d/c1650c72059f7d20d94597430ecbe0139d92c7e409cf007d0b5d765e40ec/grpcio_tools-1.81.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e5d241c694a226bada06dae9accc47c5c25e586f49464823498e84cff63eedea", size = 3151460, upload-time = "2026-06-01T05:57:58.756Z" }, + { url = "https://files.pythonhosted.org/packages/6b/82/2aad863738dc4f749df93d97f81a8aebdd0a7c5daee7157c259ecea7dbbc/grpcio_tools-1.81.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:475286558410e4d0394fc8129559080c22835ece3c23cac194b46c5ad7d0fad1", size = 3710466, upload-time = "2026-06-01T05:58:01.327Z" }, + { url = "https://files.pythonhosted.org/packages/47/7d/b79a5b132bd5db76ce48e686579ded0311bfa7ea19b8cb9ca88aea3e8d64/grpcio_tools-1.81.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:98b57a592a75553f4dd38db3993b037953245991b8df9f06927a8978962dcd82", size = 3370487, upload-time = "2026-06-01T05:58:03.769Z" }, + { url = "https://files.pythonhosted.org/packages/96/6f/a6a74a51b71aca801f4dcce6bd8bb7d3fd8d556ff191f0bd0de631b97dd1/grpcio_tools-1.81.0-cp313-cp313-win32.whl", hash = "sha256:78c2514bf172b20631685840fea0c5d1bec5518b649d0a498f6dd8f91dfce56a", size = 1008234, upload-time = "2026-06-01T05:58:05.668Z" }, + { url = "https://files.pythonhosted.org/packages/5a/91/02a4c529dd0a77c2d768b415ac334f6a9ea9d61c6f4c38e54d1a4394530c/grpcio_tools-1.81.0-cp313-cp313-win_amd64.whl", hash = "sha256:a87ea8056beea56b24353d27b7f0ab814daabb372aa517d2e179470e66fd8f6b", size = 1174523, upload-time = "2026-06-01T05:58:07.711Z" }, + { url = "https://files.pythonhosted.org/packages/13/1f/7885e23074d813ab71ba3ea689ecf5cb3bb3c76c51cc01bd393451f10257/grpcio_tools-1.81.0-cp314-cp314-linux_armv7l.whl", hash = "sha256:bf2ffd98c754d54a5affddfe3a18d4822b972c5c37ca6a33a456c94e6f3dd82b", size = 2585943, upload-time = "2026-06-01T05:58:10.077Z" }, + { url = "https://files.pythonhosted.org/packages/40/f4/a88116147d377a88fccef9b43667235835d504d60ebe0e0dcc81bc9c4b20/grpcio_tools-1.81.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:4a8d9fdf42537cd1924f7e95013771aa73c89501ccf112b7517c22ca825be9f5", size = 5813367, upload-time = "2026-06-01T05:58:12.545Z" }, + { url = "https://files.pythonhosted.org/packages/2a/1e/01f310f0427dcddaf0097e4101f041d437ba8199a7ed62621788f2601042/grpcio_tools-1.81.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:564624654f5a0377adc69f226f93ec5ff52715030c2f846af6c54ccc4ca2d225", size = 2634992, upload-time = "2026-06-01T05:58:14.92Z" }, + { url = "https://files.pythonhosted.org/packages/fd/ee/10cec754cb89cf45039ef4a8ff500ab5c567278fc4f6333347dba20c99fb/grpcio_tools-1.81.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:3f1ac691debbdbf00e7635ecacf28647f48f67fb4b14120a4541c8bb0f8333ae", size = 2957912, upload-time = "2026-06-01T05:58:17.596Z" }, + { url = "https://files.pythonhosted.org/packages/d2/71/cc273059fa3620d424df91a8faabd5875d4c20a0300875e721d15decd74b/grpcio_tools-1.81.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f35da7b3b9537ecce9a5cfd967b1316a815378d5a3729e9ea556b22a14f6e315", size = 2697709, upload-time = "2026-06-01T05:58:19.653Z" }, + { url = "https://files.pythonhosted.org/packages/a1/d5/c72f9e7d18425586bbc5b4fba78570fab23cb9810fb34a8841f7baaef22b/grpcio_tools-1.81.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1e21049aeedd9d62e5e58146e5d00f3b75674d8d8d3cc69709ab950082be8421", size = 3151885, upload-time = "2026-06-01T05:58:22.366Z" }, + { url = "https://files.pythonhosted.org/packages/9e/f9/7a3d7b3bce72fe22611a79d3790440c16af9d524a8bd1d38a89a44c65570/grpcio_tools-1.81.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:019f05a17b5495d561603f75a74a4a76ad22456a95dc7623c7be4e4b44391b88", size = 3710403, upload-time = "2026-06-01T05:58:25.014Z" }, + { url = "https://files.pythonhosted.org/packages/58/2d/b41fe47b83eb197a48fdcbf48d04f5923c5fd62d4b1a7f2820720562d7ae/grpcio_tools-1.81.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3401d6d4668c064c9ed344825fe97ff076cd8ba719a24e3d3c7169b604cbf00f", size = 3370524, upload-time = "2026-06-01T05:58:27.096Z" }, + { url = "https://files.pythonhosted.org/packages/94/d3/a4565146ab83232ddf86a3de497937662dc06649739f978763379c256311/grpcio_tools-1.81.0-cp314-cp314-win32.whl", hash = "sha256:5783b6758244f6eaceb41a0e651828824b0d0c92724ddf4b68879ced9bfd9b50", size = 1030574, upload-time = "2026-06-01T05:58:28.972Z" }, + { url = "https://files.pythonhosted.org/packages/35/72/f2102f3737b94e14b8ce56394918c0a4303e80d5d8b0627fc4ee85927f79/grpcio_tools-1.81.0-cp314-cp314-win_amd64.whl", hash = "sha256:69f8355b723db7b5e26a3bff76f9deb3a407d22fe289bca486ccf95d6133cad0", size = 1207499, upload-time = "2026-06-01T05:58:31.606Z" }, ] [[package]] @@ -399,11 +405,11 @@ wheels = [ [[package]] name = "idna" -version = "3.13" +version = "3.18" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ce/cc/762dfb036166873f0059f3b7de4565e1b5bc3d6f28a414c13da27e442f99/idna-3.13.tar.gz", hash = "sha256:585ea8fe5d69b9181ec1afba340451fba6ba764af97026f92a91d4eef164a242", size = 194210, upload-time = "2026-04-22T16:42:42.314Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/63/9496c57188a2ee585e0f1db071d75089a11e98aa86eb99d9d7618fc1edce/idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848", size = 196711, upload-time = "2026-06-02T14:34:07.794Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/13/ad7d7ca3808a898b4612b6fe93cde56b53f3034dcde235acb1f0e1df24c6/idna-3.13-py3-none-any.whl", hash = "sha256:892ea0cde124a99ce773decba204c5552b69c3c67ffd5f232eb7696135bc8bb3", size = 68629, upload-time = "2026-04-22T16:42:40.909Z" }, + { url = "https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2", size = 65455, upload-time = "2026-06-02T14:34:06.319Z" }, ] [[package]] @@ -415,10 +421,23 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, ] +[[package]] +name = "mypy-protobuf" +version = "5.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "protobuf" }, + { name = "types-protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/87/07/7ffb897eee5c01e816e037f51a6720bf1a0a8c17cca1a2382ae554f43044/mypy_protobuf-5.1.0.tar.gz", hash = "sha256:8493758852a9cdc075a11dbe96c6e37ea2feba5fd5f33ef7442b9a275322a94c", size = 37529, upload-time = "2026-04-28T15:56:40.356Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/ec/5ffcf8f5f53757e01afdece10c664e694ac60d2f17c2036811b85b842a5b/mypy_protobuf-5.1.0-py3-none-any.whl", hash = "sha256:d7031f563f806b8bcd448a3e86768bf0994c0af5b0017b344a4fbbba4191f43c", size = 26313, upload-time = "2026-04-28T15:56:39.096Z" }, +] + [[package]] name = "otdf-python" version = "0.6.0" -source = { editable = "." } +source = { editable = "packages/otdf-python" } dependencies = [ { name = "connect-python" }, { name = "cryptography" }, @@ -466,6 +485,41 @@ dev = [ { name = "tomli", marker = "python_full_version < '3.11'", specifier = ">=2.2.1" }, ] +[[package]] +name = "otdf-python-proto" +version = "0.6.0" +source = { editable = "packages/otdf-python-proto" } +dependencies = [ + { name = "connect-python" }, + { name = "googleapis-common-protos" }, + { name = "grpcio" }, + { name = "grpcio-tools" }, + { name = "protobuf" }, + { name = "protoc-gen-openapiv2" }, +] + +[package.dev-dependencies] +dev = [ + { name = "mypy-protobuf" }, + { name = "pytest" }, +] + +[package.metadata] +requires-dist = [ + { name = "connect-python", specifier = ">=0.6.0" }, + { name = "googleapis-common-protos", specifier = ">=1.66.0" }, + { name = "grpcio", specifier = ">=1.74.0" }, + { name = "grpcio-tools", specifier = ">=1.74.0" }, + { name = "protobuf", specifier = ">=6.33.5" }, + { name = "protoc-gen-openapiv2", specifier = ">=0.0.1" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "mypy-protobuf", specifier = ">=3.6.0" }, + { name = "pytest", specifier = ">=8.0.0" }, +] + [[package]] name = "packaging" version = "26.2" @@ -536,7 +590,7 @@ wheels = [ [[package]] name = "pydantic" -version = "2.13.3" +version = "2.13.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, @@ -544,139 +598,139 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d9/e4/40d09941a2cebcb20609b86a559817d5b9291c49dd6f8c87e5feffbe703a/pydantic-2.13.3.tar.gz", hash = "sha256:af09e9d1d09f4e7fe37145c1f577e1d61ceb9a41924bf0094a36506285d0a84d", size = 844068, upload-time = "2026-04-20T14:46:43.632Z" } +sdist = { url = "https://files.pythonhosted.org/packages/18/a5/b60d21ac674192f8ab0ba4e9fd860690f9b4a6e51ca5df118733b487d8d6/pydantic-2.13.4.tar.gz", hash = "sha256:c40756b57adaa8b1efeeced5c196f3f3b7c435f90e84ea7f443901bec8099ef6", size = 844775, upload-time = "2026-05-06T13:43:05.343Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f3/0a/fd7d723f8f8153418fb40cf9c940e82004fce7e987026b08a68a36dd3fe7/pydantic-2.13.3-py3-none-any.whl", hash = "sha256:6db14ac8dfc9a1e57f87ea2c0de670c251240f43cb0c30a5130e9720dc612927", size = 471981, upload-time = "2026-04-20T14:46:41.402Z" }, + { url = "https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl", hash = "sha256:45a282cde31d808236fd7ea9d919b128653c8b38b393d1c4ab335c62924d9aba", size = 472262, upload-time = "2026-05-06T13:43:02.641Z" }, ] [[package]] name = "pydantic-core" -version = "2.46.3" +version = "2.46.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2a/ef/f7abb56c49382a246fd2ce9c799691e3c3e7175ec74b14d99e798bcddb1a/pydantic_core-2.46.3.tar.gz", hash = "sha256:41c178f65b8c29807239d47e6050262eb6bf84eb695e41101e62e38df4a5bc2c", size = 471412, upload-time = "2026-04-20T14:40:56.672Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/22/98/b50eb9a411e87483b5c65dba4fa430a06bac4234d3403a40e5a9905ebcd0/pydantic_core-2.46.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:1da3786b8018e60349680720158cc19161cc3b4bdd815beb0a321cd5ce1ad5b1", size = 2108971, upload-time = "2026-04-20T14:43:51.945Z" }, - { url = "https://files.pythonhosted.org/packages/08/4b/f364b9d161718ff2217160a4b5d41ce38de60aed91c3689ebffa1c939d23/pydantic_core-2.46.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cc0988cb29d21bf4a9d5cf2ef970b5c0e38d8d8e107a493278c05dc6c1dda69f", size = 1949588, upload-time = "2026-04-20T14:44:10.386Z" }, - { url = "https://files.pythonhosted.org/packages/8f/8b/30bd03ee83b2f5e29f5ba8e647ab3c456bf56f2ec72fdbcc0215484a0854/pydantic_core-2.46.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27f9067c3bfadd04c55484b89c0d267981b2f3512850f6f66e1e74204a4e4ce3", size = 1975986, upload-time = "2026-04-20T14:43:57.106Z" }, - { url = "https://files.pythonhosted.org/packages/3c/54/13ccf954d84ec275d5d023d5786e4aa48840bc9f161f2838dc98e1153518/pydantic_core-2.46.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a642ac886ecf6402d9882d10c405dcf4b902abeb2972cd5fb4a48c83cd59279a", size = 2055830, upload-time = "2026-04-20T14:44:15.499Z" }, - { url = "https://files.pythonhosted.org/packages/be/0e/65f38125e660fdbd72aa858e7dfae893645cfa0e7b13d333e174a367cd23/pydantic_core-2.46.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79f561438481f28681584b89e2effb22855e2179880314bcddbf5968e935e807", size = 2222340, upload-time = "2026-04-20T14:41:51.353Z" }, - { url = "https://files.pythonhosted.org/packages/d1/88/f3ab7739efe0e7e80777dbb84c59eb98518e3f57ea433206194c2e425272/pydantic_core-2.46.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57a973eae4665352a47cf1a99b4ee864620f2fe663a217d7a8da68a1f3a5bfda", size = 2280727, upload-time = "2026-04-20T14:41:30.461Z" }, - { url = "https://files.pythonhosted.org/packages/2a/6d/c228219080817bec4982f9531cadb18da6aaa770fdeb114f49c237ac2c9f/pydantic_core-2.46.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83d002b97072a53ea150d63e0a3adfae5670cef5aa8a6e490240e482d3b22e57", size = 2092158, upload-time = "2026-04-20T14:44:07.305Z" }, - { url = "https://files.pythonhosted.org/packages/0f/b1/525a16711e7c6d61635fac3b0bd54600b5c5d9f60c6fc5aaab26b64a2297/pydantic_core-2.46.3-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:b40ddd51e7c44b28cfaef746c9d3c506d658885e0a46f9eeef2ee815cbf8e045", size = 2116626, upload-time = "2026-04-20T14:42:34.118Z" }, - { url = "https://files.pythonhosted.org/packages/ef/7c/17d30673351439a6951bf54f564cf2443ab00ae264ec9df00e2efd710eb5/pydantic_core-2.46.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ac5ec7fb9b87f04ee839af2d53bcadea57ded7d229719f56c0ed895bff987943", size = 2160691, upload-time = "2026-04-20T14:41:14.023Z" }, - { url = "https://files.pythonhosted.org/packages/86/66/af8adbcbc0886ead7f1a116606a534d75a307e71e6e08226000d51b880d2/pydantic_core-2.46.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a3b11c812f61b3129c4905781a2601dfdfdea5fe1e6c1cfb696b55d14e9c054f", size = 2182543, upload-time = "2026-04-20T14:40:48.886Z" }, - { url = "https://files.pythonhosted.org/packages/b0/37/6de71e0f54c54a4190010f57deb749e1ddf75c568ada3b1320b70067f121/pydantic_core-2.46.3-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:1108da631e602e5b3c38d6d04fe5bb3bfa54349e6918e3ca6cf570b2e2b2f9d4", size = 2324513, upload-time = "2026-04-20T14:42:36.121Z" }, - { url = "https://files.pythonhosted.org/packages/51/b1/9fc74ce94f603d5ef59ff258ca9c2c8fb902fb548d340a96f77f4d1c3b7f/pydantic_core-2.46.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:de885175515bcfa98ae618c1df7a072f13d179f81376c8007112af20567fd08a", size = 2361853, upload-time = "2026-04-20T14:43:24.886Z" }, - { url = "https://files.pythonhosted.org/packages/40/d0/4c652fc592db35f100279ee751d5a145aca1b9a7984b9684ba7c1b5b0535/pydantic_core-2.46.3-cp310-cp310-win32.whl", hash = "sha256:d11058e3201527d41bc6b545c79187c9e4bf85e15a236a6007f0e991518882b7", size = 1980465, upload-time = "2026-04-20T14:44:46.239Z" }, - { url = "https://files.pythonhosted.org/packages/27/b8/a920453c38afbe1f355e1ea0b0d94a0a3e0b0879d32d793108755fa171d5/pydantic_core-2.46.3-cp310-cp310-win_amd64.whl", hash = "sha256:3612edf65c8ea67ac13616c4d23af12faef1ae435a8a93e5934c2a0cbbdd1fd6", size = 2073884, upload-time = "2026-04-20T14:43:01.201Z" }, - { url = "https://files.pythonhosted.org/packages/22/a2/1ba90a83e85a3f94c796b184f3efde9c72f2830dcda493eea8d59ba78e6d/pydantic_core-2.46.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ab124d49d0459b2373ecf54118a45c28a1e6d4192a533fbc915e70f556feb8e5", size = 2106740, upload-time = "2026-04-20T14:41:20.932Z" }, - { url = "https://files.pythonhosted.org/packages/b6/f6/99ae893c89a0b9d3daec9f95487aa676709aa83f67643b3f0abaf4ab628a/pydantic_core-2.46.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cca67d52a5c7a16aed2b3999e719c4bcf644074eac304a5d3d62dd70ae7d4b2c", size = 1948293, upload-time = "2026-04-20T14:43:42.115Z" }, - { url = "https://files.pythonhosted.org/packages/3e/b8/2e8e636dc9e3f16c2e16bf0849e24be82c5ee82c603c65fc0326666328fc/pydantic_core-2.46.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c024e08c0ba23e6fd68c771a521e9d6a792f2ebb0fa734296b36394dc30390e", size = 1973222, upload-time = "2026-04-20T14:41:57.841Z" }, - { url = "https://files.pythonhosted.org/packages/34/36/0e730beec4d83c5306f417afbd82ff237d9a21e83c5edf675f31ed84c1fe/pydantic_core-2.46.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6645ce7eec4928e29a1e3b3d5c946621d105d3e79f0c9cddf07c2a9770949287", size = 2053852, upload-time = "2026-04-20T14:40:43.077Z" }, - { url = "https://files.pythonhosted.org/packages/4b/f0/3071131f47e39136a17814576e0fada9168569f7f8c0e6ac4d1ede6a4958/pydantic_core-2.46.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a712c7118e6c5ea96562f7b488435172abb94a3c53c22c9efc1412264a45cbbe", size = 2221134, upload-time = "2026-04-20T14:43:03.349Z" }, - { url = "https://files.pythonhosted.org/packages/2f/a9/a2dc023eec5aa4b02a467874bad32e2446957d2adcab14e107eab502e978/pydantic_core-2.46.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:69a868ef3ff206343579021c40faf3b1edc64b1cc508ff243a28b0a514ccb050", size = 2279785, upload-time = "2026-04-20T14:41:19.285Z" }, - { url = "https://files.pythonhosted.org/packages/0a/44/93f489d16fb63fbd41c670441536541f6e8cfa1e5a69f40bc9c5d30d8c90/pydantic_core-2.46.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc7e8c32db809aa0f6ea1d6869ebc8518a65d5150fdfad8bcae6a49ae32a22e2", size = 2089404, upload-time = "2026-04-20T14:43:10.108Z" }, - { url = "https://files.pythonhosted.org/packages/2a/78/8692e3aa72b2d004f7a5d937f1dfdc8552ba26caf0bec75f342c40f00dec/pydantic_core-2.46.3-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:3481bd1341dc85779ee506bc8e1196a277ace359d89d28588a9468c3ecbe63fa", size = 2114898, upload-time = "2026-04-20T14:44:51.475Z" }, - { url = "https://files.pythonhosted.org/packages/6a/62/e83133f2e7832532060175cebf1f13748f4c7e7e7165cdd1f611f174494b/pydantic_core-2.46.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8690eba565c6d68ffd3a8655525cbdd5246510b44a637ee2c6c03a7ebfe64d3c", size = 2157856, upload-time = "2026-04-20T14:43:46.64Z" }, - { url = "https://files.pythonhosted.org/packages/6d/ec/6a500e3ad7718ee50583fae79c8651f5d37e3abce1fa9ae177ae65842c53/pydantic_core-2.46.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4de88889d7e88d50d40ee5b39d5dac0bcaef9ba91f7e536ac064e6b2834ecccf", size = 2180168, upload-time = "2026-04-20T14:42:00.302Z" }, - { url = "https://files.pythonhosted.org/packages/d8/53/8267811054b1aa7fc1dc7ded93812372ef79a839f5e23558136a6afbfde1/pydantic_core-2.46.3-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:e480080975c1ef7f780b8f99ed72337e7cc5efea2e518a20a692e8e7b278eb8b", size = 2322885, upload-time = "2026-04-20T14:41:05.253Z" }, - { url = "https://files.pythonhosted.org/packages/c8/c1/1c0acdb3aa0856ddc4ecc55214578f896f2de16f400cf51627eb3c26c1c4/pydantic_core-2.46.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:de3a5c376f8cd94da9a1b8fd3dd1c16c7a7b216ed31dc8ce9fd7a22bf13b836e", size = 2360328, upload-time = "2026-04-20T14:41:43.991Z" }, - { url = "https://files.pythonhosted.org/packages/f0/d0/ef39cd0f4a926814f360e71c1adeab48ad214d9727e4deb48eedfb5bce1a/pydantic_core-2.46.3-cp311-cp311-win32.whl", hash = "sha256:fc331a5314ffddd5385b9ee9d0d2fee0b13c27e0e02dad71b1ae5d6561f51eeb", size = 1979464, upload-time = "2026-04-20T14:43:12.215Z" }, - { url = "https://files.pythonhosted.org/packages/18/9c/f41951b0d858e343f1cf09398b2a7b3014013799744f2c4a8ad6a3eec4f2/pydantic_core-2.46.3-cp311-cp311-win_amd64.whl", hash = "sha256:b5b9c6cf08a8a5e502698f5e153056d12c34b8fb30317e0c5fd06f45162a6346", size = 2070837, upload-time = "2026-04-20T14:41:47.707Z" }, - { url = "https://files.pythonhosted.org/packages/9f/1e/264a17cd582f6ed50950d4d03dd5fefd84e570e238afe1cb3e25cf238769/pydantic_core-2.46.3-cp311-cp311-win_arm64.whl", hash = "sha256:5dfd51cf457482f04ec49491811a2b8fd5b843b64b11eecd2d7a1ee596ea78a6", size = 2053647, upload-time = "2026-04-20T14:42:27.535Z" }, - { url = "https://files.pythonhosted.org/packages/4b/cb/5b47425556ecc1f3fe18ed2a0083188aa46e1dd812b06e406475b3a5d536/pydantic_core-2.46.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b11b59b3eee90a80a36701ddb4576d9ae31f93f05cb9e277ceaa09e6bf074a67", size = 2101946, upload-time = "2026-04-20T14:40:52.581Z" }, - { url = "https://files.pythonhosted.org/packages/a1/4f/2fb62c2267cae99b815bbf4a7b9283812c88ca3153ef29f7707200f1d4e5/pydantic_core-2.46.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:af8653713055ea18a3abc1537fe2ebc42f5b0bbb768d1eb79fd74eb47c0ac089", size = 1951612, upload-time = "2026-04-20T14:42:42.996Z" }, - { url = "https://files.pythonhosted.org/packages/50/6e/b7348fd30d6556d132cddd5bd79f37f96f2601fe0608afac4f5fb01ec0b3/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75a519dab6d63c514f3a81053e5266c549679e4aa88f6ec57f2b7b854aceb1b0", size = 1977027, upload-time = "2026-04-20T14:42:02.001Z" }, - { url = "https://files.pythonhosted.org/packages/82/11/31d60ee2b45540d3fb0b29302a393dbc01cd771c473f5b5147bcd353e593/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a6cd87cb1575b1ad05ba98894c5b5c96411ef678fa2f6ed2576607095b8d9789", size = 2063008, upload-time = "2026-04-20T14:44:17.952Z" }, - { url = "https://files.pythonhosted.org/packages/8a/db/3a9d1957181b59258f44a2300ab0f0be9d1e12d662a4f57bb31250455c52/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f80a55484b8d843c8ada81ebf70a682f3f00a3d40e378c06cf17ecb44d280d7d", size = 2233082, upload-time = "2026-04-20T14:40:57.934Z" }, - { url = "https://files.pythonhosted.org/packages/9c/e1/3277c38792aeb5cfb18c2f0c5785a221d9ff4e149abbe1184d53d5f72273/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3861f1731b90c50a3266316b9044f5c9b405eecb8e299b0a7120596334e4fe9c", size = 2304615, upload-time = "2026-04-20T14:42:12.584Z" }, - { url = "https://files.pythonhosted.org/packages/5e/d5/e3d9717c9eba10855325650afd2a9cba8e607321697f18953af9d562da2f/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb528e295ed31570ac3dcc9bfdd6e0150bc11ce6168ac87a8082055cf1a67395", size = 2094380, upload-time = "2026-04-20T14:43:05.522Z" }, - { url = "https://files.pythonhosted.org/packages/a1/20/abac35dedcbfd66c6f0b03e4e3564511771d6c9b7ede10a362d03e110d9b/pydantic_core-2.46.3-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:367508faa4973b992b271ba1494acaab36eb7e8739d1e47be5035fb1ea225396", size = 2135429, upload-time = "2026-04-20T14:41:55.549Z" }, - { url = "https://files.pythonhosted.org/packages/6c/a5/41bfd1df69afad71b5cf0535055bccc73022715ad362edbc124bc1e021d7/pydantic_core-2.46.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ad3c826fe523e4becf4fe39baa44286cff85ef137c729a2c5e269afbfd0905d", size = 2174582, upload-time = "2026-04-20T14:41:45.96Z" }, - { url = "https://files.pythonhosted.org/packages/79/65/38d86ea056b29b2b10734eb23329b7a7672ca604df4f2b6e9c02d4ee22fe/pydantic_core-2.46.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ec638c5d194ef8af27db69f16c954a09797c0dc25015ad6123eb2c73a4d271ca", size = 2187533, upload-time = "2026-04-20T14:40:55.367Z" }, - { url = "https://files.pythonhosted.org/packages/b6/55/a1129141678a2026badc539ad1dee0a71d06f54c2f06a4bd68c030ac781b/pydantic_core-2.46.3-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:28ed528c45446062ee66edb1d33df5d88828ae167de76e773a3c7f64bd14e976", size = 2332985, upload-time = "2026-04-20T14:44:13.05Z" }, - { url = "https://files.pythonhosted.org/packages/d7/60/cb26f4077719f709e54819f4e8e1d43f4091f94e285eb6bd21e1190a7b7c/pydantic_core-2.46.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aed19d0c783886d5bd86d80ae5030006b45e28464218747dcf83dabfdd092c7b", size = 2373670, upload-time = "2026-04-20T14:41:53.421Z" }, - { url = "https://files.pythonhosted.org/packages/6b/7e/c3f21882bdf1d8d086876f81b5e296206c69c6082551d776895de7801fa0/pydantic_core-2.46.3-cp312-cp312-win32.whl", hash = "sha256:06d5d8820cbbdb4147578c1fe7ffcd5b83f34508cb9f9ab76e807be7db6ff0a4", size = 1966722, upload-time = "2026-04-20T14:44:30.588Z" }, - { url = "https://files.pythonhosted.org/packages/57/be/6b5e757b859013ebfbd7adba02f23b428f37c86dcbf78b5bb0b4ffd36e99/pydantic_core-2.46.3-cp312-cp312-win_amd64.whl", hash = "sha256:c3212fda0ee959c1dd04c60b601ec31097aaa893573a3a1abd0a47bcac2968c1", size = 2072970, upload-time = "2026-04-20T14:42:54.248Z" }, - { url = "https://files.pythonhosted.org/packages/bf/f8/a989b21cc75e9a32d24192ef700eea606521221a89faa40c919ce884f2b1/pydantic_core-2.46.3-cp312-cp312-win_arm64.whl", hash = "sha256:f1f8338dd7a7f31761f1f1a3c47503a9a3b34eea3c8b01fa6ee96408affb5e72", size = 2035963, upload-time = "2026-04-20T14:44:20.4Z" }, - { url = "https://files.pythonhosted.org/packages/9b/3c/9b5e8eb9821936d065439c3b0fb1490ffa64163bfe7e1595985a47896073/pydantic_core-2.46.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:12bc98de041458b80c86c56b24df1d23832f3e166cbaff011f25d187f5c62c37", size = 2102109, upload-time = "2026-04-20T14:41:24.219Z" }, - { url = "https://files.pythonhosted.org/packages/91/97/1c41d1f5a19f241d8069f1e249853bcce378cdb76eec8ab636d7bc426280/pydantic_core-2.46.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:85348b8f89d2c3508b65b16c3c33a4da22b8215138d8b996912bb1532868885f", size = 1951820, upload-time = "2026-04-20T14:42:14.236Z" }, - { url = "https://files.pythonhosted.org/packages/30/b4/d03a7ae14571bc2b6b3c7b122441154720619afe9a336fa3a95434df5e2f/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1105677a6df914b1fb71a81b96c8cce7726857e1717d86001f29be06a25ee6f8", size = 1977785, upload-time = "2026-04-20T14:42:31.648Z" }, - { url = "https://files.pythonhosted.org/packages/ae/0c/4086f808834b59e3c8f1aa26df8f4b6d998cdcf354a143d18ef41529d1fe/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:87082cd65669a33adeba5470769e9704c7cf026cc30afb9cc77fd865578ebaad", size = 2062761, upload-time = "2026-04-20T14:40:37.093Z" }, - { url = "https://files.pythonhosted.org/packages/fa/71/a649be5a5064c2df0db06e0a512c2281134ed2fcc981f52a657936a7527c/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60e5f66e12c4f5212d08522963380eaaeac5ebd795826cfd19b2dfb0c7a52b9c", size = 2232989, upload-time = "2026-04-20T14:42:59.254Z" }, - { url = "https://files.pythonhosted.org/packages/a2/84/7756e75763e810b3a710f4724441d1ecc5883b94aacb07ca71c5fb5cfb69/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b6cdf19bf84128d5e7c37e8a73a0c5c10d51103a650ac585d42dd6ae233f2b7f", size = 2303975, upload-time = "2026-04-20T14:41:32.287Z" }, - { url = "https://files.pythonhosted.org/packages/6c/35/68a762e0c1e31f35fa0dac733cbd9f5b118042853698de9509c8e5bf128b/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:031bb17f4885a43773c8c763089499f242aee2ea85cf17154168775dccdecf35", size = 2095325, upload-time = "2026-04-20T14:42:47.685Z" }, - { url = "https://files.pythonhosted.org/packages/77/bf/1bf8c9a8e91836c926eae5e3e51dce009bf495a60ca56060689d3df3f340/pydantic_core-2.46.3-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:bcf2a8b2982a6673693eae7348ef3d8cf3979c1d63b54fca7c397a635cc68687", size = 2133368, upload-time = "2026-04-20T14:41:22.766Z" }, - { url = "https://files.pythonhosted.org/packages/e5/50/87d818d6bab915984995157ceb2380f5aac4e563dddbed6b56f0ed057aba/pydantic_core-2.46.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28e8cf2f52d72ced402a137145923a762cbb5081e48b34312f7a0c8f55928ec3", size = 2173908, upload-time = "2026-04-20T14:42:52.044Z" }, - { url = "https://files.pythonhosted.org/packages/91/88/a311fb306d0bd6185db41fa14ae888fb81d0baf648a761ae760d30819d33/pydantic_core-2.46.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:17eaface65d9fc5abb940003020309c1bf7a211f5f608d7870297c367e6f9022", size = 2186422, upload-time = "2026-04-20T14:43:29.55Z" }, - { url = "https://files.pythonhosted.org/packages/8f/79/28fd0d81508525ab2054fef7c77a638c8b5b0afcbbaeee493cf7c3fef7e1/pydantic_core-2.46.3-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:93fd339f23408a07e98950a89644f92c54d8729719a40b30c0a30bb9ebc55d23", size = 2332709, upload-time = "2026-04-20T14:42:16.134Z" }, - { url = "https://files.pythonhosted.org/packages/b3/21/795bf5fe5c0f379308b8ef19c50dedab2e7711dbc8d0c2acf08f1c7daa05/pydantic_core-2.46.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:23cbdb3aaa74dfe0837975dbf69b469753bbde8eacace524519ffdb6b6e89eb7", size = 2372428, upload-time = "2026-04-20T14:41:10.974Z" }, - { url = "https://files.pythonhosted.org/packages/45/b3/ed14c659cbe7605e3ef063077680a64680aec81eb1a04763a05190d49b7f/pydantic_core-2.46.3-cp313-cp313-win32.whl", hash = "sha256:610eda2e3838f401105e6326ca304f5da1e15393ae25dacae5c5c63f2c275b13", size = 1965601, upload-time = "2026-04-20T14:41:42.128Z" }, - { url = "https://files.pythonhosted.org/packages/ef/bb/adb70d9a762ddd002d723fbf1bd492244d37da41e3af7b74ad212609027e/pydantic_core-2.46.3-cp313-cp313-win_amd64.whl", hash = "sha256:68cc7866ed863db34351294187f9b729964c371ba33e31c26f478471c52e1ed0", size = 2071517, upload-time = "2026-04-20T14:43:36.096Z" }, - { url = "https://files.pythonhosted.org/packages/52/eb/66faefabebfe68bd7788339c9c9127231e680b11906368c67ce112fdb47f/pydantic_core-2.46.3-cp313-cp313-win_arm64.whl", hash = "sha256:f64b5537ac62b231572879cd08ec05600308636a5d63bcbdb15063a466977bec", size = 2035802, upload-time = "2026-04-20T14:43:38.507Z" }, - { url = "https://files.pythonhosted.org/packages/7f/db/a7bcb4940183fda36022cd18ba8dd12f2dff40740ec7b58ce7457befa416/pydantic_core-2.46.3-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:afa3aa644f74e290cdede48a7b0bee37d1c35e71b05105f6b340d484af536d9b", size = 2097614, upload-time = "2026-04-20T14:44:38.374Z" }, - { url = "https://files.pythonhosted.org/packages/24/35/e4066358a22e3e99519db370494c7528f5a2aa1367370e80e27e20283543/pydantic_core-2.46.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ced3310e51aa425f7f77da8bbbb5212616655bedbe82c70944320bc1dbe5e018", size = 1951896, upload-time = "2026-04-20T14:40:53.996Z" }, - { url = "https://files.pythonhosted.org/packages/87/92/37cf4049d1636996e4b888c05a501f40a43ff218983a551d57f9d5e14f0d/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e29908922ce9da1a30b4da490bd1d3d82c01dcfdf864d2a74aacee674d0bfa34", size = 1979314, upload-time = "2026-04-20T14:41:49.446Z" }, - { url = "https://files.pythonhosted.org/packages/d8/36/9ff4d676dfbdfb2d591cf43f3d90ded01e15b1404fd101180ed2d62a2fd3/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0c9ff69140423eea8ed2d5477df3ba037f671f5e897d206d921bc9fdc39613e7", size = 2056133, upload-time = "2026-04-20T14:42:23.574Z" }, - { url = "https://files.pythonhosted.org/packages/bc/f0/405b442a4d7ba855b06eec8b2bf9c617d43b8432d099dfdc7bf999293495/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b675ab0a0d5b1c8fdb81195dc5bcefea3f3c240871cdd7ff9a2de8aa50772eb2", size = 2228726, upload-time = "2026-04-20T14:44:22.816Z" }, - { url = "https://files.pythonhosted.org/packages/e7/f8/65cd92dd5a0bd89ba277a98ecbfaf6fc36bbd3300973c7a4b826d6ab1391/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0087084960f209a9a4af50ecd1fb063d9ad3658c07bb81a7a53f452dacbfb2ba", size = 2301214, upload-time = "2026-04-20T14:44:48.792Z" }, - { url = "https://files.pythonhosted.org/packages/fd/86/ef96a4c6e79e7a2d0410826a68fbc0eccc0fd44aa733be199d5fcac3bb87/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed42e6cc8e1b0e2b9b96e2276bad70ae625d10d6d524aed0c93de974ae029f9f", size = 2099927, upload-time = "2026-04-20T14:41:40.196Z" }, - { url = "https://files.pythonhosted.org/packages/6d/53/269caf30e0096e0a8a8f929d1982a27b3879872cca2d917d17c2f9fdf4fe/pydantic_core-2.46.3-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:f1771ce258afb3e4201e67d154edbbae712a76a6081079fe247c2f53c6322c22", size = 2128789, upload-time = "2026-04-20T14:41:15.868Z" }, - { url = "https://files.pythonhosted.org/packages/00/b0/1a6d9b6a587e118482910c244a1c5acf4d192604174132efd12bf0ac486f/pydantic_core-2.46.3-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a7610b6a5242a6c736d8ad47fd5fff87fcfe8f833b281b1c409c3d6835d9227f", size = 2173815, upload-time = "2026-04-20T14:44:25.152Z" }, - { url = "https://files.pythonhosted.org/packages/87/56/e7e00d4041a7e62b5a40815590114db3b535bf3ca0bf4dca9f16cef25246/pydantic_core-2.46.3-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:ff5e7783bcc5476e1db448bf268f11cb257b1c276d3e89f00b5727be86dd0127", size = 2181608, upload-time = "2026-04-20T14:41:28.933Z" }, - { url = "https://files.pythonhosted.org/packages/e8/22/4bd23c3d41f7c185d60808a1de83c76cf5aeabf792f6c636a55c3b1ec7f9/pydantic_core-2.46.3-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:9d2e32edcc143bc01e95300671915d9ca052d4f745aa0a49c48d4803f8a85f2c", size = 2326968, upload-time = "2026-04-20T14:42:03.962Z" }, - { url = "https://files.pythonhosted.org/packages/24/ac/66cd45129e3915e5ade3b292cb3bc7fd537f58f8f8dbdaba6170f7cabb74/pydantic_core-2.46.3-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:6e42d83d1c6b87fa56b521479cff237e626a292f3b31b6345c15a99121b454c1", size = 2369842, upload-time = "2026-04-20T14:41:35.52Z" }, - { url = "https://files.pythonhosted.org/packages/a2/51/dd4248abb84113615473aa20d5545b7c4cd73c8644003b5259686f93996c/pydantic_core-2.46.3-cp314-cp314-win32.whl", hash = "sha256:07bc6d2a28c3adb4f7c6ae46aa4f2d2929af127f587ed44057af50bf1ce0f505", size = 1959661, upload-time = "2026-04-20T14:41:00.042Z" }, - { url = "https://files.pythonhosted.org/packages/20/eb/59980e5f1ae54a3b86372bd9f0fa373ea2d402e8cdcd3459334430f91e91/pydantic_core-2.46.3-cp314-cp314-win_amd64.whl", hash = "sha256:8940562319bc621da30714617e6a7eaa6b98c84e8c685bcdc02d7ed5e7c7c44e", size = 2071686, upload-time = "2026-04-20T14:43:16.471Z" }, - { url = "https://files.pythonhosted.org/packages/8c/db/1cf77e5247047dfee34bc01fa9bca134854f528c8eb053e144298893d370/pydantic_core-2.46.3-cp314-cp314-win_arm64.whl", hash = "sha256:5dcbbcf4d22210ced8f837c96db941bdb078f419543472aca5d9a0bb7cddc7df", size = 2026907, upload-time = "2026-04-20T14:43:31.732Z" }, - { url = "https://files.pythonhosted.org/packages/57/c0/b3df9f6a543276eadba0a48487b082ca1f201745329d97dbfa287034a230/pydantic_core-2.46.3-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:d0fe3dce1e836e418f912c1ad91c73357d03e556a4d286f441bf34fed2dbeecf", size = 2095047, upload-time = "2026-04-20T14:42:37.982Z" }, - { url = "https://files.pythonhosted.org/packages/66/57/886a938073b97556c168fd99e1a7305bb363cd30a6d2c76086bf0587b32a/pydantic_core-2.46.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9ce92e58abc722dac1bf835a6798a60b294e48eb0e625ec9fd994b932ac5feee", size = 1934329, upload-time = "2026-04-20T14:43:49.655Z" }, - { url = "https://files.pythonhosted.org/packages/0b/7c/b42eaa5c34b13b07ecb51da21761297a9b8eb43044c864a035999998f328/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a03e6467f0f5ab796a486146d1b887b2dc5e5f9b3288898c1b1c3ad974e53e4a", size = 1974847, upload-time = "2026-04-20T14:42:10.737Z" }, - { url = "https://files.pythonhosted.org/packages/e6/9b/92b42db6543e7de4f99ae977101a2967b63122d4b6cf7773812da2d7d5b5/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2798b6ba041b9d70acfb9071a2ea13c8456dd1e6a5555798e41ba7b0790e329c", size = 2041742, upload-time = "2026-04-20T14:40:44.262Z" }, - { url = "https://files.pythonhosted.org/packages/0f/19/46fbe1efabb5aa2834b43b9454e70f9a83ad9c338c1291e48bdc4fecf167/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9be3e221bdc6d69abf294dcf7aff6af19c31a5cdcc8f0aa3b14be29df4bd03b1", size = 2236235, upload-time = "2026-04-20T14:41:27.307Z" }, - { url = "https://files.pythonhosted.org/packages/77/da/b3f95bc009ad60ec53120f5d16c6faa8cabdbe8a20d83849a1f2b8728148/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f13936129ce841f2a5ddf6f126fea3c43cd128807b5a59588c37cf10178c2e64", size = 2282633, upload-time = "2026-04-20T14:44:33.271Z" }, - { url = "https://files.pythonhosted.org/packages/cc/6e/401336117722e28f32fb8220df676769d28ebdf08f2f4469646d404c43a3/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28b5f2ef03416facccb1c6ef744c69793175fd27e44ef15669201601cf423acb", size = 2109679, upload-time = "2026-04-20T14:44:41.065Z" }, - { url = "https://files.pythonhosted.org/packages/fc/53/b289f9bc8756a32fe718c46f55afaeaf8d489ee18d1a1e7be1db73f42cc4/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:830d1247d77ad23852314f069e9d7ddafeec5f684baf9d7e7065ed46a049c4e6", size = 2108342, upload-time = "2026-04-20T14:42:50.144Z" }, - { url = "https://files.pythonhosted.org/packages/10/5b/8292fc7c1f9111f1b2b7c1b0dcf1179edcd014fc3ea4517499f50b829d71/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0793c90c1a3c74966e7975eaef3ed30ebdff3260a0f815a62a22adc17e4c01c", size = 2157208, upload-time = "2026-04-20T14:42:08.133Z" }, - { url = "https://files.pythonhosted.org/packages/2b/9e/f80044e9ec07580f057a89fc131f78dda7a58751ddf52bbe05eaf31db50f/pydantic_core-2.46.3-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:d2d0aead851b66f5245ec0c4fb2612ef457f8bbafefdf65a2bf9d6bac6140f47", size = 2167237, upload-time = "2026-04-20T14:42:25.412Z" }, - { url = "https://files.pythonhosted.org/packages/f8/84/6781a1b037f3b96be9227edbd1101f6d3946746056231bf4ac48cdff1a8d/pydantic_core-2.46.3-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:2f40e4246676beb31c5ce77c38a55ca4e465c6b38d11ea1bd935420568e0b1ab", size = 2312540, upload-time = "2026-04-20T14:40:40.313Z" }, - { url = "https://files.pythonhosted.org/packages/3e/db/19c0839feeb728e7df03255581f198dfdf1c2aeb1e174a8420b63c5252e5/pydantic_core-2.46.3-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:cf489cf8986c543939aeee17a09c04d6ffb43bfef8ca16fcbcc5cfdcbed24dba", size = 2369556, upload-time = "2026-04-20T14:41:09.427Z" }, - { url = "https://files.pythonhosted.org/packages/e0/15/3228774cb7cd45f5f721ddf1b2242747f4eb834d0c491f0c02d606f09fed/pydantic_core-2.46.3-cp314-cp314t-win32.whl", hash = "sha256:ffe0883b56cfc05798bf994164d2b2ff03efe2d22022a2bb080f3b626176dd56", size = 1949756, upload-time = "2026-04-20T14:41:25.717Z" }, - { url = "https://files.pythonhosted.org/packages/b8/2a/c79cf53fd91e5a87e30d481809f52f9a60dd221e39de66455cf04deaad37/pydantic_core-2.46.3-cp314-cp314t-win_amd64.whl", hash = "sha256:706d9d0ce9cf4593d07270d8e9f53b161f90c57d315aeec4fb4fd7a8b10240d8", size = 2051305, upload-time = "2026-04-20T14:43:18.627Z" }, - { url = "https://files.pythonhosted.org/packages/0b/db/d8182a7f1d9343a032265aae186eb063fe26ca4c40f256b21e8da4498e89/pydantic_core-2.46.3-cp314-cp314t-win_arm64.whl", hash = "sha256:77706aeb41df6a76568434701e0917da10692da28cb69d5fb6919ce5fdb07374", size = 2026310, upload-time = "2026-04-20T14:41:01.778Z" }, - { url = "https://files.pythonhosted.org/packages/66/7f/03dbad45cd3aa9083fbc93c210ae8b005af67e4136a14186950a747c6874/pydantic_core-2.46.3-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:9715525891ed524a0a1eb6d053c74d4d4ad5017677fb00af0b7c2644a31bae46", size = 2105683, upload-time = "2026-04-20T14:42:19.779Z" }, - { url = "https://files.pythonhosted.org/packages/26/22/4dc186ac8ea6b257e9855031f51b62a9637beac4d68ac06bee02f046f836/pydantic_core-2.46.3-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:9d2f400712a99a013aff420ef1eb9be077f8189a36c1e3ef87660b4e1088a874", size = 1940052, upload-time = "2026-04-20T14:43:59.274Z" }, - { url = "https://files.pythonhosted.org/packages/0d/ca/d376391a5aff1f2e8188960d7873543608130a870961c2b6b5236627c116/pydantic_core-2.46.3-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd2aab0e2e9dc2daf36bd2686c982535d5e7b1d930a1344a7bb6e82baab42a76", size = 1988172, upload-time = "2026-04-20T14:41:17.469Z" }, - { url = "https://files.pythonhosted.org/packages/0e/6b/523b9f85c23788755d6ab949329de692a2e3a584bc6beb67fef5e035aa9d/pydantic_core-2.46.3-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e9d76736da5f362fabfeea6a69b13b7f2be405c6d6966f06b2f6bfff7e64531", size = 2128596, upload-time = "2026-04-20T14:40:41.707Z" }, - { url = "https://files.pythonhosted.org/packages/34/42/f426db557e8ab2791bc7562052299944a118655496fbff99914e564c0a94/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:b12dd51f1187c2eb489af8e20f880362db98e954b54ab792fa5d92e8bcc6b803", size = 2091877, upload-time = "2026-04-20T14:43:27.091Z" }, - { url = "https://files.pythonhosted.org/packages/5c/4f/86a832a9d14df58e663bfdf4627dc00d3317c2bd583c4fb23390b0f04b8e/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:f00a0961b125f1a47af7bcc17f00782e12f4cd056f83416006b30111d941dfa3", size = 1932428, upload-time = "2026-04-20T14:40:45.781Z" }, - { url = "https://files.pythonhosted.org/packages/11/1a/fe857968954d93fb78e0d4b6df5c988c74c4aaa67181c60be7cfe327c0ca/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57697d7c056aca4bbb680200f96563e841a6386ac1129370a0102592f4dddff5", size = 1997550, upload-time = "2026-04-20T14:44:02.425Z" }, - { url = "https://files.pythonhosted.org/packages/17/eb/9d89ad2d9b0ba8cd65393d434471621b98912abb10fbe1df08e480ba57b5/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd35aa21299def8db7ef4fe5c4ff862941a9a158ca7b63d61e66fe67d30416b4", size = 2137657, upload-time = "2026-04-20T14:42:45.149Z" }, - { url = "https://files.pythonhosted.org/packages/1f/da/99d40830684f81dec901cac521b5b91c095394cc1084b9433393cde1c2df/pydantic_core-2.46.3-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:13afdd885f3d71280cf286b13b310ee0f7ccfefd1dbbb661514a474b726e2f25", size = 2107973, upload-time = "2026-04-20T14:42:06.175Z" }, - { url = "https://files.pythonhosted.org/packages/99/a5/87024121818d75bbb2a98ddbaf638e40e7a18b5e0f5492c9ca4b1b316107/pydantic_core-2.46.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f91c0aff3e3ee0928edd1232c57f643a7a003e6edf1860bc3afcdc749cb513f3", size = 1947191, upload-time = "2026-04-20T14:43:14.319Z" }, - { url = "https://files.pythonhosted.org/packages/60/62/0c1acfe10945b83a6a59d19fbaa92f48825381509e5701b855c08f13db76/pydantic_core-2.46.3-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6529d1d128321a58d30afcc97b49e98836542f68dd41b33c2e972bb9e5290536", size = 2123791, upload-time = "2026-04-20T14:43:22.766Z" }, - { url = "https://files.pythonhosted.org/packages/75/3e/3b2393b4c8f44285561dc30b00cf307a56a2eff7c483a824db3b8221ca51/pydantic_core-2.46.3-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:975c267cff4f7e7272eacbe50f6cc03ca9a3da4c4fbd66fffd89c94c1e311aa1", size = 2153197, upload-time = "2026-04-20T14:44:27.932Z" }, - { url = "https://files.pythonhosted.org/packages/ba/75/5af02fb35505051eee727c061f2881c555ab4f8ddb2d42da715a42c9731b/pydantic_core-2.46.3-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:2b8e4f2bbdf71415c544b4b1138b8060db7b6611bc927e8064c769f64bed651c", size = 2181073, upload-time = "2026-04-20T14:43:20.729Z" }, - { url = "https://files.pythonhosted.org/packages/10/92/7e0e1bd9ca3c68305db037560ca2876f89b2647deb2f8b6319005de37505/pydantic_core-2.46.3-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:e61ea8e9fff9606d09178f577ff8ccdd7206ff73d6552bcec18e1033c4254b85", size = 2315886, upload-time = "2026-04-20T14:44:04.826Z" }, - { url = "https://files.pythonhosted.org/packages/b8/d8/101655f27eaf3e44558ead736b2795d12500598beed4683f279396fa186e/pydantic_core-2.46.3-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b504bda01bafc69b6d3c7a0c7f039dcf60f47fab70e06fe23f57b5c75bdc82b8", size = 2360528, upload-time = "2026-04-20T14:40:47.431Z" }, - { url = "https://files.pythonhosted.org/packages/07/0f/1c34a74c8d07136f0d729ffe5e1fdab04fbdaa7684f61a92f92511a84a15/pydantic_core-2.46.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:b00b76f7142fc60c762ce579bd29c8fa44aaa56592dd3c54fab3928d0d4ca6ff", size = 2184144, upload-time = "2026-04-20T14:42:57Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/9d/56/921726b776ace8d8f5db44c4ef961006580d91dc52b803c489fafd1aa249/pydantic_core-2.46.4.tar.gz", hash = "sha256:62f875393d7f270851f20523dd2e29f082bcc82292d66db2b64ea71f64b6e1c1", size = 471464, upload-time = "2026-05-06T13:37:06.98Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/08/f1ba952f1c8ae5581c70fa9c6da89f247b83e3dd8c09c035d5d7931fc23d/pydantic_core-2.46.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a396dcc17e5a0b164dbe026896245a4fa9ff402edca1dff0be3d53a517f74de4", size = 2113146, upload-time = "2026-05-06T13:37:36.537Z" }, + { url = "https://files.pythonhosted.org/packages/56/c6/65f646c7ff09bd257f660434adb45c4dfcbbcebcc030562fecf6f5bf887d/pydantic_core-2.46.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:da4b951fe36dc7c3a1ccb4e3cd1747c3542b8c9ceede8fc86cae054e764485f5", size = 1949769, upload-time = "2026-05-06T13:37:46.365Z" }, + { url = "https://files.pythonhosted.org/packages/64/ba/bfb1d928fd5b49e1258935ff104ae356e9fd89384a55bf9f847e9193ad40/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb63e0198ca18aad131c089b9204c23079c3afa95487e561f4c522d519e55aba", size = 1974958, upload-time = "2026-05-06T13:37:28.611Z" }, + { url = "https://files.pythonhosted.org/packages/4e/74/76223bfb117b64af743c9b6670d1364516f5c0604f96b48f3272f6af6cc6/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f47286a97f0bc9b8859519809077b91b2cefe4ae47fcbf5e466a009c1c5d742b", size = 2042118, upload-time = "2026-05-06T13:36:55.216Z" }, + { url = "https://files.pythonhosted.org/packages/cb/7b/848732968bc8f48f3187542f08358b9d842db564147b256669426ebb1652/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:905a0ed8ea6f2d61c1738835f99b699348d7857379083e5fc497fa0c967a407c", size = 2222876, upload-time = "2026-05-06T13:38:25.455Z" }, + { url = "https://files.pythonhosted.org/packages/b5/2f/e90b63ee2e14bd8d3db8f705a6d75d64e6ee1b7c2c8833747ce706e1e0ce/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea793e075b70290d89d8142074262885d3f7da19634845135751bd6344f73b50", size = 2286703, upload-time = "2026-05-06T13:37:53.304Z" }, + { url = "https://files.pythonhosted.org/packages/ba/1e/acc4d70f88a0a277e4a1fa77ebb985ceabaf900430f875bf9338e11c9420/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:395aebd9183f9d112f569aeb5b2214d1a10a33bec8456447f7fbdfa51d38d4cd", size = 2092042, upload-time = "2026-05-06T13:38:46.981Z" }, + { url = "https://files.pythonhosted.org/packages/a9/da/0a422b57bf8504102bf3c4ccea9c41bab5a5cee6a54650acf8faf67f5a24/pydantic_core-2.46.4-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:b078afbc25f3a1436c7a1d2cd3e322497ee99615ba97c563566fdf46aff1ee01", size = 2117231, upload-time = "2026-05-06T13:39:23.146Z" }, + { url = "https://files.pythonhosted.org/packages/bd/2a/2ac13c3af305843e23c5078c53d135656b3f05a2fd78cb7bbbb12e97b473/pydantic_core-2.46.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f747929cf940cddb5b3668a390056ddd5ba2e5010615ea2dcf4f9c4f3ab8791d", size = 2168388, upload-time = "2026-05-06T13:40:08.06Z" }, + { url = "https://files.pythonhosted.org/packages/72/04/2beacf7e1607e93eefe4aed1b4709f079b905fb77530179d4f7c71745f22/pydantic_core-2.46.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:daa27d92c36f24388fe3ad306b174781c747627f134452e4f128ea00ce1fe8c4", size = 2184769, upload-time = "2026-05-06T13:38:13.901Z" }, + { url = "https://files.pythonhosted.org/packages/9e/29/d2b9fd9f539133548eaf622c06a4ce176cb46ac59f32d0359c4abc0de047/pydantic_core-2.46.4-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:19e51f073cd3df251856a8a4189fbdf1de4012c3ebacfb1884f94f1eb406079f", size = 2319312, upload-time = "2026-05-06T13:39:08.24Z" }, + { url = "https://files.pythonhosted.org/packages/7c/af/0f7a5b85fec6075bea96e3ef9187de38fccced0de92c1e7feda8d5cc7bb9/pydantic_core-2.46.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1747f85cee84c26985853c6f3d9bd3e75da5212912443fa111c113b9c246f39", size = 2361817, upload-time = "2026-05-06T13:38:43.2Z" }, + { url = "https://files.pythonhosted.org/packages/25/a4/73363fec545fd3ec025490bdda2743c56d0dd5b6266b1a53bbe9e4265375/pydantic_core-2.46.4-cp310-cp310-win32.whl", hash = "sha256:2f84c03c8607173d16b5a854ec68a2f9079ae03237a54fb506d13af47e1d018d", size = 1987085, upload-time = "2026-05-06T13:39:25.497Z" }, + { url = "https://files.pythonhosted.org/packages/01/aa/62f082da2c91fac1c234bc9ee0066257ce83f0604abd72e4c9d5991f2d84/pydantic_core-2.46.4-cp310-cp310-win_amd64.whl", hash = "sha256:8358a950c8909158e3df31538a7e4edc2d7265a7c54b47f0864d9e5bae9dcebf", size = 2074311, upload-time = "2026-05-06T13:39:59.922Z" }, + { url = "https://files.pythonhosted.org/packages/5c/fa/6d7708d2cfc1a832acb6aeb0cd16e801902df8a0f583bb3b4b527fde022e/pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:0e96592440881c74a213e5ad528e2b24d3d4f940de2766bed9010ab1d9e51594", size = 2111872, upload-time = "2026-05-06T13:40:27.596Z" }, + { url = "https://files.pythonhosted.org/packages/ae/6f/aa064a3e74b5745afbdf250594f38e7ead05e2d651bcb35994b9417a0d4d/pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0d65b8c354be7fb5f720c3caa8bc940bc2d20ce749c8e06135f07f8ed95dd7c", size = 1948255, upload-time = "2026-05-06T13:39:12.574Z" }, + { url = "https://files.pythonhosted.org/packages/43/3a/41114a9f7569b84b4d84e7a018c57c56347dac30c0d4a872946ec4e36c46/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bfb192b3f4b9e8a89b6277b6ce787564f62cfd272055f6e685726b111dc7826", size = 1972827, upload-time = "2026-05-06T13:38:19.841Z" }, + { url = "https://files.pythonhosted.org/packages/ef/25/1ab42e8048fe551934d9884e8d64daa7e990ad386f310a15981aeb6a5b08/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9037063db01f09b09e237c282b6792bd4da634b5402c4e7f0c61effed7701a04", size = 2041051, upload-time = "2026-05-06T13:38:10.447Z" }, + { url = "https://files.pythonhosted.org/packages/94/c2/1a934597ddf08da410385b3b7aae91956a5a76c635effef456074fad7e88/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc010ab034c8c7452522748bf937df58020d256ccae0874463d1f4d01758af8e", size = 2221314, upload-time = "2026-05-06T13:40:13.089Z" }, + { url = "https://files.pythonhosted.org/packages/02/6d/9e8ad178c9c4df27ad3c8f25d1fe2a7ab0d2ba0559fad4aee5d3d1f16771/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c5dac79fa1614d1e06ca695109c6105923bd9c7d1d6c918d4e637b7e6b32fd3", size = 2285146, upload-time = "2026-05-06T13:38:59.224Z" }, + { url = "https://files.pythonhosted.org/packages/80/50/540cd3aeefc041beb111125c4bff779831a2111fc6b15a9138cda277d32c/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9fa868638bf362d3d138ea55829cefb3d5f4b0d7f142234382a15e2485dbec4", size = 2089685, upload-time = "2026-05-06T13:38:17.762Z" }, + { url = "https://files.pythonhosted.org/packages/6b/a4/b440ad35f05f6a38f89fa0f149accb3f0e02be94ca5e15f3c449a61b4bc9/pydantic_core-2.46.4-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:17299feefe090f2caa5b8e37222bb5f663e4935a8bfa6931d4102e5df1a9f398", size = 2115420, upload-time = "2026-05-06T13:37:58.195Z" }, + { url = "https://files.pythonhosted.org/packages/99/61/de4f55db8dfd57bfdfa9a12ec90fe1b57c4f41062f7ca86f08586b3e0ac0/pydantic_core-2.46.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4c63ebc82684aa89d9a3bcbd13d515b3be44250dc68dd3bd81526c1cb31286c3", size = 2165122, upload-time = "2026-05-06T13:37:01.167Z" }, + { url = "https://files.pythonhosted.org/packages/f7/52/7c529d7bdb2d1068bd52f51fe32572c8301f9a4febf1948f10639f1436f5/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:aaa2a54443eff1950ba5ddc6b6ccda0d9c84a364276a62f969bdf2a390650848", size = 2182573, upload-time = "2026-05-06T13:38:45.04Z" }, + { url = "https://files.pythonhosted.org/packages/37/b3/7c40325848ba78247f2812dcf9c7274e38cd801820ca6dd9fe63bcfb0eb4/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:18e5ceec2ab67e6d5f1a9085e5a24c9c4e2ac4545730bfe668680bca05e555f3", size = 2317139, upload-time = "2026-05-06T13:37:15.539Z" }, + { url = "https://files.pythonhosted.org/packages/d9/37/f913f81a657c865b75da6c0dbed79876073c2a43b5bd9edbe8da785e4d49/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a0f62d0a58f4e7da165457e995725421e0064f2255d8eccebc49f41bbc23b109", size = 2360433, upload-time = "2026-05-06T13:37:30.099Z" }, + { url = "https://files.pythonhosted.org/packages/c4/67/6acaa1be2567f9256b056d8477158cac7240813956ce86e49deae8e173b4/pydantic_core-2.46.4-cp311-cp311-win32.whl", hash = "sha256:041bde0a48fd37cf71cab1c9d56d3e8625a3793fef1f7dd232b3ff37e978ecda", size = 1985513, upload-time = "2026-05-06T13:38:15.669Z" }, + { url = "https://files.pythonhosted.org/packages/aa/e6/c505f83dfeda9a2e5c995cfd872949e4d05e12f7feb3dca72f633daefa94/pydantic_core-2.46.4-cp311-cp311-win_amd64.whl", hash = "sha256:6f2eeda33a839975441c86a4119e1383c50b47faf0cbb5176985565c6bb02c33", size = 2071114, upload-time = "2026-05-06T13:40:35.416Z" }, + { url = "https://files.pythonhosted.org/packages/0f/da/7a263a96d965d9d0df5e8de8a475f33495451117035b09acb110288c381f/pydantic_core-2.46.4-cp311-cp311-win_arm64.whl", hash = "sha256:14f4c5d6db102bd796a627bbb3a17b4cf4574b9ae861d8b7c9a9661c6dd3362d", size = 2044298, upload-time = "2026-05-06T13:38:29.754Z" }, + { url = "https://files.pythonhosted.org/packages/ce/8c/af022f0af448d7747c5154288d46b5f2bc5f17366eaa0e23e9aa04d59f3b/pydantic_core-2.46.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3245406455a5d98187ec35530fd772b1d799b26667980872c8d4614991e2c4a2", size = 2106158, upload-time = "2026-05-06T13:38:57.215Z" }, + { url = "https://files.pythonhosted.org/packages/19/95/6195171e385007300f0f5574592e467c568becce2d937a0b6804f218bc49/pydantic_core-2.46.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:962ccbab7b642487b1d8b7df90ef677e03134cf1fd8880bf698649b22a69371f", size = 1951724, upload-time = "2026-05-06T13:37:02.697Z" }, + { url = "https://files.pythonhosted.org/packages/8e/bc/f47d1ff9cbb1620e1b5b697eef06010035735f07820180e74178226b27b3/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8233f2947cf85404441fd7e0085f53b10c93e0ee78611099b5c7237e36aacbf7", size = 1975742, upload-time = "2026-05-06T13:37:09.448Z" }, + { url = "https://files.pythonhosted.org/packages/5b/11/9b9a5b0306345664a2da6410877af6e8082481b5884b3ddd78d47c6013ce/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a233125ac121aa3ffba9a2b59edfc4a985a76092dc8279586ab4b71390875e7", size = 2052418, upload-time = "2026-05-06T13:37:38.234Z" }, + { url = "https://files.pythonhosted.org/packages/f1/b7/a65fec226f5d78fc39f4a13c4cc0c768c22b113438f60c14adc9d2865038/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b712b53160b79a5850310b912a5ef8e57e56947c8ad690c227f5c9d7e561712", size = 2232274, upload-time = "2026-05-06T13:38:27.753Z" }, + { url = "https://files.pythonhosted.org/packages/68/f0/92039db98b907ef49269a8271f67db9cb78ae2fc68062ef7e4e77adb5f61/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9401557acd873c3a7f3eb9383edef8ac4968f9510e340f4808d427e75667e7b4", size = 2309940, upload-time = "2026-05-06T13:38:05.353Z" }, + { url = "https://files.pythonhosted.org/packages/5f/97/2aab507d3d00ca626e8e57c1eac6a79e4e5fbcc63eb99733ff55d1717f65/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:926c9541b14b12b1681dca8a0b75feb510b06c6341b70a8e500c2fdcff837cce", size = 2094516, upload-time = "2026-05-06T13:39:10.577Z" }, + { url = "https://files.pythonhosted.org/packages/22/37/a8aca44d40d737dde2bc05b3c6c07dff0de07ce6f82e9f3167aeaf4d5dea/pydantic_core-2.46.4-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:56cb4851bcaf3d117eddcef4fe66afd750a50274b0da8e22be256d10e5611987", size = 2136854, upload-time = "2026-05-06T13:40:22.59Z" }, + { url = "https://files.pythonhosted.org/packages/24/99/fcef1b79238c06a8cbec70819ac722ba76e02bc8ada9b0fd66eba40da01b/pydantic_core-2.46.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c68fcd102d71ea85c5b2dfac3f4f8476eff42a9e078fd5faefff6d145063536b", size = 2180306, upload-time = "2026-05-06T13:40:10.666Z" }, + { url = "https://files.pythonhosted.org/packages/ae/6c/fc44000918855b42779d007ae63b0532794739027b2f417321cddbc44f6a/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b2f69dec1725e79a012d920df1707de5caf7ed5e08f3be4435e25803efc47458", size = 2190044, upload-time = "2026-05-06T13:40:43.231Z" }, + { url = "https://files.pythonhosted.org/packages/6b/65/d9cadc9f1920d7a127ad2edba16c1db7916e59719285cd6c94600b0080ba/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:8d0820e8192167f80d88d64038e609c31452eeca865b4e1d9950a27a4609b00b", size = 2329133, upload-time = "2026-05-06T13:39:57.365Z" }, + { url = "https://files.pythonhosted.org/packages/d0/cf/c873d91679f3a30bcf5e7ac280ce5573483e72295307685120d0d5ad3416/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fbdb89b3e1c94a30cc5edfce477c6e6a5dc4d8f84665b455c27582f211a1c72c", size = 2374464, upload-time = "2026-05-06T13:38:06.976Z" }, + { url = "https://files.pythonhosted.org/packages/47/bd/6f2fc8188f31bf10590f1e98e7b306336161fac930a8c514cd7bd828c7dc/pydantic_core-2.46.4-cp312-cp312-win32.whl", hash = "sha256:9aa768456404a8bf48a4406685ac2bec8e72b62c69313734fa3b73cf33b3a894", size = 1974823, upload-time = "2026-05-06T13:40:47.985Z" }, + { url = "https://files.pythonhosted.org/packages/40/8c/985c1d41ea1107c2534abd9870e4ed5c8e7669b5c308297835c001e7a1c4/pydantic_core-2.46.4-cp312-cp312-win_amd64.whl", hash = "sha256:e9c26f834c65f5752f3f06cb08cb86a913ceb7274d0db6e267808a708b46bc89", size = 2072919, upload-time = "2026-05-06T13:39:21.153Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ba/f463d006e0c47373ca7ec5e1a261c59dc01ef4d62b2657af925fb0deee3a/pydantic_core-2.46.4-cp312-cp312-win_arm64.whl", hash = "sha256:4fc73cb559bdb54b1134a706a2802a4cddd27a0633f5abb7e53056268751ac6a", size = 2027604, upload-time = "2026-05-06T13:39:03.753Z" }, + { url = "https://files.pythonhosted.org/packages/51/a2/5d30b469c5267a17b39dec53208222f76a8d351dfac4af661888c5aee77d/pydantic_core-2.46.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5d5902252db0d3cedf8d4a1bc68f70eeb430f7e4c7104c8c476753519b423008", size = 2106306, upload-time = "2026-05-06T13:37:48.029Z" }, + { url = "https://files.pythonhosted.org/packages/c1/81/4fa520eaffa8bd7d1525e644cd6d39e7d60b1592bc5b516693c7340b50f1/pydantic_core-2.46.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c94f0688e7b8d0a67abf40e57a7eaaecd17cc9586706a31b76c031f63df052b4", size = 1951906, upload-time = "2026-05-06T13:37:17.012Z" }, + { url = "https://files.pythonhosted.org/packages/03/d5/fd02da45b659668b05923b17ba3a0100a0a3d5541e3bd8fcc4ecb711309e/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f027324c56cd5406ca49c124b0db10e56c69064fec039acc571c29020cc87c76", size = 1976802, upload-time = "2026-05-06T13:37:35.113Z" }, + { url = "https://files.pythonhosted.org/packages/21/f2/95727e1368be3d3ed485eaab7adbd7dda408f33f7a36e8b48e0144002b91/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e739fee756ba1010f8bcccb534252e85a35fe45ae92c295a06059ce58b74ccd3", size = 2052446, upload-time = "2026-05-06T13:37:12.313Z" }, + { url = "https://files.pythonhosted.org/packages/9c/86/5d99feea3f77c7234b8718075b23db11532773c1a0dbd9b9490215dc2eeb/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d56801be94b86a9da183e5f3766e6310752b99ff647e38b09a9500d88e46e76", size = 2232757, upload-time = "2026-05-06T13:39:01.149Z" }, + { url = "https://files.pythonhosted.org/packages/d2/3a/508ac615935ef7588cf6d9e9b91309fdc2da751af865e02a9098de88258c/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2412e734dcb48da14d4e4006b82b46b74f2518b8a26ee7e58c6844a6cd6d03c4", size = 2309275, upload-time = "2026-05-06T13:37:41.406Z" }, + { url = "https://files.pythonhosted.org/packages/07/f8/41db9de19d7987d6b04715a02b3b40aea467000275d9d758ffaa31af7d50/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9551187363ffc0de2a00b2e47c25aeaeb1020b69b668762966df15fc5659dd5a", size = 2094467, upload-time = "2026-05-06T13:39:18.847Z" }, + { url = "https://files.pythonhosted.org/packages/2c/e2/f35033184cb11d0052daf4416e8e10a502ea2ac006fc4f459aee872727d1/pydantic_core-2.46.4-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:0186750b482eefa11d7f435892b09c5c606193ef3375bcf94aa00ae6bfb66262", size = 2134417, upload-time = "2026-05-06T13:40:17.944Z" }, + { url = "https://files.pythonhosted.org/packages/7e/7b/6ceeb1cc90e193862f444ebe373d8fdf613f0a82572dde03fb10734c6c71/pydantic_core-2.46.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5855698a4856556d86e8e6cd8434bc3ac0314ee8e12089ae0e143f64c6256e4e", size = 2179782, upload-time = "2026-05-06T13:40:32.618Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f2/c8d7773ede6af08036423a00ae0ceffce266c3c52a096c435d68c896083f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:cbaf13819775b7f769bf4a1f066cb6df7a28d4480081a589828ef190226881cd", size = 2188782, upload-time = "2026-05-06T13:36:51.018Z" }, + { url = "https://files.pythonhosted.org/packages/59/31/0c864784e31f09f05cdd87606f08923b9c9e7f6e51dd27f20f62f975ce9f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:633147d34cf4550417f12e2b1a0383973bdf5cdfde212cb09e9a581cf10820be", size = 2328334, upload-time = "2026-05-06T13:40:37.764Z" }, + { url = "https://files.pythonhosted.org/packages/c2/eb/4f6c8a41efa30baa755590f4141abf3a8c370fab610915733e74134a7270/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:82cf5301172168103724d49a1444d3378cb20cdee30b116a1bd6031236298a5d", size = 2372986, upload-time = "2026-05-06T13:39:34.152Z" }, + { url = "https://files.pythonhosted.org/packages/5b/24/b375a480d53113860c299764bfe9f349a3dc9108b3adc0d7f0d786492ebf/pydantic_core-2.46.4-cp313-cp313-win32.whl", hash = "sha256:9fa8ae11da9e2b3126c6426f147e0fba88d96d65921799bb30c6abd1cb2c97fb", size = 1973693, upload-time = "2026-05-06T13:37:55.072Z" }, + { url = "https://files.pythonhosted.org/packages/7e/e8/cff247591966f2d22ec8c003cd7587e27b7ba7b81ab2fb888e3ab75dc285/pydantic_core-2.46.4-cp313-cp313-win_amd64.whl", hash = "sha256:6b3ace8194b0e5204818c92802dcdca7fc6d88aabbb799d7c795540d9cd6d292", size = 2071819, upload-time = "2026-05-06T13:38:49.139Z" }, + { url = "https://files.pythonhosted.org/packages/c6/1a/f4aee670d5670e9e148e0c82c7db98d780be566c6e6a97ee8035528ca0b3/pydantic_core-2.46.4-cp313-cp313-win_arm64.whl", hash = "sha256:184c081504d17f1c1066e430e117142b2c77d9448a97f7b65c6ac9fd9aee238d", size = 2027411, upload-time = "2026-05-06T13:40:45.796Z" }, + { url = "https://files.pythonhosted.org/packages/8d/74/228a26ddad29c6672b805d9fd78e8d251cd04004fa7eed0e622096cd0250/pydantic_core-2.46.4-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:428e04521a40150c85216fc8b85e8d39fece235a9cf5e383761238c7fa9b96fb", size = 2102079, upload-time = "2026-05-06T13:38:41.019Z" }, + { url = "https://files.pythonhosted.org/packages/ad/1f/8970b150a4b4365623ae00fc88603491f763c627311ae8031e3111356d6e/pydantic_core-2.46.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:23ace664830ee0bfe014a0c7bc248b1f7f25ed7ad103852c317624a1083af462", size = 1952179, upload-time = "2026-05-06T13:36:59.812Z" }, + { url = "https://files.pythonhosted.org/packages/95/30/5211a831ae054928054b2f79731661087a2bc5c01e825c672b3a4a8f1b3e/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce5c1d2a8b27468f433ca974829c44060b8097eedc39933e3c206a90ee49c4a9", size = 1978926, upload-time = "2026-05-06T13:37:39.933Z" }, + { url = "https://files.pythonhosted.org/packages/57/e9/689668733b1eb67adeef047db3c2e8788fcf65a7fd9c9e2b46b7744fe245/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7283d57845ecf5a163403eb0702dfc220cc4fbdd18919cb5ccea4f95ee1cdab4", size = 2046785, upload-time = "2026-05-06T13:38:01.995Z" }, + { url = "https://files.pythonhosted.org/packages/60/d9/6715260422ff50a2109878fd24d948a6c3446bb2664f34ee78cd972b3acd/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8daafc69c93ee8a0204506a3b6b30f586ef54028f52aeeeb5c4cfc5184fd5914", size = 2228733, upload-time = "2026-05-06T13:40:50.371Z" }, + { url = "https://files.pythonhosted.org/packages/18/ae/fdb2f64316afca925640f8e70bb1a564b0ec2721c1389e25b8eb4bf9a299/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2213145bcc2ba85884d0ac63d222fece9209678f77b9b4d76f054c561adb28", size = 2307534, upload-time = "2026-05-06T13:37:21.531Z" }, + { url = "https://files.pythonhosted.org/packages/89/1d/8eff589b45bb8190a9d12c49cfad0f176a5cbd1534908a6b5125e2886239/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a5f930472650a82629163023e630d160863fce524c616f4e5186e5de9d9a49b", size = 2099732, upload-time = "2026-05-06T13:39:31.942Z" }, + { url = "https://files.pythonhosted.org/packages/06/d5/ee5a3366637fee41dee51a1fc91562dcf12ddbc68fda34e6b253da2324bb/pydantic_core-2.46.4-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:c1b3f518abeca3aa13c712fd202306e145abf59a18b094a6bafb2d2bbf59192c", size = 2129627, upload-time = "2026-05-06T13:37:25.033Z" }, + { url = "https://files.pythonhosted.org/packages/94/33/2414be571d2c6a6c4d08be21f9292b6d3fdb08949a97b6dfe985017821db/pydantic_core-2.46.4-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a7dd0b3ee80d90150e3495a3a13ac34dbcbfd4f012996a6a1d8900e91b5c0fb", size = 2179141, upload-time = "2026-05-06T13:37:14.046Z" }, + { url = "https://files.pythonhosted.org/packages/7b/79/7daa95be995be0eecc4cf75064cb33f9bbbfe3fe0158caf2f0d4a996a5c7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:3fb702cd90b0446a3a1c5e470bfa0dd23c0233b676a9099ddcc964fa6ca13898", size = 2184325, upload-time = "2026-05-06T13:36:53.615Z" }, + { url = "https://files.pythonhosted.org/packages/9f/cb/d0a382f5c0de8a222dc61c65348e0ce831b1f68e0a018450d31c2cace3a5/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:b8458003118a712e66286df6a707db01c52c0f52f7db8e4a38f0da1d3b94fc4e", size = 2323990, upload-time = "2026-05-06T13:40:29.971Z" }, + { url = "https://files.pythonhosted.org/packages/05/db/d9ba624cc4a5aced1598e88c04fdbd8310c8a69b9d38b9a3d39ce3a61ed7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:372429a130e469c9cd698925ce5fc50940b7a1336b0d82038e63d5bbc4edc519", size = 2369978, upload-time = "2026-05-06T13:37:23.027Z" }, + { url = "https://files.pythonhosted.org/packages/f2/20/d15df15ba918c423461905802bfd2981c3af0bfa0e40d05e13edbfa48bc3/pydantic_core-2.46.4-cp314-cp314-win32.whl", hash = "sha256:85bb3611ff1802f3ee7fdd7dbff26b56f343fb432d57a4728fdd49b6ef35e2f4", size = 1966354, upload-time = "2026-05-06T13:38:03.499Z" }, + { url = "https://files.pythonhosted.org/packages/fc/b6/6b8de4c0a7d7ab3004c439c80c5c1e0a3e8d78bbae19379b01960383d9e5/pydantic_core-2.46.4-cp314-cp314-win_amd64.whl", hash = "sha256:811ff8e9c313ab425368bcbb36e5c4ebd7108c2bbf4e4089cfbb0b01eff63fac", size = 2072238, upload-time = "2026-05-06T13:39:40.807Z" }, + { url = "https://files.pythonhosted.org/packages/32/36/51eb763beec1f4cf59b1db243a7dcc39cbb41230f050a09b9d69faaf0a48/pydantic_core-2.46.4-cp314-cp314-win_arm64.whl", hash = "sha256:bfec22eab3c8cc2ceec0248aec886624116dc079afa027ecc8ad4a7e62010f8a", size = 2018251, upload-time = "2026-05-06T13:37:26.72Z" }, + { url = "https://files.pythonhosted.org/packages/e8/91/855af51d625b23aa987116a19e231d2aaef9c4a415273ddc189b79a45fee/pydantic_core-2.46.4-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:af8244b2bef6aaad6d92cda81372de7f8c8d36c9f0c3ea36e827c60e7d9467a0", size = 2099593, upload-time = "2026-05-06T13:39:47.682Z" }, + { url = "https://files.pythonhosted.org/packages/fb/1b/8784a54c65edb5f49f0a14d6977cf1b209bba85a4c77445b255c2de58ab3/pydantic_core-2.46.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5a4330cdbc57162e4b3aa303f588ba752257694c9c9be3e7ebb11b4aca659b5d", size = 1935226, upload-time = "2026-05-06T13:40:40.428Z" }, + { url = "https://files.pythonhosted.org/packages/e8/e7/1955d28d1afc56dd4b3ad7cc0cf39df1b9852964cf16e5d13912756d6d6b/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29c61fc04a3d840155ff08e475a04809278972fe6aef51e2720554e96367e34b", size = 1974605, upload-time = "2026-05-06T13:37:32.029Z" }, + { url = "https://files.pythonhosted.org/packages/93/e2/3fedbf0ba7a22850e6e9fd78117f1c0f10f950182344d8a6c535d468fdd8/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c50f2528cf200c5eed56faf3f4e22fcd5f38c157a8b78576e6ba3168ec35f000", size = 2030777, upload-time = "2026-05-06T13:38:55.239Z" }, + { url = "https://files.pythonhosted.org/packages/f8/61/46be275fcaaba0b4f5b9669dd852267ce1ff616592dccf7a7845588df091/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cbe8b01f948de4286c74cdd6c667aceb38f5c1e26f0693b3983d9d74887c65e", size = 2236641, upload-time = "2026-05-06T13:37:08.096Z" }, + { url = "https://files.pythonhosted.org/packages/60/db/12e93e46a8bac9988be3c016860f83293daea8c716c029c9ace279036f2f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:617d7e2ca7dcb8c5cf6bcb8c59b8832c94b36196bbf1cbd1bfb56ed341905edd", size = 2286404, upload-time = "2026-05-06T13:40:20.221Z" }, + { url = "https://files.pythonhosted.org/packages/e2/4a/4d8b19008f38d31c53b8219cfedc2e3d5de5fe99d90076b7e767de29274f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7027560ee92211647d0d34e3f7cd6f50da56399d26a9c8ad0da286d3869a53f3", size = 2109219, upload-time = "2026-05-06T13:38:12.153Z" }, + { url = "https://files.pythonhosted.org/packages/88/70/3cbc40978fefb7bb09c6708d40d4ad1a5d70fd7213c3d17f971de868ec1f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:f99626688942fb746e545232e7726926f3be91b5975f8b55327665fafda991c7", size = 2110594, upload-time = "2026-05-06T13:40:02.971Z" }, + { url = "https://files.pythonhosted.org/packages/9d/20/b8d36736216e29491125531685b2f9e61aa5b4b2599893f8268551da3338/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fc3e9034a63de20e15e8ade85358bc6efc614008cab72898b4b4952bea0509ff", size = 2159542, upload-time = "2026-05-06T13:39:27.506Z" }, + { url = "https://files.pythonhosted.org/packages/1d/a2/367df868eb584dacf6bf82a389272406d7178e301c4ac82545ab98bc2dd9/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:97e7cf2be5c77b7d1a9713a05605d49460d02c6078d38d8bef3cbe323c548424", size = 2168146, upload-time = "2026-05-06T13:38:31.93Z" }, + { url = "https://files.pythonhosted.org/packages/c1/b8/4460f77f7e201893f649a29ab355dddd3beee8a97bcb1a320db414f9a06e/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:3bf92c5d0e00fefaab325a4d27828fe6b6e2a21848686b5b60d2d9eeb09d76c6", size = 2306309, upload-time = "2026-05-06T13:37:44.717Z" }, + { url = "https://files.pythonhosted.org/packages/64/c4/be2639293acd87dc8ddbcec41a73cee9b2ebf996fe6d892a1a74e88ad3f7/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:3ecbc122d18468d06ca279dc26a8c2e2d5acb10943bb35e36ae92096dc3b5565", size = 2369736, upload-time = "2026-05-06T13:37:05.645Z" }, + { url = "https://files.pythonhosted.org/packages/30/a6/9f9f380dbb301f67023bf8f707aaa75daadf84f7152d95c410fd7e81d994/pydantic_core-2.46.4-cp314-cp314t-win32.whl", hash = "sha256:e846ae7835bf0703ae43f534ab79a867146dadd59dc9ca5c8b53d5c8f7c9ef02", size = 1955575, upload-time = "2026-05-06T13:38:51.116Z" }, + { url = "https://files.pythonhosted.org/packages/40/1f/f1eb9eb350e795d1af8586289746f5c5677d16043040d63710e22abc43c9/pydantic_core-2.46.4-cp314-cp314t-win_amd64.whl", hash = "sha256:2108ba5c1c1eca18030634489dc544844144ee36357f2f9f780b93e7ddbb44b5", size = 2051624, upload-time = "2026-05-06T13:38:21.672Z" }, + { url = "https://files.pythonhosted.org/packages/f6/d2/42dd53d0a85c27606f316d3aa5d2869c4e8470a5ed6dec30e4a1abe19192/pydantic_core-2.46.4-cp314-cp314t-win_arm64.whl", hash = "sha256:4fcbe087dbc2068af7eda3aa87634eba216dbda64d1ae73c8684b621d33f6596", size = 2017325, upload-time = "2026-05-06T13:40:52.723Z" }, + { url = "https://files.pythonhosted.org/packages/ee/a4/73995fd4ebbb46ba0ee51e6fa049b8f02c40daebb762208feda8a6b7894d/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:14d4edf427bdcf950a8a02d7cb44a08614388dd6e1bdcbf4f67504fa7887da9c", size = 2111589, upload-time = "2026-05-06T13:37:10.817Z" }, + { url = "https://files.pythonhosted.org/packages/fb/7f/f37d3a5e8bfcc2e403f5c57a730f2d815693fb42119e8ea48b3789335af1/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:0ce40cd7b21210e99342afafbd4d0f76d784eb5b1d60f3bdc566be4983c6c73b", size = 1944552, upload-time = "2026-05-06T13:36:56.717Z" }, + { url = "https://files.pythonhosted.org/packages/15/3c/d7eb777b3ff43e8433a4efb39a17aa8fd98a4ee8561a24a67ef5db07b2d6/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90884113d8b48f760e9587002789ddd741e76ab9f89518cd1e43b1f1a52ec44b", size = 1982984, upload-time = "2026-05-06T13:39:06.207Z" }, + { url = "https://files.pythonhosted.org/packages/63/87/70b9f40170a81afd55ca26c9b2acb25c20d64bcfbf888fafecb3ba077d4c/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66ce7632c22d837c95301830e111ad0128a32b8207533b60896a96c4915192ea", size = 2138417, upload-time = "2026-05-06T13:39:45.476Z" }, + { url = "https://files.pythonhosted.org/packages/9d/1d/8987ad40f65ae1432753072f214fb5c74fe47ffbd0698bb9cbbb585664f8/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:1d8ba486450b14f3b1d63bc521d410ec7565e52f887b9fb671791886436a42f7", size = 2095527, upload-time = "2026-05-06T13:39:52.283Z" }, + { url = "https://files.pythonhosted.org/packages/64/d3/84c282a7eee1d3ac4c0377546ef5a1ea436ce26840d9ac3b7ed54a377507/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:3009f12e4e90b7f88b4f9adb1b0c4a3d58fe7820f3238c190047209d148026df", size = 1936024, upload-time = "2026-05-06T13:40:15.671Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ca/eac61596cdeb4d7e174d3dc0bd8a6238f14f75f97a24e7b7db4c7e7340a0/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad785e92e6dc634c21555edc8bd6b64957ab844541bcb96a1366c202951ae526", size = 1990696, upload-time = "2026-05-06T13:38:34.717Z" }, + { url = "https://files.pythonhosted.org/packages/fa/c3/7c8b240552251faf6b3a957db200fcfbbcec36763c050428b601e0c9b83b/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00c603d540afdd6b80eb39f078f33ebd46211f02f33e34a32d9f053bba711de0", size = 2147590, upload-time = "2026-05-06T13:39:29.883Z" }, + { url = "https://files.pythonhosted.org/packages/11/cb/428de0385b6c8d44b716feba566abfacfbd23ee3c4439faa789a1456242f/pydantic_core-2.46.4-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0c563b08bca408dc7f65f700633d8442fffb2421fc47b8101377e9fd65051ff0", size = 2112782, upload-time = "2026-05-06T13:37:04.016Z" }, + { url = "https://files.pythonhosted.org/packages/0b/b5/6a17bdadd0fc1f170adfd05a20d37c832f52b117b4d9131da1f41bb097ce/pydantic_core-2.46.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:db06ffe51636ffe9ca531fe9023dd64bdd794be8754cb5df57c5498ae5b518a7", size = 1952146, upload-time = "2026-05-06T13:39:43.092Z" }, + { url = "https://files.pythonhosted.org/packages/2a/dc/03734d80e362cd43ef65428e9de77c730ce7f2f11c60d2b1e1b39f0fbf99/pydantic_core-2.46.4-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:133878133d271ade3d41d1bfb2a45ec38dbdbda40bc065921c6b04e4630127e2", size = 2134492, upload-time = "2026-05-06T13:36:58.124Z" }, + { url = "https://files.pythonhosted.org/packages/de/df/5e5ffc085ed07cc22d298134d3d911c63e91f6a0eb91fe646750a3209910/pydantic_core-2.46.4-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9bc519fbf2b7578398853d815009ae5e4d4603d12f4e3f91da8c06852d3da3e9", size = 2156604, upload-time = "2026-05-06T13:37:49.88Z" }, + { url = "https://files.pythonhosted.org/packages/81/44/6e112a4253e56f5705467cbab7ab5e91ee7398ba3d56d358635958893d3e/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:c7a7bd4e39e8e4c12c39cd480356842b6a8a06e41b23a55a5e3e191718838ddf", size = 2183828, upload-time = "2026-05-06T13:37:43.053Z" }, + { url = "https://files.pythonhosted.org/packages/ac/ad/5565071e937d8e752842ac241463944c9eb14c87e2d269f2658a5bd05e98/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:d396ec2b979760aaf3218e76c24e65bd0aca24983298653b3a9d7a45f9e47b30", size = 2310000, upload-time = "2026-05-06T13:37:56.694Z" }, + { url = "https://files.pythonhosted.org/packages/4f/c3/66883a5cec183e7fba4d024b4cbbe61851a63750ef606b0afecc46d1f2bf/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:86e1a4418c6cd97d60c95c71164158eaf7324fae7b0923264016baa993eba6fc", size = 2361286, upload-time = "2026-05-06T13:40:05.667Z" }, + { url = "https://files.pythonhosted.org/packages/4b/2d/69abac8f838090bbecd5df894befb2c2619e7996a98ddb949db9f3b93225/pydantic_core-2.46.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:d51026d73fcfd93610abc7b27789c26b313920fcfb20e27462d74a7f8b06e983", size = 2193071, upload-time = "2026-05-06T13:38:08.682Z" }, ] [[package]] name = "pydantic-settings" -version = "2.14.0" +version = "2.14.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, { name = "python-dotenv" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/42/98/c8345dccdc31de4228c039a98f6467a941e39558da41c1744fbe29fa5666/pydantic_settings-2.14.0.tar.gz", hash = "sha256:24285fd4b0e0c06507dd9fdfd331ee23794305352aaec8fc4eb92d4047aeb67d", size = 235709, upload-time = "2026-04-20T13:37:40.293Z" } +sdist = { url = "https://files.pythonhosted.org/packages/07/60/1d1e59c9c90d54591469ada7d268251f71c24bdb765f1a8a832cee8c6653/pydantic_settings-2.14.1.tar.gz", hash = "sha256:e874d3bec7e787b0c9958277956ed9b4dd5de6a80e162188fdaff7c5e26fd5fa", size = 235551, upload-time = "2026-05-08T13:40:06.542Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/01/dd/bebff3040138f00ae8a102d426b27349b9a49acc310fcae7f92112d867e3/pydantic_settings-2.14.0-py3-none-any.whl", hash = "sha256:fc8d5d692eb7092e43c8647c1c35a3ecd00e040fcf02ed86f4cb5458ca62182e", size = 60940, upload-time = "2026-04-20T13:37:38.586Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl", hash = "sha256:6e3c7edfd8277687cdc598f56e5cff0e9bfff0910a3749deaa8d4401c3a2b9de", size = 60964, upload-time = "2026-05-08T13:40:04.958Z" }, ] [[package]] @@ -690,14 +744,14 @@ wheels = [ [[package]] name = "pyjwt" -version = "2.12.1" +version = "2.13.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c2/27/a3b6e5bf6ff856d2509292e95c8f57f0df7017cf5394921fc4e4ef40308a/pyjwt-2.12.1.tar.gz", hash = "sha256:c74a7a2adf861c04d002db713dd85f84beb242228e671280bf709d765b03672b", size = 102564, upload-time = "2026-03-13T19:27:37.25Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3b/81/58d0ac84e1ef3a3843791d6954d94c0b33d526c75eeb1efbce9d0a4c4077/pyjwt-2.13.0.tar.gz", hash = "sha256:41571c89ca91598c79e8ef18a2d07367d4810fbbd6f637794879baf1b7703423", size = 107515, upload-time = "2026-05-21T19:54:36.618Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/7a/8dd906bd22e79e47397a61742927f6747fe93242ef86645ee9092e610244/pyjwt-2.12.1-py3-none-any.whl", hash = "sha256:28ca37c070cad8ba8cd9790cd940535d40274d22f80ab87f3ac6a713e6e8454c", size = 29726, upload-time = "2026-03-13T19:27:35.677Z" }, + { url = "https://files.pythonhosted.org/packages/a3/5e/ecf12fdb62546d64385c158514e9b2b671f7832108ef2ecd2020ce0af2d1/pyjwt-2.13.0-py3-none-any.whl", hash = "sha256:66adcc2aff09b3f1bbd95fc1e1577df8ac8723c978552fd43304c8a290ac5728", size = 31274, upload-time = "2026-05-21T19:54:35.362Z" }, ] [[package]] @@ -741,27 +795,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.15.12" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/99/43/3291f1cc9106f4c63bdce7a8d0df5047fe8422a75b091c16b5e9355e0b11/ruff-0.15.12.tar.gz", hash = "sha256:ecea26adb26b4232c0c2ca19ccbc0083a68344180bba2a600605538ce51a40a6", size = 4643852, upload-time = "2026-04-24T18:17:14.305Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c3/6e/e78ffb61d4686f3d96ba3df2c801161843746dcbcbb17a1e927d4829312b/ruff-0.15.12-py3-none-linux_armv6l.whl", hash = "sha256:f86f176e188e94d6bdbc09f09bfd9dc729059ad93d0e7390b5a73efe19f8861c", size = 10640713, upload-time = "2026-04-24T18:17:22.841Z" }, - { url = "https://files.pythonhosted.org/packages/ae/08/a317bc231fb9e7b93e4ef3089501e51922ff88d6936ce5cf870c4fe55419/ruff-0.15.12-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:e3bcd123364c3770b8e1b7baaf343cc99a35f197c5c6e8af79015c666c423a6c", size = 11069267, upload-time = "2026-04-24T18:17:30.105Z" }, - { url = "https://files.pythonhosted.org/packages/aa/a4/f828e9718d3dce1f5f11c39c4f65afd32783c8b2aebb2e3d259e492c47bd/ruff-0.15.12-py3-none-macosx_11_0_arm64.whl", hash = "sha256:fe87510d000220aa1ed530d4448a7c696a0cae1213e5ec30e5874287b66557b5", size = 10397182, upload-time = "2026-04-24T18:17:07.177Z" }, - { url = "https://files.pythonhosted.org/packages/71/e0/3310fc6d1b5e1fdea22bf3b1b807c7e187b581021b0d7d4514cccdb5fb71/ruff-0.15.12-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84a1630093121375a3e2a95b4a6dc7b59e2b4ee76216e32d81aae550a832d002", size = 10758012, upload-time = "2026-04-24T18:16:55.759Z" }, - { url = "https://files.pythonhosted.org/packages/11/c1/a606911aee04c324ddaa883ae418f3569792fd3c4a10c50e0dd0a2311e1e/ruff-0.15.12-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fb129f40f114f089ebe0ca56c0d251cf2061b17651d464bb6478dc01e69f11f5", size = 10447479, upload-time = "2026-04-24T18:16:51.677Z" }, - { url = "https://files.pythonhosted.org/packages/9d/68/4201e8444f0894f21ab4aeeaee68aa4f10b51613514a20d80bd628d57e88/ruff-0.15.12-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0c862b172d695db7598426b8af465e7e9ac00a3ea2a3630ee67eb82e366aaa6", size = 11234040, upload-time = "2026-04-24T18:17:16.529Z" }, - { url = "https://files.pythonhosted.org/packages/34/ff/8a6d6cf4ccc23fd67060874e832c18919d1557a0611ebef03fdb01fff11e/ruff-0.15.12-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2849ea9f3484c3aca43a82f484210370319e7170df4dfe4843395ddf6c57bc33", size = 12087377, upload-time = "2026-04-24T18:17:04.944Z" }, - { url = "https://files.pythonhosted.org/packages/85/f6/c669cf73f5152f623d34e69866a46d5e6185816b19fcd5b6dd8a2d299922/ruff-0.15.12-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e77c7e51c07fe396826d5969a5b846d9cd4c402535835fb6e21ce8b28fef847", size = 11367784, upload-time = "2026-04-24T18:17:25.409Z" }, - { url = "https://files.pythonhosted.org/packages/e8/39/c61d193b8a1daaa8977f7dea9e8d8ba866e02ea7b65d32f6861693aa4c12/ruff-0.15.12-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83b2f4f2f3b1026b5fb449b467d9264bf22067b600f7b6f41fc5958909f449d0", size = 11344088, upload-time = "2026-04-24T18:17:12.258Z" }, - { url = "https://files.pythonhosted.org/packages/c2/8d/49afab3645e31e12c590acb6d3b5b69d7aab5b81926dbaf7461f9441f37a/ruff-0.15.12-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:9ba3b8f1afd7e2e43d8943e55f249e13f9682fde09711644a6e7290eb4f3e339", size = 11271770, upload-time = "2026-04-24T18:17:02.457Z" }, - { url = "https://files.pythonhosted.org/packages/46/06/33f41fe94403e2b755481cdfb9b7ef3e4e0ed031c4581124658d935d52b4/ruff-0.15.12-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e852ba9fdc890655e1d78f2df1499efbe0e54126bd405362154a75e2bde159c5", size = 10719355, upload-time = "2026-04-24T18:17:27.648Z" }, - { url = "https://files.pythonhosted.org/packages/0d/59/18aa4e014debbf559670e4048e39260a85c7fcee84acfd761ac01e7b8d35/ruff-0.15.12-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:dd8aed930da53780d22fc70bdf84452c843cf64f8cb4eb38984319c24c5cd5fd", size = 10462758, upload-time = "2026-04-24T18:17:32.347Z" }, - { url = "https://files.pythonhosted.org/packages/25/e7/cc9f16fd0f3b5fddcbd7ec3d6ae30c8f3fde1047f32a4093a98d633c6570/ruff-0.15.12-py3-none-musllinux_1_2_i686.whl", hash = "sha256:01da3988d225628b709493d7dc67c3b9b12c0210016b08690ef9bd27970b262b", size = 10953498, upload-time = "2026-04-24T18:17:20.674Z" }, - { url = "https://files.pythonhosted.org/packages/72/7a/a9ba7f98c7a575978698f4230c5e8cc54bbc761af34f560818f933dafa0c/ruff-0.15.12-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:9cae0f92bd5700d1213188b31cd3bdd2b315361296d10b96b8e2337d3d11f53e", size = 11447765, upload-time = "2026-04-24T18:17:09.755Z" }, - { url = "https://files.pythonhosted.org/packages/ea/f9/0ae446942c846b8266059ad8a30702a35afae55f5cdc54c5adf8d7afdc27/ruff-0.15.12-py3-none-win32.whl", hash = "sha256:d0185894e038d7043ba8fd6aee7499ece6462dc0ea9f1e260c7451807c714c20", size = 10657277, upload-time = "2026-04-24T18:17:18.591Z" }, - { url = "https://files.pythonhosted.org/packages/33/f1/9614e03e1cdcbf9437570b5400ced8a720b5db22b28d8e0f1bda429f660d/ruff-0.15.12-py3-none-win_amd64.whl", hash = "sha256:c87a162d61ab3adca47c03f7f717c68672edec7d1b5499e652331780fe74950d", size = 11837758, upload-time = "2026-04-24T18:17:00.113Z" }, - { url = "https://files.pythonhosted.org/packages/c0/98/6beb4b351e472e5f4c4613f7c35a5290b8be2497e183825310c4c3a3984b/ruff-0.15.12-py3-none-win_arm64.whl", hash = "sha256:a538f7a82d061cee7be55542aca1d86d1393d55d81d4fcc314370f4340930d4f", size = 11120821, upload-time = "2026-04-24T18:16:57.979Z" }, +version = "0.15.15" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/84/6f/a76f7d96e5c962f5b69cee865e49c15c1116897c01990faa8a57edb62e7f/ruff-0.15.15.tar.gz", hash = "sha256:b8dff018130b46d8e5bf0f926ef6b60cf871d6d5ae45fc9334e09632daa741d6", size = 4706985, upload-time = "2026-05-28T14:16:57.784Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/9d/3a45c05b8ab04b4705989de70a79008e27c8003296a0feaee9edc18dd7e9/ruff-0.15.15-py3-none-linux_armv6l.whl", hash = "sha256:cf93e5388f412e1b108b1f8b34a6e036b70fe8aff89393befad96fe48670311b", size = 10710652, upload-time = "2026-05-28T14:16:06.701Z" }, + { url = "https://files.pythonhosted.org/packages/05/66/da974431624bf3b49f6ee1f9543c02d929ff1cba78b0d5a79c38cf21f744/ruff-0.15.15-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ac5a646d1f6a7dadd5d50842dae2c1f9862ac887ef5d1b1375e02def791fde6e", size = 11096615, upload-time = "2026-05-28T14:16:23.313Z" }, + { url = "https://files.pythonhosted.org/packages/8c/09/7443452e5d290230a712103f2fdceeef7184f3ec99a2bd01c8be78aaceb5/ruff-0.15.15-py3-none-macosx_11_0_arm64.whl", hash = "sha256:77d955a431430c66f72dd94e379ad38a16daea3d25094872ac4edf9e797be530", size = 10436683, upload-time = "2026-05-28T14:16:40.974Z" }, + { url = "https://files.pythonhosted.org/packages/53/01/d330c26a57fa4f3943a14424904027428315b700fe4d14a84bb123a649e5/ruff-0.15.15-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7614ee79c69788cf6cedd568069ade9cecc22a1ad20494efe8d0c9ebb4b622d4", size = 10769064, upload-time = "2026-05-28T14:16:28.905Z" }, + { url = "https://files.pythonhosted.org/packages/1d/85/cc8770f8bdff541b1da8392d1634141fe4a0e3f4ee596605959b7906c27f/ruff-0.15.15-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3cdb1679e06a1f6b47bc384714ae96f6e2fb65ca441eb78c43d2ca554176ce1f", size = 10511987, upload-time = "2026-05-28T14:16:43.732Z" }, + { url = "https://files.pythonhosted.org/packages/7c/29/8c190c1472b63013583ba391f3342036e02010544c1270455ed8e519bdf3/ruff-0.15.15-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2728b93d7b23a603ea2c0ac6eb73d760bd38ec9de35f35fb41e18f7a3fee7622", size = 11275100, upload-time = "2026-05-28T14:16:55.244Z" }, + { url = "https://files.pythonhosted.org/packages/9f/6b/7e145ce2cc8e63d6834eca03d83a0e18d121def5c69f91b4cf4011ed4879/ruff-0.15.15-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be582fcc0db438902c7792b08d6ddf6c9b9e21addaa10092c2c741cfb09e5a45", size = 12176903, upload-time = "2026-05-28T14:16:14.368Z" }, + { url = "https://files.pythonhosted.org/packages/80/a3/d5974637f68e451f7fadf015cf3101d1cd7d8ba5027cffe0b9e3826ebe6b/ruff-0.15.15-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7aa77465b8ecaf1a27bea098d696f7fed5e1eccbd10b321b682d6de586ae5627", size = 11404550, upload-time = "2026-05-28T14:16:20.138Z" }, + { url = "https://files.pythonhosted.org/packages/fe/1c/e6e5e568f22be4fb05d6244234aba384c06b451252453b821e1a529263cf/ruff-0.15.15-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48decfa11d740de4889de623be1463308346312f2409a56e24aa280c86162dc4", size = 11382027, upload-time = "2026-05-28T14:16:46.615Z" }, + { url = "https://files.pythonhosted.org/packages/1d/01/170921b49fcd2e8858825593f91cf7146c3e40a5c3e6df763e4bb0484dde/ruff-0.15.15-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:a5015088452ca0081387063649ec67f06d3d1d6b8b936a1f836b5e9657ecd48c", size = 11366041, upload-time = "2026-05-28T14:16:26.247Z" }, + { url = "https://files.pythonhosted.org/packages/87/54/a7bad711d7de93254e15e06a4c375b89a03d18de45d3e5dcc86a4472fb1a/ruff-0.15.15-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:f5294aab6356c81600fcdea3a62bb1b924dfd5e91767c12318d3f68f86af57cd", size = 10741795, upload-time = "2026-05-28T14:16:17.11Z" }, + { url = "https://files.pythonhosted.org/packages/c9/31/38c075963668f8b41c6914ee0f6f318727fbe30ab9145cb29e6df464c5fa/ruff-0.15.15-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:db5bd4d802415cca656dc1616070b725952d6ae95eb5d4831e49fbd94a38f75f", size = 10511117, upload-time = "2026-05-28T14:16:31.767Z" }, + { url = "https://files.pythonhosted.org/packages/9d/96/6ff689e1f7e375d1d97075eca022f74c2bab59554a432fe4d2e6f091986a/ruff-0.15.15-py3-none-musllinux_1_2_i686.whl", hash = "sha256:587a6278ed42059191c1a466e490bd7930fb50bd2e255398bc29616c895a61cb", size = 10994867, upload-time = "2026-05-28T14:16:35.149Z" }, + { url = "https://files.pythonhosted.org/packages/c3/c2/5dce0ab9f92a8d534fa62b9bf9caca3eddb8c1a81b616f5e195ada4f0d6e/ruff-0.15.15-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:df0c1c084f5f4be9812f61518a45c440d3c30d69ce4bf6c5270e66d38338f02a", size = 11482101, upload-time = "2026-05-28T14:16:49.598Z" }, + { url = "https://files.pythonhosted.org/packages/b1/c0/1003b60edd697c649faf61f1a34094b1abb38fb3d1181e3f895781250a08/ruff-0.15.15-py3-none-win32.whl", hash = "sha256:29428ea79694afbe756d45fd59b36f22b6b020dc0443cf7de0173046236964b9", size = 10716774, upload-time = "2026-05-28T14:16:52.337Z" }, + { url = "https://files.pythonhosted.org/packages/02/a8/1269eddd6945a06c23f055ef7848886e37cf9d6a8bebb386a3115f01470c/ruff-0.15.15-py3-none-win_amd64.whl", hash = "sha256:8df0323902e15e24bc4bf246da830573d3cf3352bd0b9a164eab335d111ff4a4", size = 11868463, upload-time = "2026-05-28T14:16:11.333Z" }, + { url = "https://files.pythonhosted.org/packages/4e/b2/920464c907b191e37469d477a1aa8bc048b8f36c4c1610dfa4ab87b39e18/ruff-0.15.15-py3-none-win_arm64.whl", hash = "sha256:3c8ceca6792f38196b8f589bc92eccd03eef286602da92e5dc05cc42ef6441b7", size = 11138498, upload-time = "2026-05-28T14:16:38.425Z" }, ] [[package]] @@ -827,6 +881,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, ] +[[package]] +name = "types-protobuf" +version = "7.34.1.20260518" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/29/59/e2b13b499d15e6720150c4b1a8d91e31fcacf716b432397475b3151ff7e4/types_protobuf-7.34.1.20260518.tar.gz", hash = "sha256:28cfaded25889cb83ebfb63cfb0a43628f0b6f3785767bec17287dc6468795f2", size = 68936, upload-time = "2026-05-18T06:01:47.332Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/1f/ec5caf72c2e3b688ca3927e0979a04ddad19e1afc4bf1c199bd743e0f419/types_protobuf-7.34.1.20260518-py3-none-any.whl", hash = "sha256:a0a5337413347166439c0e07cbc26c6164d091401c6f01b1dfd8cdb966c4dd8f", size = 85992, upload-time = "2026-05-18T06:01:45.696Z" }, +] + [[package]] name = "typing-extensions" version = "4.15.0" From 8b4c88e6ea97aebff1e0d2b8e0b2fa35e32701e6 Mon Sep 17 00:00:00 2001 From: b-long Date: Wed, 3 Jun 2026 20:13:05 -0400 Subject: [PATCH 2/8] fix: address PR #142 review feedback - move codegen tools to dev deps - add uv.lock proto version entry to release-please configs - use project_root fixture in test_cli_version --- .release-please-config-develop.json | 5 +++++ .release-please-config.json | 5 +++++ packages/otdf-python/pyproject.toml | 8 ++++---- tests/test_cli.py | 4 +--- uv.lock | 12 ++++++------ 5 files changed, 21 insertions(+), 13 deletions(-) diff --git a/.release-please-config-develop.json b/.release-please-config-develop.json index b2ebf127..c317d76d 100644 --- a/.release-please-config-develop.json +++ b/.release-please-config-develop.json @@ -19,6 +19,11 @@ "path": "packages/otdf-python-proto/pyproject.toml", "type": "toml", "jsonpath": "$.project.version" + }, + { + "path": "uv.lock", + "type": "toml", + "jsonpath": "$.package[?(@.name.value=='otdf-python-proto')].version" } ] } diff --git a/.release-please-config.json b/.release-please-config.json index e27f4da8..9f542739 100644 --- a/.release-please-config.json +++ b/.release-please-config.json @@ -17,6 +17,11 @@ "path": "packages/otdf-python-proto/pyproject.toml", "type": "toml", "jsonpath": "$.project.version" + }, + { + "path": "uv.lock", + "type": "toml", + "jsonpath": "$.package[?(@.name.value=='otdf-python-proto')].version" } ] } diff --git a/packages/otdf-python/pyproject.toml b/packages/otdf-python/pyproject.toml index f5fa7eb6..d8c48176 100644 --- a/packages/otdf-python/pyproject.toml +++ b/packages/otdf-python/pyproject.toml @@ -27,16 +27,13 @@ classifiers = [ dependencies = [ "cryptography>=45.0.4", "connect-python>=0.6.0,<0.7", - "protoc-gen-connect-python>=0.6.0,<0.7", "httpx>=0.28.1", "protobuf>=6.31.1", "pyjwt>=2.10.1", "typing-extensions>=4.14.1", # Legacy gRPC support (may be removed in future versions) "grpcio>=1.74.0", - "grpcio-tools>=1.74.0", "grpcio-status>=1.74.0", - "protoc-gen-openapiv2>=0.0.1", ] [project.urls] @@ -60,5 +57,8 @@ dev = [ "pytest>=8.4.1", "respx>=0.21.1", "ruff>=0.12.10", - "tomli>=2.2.1 ; python_full_version < '3.11'", + "tomli>=2.2.1 ; python_version < '3.11'", + "protoc-gen-connect-python>=0.6.0,<0.7", + "grpcio-tools>=1.74.0", + "protoc-gen-openapiv2>=0.0.1", ] diff --git a/tests/test_cli.py b/tests/test_cli.py index d22414b0..8e92c505 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -34,9 +34,7 @@ def test_cli_version(project_root): assert result.returncode == 0 assert "OpenTDF Python SDK" in result.stdout - with ( - Path(__file__).parent.parent / "packages" / "otdf-python" / "pyproject.toml" - ).open("rb") as f: + with (project_root / "packages" / "otdf-python" / "pyproject.toml").open("rb") as f: # Use tomli for Python < 3.11, tomllib for 3.11+ if sys.version_info < (3, 11): import tomli diff --git a/uv.lock b/uv.lock index c3ebd0c0..f06d71c1 100644 --- a/uv.lock +++ b/uv.lock @@ -443,17 +443,17 @@ dependencies = [ { name = "cryptography" }, { name = "grpcio" }, { name = "grpcio-status" }, - { name = "grpcio-tools" }, { name = "httpx" }, { name = "protobuf" }, - { name = "protoc-gen-connect-python" }, - { name = "protoc-gen-openapiv2" }, { name = "pyjwt" }, { name = "typing-extensions" }, ] [package.dev-dependencies] dev = [ + { name = "grpcio-tools" }, + { name = "protoc-gen-connect-python" }, + { name = "protoc-gen-openapiv2" }, { name = "pydantic-settings" }, { name = "pytest" }, { name = "respx" }, @@ -467,17 +467,17 @@ requires-dist = [ { name = "cryptography", specifier = ">=45.0.4" }, { name = "grpcio", specifier = ">=1.74.0" }, { name = "grpcio-status", specifier = ">=1.74.0" }, - { name = "grpcio-tools", specifier = ">=1.74.0" }, { name = "httpx", specifier = ">=0.28.1" }, { name = "protobuf", specifier = ">=6.31.1" }, - { name = "protoc-gen-connect-python", specifier = ">=0.6.0,<0.7" }, - { name = "protoc-gen-openapiv2", specifier = ">=0.0.1" }, { name = "pyjwt", specifier = ">=2.10.1" }, { name = "typing-extensions", specifier = ">=4.14.1" }, ] [package.metadata.requires-dev] dev = [ + { name = "grpcio-tools", specifier = ">=1.74.0" }, + { name = "protoc-gen-connect-python", specifier = ">=0.6.0,<0.7" }, + { name = "protoc-gen-openapiv2", specifier = ">=0.0.1" }, { name = "pydantic-settings", specifier = ">=2.10.1" }, { name = "pytest", specifier = ">=8.4.1" }, { name = "respx", specifier = ">=0.21.1" }, From eee5c4fad19086be54a14fedd6904b2d9960878f Mon Sep 17 00:00:00 2001 From: b-long Date: Wed, 3 Jun 2026 20:26:44 -0400 Subject: [PATCH 3/8] chore: replace httpx with httpx2>=2.3.0 --- packages/otdf-python/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/otdf-python/pyproject.toml b/packages/otdf-python/pyproject.toml index d8c48176..a6341da2 100644 --- a/packages/otdf-python/pyproject.toml +++ b/packages/otdf-python/pyproject.toml @@ -27,7 +27,7 @@ classifiers = [ dependencies = [ "cryptography>=45.0.4", "connect-python>=0.6.0,<0.7", - "httpx>=0.28.1", + "httpx2>=2.3.0", "protobuf>=6.31.1", "pyjwt>=2.10.1", "typing-extensions>=4.14.1", From 86f8684a77492de6e56c1ec3746d24203d830a06 Mon Sep 17 00:00:00 2001 From: b-long Date: Wed, 3 Jun 2026 20:47:27 -0400 Subject: [PATCH 4/8] chore: migrate httpx imports to httpx2 --- .../src/otdf_python/kas_connect_rpc_client.py | 2 +- .../src/otdf_python/sdk_builder.py | 2 +- .../src/otdf_python/token_source.py | 2 +- tests/test_sdk_builder.py | 78 +++++++++++-------- tests/test_token_source.py | 4 +- uv.lock | 41 +++++++++- 6 files changed, 89 insertions(+), 40 deletions(-) diff --git a/packages/otdf-python/src/otdf_python/kas_connect_rpc_client.py b/packages/otdf-python/src/otdf_python/kas_connect_rpc_client.py index 5da52838..593039bd 100644 --- a/packages/otdf-python/src/otdf_python/kas_connect_rpc_client.py +++ b/packages/otdf-python/src/otdf_python/kas_connect_rpc_client.py @@ -4,7 +4,7 @@ import logging -import httpx +import httpx2 as httpx from otdf_python_proto.kas import kas_pb2 from otdf_python_proto.kas.kas_connect import AccessServiceClientSync diff --git a/packages/otdf-python/src/otdf_python/sdk_builder.py b/packages/otdf-python/src/otdf_python/sdk_builder.py index 6cf74fb1..43263f74 100644 --- a/packages/otdf-python/src/otdf_python/sdk_builder.py +++ b/packages/otdf-python/src/otdf_python/sdk_builder.py @@ -8,7 +8,7 @@ from dataclasses import dataclass from pathlib import Path -import httpx +import httpx2 as httpx from otdf_python.kas_allowlist import KASAllowlist from otdf_python.sdk import KAS, SDK diff --git a/packages/otdf-python/src/otdf_python/token_source.py b/packages/otdf-python/src/otdf_python/token_source.py index c5e5ca18..994f1023 100644 --- a/packages/otdf-python/src/otdf_python/token_source.py +++ b/packages/otdf-python/src/otdf_python/token_source.py @@ -2,7 +2,7 @@ import time -import httpx +import httpx2 as httpx class TokenSource: diff --git a/tests/test_sdk_builder.py b/tests/test_sdk_builder.py index 705e2ef9..668f721e 100644 --- a/tests/test_sdk_builder.py +++ b/tests/test_sdk_builder.py @@ -5,7 +5,6 @@ from unittest.mock import MagicMock, patch import pytest -import respx from otdf_python.sdk import SDK from otdf_python.sdk_builder import SDKBuilder from otdf_python.sdk_exceptions import AutoConfigureException @@ -127,54 +126,67 @@ def test_ssl_context_from_directory(): assert not any("not_a_cert.txt" in path for path in builder.cert_paths) -@respx.mock -def test_get_token_from_client_credentials(): +@patch("otdf_python.sdk_builder.httpx.get") +@patch("otdf_python.sdk_builder.httpx.post") +def test_get_token_from_client_credentials(mock_post, mock_get): """Test getting OAuth token from client credentials.""" + + def get_side_effect(url, **kwargs): + resp = MagicMock() + if "openid-configuration" in url: + resp.status_code = 200 + resp.json.return_value = { + "token_endpoint": "https://keycloak.example.com/oauth/token" + } + else: + resp.status_code = 404 + return resp + + mock_get.side_effect = get_side_effect + mock_post_resp = MagicMock() + mock_post_resp.status_code = 200 + mock_post_resp.json.return_value = { + "access_token": "test-token-123", + "token_type": "Bearer", + } + mock_post.return_value = mock_post_resp + builder = SDKBuilder() builder.set_platform_endpoint("example.com") builder.set_issuer_endpoint("https://keycloak.example.com") builder.client_secret("client123", "secret456") - # Mock the discovery endpoint (Keycloak format) - respx.get( - "https://keycloak.example.com/realms/opentdf/.well-known/openid-configuration" - ).respond( - json={"token_endpoint": "https://keycloak.example.com/oauth/token"}, - status_code=200, - ) - - # Mock the token endpoint - respx.post("https://keycloak.example.com/oauth/token").respond( - json={"access_token": "test-token-123", "token_type": "Bearer"}, status_code=200 - ) - - # Test the method token = builder._get_token_from_client_credentials() assert token == "test-token-123" -@respx.mock -def test_get_token_failure(): +@patch("otdf_python.sdk_builder.httpx.get") +@patch("otdf_python.sdk_builder.httpx.post") +def test_get_token_failure(mock_post, mock_get): """Test handling of token acquisition failure.""" + + def get_side_effect(url, **kwargs): + resp = MagicMock() + if "openid-configuration" in url: + resp.status_code = 200 + resp.json.return_value = { + "token_endpoint": "https://keycloak.example.com/oauth/token" + } + else: + resp.status_code = 404 + return resp + + mock_get.side_effect = get_side_effect + mock_post_resp = MagicMock() + mock_post_resp.status_code = 401 + mock_post_resp.json.return_value = {"error": "invalid_client"} + mock_post.return_value = mock_post_resp + builder = SDKBuilder() builder.set_platform_endpoint("example.com") builder.set_issuer_endpoint("https://keycloak.example.com") builder.client_secret("client123", "secret456") - # Mock the discovery endpoint (Keycloak format) - respx.get( - "https://keycloak.example.com/realms/opentdf/.well-known/openid-configuration" - ).respond( - json={"token_endpoint": "https://keycloak.example.com/oauth/token"}, - status_code=200, - ) - - # Mock the token endpoint with error - respx.post("https://keycloak.example.com/oauth/token").respond( - json={"error": "invalid_client"}, status_code=401 - ) - - # Test the method with pytest.raises(AutoConfigureException) as excinfo: builder._get_token_from_client_credentials() diff --git a/tests/test_token_source.py b/tests/test_token_source.py index ae06d9ed..b0b59dbf 100644 --- a/tests/test_token_source.py +++ b/tests/test_token_source.py @@ -8,7 +8,7 @@ def test_token_source_returns_token_and_caches(): """Test TokenSource returns token and caches it.""" - with patch("httpx.post") as mock_post: + with patch("otdf_python.token_source.httpx.post") as mock_post: mock_resp = MagicMock() mock_resp.json.return_value = {"access_token": "abc", "expires_in": 100} mock_resp.raise_for_status.return_value = None @@ -23,7 +23,7 @@ def test_token_source_returns_token_and_caches(): assert mock_post.call_count == 1 -@patch("httpx.post") +@patch("otdf_python.token_source.httpx.post") def test_token_source_refreshes_token(mock_post): """Test TokenSource refreshes expired token.""" mock_resp1 = MagicMock() diff --git a/uv.lock b/uv.lock index f06d71c1..d2590b72 100644 --- a/uv.lock +++ b/uv.lock @@ -388,6 +388,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, ] +[[package]] +name = "httpcore2" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "h11" }, + { name = "truststore" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e6/34/18f1c596e677962f040284246f393b10a1f8ce440b3a7e69c637d0f1c7ad/httpcore2-2.3.0.tar.gz", hash = "sha256:07327e251560960eea8e969d92d4c6a325feb13cca39e25340731336c3baf924", size = 64300, upload-time = "2026-06-01T13:15:02.998Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/dd/3357218c69360d1cecc196c230c9a1d5c9afd5dba362056e23e60a5e64e5/httpcore2-2.3.0-py3-none-any.whl", hash = "sha256:477e9e334f74e5240dcac002e890580f36a57d40ff0fb14cc9655731d23b8415", size = 80024, upload-time = "2026-06-01T13:15:00.001Z" }, +] + [[package]] name = "httpx" version = "0.28.1" @@ -403,6 +416,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, ] +[[package]] +name = "httpx2" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "httpcore2" }, + { name = "idna" }, + { name = "truststore" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9f/9a/cca0b9145f13d8ae34b885ae28d403a1469a433abc78e0f94f4ce94e650b/httpx2-2.3.0.tar.gz", hash = "sha256:227e7c41d95a76d4077a52640564132777215fc3394e07b66a3116c33d668fa9", size = 81115, upload-time = "2026-06-01T13:15:04.324Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/ce/ae2911859847f9ba1d6b23027e53481cbeb50b93234f355a968d300ca2cb/httpx2-2.3.0-py3-none-any.whl", hash = "sha256:6f393663bdf6dbe7fe90118e3eb5b2bd024a675cae0390ac08cec9198812d8b7", size = 74538, upload-time = "2026-06-01T13:15:01.566Z" }, +] + [[package]] name = "idna" version = "3.18" @@ -443,7 +471,7 @@ dependencies = [ { name = "cryptography" }, { name = "grpcio" }, { name = "grpcio-status" }, - { name = "httpx" }, + { name = "httpx2" }, { name = "protobuf" }, { name = "pyjwt" }, { name = "typing-extensions" }, @@ -467,7 +495,7 @@ requires-dist = [ { name = "cryptography", specifier = ">=45.0.4" }, { name = "grpcio", specifier = ">=1.74.0" }, { name = "grpcio-status", specifier = ">=1.74.0" }, - { name = "httpx", specifier = ">=0.28.1" }, + { name = "httpx2", specifier = ">=2.3.0" }, { name = "protobuf", specifier = ">=6.31.1" }, { name = "pyjwt", specifier = ">=2.10.1" }, { name = "typing-extensions", specifier = ">=4.14.1" }, @@ -881,6 +909,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, ] +[[package]] +name = "truststore" +version = "0.10.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/a3/1585216310e344e8102c22482f6060c7a6ea0322b63e026372e6dcefcfd6/truststore-0.10.4.tar.gz", hash = "sha256:9d91bd436463ad5e4ee4aba766628dd6cd7010cf3e2461756b3303710eebc301", size = 26169, upload-time = "2025-08-12T18:49:02.73Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/19/97/56608b2249fe206a67cd573bc93cd9896e1efb9e98bce9c163bcdc704b88/truststore-0.10.4-py3-none-any.whl", hash = "sha256:adaeaecf1cbb5f4de3b1959b42d41f6fab57b2b1666adb59e89cb0b53361d981", size = 18660, upload-time = "2025-08-12T18:49:01.46Z" }, +] + [[package]] name = "types-protobuf" version = "7.34.1.20260518" From d49570f67ad384b6301ec3ba77de174050300abb Mon Sep 17 00:00:00 2001 From: b-long Date: Wed, 3 Jun 2026 20:57:35 -0400 Subject: [PATCH 5/8] fix: revert kas_connect_rpc_client to httpx; add compat test --- .../src/otdf_python/kas_connect_rpc_client.py | 2 +- tests/test_kas_connect_rpc_httpx_compat.py | 39 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 tests/test_kas_connect_rpc_httpx_compat.py diff --git a/packages/otdf-python/src/otdf_python/kas_connect_rpc_client.py b/packages/otdf-python/src/otdf_python/kas_connect_rpc_client.py index 593039bd..5da52838 100644 --- a/packages/otdf-python/src/otdf_python/kas_connect_rpc_client.py +++ b/packages/otdf-python/src/otdf_python/kas_connect_rpc_client.py @@ -4,7 +4,7 @@ import logging -import httpx2 as httpx +import httpx from otdf_python_proto.kas import kas_pb2 from otdf_python_proto.kas.kas_connect import AccessServiceClientSync diff --git a/tests/test_kas_connect_rpc_httpx_compat.py b/tests/test_kas_connect_rpc_httpx_compat.py new file mode 100644 index 00000000..bef87a9b --- /dev/null +++ b/tests/test_kas_connect_rpc_httpx_compat.py @@ -0,0 +1,39 @@ +"""Verify httpx/httpx2 client compatibility with connect-python (connectrpc). + +connectrpc passes httpx.USE_CLIENT_DEFAULT as a timeout sentinel to the session +client. httpx.Client handles it natively; httpx2.Client raises TypeError because +it cannot interpret the foreign sentinel as an integer. +""" + +import httpx +import httpx2 +import pytest +from otdf_python_proto.kas import kas_pb2 +from otdf_python_proto.kas.kas_connect import AccessServiceClientSync + + +def _make_svc(session): + return AccessServiceClientSync(address="http://localhost:19999", session=session) + + +def test_httpx_client_is_compatible(): + """httpx.Client passes USE_CLIENT_DEFAULT through its own transport without error. + + We expect a connection error (no server), not a TypeError. + """ + with httpx.Client() as client: + svc = _make_svc(client) + with pytest.raises(Exception) as exc_info: + svc.public_key(kas_pb2.PublicKeyRequest()) + assert "UseClientDefault" not in str(exc_info.value) + + +def test_httpx2_client_is_incompatible(): + """httpx2.Client receives httpx.USE_CLIENT_DEFAULT as timeout and raises TypeError. + + This confirms kas_connect_rpc_client.py must use httpx, not httpx2. + """ + with httpx2.Client() as client: + svc = _make_svc(client) + with pytest.raises(Exception, match="UseClientDefault"): + svc.public_key(kas_pb2.PublicKeyRequest()) From b74ae44e7ce6bab0ac97dbe03747a99c2a3a44d0 Mon Sep 17 00:00:00 2001 From: b-long Date: Wed, 3 Jun 2026 21:19:49 -0400 Subject: [PATCH 6/8] chore: remove unused respx dev dependency --- packages/otdf-python/pyproject.toml | 1 - uv.lock | 14 -------------- 2 files changed, 15 deletions(-) diff --git a/packages/otdf-python/pyproject.toml b/packages/otdf-python/pyproject.toml index a6341da2..0480069c 100644 --- a/packages/otdf-python/pyproject.toml +++ b/packages/otdf-python/pyproject.toml @@ -55,7 +55,6 @@ packages = ["src/otdf_python"] dev = [ "pydantic-settings>=2.10.1", "pytest>=8.4.1", - "respx>=0.21.1", "ruff>=0.12.10", "tomli>=2.2.1 ; python_version < '3.11'", "protoc-gen-connect-python>=0.6.0,<0.7", diff --git a/uv.lock b/uv.lock index d2590b72..f34e1c6d 100644 --- a/uv.lock +++ b/uv.lock @@ -484,7 +484,6 @@ dev = [ { name = "protoc-gen-openapiv2" }, { name = "pydantic-settings" }, { name = "pytest" }, - { name = "respx" }, { name = "ruff" }, { name = "tomli", marker = "python_full_version < '3.11'" }, ] @@ -508,7 +507,6 @@ dev = [ { name = "protoc-gen-openapiv2", specifier = ">=0.0.1" }, { name = "pydantic-settings", specifier = ">=2.10.1" }, { name = "pytest", specifier = ">=8.4.1" }, - { name = "respx", specifier = ">=0.21.1" }, { name = "ruff", specifier = ">=0.12.10" }, { name = "tomli", marker = "python_full_version < '3.11'", specifier = ">=2.2.1" }, ] @@ -809,18 +807,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a", size = 22101, upload-time = "2026-03-01T16:00:25.09Z" }, ] -[[package]] -name = "respx" -version = "0.23.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "httpx" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/43/98/4e55c9c486404ec12373708d015ebce157966965a5ebe7f28ff2c784d41b/respx-0.23.1.tar.gz", hash = "sha256:242dcc6ce6b5b9bf621f5870c82a63997e8e82bc7c947f9ffe272b8f3dd5a780", size = 29243, upload-time = "2026-04-08T14:37:16.008Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/4a/221da6ca167db45693d8d26c7dc79ccfc978a440251bf6721c9aaf251ac0/respx-0.23.1-py2.py3-none-any.whl", hash = "sha256:b18004b029935384bccfa6d7d9d74b4ec9af73a081cc28600fffc0447f4b8c1a", size = 25557, upload-time = "2026-04-08T14:37:14.613Z" }, -] - [[package]] name = "ruff" version = "0.15.15" From fc03f5a2c2f1f60997c7976bdb58bc865959e33e Mon Sep 17 00:00:00 2001 From: b-long Date: Wed, 3 Jun 2026 21:46:10 -0400 Subject: [PATCH 7/8] feat: upgrade to connect-python>=0.9.0 with pyqwest transport --- packages/otdf-python/pyproject.toml | 2 +- .../src/otdf_python/kas_connect_rpc_client.py | 56 ++++----- tests/integration/support_sdk.py | 2 +- tests/test_kas_client.py | 33 +----- tests/test_kas_connect_rpc_httpx_compat.py | 39 ------- tests/test_kas_key_management.py | 60 +++++----- uv.lock | 106 +++++++++++------- 7 files changed, 122 insertions(+), 176 deletions(-) delete mode 100644 tests/test_kas_connect_rpc_httpx_compat.py diff --git a/packages/otdf-python/pyproject.toml b/packages/otdf-python/pyproject.toml index 0480069c..90219f7c 100644 --- a/packages/otdf-python/pyproject.toml +++ b/packages/otdf-python/pyproject.toml @@ -26,7 +26,7 @@ classifiers = [ dependencies = [ "cryptography>=45.0.4", - "connect-python>=0.6.0,<0.7", + "connect-python>=0.9.0", "httpx2>=2.3.0", "protobuf>=6.31.1", "pyjwt>=2.10.1", diff --git a/packages/otdf-python/src/otdf_python/kas_connect_rpc_client.py b/packages/otdf-python/src/otdf_python/kas_connect_rpc_client.py index 5da52838..6209bafd 100644 --- a/packages/otdf-python/src/otdf_python/kas_connect_rpc_client.py +++ b/packages/otdf-python/src/otdf_python/kas_connect_rpc_client.py @@ -4,7 +4,7 @@ import logging -import httpx +import pyqwest from otdf_python_proto.kas import kas_pb2 from otdf_python_proto.kas.kas_connect import AccessServiceClientSync @@ -26,6 +26,7 @@ def __init__(self, use_plaintext=False, verify_ssl=True): """ self.use_plaintext = use_plaintext self.verify_ssl = verify_ssl + self._transport = None self._http_client = None def __enter__(self): @@ -38,35 +39,41 @@ def __exit__(self, exc_type, exc_val, exc_tb): self.close() def close(self): - """Close HTTP client and release resources. - - This method should be called when the client is no longer needed - to properly clean up resources. It's also called automatically - when using the client as a context manager. - """ - if self._http_client is not None: - self._http_client.close() - self._http_client = None + """Close HTTP client and release resources.""" + if self._transport is not None: + self._transport.close() + self._transport = None + self._http_client = None def _create_http_client(self): - """Create HTTP client with SSL verification configuration. + """Create HTTP client backed by a pyqwest.SyncHTTPTransport. + + Supports plaintext (HTTP) and TLS (HTTPS) connections. + Custom CA/cert data is not yet supported. Returns: - httpx.Client configured for SSL verification settings + pyqwest.SyncClient configured for the current settings + + Raises: + NotImplementedError: If verify_ssl=False is requested, as pyqwest + does not support disabling TLS verification. Passing custom + TLS certificate or CA data is also not yet implemented. """ - if self.verify_ssl: - logging.info("Using SSL verification enabled HTTP client") - return httpx.Client() - else: - logging.info("Using SSL verification disabled HTTP client") - return httpx.Client(verify=False) + if not self.verify_ssl: + raise NotImplementedError( + "verify_ssl=False is not supported: pyqwest does not expose an " + "option to disable TLS verification. Passing custom TLS cert or " + "CA data is also not yet implemented." + ) + self._transport = pyqwest.SyncHTTPTransport() + return pyqwest.SyncClient(transport=self._transport) def _get_http_client(self): """Get HTTP client, creating one if needed for backward compatibility. Returns: - httpx.Client instance + pyqwest.SyncClient instance """ if self._http_client is None: @@ -136,12 +143,9 @@ def get_public_key(self, normalized_kas_url, kas_info, access_token=None): f"for public key retrieval" ) - # Get or create HTTP client http_client = self._get_http_client() - - # Create Connect RPC client with configured HTTP client client = AccessServiceClientSync( - address=connect_rpc_base_url, session=http_client + address=connect_rpc_base_url, http_client=http_client ) # Create public key request @@ -202,12 +206,9 @@ def unwrap_key( f"Creating Connect RPC client for base URL: {kas_service_url}, for unwrap" ) - # Get or create HTTP client http_client = self._get_http_client() - - # Create Connect RPC client with configured HTTP client client = AccessServiceClientSync( - address=kas_service_url, session=http_client + address=kas_service_url, http_client=http_client ) # Create rewrap request @@ -215,7 +216,6 @@ def unwrap_key( signed_request_token=signed_token, ) - # Debug: Log the signed token details logging.info(f"Connect RPC signed token: {signed_token}") # Prepare headers with authentication if available diff --git a/tests/integration/support_sdk.py b/tests/integration/support_sdk.py index 766ea655..27400a24 100644 --- a/tests/integration/support_sdk.py +++ b/tests/integration/support_sdk.py @@ -1,4 +1,4 @@ -import httpx +import httpx2 as httpx from otdf_python.sdk import SDK from otdf_python.sdk_builder import SDKBuilder diff --git a/tests/test_kas_client.py b/tests/test_kas_client.py index 24341059..195b267b 100644 --- a/tests/test_kas_client.py +++ b/tests/test_kas_client.py @@ -50,20 +50,12 @@ def test_get_public_key_uses_cache(): assert client.get_public_key(MockKasInfo(url="http://kas")) == kas_info -@patch("httpx.Client") @patch("otdf_python.kas_connect_rpc_client.AccessServiceClientSync") -def test_get_public_key_fetches_and_caches( - mock_access_service_client, mock_http_client -): +def test_get_public_key_fetches_and_caches(mock_access_service_client): """Test that get_public_key fetches and caches public key.""" cache = KASKeyCache() client = KASClient("http://kas", cache=cache) - # Mock httpx.Client to prevent real network calls - # Note: We're using lazy initialization, so return the mock directly (not via context manager) - mock_client_instance = MagicMock() - mock_http_client.return_value = mock_client_instance - # Mock the Connect RPC client directly since it expects protobuf responses mock_rpc_client_instance = MagicMock() mock_access_service_client.return_value = mock_rpc_client_instance @@ -96,7 +88,6 @@ def mock_public_key_call(*args, **kwargs): assert cached.public_key == "public-key-data" -@patch("httpx.Client") @patch("otdf_python.kas_connect_rpc_client.AccessServiceClientSync") @patch("otdf_python.kas_client.CryptoUtils") @patch("otdf_python.kas_client.AsymDecryption") @@ -106,7 +97,6 @@ def test_unwrap_success( mock_asym_decryption, mock_crypto_utils, mock_access_service_client, - mock_http_client, ): """Test successful key unwrap operation.""" # Setup mocks for RSA key pair generation and decryption @@ -129,11 +119,6 @@ def test_unwrap_success( mock_decryptor.decrypt.return_value = b"decrypted_key" mock_asym_decryption.return_value = mock_decryptor - # Mock httpx.Client to prevent real network calls - # Note: We're using lazy initialization, so return the mock directly (not via context manager) - mock_http_client_instance = MagicMock() - mock_http_client.return_value = mock_http_client_instance - # Mock Connect RPC client directly instead of HTTP layer mock_rpc_client_instance = MagicMock() mock_access_service_client.return_value = mock_rpc_client_instance @@ -161,15 +146,9 @@ def test_unwrap_success( mock_decryptor.decrypt.assert_called_once() -@patch("httpx.Client") @patch("otdf_python.kas_connect_rpc_client.AccessServiceClientSync") -def test_unwrap_failure(mock_access_service_client, mock_http_client): +def test_unwrap_failure(mock_access_service_client): """Test key unwrap failure handling.""" - # Mock httpx.Client to prevent real network calls - # Note: We're using lazy initialization, so return the mock directly (not via context manager) - mock_http_client_instance = MagicMock() - mock_http_client.return_value = mock_http_client_instance - # Mock the Connect RPC client to raise an exception mock_access_service_client.side_effect = Exception("fail") @@ -412,10 +391,9 @@ def test_kas_url_normalization_error_handling_with_kasinfo(): client._normalize_kas_url(kas_info.url) -@patch("httpx.Client") @patch("otdf_python.kas_connect_rpc_client.AccessServiceClientSync") def test_jwt_signature_verification_in_unwrap_request( - mock_access_service_client, mock_http_client, collect_server_logs + mock_access_service_client, collect_server_logs ): """Test that JWT signature is properly created and can be verified. @@ -425,11 +403,6 @@ def test_jwt_signature_verification_in_unwrap_request( """ import jwt - # Mock httpx.Client to prevent real network calls - # Note: We're using lazy initialization, so return the mock directly (not via context manager) - mock_http_client_instance = MagicMock() - mock_http_client.return_value = mock_http_client_instance - # Mock Connect RPC client directly for protobuf compatibility mock_rpc_client_instance = MagicMock() mock_access_service_client.return_value = mock_rpc_client_instance diff --git a/tests/test_kas_connect_rpc_httpx_compat.py b/tests/test_kas_connect_rpc_httpx_compat.py deleted file mode 100644 index bef87a9b..00000000 --- a/tests/test_kas_connect_rpc_httpx_compat.py +++ /dev/null @@ -1,39 +0,0 @@ -"""Verify httpx/httpx2 client compatibility with connect-python (connectrpc). - -connectrpc passes httpx.USE_CLIENT_DEFAULT as a timeout sentinel to the session -client. httpx.Client handles it natively; httpx2.Client raises TypeError because -it cannot interpret the foreign sentinel as an integer. -""" - -import httpx -import httpx2 -import pytest -from otdf_python_proto.kas import kas_pb2 -from otdf_python_proto.kas.kas_connect import AccessServiceClientSync - - -def _make_svc(session): - return AccessServiceClientSync(address="http://localhost:19999", session=session) - - -def test_httpx_client_is_compatible(): - """httpx.Client passes USE_CLIENT_DEFAULT through its own transport without error. - - We expect a connection error (no server), not a TypeError. - """ - with httpx.Client() as client: - svc = _make_svc(client) - with pytest.raises(Exception) as exc_info: - svc.public_key(kas_pb2.PublicKeyRequest()) - assert "UseClientDefault" not in str(exc_info.value) - - -def test_httpx2_client_is_incompatible(): - """httpx2.Client receives httpx.USE_CLIENT_DEFAULT as timeout and raises TypeError. - - This confirms kas_connect_rpc_client.py must use httpx, not httpx2. - """ - with httpx2.Client() as client: - svc = _make_svc(client) - with pytest.raises(Exception, match="UseClientDefault"): - svc.public_key(kas_pb2.PublicKeyRequest()) diff --git a/tests/test_kas_key_management.py b/tests/test_kas_key_management.py index d4589ab1..6391de3c 100644 --- a/tests/test_kas_key_management.py +++ b/tests/test_kas_key_management.py @@ -21,41 +21,31 @@ def test_rsa_key_generation(self): self.assertIsNone(client.decryptor) self.assertIsNone(client.client_public_key) - # Mock the HTTP response - with patch("httpx.post") as mock_post: - # Configure the mock - mock_response = Mock() - mock_response.status_code = 200 - mock_response.json.return_value = { - "entityWrappedKey": base64.b64encode(os.urandom(32)).decode() - } - mock_post.return_value = mock_response - - # Create a test key access - key_access = KeyAccess( - url="http://kas.example.com", - wrapped_key=base64.b64encode(os.urandom(32)).decode(), - ) - - # Also patch the decrypt method to return a predictable value - with patch( - "otdf_python.asym_crypto.AsymDecryption.decrypt", - return_value=b"test_key", - ): - # Call unwrap - from contextlib import suppress - - with suppress(Exception): - # We expect an exception because we're not actually unwrapping a valid key - client.unwrap(key_access, "{}", RSA_KEY_TYPE) - - # After unwrap, decryptor should be created - self.assertIsNotNone(client.decryptor) - self.assertIsNotNone(client.client_public_key) - - # The public key should be in PEM format - assert isinstance(client.client_public_key, str) - assert client.client_public_key.startswith("-----BEGIN PUBLIC KEY-----") + # Create a test key access + key_access = KeyAccess( + url="http://kas.example.com", + wrapped_key=base64.b64encode(os.urandom(32)).decode(), + ) + + # Also patch the decrypt method to return a predictable value + with patch( + "otdf_python.asym_crypto.AsymDecryption.decrypt", + return_value=b"test_key", + ): + # Call unwrap + from contextlib import suppress + + with suppress(Exception): + # We expect an exception because we're not actually unwrapping a valid key + client.unwrap(key_access, "{}", RSA_KEY_TYPE) + + # After unwrap, decryptor should be created + self.assertIsNotNone(client.decryptor) + self.assertIsNotNone(client.client_public_key) + + # The public key should be in PEM format + assert isinstance(client.client_public_key, str) + assert client.client_public_key.startswith("-----BEGIN PUBLIC KEY-----") @pytest.mark.skip(reason="Skipping 'test_ec_key_generation' until fixed") @pytest.mark.integration diff --git a/uv.lock b/uv.lock index f34e1c6d..632b47f0 100644 --- a/uv.lock +++ b/uv.lock @@ -31,15 +31,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/da/42/e921fccf5015463e32a3cf6ee7f980a6ed0f395ceeaa45060b61d86486c2/anyio-4.13.0-py3-none-any.whl", hash = "sha256:08b310f9e24a9594186fd75b4f73f4a4152069e3853f1ed8bfbf58369f4ad708", size = 114353, upload-time = "2026-03-24T12:59:08.246Z" }, ] -[[package]] -name = "certifi" -version = "2026.5.20" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/ce/ee2ecad540810a79593028e88299baeae54d346cc7a0d94b6199988b89b1/certifi-2026.5.20.tar.gz", hash = "sha256:69dea482ab64caa7b9f6aba1c6bf48bb6a5448d1c0f1b17ab42ad8c763a5344d", size = 135422, upload-time = "2026-05-20T11:46:50.073Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/59/8c/57e832b7af6d7c5abe66eb3fbe3a3a32f4d11ea23a1aa7131371035be991/certifi-2026.5.20-py3-none-any.whl", hash = "sha256:3c52e209ba0a4ad7aebe60436a4ab349c39e1e602e8c134221e546902ad25897", size = 134134, upload-time = "2026-05-20T11:46:48.578Z" }, -] - [[package]] name = "cffi" version = "2.0.0" @@ -133,15 +124,15 @@ wheels = [ [[package]] name = "connect-python" -version = "0.6.0" +version = "0.9.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "httpx" }, { name = "protobuf" }, + { name = "pyqwest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/17/92/f50ef15f6f793a3ea18abc7ce378cd3d16d7f65f0dbc2827bcc139be440a/connect_python-0.6.0.tar.gz", hash = "sha256:88f159d0b3ccc0d52cec9937b8bfc654793a47f24825697e1d25c5779097aa24", size = 37265, upload-time = "2025-12-08T04:45:45.718Z" } +sdist = { url = "https://files.pythonhosted.org/packages/74/fc/0e4798c53e2754f5de36ecf4d198706cb23711d603df6c008f6e7b5b21ae/connect_python-0.9.0.tar.gz", hash = "sha256:a188ec843b0f5953b7e1b88061af50ad91c9aaa2e982d7a89a63ae5c1fff932e", size = 46094, upload-time = "2026-03-19T02:40:42.279Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/3f/dc41bcb3cd450bd2e102e4384b5a324d4b35b06332e301d9f73dc0543892/connect_python-0.6.0-py3-none-any.whl", hash = "sha256:9e12fdfdf546144a68b976430b014b266ab482fac56362ff8dbe3004e370abc7", size = 49356, upload-time = "2025-12-08T04:45:44.628Z" }, + { url = "https://files.pythonhosted.org/packages/4c/15/5b42df2d9d34e5103f2b69e4f6a4aeb47c52589eaac8d53eb5b0a40eabaa/connect_python-0.9.0-py3-none-any.whl", hash = "sha256:896171fa7236d4e1557e3f7eee76daa8c9dd762f2c21662515f2060f1b542574", size = 63381, upload-time = "2026-03-19T02:40:40.743Z" }, ] [[package]] @@ -375,19 +366,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, ] -[[package]] -name = "httpcore" -version = "1.0.9" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, - { name = "h11" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, -] - [[package]] name = "httpcore2" version = "2.3.0" @@ -401,21 +379,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c2/dd/3357218c69360d1cecc196c230c9a1d5c9afd5dba362056e23e60a5e64e5/httpcore2-2.3.0-py3-none-any.whl", hash = "sha256:477e9e334f74e5240dcac002e890580f36a57d40ff0fb14cc9655731d23b8415", size = 80024, upload-time = "2026-06-01T13:15:00.001Z" }, ] -[[package]] -name = "httpx" -version = "0.28.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "certifi" }, - { name = "httpcore" }, - { name = "idna" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, -] - [[package]] name = "httpx2" version = "2.3.0" @@ -462,6 +425,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e8/ec/5ffcf8f5f53757e01afdece10c664e694ac60d2f17c2036811b85b842a5b/mypy_protobuf-5.1.0-py3-none-any.whl", hash = "sha256:d7031f563f806b8bcd448a3e86768bf0994c0af5b0017b344a4fbbba4191f43c", size = 26313, upload-time = "2026-04-28T15:56:39.096Z" }, ] +[[package]] +name = "opentelemetry-api" +version = "1.42.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b4/1c/125e1c936c0873796771b7f04f6c93b9f1bf5d424cea90fda94a99f61da8/opentelemetry_api-1.42.1.tar.gz", hash = "sha256:56c63bea9f77b62856be8c47600474acad853b2924b99b1687c4cb6297166716", size = 72296, upload-time = "2026-05-21T16:32:49.335Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/ca/9520cc1f3dfbbd03ac5903bbf55833e257bc64b1cf30fa8b0d6df374d821/opentelemetry_api-1.42.1-py3-none-any.whl", hash = "sha256:51a69edacadbc03a8950ace1c4c21099cacc538820ac2c9e36277e78cebba714", size = 61311, upload-time = "2026-05-21T16:32:28.822Z" }, +] + [[package]] name = "otdf-python" version = "0.6.0" @@ -490,7 +465,7 @@ dev = [ [package.metadata] requires-dist = [ - { name = "connect-python", specifier = ">=0.6.0,<0.7" }, + { name = "connect-python", specifier = ">=0.9.0" }, { name = "cryptography", specifier = ">=45.0.4" }, { name = "grpcio", specifier = ">=1.74.0" }, { name = "grpcio-status", specifier = ">=1.74.0" }, @@ -780,6 +755,53 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a3/5e/ecf12fdb62546d64385c158514e9b2b671f7832108ef2ecd2020ce0af2d1/pyjwt-2.13.0-py3-none-any.whl", hash = "sha256:66adcc2aff09b3f1bbd95fc1e1577df8ac8723c978552fd43304c8a290ac5728", size = 31274, upload-time = "2026-05-21T19:54:35.362Z" }, ] +[[package]] +name = "pyqwest" +version = "0.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a0/6a/9c9147b690ce13b6c036cc17485d0e46ec59f2a5da5a0a1722fbc40282cf/pyqwest-0.6.1.tar.gz", hash = "sha256:038c8facdf78ada967aba3238d6e8ed2cbbdb3283eb00ca11b4a3d29af9b4080", size = 450611, upload-time = "2026-06-03T04:28:42.976Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6c/1b/8af5ca9480ac41fca22975c23afb5e2404243a9db3f50c864a1f62e7ec6b/pyqwest-0.6.1-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:c6f0c35836b1abb42853395dda08372bf1b13859c0e2218974c49dd072b581da", size = 5064233, upload-time = "2026-06-03T04:27:36.248Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ea/200a1116e8745417433d0b27239c3ce46118d5044d5d90ecb36ff2b37aeb/pyqwest-0.6.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4468e2c57352144bbee2e62c04c5022eef79429725f8907d3bf89b80ec32fba5", size = 5427500, upload-time = "2026-06-03T04:27:38.209Z" }, + { url = "https://files.pythonhosted.org/packages/37/73/a2c580b02fb62b2ac8bf67a0ba52b295e9d1616048c0240dbdbcd0976580/pyqwest-0.6.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a920f3b769b6ffdfbcd8b9fed39146ef6dd841e48027a2f2be5ba1c5356ef06", size = 5454796, upload-time = "2026-06-03T04:27:40.084Z" }, + { url = "https://files.pythonhosted.org/packages/4d/b1/9dff83bf0fdf81b8376569c25329a06d89859edd7f9fcd4968172bb08335/pyqwest-0.6.1-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2d02a0db5168d5918546a6dc8970e3f585f8f3128f7d0a13cb1e648ad08f2795", size = 5593825, upload-time = "2026-06-03T04:27:42.628Z" }, + { url = "https://files.pythonhosted.org/packages/1b/c7/d2054e7a47ec658328edc944f9c4c1132d32a4bec558ea818accfcb0978b/pyqwest-0.6.1-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:8cdd06047ace54d3ac71403db12fbf2dafea538628c08c85cffdeab54693d667", size = 5762315, upload-time = "2026-06-03T04:27:44.545Z" }, + { url = "https://files.pythonhosted.org/packages/ad/c8/80d7bd7eb74415ea63d450fddb98302900098ae48ee64e35519b044e2497/pyqwest-0.6.1-cp310-abi3-win_amd64.whl", hash = "sha256:54a4c93109397c5dbfbdb52fadf2f3a6d3918f632efd0cd568f499ac1a2bbee3", size = 4624229, upload-time = "2026-06-03T04:27:46.484Z" }, + { url = "https://files.pythonhosted.org/packages/1b/95/0eb8a7e4d298a5b5d094aee4219025fe8551426a436eedcd0756c56aa9c2/pyqwest-0.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dd361665d34e47347bbd8160babc3ae37b2bbcd3dae517a9ff44b1860056d0b5", size = 5060906, upload-time = "2026-06-03T04:27:48.66Z" }, + { url = "https://files.pythonhosted.org/packages/9b/e8/eacee01381e4c1899ab8f7c5908b56ec64644b39b4e39710d8efb2a17639/pyqwest-0.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed60a4fcd611005dfc8bce7c54092872878aa5b561f5d0ca2c102c26e963af92", size = 5431737, upload-time = "2026-06-03T04:27:50.392Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f2/3a6811beb2b3bcebc11ae23f41701de6e17d84dcc1e5f640b40a40c2e3a1/pyqwest-0.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f43bfdd48c34cad7142e662799abc21eae5e52f11dc726597e28685507eeed9", size = 5456680, upload-time = "2026-06-03T04:27:52.347Z" }, + { url = "https://files.pythonhosted.org/packages/49/4f/02a9be493063640b3313233829d51e7a869ba69f61f72d9d6de8e7da85ab/pyqwest-0.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bcc96ddb2fdffcb0d2e097a40d3543a1c367f630b3ec52b407f19f4768ceb372", size = 5598266, upload-time = "2026-06-03T04:27:54.338Z" }, + { url = "https://files.pythonhosted.org/packages/cb/71/b77e8ca4eb8077d4c59b6ce8126546963606b259f8a8faece3496e0d8b55/pyqwest-0.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4abee15a779c3cb5cd8d909394858dac2b6f4e3c405267343845089f97533089", size = 5764723, upload-time = "2026-06-03T04:27:56.079Z" }, + { url = "https://files.pythonhosted.org/packages/35/49/cf79bf01bacbbc66fd155fb826c38f2cde56a124d1c36497d8dd7360b2c2/pyqwest-0.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:3657d73ef879a2ce14866421166fb3722a6b4bb3d16f6c65dea412ab61fda1e4", size = 4638889, upload-time = "2026-06-03T04:27:57.907Z" }, + { url = "https://files.pythonhosted.org/packages/24/36/9f06c5c142deded7f017eb31366dbf9ebc771847a04dc18dbe867f50949d/pyqwest-0.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ec433cebf350febaff267ad7086538a1ab5591f9d925d47630c5c8aa08b81a28", size = 5060197, upload-time = "2026-06-03T04:27:59.783Z" }, + { url = "https://files.pythonhosted.org/packages/41/41/28647da41900d7886b48ff6299de805306555177e9e84ca59d298e4397f1/pyqwest-0.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e602bd007f24443f5d724698f7e2681e6f781812f343e5b35ab2e205ac37e410", size = 5432117, upload-time = "2026-06-03T04:28:02.024Z" }, + { url = "https://files.pythonhosted.org/packages/a3/79/7a326e0ee894598f315800a619c38a48e436b896fa7d62aaf8433107c073/pyqwest-0.6.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87790015729f67da7e8a9a9ce0a52a78fcede067c8ccb70715b844702ba4032b", size = 5456355, upload-time = "2026-06-03T04:28:03.933Z" }, + { url = "https://files.pythonhosted.org/packages/23/76/c0b78fff38a7303499127004b5f08fec9f1bddb672b6ef1fd354aedc0d4c/pyqwest-0.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8182052c1aac9964e5031dc788640d5ca35b42590a29b381905a3dcabbf949b2", size = 5598847, upload-time = "2026-06-03T04:28:05.762Z" }, + { url = "https://files.pythonhosted.org/packages/72/66/d50d783eb4c10a6ef7deb0f4dbc78d86541f3f837941d5d812852fff2c34/pyqwest-0.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8d2261b8ddccec5190b752ee17b6970273658d2e58e10a830c7cc02df644aa50", size = 5764050, upload-time = "2026-06-03T04:28:07.629Z" }, + { url = "https://files.pythonhosted.org/packages/ed/99/96e51a4ee48eece7ef7e90ea408ed2be61938baafedc967b1480eea35dce/pyqwest-0.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:cdf60fddd943b6f37943266f85a85ab1a9fb311c3bb6ae0e19c38c5cd05760fe", size = 4638396, upload-time = "2026-06-03T04:28:09.317Z" }, + { url = "https://files.pythonhosted.org/packages/63/48/3fdff162dfe53fc0d23b30bf9361c5b04c478b70650e4a0e2d925e13af9d/pyqwest-0.6.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:27312aff9a75daca71c30217d56508eeb71cd0fe38d3215a2fc387ed76de3152", size = 5051134, upload-time = "2026-06-03T04:28:11.011Z" }, + { url = "https://files.pythonhosted.org/packages/a6/6f/05b8844069cd100b7f7bb05fd3614b65de57e891eeeea51c22bb5258b04d/pyqwest-0.6.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65c34ce347b2808ec1d0bbc8b782b2056a533ec766fd2ff59fbb325cd18bdc4b", size = 5415703, upload-time = "2026-06-03T04:28:12.754Z" }, + { url = "https://files.pythonhosted.org/packages/ff/29/91eca1a9f6f9e979057c683a282e6a675c29d7da889e79b9f47f18770c5a/pyqwest-0.6.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81e53799ff552c7d7055329d39e6e9c18195b26d0ae9f4519dd017cb9234d1fa", size = 5441343, upload-time = "2026-06-03T04:28:14.404Z" }, + { url = "https://files.pythonhosted.org/packages/8a/87/7f077517f366d24b7e2fc689e4af6d4d14f1249877c3c9baf4cc86cb195f/pyqwest-0.6.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9435c4bd14fff49eb4001dea99687586d96acd37a17a59f5f695634e940553dc", size = 5578429, upload-time = "2026-06-03T04:28:16.247Z" }, + { url = "https://files.pythonhosted.org/packages/00/3d/7f2c7a19422073620c56f8ff783fa5e0629a88e8514a14b16da75487a49c/pyqwest-0.6.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c89f6ff8a95c5240016bc6477730c30c6a567fb2b4cb5a1f3b514a547a89dbf7", size = 5751362, upload-time = "2026-06-03T04:28:17.887Z" }, + { url = "https://files.pythonhosted.org/packages/03/51/3dee71abe73412a71f29f87624eb0f56cb84671a49753c95b8955d65938a/pyqwest-0.6.1-cp314-cp314-win_amd64.whl", hash = "sha256:9a2e64fed8f98debe6268f36852e65bd5f4f68375a1111a43838f6dbd6488d79", size = 4634526, upload-time = "2026-06-03T04:28:19.848Z" }, + { url = "https://files.pythonhosted.org/packages/a3/0e/f2d860948b1047b58e9cb7c650f8a10edf7cac03e634d7a7459d486b73a8/pyqwest-0.6.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:70967372a3c8cd32b313c8042ddfe9080c633ca0f5a79532e83bd4ae7b4f6892", size = 5055649, upload-time = "2026-06-03T04:28:21.827Z" }, + { url = "https://files.pythonhosted.org/packages/a4/18/bce5fb109efa1608f04ea6b056dc391dd80d0e21f8be4eae5115b61a189a/pyqwest-0.6.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c0106429e5c20e90855751515daa4544e2582cef50845807a709f7c57b8589e", size = 5427794, upload-time = "2026-06-03T04:28:23.442Z" }, + { url = "https://files.pythonhosted.org/packages/85/0b/6ee7823013ce02d1b61544bb85d94fd37b9eb5dafc9991b6f617354456e7/pyqwest-0.6.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76ea9fcce0faee86c8d564d790a99173aa3d81e3ffb0a781bcedbf0d41568135", size = 5451626, upload-time = "2026-06-03T04:28:25.202Z" }, + { url = "https://files.pythonhosted.org/packages/8d/10/37a66274f2e8d9bb38b4c52d4ef74d5fdc9d9d900a64ad36127add6261d8/pyqwest-0.6.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8f9651f84245277307938c73938061a7dc48730997b31131a3c2522cb08cbbb1", size = 5591040, upload-time = "2026-06-03T04:28:27.046Z" }, + { url = "https://files.pythonhosted.org/packages/1a/82/5ffaa3ab14551013931e511dee4021f18ff2a1b82fcc5757720f708f7ff1/pyqwest-0.6.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e4a9a601fe5ccdbb5005f00a88d0920863ca6259660984aa55d0f33394bc2ef5", size = 5758616, upload-time = "2026-06-03T04:28:28.976Z" }, + { url = "https://files.pythonhosted.org/packages/58/f3/bb6a553962564a55c69fd7fbff4c4ba3390ff9fbc0ed7e08ff4879c13af9/pyqwest-0.6.1-cp314-cp314t-win_amd64.whl", hash = "sha256:d0c3242d74db8e2679b5f76ffcc03e95ddf48d01c19d56f92a07e6580e06f6f0", size = 4635422, upload-time = "2026-06-03T04:28:30.765Z" }, + { url = "https://files.pythonhosted.org/packages/bf/7c/9e8e410f43f92acd253811eaedc9b830391b22d5fcbf0a05c9e0615b5432/pyqwest-0.6.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:555bef5910db6ea01eaafdd25e991a1d03222370a813fa88e6ed3996ac7b60ee", size = 5062058, upload-time = "2026-06-03T04:28:32.295Z" }, + { url = "https://files.pythonhosted.org/packages/5f/ba/3aa30ddd6e9ef8b0bc247b3484c6b8793decd2412bd0ee34708ba878d6ac/pyqwest-0.6.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a01af9b75000fdd908f372ca22d66d6f5ac7cbd6a1c1236b458054b52bf900e", size = 5436238, upload-time = "2026-06-03T04:28:33.979Z" }, + { url = "https://files.pythonhosted.org/packages/6b/37/72bccb0a0a657ad12d729a656bac19b83c11e64111995a7fbc7d102a65b3/pyqwest-0.6.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:921d4e14255e1ee4173e130739ec352c17dfd5b981272b5269975c1d743c3571", size = 5454319, upload-time = "2026-06-03T04:28:35.693Z" }, + { url = "https://files.pythonhosted.org/packages/c7/5b/f97dbd6eb03126ef96f0ddc660dcb2afe07f1478d1f0ed18ae4f97ca5195/pyqwest-0.6.1-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:cdfd9faa0c40cded2820c820109eb607b22d5cd4bdef554b14b040f4399fe60e", size = 5601997, upload-time = "2026-06-03T04:28:37.566Z" }, + { url = "https://files.pythonhosted.org/packages/99/1a/59a89b37e5c22c8caee2e57a394188d72745e7422a58e6563abb16c33cf3/pyqwest-0.6.1-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:a14f7205ec85a1016d87f2236afd1f8f636326f5c5eeba0ed45c20b1eeb7ed1d", size = 5762076, upload-time = "2026-06-03T04:28:39.438Z" }, + { url = "https://files.pythonhosted.org/packages/74/13/b03d44835645fa3862cee9bf56fba4f08f87b0ffbd6500053540fdc64370/pyqwest-0.6.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:e1552137c21fb41bb1ac90536990ba2947754db0c273a67222df61b9b04dc6a0", size = 4630947, upload-time = "2026-06-03T04:28:41.412Z" }, +] + [[package]] name = "pytest" version = "9.0.3" From 4eb5c6bcbc9c7b88d6b9348177b467fcd7062982 Mon Sep 17 00:00:00 2001 From: b-long Date: Wed, 3 Jun 2026 21:54:42 -0400 Subject: [PATCH 8/8] fix: only raise NotImplementedError for verify_ssl=False on HTTPS --- .../otdf-python/src/otdf_python/kas_connect_rpc_client.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/otdf-python/src/otdf_python/kas_connect_rpc_client.py b/packages/otdf-python/src/otdf_python/kas_connect_rpc_client.py index 6209bafd..8ee8176e 100644 --- a/packages/otdf-python/src/otdf_python/kas_connect_rpc_client.py +++ b/packages/otdf-python/src/otdf_python/kas_connect_rpc_client.py @@ -60,11 +60,11 @@ def _create_http_client(self): TLS certificate or CA data is also not yet implemented. """ - if not self.verify_ssl: + if not self.verify_ssl and not self.use_plaintext: raise NotImplementedError( - "verify_ssl=False is not supported: pyqwest does not expose an " - "option to disable TLS verification. Passing custom TLS cert or " - "CA data is also not yet implemented." + "verify_ssl=False is not supported for HTTPS connections: pyqwest " + "does not expose an option to disable TLS verification. Passing " + "custom TLS cert or CA data is also not yet implemented." ) self._transport = pyqwest.SyncHTTPTransport() return pyqwest.SyncClient(transport=self._transport)