]> git.ipfire.org Git - thirdparty/fastapi/fastapi.git/commitdiff
⬆ Bump ty from 0.0.21 to 0.0.34 (#15443)
authordependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Mon, 11 May 2026 14:59:50 +0000 (16:59 +0200)
committerGitHub <noreply@github.com>
Mon, 11 May 2026 14:59:50 +0000 (16:59 +0200)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: svlandeg <sofie.vanlandeghem@gmail.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
13 files changed:
fastapi/_compat/shared.py
fastapi/_compat/v2.py
fastapi/applications.py
fastapi/cli.py
fastapi/dependencies/utils.py
fastapi/encoders.py
fastapi/openapi/models.py
fastapi/openapi/utils.py
fastapi/params.py
fastapi/responses.py
fastapi/routing.py
pyproject.toml
uv.lock

index 9d76dabe69a444d18fbe2bacb9a161d35f1ec3d7..bd38c553442dfb145dd8c73145c242ec3311aedc 100644 (file)
@@ -23,7 +23,7 @@ _T = TypeVar("_T")
 
 # Copy from Pydantic: pydantic/_internal/_typing_extra.py
 WithArgsTypes: tuple[Any, ...] = (
-    typing._GenericAlias,  # type: ignore[attr-defined]
+    typing._GenericAlias,  # type: ignore[attr-defined]  # ty: ignore[unresolved-attribute]
     types.GenericAlias,
     types.UnionType,
 )  # pyright: ignore[reportAttributeAccessIssue]
@@ -48,7 +48,7 @@ def lenient_issubclass(
     cls: Any, class_or_tuple: type[_T] | tuple[type[_T], ...] | None
 ) -> TypeGuard[type[_T]]:
     try:
-        return isinstance(cls, type) and issubclass(cls, class_or_tuple)  # type: ignore[arg-type]
+        return isinstance(cls, type) and issubclass(cls, class_or_tuple)  # type: ignore[arg-type]  # ty: ignore[invalid-argument-type]
     except TypeError:  # pragma: no cover
         if isinstance(cls, WithArgsTypes):
             return False
index 3b64fba76c900dfd3542d8016b41927a5d6a76c1..7be686d8655a9e7720ff0d751f82283cac20db98 100644 (file)
@@ -23,7 +23,7 @@ from pydantic import PydanticSchemaGenerationError as PydanticSchemaGenerationEr
 from pydantic import PydanticUndefinedAnnotation as PydanticUndefinedAnnotation
 from pydantic import ValidationError as ValidationError
 from pydantic._internal import _typing_extra as _pydantic_typing_extra
-from pydantic._internal._schema_generation_shared import (  # type: ignore[attr-defined]  # ty: ignore[unused-ignore-comment]
+from pydantic._internal._schema_generation_shared import (  # type: ignore[attr-defined]
     GetJsonSchemaHandler as GetJsonSchemaHandler,
 )
 from pydantic.fields import FieldInfo as FieldInfo
@@ -372,8 +372,8 @@ def serialize_sequence_value(*, field: ModelField, value: Any) -> Sequence[Any]:
                 continue
             origin_type = get_origin(union_arg) or union_arg
             break
-    assert issubclass(origin_type, shared.sequence_types)  # type: ignore[arg-type]
-    return shared.sequence_annotation_to_type[origin_type](value)  # type: ignore[no-any-return,index]
+    assert issubclass(origin_type, shared.sequence_types)  # type: ignore[arg-type]  # ty: ignore[invalid-argument-type]
+    return shared.sequence_annotation_to_type[origin_type](value)  # type: ignore[no-any-return,index]  # ty: ignore[invalid-return-type]
 
 
 def get_missing_field_error(loc: tuple[int | str, ...]) -> dict[str, Any]:
@@ -381,14 +381,14 @@ def get_missing_field_error(loc: tuple[int | str, ...]) -> dict[str, Any]:
         "Field required", [{"type": "missing", "loc": loc, "input": {}}]
     ).errors(include_url=False)[0]
     error["input"] = None
-    return error  # type: ignore[return-value]
+    return error  # type: ignore[return-value]  # ty: ignore[invalid-return-type]
 
 
 def create_body_model(
     *, fields: Sequence[ModelField], model_name: str
 ) -> type[BaseModel]:
     field_params = {f.name: (f.field_info.annotation, f.field_info) for f in fields}
-    BodyModel: type[BaseModel] = create_model(model_name, **field_params)  # type: ignore[call-overload]
+    BodyModel: type[BaseModel] = create_model(model_name, **field_params)  # type: ignore[call-overload]  # ty: ignore[no-matching-overload]
     return BodyModel
 
 
@@ -451,7 +451,7 @@ def get_flat_models_from_annotation(
         for arg in get_args(annotation):
             if lenient_issubclass(arg, (BaseModel, Enum)):
                 if arg not in known_models:
-                    known_models.add(arg)  # type: ignore[arg-type]  # ty: ignore[unused-ignore-comment]
+                    known_models.add(arg)  # type: ignore[arg-type]
                     if lenient_issubclass(arg, BaseModel):
                         get_flat_models_from_model(arg, known_models=known_models)
             else:
index 4af1146b0d8f9a8c079432cc5cb5405a6472fea5..faac6853faf19d8887172f7fa9b69c2d5c515c40 100644 (file)
@@ -1006,7 +1006,7 @@ class FastAPI(Starlette):
         # Starlette still has incorrect type specification for the handlers
         self.exception_handlers.setdefault(
             WebSocketRequestValidationError,
-            websocket_request_validation_exception_handler,  # type: ignore[arg-type]  # ty: ignore[unused-ignore-comment]
+            websocket_request_validation_exception_handler,  # type: ignore[arg-type]
         )  # ty: ignore[no-matching-overload]
 
         self.user_middleware: list[Middleware] = (
@@ -1029,11 +1029,11 @@ class FastAPI(Starlette):
                 exception_handlers[key] = value
 
         middleware = (
-            [Middleware(ServerErrorMiddleware, handler=error_handler, debug=debug)]  # ty: ignore[invalid-argument-type]
+            [Middleware(ServerErrorMiddleware, handler=error_handler, debug=debug)]
             + self.user_middleware
             + [
                 Middleware(
-                    ExceptionMiddleware,  # ty: ignore[invalid-argument-type]
+                    ExceptionMiddleware,
                     handlers=exception_handlers,
                     debug=debug,
                 ),
@@ -1056,7 +1056,7 @@ class FastAPI(Starlette):
                 # user middlewares, the same context is used.
                 # This is currently not needed, only for closing files, but used to be
                 # important when dependencies with yield were closed here.
-                Middleware(AsyncExitStackMiddleware),  # ty: ignore[invalid-argument-type]
+                Middleware(AsyncExitStackMiddleware),
             ]
         )
 
@@ -4638,7 +4638,7 @@ class FastAPI(Starlette):
         """
 
         def decorator(func: DecoratedCallable) -> DecoratedCallable:
-            self.add_middleware(BaseHTTPMiddleware, dispatch=func)  # ty: ignore[invalid-argument-type]
+            self.add_middleware(BaseHTTPMiddleware, dispatch=func)
             return func
 
         return decorator
index fda271a53a390ab4e735a2a8b4bbc3e9fecac424..8d3301e9daf73b474162d712f4b87f54ccd97a16 100644 (file)
@@ -6,7 +6,7 @@ except ImportError:  # pragma: no cover
 
 
 def main() -> None:
-    if not cli_main:  # type: ignore[truthy-function]  # ty: ignore[unused-ignore-comment]
+    if not cli_main:  # type: ignore[truthy-function]
         message = 'To use the fastapi command, please install "fastapi[standard]":\n\n\tpip install "fastapi[standard]"\n'
         print(message)
         raise RuntimeError(message)  # noqa: B904
index aceca6a1d3a658435d107c342d92515eb489b053..7c6558c695948ac3242f2a7cecbae8e9f84f5895 100644 (file)
@@ -100,14 +100,14 @@ def ensure_multipart_is_installed() -> None:
     except (ImportError, AssertionError):
         try:
             # __version__ is available in both multiparts, and can be mocked
-            from multipart import (  # type: ignore[no-redef,import-untyped]  # ty: ignore[unused-ignore-comment]
+            from multipart import (  # type: ignore[no-redef,import-untyped]
                 __version__,
             )
 
             assert __version__
             try:
                 # parse_options_header is only available in the right multipart
-                from multipart.multipart import (  # type: ignore[import-untyped]  # ty: ignore[unused-ignore-comment]
+                from multipart.multipart import (  # type: ignore[import-untyped]
                     parse_options_header,
                 )
 
@@ -622,7 +622,7 @@ async def solve_dependencies(
     if response is None:
         response = Response()
         del response.headers["content-length"]
-        response.status_code = None  # type: ignore  # ty: ignore[unused-ignore-comment]
+        response.status_code = None  # type: ignore
     if dependency_cache is None:
         dependency_cache = {}
     for sub_dependant in dependant.dependencies:
index 43f24101b6f8b559b5133f546dff9e95a9666ce8..c9f882d2bae15511d157c017102d478f01846e66 100644 (file)
@@ -36,7 +36,7 @@ try:
     from pydantic.color import Color  # ty: ignore[deprecated]
 except ImportError:  # pragma: no cover
 
-    class Color:  # type: ignore[no-redef]  # ty: ignore[unused-ignore-comment]
+    class Color:  # type: ignore[no-redef]
         pass
 
 
@@ -45,7 +45,7 @@ try:
     from pydantic_extra_types.color import Color as PyExtraColor
 except ImportError:  # pragma: no cover
 
-    class PyExtraColor:  # type: ignore[no-redef]  # ty: ignore[unused-ignore-comment]
+    class PyExtraColor:  # type: ignore[no-redef]
         pass
 
 
@@ -237,9 +237,9 @@ def jsonable_encoder(
                 if isinstance(obj, encoder_type):
                     return encoder_instance(obj)
     if include is not None and not isinstance(include, (set, dict)):
-        include = set(include)  # type: ignore[assignment]  # ty: ignore[unused-ignore-comment]
+        include = set(include)  # type: ignore[assignment]  # ty: ignore[invalid-assignment]
     if exclude is not None and not isinstance(exclude, (set, dict)):
-        exclude = set(exclude)  # type: ignore[assignment]  # ty: ignore[unused-ignore-comment]
+        exclude = set(exclude)  # type: ignore[assignment]  # ty: ignore[invalid-assignment]
     if isinstance(obj, BaseModel):
         obj_dict = obj.model_dump(
             mode="json",
index b9fad31a7044eb6088d26862545d4e4d69e7afc1..ca26bf931e196fa9c5ef367838c98bdff730b230 100644 (file)
@@ -20,7 +20,7 @@ try:
     from pydantic import EmailStr
 except ImportError:  # pragma: no cover
 
-    class EmailStr(str):  # type: ignore  # ty: ignore[unused-ignore-comment]
+    class EmailStr(str):  # type: ignore[no-redef]
         @classmethod
         def __get_validators__(cls) -> Iterable[Callable[..., Any]]:
             yield cls.validate
@@ -215,7 +215,7 @@ class Example(TypedDict, total=False):
     value: Any | None
     externalValue: AnyUrl | None
 
-    __pydantic_config__ = {"extra": "allow"}  # type: ignore[misc]
+    __pydantic_config__ = {"extra": "allow"}  # type: ignore[misc]  # ty: ignore[invalid-typed-dict-statement]
 
 
 class ParameterInType(Enum):
index 8f1852b0cc3f3a7d778d9c2ee95e3aeba1235332..1c7a17c4cad13398cfd19c22c77b576953be58df 100644 (file)
@@ -603,4 +603,4 @@ def get_openapi(
         output["tags"] = tags
     if external_docs:
         output["externalDocs"] = external_docs
-    return jsonable_encoder(OpenAPI(**output), by_alias=True, exclude_none=True)  # type: ignore  # ty: ignore[unused-ignore-comment]
+    return jsonable_encoder(OpenAPI(**output), by_alias=True, exclude_none=True)  # type: ignore[no-any-return]
index e8f2eb290d31bc584b9481675dadb5b05940e9de..d3f2ae175b1fd3f0dc95c2be70ec7c546040f6ae 100644 (file)
@@ -23,7 +23,7 @@ class ParamTypes(Enum):
     cookie = "cookie"
 
 
-class Param(FieldInfo):  # type: ignore[misc]
+class Param(FieldInfo):  # type: ignore[misc]  # ty: ignore[subclass-of-final-class]
     in_: ParamTypes
 
     def __init__(
@@ -128,13 +128,13 @@ class Param(FieldInfo):  # type: ignore[misc]
 
         use_kwargs = {k: v for k, v in kwargs.items() if v is not _Unset}
 
-        super().__init__(**use_kwargs)
+        super().__init__(**use_kwargs)  # ty: ignore[invalid-argument-type]
 
     def __repr__(self) -> str:
         return f"{self.__class__.__name__}({self.default})"
 
 
-class Path(Param):  # type: ignore[misc]  # ty: ignore[unused-ignore-comment]
+class Path(Param):  # type: ignore[misc]
     in_ = ParamTypes.path
 
     def __init__(
@@ -218,7 +218,7 @@ class Path(Param):  # type: ignore[misc]  # ty: ignore[unused-ignore-comment]
         )
 
 
-class Query(Param):  # type: ignore[misc]  # ty: ignore[unused-ignore-comment]
+class Query(Param):  # type: ignore[misc]
     in_ = ParamTypes.query
 
     def __init__(
@@ -300,7 +300,7 @@ class Query(Param):  # type: ignore[misc]  # ty: ignore[unused-ignore-comment]
         )
 
 
-class Header(Param):  # type: ignore[misc]  # ty: ignore[unused-ignore-comment]
+class Header(Param):  # type: ignore[misc]
     in_ = ParamTypes.header
 
     def __init__(
@@ -384,7 +384,7 @@ class Header(Param):  # type: ignore[misc]  # ty: ignore[unused-ignore-comment]
         )
 
 
-class Cookie(Param):  # type: ignore[misc]  # ty: ignore[unused-ignore-comment]
+class Cookie(Param):  # type: ignore[misc]
     in_ = ParamTypes.cookie
 
     def __init__(
@@ -466,7 +466,7 @@ class Cookie(Param):  # type: ignore[misc]  # ty: ignore[unused-ignore-comment]
         )
 
 
-class Body(FieldInfo):  # type: ignore[misc]
+class Body(FieldInfo):  # type: ignore[misc]  # ty: ignore[subclass-of-final-class]
     def __init__(
         self,
         default: Any = Undefined,
@@ -572,13 +572,13 @@ class Body(FieldInfo):  # type: ignore[misc]
 
         use_kwargs = {k: v for k, v in kwargs.items() if v is not _Unset}
 
-        super().__init__(**use_kwargs)
+        super().__init__(**use_kwargs)  # ty: ignore[invalid-argument-type]
 
     def __repr__(self) -> str:
         return f"{self.__class__.__name__}({self.default})"
 
 
-class Form(Body):  # type: ignore[misc]  # ty: ignore[unused-ignore-comment]
+class Form(Body):  # type: ignore[misc]
     def __init__(
         self,
         default: Any = Undefined,
@@ -660,7 +660,7 @@ class Form(Body):  # type: ignore[misc]  # ty: ignore[unused-ignore-comment]
         )
 
 
-class File(Form):  # type: ignore[misc]  # ty: ignore[unused-ignore-comment]
+class File(Form):  # type: ignore[misc]
     def __init__(
         self,
         default: Any = Undefined,
index 970f365513237e366436bdea8c5946d9472bcc0d..29df4b7a614b411237700d25c4ac27b985811730 100644 (file)
@@ -27,13 +27,13 @@ class _OrjsonModule(Protocol):
 try:
     ujson = cast(_UjsonModule, importlib.import_module("ujson"))
 except ModuleNotFoundError:  # pragma: nocover
-    ujson = None  # type: ignore  # ty: ignore[unused-ignore-comment]
+    ujson = None  # type: ignore[assignment]
 
 
 try:
     orjson = cast(_OrjsonModule, importlib.import_module("orjson"))
 except ModuleNotFoundError:  # pragma: nocover
-    orjson = None  # type: ignore  # ty: ignore[unused-ignore-comment]
+    orjson = None  # type: ignore[assignment]
 
 
 @deprecated(
index 36acb6b89dd49a53946769b38d7c39665b3d1e57..21a1385a27b4223eb20d3726cf2c711b0e698d91 100644 (file)
@@ -102,9 +102,9 @@ def request_response(
     and returns an ASGI application.
     """
     f: Callable[[Request], Awaitable[Response]] = (
-        func  # type: ignore[assignment]  # ty: ignore[unused-ignore-comment]
+        func  # type: ignore[assignment]
         if is_async_callable(func)
-        else functools.partial(run_in_threadpool, func)  # type: ignore[call-arg]  # ty: ignore[unused-ignore-comment]
+        else functools.partial(run_in_threadpool, func)  # type: ignore[call-arg]
     )  # ty: ignore[invalid-assignment]
 
     async def app(scope: Scope, receive: Receive, send: Send) -> None:
@@ -220,7 +220,7 @@ def _merge_lifespan_context(
                 else:
                     yield {**(maybe_nested_state or {}), **(maybe_original_state or {})}
 
-    return merged_lifespan  # type: ignore[return-value]
+    return merged_lifespan  # type: ignore[return-value]  # ty: ignore[invalid-return-type]
 
 
 class _DefaultLifespan:
@@ -912,7 +912,7 @@ class APIRoute(routing.Route):
                 mode="serialization",
             )
         else:
-            self.response_field = None  # type: ignore  # ty: ignore[unused-ignore-comment]
+            self.response_field = None  # type: ignore[assignment]
         if self.stream_item_type:
             stream_item_name = "StreamItem_" + self.unique_id
             self.stream_item_field: ModelField | None = create_model_field(
index 7abb9a33c431d41c7eb1de515641d7ec22e68b1a..2d0e4cc8bc5b16bd35f125331acd207ea7cf3509 100644 (file)
@@ -175,7 +175,7 @@ tests = [
     "pyyaml >=5.3.1,<7.0.0",
     "sqlmodel >=0.0.31",
     "strawberry-graphql >=0.200.0,<1.0.0",
-    "ty>=0.0.9",
+    "ty>=0.0.25",
     "a2wsgi >=1.9.0,<=2.0.0",
     "pytest-xdist[psutil]>=2.5.0",
     "pytest-cov>=4.0.0",
@@ -372,3 +372,6 @@ fo = "fo"
 havin = "havin"
 Ines = "Ines"
 ser = "ser"
+
+[tool.ty.terminal]
+error-on-warning = true
diff --git a/uv.lock b/uv.lock
index 5143597f5e4c2f3d91a8731150449e462ec9c580..72407ae03d66ea338be945e3cb1bc7b3d9a22b15 100644 (file)
--- a/uv.lock
+++ b/uv.lock
@@ -1295,7 +1295,7 @@ dev = [
     { name = "ruff", specifier = ">=0.14.14" },
     { name = "sqlmodel", specifier = ">=0.0.31" },
     { name = "strawberry-graphql", specifier = ">=0.200.0,<1.0.0" },
-    { name = "ty", specifier = ">=0.0.9" },
+    { name = "ty", specifier = ">=0.0.25" },
     { name = "typer", specifier = ">=0.21.1" },
     { name = "zizmor", specifier = ">=1.23.1" },
 ]
@@ -1352,7 +1352,7 @@ tests = [
     { name = "ruff", specifier = ">=0.14.14" },
     { name = "sqlmodel", specifier = ">=0.0.31" },
     { name = "strawberry-graphql", specifier = ">=0.200.0,<1.0.0" },
-    { name = "ty", specifier = ">=0.0.9" },
+    { name = "ty", specifier = ">=0.0.25" },
 ]
 translations = [
     { name = "gitpython", specifier = ">=3.1.46" },
@@ -5407,26 +5407,26 @@ wheels = [
 
 [[package]]
 name = "ty"
-version = "0.0.21"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/ee/20/2ba8fd9493c89c41dfe9dbb73bc70a28b28028463bc0d2897ba8be36230a/ty-0.0.21.tar.gz", hash = "sha256:a4c2ba5d67d64df8fcdefd8b280ac1149d24a73dbda82fa953a0dff9d21400ed", size = 5297967, upload-time = "2026-03-06T01:57:13.809Z" }
-wheels = [
-    { url = "https://files.pythonhosted.org/packages/36/70/edf38bb37517531681d1c37f5df64744e5ad02673c02eb48447eae4bea08/ty-0.0.21-py3-none-linux_armv6l.whl", hash = "sha256:7bdf2f572378de78e1f388d24691c89db51b7caf07cf90f2bfcc1d6b18b70a76", size = 10299222, upload-time = "2026-03-06T01:57:16.64Z" },
-    { url = "https://files.pythonhosted.org/packages/72/62/0047b0bd19afeefbc7286f20a5f78a2aa39f92b4d89853f0d7185ab89edc/ty-0.0.21-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:7e9613994610431ab8625025bd2880dbcb77c5c9fabdd21134cda12d840a529d", size = 10130513, upload-time = "2026-03-06T01:57:29.93Z" },
-    { url = "https://files.pythonhosted.org/packages/a2/20/0b93a9e91aaed23155780258cdfdb4726ef68b6985378ac069bc427291a0/ty-0.0.21-py3-none-macosx_11_0_arm64.whl", hash = "sha256:56d3b198b64dd0a19b2b66e257deaed2ecea568e722ae5352f3c6fb62027f89d", size = 9605425, upload-time = "2026-03-06T01:57:27.115Z" },
-    { url = "https://files.pythonhosted.org/packages/ea/fd/9945e2fa2996a1287b1e1d7ce050e97e1f420233b271e770934bfa0880a0/ty-0.0.21-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d23d2c34f7a77d974bb08f0860ef700addc8a683d81a0319f71c08f87506cfd0", size = 10108298, upload-time = "2026-03-06T01:57:35.429Z" },
-    { url = "https://files.pythonhosted.org/packages/52/e7/4ec52fcb15f3200826c9f048472c062549a05b0d1ef0b51f32d527b513c4/ty-0.0.21-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:56b01fd2519637a4ca88344f61c96225f540c98ff18bca321d4eaa7bb0f7aa2f", size = 10121556, upload-time = "2026-03-06T01:57:03.242Z" },
-    { url = "https://files.pythonhosted.org/packages/ee/c0/ad457be2a8abea0f25549598bd098554540ced66229488daa0d558dad3c8/ty-0.0.21-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9de7e11c63c6afc40f3e9ba716374add171aee7fabc70b5146a510705c6d41b", size = 10603264, upload-time = "2026-03-06T01:56:52.134Z" },
-    { url = "https://files.pythonhosted.org/packages/f8/5b/2ecc7a2175243a4bcb72f5298ae41feabbb93b764bb0dc45722f3752c2c2/ty-0.0.21-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:62f7f5b235c4f7876db305c36997aea07b7af29b1a068f373d0e2547e25f32ff", size = 11196428, upload-time = "2026-03-06T01:57:32.94Z" },
-    { url = "https://files.pythonhosted.org/packages/37/f5/aff507d6a901f328ef96a298032b0c11aaaf950a146ed7dd3b5bf2cd3acf/ty-0.0.21-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ee8399f7c453a425291e6688efe430cfae7ab0ac4ffd50eba9f872bf878b54f6", size = 10866355, upload-time = "2026-03-06T01:56:57.831Z" },
-    { url = "https://files.pythonhosted.org/packages/be/30/822bbcb92d55b65989aa7ed06d9585f28ade9c9447369194ed4b0fb3b5b9/ty-0.0.21-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210e7568c9f886c4d01308d751949ee714ad7ad9d7d928d2ba90d329dd880367", size = 10738177, upload-time = "2026-03-06T01:57:11.256Z" },
-    { url = "https://files.pythonhosted.org/packages/57/cc/46e7991b6469e93ac2c7e533a028983e402485580150ac864c56352a3a82/ty-0.0.21-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:53508e345b11569f78b21ba8e2b4e61df38a9754947fb3cd9f2ef574367338fb", size = 10079158, upload-time = "2026-03-06T01:57:00.516Z" },
-    { url = "https://files.pythonhosted.org/packages/15/c2/0bbdadfbd008240f8f1a87dc877433cb3884436097926107ccf06e618199/ty-0.0.21-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:553e43571f4a35604c36cfd07d8b61a5eb7a714e3c67f8c4ff2cf674fefbaef9", size = 10150535, upload-time = "2026-03-06T01:57:08.815Z" },
-    { url = "https://files.pythonhosted.org/packages/c5/b5/2dbdb7b57b5362200ef0a39738ebd31331726328336def0143ac097ee59d/ty-0.0.21-py3-none-musllinux_1_2_i686.whl", hash = "sha256:666f6822e3b9200abfa7e95eb0ddd576460adb8d66b550c0ad2c70abc84a2048", size = 10319803, upload-time = "2026-03-06T01:57:19.106Z" },
-    { url = "https://files.pythonhosted.org/packages/72/84/70e52c0b7abc7c2086f9876ef454a73b161d3125315536d8d7e911c94ca4/ty-0.0.21-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:a0854d008347ce4a5fb351af132f660a390ab2a1163444d075251d43e6f74b9b", size = 10826239, upload-time = "2026-03-06T01:57:21.727Z" },
-    { url = "https://files.pythonhosted.org/packages/a1/8a/1f72480fd013bbc6cd1929002abbbcde9a0b08ead6a15154de9d7f7fa37e/ty-0.0.21-py3-none-win32.whl", hash = "sha256:bef3ab4c7b966bcc276a8ac6c11b63ba222d21355b48d471ea782c4104eee4e0", size = 9693196, upload-time = "2026-03-06T01:57:24.126Z" },
-    { url = "https://files.pythonhosted.org/packages/8d/f8/1104808b875c26c640e536945753a78562d606bef4e241d9dbf3d92477f6/ty-0.0.21-py3-none-win_amd64.whl", hash = "sha256:a709d576e5bea84b745d43058d8b9cd4f27f74a0b24acb4b0cbb7d3d41e0d050", size = 10668660, upload-time = "2026-03-06T01:56:55.06Z" },
-    { url = "https://files.pythonhosted.org/packages/1b/b8/25e0adc404bbf986977657b25318991f93097b49f8aea640d93c0b0db68e/ty-0.0.21-py3-none-win_arm64.whl", hash = "sha256:f72047996598ac20553fb7e21ba5741e3c82dee4e9eadf10d954551a5fe09391", size = 10104161, upload-time = "2026-03-06T01:57:06.072Z" },
+version = "0.0.34"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/c4/69/e24eefe2c35c0fdbdec9b60e162727af669bb76d64d993d982eb67b24c38/ty-0.0.34.tar.gz", hash = "sha256:a6efe66b0f13c03a65e6c72ec9abfe2792e2fd063c74fa67e2c4930e29d661be", size = 5585933, upload-time = "2026-05-01T23:06:46.388Z" }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/83/7b/8b85003d6639ef17a97dcbb31f4511cfe78f1c81a964470db100c8c883e7/ty-0.0.34-py3-none-linux_armv6l.whl", hash = "sha256:9ecc3d14f07a95a6ceb88e07f8e62358dbd37325d3d5bd56da7217ff1fef7fb8", size = 11067094, upload-time = "2026-05-01T23:06:21.133Z" },
+    { url = "https://files.pythonhosted.org/packages/d7/25/b0098f65b020b015c40567c763fc66fffbec88b2ba6f584bca1e92f05ebb/ty-0.0.34-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0dccffd8a9d02321cd2dee3249df205e26d62694e741f4eeca36b157fd8b419f", size = 10840909, upload-time = "2026-05-01T23:06:18.409Z" },
+    { url = "https://files.pythonhosted.org/packages/e4/55/5e4adcf7d2a1006b844903b27cb81244a9b748d850433a46a6c21776c401/ty-0.0.34-py3-none-macosx_11_0_arm64.whl", hash = "sha256:b0ea47a2998e167ab3b21d2f4b5309a9cf33c297809f6d7e3e753252223174d0", size = 10279378, upload-time = "2026-05-01T23:06:37.962Z" },
+    { url = "https://files.pythonhosted.org/packages/4d/91/f537dca0db8fe2558e8ab04d8941d687b384fcc1df5eb9023b2db75ac26c/ty-0.0.34-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b37da00b41a118a459ae56d8947e70651073fb33ebfbceb820e4a10b22d5023", size = 10817423, upload-time = "2026-05-01T23:06:26.247Z" },
+    { url = "https://files.pythonhosted.org/packages/2c/c4/55a3ad1da2815af1009bdc1b8c90dc11a364cd314e4b48c5128ba9d38859/ty-0.0.34-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:81cbbb93c2342fe3de43e625d3a9eb149633e9f485e816ebf6395d08685355d8", size = 10851826, upload-time = "2026-05-01T23:06:24.198Z" },
+    { url = "https://files.pythonhosted.org/packages/ce/8c/9c7606af22d73fb43ea4369472d9c66ece11231be73b0efe8e3c61655559/ty-0.0.34-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c5b4dea1594a021289e172582df9cde7089dce14b276fc650e7b212b1772e12", size = 11356318, upload-time = "2026-05-01T23:06:51.139Z" },
+    { url = "https://files.pythonhosted.org/packages/20/54/bb423f663721ab4138b216425c6b55eaefd3a068243b24d6d8fe988f4e13/ty-0.0.34-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:030fb00aa2d2a5b5ae9d9183d574e0c82dae80566700a7490c43669d8ece40cd", size = 11902968, upload-time = "2026-05-01T23:06:35.82Z" },
+    { url = "https://files.pythonhosted.org/packages/b6/22/01122b21ab6b534a2f618c6bbe5f1f7f49fd56f4b2ec8887cd6d40d08fb3/ty-0.0.34-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ae9555e24e36c63a8218e037a5a63f15579eb6aa94f41017e57cd41d335cfb5", size = 11548860, upload-time = "2026-05-01T23:06:42.155Z" },
+    { url = "https://files.pythonhosted.org/packages/d1/50/86008b1392ec64bed1957bbcc7aaa43b466b50dfc91bb131841c21d7c5c3/ty-0.0.34-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99eb23df9ed129fc26d1ab00d6f0b8dfe5253b09c2ac6abdb11523fa70d67f10", size = 11457097, upload-time = "2026-05-01T23:06:53.477Z" },
+    { url = "https://files.pythonhosted.org/packages/92/3e/4558b2296963ba99c58d8409c57d7db4f3061b656c3613cb21c02c1ef4c2/ty-0.0.34-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:85de45382016eceae69e104815eb2cfa200787df104002e262a86cbd43ed2c02", size = 10798192, upload-time = "2026-05-01T23:06:40.004Z" },
+    { url = "https://files.pythonhosted.org/packages/76/bf/650d24402be2ef678528d60caac1d9477a40fc37e3792ecef07834fd7a4a/ty-0.0.34-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:14cb575fb8fa5131f5129d100cfe23c1575d23faf5dfc5158432749a3e38c9b5", size = 10890390, upload-time = "2026-05-01T23:06:33.076Z" },
+    { url = "https://files.pythonhosted.org/packages/5c/ef/ccd2ca13906079f7935fd7e067661b24233017f57d987d51d6a121d85bb5/ty-0.0.34-py3-none-musllinux_1_2_i686.whl", hash = "sha256:c6fc0b69d8450e6910ba9db34572b959b81329a97ae273c391f70e9fb6c1aade", size = 11031564, upload-time = "2026-05-01T23:06:55.812Z" },
+    { url = "https://files.pythonhosted.org/packages/ba/2d/d27b72005b6f43599e3bcabab0d7135ac0c230b7a307bb99f9eea02c1cda/ty-0.0.34-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:30dfcec2f0fde3993f4f912ed0e057dcbebc8615299f610a4c2ddb7b5a3e1e06", size = 11553430, upload-time = "2026-05-01T23:06:31.096Z" },
+    { url = "https://files.pythonhosted.org/packages/a7/12/20812e1ad930b8d4af70eebf19ad23cff6e31efcfa613ef884531fcdbaa1/ty-0.0.34-py3-none-win32.whl", hash = "sha256:97b77ddf007271b812a313a8f0a14929bc5590958433e1fb83ef585676f53342", size = 10436048, upload-time = "2026-05-01T23:06:49.108Z" },
+    { url = "https://files.pythonhosted.org/packages/b0/6a/afa095c5987868fbda27c0f731146ac8e3d07b357adfa83daccaee5b1a16/ty-0.0.34-py3-none-win_amd64.whl", hash = "sha256:1f543968accb952705134028d1fda8656882787dbbc667ad4d6c3ba23791d604", size = 11462526, upload-time = "2026-05-01T23:06:28.514Z" },
+    { url = "https://files.pythonhosted.org/packages/63/8f/bf041a06260d77662c0605e56dacfe90b786bf824cbe1aed238d15fe5e84/ty-0.0.34-py3-none-win_arm64.whl", hash = "sha256:ea09108cbcb16b6b06d7596312b433bf49681e78d30e4dc7fb3c1b248a95e09a", size = 10846945, upload-time = "2026-05-01T23:06:44.428Z" },
 ]
 
 [[package]]