diff --git a/examples/add_model_resource.py b/examples/add_model_resource.py index 3687be7a..80666cbf 100644 --- a/examples/add_model_resource.py +++ b/examples/add_model_resource.py @@ -17,11 +17,11 @@ class X(BaseModel): - input: typing.List[typing.Any] = Field(title="input", description="Model input") + input: list[typing.Any] = Field(title="input", description="Model input") class Y(BaseModel): - output: typing.List[typing.Any] = Field(title="output", description="Model output") + output: list[typing.Any] = Field(title="output", description="Model output") app.schema.register_schema("X", X) diff --git a/examples/data_schema.py b/examples/data_schema.py index 3ec87e1e..00beca9e 100755 --- a/examples/data_schema.py +++ b/examples/data_schema.py @@ -1,5 +1,3 @@ -import typing - from pydantic import BaseModel, validator import flama @@ -34,7 +32,7 @@ def home(): return {"hello": "world"} -def list_puppies(name: str = None) -> typing.List[Puppy]: +def list_puppies(name: str = None) -> list[Puppy]: """ tags: - puppy diff --git a/examples/pagination.py b/examples/pagination.py index fec2973a..6d5f906b 100755 --- a/examples/pagination.py +++ b/examples/pagination.py @@ -1,5 +1,4 @@ import string -import typing from pydantic import BaseModel, validator @@ -66,7 +65,7 @@ def alphabet(**kwargs): @app.route("/puppy/", methods=["GET"]) @app.paginator.page_number -def puppies(name: str = None, **kwargs) -> typing.List[Puppy]: +def puppies(name: str = None, **kwargs) -> list[Puppy]: """ tags: - puppy diff --git a/flama/applications.py b/flama/applications.py index 08dc10f5..5b0142e2 100644 --- a/flama/applications.py +++ b/flama/applications.py @@ -35,13 +35,11 @@ class Flama: def __init__( self, routes: t.Optional[t.Sequence[t.Union["BaseRoute", "Mount"]]] = None, - components: t.Optional[t.Union[t.Sequence[injection.Component], t.Set[injection.Component]]] = None, - modules: t.Optional[t.Union[t.Sequence["Module"], t.Set["Module"]]] = None, + components: t.Optional[t.Union[t.Sequence[injection.Component], set[injection.Component]]] = None, + modules: t.Optional[t.Union[t.Sequence["Module"], set["Module"]]] = None, middleware: t.Optional[t.Sequence["Middleware"]] = None, debug: bool = False, - events: t.Optional[ - t.Union[t.Dict[str, t.List[t.Callable[..., t.Coroutine[t.Any, t.Any, None]]]], Events] - ] = None, + events: t.Optional[t.Union[dict[str, list[t.Callable[..., t.Coroutine[t.Any, t.Any, None]]]], Events]] = None, lifespan: t.Optional[t.Callable[[t.Optional["Flama"]], t.AsyncContextManager]] = None, title: str = "Flama", version: str = "0.1.0", @@ -185,7 +183,7 @@ def add_component(self, component: injection.Component): self.router.build(self) @property - def routes(self) -> t.List["BaseRoute"]: + def routes(self) -> list["BaseRoute"]: """List of registered routes. :return: Routes. @@ -196,12 +194,12 @@ def add_route( self, path: t.Optional[str] = None, endpoint: t.Optional[types.HTTPHandler] = None, - methods: t.Optional[t.List[str]] = None, + methods: t.Optional[list[str]] = None, name: t.Optional[str] = None, include_in_schema: bool = True, route: t.Optional["Route"] = None, pagination: t.Optional[t.Union[str, "PaginationType"]] = None, - tags: t.Optional[t.Dict[str, t.Any]] = None, + tags: t.Optional[dict[str, t.Any]] = None, ) -> "Route": """Register a new HTTP route or endpoint under given path. @@ -229,11 +227,11 @@ def add_route( def route( self, path: str, - methods: t.Optional[t.List[str]] = None, + methods: t.Optional[list[str]] = None, name: t.Optional[str] = None, include_in_schema: bool = True, pagination: t.Optional[t.Union[str, "PaginationType"]] = None, - tags: t.Optional[t.Dict[str, t.Any]] = None, + tags: t.Optional[dict[str, t.Any]] = None, ) -> t.Callable[[types.HTTPHandler], types.HTTPHandler]: """Decorator version for registering a new HTTP route in this router under given path. @@ -262,7 +260,7 @@ def add_websocket_route( name: t.Optional[str] = None, route: t.Optional["WebSocketRoute"] = None, pagination: t.Optional[t.Union[str, "PaginationType"]] = None, - tags: t.Optional[t.Dict[str, t.Any]] = None, + tags: t.Optional[dict[str, t.Any]] = None, ) -> "WebSocketRoute": """Register a new websocket route or endpoint under given path. @@ -282,7 +280,7 @@ def websocket_route( path: str, name: t.Optional[str] = None, pagination: t.Optional[t.Union[str, "PaginationType"]] = None, - tags: t.Optional[t.Dict[str, t.Any]] = None, + tags: t.Optional[dict[str, t.Any]] = None, ) -> t.Callable[[types.WebSocketHandler], types.WebSocketHandler]: """Decorator version for registering a new websocket route in this router under given path. @@ -300,7 +298,7 @@ def mount( app: t.Optional[types.App] = None, name: t.Optional[str] = None, mount: t.Optional["Mount"] = None, - tags: t.Optional[t.Dict[str, t.Any]] = None, + tags: t.Optional[dict[str, t.Any]] = None, ) -> "Mount": """Register a new mount point containing an ASGI app in this router under given path. @@ -345,7 +343,7 @@ def decorator(func: t.Callable) -> t.Callable: return decorator - def add_exception_handler(self, exc_class_or_status_code: t.Union[int, t.Type[Exception]], handler: t.Callable): + def add_exception_handler(self, exc_class_or_status_code: t.Union[int, type[Exception]], handler: t.Callable): """Add a new exception handler for given status code or exception class. :param exc_class_or_status_code: Status code or exception class. @@ -369,7 +367,7 @@ def resolve_url(self, name: str, **path_params: t.Any) -> url.URL: """ return self.router.resolve_url(name, **path_params) - def resolve_route(self, scope: types.Scope) -> t.Tuple[BaseRoute, types.Scope]: + def resolve_route(self, scope: types.Scope) -> tuple[BaseRoute, types.Scope]: """Look for a route that matches given ASGI scope. :param scope: ASGI scope. diff --git a/flama/authentication/jwt/claims.py b/flama/authentication/jwt/claims.py index 9b5d1d98..5ef50e38 100644 --- a/flama/authentication/jwt/claims.py +++ b/flama/authentication/jwt/claims.py @@ -22,7 +22,7 @@ class ClaimValidator(abc.ABC): claim: t.ClassVar[str] - def __init__(self, payload: "Payload", claims: t.Dict[str, t.Any]) -> None: + def __init__(self, payload: "Payload", claims: dict[str, t.Any]) -> None: self.value = claims.get(self.claim) self.payload = payload diff --git a/flama/authentication/jwt/jws.py b/flama/authentication/jwt/jws.py index e83aa823..aaa3b5ec 100644 --- a/flama/authentication/jwt/jws.py +++ b/flama/authentication/jwt/jws.py @@ -29,7 +29,7 @@ class JWS: } @classmethod - def _get_algorithm(cls, header: t.Dict[str, t.Any]) -> "SignAlgorithm": + def _get_algorithm(cls, header: dict[str, t.Any]) -> "SignAlgorithm": """Get the algorithm to sign the token. It gets the algorithm from the header, and it returns the corresponding algorithm implementation. @@ -46,7 +46,7 @@ def _get_algorithm(cls, header: t.Dict[str, t.Any]) -> "SignAlgorithm": return cls.ALGORITHMS[header["alg"]] @classmethod - def encode(cls, header: t.Dict[str, t.Any], payload: t.Dict[str, t.Any], key: bytes) -> bytes: + def encode(cls, header: dict[str, t.Any], payload: dict[str, t.Any], key: bytes) -> bytes: """Encode a JWS token. It generates a signed token using the given key. The result is a JWT token with a format of: @@ -67,7 +67,7 @@ def encode(cls, header: t.Dict[str, t.Any], payload: t.Dict[str, t.Any], key: by return b".".join([header_segment, payload_segment, signature]) @classmethod - def decode(cls, token: bytes, key: bytes) -> t.Tuple[t.Dict[str, t.Any], t.Dict[str, t.Any], bytes]: + def decode(cls, token: bytes, key: bytes) -> tuple[dict[str, t.Any], dict[str, t.Any], bytes]: """Decode a JWS token. It decode and validate the signature of the token. The token format must be:
.. diff --git a/flama/authentication/jwt/jwt.py b/flama/authentication/jwt/jwt.py index 00d25ecd..b3636605 100644 --- a/flama/authentication/jwt/jwt.py +++ b/flama/authentication/jwt/jwt.py @@ -37,7 +37,7 @@ class Header: alg: t.Optional[str] = None cty: t.Optional[str] = None - def asdict(self) -> t.Dict[str, t.Any]: + def asdict(self) -> dict[str, t.Any]: """Return the header as a dictionary. The fields are sorted alphabetically and the None values are removed. @@ -62,7 +62,7 @@ class Payload: standard and it is not validated when the token is decoded. """ - data: t.Dict[str, t.Any] + data: dict[str, t.Any] iss: t.Optional[str] = None sub: t.Optional[str] = None aud: t.Optional[str] = None @@ -73,7 +73,7 @@ class Payload: def __init__( self, - data: t.Optional[t.Dict[str, t.Any]] = None, + data: t.Optional[dict[str, t.Any]] = None, iss: t.Optional[str] = None, sub: t.Optional[str] = None, aud: t.Optional[str] = None, @@ -113,7 +113,7 @@ def __init__( object.__setattr__(self, "jti", jti) object.__setattr__(self, "data", {**(data or {}), **kwargs}) - def asdict(self) -> t.Dict[str, t.Any]: + def asdict(self) -> dict[str, t.Any]: """Return the payload as a dictionary. The fields are sorted alphabetically and the None values are removed. @@ -138,7 +138,7 @@ class JWT: header: Header payload: Payload - def __init__(self, header: t.Dict[str, t.Any], payload: t.Dict[str, t.Any]) -> None: + def __init__(self, header: dict[str, t.Any], payload: dict[str, t.Any]) -> None: object.__setattr__(self, "header", Header(**header)) object.__setattr__(self, "payload", Payload(**payload)) @@ -188,7 +188,7 @@ def decode(cls, token: bytes, key: bytes) -> "JWT": return decoded_token - def validate(self, validators: t.Optional[t.List[claims.ClaimValidator]] = None, **claims: t.Any) -> None: + def validate(self, validators: t.Optional[list[claims.ClaimValidator]] = None, **claims: t.Any) -> None: """Validate the token claims. It validates all the default claims in the payload in the following order: @@ -220,7 +220,7 @@ def validate(self, validators: t.Optional[t.List[claims.ClaimValidator]] = None, if invalid_claims: raise exceptions.JWTValidateException(f"Invalid claims ({', '.join(invalid_claims)})") - def asdict(self) -> t.Dict[str, t.Any]: + def asdict(self) -> dict[str, t.Any]: """Return the JWT as a dictionary. :return: JWT as a dictionary. diff --git a/flama/authentication/middlewares.py b/flama/authentication/middlewares.py index 53cad0f4..92f9b489 100644 --- a/flama/authentication/middlewares.py +++ b/flama/authentication/middlewares.py @@ -30,7 +30,7 @@ async def __call__(self, scope: "types.Scope", receive: "types.Receive", send: " await response(scope, receive, send) - def _get_permissions(self, route: "BaseRoute") -> t.Set[str]: + def _get_permissions(self, route: "BaseRoute") -> set[str]: return set(route.tags.get("permissions", [])) async def _get_response(self, scope: "types.Scope", receive: "types.Receive") -> t.Union["Response", "Flama"]: diff --git a/flama/background.py b/flama/background.py index 1035a330..acc2d006 100644 --- a/flama/background.py +++ b/flama/background.py @@ -47,7 +47,7 @@ def __init__( concurrency: t.Union[Concurrency, str], func: t.Callable[P, t.Union[None, t.Awaitable[None]]], *args: P.args, - **kwargs: P.kwargs + **kwargs: P.kwargs, ) -> None: self.func = task_wrapper(func) self.args = args diff --git a/flama/cli/commands/start.py b/flama/cli/commands/start.py index b4f471a1..5929a848 100644 --- a/flama/cli/commands/start.py +++ b/flama/cli/commands/start.py @@ -26,7 +26,7 @@ def command(flama_config: str, create_config: str): fs.write(ExampleConfig.build(mode=create_config).dumps()) return - with open(flama_config, "r") as fs: + with open(flama_config) as fs: config = Config.load(fs) # type: ignore[arg-type] config.run() diff --git a/flama/cli/config/app.py b/flama/cli/config/app.py index b816c6ab..895a58a2 100644 --- a/flama/cli/config/app.py +++ b/flama/cli/config/app.py @@ -82,7 +82,7 @@ def context(self) -> t.Generator[_AppContext, None, None]: ... @classmethod - def build(cls, app: t.Union[str, t.Dict[str, t.Any], "Flama"]) -> "App": + def build(cls, app: t.Union[str, dict[str, t.Any], "Flama"]) -> "App": if isinstance(app, str): return StrApp(app) @@ -110,12 +110,12 @@ class DictApp(App): description: str = "Fire up with the flame" schema: str = "/schema/" docs: str = "/docs/" - models: t.List[Model] = dataclasses.field( + models: list[Model] = dataclasses.field( default_factory=lambda: [Model(url="/model-url/", path="model-path.flm", name="model-name")] ) @classmethod - def from_dict(cls, data: t.Dict[str, t.Any]) -> "App": + def from_dict(cls, data: dict[str, t.Any]) -> "App": if "models" in data: data["models"] = [Model(**model) for model in data.pop("models")] return cls(**data) # type: ignore[arg-type] diff --git a/flama/cli/config/config.py b/flama/cli/config/config.py index 292ac886..b6f2b2b2 100644 --- a/flama/cli/config/config.py +++ b/flama/cli/config/config.py @@ -19,12 +19,12 @@ class Config: server: Uvicorn = dataclasses.field(default_factory=Uvicorn) @classmethod - def from_dict(cls, data: t.Dict[str, t.Any]) -> "Config": + def from_dict(cls, data: dict[str, t.Any]) -> "Config": return cls( **{**data, "app": App.build(data["app"]), "server": Uvicorn(**data["server"])} # type: ignore[arg-type] ) - def to_dict(self) -> t.Dict[str, t.Any]: + def to_dict(self) -> dict[str, t.Any]: return dataclasses.asdict(self) @classmethod @@ -42,7 +42,7 @@ def dump(self, fs: io.StringIO) -> None: fs.write(self.dumps()) @classmethod - def dump_example(cls, type: str) -> t.Dict[str, t.Any]: + def dump_example(cls, type: str) -> dict[str, t.Any]: result = cls().to_dict() if type == "simple": result["server"] = {k: v for k, v in result["server"] if k in ("host", "port")} diff --git a/flama/cli/config/uvicorn.py b/flama/cli/config/uvicorn.py index bf021341..0216181c 100644 --- a/flama/cli/config/uvicorn.py +++ b/flama/cli/config/uvicorn.py @@ -309,8 +309,8 @@ class Uvicorn: uds: t.Optional[str] = None fd: t.Optional[int] = None loop: LoopSetupType = "auto" - http: t.Union[t.Type[asyncio.Protocol], HTTPProtocolType] = "auto" - ws: t.Union[t.Type[asyncio.Protocol], WSProtocolType] = "auto" + http: t.Union[type[asyncio.Protocol], HTTPProtocolType] = "auto" + ws: t.Union[type[asyncio.Protocol], WSProtocolType] = "auto" ws_max_size: int = 16777216 ws_ping_interval: t.Optional[float] = 20.0 ws_ping_timeout: t.Optional[float] = 20.0 @@ -318,13 +318,13 @@ class Uvicorn: lifespan: LifespanType = "auto" interface: InterfaceType = "auto" reload: bool = False - reload_dirs: t.Optional[t.Union[t.List[str], str]] = None - reload_includes: t.Optional[t.Union[t.List[str], str]] = None - reload_excludes: t.Optional[t.Union[t.List[str], str]] = None + reload_dirs: t.Optional[t.Union[list[str], str]] = None + reload_includes: t.Optional[t.Union[list[str], str]] = None + reload_excludes: t.Optional[t.Union[list[str], str]] = None reload_delay: float = 0.25 workers: t.Optional[int] = None env_file: t.Optional[t.Union[str, os.PathLike]] = None - log_config: t.Optional[t.Union[t.Dict[str, t.Any], str]] = dataclasses.field( + log_config: t.Optional[t.Union[dict[str, t.Any], str]] = dataclasses.field( default_factory=lambda: LOGGING_CONFIG.copy() # type: ignore[no-any-return] ) log_level: t.Optional[t.Union[str, int]] = None @@ -345,7 +345,7 @@ class Uvicorn: ssl_cert_reqs: int = ssl.CERT_NONE ssl_ca_certs: t.Optional[str] = None ssl_ciphers: str = "TLSv1" - headers: t.Optional[t.List[t.Tuple[str, str]]] = None + headers: t.Optional[list[tuple[str, str]]] = None use_colors: t.Optional[bool] = None app_dir: t.Optional[str] = None factory: bool = False @@ -369,8 +369,8 @@ def _inner( server_uds: t.Optional[str] = None, server_fd: t.Optional[int] = None, server_loop: LoopSetupType = "auto", - server_http: t.Union[t.Type[asyncio.Protocol], HTTPProtocolType] = "auto", - server_ws: t.Union[t.Type[asyncio.Protocol], WSProtocolType] = "auto", + server_http: t.Union[type[asyncio.Protocol], HTTPProtocolType] = "auto", + server_ws: t.Union[type[asyncio.Protocol], WSProtocolType] = "auto", server_ws_max_size: int = 16777216, server_ws_ping_interval: t.Optional[float] = 20.0, server_ws_ping_timeout: t.Optional[float] = 20.0, @@ -378,13 +378,13 @@ def _inner( server_lifespan: LifespanType = "auto", server_interface: InterfaceType = "auto", server_reload: bool = False, - server_reload_dirs: t.Optional[t.Union[t.List[str], str]] = None, - server_reload_includes: t.Optional[t.Union[t.List[str], str]] = None, - server_reload_excludes: t.Optional[t.Union[t.List[str], str]] = None, + server_reload_dirs: t.Optional[t.Union[list[str], str]] = None, + server_reload_includes: t.Optional[t.Union[list[str], str]] = None, + server_reload_excludes: t.Optional[t.Union[list[str], str]] = None, server_reload_delay: float = 0.25, server_workers: t.Optional[int] = None, server_env_file: t.Optional[t.Union[str, os.PathLike]] = None, - server_log_config: t.Optional[t.Union[t.Dict[str, t.Any], str]] = None, + server_log_config: t.Optional[t.Union[dict[str, t.Any], str]] = None, server_log_level: t.Optional[t.Union[str, int]] = None, server_access_log: bool = True, server_proxy_headers: bool = True, @@ -403,13 +403,13 @@ def _inner( server_ssl_cert_reqs: int = ssl.CERT_NONE, server_ssl_ca_certs: t.Optional[str] = None, server_ssl_ciphers: str = "TLSv1", - server_headers: t.Optional[t.List[t.Tuple[str, str]]] = None, + server_headers: t.Optional[list[tuple[str, str]]] = None, server_use_colors: t.Optional[bool] = None, server_app_dir: t.Optional[str] = None, server_factory: bool = False, server_h11_max_incomplete_event_size: int = DEFAULT_MAX_INCOMPLETE_EVENT_SIZE, *args, - **kwargs + **kwargs, ): command( uvicorn=Uvicorn( @@ -459,7 +459,7 @@ def _inner( factory=server_factory, ), *args, - **kwargs + **kwargs, ) return functools.reduce(lambda x, y: y(x), decorators[::-1], _inner) diff --git a/flama/client.py b/flama/client.py index 056f534d..8024b246 100644 --- a/flama/client.py +++ b/flama/client.py @@ -69,7 +69,7 @@ async def __aenter__(self) -> "LifespanContextManager": async def __aexit__( self, - exc_type: t.Optional[t.Type[BaseException]] = None, + exc_type: t.Optional[type[BaseException]] = None, exc_value: t.Optional[BaseException] = None, traceback: t.Optional[TracebackType] = None, ): @@ -104,10 +104,10 @@ def __init__( self, /, app: t.Optional["Flama"] = None, - models: t.Optional[t.Sequence[t.Tuple[str, str, str]]] = None, + models: t.Optional[t.Sequence[tuple[str, str, str]]] = None, **kwargs, ): - self.models: t.Optional[t.Dict[str, str]] = None + self.models: t.Optional[dict[str, str]] = None if models: app = Flama() if not app else app @@ -134,7 +134,7 @@ async def __aenter__(self) -> "Client": async def __aexit__( self, - exc_type: t.Optional[t.Type[BaseException]] = None, + exc_type: t.Optional[type[BaseException]] = None, exc_value: t.Optional[BaseException] = None, traceback: t.Optional[TracebackType] = None, ): diff --git a/flama/concurrency.py b/flama/concurrency.py index a7d52079..caf1ad48 100644 --- a/flama/concurrency.py +++ b/flama/concurrency.py @@ -53,7 +53,7 @@ async def run( if sys.version_info < (3, 11): # PORT: Remove when stop supporting 3.10 # pragma: no cover - async def run_task_group(*tasks: t.Coroutine[t.Any, t.Any, t.Any]) -> t.List[asyncio.Task]: + async def run_task_group(*tasks: t.Coroutine[t.Any, t.Any, t.Any]) -> list[asyncio.Task]: """Run a group of tasks. :param tasks: Tasks to run. @@ -65,7 +65,7 @@ async def run_task_group(*tasks: t.Coroutine[t.Any, t.Any, t.Any]) -> t.List[asy else: # noqa - async def run_task_group(*tasks: t.Coroutine[t.Any, t.Any, t.Any]) -> t.List[asyncio.Task]: + async def run_task_group(*tasks: t.Coroutine[t.Any, t.Any, t.Any]) -> list[asyncio.Task]: """Run a group of tasks. :param tasks: Tasks to run. @@ -79,8 +79,8 @@ class AsyncProcess(multiprocessing.Process): """Multiprocessing Process class whose target is an async function.""" _target: t.Optional[t.Callable[..., t.Union[t.Any, t.Coroutine]]] - _args: t.List[t.Any] - _kwargs: t.Dict[str, t.Any] + _args: list[t.Any] + _kwargs: dict[str, t.Any] def run(self) -> None: if self._target: diff --git a/flama/config/config.py b/flama/config/config.py index 9f4c1b2a..c7632c62 100644 --- a/flama/config/config.py +++ b/flama/config/config.py @@ -96,7 +96,7 @@ def _get_item(self, key: str, default: t.Union[R, Unknown] = unknown) -> R: raise KeyError(key) - def _build_dataclass(self, data: t.Any, dataclass: t.Type[R]) -> R: + def _build_dataclass(self, data: t.Any, dataclass: type[R]) -> R: if isinstance(data, str): try: data = json.loads(data) @@ -120,11 +120,11 @@ def __call__(self, key: str, *, default: t.Union[R, Unknown]) -> R: ... @t.overload - def __call__(self, key: str, *, cast: t.Type[R]) -> R: + def __call__(self, key: str, *, cast: type[R]) -> R: ... @t.overload - def __call__(self, key: str, *, default: t.Union[R, Unknown], cast: t.Type[R]) -> R: + def __call__(self, key: str, *, default: t.Union[R, Unknown], cast: type[R]) -> R: ... @t.overload @@ -140,7 +140,7 @@ def __call__( key: str, *, default: t.Union[R, Unknown] = unknown, - cast: t.Optional[t.Union[t.Type[R], t.Callable[[t.Any], R]]] = None + cast: t.Optional[t.Union[type[R], t.Callable[[t.Any], R]]] = None, ) -> R: """Get config parameter value. diff --git a/flama/config/data_structures.py b/flama/config/data_structures.py index 5f50d4c0..b23ff796 100644 --- a/flama/config/data_structures.py +++ b/flama/config/data_structures.py @@ -9,7 +9,7 @@ class FileDict(t.Mapping[str, t.Any]): """A dictionary that loads its data from a file. Supports json, toml, yaml and ini files.""" - _LOADERS: t.Dict[types.FileFormat, loaders.FileLoader] = { + _LOADERS: dict[types.FileFormat, loaders.FileLoader] = { types.FileFormat.json: loaders.JSONFileLoader(), types.FileFormat.toml: loaders.TOMLFileLoader(), types.FileFormat.yaml: loaders.YAMLFileLoader(), diff --git a/flama/config/fields.py b/flama/config/fields.py index 95198dce..e83204ac 100644 --- a/flama/config/fields.py +++ b/flama/config/fields.py @@ -60,7 +60,7 @@ def __init__(self, url: str): object.__setattr__(self, "fragment", parsed_url.fragment) @property - def components(self) -> t.Dict[str, t.Optional[str]]: + def components(self) -> dict[str, t.Optional[str]]: """URL components map. :return: Components. diff --git a/flama/config/loaders.py b/flama/config/loaders.py index 2fdb9dae..b8723e3e 100644 --- a/flama/config/loaders.py +++ b/flama/config/loaders.py @@ -24,7 +24,7 @@ class FileLoader(abc.ABC): """Common interface for loading a file.""" @abc.abstractmethod - def load(self, f: t.Union[str, os.PathLike]) -> t.Dict[str, t.Any]: + def load(self, f: t.Union[str, os.PathLike]) -> dict[str, t.Any]: """Loads a file into a dict. :param f: File path. @@ -36,7 +36,7 @@ def load(self, f: t.Union[str, os.PathLike]) -> t.Dict[str, t.Any]: class ConfigFileLoader(FileLoader): """Loads an ini formatted file into a dict.""" - def load(self, f: t.Union[str, os.PathLike]) -> t.Dict[str, t.Any]: + def load(self, f: t.Union[str, os.PathLike]) -> dict[str, t.Any]: """Loads a file into a dict. :param f: File path. @@ -56,7 +56,7 @@ def load(self, f: t.Union[str, os.PathLike]) -> t.Dict[str, t.Any]: class JSONFileLoader(FileLoader): """Loads a json formatted file into a dict.""" - def load(self, f: t.Union[str, os.PathLike]) -> t.Dict[str, t.Any]: + def load(self, f: t.Union[str, os.PathLike]) -> dict[str, t.Any]: """Loads a file into a dict. :param f: File path. @@ -69,7 +69,7 @@ def load(self, f: t.Union[str, os.PathLike]) -> t.Dict[str, t.Any]: class YAMLFileLoader(FileLoader): """Loads a yaml formatted file into a dict.""" - def load(self, f: t.Union[str, os.PathLike]) -> t.Dict[str, t.Any]: + def load(self, f: t.Union[str, os.PathLike]) -> dict[str, t.Any]: """Loads a file into a dict. :param f: File path. @@ -82,7 +82,7 @@ def load(self, f: t.Union[str, os.PathLike]) -> t.Dict[str, t.Any]: class TOMLFileLoader(FileLoader): """Loads a toml formatted file into a dict.""" - def load(self, f: t.Union[str, os.PathLike]) -> t.Dict[str, t.Any]: + def load(self, f: t.Union[str, os.PathLike]) -> dict[str, t.Any]: """Loads a file into a dict. :param f: File path. diff --git a/flama/ddd/repositories/http.py b/flama/ddd/repositories/http.py index ff7fca43..cc0c846c 100644 --- a/flama/ddd/repositories/http.py +++ b/flama/ddd/repositories/http.py @@ -1,3 +1,4 @@ +import builtins import http import typing as t import uuid @@ -33,7 +34,7 @@ def __eq__(self, other): isinstance(other, HTTPResourceManager) and self._client == other._client and self.resource == other.resource ) - async def create(self, data: t.Union[t.Dict[str, t.Any], types.Schema]) -> types.Schema: + async def create(self, data: t.Union[dict[str, t.Any], types.Schema]) -> types.Schema: """Create a new element in the collection. :param data: The data to create the element. @@ -67,9 +68,7 @@ async def retrieve(self, id: t.Union[str, uuid.UUID]) -> types.Schema: return types.Schema(response.json()) - async def update( - self, id: t.Union[str, uuid.UUID], data: t.Union[t.Dict[str, t.Any], types.Schema] - ) -> types.Schema: + async def update(self, id: t.Union[str, uuid.UUID], data: t.Union[dict[str, t.Any], types.Schema]) -> types.Schema: """Update an element in the collection. :param id: The id of the element. @@ -90,7 +89,7 @@ async def update( return types.Schema(response.json()) async def partial_update( - self, id: t.Union[str, uuid.UUID], data: t.Union[t.Dict[str, t.Any], types.Schema] + self, id: t.Union[str, uuid.UUID], data: t.Union[dict[str, t.Any], types.Schema] ) -> types.Schema: """Partially update an element in the collection. @@ -125,7 +124,7 @@ async def delete(self, id: t.Union[str, uuid.UUID]) -> None: raise exceptions.NotFoundError() raise - async def _fetch_page_elements(self, **params: t.Any) -> t.AsyncIterator[t.Dict[str, t.Any]]: + async def _fetch_page_elements(self, **params: t.Any) -> t.AsyncIterator[dict[str, t.Any]]: """Fetch elements of the collection. :param params: The parameters to use in the request. @@ -141,7 +140,7 @@ async def _fetch_page_elements(self, **params: t.Any) -> t.AsyncIterator[t.Dict[ for element in data: yield element - async def _page_number_paginated(self) -> t.AsyncIterable[t.Dict[str, t.Any]]: + async def _page_number_paginated(self) -> t.AsyncIterable[dict[str, t.Any]]: """Fetch elements of the collection paginated by page number. :return: Async iterable of the elements. @@ -155,7 +154,7 @@ async def _page_number_paginated(self) -> t.AsyncIterable[t.Dict[str, t.Any]]: except exceptions.Empty: break - async def _limit_offset_paginated(self) -> t.AsyncIterable[t.Dict[str, t.Any]]: + async def _limit_offset_paginated(self) -> t.AsyncIterable[dict[str, t.Any]]: """Fetch elements of the collection paginated by limit and offset. :return: Async iterable of the elements. @@ -181,7 +180,7 @@ async def list(self, *, pagination: str = "page_number") -> t.AsyncIterable[type async for element in iterator: yield types.Schema(element) - async def replace(self, data: t.List[t.Dict[str, t.Any]]) -> t.List[types.Schema]: + async def replace(self, data: builtins.list[dict[str, t.Any]]) -> builtins.list[types.Schema]: """Replace elements in the collection. :param data: The data to replace the elements. @@ -197,7 +196,7 @@ async def replace(self, data: t.List[t.Dict[str, t.Any]]) -> t.List[types.Schema return [types.Schema(element) for element in response.json()] - async def partial_replace(self, data: t.List[t.Dict[str, t.Any]]) -> t.List[types.Schema]: + async def partial_replace(self, data: builtins.list[dict[str, t.Any]]) -> builtins.list[types.Schema]: """Partially replace elements in the collection. :param data: The data to replace the elements. @@ -239,7 +238,7 @@ def __init__(self, client: "Client"): super().__init__(client) self._resource_manager = HTTPResourceManager(self._resource, client) - async def create(self, data: t.Dict[str, t.Any]) -> types.Schema: + async def create(self, data: dict[str, t.Any]) -> types.Schema: """Create a new element in the collection. :param data: The data to create the element. @@ -255,7 +254,7 @@ async def retrieve(self, id: uuid.UUID) -> types.Schema: """ return await self._resource_manager.retrieve(id) - async def update(self, id: uuid.UUID, data: t.Dict[str, t.Any]) -> types.Schema: + async def update(self, id: uuid.UUID, data: dict[str, t.Any]) -> types.Schema: """Update an element in the collection. :param id: The id of the element. @@ -264,7 +263,7 @@ async def update(self, id: uuid.UUID, data: t.Dict[str, t.Any]) -> types.Schema: """ return await self._resource_manager.update(id, data) - async def partial_update(self, id: uuid.UUID, data: t.Dict[str, t.Any]) -> types.Schema: + async def partial_update(self, id: uuid.UUID, data: dict[str, t.Any]) -> types.Schema: """Partially update an element in the collection. :param id: The id of the element. @@ -288,7 +287,7 @@ def list(self, *, pagination: str = "page_number") -> t.AsyncIterable[types.Sche """ return self._resource_manager.list(pagination=pagination) - async def replace(self, data: t.List[t.Dict[str, t.Any]]) -> t.List[types.Schema]: + async def replace(self, data: builtins.list[dict[str, t.Any]]) -> builtins.list[types.Schema]: """Replace elements in the collection. :param data: The data to replace the elements. @@ -296,7 +295,7 @@ async def replace(self, data: t.List[t.Dict[str, t.Any]]) -> t.List[types.Schema """ return await self._resource_manager.replace(data) - async def partial_replace(self, data: t.List[t.Dict[str, t.Any]]) -> t.List[types.Schema]: + async def partial_replace(self, data: builtins.list[dict[str, t.Any]]) -> builtins.list[types.Schema]: """Partially replace elements in the collection. :param data: The data to replace the elements. diff --git a/flama/ddd/repositories/sqlalchemy.py b/flama/ddd/repositories/sqlalchemy.py index 662817a4..c5ccd654 100644 --- a/flama/ddd/repositories/sqlalchemy.py +++ b/flama/ddd/repositories/sqlalchemy.py @@ -41,7 +41,7 @@ def __eq__(self, other): and self.table == other.table ) - async def create(self, *data: t.Union[t.Dict[str, t.Any], types.Schema]) -> t.List[types.Schema]: + async def create(self, *data: t.Union[dict[str, t.Any], types.Schema]) -> list[types.Schema]: """Creates new elements in the table. If the element already exists, it raises an `IntegrityError`. If the element is created, it returns @@ -84,9 +84,7 @@ async def retrieve(self, *clauses, **filters) -> types.Schema: return types.Schema(element._asdict()) - async def update( - self, data: t.Union[t.Dict[str, t.Any], types.Schema], *clauses, **filters - ) -> t.List[types.Schema]: + async def update(self, data: t.Union[dict[str, t.Any], types.Schema], *clauses, **filters) -> list[types.Schema]: """Updates elements in the table. Using clauses and filters, it filters the elements to update. If no clauses or filters are given, it updates @@ -217,7 +215,7 @@ def __init__(self, connection: "AsyncConnection", *args, **kwargs): def __eq__(self, other): return isinstance(other, SQLAlchemyTableRepository) and self._table == other._table and super().__eq__(other) - async def create(self, *data: t.Union[t.Dict[str, t.Any], types.Schema]) -> t.List[types.Schema]: + async def create(self, *data: t.Union[dict[str, t.Any], types.Schema]) -> list[types.Schema]: """Creates new elements in the repository. If the element already exists, it raises an `exceptions.IntegrityError`. If the element is created, it returns @@ -249,9 +247,7 @@ async def retrieve(self, *clauses, **filters) -> types.Schema: """ return await self._table_manager.retrieve(*clauses, **filters) - async def update( - self, data: t.Union[t.Dict[str, t.Any], types.Schema], *clauses, **filters - ) -> t.List[types.Schema]: + async def update(self, data: t.Union[dict[str, t.Any], types.Schema], *clauses, **filters) -> list[types.Schema]: """Updates an element in the repository. If the element does not exist, it raises a `NotFoundError`. If the element is updated, it returns the updated diff --git a/flama/ddd/workers/base.py b/flama/ddd/workers/base.py index 97ede5b1..d631aa82 100644 --- a/flama/ddd/workers/base.py +++ b/flama/ddd/workers/base.py @@ -12,7 +12,7 @@ logger = logging.getLogger(__name__) -Repositories = t.NewType("Repositories", t.Dict[str, t.Type[AbstractRepository]]) +Repositories = t.NewType("Repositories", dict[str, type[AbstractRepository]]) __all__ = ["WorkerType", "AbstractWorker"] @@ -24,7 +24,7 @@ class WorkerType(abc.ABCMeta): `_repositories`. """ - def __new__(mcs, name: str, bases: t.Tuple[type], namespace: t.Dict[str, t.Any]): + def __new__(mcs, name: str, bases: tuple[type], namespace: dict[str, t.Any]): if not mcs._is_abstract(namespace) and "__annotations__" in namespace: namespace["_repositories"] = Repositories( { @@ -41,7 +41,7 @@ def __new__(mcs, name: str, bases: t.Tuple[type], namespace: t.Dict[str, t.Any]) return super().__new__(mcs, name, bases, namespace) @staticmethod - def _is_abstract(namespace: t.Dict[str, t.Any]) -> bool: + def _is_abstract(namespace: dict[str, t.Any]) -> bool: return namespace.get("__module__") == "flama.ddd.workers" and namespace.get("__qualname__") == "AbstractWorker" @@ -52,7 +52,7 @@ class AbstractWorker(abc.ABC, metaclass=WorkerType): used to interact with entities and a mechanism for isolate a single unit of work. """ - _repositories: t.ClassVar[t.Dict[str, t.Type[AbstractRepository]]] + _repositories: t.ClassVar[dict[str, type[AbstractRepository]]] def __init__(self, app: t.Optional["Flama"] = None): """Initialize the worker. diff --git a/flama/debug/data_structures.py b/flama/debug/data_structures.py index 907b0ede..ea5256c5 100644 --- a/flama/debug/data_structures.py +++ b/flama/debug/data_structures.py @@ -12,8 +12,8 @@ @dataclasses.dataclass(frozen=True) class RequestParams: - path: t.Dict[str, t.Any] - query: t.Dict[str, t.Any] + path: dict[str, t.Any] + query: dict[str, t.Any] @dataclasses.dataclass(frozen=True) @@ -27,8 +27,8 @@ class Request: path: str method: str params: RequestParams - headers: t.Dict[str, str] - cookies: t.Dict[str, str] + headers: dict[str, str] + cookies: dict[str, str] client: t.Optional[RequestClient] = None @classmethod @@ -84,7 +84,7 @@ def from_frame_info(cls, frame: inspect.FrameInfo) -> "Frame": class Error: error: str description: str - traceback: t.List[Frame] + traceback: list[Frame] @classmethod def from_exception(cls, exc: Exception, context: int = 10) -> "Error": @@ -102,7 +102,7 @@ class Environment: platform: str python: str python_version: str - path: t.List[str] + path: list[str] @classmethod def from_system(cls) -> "Environment": @@ -144,13 +144,13 @@ def from_route(cls, route: t.Union["Route", "WebSocketRoute"]) -> "Endpoint": @dataclasses.dataclass(frozen=True) class App: - urls: t.List[t.Union[Endpoint, "App"]] + urls: list[t.Union[Endpoint, "App"]] path: str name: t.Optional[str] = None @classmethod def from_app(cls, app: t.Any, path: str = "/", name: t.Optional[str] = None) -> "App": - urls: t.List[t.Union[Endpoint, "App"]] = [] + urls: list[t.Union[Endpoint, "App"]] = [] for route in app.routes: try: urls.append(App.from_app(route.app, path=route.path.path, name=route.name)) diff --git a/flama/debug/middleware.py b/flama/debug/middleware.py index b6e539f1..0d3876ef 100644 --- a/flama/debug/middleware.py +++ b/flama/debug/middleware.py @@ -100,10 +100,10 @@ class ExceptionMiddleware(BaseErrorMiddleware): def __init__(self, app: types.App, handlers: t.Optional[t.Mapping[t.Any, "Handler"]] = None, debug: bool = False): super().__init__(app, debug) handlers = handlers or {} - self._status_handlers: t.Dict[int, "Handler"] = { + self._status_handlers: dict[int, "Handler"] = { status_code: handler for status_code, handler in handlers.items() if isinstance(status_code, int) } - self._exception_handlers: t.Dict[t.Type[Exception], "Handler"] = { + self._exception_handlers: dict[type[Exception], "Handler"] = { **{e: handler for e, handler in handlers.items() if inspect.isclass(e) and issubclass(e, Exception)}, exceptions.NotFoundException: self.not_found_handler, exceptions.MethodNotAllowedException: self.method_not_allowed_handler, @@ -115,7 +115,7 @@ def add_exception_handler( self, handler: "Handler", status_code: t.Optional[int] = None, - exc_class: t.Optional[t.Type[Exception]] = None, + exc_class: t.Optional[type[Exception]] = None, ) -> None: if status_code is None and exc_class is None: raise ValueError("Status code or exception class must be defined") diff --git a/flama/endpoints.py b/flama/endpoints.py index f39ad3e5..f2b47b10 100644 --- a/flama/endpoints.py +++ b/flama/endpoints.py @@ -36,7 +36,7 @@ def __await__(self) -> t.Generator: return self.dispatch().__await__() @classmethod - def allowed_methods(cls) -> t.Set[str]: + def allowed_methods(cls) -> set[str]: """The list of allowed methods by this endpoint. :return: List of allowed methods. @@ -49,7 +49,7 @@ def allowed_methods(cls) -> t.Set[str]: return methods @classmethod - def allowed_handlers(cls) -> t.Dict[str, t.Callable]: + def allowed_handlers(cls) -> dict[str, t.Callable]: """A mapping of handler related to each HTTP method. :return: Handlers mapping. @@ -107,7 +107,7 @@ def __await__(self) -> t.Generator: return self.dispatch().__await__() @classmethod - def allowed_handlers(cls) -> t.Dict[str, t.Callable]: + def allowed_handlers(cls) -> dict[str, t.Callable]: """A mapping of handler related to each WS action. :return: Handlers mapping. diff --git a/flama/events.py b/flama/events.py index bb666364..2e13a079 100644 --- a/flama/events.py +++ b/flama/events.py @@ -6,8 +6,8 @@ class Events: """Application events register.""" - startup: t.List[t.Callable[..., t.Coroutine[t.Any, t.Any, None]]] = dataclasses.field(default_factory=list) - shutdown: t.List[t.Callable[..., t.Coroutine[t.Any, t.Any, None]]] = dataclasses.field(default_factory=list) + startup: list[t.Callable[..., t.Coroutine[t.Any, t.Any, None]]] = dataclasses.field(default_factory=list) + shutdown: list[t.Callable[..., t.Coroutine[t.Any, t.Any, None]]] = dataclasses.field(default_factory=list) def register(self, event: str, handler: t.Callable) -> None: """Register a new event. @@ -19,7 +19,7 @@ def register(self, event: str, handler: t.Callable) -> None: getattr(self, event).append(handler) @classmethod - def build(cls, **events: t.List[t.Callable[..., t.Coroutine[t.Any, t.Any, None]]]) -> "Events": + def build(cls, **events: list[t.Callable[..., t.Coroutine[t.Any, t.Any, None]]]) -> "Events": """Build events register from dict. :param events: Events to register. diff --git a/flama/exceptions.py b/flama/exceptions.py index 3e4c8fbb..9624e68e 100644 --- a/flama/exceptions.py +++ b/flama/exceptions.py @@ -64,7 +64,7 @@ class HTTPException(starlette.exceptions.HTTPException): def __init__( self, status_code: int, - detail: t.Optional[t.Union[str, t.Dict[str, t.Any]]] = None, + detail: t.Optional[t.Union[str, dict[str, t.Any]]] = None, headers: t.Optional[dict] = None, ) -> None: if detail is None: @@ -93,20 +93,20 @@ def __eq__(self, other): class ValidationError(HTTPException): def __init__( self, - detail: t.Optional[t.Union[str, t.Dict[str, t.List[str]]]] = None, + detail: t.Optional[t.Union[str, dict[str, list[str]]]] = None, status_code: int = 400, ) -> None: super().__init__(status_code, detail=detail) class SerializationError(HTTPException): - def __init__(self, detail: t.Union[None, str, t.Dict[str, t.List[str]]] = None, status_code: int = 500) -> None: + def __init__(self, detail: t.Union[None, str, dict[str, list[str]]] = None, status_code: int = 500) -> None: super().__init__(status_code, detail=detail) class NotFoundException(Exception): def __init__( - self, path: t.Optional[str] = None, params: t.Optional[t.Dict[str, t.Any]] = None, name: t.Optional[str] = None + self, path: t.Optional[str] = None, params: t.Optional[dict[str, t.Any]] = None, name: t.Optional[str] = None ) -> None: self.path = path self.params = params @@ -124,9 +124,7 @@ def __repr__(self) -> str: class MethodNotAllowedException(Exception): - def __init__( - self, path: str, method: str, allowed: t.Set[str], params: t.Optional[t.Dict[str, t.Any]] = None - ) -> None: + def __init__(self, path: str, method: str, allowed: set[str], params: t.Optional[dict[str, t.Any]] = None) -> None: self.path = path self.params = params self.method = method diff --git a/flama/http.py b/flama/http.py index 97909bde..12b7a252 100644 --- a/flama/http.py +++ b/flama/http.py @@ -147,7 +147,7 @@ async def __call__( # type: ignore[override] class APIResponse(JSONResponse): media_type = "application/json" - def __init__(self, content: t.Any = None, schema: t.Optional[t.Type["types.Schema"]] = None, *args, **kwargs): + def __init__(self, content: t.Any = None, schema: t.Optional[type["types.Schema"]] = None, *args, **kwargs): self.schema = schema super().__init__(content, *args, **kwargs) @@ -170,7 +170,7 @@ def __init__( detail: t.Any, status_code: int = 400, exception: t.Optional[Exception] = None, - headers: t.Optional[t.Dict[str, str]] = None, + headers: t.Optional[dict[str, str]] = None, *args, **kwargs, ): @@ -207,7 +207,7 @@ class HTMLTemplateResponse(HTMLResponse): ) ) - def __init__(self, template: str, context: t.Optional[t.Dict[str, t.Any]] = None, *args, **kwargs): + def __init__(self, template: str, context: t.Optional[dict[str, t.Any]] = None, *args, **kwargs): if context is None: context = {} diff --git a/flama/injection/components.py b/flama/injection/components.py index 51625197..238bcde3 100644 --- a/flama/injection/components.py +++ b/flama/injection/components.py @@ -49,7 +49,7 @@ def can_handle_parameter(self, parameter: Parameter) -> bool: return parameter.annotation is return_annotation - def signature(self) -> t.Dict[str, Parameter]: + def signature(self) -> dict[str, Parameter]: """Component resolver signature. :return: Component resolver signature. @@ -61,7 +61,7 @@ def signature(self) -> t.Dict[str, Parameter]: @property def use_parameter(self) -> bool: - return any((x for x in self.signature().values() if x.annotation is Parameter)) + return any(x for x in self.signature().values() if x.annotation is Parameter) async def __call__(self, *args, **kwargs): """Performs a resolution by calling this component's resolve method. @@ -79,8 +79,8 @@ def __str__(self) -> str: return str(self.__class__.__name__) -class Components(t.Tuple[Component, ...]): - def __new__(cls, components: t.Optional[t.Union[t.Sequence[Component], t.Set[Component]]] = None): +class Components(tuple[Component, ...]): + def __new__(cls, components: t.Optional[t.Union[t.Sequence[Component], set[Component]]] = None): return super().__new__(cls, components or []) def __eq__(self, other: t.Any) -> bool: diff --git a/flama/injection/injector.py b/flama/injection/injector.py index b2134fb6..22df443f 100644 --- a/flama/injection/injector.py +++ b/flama/injection/injector.py @@ -15,7 +15,7 @@ class Injector: def __init__( self, - context_types: t.Optional[t.Dict[str, t.Type]] = None, + context_types: t.Optional[dict[str, type]] = None, components: t.Optional[t.Union[t.Sequence[Component], Components]] = None, ): """Functions dependency injector. @@ -30,11 +30,11 @@ def __init__( self._resolver: t.Optional[Resolver] = None @property - def context_types(self) -> t.Dict[str, t.Type]: + def context_types(self) -> dict[str, type]: return self._context_types @context_types.setter - def context_types(self, context_types: t.Dict[str, t.Type]): + def context_types(self, context_types: dict[str, type]): self._context_types = context_types del self.resolver @@ -96,7 +96,7 @@ def resolve( """ return self.resolver.resolve(Parameter(name or ROOT_NAME, annotation, default)) - def resolve_function(self, func: t.Callable) -> t.Dict[str, "ResolutionTree"]: + def resolve_function(self, func: t.Callable) -> dict[str, "ResolutionTree"]: """Generate a dependencies tree for a given function. It analyses the function signature, look for type annotations and try to resolve them. @@ -113,7 +113,7 @@ def resolve_function(self, func: t.Callable) -> t.Dict[str, "ResolutionTree"]: return parameters - async def inject(self, func: t.Callable, context: t.Optional[t.Dict[str, t.Any]] = None) -> t.Callable: + async def inject(self, func: t.Callable, context: t.Optional[dict[str, t.Any]] = None) -> t.Callable: """Inject dependencies into a given function. It analyses the function signature, look for type annotations and try to resolve them. Once all dependencies diff --git a/flama/injection/resolver.py b/flama/injection/resolver.py index 9441a490..56de6594 100644 --- a/flama/injection/resolver.py +++ b/flama/injection/resolver.py @@ -53,19 +53,19 @@ class ResolutionNode(abc.ABC): name: str parameter: Parameter - nodes: t.List["ResolutionNode"] + nodes: list["ResolutionNode"] @abc.abstractmethod - async def value(self, context: t.Dict[str, t.Any]) -> t.Any: + async def value(self, context: dict[str, t.Any]) -> t.Any: ... - def components(self) -> t.List[t.Tuple[str, "Component"]]: + def components(self) -> list[tuple[str, "Component"]]: return [] - def parameters(self) -> t.List[Parameter]: + def parameters(self) -> list[Parameter]: return [] - def context(self) -> t.List[t.Tuple[str, Parameter]]: + def context(self) -> list[tuple[str, Parameter]]: return [] @@ -75,18 +75,18 @@ class ComponentNode(ResolutionNode): component: "Component" - async def value(self, context: t.Dict[str, t.Any]) -> t.Any: + async def value(self, context: dict[str, t.Any]) -> t.Any: kwargs = {node.name: await node.value(context) for node in self.nodes} return await self.component(**kwargs) - def components(self) -> t.List[t.Tuple[str, "Component"]]: + def components(self) -> list[tuple[str, "Component"]]: return [(self.name, self.component), *[x for node in self.nodes for x in node.components()]] - def context(self) -> t.List[t.Tuple[str, Parameter]]: + def context(self) -> list[tuple[str, Parameter]]: return [x for node in self.nodes for x in node.context()] - def parameters(self) -> t.List[Parameter]: + def parameters(self) -> list[Parameter]: return [x for node in self.nodes for x in node.parameters()] @@ -94,10 +94,10 @@ def parameters(self) -> t.List[Parameter]: class ContextNode(ResolutionNode): """A node that represents a parameter that is resolved by context.""" - async def value(self, context: t.Dict[str, t.Any]) -> t.Any: + async def value(self, context: dict[str, t.Any]) -> t.Any: return context[self.parameter.name] - def context(self) -> t.List[t.Tuple[str, Parameter]]: + def context(self) -> list[tuple[str, Parameter]]: return [(self.name, self.parameter)] @@ -105,10 +105,10 @@ def context(self) -> t.List[t.Tuple[str, Parameter]]: class ParameterNode(ResolutionNode): """A node that represents a parameter that is resolved by another parameter.""" - async def value(self, context: t.Dict[str, t.Any]) -> t.Any: + async def value(self, context: dict[str, t.Any]) -> t.Any: return self.parameter - def parameters(self) -> t.List[Parameter]: + def parameters(self) -> list[Parameter]: return [self.parameter] @@ -117,9 +117,9 @@ class ResolutionTree: """Dependencies tree.""" root: ResolutionNode - context: t.List[t.Tuple[str, Parameter]] = dataclasses.field(init=False) - parameters: t.List[Parameter] = dataclasses.field(init=False) - components: t.List[t.Tuple[str, "Component"]] = dataclasses.field(init=False) + context: list[tuple[str, Parameter]] = dataclasses.field(init=False) + parameters: list[Parameter] = dataclasses.field(init=False) + components: list[tuple[str, "Component"]] = dataclasses.field(init=False) def __post_init__(self): object.__setattr__(self, "context", self.root.context()) @@ -127,16 +127,14 @@ def __post_init__(self): object.__setattr__(self, "components", self.root.components()) @classmethod - def build( - cls, parameter: Parameter, context_types: t.Dict[t.Any, str], components: "Components" - ) -> "ResolutionTree": + def build(cls, parameter: Parameter, context_types: dict[t.Any, str], components: "Components") -> "ResolutionTree": return cls(root=cls._build_node(parameter, context_types, components)) @classmethod def _build_node( cls, parameter: Parameter, - context_types: t.Dict[t.Any, str], + context_types: dict[t.Any, str], components: "Components", parent: t.Optional[Parameter] = None, ) -> ResolutionNode: @@ -177,9 +175,9 @@ def _build_node( if e.component is None: raise ComponentNotFound(e.parameter, component=component) from None - raise # noqa: safety net + raise # pragma: no cover - async def value(self, context: t.Dict[str, t.Any]) -> t.Any: + async def value(self, context: dict[str, t.Any]) -> t.Any: return await self.root.value(context) @@ -217,7 +215,7 @@ def __repr__(self) -> str: class Resolver: """Provides a way to inspect a parameter and build it dependencies tree.""" - def __init__(self, context_types: t.Dict[str, t.Type], components: "Components"): + def __init__(self, context_types: dict[str, type], components: "Components"): """Initialize a new resolver. The context types are used to determine if a parameter is a context value or not. The components registry will diff --git a/flama/middleware.py b/flama/middleware.py index 57fec43f..7c327160 100644 --- a/flama/middleware.py +++ b/flama/middleware.py @@ -114,8 +114,8 @@ def __init__(self, app: "Flama", middleware: t.Sequence[Middleware], debug: bool self.app = app self.middleware = list(reversed(middleware)) self.debug = debug - self._exception_handlers: t.Dict[ - t.Union[int, t.Type[Exception]], t.Callable[["Request", Exception], "Response"] + self._exception_handlers: dict[ + t.Union[int, type[Exception]], t.Callable[["Request", Exception], "Response"] ] = {} self._stack: t.Optional[t.Union["types.MiddlewareClass", "types.App"]] = None @@ -141,7 +141,7 @@ def stack(self): self._stack = None def add_exception_handler( - self, key: t.Union[int, t.Type[Exception]], handler: t.Callable[["Request", Exception], "Response"] + self, key: t.Union[int, type[Exception]], handler: t.Callable[["Request", Exception], "Response"] ): """Adds a new handler for an exception type or a HTTP status code. diff --git a/flama/models/components.py b/flama/models/components.py index 300b1e21..bd12d841 100644 --- a/flama/models/components.py +++ b/flama/models/components.py @@ -14,13 +14,13 @@ class ModelComponent(Component): def __init__(self, model): self.model = model - def get_model_type(self) -> t.Type[Model]: + def get_model_type(self) -> type[Model]: return self.model.__class__ # type: ignore[no-any-return] class ModelComponentBuilder: @classmethod - def _get_model_class(cls, framework: Framework) -> t.Type[Model]: + def _get_model_class(cls, framework: Framework) -> type[Model]: try: module, class_name = { Framework.torch: ("pytorch", "PyTorchModel"), @@ -31,7 +31,7 @@ def _get_model_class(cls, framework: Framework) -> t.Type[Model]: except KeyError: # pragma: no cover raise ValueError("Wrong framework") - model_class: t.Type[Model] = getattr(importlib.import_module(f"flama.models.models.{module}"), class_name) + model_class: type[Model] = getattr(importlib.import_module(f"flama.models.models.{module}"), class_name) return model_class @classmethod diff --git a/flama/models/models/pytorch.py b/flama/models/models/pytorch.py index 63099e41..10cef9b6 100644 --- a/flama/models/models/pytorch.py +++ b/flama/models/models/pytorch.py @@ -10,7 +10,7 @@ class PyTorchModel(Model): - def predict(self, x: t.List[t.List[t.Any]]) -> t.Any: + def predict(self, x: list[list[t.Any]]) -> t.Any: if torch is None: # noqa raise exceptions.FrameworkNotInstalled("pytorch") diff --git a/flama/models/models/sklearn.py b/flama/models/models/sklearn.py index 4cb8d0c6..e6399ae2 100644 --- a/flama/models/models/sklearn.py +++ b/flama/models/models/sklearn.py @@ -10,7 +10,7 @@ class SKLearnModel(Model): - def predict(self, x: t.List[t.List[t.Any]]) -> t.Any: + def predict(self, x: list[list[t.Any]]) -> t.Any: if sklearn is None: # noqa raise exceptions.FrameworkNotInstalled("scikit-learn") diff --git a/flama/models/models/tensorflow.py b/flama/models/models/tensorflow.py index cfbfb056..4a8711e9 100644 --- a/flama/models/models/tensorflow.py +++ b/flama/models/models/tensorflow.py @@ -15,7 +15,7 @@ class TensorFlowModel(Model): - def predict(self, x: t.List[t.List[t.Any]]) -> t.Any: + def predict(self, x: list[list[t.Any]]) -> t.Any: if np is None: # noqa raise exceptions.FrameworkNotInstalled("numpy") diff --git a/flama/models/modules.py b/flama/models/modules.py index ee240921..271a2ebc 100644 --- a/flama/models/modules.py +++ b/flama/models/modules.py @@ -15,9 +15,9 @@ def add_model( path: str, model: t.Union[str, os.PathLike], name: str, - tags: t.Optional[t.Dict[str, t.Dict[str, t.Any]]] = None, + tags: t.Optional[dict[str, dict[str, t.Any]]] = None, *args, - **kwargs + **kwargs, ) -> ModelResource: """Adds a model to this application, setting its endpoints. @@ -40,7 +40,7 @@ class Resource(ModelResource, metaclass=ModelResourceType): return resource def model_resource( - self, path: str, tags: t.Optional[t.Dict[str, t.Dict[str, t.Any]]] = None, *args, **kwargs + self, path: str, tags: t.Optional[dict[str, dict[str, t.Any]]] = None, *args, **kwargs ) -> t.Callable: """Decorator for ModelResource classes for adding them to the application. @@ -49,7 +49,7 @@ def model_resource( :return: Decorated resource class. """ - def decorator(resource: t.Type[ModelResource]) -> t.Type[ModelResource]: + def decorator(resource: type[ModelResource]) -> type[ModelResource]: self.app.add_component(resource.component) self.app.resources.add_resource(path, resource, tags=tags, *args, **kwargs) # type: ignore[attr-defined] return resource @@ -59,10 +59,10 @@ def decorator(resource: t.Type[ModelResource]) -> t.Type[ModelResource]: def add_model_resource( self, path: str, - resource: t.Union[ModelResource, t.Type[ModelResource]], - tags: t.Optional[t.Dict[str, t.Dict[str, t.Any]]] = None, + resource: t.Union[ModelResource, type[ModelResource]], + tags: t.Optional[dict[str, dict[str, t.Any]]] = None, *args, - **kwargs + **kwargs, ) -> ModelResource: """Adds a resource to this application, setting its endpoints. diff --git a/flama/models/resource.py b/flama/models/resource.py index 14b03d4d..89b39673 100644 --- a/flama/models/resource.py +++ b/flama/models/resource.py @@ -18,9 +18,7 @@ class InspectMixin: @classmethod - def _add_inspect( - cls, name: str, verbose_name: str, model_model_type: t.Type["Model"], **kwargs - ) -> t.Dict[str, t.Any]: + def _add_inspect(cls, name: str, verbose_name: str, model_model_type: type["Model"], **kwargs) -> dict[str, t.Any]: @resource_method("/", methods=["GET"], name="inspect") async def inspect(self, model: model_model_type): # type: ignore[valid-type] return model.inspect() # type: ignore[attr-defined] @@ -43,9 +41,7 @@ async def inspect(self, model: model_model_type): # type: ignore[valid-type] class PredictMixin: @classmethod - def _add_predict( - cls, name: str, verbose_name: str, model_model_type: t.Type["Model"], **kwargs - ) -> t.Dict[str, t.Any]: + def _add_predict(cls, name: str, verbose_name: str, model_model_type: type["Model"], **kwargs) -> dict[str, t.Any]: @resource_method("/predict/", methods=["POST"], name="predict") async def predict( self, @@ -73,7 +69,7 @@ async def predict( class ModelResourceType(ResourceType, InspectMixin, PredictMixin): METHODS = ("inspect", "predict") - def __new__(mcs, name: str, bases: t.Tuple[type], namespace: t.Dict[str, t.Any]): + def __new__(mcs, name: str, bases: tuple[type], namespace: dict[str, t.Any]): """Resource metaclass for defining basic behavior for ML resources: * Create _meta attribute containing some metadata (model...). * Adds methods related to ML resource (inspect, predict...) listed in METHODS class attribute. @@ -100,13 +96,13 @@ def __new__(mcs, name: str, bases: t.Tuple[type], namespace: t.Dict[str, t.Any]) return super().__new__(mcs, name, bases, namespace) @staticmethod - def _is_abstract(namespace: t.Dict[str, t.Any]) -> bool: + def _is_abstract(namespace: dict[str, t.Any]) -> bool: return ( namespace.get("__module__") == "flama.models.resource" and namespace.get("__qualname__") == "ModelResource" ) @classmethod - def _get_model_component(cls, bases: t.Sequence[t.Any], namespace: t.Dict[str, t.Any]) -> "ModelComponent": + def _get_model_component(cls, bases: t.Sequence[t.Any], namespace: dict[str, t.Any]) -> "ModelComponent": try: component: "ModelComponent" = cls._get_attribute("component", bases, namespace, metadata_namespace="model") return component diff --git a/flama/modules.py b/flama/modules.py index 7217b9dc..3e514640 100644 --- a/flama/modules.py +++ b/flama/modules.py @@ -32,9 +32,9 @@ class Module(_BaseModule, metaclass=_ModuleMeta): ... -class Modules(t.Dict[str, Module]): - def __init__(self, app: "Flama", modules: t.Optional[t.Union[t.Sequence[Module], t.Set[Module]]]): - modules_map: t.Dict[str, t.List[Module]] = defaultdict(list) +class Modules(dict[str, Module]): + def __init__(self, app: "Flama", modules: t.Optional[t.Union[t.Sequence[Module], set[Module]]]): + modules_map: dict[str, list[Module]] = defaultdict(list) for module in modules or []: module.app = app modules_map[module.name].append(module) diff --git a/flama/negotiation.py b/flama/negotiation.py index 6c56f1a7..0f70e89f 100644 --- a/flama/negotiation.py +++ b/flama/negotiation.py @@ -8,7 +8,7 @@ class ContentTypeNegotiator: - def __init__(self, codecs: t.Optional[t.List[HTTPCodec]] = None): + def __init__(self, codecs: t.Optional[list[HTTPCodec]] = None): self.codecs = codecs or [] def negotiate(self, content_type: t.Optional[str] = None) -> HTTPCodec: @@ -30,7 +30,7 @@ def negotiate(self, content_type: t.Optional[str] = None) -> HTTPCodec: class WebSocketEncodingNegotiator: - def __init__(self, codecs: t.Optional[t.List[WebsocketsCodec]] = None): + def __init__(self, codecs: t.Optional[list[WebsocketsCodec]] = None): self.codecs = codecs or [BytesCodec()] def negotiate(self, encoding: t.Optional[str] = None) -> WebsocketsCodec: diff --git a/flama/pagination/decorators.py b/flama/pagination/decorators.py index 9cd01334..3a5ccf1a 100644 --- a/flama/pagination/decorators.py +++ b/flama/pagination/decorators.py @@ -7,10 +7,10 @@ class PaginationDecoratorFactory: - PARAMETERS: t.List[inspect.Parameter] + PARAMETERS: list[inspect.Parameter] @classmethod - def decorate(cls, func: t.Callable, schema: t.Type[types.Schema]) -> t.Callable: + def decorate(cls, func: t.Callable, schema: type[types.Schema]) -> t.Callable: func_signature = inspect.signature(func) if "kwargs" not in func_signature.parameters: raise TypeError("Paginated views must define **kwargs param") @@ -31,10 +31,10 @@ def decorate(cls, func: t.Callable, schema: t.Type[types.Schema]) -> t.Callable: @classmethod @abc.abstractmethod - def _decorate_async(cls, func: t.Callable, schema: t.Type[types.Schema]) -> t.Callable: + def _decorate_async(cls, func: t.Callable, schema: type[types.Schema]) -> t.Callable: ... @classmethod @abc.abstractmethod - def _decorate_sync(cls, func: t.Callable, schema: t.Type[types.Schema]) -> t.Callable: + def _decorate_sync(cls, func: t.Callable, schema: type[types.Schema]) -> t.Callable: ... diff --git a/flama/pagination/mixins/limit_offset.py b/flama/pagination/mixins/limit_offset.py index 70d9c3a2..f84b18c9 100644 --- a/flama/pagination/mixins/limit_offset.py +++ b/flama/pagination/mixins/limit_offset.py @@ -23,7 +23,7 @@ class LimitOffsetResponse(http.APIResponse): def __init__( self, - schema: t.Type[types.Schema], + schema: type[types.Schema], offset: t.Optional[t.Union[int, str]] = None, limit: t.Optional[t.Union[int, str]] = None, count: t.Optional[bool] = True, @@ -59,7 +59,7 @@ class LimitOffsetDecoratorFactory(PaginationDecoratorFactory): ] @classmethod - def _decorate_async(cls, func: t.Callable, schema: t.Type[types.Schema]) -> t.Callable: + def _decorate_async(cls, func: t.Callable, schema: type[types.Schema]) -> t.Callable: @functools.wraps(func) async def decorator( *args, @@ -75,7 +75,7 @@ async def decorator( return decorator @classmethod - def _decorate_sync(cls, func: t.Callable, schema: t.Type[types.Schema]) -> t.Callable: + def _decorate_sync(cls, func: t.Callable, schema: type[types.Schema]) -> t.Callable: @functools.wraps(func) def decorator( *args, @@ -113,7 +113,7 @@ def _paginate_limit_offset(self, func: t.Callable) -> t.Callable: try: schema_module, schema_class = schema_name.rsplit(".", 1) paginated_schema_name = f"{schema_module}.LimitOffsetPaginated{schema_class}" - except ValueError: # noqa: safety net + except ValueError: # pragma: no cover paginated_schema_name = f"LimitOffsetPaginated{schema_name}" schema = schemas.Schema.build( paginated_schema_name, diff --git a/flama/pagination/mixins/page_number.py b/flama/pagination/mixins/page_number.py index b82d12d1..d06520ef 100644 --- a/flama/pagination/mixins/page_number.py +++ b/flama/pagination/mixins/page_number.py @@ -25,7 +25,7 @@ class PageNumberResponse(http.APIResponse): def __init__( self, - schema: t.Type[types.Schema], + schema: type[types.Schema], page: t.Optional[t.Union[int, str]] = None, page_size: t.Optional[t.Union[int, str]] = None, count: t.Optional[bool] = True, @@ -66,7 +66,7 @@ class PageNumberDecoratorFactory(PaginationDecoratorFactory): ] @classmethod - def _decorate_async(cls, func: t.Callable, schema: t.Type[types.Schema]) -> t.Callable: + def _decorate_async(cls, func: t.Callable, schema: type[types.Schema]) -> t.Callable: @functools.wraps(func) async def decorator( *args, @@ -82,7 +82,7 @@ async def decorator( return decorator @classmethod - def _decorate_sync(cls, func: t.Callable, schema: t.Type[types.Schema]) -> t.Callable: + def _decorate_sync(cls, func: t.Callable, schema: type[types.Schema]) -> t.Callable: @functools.wraps(func) def decorator( *args, @@ -120,7 +120,7 @@ def _paginate_page_number(self, func: t.Callable) -> t.Callable: try: schema_module, schema_class = schema_name.rsplit(".", 1) paginated_schema_name = f"{schema_module}.PageNumberPaginated{schema_class}" - except ValueError: # noqa: safety net + except ValueError: # pragma: no cover paginated_schema_name = f"PageNumberPaginated{schema_name}" schema = schemas.Schema.build( paginated_schema_name, diff --git a/flama/resources/crud.py b/flama/resources/crud.py index 8fd0c1c0..e1be1358 100644 --- a/flama/resources/crud.py +++ b/flama/resources/crud.py @@ -20,7 +20,7 @@ def _add_create( rest_schemas: data_structures.Schemas, rest_model: data_structures.Model, **kwargs, - ) -> t.Dict[str, t.Any]: + ) -> dict[str, t.Any]: @resource_method("/", methods=["POST"], name="create") async def create( self, @@ -71,7 +71,7 @@ def _add_retrieve( rest_schemas: data_structures.Schemas, rest_model: data_structures.Model, **kwargs, - ) -> t.Dict[str, t.Any]: + ) -> dict[str, t.Any]: @resource_method("/{resource_id}/", methods=["GET"], name="retrieve") async def retrieve( self, @@ -113,7 +113,7 @@ def _add_update( rest_schemas: data_structures.Schemas, rest_model: data_structures.Model, **kwargs, - ) -> t.Dict[str, t.Any]: + ) -> dict[str, t.Any]: @resource_method("/{resource_id}/", methods=["PUT"], name="update") async def update( self, @@ -167,7 +167,7 @@ def _add_partial_update( rest_schemas: data_structures.Schemas, rest_model: data_structures.Model, **kwargs, - ) -> t.Dict[str, t.Any]: + ) -> dict[str, t.Any]: @resource_method("/{resource_id}/", methods=["PATCH"], name="partial-update") async def partial_update( self, @@ -213,9 +213,7 @@ async def partial_update( class DeleteMixin: @classmethod - def _add_delete( - cls, name: str, verbose_name: str, rest_model: data_structures.Model, **kwargs - ) -> t.Dict[str, t.Any]: + def _add_delete(cls, name: str, verbose_name: str, rest_model: data_structures.Model, **kwargs) -> dict[str, t.Any]: @resource_method("/{resource_id}/", methods=["DELETE"], name="delete") async def delete(self, worker: FlamaWorker, resource_id: rest_model.primary_key.type): # type: ignore try: @@ -250,7 +248,7 @@ class ListMixin: @classmethod def _add_list( cls, name: str, verbose_name: str, rest_schemas: data_structures.Schemas, **kwargs - ) -> t.Dict[str, t.Any]: + ) -> dict[str, t.Any]: @resource_method("/", methods=["GET"], name="list", pagination="page_number") async def list( self, @@ -290,13 +288,13 @@ def _add_replace( rest_schemas: data_structures.Schemas, rest_model: data_structures.Model, **kwargs, - ) -> t.Dict[str, t.Any]: + ) -> dict[str, t.Any]: @resource_method("/", methods=["PUT"], name="replace") async def replace( self, worker: FlamaWorker, - resources: t.List[types.Schema[rest_schemas.input.schema]], # type: ignore - ) -> t.List[types.Schema[rest_schemas.output.schema]]: # type: ignore + resources: list[types.Schema[rest_schemas.input.schema]], # type: ignore + ) -> list[types.Schema[rest_schemas.output.schema]]: # type: ignore async with worker: repository = worker.repositories[self._meta.name] await repository.drop() @@ -333,13 +331,13 @@ def _add_partial_replace( rest_schemas: data_structures.Schemas, rest_model: data_structures.Model, **kwargs, - ) -> t.Dict[str, t.Any]: + ) -> dict[str, t.Any]: @resource_method("/", methods=["PATCH"], name="partial-replace") async def partial_replace( self, worker: FlamaWorker, - resources: t.List[types.Schema[rest_schemas.input.schema]], # type: ignore - ) -> t.List[types.Schema[rest_schemas.output.schema]]: # type: ignore + resources: list[types.Schema[rest_schemas.input.schema]], # type: ignore + ) -> list[types.Schema[rest_schemas.output.schema]]: # type: ignore async with worker: repository = worker.repositories[self._meta.name] await repository.drop( @@ -373,7 +371,7 @@ async def partial_replace( class DropMixin: @classmethod - def _add_drop(cls, name: str, verbose_name: str, **kwargs) -> t.Dict[str, t.Any]: + def _add_drop(cls, name: str, verbose_name: str, **kwargs) -> dict[str, t.Any]: @resource_method("/", methods=["DELETE"], name="drop") async def drop(self, worker: FlamaWorker) -> types.Schema[schemas.schemas.DropCollection]: # type: ignore async with worker: @@ -415,7 +413,7 @@ class CRUDResourceType( METHODS = ("create", "retrieve", "update", "partial_update", "delete", "list", "replace", "partial_replace", "drop") @staticmethod - def _is_abstract(namespace: t.Dict[str, t.Any]) -> bool: + def _is_abstract(namespace: dict[str, t.Any]) -> bool: return namespace.get("__module__") == "flama.resources.crud" and namespace.get("__qualname__") == "CRUDResource" diff --git a/flama/resources/data_structures.py b/flama/resources/data_structures.py index 1b76f3c7..ee396ec4 100644 --- a/flama/resources/data_structures.py +++ b/flama/resources/data_structures.py @@ -37,9 +37,9 @@ class Schemas: class Metadata: name: str = dataclasses.field(init=False) verbose_name: str = dataclasses.field(init=False) - namespaces: t.Dict[str, t.Dict[str, t.Any]] = dataclasses.field(default_factory=dict) + namespaces: dict[str, dict[str, t.Any]] = dataclasses.field(default_factory=dict) - def to_plain_dict(self) -> t.Dict[str, t.Any]: + def to_plain_dict(self) -> dict[str, t.Any]: return { "name": self.name, "verbose_name": self.verbose_name, @@ -50,6 +50,6 @@ def to_plain_dict(self) -> t.Dict[str, t.Any]: @dataclasses.dataclass class MethodMetadata: path: str - methods: t.Set[str] = dataclasses.field(default_factory=lambda: {"GET"}) + methods: set[str] = dataclasses.field(default_factory=lambda: {"GET"}) name: t.Optional[str] = None - tags: t.Dict[str, t.Any] = dataclasses.field(default_factory=dict) + tags: dict[str, t.Any] = dataclasses.field(default_factory=dict) diff --git a/flama/resources/modules.py b/flama/resources/modules.py index 48c3b703..cfd7b2d4 100644 --- a/flama/resources/modules.py +++ b/flama/resources/modules.py @@ -25,10 +25,10 @@ def __init__(self, worker: t.Optional["FlamaWorker"] = None): def add_resource( self, path: str, - resource: t.Union[Resource, t.Type[Resource]], - tags: t.Optional[t.Dict[str, t.Dict[str, t.Any]]] = None, + resource: t.Union[Resource, type[Resource]], + tags: t.Optional[dict[str, dict[str, t.Any]]] = None, *args, - **kwargs + **kwargs, ) -> "Resource": """Adds a resource to this application, setting its endpoints. @@ -47,9 +47,7 @@ def add_resource( return resource_instance - def resource( - self, path: str, tags: t.Optional[t.Dict[str, t.Dict[str, t.Any]]] = None, *args, **kwargs - ) -> t.Callable: + def resource(self, path: str, tags: t.Optional[dict[str, dict[str, t.Any]]] = None, *args, **kwargs) -> t.Callable: """Decorator for Resources classes for adding them to the application. :param path: Resource base path. @@ -57,7 +55,7 @@ def resource( :return: Decorated resource class. """ - def decorator(resource: t.Type[Resource]) -> t.Type[Resource]: + def decorator(resource: type[Resource]) -> type[Resource]: self.add_resource(path, resource, tags, *args, **kwargs) return resource diff --git a/flama/resources/resource.py b/flama/resources/resource.py index 1fd299be..d178dc26 100644 --- a/flama/resources/resource.py +++ b/flama/resources/resource.py @@ -10,7 +10,7 @@ class ResourceType(type): METHODS: t.Sequence[str] = () - def __new__(mcs, name: str, bases: t.Tuple[type], namespace: t.Dict[str, t.Any]): + def __new__(mcs, name: str, bases: tuple[type], namespace: dict[str, t.Any]): """Resource metaclass for defining basic behavior: * Create _meta attribute containing some metadata (name, verbose name...). * Adds methods related to resource (create, retrieve...) listed in METHODS class attribute. @@ -37,11 +37,11 @@ def __new__(mcs, name: str, bases: t.Tuple[type], namespace: t.Dict[str, t.Any]) return super().__new__(mcs, name, bases, namespace) @staticmethod - def _is_abstract(namespace: t.Dict[str, t.Any]) -> bool: + def _is_abstract(namespace: dict[str, t.Any]) -> bool: return namespace.get("__module__") == "flama.resources.resource" and namespace.get("__qualname__") == "Resource" @classmethod - def _get_mro(cls, *classes: type) -> t.List[t.Type]: + def _get_mro(cls, *classes: type) -> list[type]: """Generate the MRO list for given base class or list of base classes. :param classes: Base classes. @@ -56,7 +56,7 @@ def _get_attribute( cls, attribute: str, bases: t.Sequence[t.Any], - namespace: t.Dict[str, t.Any], + namespace: dict[str, t.Any], metadata_namespace: t.Optional[str] = None, ) -> t.Any: """Look for an attribute given his name on namespace or parent classes namespace. @@ -83,7 +83,7 @@ def _get_attribute( raise AttributeError(ResourceAttributeError.ATTRIBUTE_NOT_FOUND.format(attribute=attribute)) @classmethod - def _get_resource_name(cls, name: str, namespace: t.Dict[str, t.Any]) -> t.Tuple[str, str]: + def _get_resource_name(cls, name: str, namespace: dict[str, t.Any]) -> tuple[str, str]: """Look for a resource name in namespace and check it's a valid name. :param name: Class name. @@ -99,7 +99,7 @@ def _get_resource_name(cls, name: str, namespace: t.Dict[str, t.Any]) -> t.Tuple return resource_name, namespace.pop("verbose_name", resource_name) @classmethod - def _build_routes(cls, namespace: t.Dict[str, t.Any]) -> t.Dict[str, t.Callable]: + def _build_routes(cls, namespace: dict[str, t.Any]) -> dict[str, t.Callable]: """Builds the routes' descriptor. :param namespace: Variables namespace used to create the class. @@ -111,7 +111,7 @@ def _build_routes(cls, namespace: t.Dict[str, t.Any]) -> t.Dict[str, t.Callable] } @classmethod - def _build_methods(cls, namespace: t.Dict[str, t.Any]) -> t.Dict[str, t.Callable]: + def _build_methods(cls, namespace: dict[str, t.Any]) -> dict[str, t.Callable]: """Builds a namespace containing all resource methods. Look for all methods listed in METHODS attribute and named '_add_[method]'. diff --git a/flama/resources/rest.py b/flama/resources/rest.py index 65fbd0f2..7f928e8b 100644 --- a/flama/resources/rest.py +++ b/flama/resources/rest.py @@ -15,7 +15,7 @@ __all__ = ["RESTResource", "RESTResourceType"] -PK_MAPPING: t.Dict[t.Any, t.Any] = { +PK_MAPPING: dict[t.Any, t.Any] = { sqlalchemy.Integer: int, sqlalchemy.String: str, sqlalchemy.Date: datetime.date, @@ -25,7 +25,7 @@ class RESTResourceType(ResourceType): - def __new__(mcs, name: str, bases: t.Tuple[type], namespace: t.Dict[str, t.Any]): + def __new__(mcs, name: str, bases: tuple[type], namespace: dict[str, t.Any]): """Resource metaclass for defining basic behavior for REST resources: * Create _meta attribute containing some metadata (model, schemas...). * Adds methods related to REST resource (create, retrieve, update, delete...) listed in METHODS class attribute. @@ -58,11 +58,11 @@ def __new__(mcs, name: str, bases: t.Tuple[type], namespace: t.Dict[str, t.Any]) return super().__new__(mcs, name, bases, namespace) @staticmethod - def _is_abstract(namespace: t.Dict[str, t.Any]) -> bool: + def _is_abstract(namespace: dict[str, t.Any]) -> bool: return namespace.get("__module__") == "flama.resources.rest" and namespace.get("__qualname__") == "RESTResource" @classmethod - def _get_model(cls, bases: t.Sequence[t.Any], namespace: t.Dict[str, t.Any]) -> data_structures.Model: + def _get_model(cls, bases: t.Sequence[t.Any], namespace: dict[str, t.Any]) -> data_structures.Model: """Look for the resource model and checks if a primary key is defined with a valid type. :param bases: List of superclasses. @@ -100,9 +100,7 @@ def _get_model(cls, bases: t.Sequence[t.Any], namespace: t.Dict[str, t.Any]) -> raise AttributeError(ResourceAttributeError.MODEL_INVALID) @classmethod - def _get_schemas( - cls, name: str, bases: t.Sequence[t.Any], namespace: t.Dict[str, t.Any] - ) -> data_structures.Schemas: + def _get_schemas(cls, name: str, bases: t.Sequence[t.Any], namespace: dict[str, t.Any]) -> data_structures.Schemas: """Look for the resource schema or the pair of input and output schemas. :param name: Class name. diff --git a/flama/resources/routing.py b/flama/resources/routing.py index ba90c7fc..0d51c35d 100644 --- a/flama/resources/routing.py +++ b/flama/resources/routing.py @@ -17,8 +17,8 @@ class ResourceRoute(Mount): def __init__( self, path: str, - resource: t.Union["Resource", t.Type["Resource"]], - tags: t.Optional[t.Dict[str, t.Dict[str, t.Any]]] = None, + resource: t.Union["Resource", type["Resource"]], + tags: t.Optional[dict[str, dict[str, t.Any]]] = None, ): tags = tags or {} @@ -65,7 +65,7 @@ def resource_method( name: t.Optional[str] = None, *, pagination: t.Optional[t.Union[str, "PaginationType"]] = None, - tags: t.Optional[t.Dict[str, t.Any]] = None, + tags: t.Optional[dict[str, t.Any]] = None, ) -> t.Callable: """Decorator for adding useful info needed for generating resource routes. diff --git a/flama/resources/workers.py b/flama/resources/workers.py index 26761ba6..e53a7b33 100644 --- a/flama/resources/workers.py +++ b/flama/resources/workers.py @@ -20,11 +20,11 @@ def __init__(self, app: t.Optional["Flama"] = None): """ super().__init__(app) - self._repositories: t.Dict[str, t.Type["SQLAlchemyTableRepository"]] = {} # type: ignore - self._init_repositories: t.Optional[t.Dict[str, "SQLAlchemyTableRepository"]] = None + self._repositories: dict[str, type["SQLAlchemyTableRepository"]] = {} # type: ignore + self._init_repositories: t.Optional[dict[str, "SQLAlchemyTableRepository"]] = None @property - def repositories(self) -> t.Dict[str, "SQLAlchemyTableRepository"]: + def repositories(self) -> dict[str, "SQLAlchemyTableRepository"]: """Get the initialized repositories. :retirns: The initialized repositories. diff --git a/flama/routing.py b/flama/routing.py index 15fa5def..c042bc36 100644 --- a/flama/routing.py +++ b/flama/routing.py @@ -1,4 +1,5 @@ import abc +import builtins import enum import functools import inspect @@ -51,7 +52,7 @@ class EndpointWrapper: def __init__( self, - handler: t.Union[t.Callable, t.Type[endpoints.HTTPEndpoint], t.Type[endpoints.WebSocketEndpoint]], + handler: t.Union[t.Callable, builtins.type[endpoints.HTTPEndpoint], builtins.type[endpoints.WebSocketEndpoint]], endpoint_type: _EndpointType, pagination: t.Optional[t.Union[str, "PaginationType"]] = None, ): @@ -66,7 +67,7 @@ def __init__( self.handler = handler functools.update_wrapper(self, handler) - decorator_select: t.Dict[t.Tuple[_EndpointType, bool], types.App] = { + decorator_select: dict[tuple[_EndpointType, bool], types.App] = { (self.type.http, False): self._http_function, (self.type.http, True): self._http_endpoint, (self.type.websocket, False): self._websocket_function, @@ -202,7 +203,7 @@ def __init__( *, name: t.Optional[str] = None, include_in_schema: bool = True, - tags: t.Optional[t.Dict[str, t.Any]] = None, + tags: t.Optional[dict[str, t.Any]] = None, ): """A route definition of a http endpoint. @@ -245,7 +246,7 @@ def build(self, app: t.Optional["Flama"] = None) -> None: if app: self.parameters.build(app) - def endpoint_handlers(self) -> t.Dict[str, t.Callable]: + def endpoint_handlers(self) -> dict[str, t.Callable]: """Return a mapping of all possible endpoints of this route. Useful to identify all endpoints by HTTP methods. @@ -307,13 +308,13 @@ class Route(BaseRoute): def __init__( self, path: str, - endpoint: t.Union[t.Callable, t.Type[endpoints.HTTPEndpoint]], + endpoint: t.Union[t.Callable, type[endpoints.HTTPEndpoint]], *, - methods: t.Optional[t.Union[t.Set[str], t.Sequence[str]]] = None, + methods: t.Optional[t.Union[set[str], t.Sequence[str]]] = None, name: t.Optional[str] = None, include_in_schema: bool = True, pagination: t.Optional[t.Union[str, "PaginationType"]] = None, - tags: t.Optional[t.Dict[str, t.Any]] = None, + tags: t.Optional[dict[str, t.Any]] = None, ) -> None: """A route definition of a http endpoint. @@ -361,13 +362,11 @@ def __repr__(self) -> str: @staticmethod def is_endpoint( - x: t.Union[t.Callable, t.Type[endpoints.HTTPEndpoint]] - ) -> t.TypeGuard[ # type: ignore # PORT: Remove this comment when stop supporting 3.9 - t.Type[endpoints.HTTPEndpoint] - ]: + x: t.Union[t.Callable, type[endpoints.HTTPEndpoint]] + ) -> t.TypeGuard[type[endpoints.HTTPEndpoint]]: # type: ignore # PORT: Remove this comment when stop supporting 3.9 return inspect.isclass(x) and issubclass(x, endpoints.HTTPEndpoint) - def endpoint_handlers(self) -> t.Dict[str, t.Callable]: + def endpoint_handlers(self) -> dict[str, t.Callable]: """Return a mapping of all possible endpoints of this route. Useful to identify all endpoints by HTTP methods. @@ -403,12 +402,12 @@ class WebSocketRoute(BaseRoute): def __init__( self, path: str, - endpoint: t.Union[t.Callable, t.Type[endpoints.WebSocketEndpoint]], + endpoint: t.Union[t.Callable, type[endpoints.WebSocketEndpoint]], *, name: t.Optional[str] = None, include_in_schema: bool = True, pagination: t.Optional[t.Union[str, "PaginationType"]] = None, - tags: t.Optional[t.Dict[str, t.Any]] = None, + tags: t.Optional[dict[str, t.Any]] = None, ): """A route definition of a websocket endpoint. @@ -445,13 +444,13 @@ def __eq__(self, other: t.Any) -> bool: @staticmethod def is_endpoint( - x: t.Union[t.Callable, t.Type[endpoints.WebSocketEndpoint]] + x: t.Union[t.Callable, type[endpoints.WebSocketEndpoint]] ) -> t.TypeGuard[ # type: ignore # PORT: Remove this comment when stop supporting 3.9 - t.Type[endpoints.WebSocketEndpoint] + type[endpoints.WebSocketEndpoint] ]: return inspect.isclass(x) and issubclass(x, endpoints.WebSocketEndpoint) - def endpoint_handlers(self) -> t.Dict[str, t.Callable]: + def endpoint_handlers(self) -> dict[str, t.Callable]: """Return a mapping of all possible endpoints of this route. Useful to identify all endpoints by HTTP methods. @@ -484,7 +483,7 @@ def __init__( routes: t.Optional[t.Sequence[BaseRoute]] = None, components: t.Optional[t.Sequence[Component]] = None, name: t.Optional[str] = None, - tags: t.Optional[t.Dict[str, t.Any]] = None, + tags: t.Optional[dict[str, t.Any]] = None, ): """A mount point for adding a nested ASGI application or a list of routes. @@ -602,7 +601,7 @@ def resolve_url(self, name: str, **params: t.Any) -> url.URL: raise exceptions.NotFoundException(params=params, name=name) @property - def routes(self) -> t.List[BaseRoute]: + def routes(self) -> list[BaseRoute]: """Get all routes registered in this Mount. :return: List of routes. @@ -615,7 +614,7 @@ def __init__( self, routes: t.Optional[t.Sequence[BaseRoute]] = None, *, - components: t.Optional[t.Union[t.Sequence["Component"], t.Set["Component"]]] = None, + components: t.Optional[t.Union[t.Sequence["Component"], set["Component"]]] = None, lifespan: t.Optional[t.Callable[[t.Optional["Flama"]], t.AsyncContextManager]] = None, root: t.Optional["Flama"] = None, ): @@ -671,14 +670,14 @@ def add_route( self, path: t.Optional[str] = None, endpoint: t.Optional[types.HTTPHandler] = None, - methods: t.Optional[t.List[str]] = None, + methods: t.Optional[list[str]] = None, name: t.Optional[str] = None, include_in_schema: bool = True, *, route: t.Optional[Route] = None, root: t.Optional["Flama"] = None, pagination: t.Optional[t.Union[str, "PaginationType"]] = None, - tags: t.Optional[t.Dict[str, t.Any]] = None, + tags: t.Optional[dict[str, t.Any]] = None, ) -> Route: """Register a new HTTP route in this router under given path. @@ -715,13 +714,13 @@ def add_route( def route( self, path: str, - methods: t.Optional[t.List[str]] = None, + methods: t.Optional[list[str]] = None, name: t.Optional[str] = None, include_in_schema: bool = True, *, root: t.Optional["Flama"] = None, pagination: t.Optional[t.Union[str, "PaginationType"]] = None, - tags: t.Optional[t.Dict[str, t.Any]] = None, + tags: t.Optional[dict[str, t.Any]] = None, ) -> t.Callable[[types.HTTPHandler], types.HTTPHandler]: """Decorator version for registering a new HTTP route in this router under given path. @@ -759,7 +758,7 @@ def add_websocket_route( route: t.Optional[WebSocketRoute] = None, root: t.Optional["Flama"] = None, pagination: t.Optional[t.Union[str, "PaginationType"]] = None, - tags: t.Optional[t.Dict[str, t.Any]] = None, + tags: t.Optional[dict[str, t.Any]] = None, ) -> WebSocketRoute: """Register a new websocket route in this router under given path. @@ -790,7 +789,7 @@ def websocket_route( *, root: t.Optional["Flama"] = None, pagination: t.Optional[t.Union[str, "PaginationType"]] = None, - tags: t.Optional[t.Dict[str, t.Any]] = None, + tags: t.Optional[dict[str, t.Any]] = None, ) -> t.Callable[[types.WebSocketHandler], types.WebSocketHandler]: """Decorator version for registering a new websocket route in this router under given path. @@ -816,7 +815,7 @@ def mount( *, mount: t.Optional[Mount] = None, root: t.Optional["Flama"] = None, - tags: t.Optional[t.Dict[str, t.Any]] = None, + tags: t.Optional[dict[str, t.Any]] = None, ) -> Mount: """Register a new mount point containing an ASGI app in this router under given path. @@ -839,14 +838,14 @@ def mount( return mount - def resolve_route(self, scope: types.Scope) -> t.Tuple[BaseRoute, types.Scope]: + def resolve_route(self, scope: types.Scope) -> tuple[BaseRoute, types.Scope]: """Look for a route that matches given ASGI scope. :param scope: ASGI scope. :return: Route and its scope. """ partial = None - partial_allowed_methods: t.Set[str] = set() + partial_allowed_methods: set[str] = set() for route in self.routes: m = route.match(scope) diff --git a/flama/schemas/__init__.py b/flama/schemas/__init__.py index a24adbab..b126eed8 100644 --- a/flama/schemas/__init__.py +++ b/flama/schemas/__init__.py @@ -21,7 +21,7 @@ ] adapter: "Adapter" -fields: t.Dict[t.Any, "Parameter"] = {} +fields: dict[t.Any, "Parameter"] = {} lib: t.Optional[ModuleType] = None schemas: t.Any = None @@ -33,7 +33,7 @@ def __init__(self) -> None: self.lib: ModuleType @property - def installed(self) -> t.List[str]: + def installed(self) -> list[str]: return [x for x in self.SCHEMA_LIBS if x in sys.modules or importlib.util.find_spec(x) is not None] @property diff --git a/flama/schemas/_libs/marshmallow/adapter.py b/flama/schemas/_libs/marshmallow/adapter.py index a32ac08b..4f92c823 100644 --- a/flama/schemas/_libs/marshmallow/adapter.py +++ b/flama/schemas/_libs/marshmallow/adapter.py @@ -31,7 +31,7 @@ class MarshmallowAdapter(Adapter[Schema, Field]): def build_field( self, name: str, - type_: t.Type, + type_: type, nullable: bool = False, required: bool = True, default: t.Any = None, @@ -59,10 +59,10 @@ def build_schema( self, *, name: t.Optional[str] = None, - schema: t.Optional[t.Union[Schema, t.Type[Schema]]] = None, - fields: t.Optional[t.Dict[str, Field]] = None, + schema: t.Optional[t.Union[Schema, type[Schema]]] = None, + fields: t.Optional[dict[str, Field]] = None, partial: bool = False, - ) -> t.Type[Schema]: + ) -> type[Schema]: fields_ = {**(self.unique_schema(schema)().fields if schema else {}), **(fields or {})} if partial: @@ -73,22 +73,22 @@ def build_schema( return Schema.from_dict(fields=fields_, name=name or self.DEFAULT_SCHEMA_NAME) # type: ignore def validate( - self, schema: t.Union[t.Type[Schema], Schema], values: t.Dict[str, t.Any], *, partial: bool = False - ) -> t.Dict[str, t.Any]: + self, schema: t.Union[type[Schema], Schema], values: dict[str, t.Any], *, partial: bool = False + ) -> dict[str, t.Any]: try: return t.cast( - t.Dict[str, t.Any], + dict[str, t.Any], self._schema_instance(schema).load(values, unknown=marshmallow.EXCLUDE, partial=partial), ) except marshmallow.ValidationError as exc: raise SchemaValidationError(errors=exc.normalized_messages()) - def load(self, schema: t.Union[t.Type[Schema], Schema], value: t.Dict[str, t.Any]) -> Schema: + def load(self, schema: t.Union[type[Schema], Schema], value: dict[str, t.Any]) -> Schema: return t.cast(Schema, self._schema_instance(schema).load(value)) - def dump(self, schema: t.Union[t.Type[Schema], Schema], value: t.Dict[str, t.Any]) -> t.Dict[str, t.Any]: + def dump(self, schema: t.Union[type[Schema], Schema], value: dict[str, t.Any]) -> dict[str, t.Any]: try: - dump_value = t.cast(t.Dict[str, t.Any], self._schema_instance(schema).dump(value)) + dump_value = t.cast(dict[str, t.Any], self._schema_instance(schema).dump(value)) except Exception as exc: raise SchemaValidationError(errors=str(exc)) @@ -96,13 +96,13 @@ def dump(self, schema: t.Union[t.Type[Schema], Schema], value: t.Dict[str, t.Any return dump_value - def name(self, schema: t.Union[Schema, t.Type[Schema]], *, prefix: t.Optional[str] = None) -> str: + def name(self, schema: t.Union[Schema, type[Schema]], *, prefix: t.Optional[str] = None) -> str: s = self.unique_schema(schema) schema_name = f"{prefix or ''}{s.__qualname__}" return schema_name if s.__module__ == "builtins" else f"{s.__module__}.{schema_name}" - def to_json_schema(self, schema: t.Union[t.Type[Schema], t.Type[Field], Schema, Field]) -> JSONSchema: - json_schema: t.Dict[str, t.Any] + def to_json_schema(self, schema: t.Union[type[Schema], type[Field], Schema, Field]) -> JSONSchema: + json_schema: dict[str, t.Any] try: plugin = MarshmallowPlugin(schema_name_resolver=lambda x: t.cast(type, resolve_schema_cls(x)).__name__) APISpec("", "", "3.1.0", [plugin]) @@ -133,7 +133,7 @@ def to_json_schema(self, schema: t.Union[t.Type[Schema], t.Type[Field], Schema, return json_schema - def unique_schema(self, schema: t.Union[Schema, t.Type[Schema]]) -> t.Type[Schema]: + def unique_schema(self, schema: t.Union[Schema, type[Schema]]) -> type[Schema]: if isinstance(schema, Schema): return schema.__class__ @@ -155,19 +155,19 @@ def _get_field_type(self, field: Field) -> t.Any: return None def schema_fields( - self, schema: t.Union[Schema, t.Type[Schema]] - ) -> t.Dict[str, t.Tuple[t.Union[None, t.Type, Schema], Field]]: + self, schema: t.Union[Schema, type[Schema]] + ) -> dict[str, tuple[t.Union[None, type, Schema], Field]]: return { name: (self._get_field_type(field), field) for name, field in self._schema_instance(schema).fields.items() } - def is_schema(self, obj: t.Any) -> t.TypeGuard[t.Union[Schema, t.Type[Schema]]]: # type: ignore + def is_schema(self, obj: t.Any) -> t.TypeGuard[t.Union[Schema, type[Schema]]]: # type: ignore return isinstance(obj, Schema) or (inspect.isclass(obj) and issubclass(obj, Schema)) - def is_field(self, obj: t.Any) -> t.TypeGuard[t.Union[Field, t.Type[Field]]]: # type: ignore + def is_field(self, obj: t.Any) -> t.TypeGuard[t.Union[Field, type[Field]]]: # type: ignore return isinstance(obj, Field) or (inspect.isclass(obj) and issubclass(obj, Field)) - def _schema_instance(self, schema: t.Union[t.Type[Schema], Schema]) -> Schema: + def _schema_instance(self, schema: t.Union[type[Schema], Schema]) -> Schema: if inspect.isclass(schema) and issubclass(schema, Schema): return schema() elif isinstance(schema, Schema): diff --git a/flama/schemas/_libs/pydantic/adapter.py b/flama/schemas/_libs/pydantic/adapter.py index 7f7bc6af..f3b575e6 100644 --- a/flama/schemas/_libs/pydantic/adapter.py +++ b/flama/schemas/_libs/pydantic/adapter.py @@ -26,7 +26,7 @@ class PydanticAdapter(Adapter[Schema, Field]): def build_field( self, name: str, - type_: t.Type, + type_: type, nullable: bool = False, required: bool = True, default: t.Any = None, @@ -39,7 +39,7 @@ def build_field( annotation: t.Any = type_ if multiple: - annotation = t.List[annotation] + annotation = list[annotation] if nullable: annotation = t.Optional[annotation] @@ -55,10 +55,10 @@ def build_schema( self, *, name: t.Optional[str] = None, - schema: t.Optional[t.Union[Schema, t.Type[Schema]]] = None, - fields: t.Optional[t.Dict[str, t.Type[Field]]] = None, + schema: t.Optional[t.Union[Schema, type[Schema]]] = None, + fields: t.Optional[dict[str, type[Field]]] = None, partial: bool = False, - ) -> t.Type[Schema]: + ) -> type[Schema]: fields_ = { **{ name: (field.annotation, field) @@ -75,8 +75,8 @@ def build_schema( return pydantic.create_model(name or self.DEFAULT_SCHEMA_NAME, **fields_) def validate( - self, schema: t.Union[Schema, t.Type[Schema]], values: t.Dict[str, t.Any], *, partial: bool = False - ) -> t.Dict[str, t.Any]: + self, schema: t.Union[Schema, type[Schema]], values: dict[str, t.Any], *, partial: bool = False + ) -> dict[str, t.Any]: schema_cls = self.unique_schema(schema) try: @@ -84,22 +84,22 @@ def validate( except pydantic.ValidationError as errors: raise SchemaValidationError(errors={str(error["loc"][0]): error for error in errors.errors()}) - def load(self, schema: t.Union[Schema, t.Type[Schema]], value: t.Dict[str, t.Any]) -> Schema: + def load(self, schema: t.Union[Schema, type[Schema]], value: dict[str, t.Any]) -> Schema: schema_cls = self.unique_schema(schema) return schema_cls(**value) - def dump(self, schema: t.Union[Schema, t.Type[Schema]], value: t.Dict[str, t.Any]) -> t.Dict[str, t.Any]: + def dump(self, schema: t.Union[Schema, type[Schema]], value: dict[str, t.Any]) -> dict[str, t.Any]: schema_cls = self.unique_schema(schema) return self.validate(schema_cls, value) - def name(self, schema: t.Union[Schema, t.Type[Schema]], *, prefix: t.Optional[str] = None) -> str: + def name(self, schema: t.Union[Schema, type[Schema]], *, prefix: t.Optional[str] = None) -> str: s = self.unique_schema(schema) schema_name = f"{prefix or ''}{s.__qualname__}" return schema_name if s.__module__ == "builtins" else f"{s.__module__}.{schema_name}" - def to_json_schema(self, schema: t.Union[t.Type[Schema], t.Type[Field]]) -> JSONSchema: + def to_json_schema(self, schema: t.Union[type[Schema], type[Field]]) -> JSONSchema: try: if self.is_schema(schema): json_schema = model_json_schema(schema, ref_template="#/components/schemas/{model}") @@ -118,7 +118,7 @@ def to_json_schema(self, schema: t.Union[t.Type[Schema], t.Type[Field]]) -> JSON except Exception as e: raise SchemaGenerationError from e - def unique_schema(self, schema: t.Union[Schema, t.Type[Schema]]) -> t.Type[Schema]: + def unique_schema(self, schema: t.Union[Schema, type[Schema]]) -> type[Schema]: return schema.__class__ if isinstance(schema, Schema) else schema def _get_field_type(self, field: Field) -> t.Any: @@ -134,16 +134,16 @@ def _get_field_type(self, field: Field) -> t.Any: return field.annotation def schema_fields( - self, schema: t.Type[Schema] - ) -> t.Dict[str, t.Tuple[t.Union[t.Type, t.List[t.Type], t.Dict[str, t.Type]], Field]]: + self, schema: type[Schema] + ) -> dict[str, tuple[t.Union[type, list[type], dict[str, type]], Field]]: return {name: (self._get_field_type(field), field) for name, field in schema.model_fields.items()} def is_schema( self, obj: t.Any - ) -> t.TypeGuard[t.Type[Schema]]: # type: ignore # PORT: Remove this comment when stop supporting 3.9 + ) -> t.TypeGuard[type[Schema]]: # type: ignore # PORT: Remove this comment when stop supporting 3.9 return inspect.isclass(obj) and issubclass(obj, Schema) def is_field( self, obj: t.Any - ) -> t.TypeGuard[t.Type[Field]]: # type: ignore # PORT: Remove this comment when stop supporting 3.9 + ) -> t.TypeGuard[type[Field]]: # type: ignore # PORT: Remove this comment when stop supporting 3.9 return isinstance(obj, Field) diff --git a/flama/schemas/_libs/pydantic/schemas.py b/flama/schemas/_libs/pydantic/schemas.py index e96c5506..83679bb7 100644 --- a/flama/schemas/_libs/pydantic/schemas.py +++ b/flama/schemas/_libs/pydantic/schemas.py @@ -17,7 +17,7 @@ class APIError(BaseModel): status_code: int = Field(title="status_code", description="HTTP status code") - detail: t.Union[str, t.Dict[str, t.Any]] = Field(title="detail", description="Error detail") + detail: t.Union[str, dict[str, t.Any]] = Field(title="detail", description="Error detail") error: t.Optional[str] = Field(title="type", description="Exception or error type") @@ -33,7 +33,7 @@ class LimitOffsetMeta(BaseModel): class LimitOffset(BaseModel): meta: LimitOffsetMeta = Field(title="meta", description="Pagination metadata") - data: t.List[t.Any] = Field(title="data", description="Paginated data") + data: list[t.Any] = Field(title="data", description="Paginated data") class PageNumberMeta(BaseModel): @@ -44,15 +44,15 @@ class PageNumberMeta(BaseModel): class PageNumber(BaseModel): meta: PageNumberMeta = Field(title="meta", description="Pagination metadata") - data: t.List[t.Any] = Field(title="data", description="Paginated data") + data: list[t.Any] = Field(title="data", description="Paginated data") class MLModelInput(BaseModel): - input: t.List[t.Any] = Field(title="input", description="Model input") + input: list[t.Any] = Field(title="input", description="Model input") class MLModelOutput(BaseModel): - output: t.List[t.Any] = Field(title="output", description="Model output") + output: list[t.Any] = Field(title="output", description="Model output") SCHEMAS = { diff --git a/flama/schemas/_libs/typesystem/adapter.py b/flama/schemas/_libs/typesystem/adapter.py index 4912cd94..104a7f39 100644 --- a/flama/schemas/_libs/typesystem/adapter.py +++ b/flama/schemas/_libs/typesystem/adapter.py @@ -27,7 +27,7 @@ class TypesystemAdapter(Adapter[Schema, Field]): def build_field( self, name: str, - type_: t.Type, + type_: type, nullable: bool = False, required: bool = True, default: t.Any = None, @@ -55,8 +55,8 @@ def build_schema( # type: ignore[return-value] self, *, name: t.Optional[str] = None, - schema: t.Optional[t.Union[Schema, t.Type[Schema]]] = None, - fields: t.Optional[t.Dict[str, Field]] = None, + schema: t.Optional[t.Union[Schema, type[Schema]]] = None, + fields: t.Optional[dict[str, Field]] = None, partial: bool = False, ) -> Schema: fields_ = {**(self.unique_schema(schema).fields if self.is_schema(schema) else {}), **(fields or {})} @@ -68,7 +68,7 @@ def build_schema( # type: ignore[return-value] return Schema(title=name or self.DEFAULT_SCHEMA_NAME, fields=fields_) - def validate(self, schema: Schema, values: t.Dict[str, t.Any], *, partial: bool = False) -> t.Any: + def validate(self, schema: Schema, values: dict[str, t.Any], *, partial: bool = False) -> t.Any: try: if partial: warnings.warn("Typesystem does not support partial validation") @@ -77,10 +77,10 @@ def validate(self, schema: Schema, values: t.Dict[str, t.Any], *, partial: bool except typesystem.ValidationError as errors: raise SchemaValidationError(errors={k: [v] for k, v in errors.items()}) - def load(self, schema: Schema, value: t.Dict[str, t.Any]) -> t.Any: + def load(self, schema: Schema, value: dict[str, t.Any]) -> t.Any: return schema.validate(value) - def dump(self, schema: Schema, value: t.Dict[str, t.Any]) -> t.Any: + def dump(self, schema: Schema, value: dict[str, t.Any]) -> t.Any: return self._dump(self.validate(schema, value)) def _dump(self, value: t.Any) -> t.Any: @@ -141,10 +141,10 @@ def _get_field_type(self, field: Field) -> t.Any: def schema_fields( self, schema: Schema - ) -> t.Dict[ + ) -> dict[ str, - t.Tuple[ - t.Union[t.Union[Schema, t.Type], t.List[t.Union[Schema, t.Type]], t.Dict[str, t.Union[Schema, t.Type]]], + tuple[ + t.Union[t.Union[Schema, type], list[t.Union[Schema, type]], dict[str, t.Union[Schema, type]]], Field, ], ]: diff --git a/flama/schemas/adapter.py b/flama/schemas/adapter.py index 80be8444..bf03b77d 100644 --- a/flama/schemas/adapter.py +++ b/flama/schemas/adapter.py @@ -18,7 +18,7 @@ class Adapter(t.Generic[_T_Schema, _T_Field], metaclass=abc.ABCMeta): def build_field( self, name: str, - type_: t.Type, + type_: type, nullable: bool = False, required: bool = True, default: t.Any = None, @@ -29,7 +29,7 @@ def build_field( @t.overload @abc.abstractmethod - def build_schema(self, *, name: t.Optional[str] = None, fields: t.Dict[str, t.Any]) -> t.Any: + def build_schema(self, *, name: t.Optional[str] = None, fields: dict[str, t.Any]) -> t.Any: ... @t.overload @@ -45,7 +45,7 @@ def build_schema(self, *, name: t.Optional[str] = None, schema: t.Any, partial: @t.overload @abc.abstractmethod def build_schema( - self, *, name: t.Optional[str] = None, schema: t.Any, fields: t.Optional[t.Dict[str, t.Any]] + self, *, name: t.Optional[str] = None, schema: t.Any, fields: t.Optional[dict[str, t.Any]] ) -> t.Any: ... @@ -55,21 +55,21 @@ def build_schema( *, name: t.Optional[str] = None, schema: t.Optional[t.Any] = None, - fields: t.Optional[t.Dict[str, t.Any]] = None, + fields: t.Optional[dict[str, t.Any]] = None, partial: bool = False, ) -> t.Any: ... @abc.abstractmethod - def validate(self, schema: t.Any, values: t.Dict[str, t.Any], *, partial: bool = False) -> t.Dict[str, t.Any]: + def validate(self, schema: t.Any, values: dict[str, t.Any], *, partial: bool = False) -> dict[str, t.Any]: ... @abc.abstractmethod - def load(self, schema: t.Any, value: t.Dict[str, t.Any]) -> _T_Schema: + def load(self, schema: t.Any, value: dict[str, t.Any]) -> _T_Schema: ... @abc.abstractmethod - def dump(self, schema: t.Any, value: t.Dict[str, t.Any]) -> t.Dict[str, t.Any]: + def dump(self, schema: t.Any, value: dict[str, t.Any]) -> dict[str, t.Any]: ... @t.overload @@ -95,7 +95,7 @@ def unique_schema(self, schema: t.Any) -> t.Any: ... @abc.abstractmethod - def schema_fields(self, schema: t.Any) -> t.Dict[str, t.Any]: + def schema_fields(self, schema: t.Any) -> dict[str, t.Any]: ... @abc.abstractmethod diff --git a/flama/schemas/data_structures.py b/flama/schemas/data_structures.py index e3df8851..fc02c500 100644 --- a/flama/schemas/data_structures.py +++ b/flama/schemas/data_structures.py @@ -1,3 +1,4 @@ +import builtins import dataclasses import enum import sys @@ -39,7 +40,7 @@ class ParameterLocation(enum.StrEnum): # type: ignore # PORT: Remove this comme @dataclasses.dataclass(frozen=True) class Field: name: str - type: t.Type + type: type nullable: bool = dataclasses.field(init=False) field: t.Any = dataclasses.field(hash=False, init=False, compare=False) multiple: t.Optional[bool] = dataclasses.field(hash=False, compare=False, default=None) @@ -83,7 +84,7 @@ def is_field(cls, obj: t.Any) -> bool: return schemas.adapter.is_field(obj) @classmethod - def is_http_valid_type(cls, type_: t.Type) -> bool: + def is_http_valid_type(cls, type_: builtins.type) -> bool: origin = t.get_origin(type_) args = t.get_args(type_) NoneType = type(None) @@ -104,7 +105,7 @@ class Schema: schema: t.Any = dataclasses.field(hash=False, compare=False) @classmethod - def from_type(cls, type_: t.Optional[t.Type]) -> "Schema": + def from_type(cls, type_: t.Optional[type]) -> "Schema": if types.Schema.is_schema(type_): schema = ( type_.schema @@ -130,7 +131,7 @@ def build( cls, name: t.Optional[str] = None, schema: t.Any = None, - fields: t.Optional[t.List[Field]] = None, + fields: t.Optional[list[Field]] = None, ) -> "Schema": return cls( schema=schemas.adapter.build_schema( @@ -146,14 +147,14 @@ def is_schema(cls, obj: t.Any) -> bool: def name(self) -> str: return schemas.adapter.name(self.schema) - def _fix_ref(self, value: str, refs: t.Dict[str, str]) -> str: + def _fix_ref(self, value: str, refs: dict[str, str]) -> str: try: prefix, name = value.rsplit("/", 1) return f"{prefix}/{refs[name]}" except KeyError: return value - def _replace_json_schema_refs(self, schema: types.JSONField, refs: t.Dict[str, str]) -> types.JSONField: + def _replace_json_schema_refs(self, schema: types.JSONField, refs: dict[str, str]) -> types.JSONField: if isinstance(schema, dict): return { k: self._fix_ref(t.cast(str, v), refs) if k == "$ref" else self._replace_json_schema_refs(v, refs) @@ -165,7 +166,7 @@ def _replace_json_schema_refs(self, schema: types.JSONField, refs: t.Dict[str, s return schema - def json_schema(self, names: t.Dict[int, str]) -> types.JSONSchema: + def json_schema(self, names: dict[int, str]) -> types.JSONSchema: return t.cast( types.JSONSchema, self._replace_json_schema_refs( @@ -179,10 +180,10 @@ def unique_schema(self) -> t.Any: return schemas.adapter.unique_schema(self.schema) @property - def fields(self) -> t.Dict[str, t.Tuple[t.Any, t.Any]]: + def fields(self) -> dict[str, tuple[t.Any, t.Any]]: return schemas.adapter.schema_fields(self.unique_schema) - def nested_schemas(self, schema: t.Any = UNKNOWN) -> t.List[t.Any]: + def nested_schemas(self, schema: t.Any = UNKNOWN) -> list[t.Any]: if schema == UNKNOWN: return self.nested_schemas(self) @@ -204,29 +205,29 @@ def nested_schemas(self, schema: t.Any = UNKNOWN) -> t.List[t.Any]: return [] @t.overload - def validate(self, values: None, *, partial: bool = False) -> t.Dict[str, t.Any]: + def validate(self, values: None, *, partial: bool = False) -> dict[str, t.Any]: ... @t.overload - def validate(self, values: t.Dict[str, t.Any], *, partial: bool = False) -> t.Dict[str, t.Any]: + def validate(self, values: dict[str, t.Any], *, partial: bool = False) -> dict[str, t.Any]: ... @t.overload - def validate(self, values: t.List[t.Dict[str, t.Any]], *, partial: bool = False) -> t.List[t.Dict[str, t.Any]]: + def validate(self, values: list[dict[str, t.Any]], *, partial: bool = False) -> list[dict[str, t.Any]]: ... - def validate(self, values: t.Union[t.Dict[str, t.Any], t.List[t.Dict[str, t.Any]], None], *, partial=False): + def validate(self, values: t.Union[dict[str, t.Any], list[dict[str, t.Any]], None], *, partial=False): if isinstance(values, (list, tuple)): return [schemas.adapter.validate(self.schema, value, partial=partial) for value in values] return schemas.adapter.validate(self.schema, values or {}, partial=partial) @t.overload - def load(self, values: t.Dict[str, t.Any]) -> t.Any: + def load(self, values: dict[str, t.Any]) -> t.Any: ... @t.overload - def load(self, values: t.List[t.Dict[str, t.Any]]) -> t.List[t.Any]: + def load(self, values: list[dict[str, t.Any]]) -> list[t.Any]: ... def load(self, values): @@ -236,11 +237,11 @@ def load(self, values): return schemas.adapter.load(self.schema, values) @t.overload - def dump(self, values: t.Dict[str, t.Any]) -> t.Dict[str, t.Any]: + def dump(self, values: dict[str, t.Any]) -> dict[str, t.Any]: ... @t.overload - def dump(self, values: t.List[t.Dict[str, t.Any]]) -> t.List[t.Dict[str, t.Any]]: + def dump(self, values: list[dict[str, t.Any]]) -> list[dict[str, t.Any]]: ... def dump(self, values): @@ -254,7 +255,7 @@ def dump(self, values): class Parameter: name: str location: ParameterLocation - type: t.Type + type: type required: bool = True default: t.Any = InjectionParameter.empty nullable: bool = dataclasses.field(init=False) @@ -316,4 +317,4 @@ def _build_response_parameter(cls, parameter: InjectionParameter) -> "Parameter" return cls(name=parameter.name, location=ParameterLocation.response, type=parameter.annotation) -Parameters = t.Dict[str, Parameter] +Parameters = dict[str, Parameter] diff --git a/flama/schemas/exceptions.py b/flama/schemas/exceptions.py index 4fb17867..6646e3d4 100644 --- a/flama/schemas/exceptions.py +++ b/flama/schemas/exceptions.py @@ -4,7 +4,7 @@ class SchemaError(Exception): - def __init__(self, errors: typing.Union[str, typing.Dict[str, typing.Any]], *args, **kwargs): + def __init__(self, errors: typing.Union[str, dict[str, typing.Any]], *args, **kwargs): super().__init__(*args, **kwargs) self.errors = errors diff --git a/flama/schemas/generator.py b/flama/schemas/generator.py index 7f69b626..8dc6c16f 100644 --- a/flama/schemas/generator.py +++ b/flama/schemas/generator.py @@ -22,8 +22,8 @@ class EndpointInfo: path: str method: str func: t.Callable = dataclasses.field(repr=False) - query_parameters: t.Dict[str, Parameter] = dataclasses.field(repr=False) - path_parameters: t.Dict[str, Parameter] = dataclasses.field(repr=False) + query_parameters: dict[str, Parameter] = dataclasses.field(repr=False) + path_parameters: dict[str, Parameter] = dataclasses.field(repr=False) body_parameter: t.Optional[Parameter] = dataclasses.field(repr=False) response_parameter: Parameter = dataclasses.field(repr=False) @@ -37,12 +37,12 @@ class SchemaInfo: def ref(self) -> str: return f"#/components/schemas/{self.name}" - def json_schema(self, names: t.Dict[int, str]) -> types.JSONSchema: + def json_schema(self, names: dict[int, str]) -> types.JSONSchema: return Schema(self.schema).json_schema(names) -class SchemaRegistry(t.Dict[int, SchemaInfo]): - def __init__(self, schemas: t.Optional[t.Dict[str, schemas.Schema]] = None): +class SchemaRegistry(dict[int, SchemaInfo]): + def __init__(self, schemas: t.Optional[dict[str, schemas.Schema]] = None): super().__init__() for name, schema in (schemas or {}).items(): @@ -60,7 +60,7 @@ def __getitem__(self, item: t.Any) -> SchemaInfo: return super().__getitem__(id(schemas.Schema(item).unique_schema)) @property - def names(self) -> t.Dict[int, str]: + def names(self) -> dict[int, str]: """Returns a dictionary mapping schema ids to their names. :return: Schema names. @@ -68,7 +68,7 @@ def names(self) -> t.Dict[int, str]: return {k: v.name for k, v in self.items()} @t.no_type_check - def _get_schema_references_from_schema(self, schema: t.Union[openapi.Schema, openapi.Reference]) -> t.List[str]: + def _get_schema_references_from_schema(self, schema: t.Union[openapi.Schema, openapi.Reference]) -> list[str]: if isinstance(schema, openapi.Reference): return [schema.ref] @@ -103,10 +103,10 @@ def _get_schema_references_from_schema(self, schema: t.Union[openapi.Schema, ope return result - def _get_schema_references_from_path(self, path: openapi.Path) -> t.List[str]: + def _get_schema_references_from_path(self, path: openapi.Path) -> list[str]: return [y for x in path.operations.values() for y in self._get_schema_references_from_operation(x)] - def _get_schema_references_from_operation(self, operation: openapi.Operation) -> t.List[str]: + def _get_schema_references_from_operation(self, operation: openapi.Operation) -> list[str]: return [ *self._get_schema_references_from_operation_parameters(operation.parameters), *self._get_schema_references_from_operation_request_body(operation.requestBody), @@ -114,7 +114,7 @@ def _get_schema_references_from_operation(self, operation: openapi.Operation) -> *self._get_schema_references_from_operation_responses(operation.responses), ] - def _get_schema_references_from_operation_responses(self, responses: openapi.Responses) -> t.List[str]: + def _get_schema_references_from_operation_responses(self, responses: openapi.Responses) -> list[str]: refs = [] for response in [x for x in responses.values() if x.content]: @@ -128,8 +128,8 @@ def _get_schema_references_from_operation_responses(self, responses: openapi.Res return refs def _get_schema_references_from_operation_callbacks( - self, callbacks: t.Optional[t.Dict[str, t.Union[openapi.Callback, openapi.Reference]]] - ) -> t.List[str]: + self, callbacks: t.Optional[dict[str, t.Union[openapi.Callback, openapi.Reference]]] + ) -> list[str]: refs = [] if callbacks: @@ -144,7 +144,7 @@ def _get_schema_references_from_operation_callbacks( def _get_schema_references_from_operation_request_body( self, request_body: t.Optional[t.Union[openapi.RequestBody, openapi.Reference]] - ) -> t.List[str]: + ) -> list[str]: refs = [] if request_body: @@ -157,8 +157,8 @@ def _get_schema_references_from_operation_request_body( return refs def _get_schema_references_from_operation_parameters( - self, parameters: t.Optional[t.List[t.Union[openapi.Parameter, openapi.Reference]]] - ) -> t.List[str]: + self, parameters: t.Optional[list[t.Union[openapi.Parameter, openapi.Reference]]] + ) -> list[str]: refs = [] if parameters: @@ -170,7 +170,7 @@ def _get_schema_references_from_operation_parameters( return refs - def used(self, spec: openapi.OpenAPISpec) -> t.Dict[int, SchemaInfo]: + def used(self, spec: openapi.OpenAPISpec) -> dict[int, SchemaInfo]: """ Generate a dict containing used schemas. @@ -212,7 +212,7 @@ def register(self, schema: schemas.Schema, name: t.Optional[str] = None) -> int: try: schema_name = name or s.name - except ValueError as e: # noqa: safety net + except ValueError as e: # pragma: no cover raise ValueError("Cannot infer schema name.") from e schema_instance = s.unique_schema @@ -254,7 +254,7 @@ def __init__( contact_email: t.Optional[str] = None, license_name: t.Optional[str] = None, license_url: t.Optional[str] = None, - schemas: t.Optional[t.Dict] = None, + schemas: t.Optional[dict] = None, ): contact = ( openapi.Contact(name=contact_name, url=contact_url, email=contact_email) @@ -277,8 +277,8 @@ def __init__( self.schemas = SchemaRegistry(schemas=schemas) def get_endpoints( # type: ignore[override] - self, routes: t.List[routing.BaseRoute], base_path: str = "" - ) -> t.Dict[str, t.List[EndpointInfo]]: + self, routes: list[routing.BaseRoute], base_path: str = "" + ) -> dict[str, list[EndpointInfo]]: """ Given the routes, yields the following information: @@ -293,7 +293,7 @@ def get_endpoints( # type: ignore[override] :param base_path: The base endpoints path. :return: Data structure that contains metadata from every route. """ - endpoints_info: t.Dict[str, t.List[EndpointInfo]] = defaultdict(list) + endpoints_info: dict[str, list[EndpointInfo]] = defaultdict(list) for route in routes: path = RegexPath(base_path + route.path.path).template @@ -338,8 +338,8 @@ def get_endpoints( # type: ignore[override] return endpoints_info def _build_endpoint_parameters( - self, endpoint: EndpointInfo, metadata: t.Dict[str, t.Any] - ) -> t.Optional[t.List[openapi.Parameter]]: + self, endpoint: EndpointInfo, metadata: dict[str, t.Any] + ) -> t.Optional[list[openapi.Parameter]]: if not endpoint.query_parameters and not endpoint.path_parameters: return None @@ -368,7 +368,7 @@ def _build_endpoint_parameters( ] def _build_endpoint_body( - self, endpoint: EndpointInfo, metadata: t.Dict[str, t.Any] + self, endpoint: EndpointInfo, metadata: dict[str, t.Any] ) -> t.Optional[openapi.RequestBody]: content = {k: v for k, v in metadata.get("requestBody", {}).get("content", {}).items()} @@ -390,7 +390,7 @@ def _build_endpoint_body( **{x: metadata.get("requestBody", {}).get(x) for x in ("description", "required")}, ) - def _build_endpoint_responses(self, endpoint: EndpointInfo, metadata: t.Dict[str, t.Any]) -> openapi.Responses: + def _build_endpoint_responses(self, endpoint: EndpointInfo, metadata: dict[str, t.Any]) -> openapi.Responses: responses = metadata.get("responses", {}) try: main_response_code = next(iter(responses.keys())) @@ -448,7 +448,7 @@ def _build_endpoint_responses(self, endpoint: EndpointInfo, metadata: t.Dict[str } ) - def _parse_docstring(self, func: t.Callable) -> t.Dict[t.Any, t.Any]: + def _parse_docstring(self, func: t.Callable) -> dict[t.Any, t.Any]: """Given a function, parse the docstring as YAML and return a dictionary of info. :param func: Function to analyze docstring. @@ -491,7 +491,7 @@ def get_operation_schema(self, endpoint: EndpointInfo) -> openapi.Operation: }, ) - def get_api_schema(self, routes: t.List[routing.BaseRoute]) -> t.Dict[str, t.Any]: + def get_api_schema(self, routes: list[routing.BaseRoute]) -> dict[str, t.Any]: endpoints_info = self.get_endpoints(routes) for path, endpoints in endpoints_info.items(): @@ -508,6 +508,6 @@ def get_api_schema(self, routes: t.List[routing.BaseRoute]) -> t.Dict[str, t.Any for schema in self.schemas.used(self.spec).values(): self.spec.add_schema(schema.name, openapi.Schema(schema.json_schema(self.schemas.names))) - api_schema: t.Dict[str, t.Any] = self.spec.asdict() + api_schema: dict[str, t.Any] = self.spec.asdict() return api_schema diff --git a/flama/schemas/modules.py b/flama/schemas/modules.py index efc5b939..e25adbdf 100644 --- a/flama/schemas/modules.py +++ b/flama/schemas/modules.py @@ -24,7 +24,7 @@ def __init__( ): super().__init__() # Schema definitions - self.schemas: t.Dict[str, t.Any] = {} + self.schemas: dict[str, t.Any] = {} # Schema self.title = title @@ -53,7 +53,7 @@ def schema_generator(self) -> SchemaGenerator: ) @property - def schema(self) -> t.Dict[str, t.Any]: + def schema(self) -> dict[str, t.Any]: """Generate the API schema. :return: API schema. diff --git a/flama/schemas/openapi.py b/flama/schemas/openapi.py index bd174508..199d8b23 100644 --- a/flama/schemas/openapi.py +++ b/flama/schemas/openapi.py @@ -86,7 +86,7 @@ class Info: @dataclasses.dataclass(frozen=True) class ServerVariable: - enum: t.List[str] + enum: list[str] default: str description: t.Optional[str] = None @@ -94,7 +94,7 @@ class ServerVariable: @dataclasses.dataclass(frozen=True) class Server: url: str - variables: t.Dict[str, ServerVariable] + variables: dict[str, ServerVariable] description: t.Optional[str] = None @@ -102,14 +102,14 @@ class Server: class Link: operationRef: t.Optional[str] = None operationId: t.Optional[str] = None - parameters: t.Optional[t.Dict[str, t.Any]] = None + parameters: t.Optional[dict[str, t.Any]] = None requestBody: t.Optional[t.Any] = None description: t.Optional[str] = None server: t.Optional[Server] = None -Security = t.NewType("Security", t.Dict[str, t.List[str]]) -Callback = t.NewType("Callback", t.Dict[str, "Path"]) +Security = t.NewType("Security", dict[str, list[str]]) +Callback = t.NewType("Callback", dict[str, "Path"]) @dataclasses.dataclass(frozen=True) @@ -123,7 +123,7 @@ class Header: allowReserved: t.Optional[bool] = None schema: t.Optional[t.Union[Schema, Reference]] = None example: t.Optional[t.Any] = None - examples: t.Optional[t.Dict[str, t.Union[Example, Reference]]] = None + examples: t.Optional[dict[str, t.Union[Example, Reference]]] = None @dataclasses.dataclass(frozen=True) @@ -139,13 +139,13 @@ class Parameter: allowReserved: t.Optional[bool] = None schema: t.Optional[t.Union[Schema, Reference]] = None example: t.Optional[t.Any] = None - examples: t.Optional[t.Dict[str, t.Union[Example, Reference]]] = None + examples: t.Optional[dict[str, t.Union[Example, Reference]]] = None @dataclasses.dataclass(frozen=True) class Encoding: contentType: t.Optional[str] = None - headers: t.Optional[t.Dict[str, t.Union[Header, Reference]]] = None + headers: t.Optional[dict[str, t.Union[Header, Reference]]] = None style: t.Optional[str] = None explode: t.Optional[bool] = None allowReserved: t.Optional[bool] = None @@ -155,13 +155,13 @@ class Encoding: class MediaType: schema: t.Optional[t.Union[Schema, Reference]] = None example: t.Optional[t.Any] = None - examples: t.Optional[t.Dict[str, t.Union[t.Any, Reference]]] = None - encoding: t.Optional[t.Dict[str, Encoding]] = None + examples: t.Optional[dict[str, t.Union[t.Any, Reference]]] = None + encoding: t.Optional[dict[str, Encoding]] = None @dataclasses.dataclass(frozen=True) class RequestBody: - content: t.Dict[str, MediaType] + content: dict[str, MediaType] description: t.Optional[str] = None required: t.Optional[bool] = None @@ -169,28 +169,28 @@ class RequestBody: @dataclasses.dataclass(frozen=True) class Response: description: str - headers: t.Optional[t.Dict[str, t.Union[Header, Reference]]] = None - content: t.Optional[t.Dict[str, MediaType]] = None - links: t.Optional[t.Dict[str, t.Union[Link, Reference]]] = None + headers: t.Optional[dict[str, t.Union[Header, Reference]]] = None + content: t.Optional[dict[str, MediaType]] = None + links: t.Optional[dict[str, t.Union[Link, Reference]]] = None -Responses = t.NewType("Responses", t.Dict[str, Response]) +Responses = t.NewType("Responses", dict[str, Response]) @dataclasses.dataclass(frozen=True) class Operation: responses: Responses - tags: t.Optional[t.List[str]] = None + tags: t.Optional[list[str]] = None summary: t.Optional[str] = None description: t.Optional[str] = None externalDocs: t.Optional[ExternalDocs] = None operationId: t.Optional[str] = None - parameters: t.Optional[t.List[t.Union[Parameter, Reference]]] = None + parameters: t.Optional[list[t.Union[Parameter, Reference]]] = None requestBody: t.Optional[t.Union[RequestBody, Reference]] = None - callbacks: t.Optional[t.Dict[str, t.Union[Callback, Reference]]] = None + callbacks: t.Optional[dict[str, t.Union[Callback, Reference]]] = None deprecated: t.Optional[bool] = None - security: t.Optional[t.List[Security]] = None - servers: t.Optional[t.List[Server]] = None + security: t.Optional[list[Security]] = None + servers: t.Optional[list[Server]] = None @dataclasses.dataclass(frozen=True) @@ -206,11 +206,11 @@ class Path: head: t.Optional[Operation] = None patch: t.Optional[Operation] = None trace: t.Optional[Operation] = None - servers: t.Optional[t.List[Server]] = None - parameters: t.Optional[t.List[t.Union[Parameter, Reference]]] = None + servers: t.Optional[list[Server]] = None + parameters: t.Optional[list[t.Union[Parameter, Reference]]] = None @property - def operations(self) -> t.Dict[str, Operation]: + def operations(self) -> dict[str, Operation]: return { x: getattr(self, x) for x in ("get", "put", "post", "delete", "options", "head", "patch", "trace") @@ -218,20 +218,20 @@ def operations(self) -> t.Dict[str, Operation]: } -Paths = t.NewType("Paths", t.Dict[str, Path]) +Paths = t.NewType("Paths", dict[str, Path]) @dataclasses.dataclass(frozen=True) class Components: - schemas: t.Dict[str, t.Union[Schema, Reference]] - responses: t.Dict[str, t.Union[Response, Reference]] - parameters: t.Dict[str, t.Union[Parameter, Reference]] - examples: t.Dict[str, t.Union[Example, Reference]] - requestBodies: t.Dict[str, t.Union[RequestBody, Reference]] - headers: t.Dict[str, t.Union[Header, Reference]] - securitySchemes: t.Dict[str, t.Union[Security, Reference]] - links: t.Dict[str, t.Union[Link, Reference]] - callbacks: t.Dict[str, t.Union[Callback, Reference]] + schemas: dict[str, t.Union[Schema, Reference]] + responses: dict[str, t.Union[Response, Reference]] + parameters: dict[str, t.Union[Parameter, Reference]] + examples: dict[str, t.Union[Example, Reference]] + requestBodies: dict[str, t.Union[RequestBody, Reference]] + headers: dict[str, t.Union[Header, Reference]] + securitySchemes: dict[str, t.Union[Security, Reference]] + links: dict[str, t.Union[Link, Reference]] + callbacks: dict[str, t.Union[Callback, Reference]] @dataclasses.dataclass(frozen=True) @@ -240,9 +240,9 @@ class OpenAPI: info: Info paths: Paths components: Components - servers: t.Optional[t.List[Server]] = None - security: t.Optional[t.List[Security]] = None - tags: t.Optional[t.List[Tag]] = None + servers: t.Optional[list[Server]] = None + security: t.Optional[list[Security]] = None + tags: t.Optional[list[Tag]] = None externalDocs: t.Optional[ExternalDocs] = None diff --git a/flama/schemas/routing.py b/flama/schemas/routing.py index 2cf26bb4..0d70b312 100644 --- a/flama/schemas/routing.py +++ b/flama/schemas/routing.py @@ -23,7 +23,7 @@ def __get__(self, instance, owner) -> "ParametersDescriptor": return self @property - def _parameters(self) -> t.Dict[str, t.List["InjectionParameter"]]: + def _parameters(self) -> dict[str, list["InjectionParameter"]]: return { method: sorted( [ @@ -37,14 +37,14 @@ def _parameters(self) -> t.Dict[str, t.List["InjectionParameter"]]: } @property - def _return_values(self) -> t.Dict[str, "InjectionParameter"]: + def _return_values(self) -> dict[str, "InjectionParameter"]: return { method: Return.from_return_annotation(inspect.signature(handler).return_annotation) for method, handler in self._route.endpoint_handlers().items() } @property - def query(self) -> t.Dict[str, Parameters]: + def query(self) -> dict[str, Parameters]: return { method: { p.name: Parameter.build("query", p) @@ -55,14 +55,14 @@ def query(self) -> t.Dict[str, Parameters]: } @property - def path(self) -> t.Dict[str, Parameters]: + def path(self) -> dict[str, Parameters]: return { method: {p.name: Parameter.build("path", p) for p in parameters if p.name in self._route.path.parameters} for method, parameters in self._parameters.items() } @property - def body(self) -> t.Dict[str, t.Optional[Parameter]]: + def body(self) -> dict[str, t.Optional[Parameter]]: return { method: next( ( @@ -77,7 +77,7 @@ def body(self) -> t.Dict[str, t.Optional[Parameter]]: } @property - def response(self) -> t.Dict[str, Parameter]: + def response(self) -> dict[str, Parameter]: return { method: Parameter.build("response", return_value) for method, return_value in self._return_values.items() } diff --git a/flama/serialize/data_structures.py b/flama/serialize/data_structures.py index 3f29a4cd..a2cca228 100644 --- a/flama/serialize/data_structures.py +++ b/flama/serialize/data_structures.py @@ -65,7 +65,7 @@ def serializer(cls, framework: t.Union[str, Framework]) -> Serializer: except KeyError: # pragma: no cover raise ValueError("Wrong framework") - serializer_class: t.Type[Serializer] = getattr( + serializer_class: type[Serializer] = getattr( importlib.import_module(f"flama.serialize.serializers.{module}"), class_name ) return serializer_class() @@ -76,7 +76,7 @@ def from_model(cls, model: t.Any) -> Serializer: try: inspect_objs += model.__class__.__mro__ - except AttributeError: # noqa: safety net + except AttributeError: # pragma: no cover ... for obj in inspect_objs: @@ -101,10 +101,10 @@ def from_model(cls, model: t.Any) -> "FrameworkInfo": return cls(lib=serializer.lib, version=serializer.version()) @classmethod - def from_dict(cls, data: t.Dict[str, t.Any]) -> "FrameworkInfo": + def from_dict(cls, data: dict[str, t.Any]) -> "FrameworkInfo": return cls(lib=Framework[data["lib"]], version=data["version"]) - def to_dict(self) -> t.Dict[str, t.Any]: + def to_dict(self) -> dict[str, t.Any]: return {"lib": self.lib.value, "version": self.version} @@ -114,12 +114,12 @@ class ModelInfo: obj: str info: t.Optional["JSONSchema"] = None - params: t.Optional[t.Dict[str, t.Any]] = None - metrics: t.Optional[t.Dict[str, t.Any]] = None + params: t.Optional[dict[str, t.Any]] = None + metrics: t.Optional[dict[str, t.Any]] = None @classmethod def from_model( - cls, model: t.Any, params: t.Optional[t.Dict[str, t.Any]], metrics: t.Optional[t.Dict[str, t.Any]] + cls, model: t.Any, params: t.Optional[dict[str, t.Any]], metrics: t.Optional[dict[str, t.Any]] ) -> "ModelInfo": return cls( obj=model.__name__ if inspect.isclass(model) else model.__class__.__name__, @@ -129,10 +129,10 @@ def from_model( ) @classmethod - def from_dict(cls, data: t.Dict[str, t.Any]): + def from_dict(cls, data: dict[str, t.Any]): return cls(obj=data["obj"], info=data["info"], params=data.get("params"), metrics=data.get("metrics")) - def to_dict(self) -> t.Dict[str, t.Any]: + def to_dict(self) -> dict[str, t.Any]: return dataclasses.asdict(self) @@ -144,7 +144,7 @@ class Metadata: timestamp: datetime.datetime framework: FrameworkInfo model: ModelInfo - extra: t.Optional[t.Dict[str, t.Any]] = None + extra: t.Optional[dict[str, t.Any]] = None @classmethod def from_model( @@ -153,9 +153,9 @@ def from_model( *, model_id: t.Optional[t.Union[str, uuid.UUID]], timestamp: t.Optional[datetime.datetime], - params: t.Optional[t.Dict[str, t.Any]], - metrics: t.Optional[t.Dict[str, t.Any]], - extra: t.Optional[t.Dict[str, t.Any]], + params: t.Optional[dict[str, t.Any]], + metrics: t.Optional[dict[str, t.Any]], + extra: t.Optional[dict[str, t.Any]], ) -> "Metadata": return cls( id=model_id or uuid.uuid4(), @@ -166,7 +166,7 @@ def from_model( ) @classmethod - def from_dict(cls, data: t.Dict[str, t.Any]) -> "Metadata": + def from_dict(cls, data: dict[str, t.Any]) -> "Metadata": try: id_ = uuid.UUID(data["id"]) except ValueError: @@ -186,7 +186,7 @@ def from_dict(cls, data: t.Dict[str, t.Any]) -> "Metadata": extra=data.get("extra"), ) - def to_dict(self) -> t.Dict[str, t.Any]: + def to_dict(self) -> dict[str, t.Any]: return { "id": str(self.id), "timestamp": self.timestamp.isoformat(), @@ -196,7 +196,7 @@ def to_dict(self) -> t.Dict[str, t.Any]: } -Artifacts = t.Dict[str, t.Union[str, os.PathLike]] +Artifacts = dict[str, t.Union[str, os.PathLike]] class _ModelDirectory: @@ -257,9 +257,9 @@ def from_model( *, model_id: t.Optional[t.Union[str, uuid.UUID]] = None, timestamp: t.Optional[datetime.datetime] = None, - params: t.Optional[t.Dict[str, t.Any]] = None, - metrics: t.Optional[t.Dict[str, t.Any]] = None, - extra: t.Optional[t.Dict[str, t.Any]] = None, + params: t.Optional[dict[str, t.Any]] = None, + metrics: t.Optional[dict[str, t.Any]] = None, + extra: t.Optional[dict[str, t.Any]] = None, artifacts: t.Optional[Artifacts] = None, ) -> "ModelArtifact": return cls( @@ -271,7 +271,7 @@ def from_model( ) @classmethod - def from_dict(cls, data: t.Dict[str, t.Any], **kwargs) -> "ModelArtifact": + def from_dict(cls, data: dict[str, t.Any], **kwargs) -> "ModelArtifact": try: metadata = Metadata.from_dict(data["meta"]) artifacts = data.get("artifacts") @@ -297,8 +297,8 @@ def from_json(cls, data: str, **kwargs) -> "ModelArtifact": def from_bytes(cls, data: bytes, **kwargs) -> "ModelArtifact": return cls.from_json(codecs.decode(data, "zlib"), **kwargs) # type: ignore[arg-type] - def to_dict(self, *, artifacts: bool = True, **kwargs) -> t.Dict[str, t.Any]: - result: t.Dict[str, t.Any] = { + def to_dict(self, *, artifacts: bool = True, **kwargs) -> dict[str, t.Any]: + result: dict[str, t.Any] = { "model": FrameworkSerializers.serializer(self.meta.framework.lib).dump(self.model, **kwargs).decode(), "meta": self.meta.to_dict(), } diff --git a/flama/serialize/dump.py b/flama/serialize/dump.py index 154d37b6..5e637823 100644 --- a/flama/serialize/dump.py +++ b/flama/serialize/dump.py @@ -18,11 +18,11 @@ def dump( compression: t.Union[str, Compression] = Compression.standard, model_id: t.Optional[t.Union[str, uuid.UUID]] = None, timestamp: t.Optional[datetime.datetime] = None, - params: t.Optional[t.Dict[str, t.Any]] = None, - metrics: t.Optional[t.Dict[str, t.Any]] = None, - extra: t.Optional[t.Dict[str, t.Any]] = None, + params: t.Optional[dict[str, t.Any]] = None, + metrics: t.Optional[dict[str, t.Any]] = None, + extra: t.Optional[dict[str, t.Any]] = None, artifacts: t.Optional["Artifacts"] = None, - **kwargs + **kwargs, ) -> None: """Serialize an ML model using Flama format to bytes stream. diff --git a/flama/sqlalchemy.py b/flama/sqlalchemy.py index a5fb8a75..b20f0c20 100644 --- a/flama/sqlalchemy.py +++ b/flama/sqlalchemy.py @@ -207,8 +207,8 @@ def __init__(self, engine: "AsyncEngine") -> None: :param engine: SQLAlchemy engine. """ super().__init__(engine) - self._connections: t.Set["AsyncConnection"] = set() - self._transactions: t.Dict["AsyncConnection", "AsyncTransaction"] = {} + self._connections: set["AsyncConnection"] = set() + self._transactions: dict["AsyncConnection", "AsyncTransaction"] = {} async def open(self) -> "AsyncConnection": """Open a new connection to the database. @@ -289,7 +289,7 @@ class SQLAlchemyModule(Module): name = "sqlalchemy" def __init__( - self, database: str, single_connection: bool = False, engine_args: t.Optional[t.Dict[str, t.Any]] = None + self, database: str, single_connection: bool = False, engine_args: t.Optional[dict[str, t.Any]] = None ): """Initialize the SQLAlchemy module. @@ -320,7 +320,7 @@ def __init__( self._engine: t.Optional["AsyncEngine"] = None self._engine_args = engine_args or {} self._connection_manager: t.Optional["ConnectionManager"] = None - self._manager_cls: t.Type["ConnectionManager"] = ( + self._manager_cls: type["ConnectionManager"] = ( SingleConnectionManager if single_connection else MultipleConnectionManager ) diff --git a/flama/types/asgi.py b/flama/types/asgi.py index 15397677..b4093827 100644 --- a/flama/types/asgi.py +++ b/flama/types/asgi.py @@ -63,7 +63,7 @@ def __init__(self, app: App, *args: P.args, **kwargs: P.kwargs): MiddlewareFunction = t.Callable[ t.Concatenate[App, P], App # type: ignore # PORT: Remove this comment when stop supporting 3.9 ] -Middleware = t.Union[t.Type[MiddlewareClass], MiddlewareFunction] +Middleware = t.Union[type[MiddlewareClass], MiddlewareFunction] -HTTPHandler = t.Union[t.Callable, t.Type["endpoints.HTTPEndpoint"]] -WebSocketHandler = t.Union[t.Callable, t.Type["endpoints.WebSocketEndpoint"]] +HTTPHandler = t.Union[t.Callable, type["endpoints.HTTPEndpoint"]] +WebSocketHandler = t.Union[t.Callable, type["endpoints.WebSocketEndpoint"]] diff --git a/flama/types/http.py b/flama/types/http.py index c35bc78d..951d3b44 100644 --- a/flama/types/http.py +++ b/flama/types/http.py @@ -37,15 +37,15 @@ QueryParam = t.NewType("QueryParam", str) Header = t.NewType("Header", str) Body = t.NewType("Body", bytes) -PathParams = t.NewType("PathParams", t.Dict[str, str]) +PathParams = t.NewType("PathParams", dict[str, str]) PathParam = t.NewType("PathParam", str) -RequestData = t.NewType("RequestData", t.Dict[str, t.Any]) +RequestData = t.NewType("RequestData", dict[str, t.Any]) Headers = starlette.datastructures.Headers MutableHeaders = starlette.datastructures.MutableHeaders -Cookies = t.NewType("Cookies", t.Dict[str, t.Dict[str, str]]) +Cookies = t.NewType("Cookies", dict[str, dict[str, str]]) QueryParams = starlette.datastructures.QueryParams -PARAMETERS_TYPES: t.Dict[t.Type, t.Type] = { +PARAMETERS_TYPES: dict[type, type] = { int: int, float: float, str: str, diff --git a/flama/types/json.py b/flama/types/json.py index ccc8d300..b72c10ce 100644 --- a/flama/types/json.py +++ b/flama/types/json.py @@ -3,5 +3,5 @@ __all__ = ["JSONField", "JSONSchema"] -JSONField = t.Union[str, int, float, bool, None, t.List["JSONField"], t.Dict[str, "JSONField"]] -JSONSchema = t.Dict[str, JSONField] +JSONField = t.Union[str, int, float, bool, None, list["JSONField"], dict[str, "JSONField"]] +JSONSchema = dict[str, JSONField] diff --git a/flama/types/schema.py b/flama/types/schema.py index 490aac6f..22f160c7 100644 --- a/flama/types/schema.py +++ b/flama/types/schema.py @@ -15,7 +15,7 @@ def _is_schema( obj: t.Any, -) -> t.TypeGuard[t.Type["Schema"]]: # type: ignore # PORT: Remove this comment when stop supporting 3.9 +) -> t.TypeGuard[type["Schema"]]: # type: ignore # PORT: Remove this comment when stop supporting 3.9 return inspect.isclass(obj) and issubclass(obj, Schema) @@ -37,7 +37,7 @@ def __class_getitem__(cls, schema_cls: _T_Schema): # type: ignore[override] @staticmethod def is_schema( obj: t.Any, - ) -> t.TypeGuard[t.Type["Schema"]]: # type: ignore # PORT: Remove this comment when stop supporting 3.9 + ) -> t.TypeGuard[type["Schema"]]: # type: ignore # PORT: Remove this comment when stop supporting 3.9 return _is_schema(obj) diff --git a/flama/url.py b/flama/url.py index 127c7afb..6ea99c61 100644 --- a/flama/url.py +++ b/flama/url.py @@ -33,7 +33,7 @@ def __init__(self, url: str = "", **kwargs: str): self.fragment = parsed_url.fragment @property - def components(self) -> t.Dict[str, t.Optional[str]]: + def components(self) -> dict[str, t.Optional[str]]: """URL components map. :return: Components. @@ -128,7 +128,7 @@ class RegexPath: PARAM_REGEX: t.ClassVar[re.Pattern] = re.compile( r"{(?P[a-zA-Z_][a-zA-Z0-9_]*)(?::(?P[a-zA-Z_][a-zA-Z0-9_]*)?)?}" ) - SERIALIZERS: t.ClassVar[t.Dict[str, ParamSerializer]] = { + SERIALIZERS: t.ClassVar[dict[str, ParamSerializer]] = { "str": StringParamSerializer(), "path": PathParamSerializer(), "int": IntegerParamSerializer(), @@ -160,8 +160,8 @@ def __init__(self, path: t.Union[str, "RegexPath"]): self.path: str = path.path self.template: str = path.template self.regex: re.Pattern = path.regex - self.serializers: t.Dict[str, ParamSerializer] = path.serializers - self.parameters: t.List[str] = path.parameters + self.serializers: dict[str, ParamSerializer] = path.serializers + self.parameters: list[str] = path.parameters else: self.raw_path = path self.path = self.PARAM_REGEX.sub(lambda x: x.group(0) if x.group("type") != "path" else "", path) @@ -194,7 +194,7 @@ def match(self, path: str) -> bool: """ return self.regex.match(path) is not None - def values(self, path: str) -> t.Dict[str, t.Any]: + def values(self, path: str) -> dict[str, t.Any]: """Get serialized parameters from a matching path. :param path: Path to match. @@ -207,7 +207,7 @@ def values(self, path: str) -> t.Dict[str, t.Any]: return {k: self.serializers[k].load(v) for k, v in match.groupdict().items()} - def build(self, **params: t.Any) -> t.Tuple[str, t.Dict[str, t.Any]]: + def build(self, **params: t.Any) -> tuple[str, dict[str, t.Any]]: """Build a path by completing param placeholders with given values. :param params: Param values. diff --git a/poetry.lock b/poetry.lock index d2a4cc2c..422f6d6c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -64,13 +64,13 @@ trio = ["trio (>=0.26.1)"] [[package]] name = "apispec" -version = "6.7.0" +version = "6.7.1" description = "A pluggable API specification generator. Currently supports the OpenAPI Specification (f.k.a. the Swagger specification)." optional = false python-versions = ">=3.9" files = [ - {file = "apispec-6.7.0-py3-none-any.whl", hash = "sha256:7d2f2be3ceb7385eca550e4a2cc1e4d4a640093cc8fe04224301aa395a785b25"}, - {file = "apispec-6.7.0.tar.gz", hash = "sha256:fa2cf1063bb227ed6f7f66b019f320d7dc0a7cb02acdf166a160e2381f4b2c39"}, + {file = "apispec-6.7.1-py3-none-any.whl", hash = "sha256:d99e7a564f3871327c17b3e43726cc1e6ade2c97aa05706644a48818fc37999e"}, + {file = "apispec-6.7.1.tar.gz", hash = "sha256:c01b8b6ff40ffedf55b79a67f9dd920e9b2fc3909aae116facf6c8372a08b933"}, ] [package.dependencies] @@ -404,73 +404,73 @@ files = [ [[package]] name = "coverage" -version = "7.6.4" +version = "7.6.7" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.9" files = [ - {file = "coverage-7.6.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5f8ae553cba74085db385d489c7a792ad66f7f9ba2ee85bfa508aeb84cf0ba07"}, - {file = "coverage-7.6.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8165b796df0bd42e10527a3f493c592ba494f16ef3c8b531288e3d0d72c1f6f0"}, - {file = "coverage-7.6.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7c8b95bf47db6d19096a5e052ffca0a05f335bc63cef281a6e8fe864d450a72"}, - {file = "coverage-7.6.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ed9281d1b52628e81393f5eaee24a45cbd64965f41857559c2b7ff19385df51"}, - {file = "coverage-7.6.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0809082ee480bb8f7416507538243c8863ac74fd8a5d2485c46f0f7499f2b491"}, - {file = "coverage-7.6.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d541423cdd416b78626b55f123412fcf979d22a2c39fce251b350de38c15c15b"}, - {file = "coverage-7.6.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:58809e238a8a12a625c70450b48e8767cff9eb67c62e6154a642b21ddf79baea"}, - {file = "coverage-7.6.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c9b8e184898ed014884ca84c70562b4a82cbc63b044d366fedc68bc2b2f3394a"}, - {file = "coverage-7.6.4-cp310-cp310-win32.whl", hash = "sha256:6bd818b7ea14bc6e1f06e241e8234508b21edf1b242d49831831a9450e2f35fa"}, - {file = "coverage-7.6.4-cp310-cp310-win_amd64.whl", hash = "sha256:06babbb8f4e74b063dbaeb74ad68dfce9186c595a15f11f5d5683f748fa1d172"}, - {file = "coverage-7.6.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:73d2b73584446e66ee633eaad1a56aad577c077f46c35ca3283cd687b7715b0b"}, - {file = "coverage-7.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:51b44306032045b383a7a8a2c13878de375117946d68dcb54308111f39775a25"}, - {file = "coverage-7.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b3fb02fe73bed561fa12d279a417b432e5b50fe03e8d663d61b3d5990f29546"}, - {file = "coverage-7.6.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed8fe9189d2beb6edc14d3ad19800626e1d9f2d975e436f84e19efb7fa19469b"}, - {file = "coverage-7.6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b369ead6527d025a0fe7bd3864e46dbee3aa8f652d48df6174f8d0bac9e26e0e"}, - {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ade3ca1e5f0ff46b678b66201f7ff477e8fa11fb537f3b55c3f0568fbfe6e718"}, - {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:27fb4a050aaf18772db513091c9c13f6cb94ed40eacdef8dad8411d92d9992db"}, - {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4f704f0998911abf728a7783799444fcbbe8261c4a6c166f667937ae6a8aa522"}, - {file = "coverage-7.6.4-cp311-cp311-win32.whl", hash = "sha256:29155cd511ee058e260db648b6182c419422a0d2e9a4fa44501898cf918866cf"}, - {file = "coverage-7.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:8902dd6a30173d4ef09954bfcb24b5d7b5190cf14a43170e386979651e09ba19"}, - {file = "coverage-7.6.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12394842a3a8affa3ba62b0d4ab7e9e210c5e366fbac3e8b2a68636fb19892c2"}, - {file = "coverage-7.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2b6b4c83d8e8ea79f27ab80778c19bc037759aea298da4b56621f4474ffeb117"}, - {file = "coverage-7.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d5b8007f81b88696d06f7df0cb9af0d3b835fe0c8dbf489bad70b45f0e45613"}, - {file = "coverage-7.6.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b57b768feb866f44eeed9f46975f3d6406380275c5ddfe22f531a2bf187eda27"}, - {file = "coverage-7.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5915fcdec0e54ee229926868e9b08586376cae1f5faa9bbaf8faf3561b393d52"}, - {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0b58c672d14f16ed92a48db984612f5ce3836ae7d72cdd161001cc54512571f2"}, - {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2fdef0d83a2d08d69b1f2210a93c416d54e14d9eb398f6ab2f0a209433db19e1"}, - {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8cf717ee42012be8c0cb205dbbf18ffa9003c4cbf4ad078db47b95e10748eec5"}, - {file = "coverage-7.6.4-cp312-cp312-win32.whl", hash = "sha256:7bb92c539a624cf86296dd0c68cd5cc286c9eef2d0c3b8b192b604ce9de20a17"}, - {file = "coverage-7.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:1032e178b76a4e2b5b32e19d0fd0abbce4b58e77a1ca695820d10e491fa32b08"}, - {file = "coverage-7.6.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:023bf8ee3ec6d35af9c1c6ccc1d18fa69afa1cb29eaac57cb064dbb262a517f9"}, - {file = "coverage-7.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0ac3d42cb51c4b12df9c5f0dd2f13a4f24f01943627120ec4d293c9181219ba"}, - {file = "coverage-7.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8fe4984b431f8621ca53d9380901f62bfb54ff759a1348cd140490ada7b693c"}, - {file = "coverage-7.6.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5fbd612f8a091954a0c8dd4c0b571b973487277d26476f8480bfa4b2a65b5d06"}, - {file = "coverage-7.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dacbc52de979f2823a819571f2e3a350a7e36b8cb7484cdb1e289bceaf35305f"}, - {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dab4d16dfef34b185032580e2f2f89253d302facba093d5fa9dbe04f569c4f4b"}, - {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:862264b12ebb65ad8d863d51f17758b1684560b66ab02770d4f0baf2ff75da21"}, - {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5beb1ee382ad32afe424097de57134175fea3faf847b9af002cc7895be4e2a5a"}, - {file = "coverage-7.6.4-cp313-cp313-win32.whl", hash = "sha256:bf20494da9653f6410213424f5f8ad0ed885e01f7e8e59811f572bdb20b8972e"}, - {file = "coverage-7.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:182e6cd5c040cec0a1c8d415a87b67ed01193ed9ad458ee427741c7d8513d963"}, - {file = "coverage-7.6.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a181e99301a0ae128493a24cfe5cfb5b488c4e0bf2f8702091473d033494d04f"}, - {file = "coverage-7.6.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:df57bdbeffe694e7842092c5e2e0bc80fff7f43379d465f932ef36f027179806"}, - {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bcd1069e710600e8e4cf27f65c90c7843fa8edfb4520fb0ccb88894cad08b11"}, - {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99b41d18e6b2a48ba949418db48159d7a2e81c5cc290fc934b7d2380515bd0e3"}, - {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6b1e54712ba3474f34b7ef7a41e65bd9037ad47916ccb1cc78769bae324c01a"}, - {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:53d202fd109416ce011578f321460795abfe10bb901b883cafd9b3ef851bacfc"}, - {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:c48167910a8f644671de9f2083a23630fbf7a1cb70ce939440cd3328e0919f70"}, - {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cc8ff50b50ce532de2fa7a7daae9dd12f0a699bfcd47f20945364e5c31799fef"}, - {file = "coverage-7.6.4-cp313-cp313t-win32.whl", hash = "sha256:b8d3a03d9bfcaf5b0141d07a88456bb6a4c3ce55c080712fec8418ef3610230e"}, - {file = "coverage-7.6.4-cp313-cp313t-win_amd64.whl", hash = "sha256:f3ddf056d3ebcf6ce47bdaf56142af51bb7fad09e4af310241e9db7a3a8022e1"}, - {file = "coverage-7.6.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9cb7fa111d21a6b55cbf633039f7bc2749e74932e3aa7cb7333f675a58a58bf3"}, - {file = "coverage-7.6.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:11a223a14e91a4693d2d0755c7a043db43d96a7450b4f356d506c2562c48642c"}, - {file = "coverage-7.6.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a413a096c4cbac202433c850ee43fa326d2e871b24554da8327b01632673a076"}, - {file = "coverage-7.6.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00a1d69c112ff5149cabe60d2e2ee948752c975d95f1e1096742e6077affd376"}, - {file = "coverage-7.6.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f76846299ba5c54d12c91d776d9605ae33f8ae2b9d1d3c3703cf2db1a67f2c0"}, - {file = "coverage-7.6.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fe439416eb6380de434886b00c859304338f8b19f6f54811984f3420a2e03858"}, - {file = "coverage-7.6.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0294ca37f1ba500667b1aef631e48d875ced93ad5e06fa665a3295bdd1d95111"}, - {file = "coverage-7.6.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6f01ba56b1c0e9d149f9ac85a2f999724895229eb36bd997b61e62999e9b0901"}, - {file = "coverage-7.6.4-cp39-cp39-win32.whl", hash = "sha256:bc66f0bf1d7730a17430a50163bb264ba9ded56739112368ba985ddaa9c3bd09"}, - {file = "coverage-7.6.4-cp39-cp39-win_amd64.whl", hash = "sha256:c481b47f6b5845064c65a7bc78bc0860e635a9b055af0df46fdf1c58cebf8e8f"}, - {file = "coverage-7.6.4-pp39.pp310-none-any.whl", hash = "sha256:3c65d37f3a9ebb703e710befdc489a38683a5b152242664b973a7b7b22348a4e"}, - {file = "coverage-7.6.4.tar.gz", hash = "sha256:29fc0f17b1d3fea332f8001d4558f8214af7f1d87a345f3a133c901d60347c73"}, + {file = "coverage-7.6.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:108bb458827765d538abcbf8288599fee07d2743357bdd9b9dad456c287e121e"}, + {file = "coverage-7.6.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c973b2fe4dc445cb865ab369df7521df9c27bf40715c837a113edaa2aa9faf45"}, + {file = "coverage-7.6.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c6b24007c4bcd0b19fac25763a7cac5035c735ae017e9a349b927cfc88f31c1"}, + {file = "coverage-7.6.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:acbb8af78f8f91b3b51f58f288c0994ba63c646bc1a8a22ad072e4e7e0a49f1c"}, + {file = "coverage-7.6.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad32a981bcdedb8d2ace03b05e4fd8dace8901eec64a532b00b15217d3677dd2"}, + {file = "coverage-7.6.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:34d23e28ccb26236718a3a78ba72744212aa383141961dd6825f6595005c8b06"}, + {file = "coverage-7.6.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e25bacb53a8c7325e34d45dddd2f2fbae0dbc230d0e2642e264a64e17322a777"}, + {file = "coverage-7.6.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:af05bbba896c4472a29408455fe31b3797b4d8648ed0a2ccac03e074a77e2314"}, + {file = "coverage-7.6.7-cp310-cp310-win32.whl", hash = "sha256:796c9b107d11d2d69e1849b2dfe41730134b526a49d3acb98ca02f4985eeff7a"}, + {file = "coverage-7.6.7-cp310-cp310-win_amd64.whl", hash = "sha256:987a8e3da7da4eed10a20491cf790589a8e5e07656b6dc22d3814c4d88faf163"}, + {file = "coverage-7.6.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7e61b0e77ff4dddebb35a0e8bb5a68bf0f8b872407d8d9f0c726b65dfabe2469"}, + {file = "coverage-7.6.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1a5407a75ca4abc20d6252efeb238377a71ce7bda849c26c7a9bece8680a5d99"}, + {file = "coverage-7.6.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df002e59f2d29e889c37abd0b9ee0d0e6e38c24f5f55d71ff0e09e3412a340ec"}, + {file = "coverage-7.6.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:673184b3156cba06154825f25af33baa2671ddae6343f23175764e65a8c4c30b"}, + {file = "coverage-7.6.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e69ad502f1a2243f739f5bd60565d14a278be58be4c137d90799f2c263e7049a"}, + {file = "coverage-7.6.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:60dcf7605c50ea72a14490d0756daffef77a5be15ed1b9fea468b1c7bda1bc3b"}, + {file = "coverage-7.6.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9c2eb378bebb2c8f65befcb5147877fc1c9fbc640fc0aad3add759b5df79d55d"}, + {file = "coverage-7.6.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3c0317288f032221d35fa4cbc35d9f4923ff0dfd176c79c9b356e8ef8ef2dff4"}, + {file = "coverage-7.6.7-cp311-cp311-win32.whl", hash = "sha256:951aade8297358f3618a6e0660dc74f6b52233c42089d28525749fc8267dccd2"}, + {file = "coverage-7.6.7-cp311-cp311-win_amd64.whl", hash = "sha256:5e444b8e88339a2a67ce07d41faabb1d60d1004820cee5a2c2b54e2d8e429a0f"}, + {file = "coverage-7.6.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f07ff574986bc3edb80e2c36391678a271d555f91fd1d332a1e0f4b5ea4b6ea9"}, + {file = "coverage-7.6.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:49ed5ee4109258973630c1f9d099c7e72c5c36605029f3a91fe9982c6076c82b"}, + {file = "coverage-7.6.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3e8796434a8106b3ac025fd15417315d7a58ee3e600ad4dbcfddc3f4b14342c"}, + {file = "coverage-7.6.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3b925300484a3294d1c70f6b2b810d6526f2929de954e5b6be2bf8caa1f12c1"}, + {file = "coverage-7.6.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c42ec2c522e3ddd683dec5cdce8e62817afb648caedad9da725001fa530d354"}, + {file = "coverage-7.6.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0266b62cbea568bd5e93a4da364d05de422110cbed5056d69339bd5af5685433"}, + {file = "coverage-7.6.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e5f2a0f161d126ccc7038f1f3029184dbdf8f018230af17ef6fd6a707a5b881f"}, + {file = "coverage-7.6.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c132b5a22821f9b143f87446805e13580b67c670a548b96da945a8f6b4f2efbb"}, + {file = "coverage-7.6.7-cp312-cp312-win32.whl", hash = "sha256:7c07de0d2a110f02af30883cd7dddbe704887617d5c27cf373362667445a4c76"}, + {file = "coverage-7.6.7-cp312-cp312-win_amd64.whl", hash = "sha256:fd49c01e5057a451c30c9b892948976f5d38f2cbd04dc556a82743ba8e27ed8c"}, + {file = "coverage-7.6.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:46f21663e358beae6b368429ffadf14ed0a329996248a847a4322fb2e35d64d3"}, + {file = "coverage-7.6.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:40cca284c7c310d622a1677f105e8507441d1bb7c226f41978ba7c86979609ab"}, + {file = "coverage-7.6.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77256ad2345c29fe59ae861aa11cfc74579c88d4e8dbf121cbe46b8e32aec808"}, + {file = "coverage-7.6.7-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87ea64b9fa52bf395272e54020537990a28078478167ade6c61da7ac04dc14bc"}, + {file = "coverage-7.6.7-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d608a7808793e3615e54e9267519351c3ae204a6d85764d8337bd95993581a8"}, + {file = "coverage-7.6.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdd94501d65adc5c24f8a1a0eda110452ba62b3f4aeaba01e021c1ed9cb8f34a"}, + {file = "coverage-7.6.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:82c809a62e953867cf57e0548c2b8464207f5f3a6ff0e1e961683e79b89f2c55"}, + {file = "coverage-7.6.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bb684694e99d0b791a43e9fc0fa58efc15ec357ac48d25b619f207c41f2fd384"}, + {file = "coverage-7.6.7-cp313-cp313-win32.whl", hash = "sha256:963e4a08cbb0af6623e61492c0ec4c0ec5c5cf74db5f6564f98248d27ee57d30"}, + {file = "coverage-7.6.7-cp313-cp313-win_amd64.whl", hash = "sha256:14045b8bfd5909196a90da145a37f9d335a5d988a83db34e80f41e965fb7cb42"}, + {file = "coverage-7.6.7-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:f2c7a045eef561e9544359a0bf5784b44e55cefc7261a20e730baa9220c83413"}, + {file = "coverage-7.6.7-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5dd4e4a49d9c72a38d18d641135d2fb0bdf7b726ca60a103836b3d00a1182acd"}, + {file = "coverage-7.6.7-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c95e0fa3d1547cb6f021ab72f5c23402da2358beec0a8e6d19a368bd7b0fb37"}, + {file = "coverage-7.6.7-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f63e21ed474edd23f7501f89b53280014436e383a14b9bd77a648366c81dce7b"}, + {file = "coverage-7.6.7-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ead9b9605c54d15be228687552916c89c9683c215370c4a44f1f217d2adcc34d"}, + {file = "coverage-7.6.7-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:0573f5cbf39114270842d01872952d301027d2d6e2d84013f30966313cadb529"}, + {file = "coverage-7.6.7-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:e2c8e3384c12dfa19fa9a52f23eb091a8fad93b5b81a41b14c17c78e23dd1d8b"}, + {file = "coverage-7.6.7-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:70a56a2ec1869e6e9fa69ef6b76b1a8a7ef709972b9cc473f9ce9d26b5997ce3"}, + {file = "coverage-7.6.7-cp313-cp313t-win32.whl", hash = "sha256:dbba8210f5067398b2c4d96b4e64d8fb943644d5eb70be0d989067c8ca40c0f8"}, + {file = "coverage-7.6.7-cp313-cp313t-win_amd64.whl", hash = "sha256:dfd14bcae0c94004baba5184d1c935ae0d1231b8409eb6c103a5fd75e8ecdc56"}, + {file = "coverage-7.6.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:37a15573f988b67f7348916077c6d8ad43adb75e478d0910957394df397d2874"}, + {file = "coverage-7.6.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b6cce5c76985f81da3769c52203ee94722cd5d5889731cd70d31fee939b74bf0"}, + {file = "coverage-7.6.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ab9763d291a17b527ac6fd11d1a9a9c358280adb320e9c2672a97af346ac2c"}, + {file = "coverage-7.6.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6cf96ceaa275f071f1bea3067f8fd43bec184a25a962c754024c973af871e1b7"}, + {file = "coverage-7.6.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aee9cf6b0134d6f932d219ce253ef0e624f4fa588ee64830fcba193269e4daa3"}, + {file = "coverage-7.6.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2bc3e45c16564cc72de09e37413262b9f99167803e5e48c6156bccdfb22c8327"}, + {file = "coverage-7.6.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:623e6965dcf4e28a3debaa6fcf4b99ee06d27218f46d43befe4db1c70841551c"}, + {file = "coverage-7.6.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:850cfd2d6fc26f8346f422920ac204e1d28814e32e3a58c19c91980fa74d8289"}, + {file = "coverage-7.6.7-cp39-cp39-win32.whl", hash = "sha256:c296263093f099da4f51b3dff1eff5d4959b527d4f2f419e16508c5da9e15e8c"}, + {file = "coverage-7.6.7-cp39-cp39-win_amd64.whl", hash = "sha256:90746521206c88bdb305a4bf3342b1b7316ab80f804d40c536fc7d329301ee13"}, + {file = "coverage-7.6.7-pp39.pp310-none-any.whl", hash = "sha256:0ddcb70b3a3a57581b450571b31cb774f23eb9519c2aaa6176d3a84c9fc57671"}, + {file = "coverage-7.6.7.tar.gz", hash = "sha256:d79d4826e41441c9a118ff045e4bccb9fdbdcb1d02413e7ea6eb5c87b5439d24"}, ] [package.dependencies] @@ -803,70 +803,70 @@ test = ["objgraph", "psutil"] [[package]] name = "grpcio" -version = "1.67.0" +version = "1.68.0" description = "HTTP/2-based RPC framework" optional = false python-versions = ">=3.8" files = [ - {file = "grpcio-1.67.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:bd79929b3bb96b54df1296cd3bf4d2b770bd1df6c2bdf549b49bab286b925cdc"}, - {file = "grpcio-1.67.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:16724ffc956ea42967f5758c2f043faef43cb7e48a51948ab593570570d1e68b"}, - {file = "grpcio-1.67.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:2b7183c80b602b0ad816315d66f2fb7887614ead950416d60913a9a71c12560d"}, - {file = "grpcio-1.67.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:efe32b45dd6d118f5ea2e5deaed417d8a14976325c93812dd831908522b402c9"}, - {file = "grpcio-1.67.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe89295219b9c9e47780a0f1c75ca44211e706d1c598242249fe717af3385ec8"}, - {file = "grpcio-1.67.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa8d025fae1595a207b4e47c2e087cb88d47008494db258ac561c00877d4c8f8"}, - {file = "grpcio-1.67.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f95e15db43e75a534420e04822df91f645664bf4ad21dfaad7d51773c80e6bb4"}, - {file = "grpcio-1.67.0-cp310-cp310-win32.whl", hash = "sha256:a6b9a5c18863fd4b6624a42e2712103fb0f57799a3b29651c0e5b8119a519d65"}, - {file = "grpcio-1.67.0-cp310-cp310-win_amd64.whl", hash = "sha256:b6eb68493a05d38b426604e1dc93bfc0137c4157f7ab4fac5771fd9a104bbaa6"}, - {file = "grpcio-1.67.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:e91d154689639932305b6ea6f45c6e46bb51ecc8ea77c10ef25aa77f75443ad4"}, - {file = "grpcio-1.67.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cb204a742997277da678611a809a8409657b1398aaeebf73b3d9563b7d154c13"}, - {file = "grpcio-1.67.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:ae6de510f670137e755eb2a74b04d1041e7210af2444103c8c95f193340d17ee"}, - {file = "grpcio-1.67.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74b900566bdf68241118f2918d312d3bf554b2ce0b12b90178091ea7d0a17b3d"}, - {file = "grpcio-1.67.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4e95e43447a02aa603abcc6b5e727d093d161a869c83b073f50b9390ecf0fa8"}, - {file = "grpcio-1.67.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0bb94e66cd8f0baf29bd3184b6aa09aeb1a660f9ec3d85da615c5003154bc2bf"}, - {file = "grpcio-1.67.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:82e5bd4b67b17c8c597273663794a6a46a45e44165b960517fe6d8a2f7f16d23"}, - {file = "grpcio-1.67.0-cp311-cp311-win32.whl", hash = "sha256:7fc1d2b9fd549264ae585026b266ac2db53735510a207381be509c315b4af4e8"}, - {file = "grpcio-1.67.0-cp311-cp311-win_amd64.whl", hash = "sha256:ac11ecb34a86b831239cc38245403a8de25037b448464f95c3315819e7519772"}, - {file = "grpcio-1.67.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:227316b5631260e0bef8a3ce04fa7db4cc81756fea1258b007950b6efc90c05d"}, - {file = "grpcio-1.67.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d90cfdafcf4b45a7a076e3e2a58e7bc3d59c698c4f6470b0bb13a4d869cf2273"}, - {file = "grpcio-1.67.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:77196216d5dd6f99af1c51e235af2dd339159f657280e65ce7e12c1a8feffd1d"}, - {file = "grpcio-1.67.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15c05a26a0f7047f720da41dc49406b395c1470eef44ff7e2c506a47ac2c0591"}, - {file = "grpcio-1.67.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3840994689cc8cbb73d60485c594424ad8adb56c71a30d8948d6453083624b52"}, - {file = "grpcio-1.67.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:5a1e03c3102b6451028d5dc9f8591131d6ab3c8a0e023d94c28cb930ed4b5f81"}, - {file = "grpcio-1.67.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:682968427a63d898759474e3b3178d42546e878fdce034fd7474ef75143b64e3"}, - {file = "grpcio-1.67.0-cp312-cp312-win32.whl", hash = "sha256:d01793653248f49cf47e5695e0a79805b1d9d4eacef85b310118ba1dfcd1b955"}, - {file = "grpcio-1.67.0-cp312-cp312-win_amd64.whl", hash = "sha256:985b2686f786f3e20326c4367eebdaed3e7aa65848260ff0c6644f817042cb15"}, - {file = "grpcio-1.67.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:8c9a35b8bc50db35ab8e3e02a4f2a35cfba46c8705c3911c34ce343bd777813a"}, - {file = "grpcio-1.67.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:42199e704095b62688998c2d84c89e59a26a7d5d32eed86d43dc90e7a3bd04aa"}, - {file = "grpcio-1.67.0-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:c4c425f440fb81f8d0237c07b9322fc0fb6ee2b29fbef5f62a322ff8fcce240d"}, - {file = "grpcio-1.67.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:323741b6699cd2b04a71cb38f502db98f90532e8a40cb675393d248126a268af"}, - {file = "grpcio-1.67.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:662c8e105c5e5cee0317d500eb186ed7a93229586e431c1bf0c9236c2407352c"}, - {file = "grpcio-1.67.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:f6bd2ab135c64a4d1e9e44679a616c9bc944547357c830fafea5c3caa3de5153"}, - {file = "grpcio-1.67.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:2f55c1e0e2ae9bdd23b3c63459ee4c06d223b68aeb1961d83c48fb63dc29bc03"}, - {file = "grpcio-1.67.0-cp313-cp313-win32.whl", hash = "sha256:fd6bc27861e460fe28e94226e3673d46e294ca4673d46b224428d197c5935e69"}, - {file = "grpcio-1.67.0-cp313-cp313-win_amd64.whl", hash = "sha256:cf51d28063338608cd8d3cd64677e922134837902b70ce00dad7f116e3998210"}, - {file = "grpcio-1.67.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:7f200aca719c1c5dc72ab68be3479b9dafccdf03df530d137632c534bb6f1ee3"}, - {file = "grpcio-1.67.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0892dd200ece4822d72dd0952f7112c542a487fc48fe77568deaaa399c1e717d"}, - {file = "grpcio-1.67.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:f4d613fbf868b2e2444f490d18af472ccb47660ea3df52f068c9c8801e1f3e85"}, - {file = "grpcio-1.67.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c69bf11894cad9da00047f46584d5758d6ebc9b5950c0dc96fec7e0bce5cde9"}, - {file = "grpcio-1.67.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9bca3ca0c5e74dea44bf57d27e15a3a3996ce7e5780d61b7c72386356d231db"}, - {file = "grpcio-1.67.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:014dfc020e28a0d9be7e93a91f85ff9f4a87158b7df9952fe23cc42d29d31e1e"}, - {file = "grpcio-1.67.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d4ea4509d42c6797539e9ec7496c15473177ce9abc89bc5c71e7abe50fc25737"}, - {file = "grpcio-1.67.0-cp38-cp38-win32.whl", hash = "sha256:9d75641a2fca9ae1ae86454fd25d4c298ea8cc195dbc962852234d54a07060ad"}, - {file = "grpcio-1.67.0-cp38-cp38-win_amd64.whl", hash = "sha256:cff8e54d6a463883cda2fab94d2062aad2f5edd7f06ae3ed030f2a74756db365"}, - {file = "grpcio-1.67.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:62492bd534979e6d7127b8a6b29093161a742dee3875873e01964049d5250a74"}, - {file = "grpcio-1.67.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eef1dce9d1a46119fd09f9a992cf6ab9d9178b696382439446ca5f399d7b96fe"}, - {file = "grpcio-1.67.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:f623c57a5321461c84498a99dddf9d13dac0e40ee056d884d6ec4ebcab647a78"}, - {file = "grpcio-1.67.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54d16383044e681f8beb50f905249e4e7261dd169d4aaf6e52eab67b01cbbbe2"}, - {file = "grpcio-1.67.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2a44e572fb762c668e4812156b81835f7aba8a721b027e2d4bb29fb50ff4d33"}, - {file = "grpcio-1.67.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:391df8b0faac84d42f5b8dfc65f5152c48ed914e13c522fd05f2aca211f8bfad"}, - {file = "grpcio-1.67.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cfd9306511fdfc623a1ba1dc3bc07fbd24e6cfbe3c28b4d1e05177baa2f99617"}, - {file = "grpcio-1.67.0-cp39-cp39-win32.whl", hash = "sha256:30d47dbacfd20cbd0c8be9bfa52fdb833b395d4ec32fe5cff7220afc05d08571"}, - {file = "grpcio-1.67.0-cp39-cp39-win_amd64.whl", hash = "sha256:f55f077685f61f0fbd06ea355142b71e47e4a26d2d678b3ba27248abfe67163a"}, - {file = "grpcio-1.67.0.tar.gz", hash = "sha256:e090b2553e0da1c875449c8e75073dd4415dd71c9bde6a406240fdf4c0ee467c"}, -] - -[package.extras] -protobuf = ["grpcio-tools (>=1.67.0)"] + {file = "grpcio-1.68.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:619b5d0f29f4f5351440e9343224c3e19912c21aeda44e0c49d0d147a8d01544"}, + {file = "grpcio-1.68.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:a59f5822f9459bed098ffbceb2713abbf7c6fd13f2b9243461da5c338d0cd6c3"}, + {file = "grpcio-1.68.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:c03d89df516128febc5a7e760d675b478ba25802447624edf7aa13b1e7b11e2a"}, + {file = "grpcio-1.68.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44bcbebb24363d587472089b89e2ea0ab2e2b4df0e4856ba4c0b087c82412121"}, + {file = "grpcio-1.68.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79f81b7fbfb136247b70465bd836fa1733043fdee539cd6031cb499e9608a110"}, + {file = "grpcio-1.68.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:88fb2925789cfe6daa20900260ef0a1d0a61283dfb2d2fffe6194396a354c618"}, + {file = "grpcio-1.68.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:99f06232b5c9138593ae6f2e355054318717d32a9c09cdc5a2885540835067a1"}, + {file = "grpcio-1.68.0-cp310-cp310-win32.whl", hash = "sha256:a6213d2f7a22c3c30a479fb5e249b6b7e648e17f364598ff64d08a5136fe488b"}, + {file = "grpcio-1.68.0-cp310-cp310-win_amd64.whl", hash = "sha256:15327ab81131ef9b94cb9f45b5bd98803a179c7c61205c8c0ac9aff9d6c4e82a"}, + {file = "grpcio-1.68.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:3b2b559beb2d433129441783e5f42e3be40a9e1a89ec906efabf26591c5cd415"}, + {file = "grpcio-1.68.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e46541de8425a4d6829ac6c5d9b16c03c292105fe9ebf78cb1c31e8d242f9155"}, + {file = "grpcio-1.68.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:c1245651f3c9ea92a2db4f95d37b7597db6b246d5892bca6ee8c0e90d76fb73c"}, + {file = "grpcio-1.68.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f1931c7aa85be0fa6cea6af388e576f3bf6baee9e5d481c586980c774debcb4"}, + {file = "grpcio-1.68.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b0ff09c81e3aded7a183bc6473639b46b6caa9c1901d6f5e2cba24b95e59e30"}, + {file = "grpcio-1.68.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8c73f9fbbaee1a132487e31585aa83987ddf626426d703ebcb9a528cf231c9b1"}, + {file = "grpcio-1.68.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6b2f98165ea2790ea159393a2246b56f580d24d7da0d0342c18a085299c40a75"}, + {file = "grpcio-1.68.0-cp311-cp311-win32.whl", hash = "sha256:e1e7ed311afb351ff0d0e583a66fcb39675be112d61e7cfd6c8269884a98afbc"}, + {file = "grpcio-1.68.0-cp311-cp311-win_amd64.whl", hash = "sha256:e0d2f68eaa0a755edd9a47d40e50dba6df2bceda66960dee1218da81a2834d27"}, + {file = "grpcio-1.68.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:8af6137cc4ae8e421690d276e7627cfc726d4293f6607acf9ea7260bd8fc3d7d"}, + {file = "grpcio-1.68.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4028b8e9a3bff6f377698587d642e24bd221810c06579a18420a17688e421af7"}, + {file = "grpcio-1.68.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:f60fa2adf281fd73ae3a50677572521edca34ba373a45b457b5ebe87c2d01e1d"}, + {file = "grpcio-1.68.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e18589e747c1e70b60fab6767ff99b2d0c359ea1db8a2cb524477f93cdbedf5b"}, + {file = "grpcio-1.68.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0d30f3fee9372796f54d3100b31ee70972eaadcc87314be369360248a3dcffe"}, + {file = "grpcio-1.68.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:7e0a3e72c0e9a1acab77bef14a73a416630b7fd2cbd893c0a873edc47c42c8cd"}, + {file = "grpcio-1.68.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a831dcc343440969aaa812004685ed322cdb526cd197112d0db303b0da1e8659"}, + {file = "grpcio-1.68.0-cp312-cp312-win32.whl", hash = "sha256:5a180328e92b9a0050958ced34dddcb86fec5a8b332f5a229e353dafc16cd332"}, + {file = "grpcio-1.68.0-cp312-cp312-win_amd64.whl", hash = "sha256:2bddd04a790b69f7a7385f6a112f46ea0b34c4746f361ebafe9ca0be567c78e9"}, + {file = "grpcio-1.68.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:fc05759ffbd7875e0ff2bd877be1438dfe97c9312bbc558c8284a9afa1d0f40e"}, + {file = "grpcio-1.68.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:15fa1fe25d365a13bc6d52fcac0e3ee1f9baebdde2c9b3b2425f8a4979fccea1"}, + {file = "grpcio-1.68.0-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:32a9cb4686eb2e89d97022ecb9e1606d132f85c444354c17a7dbde4a455e4a3b"}, + {file = "grpcio-1.68.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dba037ff8d284c8e7ea9a510c8ae0f5b016004f13c3648f72411c464b67ff2fb"}, + {file = "grpcio-1.68.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0efbbd849867e0e569af09e165363ade75cf84f5229b2698d53cf22c7a4f9e21"}, + {file = "grpcio-1.68.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:4e300e6978df0b65cc2d100c54e097c10dfc7018b9bd890bbbf08022d47f766d"}, + {file = "grpcio-1.68.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:6f9c7ad1a23e1047f827385f4713b5b8c6c7d325705be1dd3e31fb00dcb2f665"}, + {file = "grpcio-1.68.0-cp313-cp313-win32.whl", hash = "sha256:3ac7f10850fd0487fcce169c3c55509101c3bde2a3b454869639df2176b60a03"}, + {file = "grpcio-1.68.0-cp313-cp313-win_amd64.whl", hash = "sha256:afbf45a62ba85a720491bfe9b2642f8761ff348006f5ef67e4622621f116b04a"}, + {file = "grpcio-1.68.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:f8f695d9576ce836eab27ba7401c60acaf9ef6cf2f70dfe5462055ba3df02cc3"}, + {file = "grpcio-1.68.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9fe1b141cda52f2ca73e17d2d3c6a9f3f3a0c255c216b50ce616e9dca7e3441d"}, + {file = "grpcio-1.68.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:4df81d78fd1646bf94ced4fb4cd0a7fe2e91608089c522ef17bc7db26e64effd"}, + {file = "grpcio-1.68.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:46a2d74d4dd8993151c6cd585594c082abe74112c8e4175ddda4106f2ceb022f"}, + {file = "grpcio-1.68.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a17278d977746472698460c63abf333e1d806bd41f2224f90dbe9460101c9796"}, + {file = "grpcio-1.68.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:15377bce516b1c861c35e18eaa1c280692bf563264836cece693c0f169b48829"}, + {file = "grpcio-1.68.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cc5f0a4f5904b8c25729a0498886b797feb817d1fd3812554ffa39551112c161"}, + {file = "grpcio-1.68.0-cp38-cp38-win32.whl", hash = "sha256:def1a60a111d24376e4b753db39705adbe9483ef4ca4761f825639d884d5da78"}, + {file = "grpcio-1.68.0-cp38-cp38-win_amd64.whl", hash = "sha256:55d3b52fd41ec5772a953612db4e70ae741a6d6ed640c4c89a64f017a1ac02b5"}, + {file = "grpcio-1.68.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:0d230852ba97654453d290e98d6aa61cb48fa5fafb474fb4c4298d8721809354"}, + {file = "grpcio-1.68.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:50992f214264e207e07222703c17d9cfdcc2c46ed5a1ea86843d440148ebbe10"}, + {file = "grpcio-1.68.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:14331e5c27ed3545360464a139ed279aa09db088f6e9502e95ad4bfa852bb116"}, + {file = "grpcio-1.68.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f84890b205692ea813653ece4ac9afa2139eae136e419231b0eec7c39fdbe4c2"}, + {file = "grpcio-1.68.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0cf343c6f4f6aa44863e13ec9ddfe299e0be68f87d68e777328bff785897b05"}, + {file = "grpcio-1.68.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:fd2c2d47969daa0e27eadaf15c13b5e92605c5e5953d23c06d0b5239a2f176d3"}, + {file = "grpcio-1.68.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:18668e36e7f4045820f069997834e94e8275910b1f03e078a6020bd464cb2363"}, + {file = "grpcio-1.68.0-cp39-cp39-win32.whl", hash = "sha256:2af76ab7c427aaa26aa9187c3e3c42f38d3771f91a20f99657d992afada2294a"}, + {file = "grpcio-1.68.0-cp39-cp39-win_amd64.whl", hash = "sha256:e694b5928b7b33ca2d3b4d5f9bf8b5888906f181daff6b406f4938f3a997a490"}, + {file = "grpcio-1.68.0.tar.gz", hash = "sha256:7e7483d39b4a4fddb9906671e9ea21aaad4f031cdfc349fec76bdfa1e404543a"}, +] + +[package.extras] +protobuf = ["grpcio-tools (>=1.68.0)"] [[package]] name = "h11" @@ -919,13 +919,13 @@ numpy = ">=1.19.3" [[package]] name = "httpcore" -version = "1.0.6" +version = "1.0.7" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "httpcore-1.0.6-py3-none-any.whl", hash = "sha256:27b59625743b85577a8c0e10e55b50b5368a4f2cfe8cc7bcfa9cf00829c2682f"}, - {file = "httpcore-1.0.6.tar.gz", hash = "sha256:73f6dbd6eb8c21bbf7ef8efad555481853f5f6acdeaff1edb0694289269ee17f"}, + {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"}, + {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"}, ] [package.dependencies] @@ -1020,13 +1020,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "identify" -version = "2.6.1" +version = "2.6.2" description = "File identification library for Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "identify-2.6.1-py2.py3-none-any.whl", hash = "sha256:53863bcac7caf8d2ed85bd20312ea5dcfc22226800f6d6881f232d861db5a8f0"}, - {file = "identify-2.6.1.tar.gz", hash = "sha256:91478c5fb7c3aac5ff7bf9b4344f803843dc586832d5f110d672b19aa1984c98"}, + {file = "identify-2.6.2-py2.py3-none-any.whl", hash = "sha256:c097384259f49e372f4ea00a19719d95ae27dd5ff0fd77ad630aa891306b82f3"}, + {file = "identify-2.6.2.tar.gz", hash = "sha256:fab5c716c24d7a789775228823797296a2994b075fb6080ac83a102772a98cbd"}, ] [package.extras] @@ -1133,22 +1133,22 @@ colors = ["colorama (>=0.4.6)"] [[package]] name = "jedi" -version = "0.19.1" +version = "0.19.2" description = "An autocompletion tool for Python that can be used for text editors." optional = false python-versions = ">=3.6" files = [ - {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, - {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, + {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, + {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, ] [package.dependencies] -parso = ">=0.8.3,<0.9.0" +parso = ">=0.8.4,<0.9.0" [package.extras] docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] -testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<9.0.0)"] [[package]] name = "jinja2" @@ -1332,13 +1332,13 @@ files = [ [[package]] name = "marshmallow" -version = "3.23.0" +version = "3.23.1" description = "A lightweight library for converting complex datatypes to and from native Python datatypes." optional = false python-versions = ">=3.9" files = [ - {file = "marshmallow-3.23.0-py3-none-any.whl", hash = "sha256:82f20a2397834fe6d9611b241f2f7e7b680ed89c49f84728a1ad937be6b4bdf4"}, - {file = "marshmallow-3.23.0.tar.gz", hash = "sha256:98d8827a9f10c03d44ead298d2e99c6aea8197df18ccfad360dae7f89a50da2e"}, + {file = "marshmallow-3.23.1-py3-none-any.whl", hash = "sha256:fece2eb2c941180ea1b7fcbd4a83c51bfdd50093fdd3ad2585ee5e1df2508491"}, + {file = "marshmallow-3.23.1.tar.gz", hash = "sha256:3a8dfda6edd8dcdbf216c0ede1d1e78d230a6dc9c5a088f58c4083b974a0d468"}, ] [package.dependencies] @@ -1346,7 +1346,7 @@ packaging = ">=17.0" [package.extras] dev = ["marshmallow[tests]", "pre-commit (>=3.5,<5.0)", "tox"] -docs = ["alabaster (==1.0.0)", "autodocsumm (==0.2.13)", "sphinx (==8.1.3)", "sphinx-issues (==5.0.0)", "sphinx-version-warning (==1.1.2)"] +docs = ["alabaster (==1.0.0)", "autodocsumm (==0.2.14)", "sphinx (==8.1.3)", "sphinx-issues (==5.0.0)", "sphinx-version-warning (==1.1.2)"] tests = ["pytest", "simplejson"] [[package]] @@ -1404,8 +1404,8 @@ files = [ numpy = [ {version = ">=1.21.2", markers = "python_version >= \"3.10\" and python_version < \"3.11\""}, {version = ">1.20", markers = "python_version < \"3.10\""}, - {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, {version = ">=1.23.3", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, ] [package.extras] @@ -1692,99 +1692,99 @@ files = [ [[package]] name = "optree" -version = "0.13.0" +version = "0.13.1" description = "Optimized PyTree Utilities." optional = false python-versions = ">=3.7" files = [ - {file = "optree-0.13.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7b8fe0442ac5e50b5e6bceb37dcc2cd4908e7716b869cbe6b8901cc0b489884f"}, - {file = "optree-0.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1a1aab34de5ac7673fbfb94266bf10482be51985c7f899c3e767ce19d13ce3b4"}, - {file = "optree-0.13.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2c79961d5afeb20557c30a0ae899d14ff58cdf1c0e2c8aa3d6807600d00f619"}, - {file = "optree-0.13.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb55eb77541cf280a009829280d5844936dc8a2e4a3eb069c010a1f547dbfe97"}, - {file = "optree-0.13.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44449e3bc5e7530b50c9a1f5bcf2971ffe317e34edd74d8c9778c5d32078114d"}, - {file = "optree-0.13.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b4195a6ba2052c70bac6d73f19aa69644424c5a30fa09f7319cc1b59e15acb6"}, - {file = "optree-0.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7fecc701ece0500fe38fc671b5704d904e2dca9a9284b35263b0bd7e5c62527"}, - {file = "optree-0.13.0-cp310-cp310-win32.whl", hash = "sha256:46a9e66217fdf421e25c133089c94f8f99bc38a2b5a4a2c0c1e0c1b02b01dda4"}, - {file = "optree-0.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:ef68fdcb3b1743a46210f3c888cd15668a07422aa10b4d4130ba512aac595bf7"}, - {file = "optree-0.13.0-cp310-cp310-win_arm64.whl", hash = "sha256:d12a5665169abceb878d50b55571d6a7690bf97aaaf9a7f5438b10e474fde3f2"}, - {file = "optree-0.13.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:92d1c34b6022bedee4b3899f3a9a1105777da11a9abf1a51f4d84bed8f037fa1"}, - {file = "optree-0.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d05c320af21efbc132fe887640f7a2dbb36cfb38af6d4e62396fe104b78f7b72"}, - {file = "optree-0.13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a53ae0a0eb128a69a74db4165e7e5f24d54e2711678622198f7073dcb991962f"}, - {file = "optree-0.13.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89f08fc3724b2fe7a081b69dfd3ad6625960443e1f61a984cae7c627776f12f4"}, - {file = "optree-0.13.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f22f4e46d85f24b5bc49e68043dd754b258b880ac64d72f4f4b9ac1b11f0fb2f"}, - {file = "optree-0.13.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbc884f3eab894126398c120b7f92a72a5b9f92db6d8c27d39087da871c642cd"}, - {file = "optree-0.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c58b94669c9072d645e02c0c65c7455f8f136ef8f7b56a5d9123847421f95b"}, - {file = "optree-0.13.0-cp311-cp311-win32.whl", hash = "sha256:54be625517ef3cf52905da7fee63795b2f154dbdb02b37e8cfd63e7fb2f266ea"}, - {file = "optree-0.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:e3d100890a643e12f39de4226ab4f9d0a22842b4f34ae2964d0149419e4d7aff"}, - {file = "optree-0.13.0-cp311-cp311-win_arm64.whl", hash = "sha256:cb8d9a2cebc5fadde98773bb27809a72ff01d11f1037cb58f8e71e740586223e"}, - {file = "optree-0.13.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:abeb8acc83d168063b70168ccf8dfd55f5a7ce50f9af2ca025c41285781ecdd4"}, - {file = "optree-0.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4771266f05e99e94312add38d45bf97a4d98449aeab100f5c658c521152eb5e5"}, - {file = "optree-0.13.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc95c1d0c7acd534184bf3ba243a454e0942e4a7c8b9edd32d939fc15e33d753"}, - {file = "optree-0.13.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e48491e042f956d4232ebc138e07074100878c0080e3ba10af4c2db1ba4df9f"}, - {file = "optree-0.13.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8e001d9c902e98912503eca66c93d4b4b22f5071e4ab777f4db9e140f35288f4"}, - {file = "optree-0.13.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87870346278f46a8c22866ff48716590be35b4aea16e1373e695fb6442c28c41"}, - {file = "optree-0.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7797c54a35e9d89b4664ec7d542745b87b5ffa9c1201c1062fdcd488eb583390"}, - {file = "optree-0.13.0-cp312-cp312-win32.whl", hash = "sha256:fc90a5373c92f4a9babb4c40fe148516f52160c0ba803bc9b2f936367f2f7437"}, - {file = "optree-0.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:1bc65743e8edb29e902cab894d1c4665a8fd6f8d10f75db68a2cef6c7246fa5c"}, - {file = "optree-0.13.0-cp312-cp312-win_arm64.whl", hash = "sha256:de2729e1e4ae47a07ac3c70ff977ed1ebe19e7b44d5089075c94f7a9a2dc6f4f"}, - {file = "optree-0.13.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dda6efabd0621f53eb46a3789ec89c6fd2c90dfb57aebfce3fcda6eab9ed6a7e"}, - {file = "optree-0.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5de8da9bbdd08b6200244ee818cd15d1da0f2b06ac926dba0e686260bac7fd40"}, - {file = "optree-0.13.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca1e4854134023ba687a7abf45ed3355f773ca7198b6895d88a89030446a9f2e"}, - {file = "optree-0.13.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1ac5343e921ce21f8f10f91158ad6404a1488c1cc22ddfa6b34cfb9d997cebd"}, - {file = "optree-0.13.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e282212ddf3aafb10ca6ca223772e06ea3c31687c9cae192467b8e0a7dafbfc"}, - {file = "optree-0.13.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24fcd4cb659bcd9b675bc3401950de891b32a047c4787857fb870cd515fcc315"}, - {file = "optree-0.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d735a7d2d2e2eb9a88d932d35b335c10fae9038034f381b6d437dafed46497e"}, - {file = "optree-0.13.0-cp313-cp313-win32.whl", hash = "sha256:ef01e79224f0ee6cf2ca642884f0bc04e446227b96dc576c312717eb33552d57"}, - {file = "optree-0.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:d3f61fb669b36c1a714346b18c9c488ad33a58049b7b229785c241de18c005d7"}, - {file = "optree-0.13.0-cp313-cp313-win_arm64.whl", hash = "sha256:695b3f1aab50519230e3d8d86abaedaadf91af105b569cce3b8ebe0dc612b312"}, - {file = "optree-0.13.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:1318434b0740a2325c197e191e6dd53d9df0a8ac0338c67d58b476aad9d07829"}, - {file = "optree-0.13.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d58c6e8d4c4fa4e0c31bc4b876960ccba94eb5fcfb045f2b064ce55707034be9"}, - {file = "optree-0.13.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6a290ba771cc9004f9fc194d23ab11ee4aae71550ca874c3dc985af5b5f910b"}, - {file = "optree-0.13.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c95488ecbab2916de094e68f2a2c55c9475b2e979c03d91a6cd3565f9e5ff2f9"}, - {file = "optree-0.13.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f76a65ff322b3d47af2a23f60409d6d8f184804da551c734e355834e69c0dfb"}, - {file = "optree-0.13.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:58cc303f982fb0f23644b7f8e98b4f64b0d031365fcc2284da896e96493176d2"}, - {file = "optree-0.13.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6866b6e4154303dc7c48c7ca3b867a8ce31d469334b67976dfc0513455aa1ca0"}, - {file = "optree-0.13.0-cp313-cp313t-win32.whl", hash = "sha256:f5ce67f81fe3d7ca5fed8fdaf93a762a63e1d125e20e425ca7200f9e54a3e3a6"}, - {file = "optree-0.13.0-cp313-cp313t-win_amd64.whl", hash = "sha256:0008cd39169c1fc10870528b2decfea8b79e61042c12d65a964f3b1cf41cc37d"}, - {file = "optree-0.13.0-cp313-cp313t-win_arm64.whl", hash = "sha256:539962675b547957c64b52b7f82178febb9c0f2d47438b810bbc23cfdcf84821"}, - {file = "optree-0.13.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b08e4873814d11aa25ef3927c848b9e5cf21215b925e83875b9fe11c7a035b0e"}, - {file = "optree-0.13.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6e236c6601480997c6e1dbbd4ab2b7ea0bc82a9a7baa1f681a1b072c9c02677"}, - {file = "optree-0.13.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:557b415b41006cca88d86ad190b795455e9334d3cf5838e63c4c668a65227ccb"}, - {file = "optree-0.13.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11b78c8a18894fe9503515d073a60ebaed366aeb3cfa65e61e7e71ae833f640b"}, - {file = "optree-0.13.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4207f6fa0bd4730f5496772c139f1444b2b69e4eeb0f454e2100b5a380648f70"}, - {file = "optree-0.13.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe9fd84b7d87f365f720699dedd254882ba7e5ef927d3ba1e13413d45963b691"}, - {file = "optree-0.13.0-cp37-cp37m-win32.whl", hash = "sha256:c0f9f250f617f114061ab718d460be6be8e0a1cbbfdbbfb5541ed1c8fefee150"}, - {file = "optree-0.13.0-cp37-cp37m-win_amd64.whl", hash = "sha256:5cf612aefe0201a2995763cce82b9cd03cbddd2bfd6f8975f910c091dfa7bb5f"}, - {file = "optree-0.13.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:46623259b10f6e3565ea0d37e0b313feb20484bccb005459b3504e1aa706b730"}, - {file = "optree-0.13.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e7f9184c6040365e79a0b900507c289b6a4e06ade3c9691e501d176d5cf775cf"}, - {file = "optree-0.13.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6201c065791422a73d5aeb4916e00879de9b097cf54526f82b5b3c297126d938"}, - {file = "optree-0.13.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a423897010c6d8490097671d907da1b6ee90d3fa783aaad5e36e46e0a73bc5e"}, - {file = "optree-0.13.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1fb74282fce108e07972e88dbc23f6b7650c2d3bbddbedc2002d3e0becb1c452"}, - {file = "optree-0.13.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94ecab158521225b20e44d67c8afc2d9af6760985a9f489d21bf2aa8bbe467f8"}, - {file = "optree-0.13.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8244d0fbfe1ef15ffb443f3d32a44aff062adbef0a7fd6db3f011999df966223"}, - {file = "optree-0.13.0-cp38-cp38-win32.whl", hash = "sha256:0a34c11d637cb01217828e28eef382c621c9ec53f981d8ccbfe56e0a11cda501"}, - {file = "optree-0.13.0-cp38-cp38-win_amd64.whl", hash = "sha256:ebe56c17bf3754335307b17be7f554c5eae47acf738471cf38dba0ec73a42c37"}, - {file = "optree-0.13.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e9c619a49984212e5f757e10d5e5f95888b0c08d67a7f2b9f395cede30712dc2"}, - {file = "optree-0.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:50a9e2d9ffff99d45b37289a3422ed3723a45225616f5b48cea606ff0f539c0f"}, - {file = "optree-0.13.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d702dbcafcd16e8925e30c0e780ab3dc81450e19008fd3e77494111fc161a2b2"}, - {file = "optree-0.13.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9f44a58f87059161f300e2be66ad3878fff540d27f5dcd69b21feae65c243a02"}, - {file = "optree-0.13.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:954899edc024f13079932418f59bbdadabc52d9dcb49c7b559c382c7be352dfc"}, - {file = "optree-0.13.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c736ce6f4b8857bd171f3682ef849e3d67692c3fc4db42b99c5d2c7cc1bdf11"}, - {file = "optree-0.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7941d3bd48d860d0e17ca24827b5233ea27bb4227e822eafb3897df1f43f8342"}, - {file = "optree-0.13.0-cp39-cp39-win32.whl", hash = "sha256:9f6fc47c9b10d1a9e77163ebd6f2e251af41fab895475d2ce9643423a41899af"}, - {file = "optree-0.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:246020f0be50fb66791d8a25c4acb59ad0b4bbdea71c998e375eba4c58fbc3e0"}, - {file = "optree-0.13.0-cp39-cp39-win_arm64.whl", hash = "sha256:069bf166b7aa48ccf8dfe76b920d2115dd8261107c7895d02500b2ce39621b40"}, - {file = "optree-0.13.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:496170a3d093a7fb69be7ce847f5b5b3aa30a6da81457ba6b54268e6e97c6b13"}, - {file = "optree-0.13.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73543a82be71c041d5b169754089a58d02063eb72ac8688533b6fc26ab6beea8"}, - {file = "optree-0.13.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:278e2c620df99f5b1477b375b01cf9658528fa0332c0bc431d3ec65857244094"}, - {file = "optree-0.13.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36b32155dce29edb6f63a99a44d6da2d8fcd1c56353cc2f4af65f793a0b2712f"}, - {file = "optree-0.13.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c98a43204841cc4698155acb523d7b21a78f8b05666704359e0fddecd5d1043d"}, - {file = "optree-0.13.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:5c2803d4ef257f2599cffd0e9d60cfb3d4c522abbe8f5a839bd48d8edd26dae7"}, - {file = "optree-0.13.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac3b454f98d28a89c15a1170e771c61902cbc53eed126db36138b684dba5a729"}, - {file = "optree-0.13.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b74afed3db289228e0f95a8909835365f644eb69ff31cd6c0b45608ca9e56d78"}, - {file = "optree-0.13.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc3cebfd7d0826d223662f01ed0fa25932edf3f62479be13c4d6ff0fab090c34"}, - {file = "optree-0.13.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:5703637ede6fba04cbeabbb47aada7d17606c2d4df73305063f4a3c829c21fc7"}, - {file = "optree-0.13.0.tar.gz", hash = "sha256:1ea493cde8c60f7950ccbd682bd67e787bf67ed2251d6d3e9ad7471b72d37538"}, + {file = "optree-0.13.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f8e2a546cecc5077ec7d4fe24ec8aede43ca8555b832d115f1ebbb4f3b35bc78"}, + {file = "optree-0.13.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a3058e2d6a6a7d6362d40f7826258204d9fc2cc4cc8f72eaa3dbff14b6622025"}, + {file = "optree-0.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34b4dd0f5d73170c7740726cadfca973220ccbed9559beb51fab446d9e584d0a"}, + {file = "optree-0.13.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1844b966bb5c95b64af5c6f92f99e4037452b92b18d060fbd80097b5b773d86"}, + {file = "optree-0.13.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d74ff3dfe8599935d52b26a2fe5a43242b4d3f47be6fc1c5ce34c25e116d616"}, + {file = "optree-0.13.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:940c739c9957404a9bbe40ed9289792adaf476cece59eca4fe2f32137fa15a8d"}, + {file = "optree-0.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfdf7f5cfb5f9b1c0188c667a3dc56551e60a52a918cb8600f84e2f0ad882106"}, + {file = "optree-0.13.1-cp310-cp310-win32.whl", hash = "sha256:135e29e0a69149958003443d43f49af0ebb65f03ae52cddf4142e94d5a36b0c8"}, + {file = "optree-0.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:64032b77420410c3d315a4b9bcbece15853432c155613bb4261d87809b3ee357"}, + {file = "optree-0.13.1-cp310-cp310-win_arm64.whl", hash = "sha256:d0c5a389c108367007151bcfef494f8c2674e4aa23d80ac9163876f5b213dfb6"}, + {file = "optree-0.13.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c84ecb6977ba7f5d4ba24d0312cbffb74c6860237572701c2716bd811ca9b226"}, + {file = "optree-0.13.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6bc9aae5ee17a38e3657c8c5db1a60923cc10debd177f6781f352362a846feeb"}, + {file = "optree-0.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f94a627c5a2fb776bbfa8f7558db5b918916d37586ba943e74e5f22789c4301"}, + {file = "optree-0.13.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b21ac55473476007e317500fd5851d0a0d695a0c51742bd65fe7347d18530da2"}, + {file = "optree-0.13.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:360f2e8f7eb22ff131bc7e3e241035908e6b47d41372eb3d68d77bc7036ddb30"}, + {file = "optree-0.13.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dec0785bc4bbcabecd7e82be3f189b21f3ce8a1244b243009736912a6d8f737"}, + {file = "optree-0.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efbffeec15e4a79ed9921dc2227cbba1b64db353c4b72ce4ce83e62fbce9e652"}, + {file = "optree-0.13.1-cp311-cp311-win32.whl", hash = "sha256:f74fb880472572d550d85d2f1563365b6f194e2157a7703790cbd54d9ab5cf29"}, + {file = "optree-0.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:0adc896018f34b5f37f6c92c35ae639877578725c5281cc9d4a0ac2ab2c46f77"}, + {file = "optree-0.13.1-cp311-cp311-win_arm64.whl", hash = "sha256:cf85ba1a7d80b6dc19ef5ca4c17d2ff0290dc9306c5b8b468d51cede287f3c8d"}, + {file = "optree-0.13.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0914ba436d6c0781dc9b04e3b95e06fe5c4fc6a87e94893da971805a3790efe8"}, + {file = "optree-0.13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:111172446e8a4f0d3be13a853fa28cb46b5679a1c7ca15b2e6db2b43dbbf9efb"}, + {file = "optree-0.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28f083ede9be89503357a6b9e5d304826701596abe13d33e8f6fa2cd85b407fc"}, + {file = "optree-0.13.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0aec6da79a6130b4c76073241c0f31c11b96a38e70c7a00f9ed918d7464394ab"}, + {file = "optree-0.13.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a408a43f16840475612c7058eb80b53791bf8b8266c5b3cd07f69697958fd97d"}, + {file = "optree-0.13.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3da76fc43dcc22fe58d11634a04672ca7cc270aed469ac35fd5c78b7b9bc9125"}, + {file = "optree-0.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d866f707b9f3a9f0e670a73fe8feee4993b2dbdbf9eef598e1cf2e5cb2876413"}, + {file = "optree-0.13.1-cp312-cp312-win32.whl", hash = "sha256:bc9c396f64f9aacdf852713bd75f1b9a83f118660fd82e87c937c081b7ddccd1"}, + {file = "optree-0.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:587fb8de8e75e80fe7c7240e269630876bec3ee2038724893370976207813e4b"}, + {file = "optree-0.13.1-cp312-cp312-win_arm64.whl", hash = "sha256:5da0fd26325a07354915cc4e3a9aee797cb75dff07c60d24b3f309457069abd3"}, + {file = "optree-0.13.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f788b2ad120deb73b4908a74473cd6de79cfb9f33bbe9dcb59cea2e2477d4e28"}, + {file = "optree-0.13.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2909cb42add6bb1a5a2b0243bdd8c4b861bf072f3741e26239481907ac8ad4e6"}, + {file = "optree-0.13.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbc5fa2ff5090389f3a906567446f01d692bd6fe5cfcc5ae2d5861f24e8e0e4d"}, + {file = "optree-0.13.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4711f5cac5a2a49c3d6c9f0eca7b77c22b452170bb33ea01c3214ebb17931db9"}, + {file = "optree-0.13.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c4ab1d391b89cb88eb3c63383d5eb0930bc21141de9d5acd277feed9e38eb65"}, + {file = "optree-0.13.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b5e5f09c85ae558a6bdaea57e63168082e728e777391393e9e2792f0d15b7b59"}, + {file = "optree-0.13.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c8ee1e988c634a451146b87d9ebdbf650a75dc1f52a9cffcd89fabb7289321c"}, + {file = "optree-0.13.1-cp313-cp313-win32.whl", hash = "sha256:5b6531cd4eb23fadbbf77faf834e1119da06d7af3154f55786b59953cd87bb8a"}, + {file = "optree-0.13.1-cp313-cp313-win_amd64.whl", hash = "sha256:27d81dc43b522ba47ba7d2e7d91dbb486940348b1bf85caeb0afc2815c0aa492"}, + {file = "optree-0.13.1-cp313-cp313-win_arm64.whl", hash = "sha256:f39c7174a3f3cdc3f5fe6fb4b832f608c40ac174d7567ed6734b2ee952094631"}, + {file = "optree-0.13.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:3010ae24e994f6e00071098d34e98e78eb995b7454a2ef629a0bf7df17441b24"}, + {file = "optree-0.13.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5b5626c38d4a18a144063db5c1dbb558431d83ca10682324f74665a12214801f"}, + {file = "optree-0.13.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1935639dd498a42367633e3877797e1330e39d44d48bbca1a136bb4dbe4c1bc9"}, + {file = "optree-0.13.1-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01819c3df950696f32c91faf8d376ae6b695ffdba18f330f1cab6b8e314e4612"}, + {file = "optree-0.13.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:48c29d9c6c64c8dc48c8ee97f7c1d5cdb83e37320f0be0857c06ce4b97994aea"}, + {file = "optree-0.13.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:025d23400b8b579462a251420f0a9ae77d3d3593f84276f3465985731d79d722"}, + {file = "optree-0.13.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55e82426bef151149cfa41d68ac957730fcd420996c0db8324fca81aa6a810ba"}, + {file = "optree-0.13.1-cp313-cp313t-win32.whl", hash = "sha256:e40f018f522fcfd244688d1b3a360518e636ba7f636385aae0566eae3e7d29bc"}, + {file = "optree-0.13.1-cp313-cp313t-win_amd64.whl", hash = "sha256:d580f1bf23bb352c4db6b3544f282f1ac08dcb0d9ab537d25e56220353438cf7"}, + {file = "optree-0.13.1-cp313-cp313t-win_arm64.whl", hash = "sha256:c4d13f55dbd509d27be3af54d53b4ca0751bc518244ced6d0567e518e51452a2"}, + {file = "optree-0.13.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9824a4258b058282eeaee1b388c8dfc704e49beda957b99177db8bd8249a3abe"}, + {file = "optree-0.13.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d21a8b449e47fdbf118ac1938cf6f97d8a60258bc45c6eba3e61f79feeb1ea8"}, + {file = "optree-0.13.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22ce30c9d733c2214fa321c8370e4dfc8c7829970364618b2b5cacffbc9e8949"}, + {file = "optree-0.13.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2521840d6aded4dac62c787f50bcb1cacbfcda86b9319d666b4025fa0ba5545a"}, + {file = "optree-0.13.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c99891c2ea6050738f7e3de5ab4038736cf33555a752b34a06922ebc9bf0488e"}, + {file = "optree-0.13.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1496f29d5b9633fed4b3f1fd4b7e772d77200eb2370c08ef8e14404309c669b9"}, + {file = "optree-0.13.1-cp37-cp37m-win32.whl", hash = "sha256:63b2749504fe0b9ac3892e26bf55a040ae2973bcf8da1476afe9266a4624be9d"}, + {file = "optree-0.13.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7e1c1da6574d59073b6a6b9a13633217f584ec271ddee4e014c7e422f171e9b4"}, + {file = "optree-0.13.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:50dd6a9c8ccef267ab4941f07eac53faf6a00666dce4d209da20525570ffaca3"}, + {file = "optree-0.13.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:536ecf0e555432cc939d958590e33e00e75cc254ab0dd269e84fc9de8352db61"}, + {file = "optree-0.13.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84a6a974aa9dc4119fe502865c8e1755090ac17dbb53a964619a8ece1130831e"}, + {file = "optree-0.13.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1891267f9dc76e9ddfed947ff7b755ad438ad483de0537a6b5bcf38478d5a33c"}, + {file = "optree-0.13.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de1ae16ea0410497e50fe2b4d48a83c37bfc87da76e1e82f9cc8c800b4fc8be6"}, + {file = "optree-0.13.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d89891e11a55ad83ab3e2810f8571774b2117a6198b4044fa44e0f37f72855e"}, + {file = "optree-0.13.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2063234ef4d58f11277e157d1cf066a8bd07be911da226bff84fc9761b8c1a25"}, + {file = "optree-0.13.1-cp38-cp38-win32.whl", hash = "sha256:5c950c85561c47efb3b1a3771ed1b2b2339bd5e28a0ca42bdcedadccc645eeac"}, + {file = "optree-0.13.1-cp38-cp38-win_amd64.whl", hash = "sha256:f2a9eadcab78ccc04114a6916e9decdbc886bbe04c1b7a7bb32e723209162998"}, + {file = "optree-0.13.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b94f9081cd810a59faae4dbac8f0447e59ce0fb2d70cfb388dc123c33a9fd1a8"}, + {file = "optree-0.13.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7abf1c6fe42cb112f0fb169f80d7b26476fa44226d2caf3727b49d210bdc3343"}, + {file = "optree-0.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aee696272eece657c2b9e3cf079d8fc7cbbcc8a5c8199dbcd0960ddf7e672fe9"}, + {file = "optree-0.13.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5569b95e214d20a1b7acb7d9477fabbd709d334bc34f3257368ea1418b811a44"}, + {file = "optree-0.13.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:100d70cc57af5284649f881e6b266fee3a3e86e82024484eaa64ee18d1587e42"}, + {file = "optree-0.13.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:30b02951c48ecca6fbeb6a3cc7a858267c4d82d1c874481a639061e845168da5"}, + {file = "optree-0.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b291aed475ca5992a0c587ca4b72f074724209e01afca9d015c9a5b2089c68d"}, + {file = "optree-0.13.1-cp39-cp39-win32.whl", hash = "sha256:363939b255a9fa0e077d8297a8301857c859592fc581cee19ec9238e0c145c4a"}, + {file = "optree-0.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:2cba7ca4cf991270a9fdd080b091d2cbdbcbf27858acebda6af40ff57312d1ea"}, + {file = "optree-0.13.1-cp39-cp39-win_arm64.whl", hash = "sha256:04252b5f24e5dae716647848b302f5f7849ecb028f8c617666d1b89a42eb988b"}, + {file = "optree-0.13.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:0f1bde49e41a158af28d99fae1bd425fbd664907c53cf595106fb5b35e5cbe26"}, + {file = "optree-0.13.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fafeda2e35e3270532132e27b471ea3e3aeac18f7966a4d0469137d1f36046ec"}, + {file = "optree-0.13.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce962f0dd387137817dcda600bd6cf2e1b65103411807b6cdbbd9ffddf1061f6"}, + {file = "optree-0.13.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f9707547635cfede8d79e4161c066021ffefc401d98bbf8eba452b1355a42c7"}, + {file = "optree-0.13.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5c6aed6c5eabda59a91376aca08ba508a06f1c68850216a98743b5f8f55af841"}, + {file = "optree-0.13.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:95298846c057cce2e7d114c03c645e86a5381b72388c8c390986bdefe69a759c"}, + {file = "optree-0.13.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37948e2d796db23d6ccd07105b709b827eba26549d34dd2149e95887c89fe9b4"}, + {file = "optree-0.13.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:395ac2eb69528613fd0f2ee8706890b7921b8ff3159df53b6e9f67eaf519c5cb"}, + {file = "optree-0.13.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:652287e43fcbb29b8d1821144987e3bc558be4e5eec0d42fce7007cc3ee8e574"}, + {file = "optree-0.13.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3d0161012d80e4865017e10298ac55652cc3ad9a3eae9440229d4bf00b140e01"}, + {file = "optree-0.13.1.tar.gz", hash = "sha256:af67856aa8073d237fe67313d84f8aeafac32c1cef7239c628a2768d02679c43"}, ] [package.dependencies] @@ -1801,13 +1801,13 @@ torch = ["torch"] [[package]] name = "packaging" -version = "24.1" +version = "24.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, - {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, + {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, + {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, ] [[package]] @@ -2001,22 +2001,19 @@ files = [ [[package]] name = "pydantic" -version = "2.9.2" +version = "2.10.0" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.9.2-py3-none-any.whl", hash = "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12"}, - {file = "pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f"}, + {file = "pydantic-2.10.0-py3-none-any.whl", hash = "sha256:5e7807ba9201bdf61b1b58aa6eb690916c40a47acfb114b1b4fef3e7fd5b30fc"}, + {file = "pydantic-2.10.0.tar.gz", hash = "sha256:0aca0f045ff6e2f097f1fe89521115335f15049eeb8a7bef3dafe4b19a74e289"}, ] [package.dependencies] annotated-types = ">=0.6.0" -pydantic-core = "2.23.4" -typing-extensions = [ - {version = ">=4.6.1", markers = "python_version < \"3.13\""}, - {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, -] +pydantic-core = "2.27.0" +typing-extensions = ">=4.12.2" [package.extras] email = ["email-validator (>=2.0.0)"] @@ -2024,100 +2021,111 @@ timezone = ["tzdata"] [[package]] name = "pydantic-core" -version = "2.23.4" +version = "2.27.0" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.23.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b10bd51f823d891193d4717448fab065733958bdb6a6b351967bd349d48d5c9b"}, - {file = "pydantic_core-2.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4fc714bdbfb534f94034efaa6eadd74e5b93c8fa6315565a222f7b6f42ca1166"}, - {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63e46b3169866bd62849936de036f901a9356e36376079b05efa83caeaa02ceb"}, - {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed1a53de42fbe34853ba90513cea21673481cd81ed1be739f7f2efb931b24916"}, - {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cfdd16ab5e59fc31b5e906d1a3f666571abc367598e3e02c83403acabc092e07"}, - {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255a8ef062cbf6674450e668482456abac99a5583bbafb73f9ad469540a3a232"}, - {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a7cd62e831afe623fbb7aabbb4fe583212115b3ef38a9f6b71869ba644624a2"}, - {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f09e2ff1f17c2b51f2bc76d1cc33da96298f0a036a137f5440ab3ec5360b624f"}, - {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e38e63e6f3d1cec5a27e0afe90a085af8b6806ee208b33030e65b6516353f1a3"}, - {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0dbd8dbed2085ed23b5c04afa29d8fd2771674223135dc9bc937f3c09284d071"}, - {file = "pydantic_core-2.23.4-cp310-none-win32.whl", hash = "sha256:6531b7ca5f951d663c339002e91aaebda765ec7d61b7d1e3991051906ddde119"}, - {file = "pydantic_core-2.23.4-cp310-none-win_amd64.whl", hash = "sha256:7c9129eb40958b3d4500fa2467e6a83356b3b61bfff1b414c7361d9220f9ae8f"}, - {file = "pydantic_core-2.23.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:77733e3892bb0a7fa797826361ce8a9184d25c8dffaec60b7ffe928153680ba8"}, - {file = "pydantic_core-2.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b84d168f6c48fabd1f2027a3d1bdfe62f92cade1fb273a5d68e621da0e44e6d"}, - {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df49e7a0861a8c36d089c1ed57d308623d60416dab2647a4a17fe050ba85de0e"}, - {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff02b6d461a6de369f07ec15e465a88895f3223eb75073ffea56b84d9331f607"}, - {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996a38a83508c54c78a5f41456b0103c30508fed9abcad0a59b876d7398f25fd"}, - {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d97683ddee4723ae8c95d1eddac7c192e8c552da0c73a925a89fa8649bf13eea"}, - {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:216f9b2d7713eb98cb83c80b9c794de1f6b7e3145eef40400c62e86cee5f4e1e"}, - {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6f783e0ec4803c787bcea93e13e9932edab72068f68ecffdf86a99fd5918878b"}, - {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d0776dea117cf5272382634bd2a5c1b6eb16767c223c6a5317cd3e2a757c61a0"}, - {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5f7a395a8cf1621939692dba2a6b6a830efa6b3cee787d82c7de1ad2930de64"}, - {file = "pydantic_core-2.23.4-cp311-none-win32.whl", hash = "sha256:74b9127ffea03643e998e0c5ad9bd3811d3dac8c676e47db17b0ee7c3c3bf35f"}, - {file = "pydantic_core-2.23.4-cp311-none-win_amd64.whl", hash = "sha256:98d134c954828488b153d88ba1f34e14259284f256180ce659e8d83e9c05eaa3"}, - {file = "pydantic_core-2.23.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f3e0da4ebaef65158d4dfd7d3678aad692f7666877df0002b8a522cdf088f231"}, - {file = "pydantic_core-2.23.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f69a8e0b033b747bb3e36a44e7732f0c99f7edd5cea723d45bc0d6e95377ffee"}, - {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723314c1d51722ab28bfcd5240d858512ffd3116449c557a1336cbe3919beb87"}, - {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb2802e667b7051a1bebbfe93684841cc9351004e2badbd6411bf357ab8d5ac8"}, - {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18ca8148bebe1b0a382a27a8ee60350091a6ddaf475fa05ef50dc35b5df6327"}, - {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33e3d65a85a2a4a0dc3b092b938a4062b1a05f3a9abde65ea93b233bca0e03f2"}, - {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:128585782e5bfa515c590ccee4b727fb76925dd04a98864182b22e89a4e6ed36"}, - {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68665f4c17edcceecc112dfed5dbe6f92261fb9d6054b47d01bf6371a6196126"}, - {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20152074317d9bed6b7a95ade3b7d6054845d70584216160860425f4fbd5ee9e"}, - {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9261d3ce84fa1d38ed649c3638feefeae23d32ba9182963e465d58d62203bd24"}, - {file = "pydantic_core-2.23.4-cp312-none-win32.whl", hash = "sha256:4ba762ed58e8d68657fc1281e9bb72e1c3e79cc5d464be146e260c541ec12d84"}, - {file = "pydantic_core-2.23.4-cp312-none-win_amd64.whl", hash = "sha256:97df63000f4fea395b2824da80e169731088656d1818a11b95f3b173747b6cd9"}, - {file = "pydantic_core-2.23.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7530e201d10d7d14abce4fb54cfe5b94a0aefc87da539d0346a484ead376c3cc"}, - {file = "pydantic_core-2.23.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df933278128ea1cd77772673c73954e53a1c95a4fdf41eef97c2b779271bd0bd"}, - {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cb3da3fd1b6a5d0279a01877713dbda118a2a4fc6f0d821a57da2e464793f05"}, - {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c6dcb030aefb668a2b7009c85b27f90e51e6a3b4d5c9bc4c57631292015b0d"}, - {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:696dd8d674d6ce621ab9d45b205df149399e4bb9aa34102c970b721554828510"}, - {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2971bb5ffe72cc0f555c13e19b23c85b654dd2a8f7ab493c262071377bfce9f6"}, - {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8394d940e5d400d04cad4f75c0598665cbb81aecefaca82ca85bd28264af7f9b"}, - {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dff76e0602ca7d4cdaacc1ac4c005e0ce0dcfe095d5b5259163a80d3a10d327"}, - {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7d32706badfe136888bdea71c0def994644e09fff0bfe47441deaed8e96fdbc6"}, - {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed541d70698978a20eb63d8c5d72f2cc6d7079d9d90f6b50bad07826f1320f5f"}, - {file = "pydantic_core-2.23.4-cp313-none-win32.whl", hash = "sha256:3d5639516376dce1940ea36edf408c554475369f5da2abd45d44621cb616f769"}, - {file = "pydantic_core-2.23.4-cp313-none-win_amd64.whl", hash = "sha256:5a1504ad17ba4210df3a045132a7baeeba5a200e930f57512ee02909fc5c4cb5"}, - {file = "pydantic_core-2.23.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d4488a93b071c04dc20f5cecc3631fc78b9789dd72483ba15d423b5b3689b555"}, - {file = "pydantic_core-2.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:81965a16b675b35e1d09dd14df53f190f9129c0202356ed44ab2728b1c905658"}, - {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ffa2ebd4c8530079140dd2d7f794a9d9a73cbb8e9d59ffe24c63436efa8f271"}, - {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:61817945f2fe7d166e75fbfb28004034b48e44878177fc54d81688e7b85a3665"}, - {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d2c342c4bc01b88402d60189f3df065fb0dda3654744d5a165a5288a657368"}, - {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e11661ce0fd30a6790e8bcdf263b9ec5988e95e63cf901972107efc49218b13"}, - {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d18368b137c6295db49ce7218b1a9ba15c5bc254c96d7c9f9e924a9bc7825ad"}, - {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec4e55f79b1c4ffb2eecd8a0cfba9955a2588497d96851f4c8f99aa4a1d39b12"}, - {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:374a5e5049eda9e0a44c696c7ade3ff355f06b1fe0bb945ea3cac2bc336478a2"}, - {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5c364564d17da23db1106787675fc7af45f2f7b58b4173bfdd105564e132e6fb"}, - {file = "pydantic_core-2.23.4-cp38-none-win32.whl", hash = "sha256:d7a80d21d613eec45e3d41eb22f8f94ddc758a6c4720842dc74c0581f54993d6"}, - {file = "pydantic_core-2.23.4-cp38-none-win_amd64.whl", hash = "sha256:5f5ff8d839f4566a474a969508fe1c5e59c31c80d9e140566f9a37bba7b8d556"}, - {file = "pydantic_core-2.23.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a4fa4fc04dff799089689f4fd502ce7d59de529fc2f40a2c8836886c03e0175a"}, - {file = "pydantic_core-2.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7df63886be5e270da67e0966cf4afbae86069501d35c8c1b3b6c168f42cb36"}, - {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcedcd19a557e182628afa1d553c3895a9f825b936415d0dbd3cd0bbcfd29b4b"}, - {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f54b118ce5de9ac21c363d9b3caa6c800341e8c47a508787e5868c6b79c9323"}, - {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86d2f57d3e1379a9525c5ab067b27dbb8a0642fb5d454e17a9ac434f9ce523e3"}, - {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de6d1d1b9e5101508cb37ab0d972357cac5235f5c6533d1071964c47139257df"}, - {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1278e0d324f6908e872730c9102b0112477a7f7cf88b308e4fc36ce1bdb6d58c"}, - {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a6b5099eeec78827553827f4c6b8615978bb4b6a88e5d9b93eddf8bb6790f55"}, - {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e55541f756f9b3ee346b840103f32779c695a19826a4c442b7954550a0972040"}, - {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a5c7ba8ffb6d6f8f2ab08743be203654bb1aaa8c9dcb09f82ddd34eadb695605"}, - {file = "pydantic_core-2.23.4-cp39-none-win32.whl", hash = "sha256:37b0fe330e4a58d3c58b24d91d1eb102aeec675a3db4c292ec3928ecd892a9a6"}, - {file = "pydantic_core-2.23.4-cp39-none-win_amd64.whl", hash = "sha256:1498bec4c05c9c787bde9125cfdcc63a41004ff167f495063191b863399b1a29"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f455ee30a9d61d3e1a15abd5068827773d6e4dc513e795f380cdd59932c782d5"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e90d2e3bd2c3863d48525d297cd143fe541be8bbf6f579504b9712cb6b643ec"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e203fdf807ac7e12ab59ca2bfcabb38c7cf0b33c41efeb00f8e5da1d86af480"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e08277a400de01bc72436a0ccd02bdf596631411f592ad985dcee21445bd0068"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f220b0eea5965dec25480b6333c788fb72ce5f9129e8759ef876a1d805d00801"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d06b0c8da4f16d1d1e352134427cb194a0a6e19ad5db9161bf32b2113409e728"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ba1a0996f6c2773bd83e63f18914c1de3c9dd26d55f4ac302a7efe93fb8e7433"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9a5bce9d23aac8f0cf0836ecfc033896aa8443b501c58d0602dbfd5bd5b37753"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:78ddaaa81421a29574a682b3179d4cf9e6d405a09b99d93ddcf7e5239c742e21"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:883a91b5dd7d26492ff2f04f40fbb652de40fcc0afe07e8129e8ae779c2110eb"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88ad334a15b32a791ea935af224b9de1bf99bcd62fabf745d5f3442199d86d59"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:233710f069d251feb12a56da21e14cca67994eab08362207785cf8c598e74577"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19442362866a753485ba5e4be408964644dd6a09123d9416c54cd49171f50744"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:624e278a7d29b6445e4e813af92af37820fafb6dcc55c012c834f9e26f9aaaef"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f5ef8f42bec47f21d07668a043f077d507e5bf4e668d5c6dfe6aaba89de1a5b8"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:aea443fffa9fbe3af1a9ba721a87f926fe548d32cab71d188a6ede77d0ff244e"}, - {file = "pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863"}, + {file = "pydantic_core-2.27.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:cd2ac6b919f7fed71b17fe0b4603c092a4c9b5bae414817c9c81d3c22d1e1bcc"}, + {file = "pydantic_core-2.27.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e015833384ca3e1a0565a79f5d953b0629d9138021c27ad37c92a9fa1af7623c"}, + {file = "pydantic_core-2.27.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db72e40628967f6dc572020d04b5f800d71264e0531c6da35097e73bdf38b003"}, + {file = "pydantic_core-2.27.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:df45c4073bed486ea2f18757057953afed8dd77add7276ff01bccb79982cf46c"}, + {file = "pydantic_core-2.27.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:836a4bfe0cc6d36dc9a9cc1a7b391265bf6ce9d1eb1eac62ac5139f5d8d9a6fa"}, + {file = "pydantic_core-2.27.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4bf1340ae507f6da6360b24179c2083857c8ca7644aab65807023cf35404ea8d"}, + {file = "pydantic_core-2.27.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ab325fc86fbc077284c8d7f996d904d30e97904a87d6fb303dce6b3de7ebba9"}, + {file = "pydantic_core-2.27.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1da0c98a85a6c6ed702d5556db3b09c91f9b0b78de37b7593e2de8d03238807a"}, + {file = "pydantic_core-2.27.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7b0202ebf2268954090209a84f9897345719e46a57c5f2c9b7b250ca0a9d3e63"}, + {file = "pydantic_core-2.27.0-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:35380671c3c921fe8adf31ad349dc6f7588b7e928dbe44e1093789734f607399"}, + {file = "pydantic_core-2.27.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b4c19525c3538fbc0bbda6229f9682fb8199ce9ac37395880e6952798e00373"}, + {file = "pydantic_core-2.27.0-cp310-none-win32.whl", hash = "sha256:333c840a1303d1474f491e7be0b718226c730a39ead0f7dab2c7e6a2f3855555"}, + {file = "pydantic_core-2.27.0-cp310-none-win_amd64.whl", hash = "sha256:99b2863c1365f43f74199c980a3d40f18a218fbe683dd64e470199db426c4d6a"}, + {file = "pydantic_core-2.27.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4523c4009c3f39d948e01962223c9f5538602e7087a628479b723c939fab262d"}, + {file = "pydantic_core-2.27.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:84af1cf7bfdcbc6fcf5a5f70cc9896205e0350306e4dd73d54b6a18894f79386"}, + {file = "pydantic_core-2.27.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e65466b31be1070b4a5b7dbfbd14b247884cb8e8b79c64fb0f36b472912dbaea"}, + {file = "pydantic_core-2.27.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a5c022bb0d453192426221605efc865373dde43b17822a264671c53b068ac20c"}, + {file = "pydantic_core-2.27.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6bb69bf3b6500f195c3deb69c1205ba8fc3cb21d1915f1f158a10d6b1ef29b6a"}, + {file = "pydantic_core-2.27.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0aa4d1b2eba9a325897308b3124014a142cdccb9f3e016f31d3ebee6b5ea5e75"}, + {file = "pydantic_core-2.27.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e96ca781e0c01e32115912ebdf7b3fb0780ce748b80d7d28a0802fa9fbaf44e"}, + {file = "pydantic_core-2.27.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b872c86d8d71827235c7077461c502feb2db3f87d9d6d5a9daa64287d75e4fa0"}, + {file = "pydantic_core-2.27.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:82e1ad4ca170e8af4c928b67cff731b6296e6a0a0981b97b2eb7c275cc4e15bd"}, + {file = "pydantic_core-2.27.0-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:eb40f828bc2f73f777d1eb8fee2e86cd9692a4518b63b6b5aa8af915dfd3207b"}, + {file = "pydantic_core-2.27.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9a8fbf506fde1529a1e3698198fe64bfbe2e0c09557bc6a7dcf872e7c01fec40"}, + {file = "pydantic_core-2.27.0-cp311-none-win32.whl", hash = "sha256:24f984fc7762ed5f806d9e8c4c77ea69fdb2afd987b4fd319ef06c87595a8c55"}, + {file = "pydantic_core-2.27.0-cp311-none-win_amd64.whl", hash = "sha256:68950bc08f9735306322bfc16a18391fcaac99ded2509e1cc41d03ccb6013cfe"}, + {file = "pydantic_core-2.27.0-cp311-none-win_arm64.whl", hash = "sha256:3eb8849445c26b41c5a474061032c53e14fe92a11a5db969f722a2716cd12206"}, + {file = "pydantic_core-2.27.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:8117839a9bdbba86e7f9df57018fe3b96cec934c3940b591b0fd3fbfb485864a"}, + {file = "pydantic_core-2.27.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a291d0b4243a259c8ea7e2b84eb9ccb76370e569298875a7c5e3e71baf49057a"}, + {file = "pydantic_core-2.27.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84e35afd9e10b2698e6f2f32256678cb23ca6c1568d02628033a837638b3ed12"}, + {file = "pydantic_core-2.27.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:58ab0d979c969983cdb97374698d847a4acffb217d543e172838864636ef10d9"}, + {file = "pydantic_core-2.27.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0d06b667e53320332be2bf6f9461f4a9b78092a079b8ce8634c9afaa7e10cd9f"}, + {file = "pydantic_core-2.27.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78f841523729e43e3928a364ec46e2e3f80e6625a4f62aca5c345f3f626c6e8a"}, + {file = "pydantic_core-2.27.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:400bf470e4327e920883b51e255617dfe4496d4e80c3fea0b5a5d0bf2c404dd4"}, + {file = "pydantic_core-2.27.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:951e71da6c89d354572098bada5ba5b5dc3a9390c933af8a614e37755d3d1840"}, + {file = "pydantic_core-2.27.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2a51ce96224eadd1845150b204389623c8e129fde5a67a84b972bd83a85c6c40"}, + {file = "pydantic_core-2.27.0-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:483c2213a609e7db2c592bbc015da58b6c75af7360ca3c981f178110d9787bcf"}, + {file = "pydantic_core-2.27.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:359e7951f04ad35111b5ddce184db3391442345d0ab073aa63a95eb8af25a5ef"}, + {file = "pydantic_core-2.27.0-cp312-none-win32.whl", hash = "sha256:ee7d9d5537daf6d5c74a83b38a638cc001b648096c1cae8ef695b0c919d9d379"}, + {file = "pydantic_core-2.27.0-cp312-none-win_amd64.whl", hash = "sha256:2be0ad541bb9f059954ccf8877a49ed73877f862529575ff3d54bf4223e4dd61"}, + {file = "pydantic_core-2.27.0-cp312-none-win_arm64.whl", hash = "sha256:6e19401742ed7b69e51d8e4df3c03ad5ec65a83b36244479fd70edde2828a5d9"}, + {file = "pydantic_core-2.27.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5f2b19b8d6fca432cb3acf48cf5243a7bf512988029b6e6fd27e9e8c0a204d85"}, + {file = "pydantic_core-2.27.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c86679f443e7085ea55a7376462553996c688395d18ef3f0d3dbad7838f857a2"}, + {file = "pydantic_core-2.27.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:510b11e9c3b1a852876d1ccd8d5903684336d635214148637ceb27366c75a467"}, + {file = "pydantic_core-2.27.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb704155e73b833801c247f39d562229c0303f54770ca14fb1c053acb376cf10"}, + {file = "pydantic_core-2.27.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9ce048deb1e033e7a865ca384770bccc11d44179cf09e5193a535c4c2f497bdc"}, + {file = "pydantic_core-2.27.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:58560828ee0951bb125c6f2862fbc37f039996d19ceb6d8ff1905abf7da0bf3d"}, + {file = "pydantic_core-2.27.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abb4785894936d7682635726613c44578c420a096729f1978cd061a7e72d5275"}, + {file = "pydantic_core-2.27.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2883b260f7a93235488699d39cbbd94fa7b175d3a8063fbfddd3e81ad9988cb2"}, + {file = "pydantic_core-2.27.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c6fcb3fa3855d583aa57b94cf146f7781d5d5bc06cb95cb3afece33d31aac39b"}, + {file = "pydantic_core-2.27.0-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:e851a051f7260e6d688267eb039c81f05f23a19431bd7dfa4bf5e3cb34c108cd"}, + {file = "pydantic_core-2.27.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:edb1bfd45227dec8d50bc7c7d86463cd8728bcc574f9b07de7369880de4626a3"}, + {file = "pydantic_core-2.27.0-cp313-none-win32.whl", hash = "sha256:678f66462058dd978702db17eb6a3633d634f7aa0deaea61e0a674152766d3fc"}, + {file = "pydantic_core-2.27.0-cp313-none-win_amd64.whl", hash = "sha256:d28ca7066d6cdd347a50d8b725dc10d9a1d6a1cce09836cf071ea6a2d4908be0"}, + {file = "pydantic_core-2.27.0-cp313-none-win_arm64.whl", hash = "sha256:6f4a53af9e81d757756508b57cae1cf28293f0f31b9fa2bfcb416cc7fb230f9d"}, + {file = "pydantic_core-2.27.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:e9f9feee7f334b72ceae46313333d002b56f325b5f04271b4ae2aadd9e993ae4"}, + {file = "pydantic_core-2.27.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:225bfff5d425c34e1fd562cef52d673579d59b967d9de06178850c4802af9039"}, + {file = "pydantic_core-2.27.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c921ad596ff1a82f9c692b0758c944355abc9f0de97a4c13ca60ffc6d8dc15d4"}, + {file = "pydantic_core-2.27.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6354e18a9be37bfa124d6b288a87fb30c673745806c92956f1a25e3ae6e76b96"}, + {file = "pydantic_core-2.27.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ee4c2a75af9fe21269a4a0898c5425afb01af1f5d276063f57e2ae1bc64e191"}, + {file = "pydantic_core-2.27.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c91e3c04f5191fd3fb68764bddeaf02025492d5d9f23343b283870f6ace69708"}, + {file = "pydantic_core-2.27.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a6ebfac28fd51890a61df36ef202adbd77d00ee5aca4a3dadb3d9ed49cfb929"}, + {file = "pydantic_core-2.27.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:36aa167f69d8807ba7e341d67ea93e50fcaaf6bc433bb04939430fa3dab06f31"}, + {file = "pydantic_core-2.27.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3e8d89c276234579cd3d095d5fa2a44eb10db9a218664a17b56363cddf226ff3"}, + {file = "pydantic_core-2.27.0-cp38-cp38-musllinux_1_1_armv7l.whl", hash = "sha256:5cc822ab90a70ea3a91e6aed3afac570b276b1278c6909b1d384f745bd09c714"}, + {file = "pydantic_core-2.27.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e15315691fe2253eb447503153acef4d7223dfe7e7702f9ed66539fcd0c43801"}, + {file = "pydantic_core-2.27.0-cp38-none-win32.whl", hash = "sha256:dfa5f5c0a4c8fced1422dc2ca7eefd872d5d13eb33cf324361dbf1dbfba0a9fe"}, + {file = "pydantic_core-2.27.0-cp38-none-win_amd64.whl", hash = "sha256:513cb14c0cc31a4dfd849a4674b20c46d87b364f997bbcb02282306f5e187abf"}, + {file = "pydantic_core-2.27.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:4148dc9184ab79e356dc00a4199dc0ee8647973332cb385fc29a7cced49b9f9c"}, + {file = "pydantic_core-2.27.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5fc72fbfebbf42c0856a824b8b0dc2b5cd2e4a896050281a21cfa6fed8879cb1"}, + {file = "pydantic_core-2.27.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:185ef205256cd8b38431205698531026979db89a79587725c1e55c59101d64e9"}, + {file = "pydantic_core-2.27.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:395e3e1148fa7809016231f8065f30bb0dc285a97b4dc4360cd86e17bab58af7"}, + {file = "pydantic_core-2.27.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:33d14369739c5d07e2e7102cdb0081a1fa46ed03215e07f097b34e020b83b1ae"}, + {file = "pydantic_core-2.27.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e7820bb0d65e3ce1e3e70b6708c2f66143f55912fa02f4b618d0f08b61575f12"}, + {file = "pydantic_core-2.27.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43b61989068de9ce62296cde02beffabcadb65672207fc51e7af76dca75e6636"}, + {file = "pydantic_core-2.27.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:15e350efb67b855cd014c218716feea4986a149ed1f42a539edd271ee074a196"}, + {file = "pydantic_core-2.27.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:433689845288f9a1ee5714444e65957be26d30915f7745091ede4a83cfb2d7bb"}, + {file = "pydantic_core-2.27.0-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:3fd8bc2690e7c39eecdf9071b6a889ce7b22b72073863940edc2a0a23750ca90"}, + {file = "pydantic_core-2.27.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:884f1806609c2c66564082540cffc96868c5571c7c3cf3a783f63f2fb49bd3cd"}, + {file = "pydantic_core-2.27.0-cp39-none-win32.whl", hash = "sha256:bf37b72834e7239cf84d4a0b2c050e7f9e48bced97bad9bdf98d26b8eb72e846"}, + {file = "pydantic_core-2.27.0-cp39-none-win_amd64.whl", hash = "sha256:31a2cae5f059329f9cfe3d8d266d3da1543b60b60130d186d9b6a3c20a346361"}, + {file = "pydantic_core-2.27.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:4fb49cfdb53af5041aba909be00cccfb2c0d0a2e09281bf542371c5fd36ad04c"}, + {file = "pydantic_core-2.27.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:49633583eb7dc5cba61aaf7cdb2e9e662323ad394e543ee77af265736bcd3eaa"}, + {file = "pydantic_core-2.27.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:153017e3d6cd3ce979de06d84343ca424bb6092727375eba1968c8b4693c6ecb"}, + {file = "pydantic_core-2.27.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff63a92f6e249514ef35bc795de10745be0226eaea06eb48b4bbeaa0c8850a4a"}, + {file = "pydantic_core-2.27.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5982048129f40b082c2654de10c0f37c67a14f5ff9d37cf35be028ae982f26df"}, + {file = "pydantic_core-2.27.0-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:91bc66f878557313c2a6bcf396e7befcffe5ab4354cfe4427318968af31143c3"}, + {file = "pydantic_core-2.27.0-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:68ef5377eb582fa4343c9d0b57a5b094046d447b4c73dd9fbd9ffb216f829e7d"}, + {file = "pydantic_core-2.27.0-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:c5726eec789ee38f2c53b10b1821457b82274f81f4f746bb1e666d8741fcfadb"}, + {file = "pydantic_core-2.27.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c0c431e4be5c1a0c6654e0c31c661cd89e0ca956ef65305c3c3fd96f4e72ca39"}, + {file = "pydantic_core-2.27.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:8e21d927469d04b39386255bf00d0feedead16f6253dcc85e9e10ddebc334084"}, + {file = "pydantic_core-2.27.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:4b51f964fcbb02949fc546022e56cdb16cda457af485e9a3e8b78ac2ecf5d77e"}, + {file = "pydantic_core-2.27.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25a7fd4de38f7ff99a37e18fa0098c3140286451bc823d1746ba80cec5b433a1"}, + {file = "pydantic_core-2.27.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fda87808429c520a002a85d6e7cdadbf58231d60e96260976c5b8f9a12a8e13"}, + {file = "pydantic_core-2.27.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8a150392102c402c538190730fda06f3bce654fc498865579a9f2c1d2b425833"}, + {file = "pydantic_core-2.27.0-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:c9ed88b398ba7e3bad7bd64d66cc01dcde9cfcb7ec629a6fd78a82fa0b559d78"}, + {file = "pydantic_core-2.27.0-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:9fe94d9d2a2b4edd7a4b22adcd45814b1b59b03feb00e56deb2e89747aec7bfe"}, + {file = "pydantic_core-2.27.0-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:d8b5ee4ae9170e2775d495b81f414cc20268041c42571530513496ba61e94ba3"}, + {file = "pydantic_core-2.27.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d29e235ce13c91902ef3efc3d883a677655b3908b1cbc73dee816e5e1f8f7739"}, + {file = "pydantic_core-2.27.0.tar.gz", hash = "sha256:f57783fbaf648205ac50ae7d646f27582fc706be3977e87c3c124e7a92407b10"}, ] [package.dependencies] @@ -2139,13 +2147,13 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pyright" -version = "1.1.386" +version = "1.1.389" description = "Command line wrapper for pyright" optional = false python-versions = ">=3.7" files = [ - {file = "pyright-1.1.386-py3-none-any.whl", hash = "sha256:7071ac495593b2258ccdbbf495f1a5c0e5f27951f6b429bed4e8b296eb5cd21d"}, - {file = "pyright-1.1.386.tar.gz", hash = "sha256:8e9975e34948ba5f8e07792a9c9d2bdceb2c6c0b61742b068d2229ca2bc4a9d9"}, + {file = "pyright-1.1.389-py3-none-any.whl", hash = "sha256:41e9620bba9254406dc1f621a88ceab5a88af4c826feb4f614d95691ed243a60"}, + {file = "pyright-1.1.389.tar.gz", hash = "sha256:716bf8cc174ab8b4dcf6828c3298cac05c5ed775dda9910106a5dcfe4c7fe220"}, ] [package.dependencies] @@ -2363,13 +2371,13 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "rich" -version = "13.9.3" +version = "13.9.4" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false python-versions = ">=3.8.0" files = [ - {file = "rich-13.9.3-py3-none-any.whl", hash = "sha256:9836f5096eb2172c9e77df411c1b009bace4193d6a481d534fea75ebba758283"}, - {file = "rich-13.9.3.tar.gz", hash = "sha256:bc1e01b899537598cf02579d2b9f4a415104d3fc439313a7a2c165d76557a08e"}, + {file = "rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90"}, + {file = "rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098"}, ] [package.dependencies] @@ -2500,23 +2508,23 @@ test = ["array-api-strict", "asv", "gmpy2", "hypothesis (>=6.30)", "mpmath", "po [[package]] name = "setuptools" -version = "75.2.0" +version = "75.6.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "setuptools-75.2.0-py3-none-any.whl", hash = "sha256:a7fcb66f68b4d9e8e66b42f9876150a3371558f98fa32222ffaa5bced76406f8"}, - {file = "setuptools-75.2.0.tar.gz", hash = "sha256:753bb6ebf1f465a1912e19ed1d41f403a79173a9acf66a42e7e6aec45c3c16ec"}, + {file = "setuptools-75.6.0-py3-none-any.whl", hash = "sha256:ce74b49e8f7110f9bf04883b730f4765b774ef3ef28f722cce7c273d253aaf7d"}, + {file = "setuptools-75.6.0.tar.gz", hash = "sha256:8199222558df7c86216af4f84c30e9b34a61d8ba19366cc914424cdbd28252f6"}, ] [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.5.2)"] -core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.collections", "jaraco.functools", "jaraco.text (>=3.7)", "more-itertools", "more-itertools (>=8.8)", "packaging", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.7.0)"] +core = ["importlib_metadata (>=6)", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] enabler = ["pytest-enabler (>=2.2)"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] -type = ["importlib-metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.11.*)", "pytest-mypy"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib_metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (>=1.12,<1.14)", "pytest-mypy"] [[package]] name = "six" @@ -2656,13 +2664,13 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] [[package]] name = "starlette" -version = "0.41.0" +version = "0.41.3" description = "The little ASGI library that shines." optional = false python-versions = ">=3.8" files = [ - {file = "starlette-0.41.0-py3-none-any.whl", hash = "sha256:a0193a3c413ebc9c78bff1c3546a45bb8c8bcb4a84cae8747d650a65bd37210a"}, - {file = "starlette-0.41.0.tar.gz", hash = "sha256:39cbd8768b107d68bfe1ff1672b38a2c38b49777de46d2a592841d58e3bf7c2a"}, + {file = "starlette-0.41.3-py3-none-any.whl", hash = "sha256:44cedb2b7c77a9de33a8b74b2b90e9f50d11fcf25d8270ea525ad71a25374ff7"}, + {file = "starlette-0.41.3.tar.gz", hash = "sha256:0e4ab3d16522a255be6b28260b938eae2482f98ce5cc934cb08dce8dc3ba5835"}, ] [package.dependencies] @@ -2725,19 +2733,19 @@ files = [ [[package]] name = "tensorflow-cpu" -version = "2.17.0" +version = "2.17.1" description = "TensorFlow is an open source machine learning framework for everyone." optional = false python-versions = ">=3.9" files = [ - {file = "tensorflow_cpu-2.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:062d3834a88f7c436c21a8faeec5b90e469ad23144fc40ebf3b075e599a5906b"}, - {file = "tensorflow_cpu-2.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:74260adfc9891888763cbcf2bcfeca148a18ee1a733ccca5e54034915779dbc8"}, - {file = "tensorflow_cpu-2.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7f383ffe153d67de338b0fc26ab44546466ec016fe4dbff74bfd206d1894285"}, - {file = "tensorflow_cpu-2.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:266563f6cac54d459ff1fe80276795a845c1e59688bcdf08670df8dc4db69de0"}, - {file = "tensorflow_cpu-2.17.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c8f4d3990321949b9adc4dd1d88371873f9caa421d33ffc5265af052997616c"}, - {file = "tensorflow_cpu-2.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:e51746f25cb9d81842d3e2a0d9a9f2240433620ef758e2bab0ea2a426ceb15c2"}, - {file = "tensorflow_cpu-2.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d652ae92f9690f01ae52373e81d15f56f0560cc11e0406fb57621b490b14ca9"}, - {file = "tensorflow_cpu-2.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:0ce1691eeb45d1d2d1aaf93861561703d941cad8e9194b3826d8dbeb08c7fa63"}, + {file = "tensorflow_cpu-2.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92aba7b37c89596a783766f9b0822c710e3b674a8cd29598656a84df4ae61364"}, + {file = "tensorflow_cpu-2.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:79ee40e713d1ef8dce9a5a11fd312aed4bd927a2a46c01b95c71801e5c9da286"}, + {file = "tensorflow_cpu-2.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4935d35d15924602605c839cb6cd5a578f89f626d8736f62065fe3a089b63b6f"}, + {file = "tensorflow_cpu-2.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:54e4be9d5f687229f9e2b91480afed27709a0efe56f642dc4d99b80fbbb98363"}, + {file = "tensorflow_cpu-2.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10567f927153f9789e7e7c92bac27f13ca22dfa0a60dc03a831343c96f4efb9e"}, + {file = "tensorflow_cpu-2.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:c15e1af1c5007dc328448f30b2a0f15d01573dbd704f83f8704e0d018b296319"}, + {file = "tensorflow_cpu-2.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:389654e5633332fcfe61cc2cfb77eeb6eb27cfcc37f11c6bec01c0e59d66dbe0"}, + {file = "tensorflow_cpu-2.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:b0e0192eb8db07ab065ca0d5e269385c79086f0a25148550c8625f7347115ee3"}, ] [package.dependencies] @@ -2762,7 +2770,7 @@ requests = ">=2.21.0,<3" setuptools = "*" six = ">=1.12.0" tensorboard = ">=2.17,<2.18" -tensorflow-intel = {version = "2.17.0", markers = "platform_system == \"Windows\""} +tensorflow-intel = {version = "2.17.1", markers = "platform_system == \"Windows\""} tensorflow-io-gcs-filesystem = {version = ">=0.23.1", markers = "python_version < \"3.12\""} termcolor = ">=1.1.0" typing-extensions = ">=3.6.6" @@ -2773,15 +2781,15 @@ and-cuda = ["nvidia-cublas-cu12 (==12.3.4.1)", "nvidia-cuda-cupti-cu12 (==12.3.1 [[package]] name = "tensorflow-intel" -version = "2.17.0" +version = "2.17.1" description = "TensorFlow is an open source machine learning framework for everyone." optional = false python-versions = ">=3.9" files = [ - {file = "tensorflow_intel-2.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:f61144e1dc8d19971a6765d35c29c61b9582eb767606613cbc383926ecb0f002"}, - {file = "tensorflow_intel-2.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:3f13d4f82e8ca7a217b2e8ff98ce5e396a68cfce9607a13d31c9ba0ce66ba5ce"}, - {file = "tensorflow_intel-2.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:6a642d9a3d6b839334c6161d88606130e28070009c82fd3e6646c1b5bc94b7a0"}, - {file = "tensorflow_intel-2.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:dab3df5dcef58c3828dc82328e8d343d77f4676aca8f7371e3033ac177c37074"}, + {file = "tensorflow_intel-2.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:d1a8e59a80e2d2698076bdd35220f2efaad6d2434db721d062a9b7891f254112"}, + {file = "tensorflow_intel-2.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:8abd1fef0e4de4b97b08bfc9efd4e2352afefd9f2f9aa04e0691e67ea5a6e7ac"}, + {file = "tensorflow_intel-2.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:086b323b207857d163eec40256d13d4eb2a844342dbe73ee35cf8784be82e324"}, + {file = "tensorflow_intel-2.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:01e63796b0ff68a4119f1d0138d0dc2c0aa2b427adedf807e5ba6216b451899e"}, ] [package.dependencies] @@ -2884,39 +2892,39 @@ files = [ [[package]] name = "tomli" -version = "2.0.2" +version = "2.1.0" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" files = [ - {file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"}, - {file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"}, + {file = "tomli-2.1.0-py3-none-any.whl", hash = "sha256:a5c57c3d1c56f5ccdf89f6523458f60ef716e210fc47c4cfb188c5ba473e0391"}, + {file = "tomli-2.1.0.tar.gz", hash = "sha256:3f646cae2aec94e17d04973e4249548320197cfabdf130015d023de4b74d8ab8"}, ] [[package]] name = "torch" -version = "2.5.0" +version = "2.5.1" description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" optional = false python-versions = ">=3.8.0" files = [ - {file = "torch-2.5.0-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:7f179373a047b947dec448243f4e6598a1c960fa3bb978a9a7eecd529fbc363f"}, - {file = "torch-2.5.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:15fbc95e38d330e5b0ef1593b7bc0a19f30e5bdad76895a5cffa1a6a044235e9"}, - {file = "torch-2.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:f499212f1cffea5d587e5f06144630ed9aa9c399bba12ec8905798d833bd1404"}, - {file = "torch-2.5.0-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:c54db1fade17287aabbeed685d8e8ab3a56fea9dd8d46e71ced2da367f09a49f"}, - {file = "torch-2.5.0-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:499a68a756d3b30d10f7e0f6214dc3767b130b797265db3b1c02e9094e2a07be"}, - {file = "torch-2.5.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:9f3df8138a1126a851440b7d5a4869bfb7c9cc43563d64fd9d96d0465b581024"}, - {file = "torch-2.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:b81da3bdb58c9de29d0e1361e52f12fcf10a89673f17a11a5c6c7da1cb1a8376"}, - {file = "torch-2.5.0-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:ba135923295d564355326dc409b6b7f5bd6edc80f764cdaef1fb0a1b23ff2f9c"}, - {file = "torch-2.5.0-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:2dd40c885a05ef7fe29356cca81be1435a893096ceb984441d6e2c27aff8c6f4"}, - {file = "torch-2.5.0-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:bc52d603d87fe1da24439c0d5fdbbb14e0ae4874451d53f0120ffb1f6c192727"}, - {file = "torch-2.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:ea718746469246cc63b3353afd75698a288344adb55e29b7f814a5d3c0a7c78d"}, - {file = "torch-2.5.0-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:6de1fd253e27e7f01f05cd7c37929ae521ca23ca4620cfc7c485299941679112"}, - {file = "torch-2.5.0-cp313-cp313-manylinux1_x86_64.whl", hash = "sha256:83dcf518685db20912b71fc49cbddcc8849438cdb0e9dcc919b02a849e2cd9e8"}, - {file = "torch-2.5.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:65e0a60894435608334d68c8811e55fd8f73e5bf8ee6f9ccedb0064486a7b418"}, - {file = "torch-2.5.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:38c21ff1bd39f076d72ab06e3c88c2ea6874f2e6f235c9450816b6c8e7627094"}, - {file = "torch-2.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:ce4baeba9804da5a346e210b3b70826f5811330c343e4fe1582200359ee77fe5"}, - {file = "torch-2.5.0-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:03e53f577a96e4d41aca472da8faa40e55df89d2273664af390ce1f570e885bd"}, + {file = "torch-2.5.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:71328e1bbe39d213b8721678f9dcac30dfc452a46d586f1d514a6aa0a99d4744"}, + {file = "torch-2.5.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:34bfa1a852e5714cbfa17f27c49d8ce35e1b7af5608c4bc6e81392c352dbc601"}, + {file = "torch-2.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:32a037bd98a241df6c93e4c789b683335da76a2ac142c0973675b715102dc5fa"}, + {file = "torch-2.5.1-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:23d062bf70776a3d04dbe74db950db2a5245e1ba4f27208a87f0d743b0d06e86"}, + {file = "torch-2.5.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:de5b7d6740c4b636ef4db92be922f0edc425b65ed78c5076c43c42d362a45457"}, + {file = "torch-2.5.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:340ce0432cad0d37f5a31be666896e16788f1adf8ad7be481196b503dad675b9"}, + {file = "torch-2.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:603c52d2fe06433c18b747d25f5c333f9c1d58615620578c326d66f258686f9a"}, + {file = "torch-2.5.1-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:31f8c39660962f9ae4eeec995e3049b5492eb7360dd4f07377658ef4d728fa4c"}, + {file = "torch-2.5.1-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:ed231a4b3a5952177fafb661213d690a72caaad97d5824dd4fc17ab9e15cec03"}, + {file = "torch-2.5.1-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:3f4b7f10a247e0dcd7ea97dc2d3bfbfc90302ed36d7f3952b0008d0df264e697"}, + {file = "torch-2.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:73e58e78f7d220917c5dbfad1a40e09df9929d3b95d25e57d9f8558f84c9a11c"}, + {file = "torch-2.5.1-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:8c712df61101964eb11910a846514011f0b6f5920c55dbf567bff8a34163d5b1"}, + {file = "torch-2.5.1-cp313-cp313-manylinux1_x86_64.whl", hash = "sha256:9b61edf3b4f6e3b0e0adda8b3960266b9009d02b37555971f4d1c8f7a05afed7"}, + {file = "torch-2.5.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:1f3b7fb3cf7ab97fae52161423f81be8c6b8afac8d9760823fd623994581e1a3"}, + {file = "torch-2.5.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:7974e3dce28b5a21fb554b73e1bc9072c25dde873fa00d54280861e7a009d7dc"}, + {file = "torch-2.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:46c817d3ea33696ad3b9df5e774dba2257e9a4cd3c4a3afbf92f6bb13ac5ce2d"}, + {file = "torch-2.5.1-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:8046768b7f6d35b85d101b4b38cba8aa2f3cd51952bc4c06a49580f2ce682291"}, ] [package.dependencies] @@ -3027,20 +3035,20 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "uvicorn" -version = "0.32.0" +version = "0.32.1" description = "The lightning-fast ASGI server." optional = false python-versions = ">=3.8" files = [ - {file = "uvicorn-0.32.0-py3-none-any.whl", hash = "sha256:60b8f3a5ac027dcd31448f411ced12b5ef452c646f76f02f8cc3f25d8d26fd82"}, - {file = "uvicorn-0.32.0.tar.gz", hash = "sha256:f78b36b143c16f54ccdb8190d0a26b5f1901fe5a3c777e1ab29f26391af8551e"}, + {file = "uvicorn-0.32.1-py3-none-any.whl", hash = "sha256:82ad92fd58da0d12af7482ecdb5f2470a04c9c9a53ced65b9bbb4a205377602e"}, + {file = "uvicorn-0.32.1.tar.gz", hash = "sha256:ee9519c246a72b1c084cea8d3b44ed6026e78a4a309cbedae9c37e4cb9fbb175"}, ] [package.dependencies] click = ">=7.0" colorama = {version = ">=0.4", optional = true, markers = "sys_platform == \"win32\" and extra == \"standard\""} h11 = ">=0.8" -httptools = {version = ">=0.5.0", optional = true, markers = "extra == \"standard\""} +httptools = {version = ">=0.6.3", optional = true, markers = "extra == \"standard\""} python-dotenv = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} pyyaml = {version = ">=5.1", optional = true, markers = "extra == \"standard\""} typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} @@ -3049,7 +3057,7 @@ watchfiles = {version = ">=0.13", optional = true, markers = "extra == \"standar websockets = {version = ">=10.4", optional = true, markers = "extra == \"standard\""} [package.extras] -standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] +standard = ["colorama (>=0.4)", "httptools (>=0.6.3)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] [[package]] name = "uvloop" @@ -3104,13 +3112,13 @@ test = ["aiohttp (>=3.10.5)", "flake8 (>=5.0,<6.0)", "mypy (>=0.800)", "psutil", [[package]] name = "virtualenv" -version = "20.27.0" +version = "20.27.1" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.8" files = [ - {file = "virtualenv-20.27.0-py3-none-any.whl", hash = "sha256:44a72c29cceb0ee08f300b314848c86e57bf8d1f13107a5e671fb9274138d655"}, - {file = "virtualenv-20.27.0.tar.gz", hash = "sha256:2ca56a68ed615b8fe4326d11a0dca5dfbe8fd68510fb6c6349163bed3c15f2b2"}, + {file = "virtualenv-20.27.1-py3-none-any.whl", hash = "sha256:f11f1b8a29525562925f745563bfd48b189450f61fb34c4f9cc79dd5aa32a1f4"}, + {file = "virtualenv-20.27.1.tar.gz", hash = "sha256:142c6be10212543b32c6c45d3d3893dff89112cc588b7d0879ae5a1ec03a47ba"}, ] [package.dependencies] @@ -3230,108 +3238,91 @@ files = [ [[package]] name = "websockets" -version = "13.1" +version = "14.1" description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "websockets-13.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f48c749857f8fb598fb890a75f540e3221d0976ed0bf879cf3c7eef34151acee"}, - {file = "websockets-13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c7e72ce6bda6fb9409cc1e8164dd41d7c91466fb599eb047cfda72fe758a34a7"}, - {file = "websockets-13.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f779498eeec470295a2b1a5d97aa1bc9814ecd25e1eb637bd9d1c73a327387f6"}, - {file = "websockets-13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4676df3fe46956fbb0437d8800cd5f2b6d41143b6e7e842e60554398432cf29b"}, - {file = "websockets-13.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7affedeb43a70351bb811dadf49493c9cfd1ed94c9c70095fd177e9cc1541fa"}, - {file = "websockets-13.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1971e62d2caa443e57588e1d82d15f663b29ff9dfe7446d9964a4b6f12c1e700"}, - {file = "websockets-13.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5f2e75431f8dc4a47f31565a6e1355fb4f2ecaa99d6b89737527ea917066e26c"}, - {file = "websockets-13.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:58cf7e75dbf7e566088b07e36ea2e3e2bd5676e22216e4cad108d4df4a7402a0"}, - {file = "websockets-13.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c90d6dec6be2c7d03378a574de87af9b1efea77d0c52a8301dd831ece938452f"}, - {file = "websockets-13.1-cp310-cp310-win32.whl", hash = "sha256:730f42125ccb14602f455155084f978bd9e8e57e89b569b4d7f0f0c17a448ffe"}, - {file = "websockets-13.1-cp310-cp310-win_amd64.whl", hash = "sha256:5993260f483d05a9737073be197371940c01b257cc45ae3f1d5d7adb371b266a"}, - {file = "websockets-13.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:61fc0dfcda609cda0fc9fe7977694c0c59cf9d749fbb17f4e9483929e3c48a19"}, - {file = "websockets-13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ceec59f59d092c5007e815def4ebb80c2de330e9588e101cf8bd94c143ec78a5"}, - {file = "websockets-13.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c1dca61c6db1166c48b95198c0b7d9c990b30c756fc2923cc66f68d17dc558fd"}, - {file = "websockets-13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:308e20f22c2c77f3f39caca508e765f8725020b84aa963474e18c59accbf4c02"}, - {file = "websockets-13.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62d516c325e6540e8a57b94abefc3459d7dab8ce52ac75c96cad5549e187e3a7"}, - {file = "websockets-13.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87c6e35319b46b99e168eb98472d6c7d8634ee37750d7693656dc766395df096"}, - {file = "websockets-13.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5f9fee94ebafbc3117c30be1844ed01a3b177bb6e39088bc6b2fa1dc15572084"}, - {file = "websockets-13.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7c1e90228c2f5cdde263253fa5db63e6653f1c00e7ec64108065a0b9713fa1b3"}, - {file = "websockets-13.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6548f29b0e401eea2b967b2fdc1c7c7b5ebb3eeb470ed23a54cd45ef078a0db9"}, - {file = "websockets-13.1-cp311-cp311-win32.whl", hash = "sha256:c11d4d16e133f6df8916cc5b7e3e96ee4c44c936717d684a94f48f82edb7c92f"}, - {file = "websockets-13.1-cp311-cp311-win_amd64.whl", hash = "sha256:d04f13a1d75cb2b8382bdc16ae6fa58c97337253826dfe136195b7f89f661557"}, - {file = "websockets-13.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9d75baf00138f80b48f1eac72ad1535aac0b6461265a0bcad391fc5aba875cfc"}, - {file = "websockets-13.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9b6f347deb3dcfbfde1c20baa21c2ac0751afaa73e64e5b693bb2b848efeaa49"}, - {file = "websockets-13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de58647e3f9c42f13f90ac7e5f58900c80a39019848c5547bc691693098ae1bd"}, - {file = "websockets-13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1b54689e38d1279a51d11e3467dd2f3a50f5f2e879012ce8f2d6943f00e83f0"}, - {file = "websockets-13.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf1781ef73c073e6b0f90af841aaf98501f975d306bbf6221683dd594ccc52b6"}, - {file = "websockets-13.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d23b88b9388ed85c6faf0e74d8dec4f4d3baf3ecf20a65a47b836d56260d4b9"}, - {file = "websockets-13.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3c78383585f47ccb0fcf186dcb8a43f5438bd7d8f47d69e0b56f71bf431a0a68"}, - {file = "websockets-13.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d6d300f8ec35c24025ceb9b9019ae9040c1ab2f01cddc2bcc0b518af31c75c14"}, - {file = "websockets-13.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a9dcaf8b0cc72a392760bb8755922c03e17a5a54e08cca58e8b74f6902b433cf"}, - {file = "websockets-13.1-cp312-cp312-win32.whl", hash = "sha256:2f85cf4f2a1ba8f602298a853cec8526c2ca42a9a4b947ec236eaedb8f2dc80c"}, - {file = "websockets-13.1-cp312-cp312-win_amd64.whl", hash = "sha256:38377f8b0cdeee97c552d20cf1865695fcd56aba155ad1b4ca8779a5b6ef4ac3"}, - {file = "websockets-13.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a9ab1e71d3d2e54a0aa646ab6d4eebfaa5f416fe78dfe4da2839525dc5d765c6"}, - {file = "websockets-13.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b9d7439d7fab4dce00570bb906875734df13d9faa4b48e261c440a5fec6d9708"}, - {file = "websockets-13.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:327b74e915cf13c5931334c61e1a41040e365d380f812513a255aa804b183418"}, - {file = "websockets-13.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:325b1ccdbf5e5725fdcb1b0e9ad4d2545056479d0eee392c291c1bf76206435a"}, - {file = "websockets-13.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:346bee67a65f189e0e33f520f253d5147ab76ae42493804319b5716e46dddf0f"}, - {file = "websockets-13.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91a0fa841646320ec0d3accdff5b757b06e2e5c86ba32af2e0815c96c7a603c5"}, - {file = "websockets-13.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:18503d2c5f3943e93819238bf20df71982d193f73dcecd26c94514f417f6b135"}, - {file = "websockets-13.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:a9cd1af7e18e5221d2878378fbc287a14cd527fdd5939ed56a18df8a31136bb2"}, - {file = "websockets-13.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:70c5be9f416aa72aab7a2a76c90ae0a4fe2755c1816c153c1a2bcc3333ce4ce6"}, - {file = "websockets-13.1-cp313-cp313-win32.whl", hash = "sha256:624459daabeb310d3815b276c1adef475b3e6804abaf2d9d2c061c319f7f187d"}, - {file = "websockets-13.1-cp313-cp313-win_amd64.whl", hash = "sha256:c518e84bb59c2baae725accd355c8dc517b4a3ed8db88b4bc93c78dae2974bf2"}, - {file = "websockets-13.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c7934fd0e920e70468e676fe7f1b7261c1efa0d6c037c6722278ca0228ad9d0d"}, - {file = "websockets-13.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:149e622dc48c10ccc3d2760e5f36753db9cacf3ad7bc7bbbfd7d9c819e286f23"}, - {file = "websockets-13.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a569eb1b05d72f9bce2ebd28a1ce2054311b66677fcd46cf36204ad23acead8c"}, - {file = "websockets-13.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95df24ca1e1bd93bbca51d94dd049a984609687cb2fb08a7f2c56ac84e9816ea"}, - {file = "websockets-13.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8dbb1bf0c0a4ae8b40bdc9be7f644e2f3fb4e8a9aca7145bfa510d4a374eeb7"}, - {file = "websockets-13.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:035233b7531fb92a76beefcbf479504db8c72eb3bff41da55aecce3a0f729e54"}, - {file = "websockets-13.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:e4450fc83a3df53dec45922b576e91e94f5578d06436871dce3a6be38e40f5db"}, - {file = "websockets-13.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:463e1c6ec853202dd3657f156123d6b4dad0c546ea2e2e38be2b3f7c5b8e7295"}, - {file = "websockets-13.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:6d6855bbe70119872c05107e38fbc7f96b1d8cb047d95c2c50869a46c65a8e96"}, - {file = "websockets-13.1-cp38-cp38-win32.whl", hash = "sha256:204e5107f43095012b00f1451374693267adbb832d29966a01ecc4ce1db26faf"}, - {file = "websockets-13.1-cp38-cp38-win_amd64.whl", hash = "sha256:485307243237328c022bc908b90e4457d0daa8b5cf4b3723fd3c4a8012fce4c6"}, - {file = "websockets-13.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9b37c184f8b976f0c0a231a5f3d6efe10807d41ccbe4488df8c74174805eea7d"}, - {file = "websockets-13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:163e7277e1a0bd9fb3c8842a71661ad19c6aa7bb3d6678dc7f89b17fbcc4aeb7"}, - {file = "websockets-13.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4b889dbd1342820cc210ba44307cf75ae5f2f96226c0038094455a96e64fb07a"}, - {file = "websockets-13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:586a356928692c1fed0eca68b4d1c2cbbd1ca2acf2ac7e7ebd3b9052582deefa"}, - {file = "websockets-13.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7bd6abf1e070a6b72bfeb71049d6ad286852e285f146682bf30d0296f5fbadfa"}, - {file = "websockets-13.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2aad13a200e5934f5a6767492fb07151e1de1d6079c003ab31e1823733ae79"}, - {file = "websockets-13.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:df01aea34b6e9e33572c35cd16bae5a47785e7d5c8cb2b54b2acdb9678315a17"}, - {file = "websockets-13.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e54affdeb21026329fb0744ad187cf812f7d3c2aa702a5edb562b325191fcab6"}, - {file = "websockets-13.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9ef8aa8bdbac47f4968a5d66462a2a0935d044bf35c0e5a8af152d58516dbeb5"}, - {file = "websockets-13.1-cp39-cp39-win32.whl", hash = "sha256:deeb929efe52bed518f6eb2ddc00cc496366a14c726005726ad62c2dd9017a3c"}, - {file = "websockets-13.1-cp39-cp39-win_amd64.whl", hash = "sha256:7c65ffa900e7cc958cd088b9a9157a8141c991f8c53d11087e6fb7277a03f81d"}, - {file = "websockets-13.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5dd6da9bec02735931fccec99d97c29f47cc61f644264eb995ad6c0c27667238"}, - {file = "websockets-13.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:2510c09d8e8df777177ee3d40cd35450dc169a81e747455cc4197e63f7e7bfe5"}, - {file = "websockets-13.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1c3cf67185543730888b20682fb186fc8d0fa6f07ccc3ef4390831ab4b388d9"}, - {file = "websockets-13.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcc03c8b72267e97b49149e4863d57c2d77f13fae12066622dc78fe322490fe6"}, - {file = "websockets-13.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:004280a140f220c812e65f36944a9ca92d766b6cc4560be652a0a3883a79ed8a"}, - {file = "websockets-13.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:e2620453c075abeb0daa949a292e19f56de518988e079c36478bacf9546ced23"}, - {file = "websockets-13.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9156c45750b37337f7b0b00e6248991a047be4aa44554c9886fe6bdd605aab3b"}, - {file = "websockets-13.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:80c421e07973a89fbdd93e6f2003c17d20b69010458d3a8e37fb47874bd67d51"}, - {file = "websockets-13.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82d0ba76371769d6a4e56f7e83bb8e81846d17a6190971e38b5de108bde9b0d7"}, - {file = "websockets-13.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9875a0143f07d74dc5e1ded1c4581f0d9f7ab86c78994e2ed9e95050073c94d"}, - {file = "websockets-13.1-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a11e38ad8922c7961447f35c7b17bffa15de4d17c70abd07bfbe12d6faa3e027"}, - {file = "websockets-13.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4059f790b6ae8768471cddb65d3c4fe4792b0ab48e154c9f0a04cefaabcd5978"}, - {file = "websockets-13.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:25c35bf84bf7c7369d247f0b8cfa157f989862c49104c5cf85cb5436a641d93e"}, - {file = "websockets-13.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:83f91d8a9bb404b8c2c41a707ac7f7f75b9442a0a876df295de27251a856ad09"}, - {file = "websockets-13.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a43cfdcddd07f4ca2b1afb459824dd3c6d53a51410636a2c7fc97b9a8cf4842"}, - {file = "websockets-13.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48a2ef1381632a2f0cb4efeff34efa97901c9fbc118e01951ad7cfc10601a9bb"}, - {file = "websockets-13.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:459bf774c754c35dbb487360b12c5727adab887f1622b8aed5755880a21c4a20"}, - {file = "websockets-13.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:95858ca14a9f6fa8413d29e0a585b31b278388aa775b8a81fa24830123874678"}, - {file = "websockets-13.1-py3-none-any.whl", hash = "sha256:a9a396a6ad26130cdae92ae10c36af09d9bfe6cafe69670fd3b6da9b07b4044f"}, - {file = "websockets-13.1.tar.gz", hash = "sha256:a3b3366087c1bc0a2795111edcadddb8b3b59509d5db5d7ea3fdd69f954a8878"}, + {file = "websockets-14.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a0adf84bc2e7c86e8a202537b4fd50e6f7f0e4a6b6bf64d7ccb96c4cd3330b29"}, + {file = "websockets-14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90b5d9dfbb6d07a84ed3e696012610b6da074d97453bd01e0e30744b472c8179"}, + {file = "websockets-14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2177ee3901075167f01c5e335a6685e71b162a54a89a56001f1c3e9e3d2ad250"}, + {file = "websockets-14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f14a96a0034a27f9d47fd9788913924c89612225878f8078bb9d55f859272b0"}, + {file = "websockets-14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f874ba705deea77bcf64a9da42c1f5fc2466d8f14daf410bc7d4ceae0a9fcb0"}, + {file = "websockets-14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9607b9a442392e690a57909c362811184ea429585a71061cd5d3c2b98065c199"}, + {file = "websockets-14.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bea45f19b7ca000380fbd4e02552be86343080120d074b87f25593ce1700ad58"}, + {file = "websockets-14.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:219c8187b3ceeadbf2afcf0f25a4918d02da7b944d703b97d12fb01510869078"}, + {file = "websockets-14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ad2ab2547761d79926effe63de21479dfaf29834c50f98c4bf5b5480b5838434"}, + {file = "websockets-14.1-cp310-cp310-win32.whl", hash = "sha256:1288369a6a84e81b90da5dbed48610cd7e5d60af62df9851ed1d1d23a9069f10"}, + {file = "websockets-14.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0744623852f1497d825a49a99bfbec9bea4f3f946df6eb9d8a2f0c37a2fec2e"}, + {file = "websockets-14.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:449d77d636f8d9c17952628cc7e3b8faf6e92a17ec581ec0c0256300717e1512"}, + {file = "websockets-14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a35f704be14768cea9790d921c2c1cc4fc52700410b1c10948511039be824aac"}, + {file = "websockets-14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b1f3628a0510bd58968c0f60447e7a692933589b791a6b572fcef374053ca280"}, + {file = "websockets-14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c3deac3748ec73ef24fc7be0b68220d14d47d6647d2f85b2771cb35ea847aa1"}, + {file = "websockets-14.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7048eb4415d46368ef29d32133134c513f507fff7d953c18c91104738a68c3b3"}, + {file = "websockets-14.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6cf0ad281c979306a6a34242b371e90e891bce504509fb6bb5246bbbf31e7b6"}, + {file = "websockets-14.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cc1fc87428c1d18b643479caa7b15db7d544652e5bf610513d4a3478dbe823d0"}, + {file = "websockets-14.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f95ba34d71e2fa0c5d225bde3b3bdb152e957150100e75c86bc7f3964c450d89"}, + {file = "websockets-14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9481a6de29105d73cf4515f2bef8eb71e17ac184c19d0b9918a3701c6c9c4f23"}, + {file = "websockets-14.1-cp311-cp311-win32.whl", hash = "sha256:368a05465f49c5949e27afd6fbe0a77ce53082185bbb2ac096a3a8afaf4de52e"}, + {file = "websockets-14.1-cp311-cp311-win_amd64.whl", hash = "sha256:6d24fc337fc055c9e83414c94e1ee0dee902a486d19d2a7f0929e49d7d604b09"}, + {file = "websockets-14.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ed907449fe5e021933e46a3e65d651f641975a768d0649fee59f10c2985529ed"}, + {file = "websockets-14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:87e31011b5c14a33b29f17eb48932e63e1dcd3fa31d72209848652310d3d1f0d"}, + {file = "websockets-14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bc6ccf7d54c02ae47a48ddf9414c54d48af9c01076a2e1023e3b486b6e72c707"}, + {file = "websockets-14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9777564c0a72a1d457f0848977a1cbe15cfa75fa2f67ce267441e465717dcf1a"}, + {file = "websockets-14.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a655bde548ca98f55b43711b0ceefd2a88a71af6350b0c168aa77562104f3f45"}, + {file = "websockets-14.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3dfff83ca578cada2d19e665e9c8368e1598d4e787422a460ec70e531dbdd58"}, + {file = "websockets-14.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6a6c9bcf7cdc0fd41cc7b7944447982e8acfd9f0d560ea6d6845428ed0562058"}, + {file = "websockets-14.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4b6caec8576e760f2c7dd878ba817653144d5f369200b6ddf9771d64385b84d4"}, + {file = "websockets-14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eb6d38971c800ff02e4a6afd791bbe3b923a9a57ca9aeab7314c21c84bf9ff05"}, + {file = "websockets-14.1-cp312-cp312-win32.whl", hash = "sha256:1d045cbe1358d76b24d5e20e7b1878efe578d9897a25c24e6006eef788c0fdf0"}, + {file = "websockets-14.1-cp312-cp312-win_amd64.whl", hash = "sha256:90f4c7a069c733d95c308380aae314f2cb45bd8a904fb03eb36d1a4983a4993f"}, + {file = "websockets-14.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:3630b670d5057cd9e08b9c4dab6493670e8e762a24c2c94ef312783870736ab9"}, + {file = "websockets-14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36ebd71db3b89e1f7b1a5deaa341a654852c3518ea7a8ddfdf69cc66acc2db1b"}, + {file = "websockets-14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5b918d288958dc3fa1c5a0b9aa3256cb2b2b84c54407f4813c45d52267600cd3"}, + {file = "websockets-14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00fe5da3f037041da1ee0cf8e308374e236883f9842c7c465aa65098b1c9af59"}, + {file = "websockets-14.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8149a0f5a72ca36720981418eeffeb5c2729ea55fa179091c81a0910a114a5d2"}, + {file = "websockets-14.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77569d19a13015e840b81550922056acabc25e3f52782625bc6843cfa034e1da"}, + {file = "websockets-14.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cf5201a04550136ef870aa60ad3d29d2a59e452a7f96b94193bee6d73b8ad9a9"}, + {file = "websockets-14.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:88cf9163ef674b5be5736a584c999e98daf3aabac6e536e43286eb74c126b9c7"}, + {file = "websockets-14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:836bef7ae338a072e9d1863502026f01b14027250a4545672673057997d5c05a"}, + {file = "websockets-14.1-cp313-cp313-win32.whl", hash = "sha256:0d4290d559d68288da9f444089fd82490c8d2744309113fc26e2da6e48b65da6"}, + {file = "websockets-14.1-cp313-cp313-win_amd64.whl", hash = "sha256:8621a07991add373c3c5c2cf89e1d277e49dc82ed72c75e3afc74bd0acc446f0"}, + {file = "websockets-14.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:01bb2d4f0a6d04538d3c5dfd27c0643269656c28045a53439cbf1c004f90897a"}, + {file = "websockets-14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:414ffe86f4d6f434a8c3b7913655a1a5383b617f9bf38720e7c0799fac3ab1c6"}, + {file = "websockets-14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8fda642151d5affdee8a430bd85496f2e2517be3a2b9d2484d633d5712b15c56"}, + {file = "websockets-14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd7c11968bc3860d5c78577f0dbc535257ccec41750675d58d8dc66aa47fe52c"}, + {file = "websockets-14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a032855dc7db987dff813583d04f4950d14326665d7e714d584560b140ae6b8b"}, + {file = "websockets-14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7e7ea2f782408c32d86b87a0d2c1fd8871b0399dd762364c731d86c86069a78"}, + {file = "websockets-14.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:39450e6215f7d9f6f7bc2a6da21d79374729f5d052333da4d5825af8a97e6735"}, + {file = "websockets-14.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ceada5be22fa5a5a4cdeec74e761c2ee7db287208f54c718f2df4b7e200b8d4a"}, + {file = "websockets-14.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3fc753451d471cff90b8f467a1fc0ae64031cf2d81b7b34e1811b7e2691bc4bc"}, + {file = "websockets-14.1-cp39-cp39-win32.whl", hash = "sha256:14839f54786987ccd9d03ed7f334baec0f02272e7ec4f6e9d427ff584aeea8b4"}, + {file = "websockets-14.1-cp39-cp39-win_amd64.whl", hash = "sha256:d9fd19ecc3a4d5ae82ddbfb30962cf6d874ff943e56e0c81f5169be2fda62979"}, + {file = "websockets-14.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e5dc25a9dbd1a7f61eca4b7cb04e74ae4b963d658f9e4f9aad9cd00b688692c8"}, + {file = "websockets-14.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:04a97aca96ca2acedf0d1f332c861c5a4486fdcba7bcef35873820f940c4231e"}, + {file = "websockets-14.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df174ece723b228d3e8734a6f2a6febbd413ddec39b3dc592f5a4aa0aff28098"}, + {file = "websockets-14.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:034feb9f4286476f273b9a245fb15f02c34d9586a5bc936aff108c3ba1b21beb"}, + {file = "websockets-14.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c308dabd2b380807ab64b62985eaccf923a78ebc572bd485375b9ca2b7dc7"}, + {file = "websockets-14.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5a42d3ecbb2db5080fc578314439b1d79eef71d323dc661aa616fb492436af5d"}, + {file = "websockets-14.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ddaa4a390af911da6f680be8be4ff5aaf31c4c834c1a9147bc21cbcbca2d4370"}, + {file = "websockets-14.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a4c805c6034206143fbabd2d259ec5e757f8b29d0a2f0bf3d2fe5d1f60147a4a"}, + {file = "websockets-14.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:205f672a6c2c671a86d33f6d47c9b35781a998728d2c7c2a3e1cf3333fcb62b7"}, + {file = "websockets-14.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef440054124728cc49b01c33469de06755e5a7a4e83ef61934ad95fc327fbb0"}, + {file = "websockets-14.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7591d6f440af7f73c4bd9404f3772bfee064e639d2b6cc8c94076e71b2471c1"}, + {file = "websockets-14.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:25225cc79cfebc95ba1d24cd3ab86aaa35bcd315d12fa4358939bd55e9bd74a5"}, + {file = "websockets-14.1-py3-none-any.whl", hash = "sha256:4d4fc827a20abe6d544a119896f6b78ee13fe81cbfef416f3f2ddf09a03f0e2e"}, + {file = "websockets-14.1.tar.gz", hash = "sha256:398b10c77d471c0aab20a845e7a60076b6390bfdaac7a6d2edb0d2c59d75e8d8"}, ] [[package]] name = "werkzeug" -version = "3.0.4" +version = "3.1.3" description = "The comprehensive WSGI web application library." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "werkzeug-3.0.4-py3-none-any.whl", hash = "sha256:02c9eb92b7d6c06f31a782811505d2157837cea66aaede3e217c7c27c039476c"}, - {file = "werkzeug-3.0.4.tar.gz", hash = "sha256:34f2371506b250df4d4f84bfe7b0921e4762525762bbd936614909fe25cd7306"}, + {file = "werkzeug-3.1.3-py3-none-any.whl", hash = "sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e"}, + {file = "werkzeug-3.1.3.tar.gz", hash = "sha256:60723ce945c19328679790e3282cc758aa4a6040e4bb330f53d30fa546d44746"}, ] [package.dependencies] @@ -3342,13 +3333,13 @@ watchdog = ["watchdog (>=2.3)"] [[package]] name = "wheel" -version = "0.44.0" +version = "0.45.0" description = "A built-package format for Python" optional = false python-versions = ">=3.8" files = [ - {file = "wheel-0.44.0-py3-none-any.whl", hash = "sha256:2376a90c98cc337d18623527a97c31797bd02bad0033d41547043a1cbfbe448f"}, - {file = "wheel-0.44.0.tar.gz", hash = "sha256:a29c3f2817e95ab89aa4660681ad547c0e9547f20e75b0562fe7723c9a2a9d49"}, + {file = "wheel-0.45.0-py3-none-any.whl", hash = "sha256:52f0baa5e6522155090a09c6bd95718cc46956d1b51d537ea5454249edb671c7"}, + {file = "wheel-0.45.0.tar.gz", hash = "sha256:a57353941a3183b3d5365346b567a260a0602a0f8a635926a7dede41b94c674a"}, ] [package.extras] @@ -3435,13 +3426,13 @@ files = [ [[package]] name = "zipp" -version = "3.20.2" +version = "3.21.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "zipp-3.20.2-py3-none-any.whl", hash = "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350"}, - {file = "zipp-3.20.2.tar.gz", hash = "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29"}, + {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"}, + {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"}, ] [package.extras] @@ -3472,48 +3463,48 @@ test = ["zope.testrunner"] [[package]] name = "zope-interface" -version = "7.1.0" +version = "7.1.1" description = "Interfaces for Python" optional = false python-versions = ">=3.8" files = [ - {file = "zope.interface-7.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2bd9e9f366a5df08ebbdc159f8224904c1c5ce63893984abb76954e6fbe4381a"}, - {file = "zope.interface-7.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:661d5df403cd3c5b8699ac480fa7f58047a3253b029db690efa0c3cf209993ef"}, - {file = "zope.interface-7.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91b6c30689cfd87c8f264acb2fc16ad6b3c72caba2aec1bf189314cf1a84ca33"}, - {file = "zope.interface-7.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b6a4924f5bad9fe21d99f66a07da60d75696a136162427951ec3cb223a5570d"}, - {file = "zope.interface-7.1.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80a3c00b35f6170be5454b45abe2719ea65919a2f09e8a6e7b1362312a872cd3"}, - {file = "zope.interface-7.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:b936d61dbe29572fd2cfe13e30b925e5383bed1aba867692670f5a2a2eb7b4e9"}, - {file = "zope.interface-7.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0ac20581fc6cd7c754f6dff0ae06fedb060fa0e9ea6309d8be8b2701d9ea51c4"}, - {file = "zope.interface-7.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:848b6fa92d7c8143646e64124ed46818a0049a24ecc517958c520081fd147685"}, - {file = "zope.interface-7.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec1ef1fdb6f014d5886b97e52b16d0f852364f447d2ab0f0c6027765777b6667"}, - {file = "zope.interface-7.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bcff5c09d0215f42ba64b49205a278e44413d9bf9fa688fd9e42bfe472b5f4f"}, - {file = "zope.interface-7.1.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07add15de0cc7e69917f7d286b64d54125c950aeb43efed7a5ea7172f000fbc1"}, - {file = "zope.interface-7.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:9940d5bc441f887c5f375ec62bcf7e7e495a2d5b1da97de1184a88fb567f06af"}, - {file = "zope.interface-7.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f245d039f72e6f802902375755846f5de1ee1e14c3e8736c078565599bcab621"}, - {file = "zope.interface-7.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6159e767d224d8f18deff634a1d3722e68d27488c357f62ebeb5f3e2f5288b1f"}, - {file = "zope.interface-7.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e956b1fd7f3448dd5e00f273072e73e50dfafcb35e4227e6d5af208075593c9"}, - {file = "zope.interface-7.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff115ef91c0eeac69cd92daeba36a9d8e14daee445b504eeea2b1c0b55821984"}, - {file = "zope.interface-7.1.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bec001798ab62c3fc5447162bf48496ae9fba02edc295a9e10a0b0c639a6452e"}, - {file = "zope.interface-7.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:124149e2d42067b9c6597f4dafdc7a0983d0163868f897b7bb5dc850b14f9a87"}, - {file = "zope.interface-7.1.0-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:9733a9a0f94ef53d7aa64661811b20875b5bc6039034c6e42fb9732170130573"}, - {file = "zope.interface-7.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5fcf379b875c610b5a41bc8a891841533f98de0520287d7f85e25386cd10d3e9"}, - {file = "zope.interface-7.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0a45b5af9f72c805ee668d1479480ca85169312211bed6ed18c343e39307d5f"}, - {file = "zope.interface-7.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4af4a12b459a273b0b34679a5c3dc5e34c1847c3dd14a628aa0668e19e638ea2"}, - {file = "zope.interface-7.1.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a735f82d2e3ed47ca01a20dfc4c779b966b16352650a8036ab3955aad151ed8a"}, - {file = "zope.interface-7.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:5501e772aff595e3c54266bc1bfc5858e8f38974ce413a8f1044aae0f32a83a3"}, - {file = "zope.interface-7.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ec59fe53db7d32abb96c6d4efeed84aab4a7c38c62d7a901a9b20c09dd936e7a"}, - {file = "zope.interface-7.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e53c291debef523b09e1fe3dffe5f35dde164f1c603d77f770b88a1da34b7ed6"}, - {file = "zope.interface-7.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:711eebc77f2092c6a8b304bad0b81a6ce3cf5490b25574e7309fbc07d881e3af"}, - {file = "zope.interface-7.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a00ead2e24c76436e1b457a5132d87f83858330f6c923640b7ef82d668525d1"}, - {file = "zope.interface-7.1.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e28ea0bc4b084fc93a483877653a033062435317082cdc6388dec3438309faf"}, - {file = "zope.interface-7.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:27cfb5205d68b12682b6e55ab8424662d96e8ead19550aad0796b08dd2c9a45e"}, - {file = "zope.interface-7.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e3e48f3dea21c147e1b10c132016cb79af1159facca9736d231694ef5a740a8"}, - {file = "zope.interface-7.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a99240b1d02dc469f6afbe7da1bf617645e60290c272968f4e53feec18d7dce8"}, - {file = "zope.interface-7.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc8a318162123eddbdf22fcc7b751288ce52e4ad096d3766ff1799244352449d"}, - {file = "zope.interface-7.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7b25db127db3e6b597c5f74af60309c4ad65acd826f89609662f0dc33a54728"}, - {file = "zope.interface-7.1.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a29ac607e970b5576547f0e3589ec156e04de17af42839eedcf478450687317"}, - {file = "zope.interface-7.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:a14c9decf0eb61e0892631271d500c1e306c7b6901c998c7035e194d9150fdd1"}, - {file = "zope_interface-7.1.0.tar.gz", hash = "sha256:3f005869a1a05e368965adb2075f97f8ee9a26c61898a9e52a9764d93774f237"}, + {file = "zope.interface-7.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6650bd56ef350d37c8baccfd3ee8a0483ed6f8666e641e4b9ae1a1827b79f9e5"}, + {file = "zope.interface-7.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84e87eba6b77a3af187bae82d8de1a7c208c2a04ec9f6bd444fd091b811ad92e"}, + {file = "zope.interface-7.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c4e1b4c06d9abd1037c088dae1566c85f344a3e6ae4350744c3f7f7259d9c67"}, + {file = "zope.interface-7.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7cd5e3d910ac87652a09f6e5db8e41bc3b49cf08ddd2d73d30afc644801492cd"}, + {file = "zope.interface-7.1.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca95594d936ee349620900be5b46c0122a1ff6ce42d7d5cb2cf09dc84071ef16"}, + {file = "zope.interface-7.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:ad339509dcfbbc99bf8e147db6686249c4032f26586699ec4c82f6e5909c9fe2"}, + {file = "zope.interface-7.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3e59f175e868f856a77c0a77ba001385c377df2104fdbda6b9f99456a01e102a"}, + {file = "zope.interface-7.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0de23bcb93401994ea00bc5c677ef06d420340ac0a4e9c10d80e047b9ce5af3f"}, + {file = "zope.interface-7.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cdb7e7e5524b76d3ec037c1d81a9e2c7457b240fd4cb0a2476b65c3a5a6c81f"}, + {file = "zope.interface-7.1.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3603ef82a9920bd0bfb505423cb7e937498ad971ad5a6141841e8f76d2fd5446"}, + {file = "zope.interface-7.1.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1d52d052355e0c5c89e0630dd2ff7c0b823fd5f56286a663e92444761b35e25"}, + {file = "zope.interface-7.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:179ad46ece518c9084cb272e4a69d266b659f7f8f48e51706746c2d8a426433e"}, + {file = "zope.interface-7.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e6503534b52bb1720ace9366ee30838a58a3413d3e197512f3338c8f34b5d89d"}, + {file = "zope.interface-7.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f85b290e5b8b11814efb0d004d8ce6c9a483c35c462e8d9bf84abb93e79fa770"}, + {file = "zope.interface-7.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d029fac6a80edae80f79c37e5e3abfa92968fe921886139b3ee470a1b177321a"}, + {file = "zope.interface-7.1.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5836b8fb044c6e75ba34dfaabc602493019eadfa0faf6ff25f4c4c356a71a853"}, + {file = "zope.interface-7.1.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7395f13533318f150ee72adb55b29284b16e73b6d5f02ab21f173b3e83f242b8"}, + {file = "zope.interface-7.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:1d0e23c6b746eb8ce04573cc47bcac60961ac138885d207bd6f57e27a1431ae8"}, + {file = "zope.interface-7.1.1-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:9fad9bd5502221ab179f13ea251cb30eef7cf65023156967f86673aff54b53a0"}, + {file = "zope.interface-7.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:55c373becbd36a44d0c9be1d5271422fdaa8562d158fb44b4192297b3c67096c"}, + {file = "zope.interface-7.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed1df8cc01dd1e3970666a7370b8bfc7457371c58ba88c57bd5bca17ab198053"}, + {file = "zope.interface-7.1.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99c14f0727c978639139e6cad7a60e82b7720922678d75aacb90cf4ef74a068c"}, + {file = "zope.interface-7.1.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b1eed7670d564f1025d7cda89f99f216c30210e42e95de466135be0b4a499d9"}, + {file = "zope.interface-7.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:3defc925c4b22ac1272d544a49c6ba04c3eefcce3200319ee1be03d9270306dd"}, + {file = "zope.interface-7.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8d0fe45be57b5219aa4b96e846631c04615d5ef068146de5a02ccd15c185321f"}, + {file = "zope.interface-7.1.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bcbeb44fc16e0078b3b68a95e43f821ae34dcbf976dde6985141838a5f23dd3d"}, + {file = "zope.interface-7.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8e7b05dc6315a193cceaec071cc3cf1c180cea28808ccded0b1283f1c38ba73"}, + {file = "zope.interface-7.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d553e02b68c0ea5a226855f02edbc9eefd99f6a8886fa9f9bdf999d77f46585"}, + {file = "zope.interface-7.1.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81744a7e61b598ebcf4722ac56a7a4f50502432b5b4dc7eb29075a89cf82d029"}, + {file = "zope.interface-7.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:7720322763aceb5e0a7cadcc38c67b839efe599f0887cbf6c003c55b1458c501"}, + {file = "zope.interface-7.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1a2ed0852c25950cf430067f058f8d98df6288502ac313861d9803fe7691a9b3"}, + {file = "zope.interface-7.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9595e478047ce752b35cfa221d7601a5283ccdaab40422e0dc1d4a334c70f580"}, + {file = "zope.interface-7.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2317e1d4dba68203a5227ea3057f9078ec9376275f9700086b8f0ffc0b358e1b"}, + {file = "zope.interface-7.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6821ef9870f32154da873fcde439274f99814ea452dd16b99fa0b66345c4b6b"}, + {file = "zope.interface-7.1.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:190eeec67e023d5aac54d183fa145db0b898664234234ac54643a441da434616"}, + {file = "zope.interface-7.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:d17e7fc814eaab93409b80819fd6d30342844345c27f3bc3c4b43c2425a8d267"}, + {file = "zope.interface-7.1.1.tar.gz", hash = "sha256:4284d664ef0ff7b709836d4de7b13d80873dc5faeffc073abdb280058bfac5e3"}, ] [package.dependencies] diff --git a/pyproject.toml b/pyproject.toml index 01d84bdc..a5d54676 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,6 +2,9 @@ requires = ["poetry_core"] build-backend = "poetry.core.masonry.api" +[project] +requires-python = ">=3.9,<3.14" + [tool.poetry] name = "flama" version = "1.8.1" @@ -123,7 +126,7 @@ skip_glob = [ [tool.ruff] line-length = 120 # Enable Pyflakes and pycodestyle rules. -select = ["C90", "E", "F", "G", "I", "W", "T"] +select = ["C90", "E", "F", "G", "I", "W", "T", "UP"] ignore = ["E721"] exclude = [ ".git", diff --git a/tests/config/conftest.py b/tests/config/conftest.py index f4e024c8..2b19eb81 100644 --- a/tests/config/conftest.py +++ b/tests/config/conftest.py @@ -40,7 +40,7 @@ def __exit__(self, exc_type, exc_value, traceback) -> None: self.file.__exit__(exc_type, exc_value, traceback) del self.file - def generate(self, factory: str) -> t.Dict[str, t.Any]: + def generate(self, factory: str) -> dict[str, t.Any]: try: result = self._factories[factory]() self.file.seek(0) @@ -48,23 +48,23 @@ def generate(self, factory: str) -> t.Dict[str, t.Any]: except KeyError: raise ValueError(f"Config file factory '{factory}' not found") - def _config_no_sections(self) -> t.Dict[str, t.Any]: + def _config_no_sections(self) -> dict[str, t.Any]: self.file.write("foo = 1") return {"foo": "1"} - def _config(self) -> t.Dict[str, t.Any]: + def _config(self) -> dict[str, t.Any]: self.file.write("[foo]\nbar = 1") return {"foo": {"bar": "1"}} - def _json(self) -> t.Dict[str, t.Any]: + def _json(self) -> dict[str, t.Any]: self.file.write('{"foo": 1}') return {"foo": 1} - def _yaml(self) -> t.Dict[str, t.Any]: + def _yaml(self) -> dict[str, t.Any]: self.file.write("foo:\n bar: 1") return {"foo": {"bar": 1}} - def _toml(self) -> t.Dict[str, t.Any]: + def _toml(self) -> dict[str, t.Any]: self.file.write("[foo]\nbar = 1") return {"foo": {"bar": 1}} diff --git a/tests/schemas/conftest.py b/tests/schemas/conftest.py index 99b93643..e9e1330f 100644 --- a/tests/schemas/conftest.py +++ b/tests/schemas/conftest.py @@ -78,7 +78,7 @@ def bar_optional_schema(app, foo_schema): def bar_list_schema(app, foo_schema): child_schema = foo_schema.schema if app.schema.schema_library.lib == pydantic: - schema = pydantic.create_model("BarList", foo=(t.List[child_schema], ...), __module__="pydantic.main") + schema = pydantic.create_model("BarList", foo=(list[child_schema], ...), __module__="pydantic.main") name = "pydantic.main.BarList" elif app.schema.schema_library.lib == typesystem: schema = typesystem.Schema( @@ -106,7 +106,7 @@ def bar_list_schema(app, foo_schema): def bar_dict_schema(app, foo_schema): child_schema = foo_schema.schema if app.schema.schema_library.lib == pydantic: - schema = pydantic.create_model("BarDict", foo=(t.Dict[str, child_schema], ...), __module__="pydantic.main") + schema = pydantic.create_model("BarDict", foo=(dict[str, child_schema], ...), __module__="pydantic.main") name = "pydantic.main.BarDict" elif app.schema.schema_library.lib == typesystem: schema = typesystem.Schema( diff --git a/tests/schemas/test_data_structures.py b/tests/schemas/test_data_structures.py index e04755ba..ec5090ec 100644 --- a/tests/schemas/test_data_structures.py +++ b/tests/schemas/test_data_structures.py @@ -45,10 +45,10 @@ class TestCaseField: id="nullable", ), pytest.param( - {"name": "foo", "type": t.List[int]}, + {"name": "foo", "type": list[int]}, { "name": "foo", - "type": t.List[int], + "type": list[int], "nullable": False, "multiple": True, "required": True, @@ -89,7 +89,7 @@ def test_is_field(self): pytest.param(types.QueryParam, True, id="query_param"), pytest.param(types.PathParam, True, id="path_param"), pytest.param(t.Optional[int], True, id="nullable"), - pytest.param(t.List[int], True, id="list"), + pytest.param(list[int], True, id="list"), pytest.param(Mock, False, id="not_valid"), ), ) @@ -115,7 +115,7 @@ def schema_type( # noqa: C901 elif request.param == "schema": return types.Schema[foo_schema.schema] elif request.param == "list_of_schema": - return t.List[types.Schema[foo_schema.schema]] if inspect.isclass(foo_schema.schema) else foo_schema.schema + return list[types.Schema[foo_schema.schema]] if inspect.isclass(foo_schema.schema) else foo_schema.schema elif request.param == "schema_partial": if app.schema.schema_library.lib in (typesystem,): pytest.skip("Library does not support optional partial schemas") diff --git a/tests/utils.py b/tests/utils.py index 49884984..3a851c77 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -32,7 +32,7 @@ def __bool__(self) -> bool: class SQLAlchemyContext: - def __init__(self, app: Flama, tables: t.List[sqlalchemy.Table]): + def __init__(self, app: Flama, tables: list[sqlalchemy.Table]): self.app = app self.tables = tables diff --git a/tests/validation/test_schemas.py b/tests/validation/test_schemas.py index 4ad67dd7..30d91a28 100644 --- a/tests/validation/test_schemas.py +++ b/tests/validation/test_schemas.py @@ -139,7 +139,7 @@ def place_identity(place: types.Schema[place_schema]) -> types.Schema[place_sche return place @app.route("/many-products", methods=["GET"]) - def many_products(products: t.List[types.Schema[product_schema]]) -> types.Schema[product_schema]: + def many_products(products: list[types.Schema[product_schema]]) -> types.Schema[product_schema]: return products @app.route("/partial-product", methods=["GET"])