Browse Source

⬆ Bump ty from 0.0.21 to 0.0.34 (#15443)

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: svlandeg <[email protected]>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
pull/15495/head
dependabot[bot] 3 weeks ago
committed by GitHub
parent
commit
5d5666bec5
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 4
      fastapi/_compat/shared.py
  2. 12
      fastapi/_compat/v2.py
  3. 10
      fastapi/applications.py
  4. 2
      fastapi/cli.py
  5. 6
      fastapi/dependencies/utils.py
  6. 8
      fastapi/encoders.py
  7. 4
      fastapi/openapi/models.py
  8. 2
      fastapi/openapi/utils.py
  9. 20
      fastapi/params.py
  10. 4
      fastapi/responses.py
  11. 8
      fastapi/routing.py
  12. 5
      pyproject.toml
  13. 44
      uv.lock

4
fastapi/_compat/shared.py

@ -23,7 +23,7 @@ _T = TypeVar("_T")
# Copy from Pydantic: pydantic/_internal/_typing_extra.py # Copy from Pydantic: pydantic/_internal/_typing_extra.py
WithArgsTypes: tuple[Any, ...] = ( WithArgsTypes: tuple[Any, ...] = (
typing._GenericAlias, # type: ignore[attr-defined] typing._GenericAlias, # type: ignore[attr-defined] # ty: ignore[unresolved-attribute]
types.GenericAlias, types.GenericAlias,
types.UnionType, types.UnionType,
) # pyright: ignore[reportAttributeAccessIssue] ) # pyright: ignore[reportAttributeAccessIssue]
@ -48,7 +48,7 @@ def lenient_issubclass(
cls: Any, class_or_tuple: type[_T] | tuple[type[_T], ...] | None cls: Any, class_or_tuple: type[_T] | tuple[type[_T], ...] | None
) -> TypeGuard[type[_T]]: ) -> TypeGuard[type[_T]]:
try: 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 except TypeError: # pragma: no cover
if isinstance(cls, WithArgsTypes): if isinstance(cls, WithArgsTypes):
return False return False

12
fastapi/_compat/v2.py

@ -23,7 +23,7 @@ from pydantic import PydanticSchemaGenerationError as PydanticSchemaGenerationEr
from pydantic import PydanticUndefinedAnnotation as PydanticUndefinedAnnotation from pydantic import PydanticUndefinedAnnotation as PydanticUndefinedAnnotation
from pydantic import ValidationError as ValidationError from pydantic import ValidationError as ValidationError
from pydantic._internal import _typing_extra as _pydantic_typing_extra 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, GetJsonSchemaHandler as GetJsonSchemaHandler,
) )
from pydantic.fields import FieldInfo as FieldInfo from pydantic.fields import FieldInfo as FieldInfo
@ -372,8 +372,8 @@ def serialize_sequence_value(*, field: ModelField, value: Any) -> Sequence[Any]:
continue continue
origin_type = get_origin(union_arg) or union_arg origin_type = get_origin(union_arg) or union_arg
break break
assert issubclass(origin_type, shared.sequence_types) # type: ignore[arg-type] 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] 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]: 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": {}}] "Field required", [{"type": "missing", "loc": loc, "input": {}}]
).errors(include_url=False)[0] ).errors(include_url=False)[0]
error["input"] = None error["input"] = None
return error # type: ignore[return-value] return error # type: ignore[return-value] # ty: ignore[invalid-return-type]
def create_body_model( def create_body_model(
*, fields: Sequence[ModelField], model_name: str *, fields: Sequence[ModelField], model_name: str
) -> type[BaseModel]: ) -> type[BaseModel]:
field_params = {f.name: (f.field_info.annotation, f.field_info) for f in fields} 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 return BodyModel
@ -451,7 +451,7 @@ def get_flat_models_from_annotation(
for arg in get_args(annotation): for arg in get_args(annotation):
if lenient_issubclass(arg, (BaseModel, Enum)): if lenient_issubclass(arg, (BaseModel, Enum)):
if arg not in known_models: 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): if lenient_issubclass(arg, BaseModel):
get_flat_models_from_model(arg, known_models=known_models) get_flat_models_from_model(arg, known_models=known_models)
else: else:

10
fastapi/applications.py

@ -1006,7 +1006,7 @@ class FastAPI(Starlette):
# Starlette still has incorrect type specification for the handlers # Starlette still has incorrect type specification for the handlers
self.exception_handlers.setdefault( self.exception_handlers.setdefault(
WebSocketRequestValidationError, 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] ) # ty: ignore[no-matching-overload]
self.user_middleware: list[Middleware] = ( self.user_middleware: list[Middleware] = (
@ -1029,11 +1029,11 @@ class FastAPI(Starlette):
exception_handlers[key] = value exception_handlers[key] = value
middleware = ( middleware = (
[Middleware(ServerErrorMiddleware, handler=error_handler, debug=debug)] # ty: ignore[invalid-argument-type] [Middleware(ServerErrorMiddleware, handler=error_handler, debug=debug)]
+ self.user_middleware + self.user_middleware
+ [ + [
Middleware( Middleware(
ExceptionMiddleware, # ty: ignore[invalid-argument-type] ExceptionMiddleware,
handlers=exception_handlers, handlers=exception_handlers,
debug=debug, debug=debug,
), ),
@ -1056,7 +1056,7 @@ class FastAPI(Starlette):
# user middlewares, the same context is used. # user middlewares, the same context is used.
# This is currently not needed, only for closing files, but used to be # This is currently not needed, only for closing files, but used to be
# important when dependencies with yield were closed here. # 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: 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 func
return decorator return decorator

2
fastapi/cli.py

@ -6,7 +6,7 @@ except ImportError: # pragma: no cover
def main() -> None: 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' message = 'To use the fastapi command, please install "fastapi[standard]":\n\n\tpip install "fastapi[standard]"\n'
print(message) print(message)
raise RuntimeError(message) # noqa: B904 raise RuntimeError(message) # noqa: B904

6
fastapi/dependencies/utils.py

@ -100,14 +100,14 @@ def ensure_multipart_is_installed() -> None:
except (ImportError, AssertionError): except (ImportError, AssertionError):
try: try:
# __version__ is available in both multiparts, and can be mocked # __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__, __version__,
) )
assert __version__ assert __version__
try: try:
# parse_options_header is only available in the right multipart # 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, parse_options_header,
) )
@ -622,7 +622,7 @@ async def solve_dependencies(
if response is None: if response is None:
response = Response() response = Response()
del response.headers["content-length"] 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: if dependency_cache is None:
dependency_cache = {} dependency_cache = {}
for sub_dependant in dependant.dependencies: for sub_dependant in dependant.dependencies:

8
fastapi/encoders.py

@ -36,7 +36,7 @@ try:
from pydantic.color import Color # ty: ignore[deprecated] from pydantic.color import Color # ty: ignore[deprecated]
except ImportError: # pragma: no cover except ImportError: # pragma: no cover
class Color: # type: ignore[no-redef] # ty: ignore[unused-ignore-comment] class Color: # type: ignore[no-redef]
pass pass
@ -45,7 +45,7 @@ try:
from pydantic_extra_types.color import Color as PyExtraColor from pydantic_extra_types.color import Color as PyExtraColor
except ImportError: # pragma: no cover except ImportError: # pragma: no cover
class PyExtraColor: # type: ignore[no-redef] # ty: ignore[unused-ignore-comment] class PyExtraColor: # type: ignore[no-redef]
pass pass
@ -237,9 +237,9 @@ def jsonable_encoder(
if isinstance(obj, encoder_type): if isinstance(obj, encoder_type):
return encoder_instance(obj) return encoder_instance(obj)
if include is not None and not isinstance(include, (set, dict)): 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)): 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): if isinstance(obj, BaseModel):
obj_dict = obj.model_dump( obj_dict = obj.model_dump(
mode="json", mode="json",

4
fastapi/openapi/models.py

@ -20,7 +20,7 @@ try:
from pydantic import EmailStr from pydantic import EmailStr
except ImportError: # pragma: no cover except ImportError: # pragma: no cover
class EmailStr(str): # type: ignore # ty: ignore[unused-ignore-comment] class EmailStr(str): # type: ignore[no-redef]
@classmethod @classmethod
def __get_validators__(cls) -> Iterable[Callable[..., Any]]: def __get_validators__(cls) -> Iterable[Callable[..., Any]]:
yield cls.validate yield cls.validate
@ -215,7 +215,7 @@ class Example(TypedDict, total=False):
value: Any | None value: Any | None
externalValue: AnyUrl | 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): class ParameterInType(Enum):

2
fastapi/openapi/utils.py

@ -603,4 +603,4 @@ def get_openapi(
output["tags"] = tags output["tags"] = tags
if external_docs: if external_docs:
output["externalDocs"] = 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]

20
fastapi/params.py

@ -23,7 +23,7 @@ class ParamTypes(Enum):
cookie = "cookie" cookie = "cookie"
class Param(FieldInfo): # type: ignore[misc] class Param(FieldInfo): # type: ignore[misc] # ty: ignore[subclass-of-final-class]
in_: ParamTypes in_: ParamTypes
def __init__( 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} 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: def __repr__(self) -> str:
return f"{self.__class__.__name__}({self.default})" 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 in_ = ParamTypes.path
def __init__( 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 in_ = ParamTypes.query
def __init__( 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 in_ = ParamTypes.header
def __init__( 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 in_ = ParamTypes.cookie
def __init__( 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__( def __init__(
self, self,
default: Any = Undefined, 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} 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: def __repr__(self) -> str:
return f"{self.__class__.__name__}({self.default})" 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__( def __init__(
self, self,
default: Any = Undefined, 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__( def __init__(
self, self,
default: Any = Undefined, default: Any = Undefined,

4
fastapi/responses.py

@ -27,13 +27,13 @@ class _OrjsonModule(Protocol):
try: try:
ujson = cast(_UjsonModule, importlib.import_module("ujson")) ujson = cast(_UjsonModule, importlib.import_module("ujson"))
except ModuleNotFoundError: # pragma: nocover except ModuleNotFoundError: # pragma: nocover
ujson = None # type: ignore # ty: ignore[unused-ignore-comment] ujson = None # type: ignore[assignment]
try: try:
orjson = cast(_OrjsonModule, importlib.import_module("orjson")) orjson = cast(_OrjsonModule, importlib.import_module("orjson"))
except ModuleNotFoundError: # pragma: nocover except ModuleNotFoundError: # pragma: nocover
orjson = None # type: ignore # ty: ignore[unused-ignore-comment] orjson = None # type: ignore[assignment]
@deprecated( @deprecated(

8
fastapi/routing.py

@ -102,9 +102,9 @@ def request_response(
and returns an ASGI application. and returns an ASGI application.
""" """
f: Callable[[Request], Awaitable[Response]] = ( f: Callable[[Request], Awaitable[Response]] = (
func # type: ignore[assignment] # ty: ignore[unused-ignore-comment] func # type: ignore[assignment]
if is_async_callable(func) 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] ) # ty: ignore[invalid-assignment]
async def app(scope: Scope, receive: Receive, send: Send) -> None: async def app(scope: Scope, receive: Receive, send: Send) -> None:
@ -220,7 +220,7 @@ def _merge_lifespan_context(
else: else:
yield {**(maybe_nested_state or {}), **(maybe_original_state or {})} 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: class _DefaultLifespan:
@ -912,7 +912,7 @@ class APIRoute(routing.Route):
mode="serialization", mode="serialization",
) )
else: else:
self.response_field = None # type: ignore # ty: ignore[unused-ignore-comment] self.response_field = None # type: ignore[assignment]
if self.stream_item_type: if self.stream_item_type:
stream_item_name = "StreamItem_" + self.unique_id stream_item_name = "StreamItem_" + self.unique_id
self.stream_item_field: ModelField | None = create_model_field( self.stream_item_field: ModelField | None = create_model_field(

5
pyproject.toml

@ -175,7 +175,7 @@ tests = [
"pyyaml >=5.3.1,<7.0.0", "pyyaml >=5.3.1,<7.0.0",
"sqlmodel >=0.0.31", "sqlmodel >=0.0.31",
"strawberry-graphql >=0.200.0,<1.0.0", "strawberry-graphql >=0.200.0,<1.0.0",
"ty>=0.0.9", "ty>=0.0.25",
"a2wsgi >=1.9.0,<=2.0.0", "a2wsgi >=1.9.0,<=2.0.0",
"pytest-xdist[psutil]>=2.5.0", "pytest-xdist[psutil]>=2.5.0",
"pytest-cov>=4.0.0", "pytest-cov>=4.0.0",
@ -372,3 +372,6 @@ fo = "fo"
havin = "havin" havin = "havin"
Ines = "Ines" Ines = "Ines"
ser = "ser" ser = "ser"
[tool.ty.terminal]
error-on-warning = true

44
uv.lock

@ -1295,7 +1295,7 @@ dev = [
{ name = "ruff", specifier = ">=0.14.14" }, { name = "ruff", specifier = ">=0.14.14" },
{ name = "sqlmodel", specifier = ">=0.0.31" }, { name = "sqlmodel", specifier = ">=0.0.31" },
{ name = "strawberry-graphql", specifier = ">=0.200.0,<1.0.0" }, { 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 = "typer", specifier = ">=0.21.1" },
{ name = "zizmor", specifier = ">=1.23.1" }, { name = "zizmor", specifier = ">=1.23.1" },
] ]
@ -1352,7 +1352,7 @@ tests = [
{ name = "ruff", specifier = ">=0.14.14" }, { name = "ruff", specifier = ">=0.14.14" },
{ name = "sqlmodel", specifier = ">=0.0.31" }, { name = "sqlmodel", specifier = ">=0.0.31" },
{ name = "strawberry-graphql", specifier = ">=0.200.0,<1.0.0" }, { name = "strawberry-graphql", specifier = ">=0.200.0,<1.0.0" },
{ name = "ty", specifier = ">=0.0.9" }, { name = "ty", specifier = ">=0.0.25" },
] ]
translations = [ translations = [
{ name = "gitpython", specifier = ">=3.1.46" }, { name = "gitpython", specifier = ">=3.1.46" },
@ -5407,26 +5407,26 @@ wheels = [
[[package]] [[package]]
name = "ty" name = "ty"
version = "0.0.21" version = "0.0.34"
source = { registry = "https://pypi.org/simple" } 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" } 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 = [ 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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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" }, { 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]] [[package]]

Loading…
Cancel
Save