From 25756764949e9fa18440c106bb7349f5b0cbde56 Mon Sep 17 00:00:00 2001 From: Soares Date: Tue, 20 Oct 2026 15:54:00 -0300 Subject: [PATCH] chore: bump ty to 0.0.88 and resolve new diagnostics --- pyproject.toml | 2 +- src/sap_cloud_sdk/adms/_async_http.py | 3 +- src/sap_cloud_sdk/agentgateway/converters.py | 13 ++++-- src/sap_cloud_sdk/core/auditlog/models.py | 12 +++-- src/sap_cloud_sdk/dms/model.py | 2 +- tests/adms/unit/test_cache.py | 2 +- .../unit/test_dependencies_resolver.py | 2 +- .../core/unit/auditlog/unit/test_transport.py | 2 +- .../unit/data_anonymization/test_transport.py | 2 +- .../instrumentation/test_instrumentation.py | 2 +- .../unit/telemetry/middleware/test_base.py | 6 +-- tests/dpi_ng/unit/test_base_odata_client.py | 2 +- uv.lock | 46 +++++++++---------- 13 files changed, 52 insertions(+), 44 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 9f27e64d..e8c3d4fe 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -65,7 +65,7 @@ dev = [ "pytest-asyncio>=1.0.0", "pytest-bdd>=7.2.0", "python-dotenv>=1.0.0", - "ty==0.0.64", + "ty==0.0.88", "cryptography>=48.0.1,<51", "ruff==0.16.0", "starlette>=0.40.0", diff --git a/src/sap_cloud_sdk/adms/_async_http.py b/src/sap_cloud_sdk/adms/_async_http.py index 931a25fe..28e6f516 100644 --- a/src/sap_cloud_sdk/adms/_async_http.py +++ b/src/sap_cloud_sdk/adms/_async_http.py @@ -29,6 +29,7 @@ from __future__ import annotations import asyncio +import inspect from typing import Any, Callable, Dict, Optional import httpx @@ -216,7 +217,7 @@ async def _bearer_token(self) -> Optional[str]: """Resolve the bearer token, handling both sync and async callables.""" if self._get_token is None: return None - if asyncio.iscoroutinefunction(self._get_token): + if inspect.iscoroutinefunction(self._get_token): return await self._get_token() return await asyncio.to_thread(self._get_token) diff --git a/src/sap_cloud_sdk/agentgateway/converters.py b/src/sap_cloud_sdk/agentgateway/converters.py index 025ff143..0825881e 100644 --- a/src/sap_cloud_sdk/agentgateway/converters.py +++ b/src/sap_cloud_sdk/agentgateway/converters.py @@ -215,6 +215,13 @@ async def run(**kwargs) -> str: fields[safe] = (py_type, Field(..., **field_kwargs)) args_schema = create_model(f"{mcp_tool.name}_args", **fields) if fields else None + # Only forward handle_tool_error when set, to preserve LangChain's default. + # Typed as dict[str, Any] so the ** unpack is not type-checked against each + # keyword parameter of from_function (which otherwise rejects the union value). + tool_kwargs: dict[str, Any] = {} + if handle_tool_error is not None: + tool_kwargs["handle_tool_error"] = handle_tool_error + return StructuredTool.from_function( coroutine=run, name=mcp_tool.name, @@ -222,9 +229,5 @@ async def run(**kwargs) -> str: mcp_tool.description, mcp_tool.output_schema ), args_schema=args_schema, - **( - {"handle_tool_error": handle_tool_error} - if handle_tool_error is not None - else {} - ), + **tool_kwargs, ) diff --git a/src/sap_cloud_sdk/core/auditlog/models.py b/src/sap_cloud_sdk/core/auditlog/models.py index fde7459f..b3011712 100644 --- a/src/sap_cloud_sdk/core/auditlog/models.py +++ b/src/sap_cloud_sdk/core/auditlog/models.py @@ -550,8 +550,10 @@ class DataDeletionEvent(DataModificationEvent): ValueError: If required fields are missing or invalid during validation """ - # Override the attributes field to use DeletedAttribute instead of ChangeAttribute - attributes: List[DeletedAttribute] = field(default_factory=list) + # Override the attributes field to use DeletedAttribute instead of ChangeAttribute. + # Deletion events intentionally carry a different attribute shape; the narrowing is + # by design, so the invariant-list override is suppressed rather than redesigned. + attributes: List[DeletedAttribute] = field(default_factory=list) # ty: ignore[invalid-attribute-override] def validate(self): """Validate the data deletion event - override parent validation.""" @@ -628,8 +630,10 @@ class ConfigurationDeletionEvent(ConfigurationChangeEvent): ValueError: If required fields are missing or invalid during validation """ - # Override the attributes field to use DeletedAttribute instead of ChangeAttribute - attributes: List[DeletedAttribute] = field(default_factory=list) + # Override the attributes field to use DeletedAttribute instead of ChangeAttribute. + # Deletion events intentionally carry a different attribute shape; the narrowing is + # by design, so the invariant-list override is suppressed rather than redesigned. + attributes: List[DeletedAttribute] = field(default_factory=list) # ty: ignore[invalid-attribute-override] def validate(self): """Validate the configuration deletion event - override parent validation.""" diff --git a/src/sap_cloud_sdk/dms/model.py b/src/sap_cloud_sdk/dms/model.py index b08f1d0f..a5070aa1 100644 --- a/src/sap_cloud_sdk/dms/model.py +++ b/src/sap_cloud_sdk/dms/model.py @@ -205,7 +205,7 @@ def _parse_repo_params(raw: Any) -> "RepositoryParams": - An empty list or ``None`` """ if not raw: - return cast(RepositoryParams, {}) + return {} if isinstance(raw, dict): raw = [raw] return cast(RepositoryParams, {p["paramName"]: p["paramValue"] for p in raw}) diff --git a/tests/adms/unit/test_cache.py b/tests/adms/unit/test_cache.py index 56247374..72074f45 100644 --- a/tests/adms/unit/test_cache.py +++ b/tests/adms/unit/test_cache.py @@ -52,7 +52,7 @@ def test_multiple_keys_are_independent(self): def test_token_cache_is_abstract(self): with pytest.raises(TypeError): - TokenCache() + TokenCache() # ty: ignore[call-non-callable] def test_valid_ttl_is_cached(self): cache = InMemoryTokenCache() diff --git a/tests/agentgateway/unit/test_dependencies_resolver.py b/tests/agentgateway/unit/test_dependencies_resolver.py index f4e7804b..f668eb28 100644 --- a/tests/agentgateway/unit/test_dependencies_resolver.py +++ b/tests/agentgateway/unit/test_dependencies_resolver.py @@ -120,7 +120,7 @@ class TestIntegrationDependenciesResolverInterface: def test_cannot_instantiate_abstract_class(self): """Cannot instantiate abstract base class directly.""" with pytest.raises(TypeError): - IntegrationDependenciesResolver() + IntegrationDependenciesResolver() # ty: ignore[call-non-callable] def test_custom_resolver_implementation(self): """Can create custom resolver implementation.""" diff --git a/tests/core/unit/auditlog/unit/test_transport.py b/tests/core/unit/auditlog/unit/test_transport.py index cc8671f1..cce6c486 100644 --- a/tests/core/unit/auditlog/unit/test_transport.py +++ b/tests/core/unit/auditlog/unit/test_transport.py @@ -24,7 +24,7 @@ def test_is_abstract_base_class(self): assert issubclass(Transport, ABC) with pytest.raises(TypeError): - Transport() + Transport() # ty: ignore[call-non-callable] def test_abstract_send_method(self): assert hasattr(Transport, 'send') diff --git a/tests/core/unit/data_anonymization/test_transport.py b/tests/core/unit/data_anonymization/test_transport.py index f4b9b8dc..e1e37610 100644 --- a/tests/core/unit/data_anonymization/test_transport.py +++ b/tests/core/unit/data_anonymization/test_transport.py @@ -46,7 +46,7 @@ def test_is_abstract_base_class(self) -> None: assert issubclass(Transport, ABC) try: - Transport() + Transport() # ty: ignore[call-non-callable] except TypeError: pass else: diff --git a/tests/core/unit/telemetry/instrumentation/test_instrumentation.py b/tests/core/unit/telemetry/instrumentation/test_instrumentation.py index ff3d61a3..76ea06fe 100644 --- a/tests/core/unit/telemetry/instrumentation/test_instrumentation.py +++ b/tests/core/unit/telemetry/instrumentation/test_instrumentation.py @@ -35,7 +35,7 @@ def _uninstrument(self) -> None: class _MissingLibraryInstrumentor(LibraryInstrumentor): - library_name = "_nonexistent_library_xyz" + library_name = "_nonexistent_library_xyz" # ty: ignore[invalid-assignment] def __init__(self): self._instrumented = False diff --git a/tests/core/unit/telemetry/middleware/test_base.py b/tests/core/unit/telemetry/middleware/test_base.py index 466c3c8c..3a765dfa 100644 --- a/tests/core/unit/telemetry/middleware/test_base.py +++ b/tests/core/unit/telemetry/middleware/test_base.py @@ -8,7 +8,7 @@ class TestTelemetryMiddlewareAbstract: def test_cannot_instantiate_directly(self): with pytest.raises(TypeError): - TelemetryMiddleware() + TelemetryMiddleware() # ty: ignore[call-non-callable] def test_concrete_subclass_with_both_methods_works(self): class Concrete(TelemetryMiddleware): @@ -28,7 +28,7 @@ def get_attributes(self): return {} with pytest.raises(TypeError): - Incomplete() + Incomplete() # ty: ignore[call-non-callable] def test_missing_get_attributes_raises(self): class Incomplete(TelemetryMiddleware): @@ -36,4 +36,4 @@ def register(self): pass with pytest.raises(TypeError): - Incomplete() + Incomplete() # ty: ignore[call-non-callable] diff --git a/tests/dpi_ng/unit/test_base_odata_client.py b/tests/dpi_ng/unit/test_base_odata_client.py index 1a9de005..d748d059 100644 --- a/tests/dpi_ng/unit/test_base_odata_client.py +++ b/tests/dpi_ng/unit/test_base_odata_client.py @@ -31,7 +31,7 @@ def _get_entity_factories(self): class TestBaseODataClientAbstract: def test_cannot_instantiate_base_directly(self, _): with pytest.raises(TypeError): - BaseODataClient(_make_config()) # type: ignore[abstract] + BaseODataClient(_make_config()) # type: ignore[abstract] # ty: ignore[call-non-callable] def test_concrete_subclass_instantiates(self, mock_session_cls): mock_session_cls.return_value = MagicMock() diff --git a/uv.lock b/uv.lock index 09132f61..60cd2534 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 5 +revision = 3 requires-python = ">=3.11" resolution-markers = [ "python_full_version >= '3.15' and sys_platform == 'win32'", @@ -4507,7 +4507,7 @@ dev = [ { name = "ruff", specifier = "==0.16.0" }, { name = "sqlalchemy", specifier = ">=2.0.0" }, { name = "starlette", specifier = ">=0.40.0" }, - { name = "ty", specifier = "==0.0.64" }, + { name = "ty", specifier = "==0.0.88" }, ] [[package]] @@ -4857,27 +4857,27 @@ wheels = [ [[package]] name = "ty" -version = "0.0.64" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8e/aa/14c9965d3b173105692473897cc89c34cd91241368b2044e43167e1c17ff/ty-0.0.64.tar.gz", hash = "sha256:d12ddbb05f15158bb518af619378b385486450def95fb06f8ab98037febe9f2c", size = 6350966, upload-time = "2026-07-27T18:32:45.403Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ae/4c/c54937e4ff3fa7b34a99ea3387ec766bf0ad98dc8df8d792e89b388e658e/ty-0.0.64-py3-none-linux_armv6l.whl", hash = "sha256:3830a6675ab43635ced1c4c557f380ac4a49e9414e03975e4e4e8db644c64944", size = 12118357, upload-time = "2026-07-27T18:32:08.702Z" }, - { url = "https://files.pythonhosted.org/packages/ce/aa/a839ee2bc78e943d079e6abe199a97b4eeffb7e5c9a57326d69de452186a/ty-0.0.64-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:3ff07d7bc32a2135f58afe57393789a32ea2fed1a66216129a8e535e76043903", size = 11790882, upload-time = "2026-07-27T18:32:10.997Z" }, - { url = "https://files.pythonhosted.org/packages/4c/de/19f14357888a7198438926303753cf749428e3d62e8980ff1e9a72a78402/ty-0.0.64-py3-none-macosx_11_0_arm64.whl", hash = "sha256:4f6d1c7f897cca05d12bacbf1435150d5ffa496099515aa6ed303c8b29e1d0bb", size = 11317394, upload-time = "2026-07-27T18:32:13.162Z" }, - { url = "https://files.pythonhosted.org/packages/08/2f/f54462300535ab99b551eda733177be2eef5dbc2997d3fdb357c4ddd760a/ty-0.0.64-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:138d6c37ad4bf8583aa7a9b29d90954151d7856f9910a03eae3eb34b34c57215", size = 11863042, upload-time = "2026-07-27T18:32:15.307Z" }, - { url = "https://files.pythonhosted.org/packages/5e/95/dbecf745520ebe8bd7b02fc55eee6441c9be312ebf6addce605eb52740dd/ty-0.0.64-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1ed9719d1b7b66fb8efe073d860208a44c40af1f6cd5c2364aa9b323a1e579b4", size = 11910730, upload-time = "2026-07-27T18:32:17.467Z" }, - { url = "https://files.pythonhosted.org/packages/3b/26/12cfd40028e51ceed7b3cb645281c61c02eb64ff9fb0c09231d65c30ff25/ty-0.0.64-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d68b23e5169e2137b5f1de7169ab0cebecab6c8eda374c34c1f6394308f58242", size = 12631936, upload-time = "2026-07-27T18:32:19.533Z" }, - { url = "https://files.pythonhosted.org/packages/a0/d0/65ffc2b0a686347193c6f98e9421a7fc2a96fc3cd0b1001cf7cf284baff9/ty-0.0.64-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f41cb07d89d32626fcaf3ed4d262778fcb28b2628b6ed1e172cd7b18820668d8", size = 13171049, upload-time = "2026-07-27T18:32:22.026Z" }, - { url = "https://files.pythonhosted.org/packages/f6/a4/975a5961842dcd6fa60f0770a102c0bba7509da909ab652919bfcdcd4fc7/ty-0.0.64-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5f24e1504ab9e212f92356b82fe088fdeb3a39f9a2f4ff25e505d2e1d0db9056", size = 12826438, upload-time = "2026-07-27T18:32:24.178Z" }, - { url = "https://files.pythonhosted.org/packages/af/ef/dfb9b7f9bcc032d3b540b0d1f55f532a336e2fb41b1bd539c05ae81a151a/ty-0.0.64-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86db830cb914bb33bb8247b66ccea58de4496c2391bd42658aba744b439f3290", size = 12440880, upload-time = "2026-07-27T18:32:26.341Z" }, - { url = "https://files.pythonhosted.org/packages/ee/d0/bedac20505e8a8f5501ad73d7d15d8e421a563fef59993909a23036929a4/ty-0.0.64-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:652ee3d6d03bea76cd2fe8949c78bb5970394ebd7c5fd270e9518c0dee1b931d", size = 12782439, upload-time = "2026-07-27T18:32:28.642Z" }, - { url = "https://files.pythonhosted.org/packages/79/d5/795733f13ceff1378f08b3de0c49d0f518df220ed856b0dfac869f3b7c81/ty-0.0.64-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:4838768295774a86e95f9ec5633e739d016adbbb69dcbdc62f3549578a11f624", size = 11814821, upload-time = "2026-07-27T18:32:30.632Z" }, - { url = "https://files.pythonhosted.org/packages/52/3e/9d99cd1e1831003434f508ed9f258a56543194afc3bbe051eba2545fa676/ty-0.0.64-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:5a3d700669868599edf39ce5125196682f15a8880cc8c669bc2a83b99984d99b", size = 11928678, upload-time = "2026-07-27T18:32:32.888Z" }, - { url = "https://files.pythonhosted.org/packages/b8/3d/448f49a3503fb119a34348a5714bb92001f252fadbbb12d645f2e744b557/ty-0.0.64-py3-none-musllinux_1_2_i686.whl", hash = "sha256:b161f0a82a8e2f2432db3bf7702b4d3924fa9486ba0014f6710a160fc157df0d", size = 12202249, upload-time = "2026-07-27T18:32:34.905Z" }, - { url = "https://files.pythonhosted.org/packages/dd/9b/75768e562cec990d189dc05807ae72890b20ffbd1e1f43597bb98db63c60/ty-0.0.64-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:39b9dd42908df47c2dc57dda87e656fab97097ffd2618474bbdea986af0d6a9d", size = 12548817, upload-time = "2026-07-27T18:32:36.995Z" }, - { url = "https://files.pythonhosted.org/packages/34/89/44cc276ea6ca0245495014758ffeadde1798fb0b5840c9cf36d8d2ed3250/ty-0.0.64-py3-none-win32.whl", hash = "sha256:d0676ab0e0935795e5843baa28dd5e366dc343d7c0945a996df9eab8e0644885", size = 11545474, upload-time = "2026-07-27T18:32:39.389Z" }, - { url = "https://files.pythonhosted.org/packages/01/7e/d1c8a871a38d17c8f168b9a6975f6247f7660f8334e517656a5e4b4a4858/ty-0.0.64-py3-none-win_amd64.whl", hash = "sha256:dcb9bd31f54097e362b776c26ab4564d4564cdd1355cb883481167a26c03cc3f", size = 12542987, upload-time = "2026-07-27T18:32:41.412Z" }, - { url = "https://files.pythonhosted.org/packages/35/4d/6d18640d0204cacd69abbaca95ad6a34c6d7e9169e9051d0117b17b827ec/ty-0.0.64-py3-none-win_arm64.whl", hash = "sha256:82cc34c1ad9a8feb6059aef193bebcecc656e548f6fab3d518bcd8b57d198d39", size = 11899263, upload-time = "2026-07-27T18:32:43.366Z" }, +version = "0.0.88" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/e8/303e333a45289c2f1f006661c9aa535de83b316a6bfc2d2f97ba815be143/ty-0.0.88.tar.gz", hash = "sha256:5e3165a05b3757edd5a08b1fc6cb4a00c3b067100416d50afb2d13a5ec102206", size = 7968779, upload-time = "2026-10-15T09:41:07.334Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/7e/a62ddf5c56cf0f96fdc268bb0ec4bfe16e28b50d9158de8e7038b004e515/ty-0.0.88-py3-none-linux_armv6l.whl", hash = "sha256:19f24e69e97d9edfb05fb2e1c7fe2b6fcce275338415e2f7de23d74627f2b436", size = 14240767, upload-time = "2026-10-15T09:40:23.285Z" }, + { url = "https://files.pythonhosted.org/packages/77/b0/ca23cf93931c6dcf790376c2dac6d2cbcbc1c5fbbead6a536c52eae6ac22/ty-0.0.88-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:957f0db83b9b0f837b86fe4a0a8fb98db8da89444555246871e6eb2820629c1b", size = 13755861, upload-time = "2026-10-15T09:40:26.292Z" }, + { url = "https://files.pythonhosted.org/packages/8c/a6/91d2aa967a69535845445660d3a9412f7f4f746597c650e5d3a799c9e286/ty-0.0.88-py3-none-macosx_11_0_arm64.whl", hash = "sha256:021bd4a6d01d4a39e48a87e308161e7adea851b8cab9f4c71452dde6e365aa15", size = 12771934, upload-time = "2026-10-15T09:40:28.913Z" }, + { url = "https://files.pythonhosted.org/packages/2e/a4/266f2dacbded7fac1f567292363ad05d4d03b246a8bd5ccd68206d0c9ce0/ty-0.0.88-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcd956e6c3c8b038a3725f2bf255a45a284ece64a012a4e790fbf23db862af84", size = 13638979, upload-time = "2026-10-15T09:40:31.49Z" }, + { url = "https://files.pythonhosted.org/packages/18/c9/4d7ec25675e9d2d70d9a8635d47b4737540818852e35fc6b7ca47b3e7f99/ty-0.0.88-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a8beb5fe8ae4ee8853891647d27cec7b65f6547532e9250cd3439181993aa973", size = 13971852, upload-time = "2026-10-15T09:40:34.039Z" }, + { url = "https://files.pythonhosted.org/packages/57/5d/0753dd860127f2601333156948ce2680ac2f65534ee39c81e9d4623f51aa/ty-0.0.88-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6aa805d8d4ab6512ca9591c221f828d818c000cdd5bd5108923eb21405eefebd", size = 14876774, upload-time = "2026-10-15T09:40:36.86Z" }, + { url = "https://files.pythonhosted.org/packages/26/8b/706b59938c4c83caed1df9a74f9b6d1e9d7d196b5006f3655b618daab5da/ty-0.0.88-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7dfb625a98f8fb02995aa3e3fb762c910158f1419bf38d1d1dcb97f35526e4b0", size = 15249187, upload-time = "2026-10-15T09:40:39.643Z" }, + { url = "https://files.pythonhosted.org/packages/09/1a/1a214f674e66c65347380cc8b637ffbb50624ab4ff7dc0d6f0bf34c64303/ty-0.0.88-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6784a5398c69ea39ad43512ba5fa7850599d8f371b7caa974dc8603b9634e63f", size = 15202315, upload-time = "2026-10-15T09:40:42.436Z" }, + { url = "https://files.pythonhosted.org/packages/e4/9e/a8a0af89ce94e87f6b4fdec62dce473d2858223ba7298276911c568f413c/ty-0.0.88-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ec0c364abad7e81013c1b4ec788d811078b9b20a8a2e07ac8613499eb6f104f", size = 14447671, upload-time = "2026-10-15T09:40:44.842Z" }, + { url = "https://files.pythonhosted.org/packages/17/74/be3cd8bee9ad01615449a1c22c6be2cc9a5d652eb6c1e9b2e993dc8b9141/ty-0.0.88-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:96940e5393ec00732bfaa747825979ebd971f0bafe538538d164bcba4cec5408", size = 14728283, upload-time = "2026-10-15T09:40:47.47Z" }, + { url = "https://files.pythonhosted.org/packages/84/e7/5918d99b7aff20c4a55f50d64620186af822a023ca767b65d965a3fd4858/ty-0.0.88-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:c245fab62af678d3df2e8bf26550c0f81f5567b72de670863e300cab07d0b891", size = 13637751, upload-time = "2026-10-15T09:40:49.832Z" }, + { url = "https://files.pythonhosted.org/packages/c5/df/2eb1ddfafd986fdfa7be9941f2665945fe6dbcc952309195ba536f6394fd/ty-0.0.88-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:90407c5c7e0387295aab0e2d4de0ed7a7942f9793a4628942f367257d431e55c", size = 13985403, upload-time = "2026-10-15T09:40:52.348Z" }, + { url = "https://files.pythonhosted.org/packages/67/12/f9fc5e038dd2f0372be8ffbf5b1e429ef084035efdede5288a6fae74c52f/ty-0.0.88-py3-none-musllinux_1_2_i686.whl", hash = "sha256:591ef09e37bec260399cd526d694a815b8f1dab55dc841a44bd9ccb78cca84a1", size = 14305076, upload-time = "2026-10-15T09:40:54.944Z" }, + { url = "https://files.pythonhosted.org/packages/5e/5a/8a5e7c43b5d981d1f383602ddeaea91e0fde18900d1808ee74e1c894570c/ty-0.0.88-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:092522f2fa87becfb3b098a1f58ec1b82dfd7c87eaa0533c5ce500a743d8e79e", size = 14637327, upload-time = "2026-10-15T09:40:57.462Z" }, + { url = "https://files.pythonhosted.org/packages/5f/16/426272696ea754575305868787b35f18c23a3851c363827f27c7c8093cff/ty-0.0.88-py3-none-win32.whl", hash = "sha256:954cc19cd68015d4e92eb3f9218760d324dbdf67daae0e0da2c0179b644f450f", size = 13178338, upload-time = "2026-10-15T09:41:00.059Z" }, + { url = "https://files.pythonhosted.org/packages/49/a1/db4113fa72d44a28aeeccf3a71f9a803b278d945b11fa7b070a703d8bffd/ty-0.0.88-py3-none-win_amd64.whl", hash = "sha256:c76f1c65a492fed594bc14a1c70a1fdacd8a3165440a1eaa5af7f3c248fee963", size = 13690632, upload-time = "2026-10-15T09:41:02.379Z" }, + { url = "https://files.pythonhosted.org/packages/70/16/bc82e209f0d4de6213d41f58dd619b3e65d24cb58a6da0cd7c6665dd6654/ty-0.0.88-py3-none-win_arm64.whl", hash = "sha256:9b4289f6dec4123cf671a5b3d9512cdbf03889996d6895efc595bdc50573eafc", size = 13251351, upload-time = "2026-10-15T09:41:04.912Z" }, ] [[package]]