diff --git a/docs/dependency_injection.md b/docs/dependency_injection.md index 962ec5463..601eb73f9 100644 --- a/docs/dependency_injection.md +++ b/docs/dependency_injection.md @@ -1,104 +1,29 @@ ## Dependency injection -Dependency injection is a pattern when a function receives other functions that it requires, -instead of creating them internally. -In frontik implementation, dependencies are simple functions, -which run after `RequestHandler.prepare` and before* handler code is executed. -Dependencies are great for running common actions before actual request processing takes place. - -Here is what a dependencies may look like: - -```python -from frontik.dependency_manager import dependency - - -async def get_session_dependency(handler: PageHandler) -> Session: - token = handler.get_cookie('token') - return await session_client.get_session(token) - - -class Page(PageHandler): - # Can be used on class level - dependencies = (another_dependency,) - - async def get_page(self, session=dependency(get_session_dependency)): - self.json.put({'result': session}) -``` - -If you have several dependencies without results, you can put them all to one dependency marker -```python -from frontik.dependency_manager import dependency - - -async def check_host(handler: PageHandler) -> None: - if handler.request.host != 'example': - raise HttpError() - - -async def check_session(session=dependency(get_session_dependency)) -> None: - if session.role != 'admin': - raise HttpError() - - -class Page(PageHandler): - async def get_page(self, _=dependency(check_host, check_session)): - ... -``` - -Dependency can be sync or async functions. When page is executed all ready to run -async dependencies run in parallel with asyncio.gather(). If something finishes the page -(call self.finish() or raise Exception), then we stop executing the remaining dependencies - -Dependencies can depend on another dependencies, thus we have a dependency graph. -Within one execution of a graph, the same dependencies will be executed once. -Sameness is determined by {function.__module__}.{function.__name__} -Dependencies can come from factories, then it turns out that there are several different dependencies -with the same name. In this case the one that is specified explicitly in the method arg or -in class level will be taken, the rest from the graph depths will be discarded - - -There is an opportunity to specify priorities for dependencies: +We are in the process of migrating to fastapi. But, we still use the server and routing from tornado. +So, in order to specify dependencies for handler, you should pass dependencies to router decorator. +There is special dependency `get_current_handler` for getting PageHandler object ```python -from frontik.dependency_manager import dependency - +from frontik.dependency_manager import APIRouter +from fastapi import Depends +from frontik.handler import PageHandler, get_current_handler -async def get_session_dependency(handler: PageHandler) -> Session: - token = handler.get_cookie('token') - return await session_client.get_session(token) +router = APIRouter(dependencies=[Depends(some_dependency_function)]) -class Page(PageHandler): - # Can be used on class level - dependencies = (another_dependency,) - _priority_dependency_names: list[str] = [ - side_dependency, - another_dependency, - ] - - async def get_page(self, session=dependency(get_session_dependency)): - self.json.put({'result': session}) -``` -If any of the _priority_dependency_names are present in the current graph, -they will be executed before all the other dependencies sequentially. -In the given example `another_dependency` -> `get_session_dependency` -> `get_page` - - -*It is also possible to specify "async" dependencies: - -```python -from frontik.dependency_manager import dependency, async_dependencies - - -async def get_session_dependency(handler: PageHandler) -> Session: +async def get_session_dependency(handler: PageHandler = Depends(get_current_handler)): token = handler.get_cookie('token') - return await session_client.get_session(token) + await session_client.get_session(token) class Page(PageHandler): - @async_dependencies([get_session_dependency]) + @router.get(dependencies=[Depends(get_session_dependency)]) async def get_page(self): - self.json.put({'result': 'done'}) + ... ``` -The passed list will not block the execution of the page_method, so they can be executed in parallel +If you don’t need to use special dependencies at the router level, then you can use router from the frontik.handler +```py +from frontik.handler import router +``` diff --git a/frontik/dependency_manager.py b/frontik/dependency_manager.py new file mode 100644 index 000000000..f9037176d --- /dev/null +++ b/frontik/dependency_manager.py @@ -0,0 +1,55 @@ +from typing import Any, Callable + +from fastapi import APIRouter as FastApiRouter +from fastapi import Request +from fastapi.dependencies.utils import solve_dependencies + + +class APIRouter(FastApiRouter): + def get(self, **kwargs) -> Callable: # type: ignore + return super().get('', **kwargs) + + def post(self, **kwargs) -> Callable: # type: ignore + return super().post('', **kwargs) + + def put(self, **kwargs) -> Callable: # type: ignore + return super().put('', **kwargs) + + def delete(self, **kwargs) -> Callable: # type: ignore + return super().delete('', **kwargs) + + def api_route(self, *args, **kwargs): + decorator = super().api_route(*args, **kwargs) + + def frontik_decorator(func): + decorator(func) + func._route = self.routes[-1] + route_method = func._route.methods # type: ignore + + if func.__name__ in ('get_page', 'post_page', 'put_page', 'delete_page') and route_method != { + func.__name__.split('_')[0].upper(), + }: + raise RuntimeError(f'Wrong router type func={func.__name__} method={route_method}') + return func + + return frontik_decorator + + +async def execute_page_method_with_dependencies(handler: Any, get_page_method: Callable) -> Any: + request = Request({ + 'type': 'http', + 'query_string': '', + 'headers': '', + 'handler': handler, + }) + + route = get_page_method._route # type: ignore + + await solve_dependencies( + request=request, + dependant=route.dependant, + body=None, + dependency_overrides_provider=None, + ) + + return await get_page_method() diff --git a/frontik/dependency_manager/__init__.py b/frontik/dependency_manager/__init__.py deleted file mode 100644 index 92df5fe6a..000000000 --- a/frontik/dependency_manager/__init__.py +++ /dev/null @@ -1,68 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any - -from frontik.dependency_manager.dependencies import DependencyGroupMarker, DependencyMarker -from frontik.dependency_manager.graph_builder import build_sub_graph, get_dependency_graph -from frontik.dependency_manager.graph_runner import execute_graph -from frontik.preprocessors import Preprocessor, make_full_name - -if TYPE_CHECKING: - from collections.abc import Callable - - from frontik.handler import PageHandler - from frontik.handler_return_values import ReturnedValue - - -def dependency(*deps: Preprocessor | Callable) -> Any: - """ - add dependency to page_method, it will be run before page_method and provide result - - async def get_page(self, session=dependency(get_session)): - ... - """ - if len(deps) == 1: - dep = deps[0] - - if isinstance(dep, Preprocessor): - return DependencyMarker(dep.preprocessor_function) - - if callable(dep): - return DependencyMarker(dep) - - raise ValueError('Bad dependency type, only func or list[func]') - - else: - return DependencyGroupMarker(tuple(deps)) - - -def async_dependencies(async_deps: list[Callable]) -> Callable: - """ - add dependencies that will be run in parallel with page_method - - @async_dependencies([get_session, get_data]) - async def get_page(self): - ... - """ - - def decorator(execute_page_method: Callable) -> Callable: - setattr(execute_page_method, '_async_deps', async_deps) - return execute_page_method - - return decorator - - -async def build_and_run_sub_graph(handler: PageHandler, functions_to_run: list) -> None: - sub_graph = build_sub_graph(handler, functions_to_run) - await execute_graph(handler, sub_graph) - - -async def execute_page_method_with_dependencies(handler: PageHandler, page_method: Any) -> ReturnedValue: - main_graph = get_dependency_graph(page_method.__func__, handler.__class__) - setattr(handler, '_main_graph', main_graph) - await execute_graph(handler, main_graph) - return main_graph.root_dep.result - - -def make_dependencies_names_list(dependencies_list: list) -> list[str]: - return [make_full_name(d) for d in dependencies_list] diff --git a/frontik/dependency_manager/dependencies.py b/frontik/dependency_manager/dependencies.py deleted file mode 100644 index 85e9249eb..000000000 --- a/frontik/dependency_manager/dependencies.py +++ /dev/null @@ -1,101 +0,0 @@ -from __future__ import annotations - -import asyncio -from graphlib import TopologicalSorter -from typing import TYPE_CHECKING, Optional - -from frontik.preprocessors import make_full_name - -if TYPE_CHECKING: - from collections.abc import Callable, Iterable - - from frontik.handler import PageHandler - - -class DependencyMarker: - def __init__(self, func: Callable) -> None: - self.func = func - - -class DependencyGroupMarker: - __name__ = 'dep_group' - - def __init__(self, deps: Iterable[Callable]) -> None: - self.deps = deps - - -class Dependency: - def __init__(self, func: Callable) -> None: - self.func = func - self.args: list = [] - self.result = None - self.finished = False - self.task: Optional[asyncio.Task] = None - self.waited = True - - async def run(self) -> None: - """ - replace self.args with the result of completed sub_dependencies and run self.func - if sub_dependency is not finished raise RuntimeError - """ - if self.finished: - return - - for i, arg in enumerate(self.args): - if isinstance(arg, Dependency): - if not arg.finished: - raise RuntimeError(f'Graph corrupted, run {self}, before finishing {arg}') - self.args[i] = arg.result - - if asyncio.iscoroutinefunction(self.func): - if self.waited: - self.result = await self.func(*self.args) - else: - asyncio.create_task(self.func(*self.args)) - else: - self.result = self.func(*self.args) - self.finished = True - - def __repr__(self): - return make_full_name(self.func) - - -class DependencyGraph: - """ - known_deps - to prevent re-registration of function multiple times - registered_deps - to make correct dependency_links in case of building a sub_graph - dependency_links - links dict for build TopologicalSorter - handler_cls - special argument type for using special dependencies for example get_handler() - """ - - def __init__(self, root_dep: Dependency, handler_cls: type) -> None: - self.root_dep: Dependency = root_dep - self.known_deps: dict[str, Dependency] = {} - self.registered_deps: set[Dependency] = set() - self.dependency_links: dict[Dependency, set[Dependency]] = {root_dep: set()} - self.handler_cls: type = handler_cls - self.topological_sorter: Optional[TopologicalSorter[Dependency]] = None - self.special_deps: set[Dependency] = set() - - def build_topological_sorter(self) -> None: - self.topological_sorter = TopologicalSorter(self.dependency_links) - self.topological_sorter.prepare() - - async def run_dependency(self, dependency: Dependency) -> None: - await dependency.run() - if self.topological_sorter is None: - raise RuntimeError('There is no topological_sorter in dependency graph') - self.topological_sorter.done(dependency) - - -def make_stub_dependency() -> Dependency: - def stub(): - pass - - dependency = Dependency(stub) - dependency.finished = True - return dependency - - -def get_handler(handler: PageHandler) -> PageHandler: - return handler diff --git a/frontik/dependency_manager/graph_builder.py b/frontik/dependency_manager/graph_builder.py deleted file mode 100644 index a3320ad81..000000000 --- a/frontik/dependency_manager/graph_builder.py +++ /dev/null @@ -1,248 +0,0 @@ -from __future__ import annotations - -import inspect -from copy import copy, deepcopy -from typing import TYPE_CHECKING, Any - -from frontik.dependency_manager.dependencies import ( - Dependency, - DependencyGraph, - DependencyGroupMarker, - DependencyMarker, - get_handler, - make_stub_dependency, -) -from frontik.preprocessors import ( - Preprocessor, - get_preprocessors, - make_full_name, -) - -if TYPE_CHECKING: - from collections.abc import Callable, Generator, Iterable - - from frontik.handler import PageHandler - - -def build_sub_graph(handler: PageHandler, dependencies_to_run: list) -> DependencyGraph: - """ - building sub_graph - duplicated dependencies will be taken from main graph - """ - root_dep = make_stub_dependency() - sub_graph = DependencyGraph(root_dep, handler.__class__) - - main_graph: DependencyGraph = getattr(handler, '_main_graph') - sub_graph.known_deps = main_graph.known_deps - - # collect dependencies which defined explicitly - shallow_dependencies = _get_shallow_functions(dependencies_to_run) - _register_side_dependencies(sub_graph, root_dep, shallow_dependencies, deep_scan=False) - - # collect all dependencies with deep_scan - all_dependencies = _get_all_functions(dependencies_to_run) - _register_side_dependencies(sub_graph, root_dep, all_dependencies, deep_scan=True) - - _set_priority_links(handler.__class__._priority_dependency_names, sub_graph) - sub_graph.build_topological_sorter() - return sub_graph - - -def _get_shallow_functions(dependencies_to_run: list) -> Generator: - for dependency_item in dependencies_to_run: - if not isinstance(dependency_item, DependencyGroupMarker): - yield dependency_item - - -def _get_all_functions(dependencies_to_run: list) -> Generator: - for dependency_item in dependencies_to_run: - if isinstance(dependency_item, DependencyGroupMarker): - yield from dependency_item.deps - else: - yield dependency_item - - -def get_dependency_graph(page_method_func: Callable, handler_cls: type) -> DependencyGraph: - """ - build meta_graph or make deepcopy as main_graph if meta_graph existed - - register dependencies from page_method_func args - register legacy preprocessors and class level dependencies - add extra links for handler priority_list - """ - if hasattr(page_method_func, '_meta_graph'): - return deepcopy(page_method_func._meta_graph) - - root_dep = Dependency(page_method_func) - meta_graph = DependencyGraph(root_dep, handler_cls) - - handler_dependencies = getattr(handler_cls, 'dependencies', []) - side_dependencies = [*get_preprocessors(page_method_func), *handler_dependencies] - - # collect dependencies which defined explicitly - _register_dependency_params(meta_graph, root_dep, add_to_args=False, deep_scan=False) - _register_side_dependencies(meta_graph, root_dep, side_dependencies, deep_scan=False) - - # collect all dependencies with deep_scan - _register_dependency_params(meta_graph, root_dep, add_to_args=True, deep_scan=True) - _register_side_dependencies(meta_graph, root_dep, side_dependencies, deep_scan=True) - - async_dependencies = getattr(page_method_func, '_async_deps', []) - _register_async_dependencies(meta_graph, async_dependencies) - - priorities = getattr(handler_cls, '_priority_dependency_names', []) - _set_priority_links(priorities, meta_graph) - - meta_graph.build_topological_sorter() - setattr(page_method_func, '_meta_graph', meta_graph) - return deepcopy(meta_graph) - - -def _register_side_dependencies( - graph: DependencyGraph, - root_dep: Dependency, - side_dependencies: Iterable, - deep_scan: bool, -) -> None: - for function_or_preprocessor in side_dependencies: - dependency = _make_dependency_for_graph(graph, function_or_preprocessor, deep_scan=deep_scan) - if deep_scan: - _register_sub_dependency(graph, root_dep, dependency, add_to_args=False) - - -def _register_async_dependencies(graph: DependencyGraph, async_dependencies: Iterable) -> None: - root_dep = make_stub_dependency() - for dependency_function in async_dependencies: - dependency = _make_dependency_for_graph(graph, dependency_function, deep_scan=True) - dependency.waited = False - _register_sub_dependency(graph, root_dep, dependency, add_to_args=False) - - -def _set_priority_links(priority_list: list[str], graph: DependencyGraph) -> None: - """ - add extra links for handler priority_list - - filter priority_list against registered dependencies - link each with each in a chain - link remaining registered dependencies on last one from priority_list - """ - priority_filtered: list[Dependency] = [] - for func_name in priority_list: - if func_name not in graph.known_deps: - continue - priority_dep = graph.known_deps[func_name] - if priority_dep in graph.registered_deps and priority_dep not in priority_filtered: - priority_filtered.append(priority_dep) - - if len(priority_filtered) > 1: - for i in range(len(priority_filtered) - 1): - cur_dep = priority_filtered[i] - next_dep = priority_filtered[i + 1] - - if next_dep not in graph.dependency_links: - graph.dependency_links[next_dep] = {cur_dep} - continue - - if cur_dep not in graph.dependency_links[next_dep]: - graph.dependency_links[next_dep].add(cur_dep) - - if len(priority_filtered) > 0: - last_priority_dep = priority_filtered[-1] - should_depends_on_last = copy(graph.registered_deps) - - for d in priority_filtered: - should_depends_on_last.discard(d) - for sd in graph.dependency_links.get(d, set()): - should_depends_on_last.discard(sd) - - for d in should_depends_on_last: - if d not in graph.dependency_links: - graph.dependency_links[d] = {last_priority_dep} - elif last_priority_dep not in graph.dependency_links[d]: - graph.dependency_links[d].add(last_priority_dep) - - -def _register_dependency_params( - graph: DependencyGraph, - dependency: Dependency, - add_to_args: bool, - deep_scan: bool, -) -> None: - signature_params = inspect.signature(dependency.func).parameters - - for param_name, param in signature_params.items(): - if isinstance(param.default, DependencyMarker): - sub_dependency = _make_dependency_for_graph(graph, param.default.func, deep_scan) - if deep_scan: - _register_sub_dependency(graph, dependency, sub_dependency, add_to_args) - - elif isinstance(param.default, DependencyGroupMarker): - if add_to_args: - dependency.args.append(None) - for sub_dependency_func in param.default.deps: - sub_dependency = _make_dependency_for_graph(graph, sub_dependency_func, deep_scan) - if deep_scan: - _register_sub_dependency(graph, dependency, sub_dependency, False) - - elif issubclass(graph.handler_cls, param.annotation) or param_name == 'self': - sub_dependency = _make_dependency_for_graph(graph, get_handler, deep_scan) - graph.special_deps.add(sub_dependency) - if deep_scan: - _register_sub_dependency(graph, dependency, sub_dependency, add_to_args) - - else: - raise ValueError(f'Only dependencies or handler could be in params, dep:{dependency} param:{param}') - - -def _register_sub_dependency( - graph: DependencyGraph, - dependency: Dependency, - sub_dependency: Dependency, - add_to_args: bool, -) -> None: - """ - register sub dependency - add to parent dependency args (if it was in signature) - add link to graph - deep scan sub_dependency parameters - """ - if sub_dependency not in graph.registered_deps: - graph.registered_deps.add(sub_dependency) - need_add_to_args = len(sub_dependency.args) == 0 - if sub_dependency not in graph.special_deps: - _register_dependency_params(graph, sub_dependency, need_add_to_args, True) - - if add_to_args: - dependency.args.append(sub_dependency) - - if dependency in graph.dependency_links: - graph.dependency_links[dependency].add(sub_dependency) - else: - graph.dependency_links[dependency] = {sub_dependency} - - -def _make_dependency_for_graph(graph: DependencyGraph, function_or_preprocessor: Any, deep_scan: bool) -> Dependency: - """ - make dependency from function - if function is Preprocessor, then take underlying function - duplicates would be avoided based on known_deps from graph - - if there are two different dependency with same name (factory's dependency), then leave only first - if they both are in signature explicitly, raise ValueError('Dependency conflict') - """ - if isinstance(function_or_preprocessor, Preprocessor): - function_or_preprocessor = function_or_preprocessor.preprocessor_function - - function_name = make_full_name(function_or_preprocessor) - - if function_name in graph.known_deps: - sub_dependency = graph.known_deps[function_name] - - if sub_dependency.func != function_or_preprocessor and not deep_scan: - raise ValueError(f'Dependency conflict {sub_dependency.func} != {function_or_preprocessor}') - - else: - sub_dependency = Dependency(function_or_preprocessor) - graph.known_deps[function_name] = sub_dependency - - return sub_dependency diff --git a/frontik/dependency_manager/graph_runner.py b/frontik/dependency_manager/graph_runner.py deleted file mode 100644 index fc27f8fa4..000000000 --- a/frontik/dependency_manager/graph_runner.py +++ /dev/null @@ -1,44 +0,0 @@ -from __future__ import annotations - -import asyncio -from typing import TYPE_CHECKING - -if TYPE_CHECKING: - from frontik.dependency_manager.dependencies import Dependency, DependencyGraph - from frontik.handler import PageHandler - - -async def run_special_dependencies(handler: PageHandler, graph: DependencyGraph) -> None: - for dependency in graph.special_deps: - dependency.result = dependency.func(handler) - dependency.finished = True - - -async def execute_graph(handler: PageHandler, graph: DependencyGraph) -> None: - await run_special_dependencies(handler, graph) - - pending_tasks: set[asyncio.Task] = set() - topological_sorter = graph.topological_sorter - if topological_sorter is None: - raise RuntimeError('There is no topological_sorter in dependency graph') - - while topological_sorter.is_active(): - dependencies_to_run: tuple[Dependency, ...] = topological_sorter.get_ready() - - if handler.is_finished(): - for p in pending_tasks: - p.cancel() - return - - for dependency in dependencies_to_run: - task = asyncio.create_task(graph.run_dependency(dependency)) - pending_tasks.add(task) - - if pending_tasks: - done, pending = await asyncio.wait(pending_tasks, return_when=asyncio.FIRST_COMPLETED) - for d in done: - if d.exception() is not None: - raise d.exception() # type: ignore - pending_tasks.remove(d) - for p in pending: - pending_tasks.add(p) diff --git a/frontik/handler.py b/frontik/handler.py index 0649a9cde..677643e31 100644 --- a/frontik/handler.py +++ b/frontik/handler.py @@ -12,6 +12,7 @@ import tornado.httputil import tornado.web +from fastapi import Request # noqa from http_client.request_response import USER_AGENT_HEADER, FailFastError, RequestBuilder, RequestResult from pydantic import BaseModel, ValidationError from tornado.ioloop import IOLoop @@ -25,7 +26,7 @@ from frontik import media_types, request_context from frontik.auth import DEBUG_AUTH_HEADER_NAME from frontik.debug import DEBUG_HEADER_NAME, DebugMode -from frontik.dependency_manager import execute_page_method_with_dependencies +from frontik.dependency_manager import APIRouter, execute_page_method_with_dependencies from frontik.futures import AbortAsyncGroup, AsyncGroup from frontik.http_status import ALLOWED_STATUSES, CLIENT_CLOSED_REQUEST from frontik.json_builder import FrontikJsonDecodeError, json_decode @@ -37,7 +38,7 @@ from frontik.version import version as frontik_version if TYPE_CHECKING: - from collections.abc import Callable, Coroutine, Iterable + from collections.abc import Callable, Coroutine from http_client import HttpClient from tornado.httputil import HTTPServerRequest @@ -75,6 +76,7 @@ def __init__(self, *args: object) -> None: OUTER_TIMEOUT_MS_HEADER = 'X-Outer-Timeout-Ms' handler_logger = logging.getLogger('handler') +router = APIRouter() def _fail_fast_policy(fail_fast: bool, waited: bool, host: str, path: str) -> bool: @@ -90,8 +92,6 @@ def _fail_fast_policy(fail_fast: bool, waited: bool, host: str, path: str) -> bo class PageHandler(RequestHandler): - dependencies: Iterable = () - _priority_dependency_names: list[str] = [] returned_value_handlers: ReturnedValueHandlers = [] def __init__(self, application: FrontikApplication, request: HTTPServerRequest, **kwargs: Any) -> None: @@ -380,18 +380,22 @@ async def _execute_page(self, page_handler_method: Callable[[], Coroutine[Any, A if render_result is not None: self.write(render_result) + @router.get() async def get_page(self): """This method can be implemented in the subclass""" self.__return_405() + @router.post() async def post_page(self): """This method can be implemented in the subclass""" self.__return_405() + @router.put() async def put_page(self): """This method can be implemented in the subclass""" self.__return_405() + @router.delete() async def delete_page(self): """This method can be implemented in the subclass""" self.__return_405() @@ -955,5 +959,10 @@ class ErrorHandler(PageHandler, tornado.web.ErrorHandler): class RedirectHandler(PageHandler, tornado.web.RedirectHandler): + @router.get() def get_page(self): tornado.web.RedirectHandler.get(self) + + +def get_current_handler(request: Request) -> PageHandler: + return request['handler'] diff --git a/frontik/preprocessors.py b/frontik/preprocessors.py deleted file mode 100644 index 6b9cb9453..000000000 --- a/frontik/preprocessors.py +++ /dev/null @@ -1,30 +0,0 @@ -from collections.abc import Callable -from typing import Any, Union - - -class Preprocessor: - """Deprecated, use frontik.dependency_manager.Dependency""" - - def __init__(self, preprocessor_function: Callable) -> None: - self.preprocessor_function = preprocessor_function - - @property - def preprocessor_name(self) -> str: - return make_full_name(self.preprocessor_function) - - def __call__(self, page_func: Callable) -> Callable: - setattr(page_func, '_preprocessors', [*get_preprocessors(page_func), self.preprocessor_function]) - return page_func - - -def preprocessor(preprocessor_function: Callable) -> Preprocessor: - """Deprecated, use frontik.dependency_manager.Dependency""" - return Preprocessor(preprocessor_function) - - -def get_preprocessors(func: Callable) -> list: - return getattr(func, '_preprocessors', []) - - -def make_full_name(func: Union[Callable, Any]) -> str: - return f'{func.__module__}.{func.__name__}' diff --git a/poetry.lock b/poetry.lock index 9c9b8a039..d855ca526 100644 --- a/poetry.lock +++ b/poetry.lock @@ -193,6 +193,27 @@ files = [ {file = "annotated_types-0.6.0.tar.gz", hash = "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"}, ] +[[package]] +name = "anyio" +version = "3.7.1" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.7" +files = [ + {file = "anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5"}, + {file = "anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780"}, +] + +[package.dependencies] +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["Sphinx", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-jquery"] +test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (<0.22)"] + [[package]] name = "async-timeout" version = "4.0.3" @@ -247,13 +268,13 @@ files = [ [[package]] name = "certifi" -version = "2023.11.17" +version = "2024.2.2" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"}, - {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, + {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, + {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, ] [[package]] @@ -334,6 +355,26 @@ files = [ [package.extras] test = ["pytest (>=6)"] +[[package]] +name = "fastapi" +version = "0.105.0" +description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fastapi-0.105.0-py3-none-any.whl", hash = "sha256:f19ebf6fdc82a3281d10f2cb4774bdfa90238e3b40af3525a0c09fd08ad1c480"}, + {file = "fastapi-0.105.0.tar.gz", hash = "sha256:4d12838819aa52af244580675825e750ad67c9df4614f557a769606af902cf22"}, +] + +[package.dependencies] +anyio = ">=3.7.1,<4.0.0" +pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" +starlette = ">=0.27.0,<0.28.0" +typing-extensions = ">=4.8.0" + +[package.extras] +all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] + [[package]] name = "filelock" version = "3.13.1" @@ -455,69 +496,69 @@ grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] [[package]] name = "grpcio" -version = "1.60.0" +version = "1.60.1" description = "HTTP/2-based RPC framework" optional = false python-versions = ">=3.7" files = [ - {file = "grpcio-1.60.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:d020cfa595d1f8f5c6b343530cd3ca16ae5aefdd1e832b777f9f0eb105f5b139"}, - {file = "grpcio-1.60.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:b98f43fcdb16172dec5f4b49f2fece4b16a99fd284d81c6bbac1b3b69fcbe0ff"}, - {file = "grpcio-1.60.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:20e7a4f7ded59097c84059d28230907cd97130fa74f4a8bfd1d8e5ba18c81491"}, - {file = "grpcio-1.60.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:452ca5b4afed30e7274445dd9b441a35ece656ec1600b77fff8c216fdf07df43"}, - {file = "grpcio-1.60.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43e636dc2ce9ece583b3e2ca41df5c983f4302eabc6d5f9cd04f0562ee8ec1ae"}, - {file = "grpcio-1.60.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6e306b97966369b889985a562ede9d99180def39ad42c8014628dd3cc343f508"}, - {file = "grpcio-1.60.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f897c3b127532e6befdcf961c415c97f320d45614daf84deba0a54e64ea2457b"}, - {file = "grpcio-1.60.0-cp310-cp310-win32.whl", hash = "sha256:b87efe4a380887425bb15f220079aa8336276398dc33fce38c64d278164f963d"}, - {file = "grpcio-1.60.0-cp310-cp310-win_amd64.whl", hash = "sha256:a9c7b71211f066908e518a2ef7a5e211670761651039f0d6a80d8d40054047df"}, - {file = "grpcio-1.60.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:fb464479934778d7cc5baf463d959d361954d6533ad34c3a4f1d267e86ee25fd"}, - {file = "grpcio-1.60.0-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:4b44d7e39964e808b071714666a812049765b26b3ea48c4434a3b317bac82f14"}, - {file = "grpcio-1.60.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:90bdd76b3f04bdb21de5398b8a7c629676c81dfac290f5f19883857e9371d28c"}, - {file = "grpcio-1.60.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91229d7203f1ef0ab420c9b53fe2ca5c1fbeb34f69b3bc1b5089466237a4a134"}, - {file = "grpcio-1.60.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b36a2c6d4920ba88fa98075fdd58ff94ebeb8acc1215ae07d01a418af4c0253"}, - {file = "grpcio-1.60.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:297eef542156d6b15174a1231c2493ea9ea54af8d016b8ca7d5d9cc65cfcc444"}, - {file = "grpcio-1.60.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:87c9224acba0ad8bacddf427a1c2772e17ce50b3042a789547af27099c5f751d"}, - {file = "grpcio-1.60.0-cp311-cp311-win32.whl", hash = "sha256:95ae3e8e2c1b9bf671817f86f155c5da7d49a2289c5cf27a319458c3e025c320"}, - {file = "grpcio-1.60.0-cp311-cp311-win_amd64.whl", hash = "sha256:467a7d31554892eed2aa6c2d47ded1079fc40ea0b9601d9f79204afa8902274b"}, - {file = "grpcio-1.60.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:a7152fa6e597c20cb97923407cf0934e14224af42c2b8d915f48bc3ad2d9ac18"}, - {file = "grpcio-1.60.0-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:7db16dd4ea1b05ada504f08d0dca1cd9b926bed3770f50e715d087c6f00ad748"}, - {file = "grpcio-1.60.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:b0571a5aef36ba9177e262dc88a9240c866d903a62799e44fd4aae3f9a2ec17e"}, - {file = "grpcio-1.60.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fd9584bf1bccdfff1512719316efa77be235469e1e3295dce64538c4773840b"}, - {file = "grpcio-1.60.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6a478581b1a1a8fdf3318ecb5f4d0cda41cacdffe2b527c23707c9c1b8fdb55"}, - {file = "grpcio-1.60.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:77c8a317f0fd5a0a2be8ed5cbe5341537d5c00bb79b3bb27ba7c5378ba77dbca"}, - {file = "grpcio-1.60.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1c30bb23a41df95109db130a6cc1b974844300ae2e5d68dd4947aacba5985aa5"}, - {file = "grpcio-1.60.0-cp312-cp312-win32.whl", hash = "sha256:2aef56e85901c2397bd557c5ba514f84de1f0ae5dd132f5d5fed042858115951"}, - {file = "grpcio-1.60.0-cp312-cp312-win_amd64.whl", hash = "sha256:e381fe0c2aa6c03b056ad8f52f8efca7be29fb4d9ae2f8873520843b6039612a"}, - {file = "grpcio-1.60.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:92f88ca1b956eb8427a11bb8b4a0c0b2b03377235fc5102cb05e533b8693a415"}, - {file = "grpcio-1.60.0-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:e278eafb406f7e1b1b637c2cf51d3ad45883bb5bd1ca56bc05e4fc135dfdaa65"}, - {file = "grpcio-1.60.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:a48edde788b99214613e440fce495bbe2b1e142a7f214cce9e0832146c41e324"}, - {file = "grpcio-1.60.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de2ad69c9a094bf37c1102b5744c9aec6cf74d2b635558b779085d0263166454"}, - {file = "grpcio-1.60.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:073f959c6f570797272f4ee9464a9997eaf1e98c27cb680225b82b53390d61e6"}, - {file = "grpcio-1.60.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c826f93050c73e7769806f92e601e0efdb83ec8d7c76ddf45d514fee54e8e619"}, - {file = "grpcio-1.60.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9e30be89a75ee66aec7f9e60086fadb37ff8c0ba49a022887c28c134341f7179"}, - {file = "grpcio-1.60.0-cp37-cp37m-win_amd64.whl", hash = "sha256:b0fb2d4801546598ac5cd18e3ec79c1a9af8b8f2a86283c55a5337c5aeca4b1b"}, - {file = "grpcio-1.60.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:9073513ec380434eb8d21970e1ab3161041de121f4018bbed3146839451a6d8e"}, - {file = "grpcio-1.60.0-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:74d7d9fa97809c5b892449b28a65ec2bfa458a4735ddad46074f9f7d9550ad13"}, - {file = "grpcio-1.60.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:1434ca77d6fed4ea312901122dc8da6c4389738bf5788f43efb19a838ac03ead"}, - {file = "grpcio-1.60.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e61e76020e0c332a98290323ecfec721c9544f5b739fab925b6e8cbe1944cf19"}, - {file = "grpcio-1.60.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675997222f2e2f22928fbba640824aebd43791116034f62006e19730715166c0"}, - {file = "grpcio-1.60.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5208a57eae445ae84a219dfd8b56e04313445d146873117b5fa75f3245bc1390"}, - {file = "grpcio-1.60.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:428d699c8553c27e98f4d29fdc0f0edc50e9a8a7590bfd294d2edb0da7be3629"}, - {file = "grpcio-1.60.0-cp38-cp38-win32.whl", hash = "sha256:83f2292ae292ed5a47cdcb9821039ca8e88902923198f2193f13959360c01860"}, - {file = "grpcio-1.60.0-cp38-cp38-win_amd64.whl", hash = "sha256:705a68a973c4c76db5d369ed573fec3367d7d196673fa86614b33d8c8e9ebb08"}, - {file = "grpcio-1.60.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:c193109ca4070cdcaa6eff00fdb5a56233dc7610216d58fb81638f89f02e4968"}, - {file = "grpcio-1.60.0-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:676e4a44e740deaba0f4d95ba1d8c5c89a2fcc43d02c39f69450b1fa19d39590"}, - {file = "grpcio-1.60.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:5ff21e000ff2f658430bde5288cb1ac440ff15c0d7d18b5fb222f941b46cb0d2"}, - {file = "grpcio-1.60.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c86343cf9ff7b2514dd229bdd88ebba760bd8973dac192ae687ff75e39ebfab"}, - {file = "grpcio-1.60.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fd3b3968ffe7643144580f260f04d39d869fcc2cddb745deef078b09fd2b328"}, - {file = "grpcio-1.60.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:30943b9530fe3620e3b195c03130396cd0ee3a0d10a66c1bee715d1819001eaf"}, - {file = "grpcio-1.60.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b10241250cb77657ab315270b064a6c7f1add58af94befa20687e7c8d8603ae6"}, - {file = "grpcio-1.60.0-cp39-cp39-win32.whl", hash = "sha256:79a050889eb8d57a93ed21d9585bb63fca881666fc709f5d9f7f9372f5e7fd03"}, - {file = "grpcio-1.60.0-cp39-cp39-win_amd64.whl", hash = "sha256:8a97a681e82bc11a42d4372fe57898d270a2707f36c45c6676e49ce0d5c41353"}, - {file = "grpcio-1.60.0.tar.gz", hash = "sha256:2199165a1affb666aa24adf0c97436686d0a61bc5fc113c037701fb7c7fceb96"}, + {file = "grpcio-1.60.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:14e8f2c84c0832773fb3958240c69def72357bc11392571f87b2d7b91e0bb092"}, + {file = "grpcio-1.60.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:33aed0a431f5befeffd9d346b0fa44b2c01aa4aeae5ea5b2c03d3e25e0071216"}, + {file = "grpcio-1.60.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:fead980fbc68512dfd4e0c7b1f5754c2a8e5015a04dea454b9cada54a8423525"}, + {file = "grpcio-1.60.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:082081e6a36b6eb5cf0fd9a897fe777dbb3802176ffd08e3ec6567edd85bc104"}, + {file = "grpcio-1.60.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55ccb7db5a665079d68b5c7c86359ebd5ebf31a19bc1a91c982fd622f1e31ff2"}, + {file = "grpcio-1.60.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:9b54577032d4f235452f77a83169b6527bf4b77d73aeada97d45b2aaf1bf5ce0"}, + {file = "grpcio-1.60.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7d142bcd604166417929b071cd396aa13c565749a4c840d6c702727a59d835eb"}, + {file = "grpcio-1.60.1-cp310-cp310-win32.whl", hash = "sha256:2a6087f234cb570008a6041c8ffd1b7d657b397fdd6d26e83d72283dae3527b1"}, + {file = "grpcio-1.60.1-cp310-cp310-win_amd64.whl", hash = "sha256:f2212796593ad1d0235068c79836861f2201fc7137a99aa2fea7beeb3b101177"}, + {file = "grpcio-1.60.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:79ae0dc785504cb1e1788758c588c711f4e4a0195d70dff53db203c95a0bd303"}, + {file = "grpcio-1.60.1-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:4eec8b8c1c2c9b7125508ff7c89d5701bf933c99d3910e446ed531cd16ad5d87"}, + {file = "grpcio-1.60.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:8c9554ca8e26241dabe7951aa1fa03a1ba0856688ecd7e7bdbdd286ebc272e4c"}, + {file = "grpcio-1.60.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91422ba785a8e7a18725b1dc40fbd88f08a5bb4c7f1b3e8739cab24b04fa8a03"}, + {file = "grpcio-1.60.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cba6209c96828711cb7c8fcb45ecef8c8859238baf15119daa1bef0f6c84bfe7"}, + {file = "grpcio-1.60.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c71be3f86d67d8d1311c6076a4ba3b75ba5703c0b856b4e691c9097f9b1e8bd2"}, + {file = "grpcio-1.60.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:af5ef6cfaf0d023c00002ba25d0751e5995fa0e4c9eec6cd263c30352662cbce"}, + {file = "grpcio-1.60.1-cp311-cp311-win32.whl", hash = "sha256:a09506eb48fa5493c58f946c46754ef22f3ec0df64f2b5149373ff31fb67f3dd"}, + {file = "grpcio-1.60.1-cp311-cp311-win_amd64.whl", hash = "sha256:49c9b6a510e3ed8df5f6f4f3c34d7fbf2d2cae048ee90a45cd7415abab72912c"}, + {file = "grpcio-1.60.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:b58b855d0071575ea9c7bc0d84a06d2edfbfccec52e9657864386381a7ce1ae9"}, + {file = "grpcio-1.60.1-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:a731ac5cffc34dac62053e0da90f0c0b8560396a19f69d9703e88240c8f05858"}, + {file = "grpcio-1.60.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:cf77f8cf2a651fbd869fbdcb4a1931464189cd210abc4cfad357f1cacc8642a6"}, + {file = "grpcio-1.60.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c557e94e91a983e5b1e9c60076a8fd79fea1e7e06848eb2e48d0ccfb30f6e073"}, + {file = "grpcio-1.60.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:069fe2aeee02dfd2135d562d0663fe70fbb69d5eed6eb3389042a7e963b54de8"}, + {file = "grpcio-1.60.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:cb0af13433dbbd1c806e671d81ec75bd324af6ef75171fd7815ca3074fe32bfe"}, + {file = "grpcio-1.60.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2f44c32aef186bbba254129cea1df08a20be414144ac3bdf0e84b24e3f3b2e05"}, + {file = "grpcio-1.60.1-cp312-cp312-win32.whl", hash = "sha256:a212e5dea1a4182e40cd3e4067ee46be9d10418092ce3627475e995cca95de21"}, + {file = "grpcio-1.60.1-cp312-cp312-win_amd64.whl", hash = "sha256:6e490fa5f7f5326222cb9f0b78f207a2b218a14edf39602e083d5f617354306f"}, + {file = "grpcio-1.60.1-cp37-cp37m-linux_armv7l.whl", hash = "sha256:4216e67ad9a4769117433814956031cb300f85edc855252a645a9a724b3b6594"}, + {file = "grpcio-1.60.1-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:73e14acd3d4247169955fae8fb103a2b900cfad21d0c35f0dcd0fdd54cd60367"}, + {file = "grpcio-1.60.1-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:6ecf21d20d02d1733e9c820fb5c114c749d888704a7ec824b545c12e78734d1c"}, + {file = "grpcio-1.60.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33bdea30dcfd4f87b045d404388469eb48a48c33a6195a043d116ed1b9a0196c"}, + {file = "grpcio-1.60.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53b69e79d00f78c81eecfb38f4516080dc7f36a198b6b37b928f1c13b3c063e9"}, + {file = "grpcio-1.60.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:39aa848794b887120b1d35b1b994e445cc028ff602ef267f87c38122c1add50d"}, + {file = "grpcio-1.60.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:72153a0d2e425f45b884540a61c6639436ddafa1829a42056aa5764b84108b8e"}, + {file = "grpcio-1.60.1-cp37-cp37m-win_amd64.whl", hash = "sha256:50d56280b482875d1f9128ce596e59031a226a8b84bec88cb2bf76c289f5d0de"}, + {file = "grpcio-1.60.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:6d140bdeb26cad8b93c1455fa00573c05592793c32053d6e0016ce05ba267549"}, + {file = "grpcio-1.60.1-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:bc808924470643b82b14fe121923c30ec211d8c693e747eba8a7414bc4351a23"}, + {file = "grpcio-1.60.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:70c83bb530572917be20c21f3b6be92cd86b9aecb44b0c18b1d3b2cc3ae47df0"}, + {file = "grpcio-1.60.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9b106bc52e7f28170e624ba61cc7dc6829566e535a6ec68528f8e1afbed1c41f"}, + {file = "grpcio-1.60.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30e980cd6db1088c144b92fe376747328d5554bc7960ce583ec7b7d81cd47287"}, + {file = "grpcio-1.60.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0c5807e9152eff15f1d48f6b9ad3749196f79a4a050469d99eecb679be592acc"}, + {file = "grpcio-1.60.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f1c3dc536b3ee124e8b24feb7533e5c70b9f2ef833e3b2e5513b2897fd46763a"}, + {file = "grpcio-1.60.1-cp38-cp38-win32.whl", hash = "sha256:d7404cebcdb11bb5bd40bf94131faf7e9a7c10a6c60358580fe83913f360f929"}, + {file = "grpcio-1.60.1-cp38-cp38-win_amd64.whl", hash = "sha256:c8754c75f55781515a3005063d9a05878b2cfb3cb7e41d5401ad0cf19de14872"}, + {file = "grpcio-1.60.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:0250a7a70b14000fa311de04b169cc7480be6c1a769b190769d347939d3232a8"}, + {file = "grpcio-1.60.1-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:660fc6b9c2a9ea3bb2a7e64ba878c98339abaf1811edca904ac85e9e662f1d73"}, + {file = "grpcio-1.60.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:76eaaba891083fcbe167aa0f03363311a9f12da975b025d30e94b93ac7a765fc"}, + {file = "grpcio-1.60.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d97c65ea7e097056f3d1ead77040ebc236feaf7f71489383d20f3b4c28412a"}, + {file = "grpcio-1.60.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb2a2911b028f01c8c64d126f6b632fcd8a9ac975aa1b3855766c94e4107180"}, + {file = "grpcio-1.60.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:5a1ebbae7e2214f51b1f23b57bf98eeed2cf1ba84e4d523c48c36d5b2f8829ff"}, + {file = "grpcio-1.60.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9a66f4d2a005bc78e61d805ed95dedfcb35efa84b7bba0403c6d60d13a3de2d6"}, + {file = "grpcio-1.60.1-cp39-cp39-win32.whl", hash = "sha256:8d488fbdbf04283f0d20742b64968d44825617aa6717b07c006168ed16488804"}, + {file = "grpcio-1.60.1-cp39-cp39-win_amd64.whl", hash = "sha256:61b7199cd2a55e62e45bfb629a35b71fc2c0cb88f686a047f25b1112d3810904"}, + {file = "grpcio-1.60.1.tar.gz", hash = "sha256:dd1d3a8d1d2e50ad9b59e10aa7f07c7d1be2b367f3f2d33c5fade96ed5460962"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.60.0)"] +protobuf = ["grpcio-tools (>=1.60.1)"] [[package]] name = "http-client" @@ -719,154 +760,170 @@ lxml = "*" [[package]] name = "markupsafe" -version = "2.1.4" +version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de8153a7aae3835484ac168a9a9bdaa0c5eee4e0bc595503c95d53b942879c84"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e888ff76ceb39601c59e219f281466c6d7e66bd375b4ec1ce83bcdc68306796b"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0b838c37ba596fcbfca71651a104a611543077156cb0a26fe0c475e1f152ee8"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac1ebf6983148b45b5fa48593950f90ed6d1d26300604f321c74a9ca1609f8e"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fbad3d346df8f9d72622ac71b69565e621ada2ce6572f37c2eae8dacd60385d"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5291d98cd3ad9a562883468c690a2a238c4a6388ab3bd155b0c75dd55ece858"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a7cc49ef48a3c7a0005a949f3c04f8baa5409d3f663a1b36f0eba9bfe2a0396e"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b83041cda633871572f0d3c41dddd5582ad7d22f65a72eacd8d3d6d00291df26"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-win32.whl", hash = "sha256:0c26f67b3fe27302d3a412b85ef696792c4a2386293c53ba683a89562f9399b0"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-win_amd64.whl", hash = "sha256:a76055d5cb1c23485d7ddae533229039b850db711c554a12ea64a0fd8a0129e2"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9e9e3c4020aa2dc62d5dd6743a69e399ce3de58320522948af6140ac959ab863"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0042d6a9880b38e1dd9ff83146cc3c9c18a059b9360ceae207805567aacccc69"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d03fea4c4e9fd0ad75dc2e7e2b6757b80c152c032ea1d1de487461d8140efc"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ab3a886a237f6e9c9f4f7d272067e712cdb4efa774bef494dccad08f39d8ae6"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abf5ebbec056817057bfafc0445916bb688a255a5146f900445d081db08cbabb"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e1a0d1924a5013d4f294087e00024ad25668234569289650929ab871231668e7"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e7902211afd0af05fbadcc9a312e4cf10f27b779cf1323e78d52377ae4b72bea"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c669391319973e49a7c6230c218a1e3044710bc1ce4c8e6eb71f7e6d43a2c131"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-win32.whl", hash = "sha256:31f57d64c336b8ccb1966d156932f3daa4fee74176b0fdc48ef580be774aae74"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-win_amd64.whl", hash = "sha256:54a7e1380dfece8847c71bf7e33da5d084e9b889c75eca19100ef98027bd9f56"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a76cd37d229fc385738bd1ce4cba2a121cf26b53864c1772694ad0ad348e509e"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:987d13fe1d23e12a66ca2073b8d2e2a75cec2ecb8eab43ff5624ba0ad42764bc"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5244324676254697fe5c181fc762284e2c5fceeb1c4e3e7f6aca2b6f107e60dc"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78bc995e004681246e85e28e068111a4c3f35f34e6c62da1471e844ee1446250"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4d176cfdfde84f732c4a53109b293d05883e952bbba68b857ae446fa3119b4f"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f9917691f410a2e0897d1ef99619fd3f7dd503647c8ff2475bf90c3cf222ad74"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f06e5a9e99b7df44640767842f414ed5d7bedaaa78cd817ce04bbd6fd86e2dd6"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:396549cea79e8ca4ba65525470d534e8a41070e6b3500ce2414921099cb73e8d"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-win32.whl", hash = "sha256:f6be2d708a9d0e9b0054856f07ac7070fbe1754be40ca8525d5adccdbda8f475"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-win_amd64.whl", hash = "sha256:5045e892cfdaecc5b4c01822f353cf2c8feb88a6ec1c0adef2a2e705eef0f656"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7a07f40ef8f0fbc5ef1000d0c78771f4d5ca03b4953fc162749772916b298fc4"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d18b66fe626ac412d96c2ab536306c736c66cf2a31c243a45025156cc190dc8a"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:698e84142f3f884114ea8cf83e7a67ca8f4ace8454e78fe960646c6c91c63bfa"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49a3b78a5af63ec10d8604180380c13dcd870aba7928c1fe04e881d5c792dc4e"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:15866d7f2dc60cfdde12ebb4e75e41be862348b4728300c36cdf405e258415ec"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6aa5e2e7fc9bc042ae82d8b79d795b9a62bd8f15ba1e7594e3db243f158b5565"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:54635102ba3cf5da26eb6f96c4b8c53af8a9c0d97b64bdcb592596a6255d8518"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-win32.whl", hash = "sha256:3583a3a3ab7958e354dc1d25be74aee6228938312ee875a22330c4dc2e41beb0"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-win_amd64.whl", hash = "sha256:d6e427c7378c7f1b2bef6a344c925b8b63623d3321c09a237b7cc0e77dd98ceb"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:bf1196dcc239e608605b716e7b166eb5faf4bc192f8a44b81e85251e62584bd2"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4df98d4a9cd6a88d6a585852f56f2155c9cdb6aec78361a19f938810aa020954"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b835aba863195269ea358cecc21b400276747cc977492319fd7682b8cd2c253d"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23984d1bdae01bee794267424af55eef4dfc038dc5d1272860669b2aa025c9e3"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c98c33ffe20e9a489145d97070a435ea0679fddaabcafe19982fe9c971987d5"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9896fca4a8eb246defc8b2a7ac77ef7553b638e04fbf170bff78a40fa8a91474"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b0fe73bac2fed83839dbdbe6da84ae2a31c11cfc1c777a40dbd8ac8a6ed1560f"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c7556bafeaa0a50e2fe7dc86e0382dea349ebcad8f010d5a7dc6ba568eaaa789"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-win32.whl", hash = "sha256:fc1a75aa8f11b87910ffd98de62b29d6520b6d6e8a3de69a70ca34dea85d2a8a"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-win_amd64.whl", hash = "sha256:3a66c36a3864df95e4f62f9167c734b3b1192cb0851b43d7cc08040c074c6279"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:765f036a3d00395a326df2835d8f86b637dbaf9832f90f5d196c3b8a7a5080cb"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21e7af8091007bf4bebf4521184f4880a6acab8df0df52ef9e513d8e5db23411"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5c31fe855c77cad679b302aabc42d724ed87c043b1432d457f4976add1c2c3e"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7653fa39578957bc42e5ebc15cf4361d9e0ee4b702d7d5ec96cdac860953c5b4"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47bb5f0142b8b64ed1399b6b60f700a580335c8e1c57f2f15587bd072012decc"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:fe8512ed897d5daf089e5bd010c3dc03bb1bdae00b35588c49b98268d4a01e00"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:36d7626a8cca4d34216875aee5a1d3d654bb3dac201c1c003d182283e3205949"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b6f14a9cd50c3cb100eb94b3273131c80d102e19bb20253ac7bd7336118a673a"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-win32.whl", hash = "sha256:c8f253a84dbd2c63c19590fa86a032ef3d8cc18923b8049d91bcdeeb2581fbf6"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-win_amd64.whl", hash = "sha256:8b570a1537367b52396e53325769608f2a687ec9a4363647af1cded8928af959"}, - {file = "MarkupSafe-2.1.4.tar.gz", hash = "sha256:3aae9af4cac263007fd6309c64c6ab4506dd2b79382d9d19a1994f9240b8db4f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, ] [[package]] name = "multidict" -version = "6.0.4" +version = "6.0.5" description = "multidict implementation" optional = false python-versions = ">=3.7" files = [ - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, - {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, - {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, - {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, - {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, - {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, - {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, - {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, - {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, - {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, - {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, - {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, - {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"}, + {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"}, + {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"}, + {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"}, + {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"}, + {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"}, + {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"}, + {file = "multidict-6.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc"}, + {file = "multidict-6.0.5-cp37-cp37m-win32.whl", hash = "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee"}, + {file = "multidict-6.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44"}, + {file = "multidict-6.0.5-cp38-cp38-win32.whl", hash = "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241"}, + {file = "multidict-6.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c"}, + {file = "multidict-6.0.5-cp39-cp39-win32.whl", hash = "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b"}, + {file = "multidict-6.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755"}, + {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, + {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, ] [[package]] @@ -1079,61 +1136,61 @@ files = [ [[package]] name = "orjson" -version = "3.9.12" +version = "3.9.14" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" optional = false python-versions = ">=3.8" files = [ - {file = "orjson-3.9.12-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:6b4e2bed7d00753c438e83b613923afdd067564ff7ed696bfe3a7b073a236e07"}, - {file = "orjson-3.9.12-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd1b8ec63f0bf54a50b498eedeccdca23bd7b658f81c524d18e410c203189365"}, - {file = "orjson-3.9.12-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ab8add018a53665042a5ae68200f1ad14c7953fa12110d12d41166f111724656"}, - {file = "orjson-3.9.12-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12756a108875526b76e505afe6d6ba34960ac6b8c5ec2f35faf73ef161e97e07"}, - {file = "orjson-3.9.12-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:890e7519c0c70296253660455f77e3a194554a3c45e42aa193cdebc76a02d82b"}, - {file = "orjson-3.9.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d664880d7f016efbae97c725b243b33c2cbb4851ddc77f683fd1eec4a7894146"}, - {file = "orjson-3.9.12-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:cfdaede0fa5b500314ec7b1249c7e30e871504a57004acd116be6acdda3b8ab3"}, - {file = "orjson-3.9.12-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6492ff5953011e1ba9ed1bf086835fd574bd0a3cbe252db8e15ed72a30479081"}, - {file = "orjson-3.9.12-cp310-none-win32.whl", hash = "sha256:29bf08e2eadb2c480fdc2e2daae58f2f013dff5d3b506edd1e02963b9ce9f8a9"}, - {file = "orjson-3.9.12-cp310-none-win_amd64.whl", hash = "sha256:0fc156fba60d6b50743337ba09f052d8afc8b64595112996d22f5fce01ab57da"}, - {file = "orjson-3.9.12-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:2849f88a0a12b8d94579b67486cbd8f3a49e36a4cb3d3f0ab352c596078c730c"}, - {file = "orjson-3.9.12-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3186b18754befa660b31c649a108a915493ea69b4fc33f624ed854ad3563ac65"}, - {file = "orjson-3.9.12-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cbbf313c9fb9d4f6cf9c22ced4b6682230457741daeb3d7060c5d06c2e73884a"}, - {file = "orjson-3.9.12-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99e8cd005b3926c3db9b63d264bd05e1bf4451787cc79a048f27f5190a9a0311"}, - {file = "orjson-3.9.12-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59feb148392d9155f3bfed0a2a3209268e000c2c3c834fb8fe1a6af9392efcbf"}, - {file = "orjson-3.9.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4ae815a172a1f073b05b9e04273e3b23e608a0858c4e76f606d2d75fcabde0c"}, - {file = "orjson-3.9.12-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ed398f9a9d5a1bf55b6e362ffc80ac846af2122d14a8243a1e6510a4eabcb71e"}, - {file = "orjson-3.9.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d3cfb76600c5a1e6be91326b8f3b83035a370e727854a96d801c1ea08b708073"}, - {file = "orjson-3.9.12-cp311-none-win32.whl", hash = "sha256:a2b6f5252c92bcab3b742ddb3ac195c0fa74bed4319acd74f5d54d79ef4715dc"}, - {file = "orjson-3.9.12-cp311-none-win_amd64.whl", hash = "sha256:c95488e4aa1d078ff5776b58f66bd29d628fa59adcb2047f4efd3ecb2bd41a71"}, - {file = "orjson-3.9.12-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:d6ce2062c4af43b92b0221ed4f445632c6bf4213f8a7da5396a122931377acd9"}, - {file = "orjson-3.9.12-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:950951799967558c214cd6cceb7ceceed6f81d2c3c4135ee4a2c9c69f58aa225"}, - {file = "orjson-3.9.12-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2dfaf71499d6fd4153f5c86eebb68e3ec1bf95851b030a4b55c7637a37bbdee4"}, - {file = "orjson-3.9.12-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:659a8d7279e46c97661839035a1a218b61957316bf0202674e944ac5cfe7ed83"}, - {file = "orjson-3.9.12-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af17fa87bccad0b7f6fd8ac8f9cbc9ee656b4552783b10b97a071337616db3e4"}, - {file = "orjson-3.9.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd52dec9eddf4c8c74392f3fd52fa137b5f2e2bed1d9ae958d879de5f7d7cded"}, - {file = "orjson-3.9.12-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:640e2b5d8e36b970202cfd0799d11a9a4ab46cf9212332cd642101ec952df7c8"}, - {file = "orjson-3.9.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:daa438bd8024e03bcea2c5a92cd719a663a58e223fba967296b6ab9992259dbf"}, - {file = "orjson-3.9.12-cp312-none-win_amd64.whl", hash = "sha256:1bb8f657c39ecdb924d02e809f992c9aafeb1ad70127d53fb573a6a6ab59d549"}, - {file = "orjson-3.9.12-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:f4098c7674901402c86ba6045a551a2ee345f9f7ed54eeffc7d86d155c8427e5"}, - {file = "orjson-3.9.12-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5586a533998267458fad3a457d6f3cdbddbcce696c916599fa8e2a10a89b24d3"}, - {file = "orjson-3.9.12-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:54071b7398cd3f90e4bb61df46705ee96cb5e33e53fc0b2f47dbd9b000e238e1"}, - {file = "orjson-3.9.12-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:67426651faa671b40443ea6f03065f9c8e22272b62fa23238b3efdacd301df31"}, - {file = "orjson-3.9.12-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4a0cd56e8ee56b203abae7d482ac0d233dbfb436bb2e2d5cbcb539fe1200a312"}, - {file = "orjson-3.9.12-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a84a0c3d4841a42e2571b1c1ead20a83e2792644c5827a606c50fc8af7ca4bee"}, - {file = "orjson-3.9.12-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:09d60450cda3fa6c8ed17770c3a88473a16460cd0ff2ba74ef0df663b6fd3bb8"}, - {file = "orjson-3.9.12-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bc82a4db9934a78ade211cf2e07161e4f068a461c1796465d10069cb50b32a80"}, - {file = "orjson-3.9.12-cp38-none-win32.whl", hash = "sha256:61563d5d3b0019804d782137a4f32c72dc44c84e7d078b89d2d2a1adbaa47b52"}, - {file = "orjson-3.9.12-cp38-none-win_amd64.whl", hash = "sha256:410f24309fbbaa2fab776e3212a81b96a1ec6037259359a32ea79fbccfcf76aa"}, - {file = "orjson-3.9.12-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:e773f251258dd82795fd5daeac081d00b97bacf1548e44e71245543374874bcf"}, - {file = "orjson-3.9.12-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b159baecfda51c840a619948c25817d37733a4d9877fea96590ef8606468b362"}, - {file = "orjson-3.9.12-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:975e72e81a249174840d5a8df977d067b0183ef1560a32998be340f7e195c730"}, - {file = "orjson-3.9.12-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:06e42e899dde61eb1851a9fad7f1a21b8e4be063438399b63c07839b57668f6c"}, - {file = "orjson-3.9.12-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c157e999e5694475a5515942aebeed6e43f7a1ed52267c1c93dcfde7d78d421"}, - {file = "orjson-3.9.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dde1bc7c035f2d03aa49dc8642d9c6c9b1a81f2470e02055e76ed8853cfae0c3"}, - {file = "orjson-3.9.12-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b0e9d73cdbdad76a53a48f563447e0e1ce34bcecef4614eb4b146383e6e7d8c9"}, - {file = "orjson-3.9.12-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:96e44b21fe407b8ed48afbb3721f3c8c8ce17e345fbe232bd4651ace7317782d"}, - {file = "orjson-3.9.12-cp39-none-win32.whl", hash = "sha256:cbd0f3555205bf2a60f8812133f2452d498dbefa14423ba90fe89f32276f7abf"}, - {file = "orjson-3.9.12-cp39-none-win_amd64.whl", hash = "sha256:03ea7ee7e992532c2f4a06edd7ee1553f0644790553a118e003e3c405add41fa"}, - {file = "orjson-3.9.12.tar.gz", hash = "sha256:da908d23a3b3243632b523344403b128722a5f45e278a8343c2bb67538dff0e4"}, + {file = "orjson-3.9.14-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:793f6c9448ab6eb7d4974b4dde3f230345c08ca6c7995330fbceeb43a5c8aa5e"}, + {file = "orjson-3.9.14-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6bc7928d161840096adc956703494b5c0193ede887346f028216cac0af87500"}, + {file = "orjson-3.9.14-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:58b36f54da759602d8e2f7dad958752d453dfe2c7122767bc7f765e17dc59959"}, + {file = "orjson-3.9.14-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:abcda41ecdc950399c05eff761c3de91485d9a70d8227cb599ad3a66afe93bcc"}, + {file = "orjson-3.9.14-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df76ecd17b1b3627bddfd689faaf206380a1a38cc9f6c4075bd884eaedcf46c2"}, + {file = "orjson-3.9.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d450a8e0656efb5d0fcb062157b918ab02dcca73278975b4ee9ea49e2fcf5bd5"}, + {file = "orjson-3.9.14-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:95c03137b0cf66517c8baa65770507a756d3a89489d8ecf864ea92348e1beabe"}, + {file = "orjson-3.9.14-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:20837e10835c98973673406d6798e10f821e7744520633811a5a3d809762d8cc"}, + {file = "orjson-3.9.14-cp310-none-win32.whl", hash = "sha256:1f7b6f3ef10ae8e3558abb729873d033dbb5843507c66b1c0767e32502ba96bb"}, + {file = "orjson-3.9.14-cp310-none-win_amd64.whl", hash = "sha256:ea890e6dc1711aeec0a33b8520e395c2f3d59ead5b4351a788e06bf95fc7ba81"}, + {file = "orjson-3.9.14-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:c19009ff37f033c70acd04b636380379499dac2cba27ae7dfc24f304deabbc81"}, + {file = "orjson-3.9.14-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19cdea0664aec0b7f385be84986d4defd3334e9c3c799407686ee1c26f7b8251"}, + {file = "orjson-3.9.14-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:135d518f73787ce323b1a5e21fb854fe22258d7a8ae562b81a49d6c7f826f2a3"}, + {file = "orjson-3.9.14-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d2cf1d0557c61c75e18cf7d69fb689b77896e95553e212c0cc64cf2087944b84"}, + {file = "orjson-3.9.14-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7c11667421df2d8b18b021223505dcc3ee51be518d54e4dc49161ac88ac2b87"}, + {file = "orjson-3.9.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2eefc41ba42e75ed88bc396d8fe997beb20477f3e7efa000cd7a47eda452fbb2"}, + {file = "orjson-3.9.14-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:917311d6a64d1c327c0dfda1e41f3966a7fb72b11ca7aa2e7a68fcccc7db35d9"}, + {file = "orjson-3.9.14-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4dc1c132259b38d12c6587d190cd09cd76e3b5273ce71fe1372437b4cbc65f6f"}, + {file = "orjson-3.9.14-cp311-none-win32.whl", hash = "sha256:6f39a10408478f4c05736a74da63727a1ae0e83e3533d07b19443400fe8591ca"}, + {file = "orjson-3.9.14-cp311-none-win_amd64.whl", hash = "sha256:26280a7fcb62d8257f634c16acebc3bec626454f9ab13558bbf7883b9140760e"}, + {file = "orjson-3.9.14-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:08e722a8d06b13b67a51f247a24938d1a94b4b3862e40e0eef3b2e98c99cd04c"}, + {file = "orjson-3.9.14-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2591faa0c031cf3f57e5bce1461cfbd6160f3f66b5a72609a130924917cb07d"}, + {file = "orjson-3.9.14-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e2450d87dd7b4f277f4c5598faa8b49a0c197b91186c47a2c0b88e15531e4e3e"}, + {file = "orjson-3.9.14-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:90903d2908158a2c9077a06f11e27545de610af690fb178fd3ba6b32492d4d1c"}, + {file = "orjson-3.9.14-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ce6f095eef0026eae76fc212f20f786011ecf482fc7df2f4c272a8ae6dd7b1ef"}, + {file = "orjson-3.9.14-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:751250a31fef2bac05a2da2449aae7142075ea26139271f169af60456d8ad27a"}, + {file = "orjson-3.9.14-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9a1af21160a38ee8be3f4fcf24ee4b99e6184cadc7f915d599f073f478a94d2c"}, + {file = "orjson-3.9.14-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:449bf090b2aa4e019371d7511a6ea8a5a248139205c27d1834bb4b1e3c44d936"}, + {file = "orjson-3.9.14-cp312-none-win_amd64.whl", hash = "sha256:a603161318ff699784943e71f53899983b7dee571b4dd07c336437c9c5a272b0"}, + {file = "orjson-3.9.14-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:814f288c011efdf8f115c5ebcc1ab94b11da64b207722917e0ceb42f52ef30a3"}, + {file = "orjson-3.9.14-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a88cafb100af68af3b9b29b5ccd09fdf7a48c63327916c8c923a94c336d38dd3"}, + {file = "orjson-3.9.14-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ba3518b999f88882ade6686f1b71e207b52e23546e180499be5bbb63a2f9c6e6"}, + {file = "orjson-3.9.14-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:978f416bbff9da8d2091e3cf011c92da68b13f2c453dcc2e8109099b2a19d234"}, + {file = "orjson-3.9.14-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75fc593cf836f631153d0e21beaeb8d26e144445c73645889335c2247fcd71a0"}, + {file = "orjson-3.9.14-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d1528db3c7554f9d6eeb09df23cb80dd5177ec56eeb55cc5318826928de506"}, + {file = "orjson-3.9.14-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:7183cc68ee2113b19b0b8714221e5e3b07b3ba10ca2bb108d78fd49cefaae101"}, + {file = "orjson-3.9.14-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:df3266d54246cb56b8bb17fa908660d2a0f2e3f63fbc32451ffc1b1505051d07"}, + {file = "orjson-3.9.14-cp38-none-win32.whl", hash = "sha256:7913079b029e1b3501854c9a78ad938ed40d61fe09bebab3c93e60ff1301b189"}, + {file = "orjson-3.9.14-cp38-none-win_amd64.whl", hash = "sha256:29512eb925b620e5da2fd7585814485c67cc6ba4fe739a0a700c50467a8a8065"}, + {file = "orjson-3.9.14-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:5bf597530544db27a8d76aced49cfc817ee9503e0a4ebf0109cd70331e7bbe0c"}, + {file = "orjson-3.9.14-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac650d49366fa41fe702e054cb560171a8634e2865537e91f09a8d05ea5b1d37"}, + {file = "orjson-3.9.14-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:236230433a9a4968ab895140514c308fdf9f607cb8bee178a04372b771123860"}, + {file = "orjson-3.9.14-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3014ccbda9be0b1b5f8ea895121df7e6524496b3908f4397ff02e923bcd8f6dd"}, + {file = "orjson-3.9.14-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ac0c7eae7ad3a223bde690565442f8a3d620056bd01196f191af8be58a5248e1"}, + {file = "orjson-3.9.14-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fca33fdd0b38839b01912c57546d4f412ba7bfa0faf9bf7453432219aec2df07"}, + {file = "orjson-3.9.14-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f75823cc1674a840a151e999a7dfa0d86c911150dd6f951d0736ee9d383bf415"}, + {file = "orjson-3.9.14-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6f52ac2eb49e99e7373f62e2a68428c6946cda52ce89aa8fe9f890c7278e2d3a"}, + {file = "orjson-3.9.14-cp39-none-win32.whl", hash = "sha256:0572f174f50b673b7df78680fb52cd0087a8585a6d06d295a5f790568e1064c6"}, + {file = "orjson-3.9.14-cp39-none-win_amd64.whl", hash = "sha256:ab90c02cb264250b8a58cedcc72ed78a4a257d956c8d3c8bebe9751b818dfad8"}, + {file = "orjson-3.9.14.tar.gz", hash = "sha256:06fb40f8e49088ecaa02f1162581d39e2cf3fd9dbbfe411eb2284147c99bad79"}, ] [[package]] @@ -1149,18 +1206,18 @@ files = [ [[package]] name = "platformdirs" -version = "4.1.0" +version = "4.2.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.1.0-py3-none-any.whl", hash = "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380"}, - {file = "platformdirs-4.1.0.tar.gz", hash = "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420"}, + {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"}, + {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"}, ] [package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] +docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] [[package]] name = "pluggy" @@ -1210,18 +1267,18 @@ files = [ [[package]] name = "pydantic" -version = "2.6.0" +version = "2.6.1" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.6.0-py3-none-any.whl", hash = "sha256:1440966574e1b5b99cf75a13bec7b20e3512e8a61b894ae252f56275e2c465ae"}, - {file = "pydantic-2.6.0.tar.gz", hash = "sha256:ae887bd94eb404b09d86e4d12f93893bdca79d766e738528c6fa1c849f3c6bcf"}, + {file = "pydantic-2.6.1-py3-none-any.whl", hash = "sha256:0b6a909df3192245cb736509a92ff69e4fef76116feffec68e93a567347bae6f"}, + {file = "pydantic-2.6.1.tar.gz", hash = "sha256:4fd5c182a2488dc63e6d32737ff19937888001e2a6d86e94b3f233104a5d1fa9"}, ] [package.dependencies] annotated-types = ">=0.4.0" -pydantic-core = "2.16.1" +pydantic-core = "2.16.2" typing-extensions = ">=4.6.1" [package.extras] @@ -1229,90 +1286,90 @@ email = ["email-validator (>=2.0.0)"] [[package]] name = "pydantic-core" -version = "2.16.1" +version = "2.16.2" description = "" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.16.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:300616102fb71241ff477a2cbbc847321dbec49428434a2f17f37528721c4948"}, - {file = "pydantic_core-2.16.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5511f962dd1b9b553e9534c3b9c6a4b0c9ded3d8c2be96e61d56f933feef9e1f"}, - {file = "pydantic_core-2.16.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98f0edee7ee9cc7f9221af2e1b95bd02810e1c7a6d115cfd82698803d385b28f"}, - {file = "pydantic_core-2.16.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9795f56aa6b2296f05ac79d8a424e94056730c0b860a62b0fdcfe6340b658cc8"}, - {file = "pydantic_core-2.16.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c45f62e4107ebd05166717ac58f6feb44471ed450d07fecd90e5f69d9bf03c48"}, - {file = "pydantic_core-2.16.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:462d599299c5971f03c676e2b63aa80fec5ebc572d89ce766cd11ca8bcb56f3f"}, - {file = "pydantic_core-2.16.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ebaa4bf6386a3b22eec518da7d679c8363fb7fb70cf6972161e5542f470798"}, - {file = "pydantic_core-2.16.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:99f9a50b56713a598d33bc23a9912224fc5d7f9f292444e6664236ae471ddf17"}, - {file = "pydantic_core-2.16.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8ec364e280db4235389b5e1e6ee924723c693cbc98e9d28dc1767041ff9bc388"}, - {file = "pydantic_core-2.16.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:653a5dfd00f601a0ed6654a8b877b18d65ac32c9d9997456e0ab240807be6cf7"}, - {file = "pydantic_core-2.16.1-cp310-none-win32.whl", hash = "sha256:1661c668c1bb67b7cec96914329d9ab66755911d093bb9063c4c8914188af6d4"}, - {file = "pydantic_core-2.16.1-cp310-none-win_amd64.whl", hash = "sha256:561be4e3e952c2f9056fba5267b99be4ec2afadc27261505d4992c50b33c513c"}, - {file = "pydantic_core-2.16.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:102569d371fadc40d8f8598a59379c37ec60164315884467052830b28cc4e9da"}, - {file = "pydantic_core-2.16.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:735dceec50fa907a3c314b84ed609dec54b76a814aa14eb90da31d1d36873a5e"}, - {file = "pydantic_core-2.16.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e83ebbf020be727d6e0991c1b192a5c2e7113eb66e3def0cd0c62f9f266247e4"}, - {file = "pydantic_core-2.16.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:30a8259569fbeec49cfac7fda3ec8123486ef1b729225222f0d41d5f840b476f"}, - {file = "pydantic_core-2.16.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:920c4897e55e2881db6a6da151198e5001552c3777cd42b8a4c2f72eedc2ee91"}, - {file = "pydantic_core-2.16.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f5247a3d74355f8b1d780d0f3b32a23dd9f6d3ff43ef2037c6dcd249f35ecf4c"}, - {file = "pydantic_core-2.16.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d5bea8012df5bb6dda1e67d0563ac50b7f64a5d5858348b5c8cb5043811c19d"}, - {file = "pydantic_core-2.16.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ed3025a8a7e5a59817b7494686d449ebfbe301f3e757b852c8d0d1961d6be864"}, - {file = "pydantic_core-2.16.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:06f0d5a1d9e1b7932477c172cc720b3b23c18762ed7a8efa8398298a59d177c7"}, - {file = "pydantic_core-2.16.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:150ba5c86f502c040b822777e2e519b5625b47813bd05f9273a8ed169c97d9ae"}, - {file = "pydantic_core-2.16.1-cp311-none-win32.whl", hash = "sha256:d6cbdf12ef967a6aa401cf5cdf47850559e59eedad10e781471c960583f25aa1"}, - {file = "pydantic_core-2.16.1-cp311-none-win_amd64.whl", hash = "sha256:afa01d25769af33a8dac0d905d5c7bb2d73c7c3d5161b2dd6f8b5b5eea6a3c4c"}, - {file = "pydantic_core-2.16.1-cp311-none-win_arm64.whl", hash = "sha256:1a2fe7b00a49b51047334d84aafd7e39f80b7675cad0083678c58983662da89b"}, - {file = "pydantic_core-2.16.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:0f478ec204772a5c8218e30eb813ca43e34005dff2eafa03931b3d8caef87d51"}, - {file = "pydantic_core-2.16.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f1936ef138bed2165dd8573aa65e3095ef7c2b6247faccd0e15186aabdda7f66"}, - {file = "pydantic_core-2.16.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99d3a433ef5dc3021c9534a58a3686c88363c591974c16c54a01af7efd741f13"}, - {file = "pydantic_core-2.16.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd88f40f2294440d3f3c6308e50d96a0d3d0973d6f1a5732875d10f569acef49"}, - {file = "pydantic_core-2.16.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fac641bbfa43d5a1bed99d28aa1fded1984d31c670a95aac1bf1d36ac6ce137"}, - {file = "pydantic_core-2.16.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:72bf9308a82b75039b8c8edd2be2924c352eda5da14a920551a8b65d5ee89253"}, - {file = "pydantic_core-2.16.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb4363e6c9fc87365c2bc777a1f585a22f2f56642501885ffc7942138499bf54"}, - {file = "pydantic_core-2.16.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:20f724a023042588d0f4396bbbcf4cffd0ddd0ad3ed4f0d8e6d4ac4264bae81e"}, - {file = "pydantic_core-2.16.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fb4370b15111905bf8b5ba2129b926af9470f014cb0493a67d23e9d7a48348e8"}, - {file = "pydantic_core-2.16.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23632132f1fd608034f1a56cc3e484be00854db845b3a4a508834be5a6435a6f"}, - {file = "pydantic_core-2.16.1-cp312-none-win32.whl", hash = "sha256:b9f3e0bffad6e238f7acc20c393c1ed8fab4371e3b3bc311020dfa6020d99212"}, - {file = "pydantic_core-2.16.1-cp312-none-win_amd64.whl", hash = "sha256:a0b4cfe408cd84c53bab7d83e4209458de676a6ec5e9c623ae914ce1cb79b96f"}, - {file = "pydantic_core-2.16.1-cp312-none-win_arm64.whl", hash = "sha256:d195add190abccefc70ad0f9a0141ad7da53e16183048380e688b466702195dd"}, - {file = "pydantic_core-2.16.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:502c062a18d84452858f8aea1e520e12a4d5228fc3621ea5061409d666ea1706"}, - {file = "pydantic_core-2.16.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d8c032ccee90b37b44e05948b449a2d6baed7e614df3d3f47fe432c952c21b60"}, - {file = "pydantic_core-2.16.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:920f4633bee43d7a2818e1a1a788906df5a17b7ab6fe411220ed92b42940f818"}, - {file = "pydantic_core-2.16.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9f5d37ff01edcbace53a402e80793640c25798fb7208f105d87a25e6fcc9ea06"}, - {file = "pydantic_core-2.16.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:399166f24c33a0c5759ecc4801f040dbc87d412c1a6d6292b2349b4c505effc9"}, - {file = "pydantic_core-2.16.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ac89ccc39cd1d556cc72d6752f252dc869dde41c7c936e86beac5eb555041b66"}, - {file = "pydantic_core-2.16.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73802194f10c394c2bedce7a135ba1d8ba6cff23adf4217612bfc5cf060de34c"}, - {file = "pydantic_core-2.16.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8fa00fa24ffd8c31fac081bf7be7eb495be6d248db127f8776575a746fa55c95"}, - {file = "pydantic_core-2.16.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:601d3e42452cd4f2891c13fa8c70366d71851c1593ed42f57bf37f40f7dca3c8"}, - {file = "pydantic_core-2.16.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:07982b82d121ed3fc1c51faf6e8f57ff09b1325d2efccaa257dd8c0dd937acca"}, - {file = "pydantic_core-2.16.1-cp38-none-win32.whl", hash = "sha256:d0bf6f93a55d3fa7a079d811b29100b019784e2ee6bc06b0bb839538272a5610"}, - {file = "pydantic_core-2.16.1-cp38-none-win_amd64.whl", hash = "sha256:fbec2af0ebafa57eb82c18c304b37c86a8abddf7022955d1742b3d5471a6339e"}, - {file = "pydantic_core-2.16.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a497be217818c318d93f07e14502ef93d44e6a20c72b04c530611e45e54c2196"}, - {file = "pydantic_core-2.16.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:694a5e9f1f2c124a17ff2d0be613fd53ba0c26de588eb4bdab8bca855e550d95"}, - {file = "pydantic_core-2.16.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d4dfc66abea3ec6d9f83e837a8f8a7d9d3a76d25c9911735c76d6745950e62c"}, - {file = "pydantic_core-2.16.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8655f55fe68c4685673265a650ef71beb2d31871c049c8b80262026f23605ee3"}, - {file = "pydantic_core-2.16.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:21e3298486c4ea4e4d5cc6fb69e06fb02a4e22089304308817035ac006a7f506"}, - {file = "pydantic_core-2.16.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:71b4a48a7427f14679f0015b13c712863d28bb1ab700bd11776a5368135c7d60"}, - {file = "pydantic_core-2.16.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10dca874e35bb60ce4f9f6665bfbfad050dd7573596608aeb9e098621ac331dc"}, - {file = "pydantic_core-2.16.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fa496cd45cda0165d597e9d6f01e36c33c9508f75cf03c0a650018c5048f578e"}, - {file = "pydantic_core-2.16.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5317c04349472e683803da262c781c42c5628a9be73f4750ac7d13040efb5d2d"}, - {file = "pydantic_core-2.16.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:42c29d54ed4501a30cd71015bf982fa95e4a60117b44e1a200290ce687d3e640"}, - {file = "pydantic_core-2.16.1-cp39-none-win32.whl", hash = "sha256:ba07646f35e4e49376c9831130039d1b478fbfa1215ae62ad62d2ee63cf9c18f"}, - {file = "pydantic_core-2.16.1-cp39-none-win_amd64.whl", hash = "sha256:2133b0e412a47868a358713287ff9f9a328879da547dc88be67481cdac529118"}, - {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d25ef0c33f22649b7a088035fd65ac1ce6464fa2876578df1adad9472f918a76"}, - {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:99c095457eea8550c9fa9a7a992e842aeae1429dab6b6b378710f62bfb70b394"}, - {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b49c604ace7a7aa8af31196abbf8f2193be605db6739ed905ecaf62af31ccae0"}, - {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c56da23034fe66221f2208c813d8aa509eea34d97328ce2add56e219c3a9f41c"}, - {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cebf8d56fee3b08ad40d332a807ecccd4153d3f1ba8231e111d9759f02edfd05"}, - {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:1ae8048cba95f382dba56766525abca438328455e35c283bb202964f41a780b0"}, - {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:780daad9e35b18d10d7219d24bfb30148ca2afc309928e1d4d53de86822593dc"}, - {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c94b5537bf6ce66e4d7830c6993152940a188600f6ae044435287753044a8fe2"}, - {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:adf28099d061a25fbcc6531febb7a091e027605385de9fe14dd6a97319d614cf"}, - {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:644904600c15816a1f9a1bafa6aab0d21db2788abcdf4e2a77951280473f33e1"}, - {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87bce04f09f0552b66fca0c4e10da78d17cb0e71c205864bab4e9595122cb9d9"}, - {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:877045a7969ace04d59516d5d6a7dee13106822f99a5d8df5e6822941f7bedc8"}, - {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9c46e556ee266ed3fb7b7a882b53df3c76b45e872fdab8d9cf49ae5e91147fd7"}, - {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4eebbd049008eb800f519578e944b8dc8e0f7d59a5abb5924cc2d4ed3a1834ff"}, - {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:c0be58529d43d38ae849a91932391eb93275a06b93b79a8ab828b012e916a206"}, - {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b1fc07896fc1851558f532dffc8987e526b682ec73140886c831d773cef44b76"}, - {file = "pydantic_core-2.16.1.tar.gz", hash = "sha256:daff04257b49ab7f4b3f73f98283d3dbb1a65bf3500d55c7beac3c66c310fe34"}, + {file = "pydantic_core-2.16.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3fab4e75b8c525a4776e7630b9ee48aea50107fea6ca9f593c98da3f4d11bf7c"}, + {file = "pydantic_core-2.16.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8bde5b48c65b8e807409e6f20baee5d2cd880e0fad00b1a811ebc43e39a00ab2"}, + {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2924b89b16420712e9bb8192396026a8fbd6d8726224f918353ac19c4c043d2a"}, + {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:16aa02e7a0f539098e215fc193c8926c897175d64c7926d00a36188917717a05"}, + {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:936a787f83db1f2115ee829dd615c4f684ee48ac4de5779ab4300994d8af325b"}, + {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:459d6be6134ce3b38e0ef76f8a672924460c455d45f1ad8fdade36796df1ddc8"}, + {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9ee4febb249c591d07b2d4dd36ebcad0ccd128962aaa1801508320896575ef"}, + {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:40a0bd0bed96dae5712dab2aba7d334a6c67cbcac2ddfca7dbcc4a8176445990"}, + {file = "pydantic_core-2.16.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:870dbfa94de9b8866b37b867a2cb37a60c401d9deb4a9ea392abf11a1f98037b"}, + {file = "pydantic_core-2.16.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:308974fdf98046db28440eb3377abba274808bf66262e042c412eb2adf852731"}, + {file = "pydantic_core-2.16.2-cp310-none-win32.whl", hash = "sha256:a477932664d9611d7a0816cc3c0eb1f8856f8a42435488280dfbf4395e141485"}, + {file = "pydantic_core-2.16.2-cp310-none-win_amd64.whl", hash = "sha256:8f9142a6ed83d90c94a3efd7af8873bf7cefed2d3d44387bf848888482e2d25f"}, + {file = "pydantic_core-2.16.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:406fac1d09edc613020ce9cf3f2ccf1a1b2f57ab00552b4c18e3d5276c67eb11"}, + {file = "pydantic_core-2.16.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ce232a6170dd6532096cadbf6185271e4e8c70fc9217ebe105923ac105da9978"}, + {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a90fec23b4b05a09ad988e7a4f4e081711a90eb2a55b9c984d8b74597599180f"}, + {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8aafeedb6597a163a9c9727d8a8bd363a93277701b7bfd2749fbefee2396469e"}, + {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9957433c3a1b67bdd4c63717eaf174ebb749510d5ea612cd4e83f2d9142f3fc8"}, + {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0d7a9165167269758145756db43a133608a531b1e5bb6a626b9ee24bc38a8f7"}, + {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dffaf740fe2e147fedcb6b561353a16243e654f7fe8e701b1b9db148242e1272"}, + {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f8ed79883b4328b7f0bd142733d99c8e6b22703e908ec63d930b06be3a0e7113"}, + {file = "pydantic_core-2.16.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:cf903310a34e14651c9de056fcc12ce090560864d5a2bb0174b971685684e1d8"}, + {file = "pydantic_core-2.16.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:46b0d5520dbcafea9a8645a8164658777686c5c524d381d983317d29687cce97"}, + {file = "pydantic_core-2.16.2-cp311-none-win32.whl", hash = "sha256:70651ff6e663428cea902dac297066d5c6e5423fda345a4ca62430575364d62b"}, + {file = "pydantic_core-2.16.2-cp311-none-win_amd64.whl", hash = "sha256:98dc6f4f2095fc7ad277782a7c2c88296badcad92316b5a6e530930b1d475ebc"}, + {file = "pydantic_core-2.16.2-cp311-none-win_arm64.whl", hash = "sha256:ef6113cd31411eaf9b39fc5a8848e71c72656fd418882488598758b2c8c6dfa0"}, + {file = "pydantic_core-2.16.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:88646cae28eb1dd5cd1e09605680c2b043b64d7481cdad7f5003ebef401a3039"}, + {file = "pydantic_core-2.16.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7b883af50eaa6bb3299780651e5be921e88050ccf00e3e583b1e92020333304b"}, + {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bf26c2e2ea59d32807081ad51968133af3025c4ba5753e6a794683d2c91bf6e"}, + {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:99af961d72ac731aae2a1b55ccbdae0733d816f8bfb97b41909e143de735f522"}, + {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02906e7306cb8c5901a1feb61f9ab5e5c690dbbeaa04d84c1b9ae2a01ebe9379"}, + {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5362d099c244a2d2f9659fb3c9db7c735f0004765bbe06b99be69fbd87c3f15"}, + {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ac426704840877a285d03a445e162eb258924f014e2f074e209d9b4ff7bf380"}, + {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b94cbda27267423411c928208e89adddf2ea5dd5f74b9528513f0358bba019cb"}, + {file = "pydantic_core-2.16.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6db58c22ac6c81aeac33912fb1af0e930bc9774166cdd56eade913d5f2fff35e"}, + {file = "pydantic_core-2.16.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:396fdf88b1b503c9c59c84a08b6833ec0c3b5ad1a83230252a9e17b7dfb4cffc"}, + {file = "pydantic_core-2.16.2-cp312-none-win32.whl", hash = "sha256:7c31669e0c8cc68400ef0c730c3a1e11317ba76b892deeefaf52dcb41d56ed5d"}, + {file = "pydantic_core-2.16.2-cp312-none-win_amd64.whl", hash = "sha256:a3b7352b48fbc8b446b75f3069124e87f599d25afb8baa96a550256c031bb890"}, + {file = "pydantic_core-2.16.2-cp312-none-win_arm64.whl", hash = "sha256:a9e523474998fb33f7c1a4d55f5504c908d57add624599e095c20fa575b8d943"}, + {file = "pydantic_core-2.16.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:ae34418b6b389d601b31153b84dce480351a352e0bb763684a1b993d6be30f17"}, + {file = "pydantic_core-2.16.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:732bd062c9e5d9582a30e8751461c1917dd1ccbdd6cafb032f02c86b20d2e7ec"}, + {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b52776a2e3230f4854907a1e0946eec04d41b1fc64069ee774876bbe0eab55"}, + {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ef551c053692b1e39e3f7950ce2296536728871110e7d75c4e7753fb30ca87f4"}, + {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ebb892ed8599b23fa8f1799e13a12c87a97a6c9d0f497525ce9858564c4575a4"}, + {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aa6c8c582036275997a733427b88031a32ffa5dfc3124dc25a730658c47a572f"}, + {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4ba0884a91f1aecce75202473ab138724aa4fb26d7707f2e1fa6c3e68c84fbf"}, + {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7924e54f7ce5d253d6160090ddc6df25ed2feea25bfb3339b424a9dd591688bc"}, + {file = "pydantic_core-2.16.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69a7b96b59322a81c2203be537957313b07dd333105b73db0b69212c7d867b4b"}, + {file = "pydantic_core-2.16.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7e6231aa5bdacda78e96ad7b07d0c312f34ba35d717115f4b4bff6cb87224f0f"}, + {file = "pydantic_core-2.16.2-cp38-none-win32.whl", hash = "sha256:41dac3b9fce187a25c6253ec79a3f9e2a7e761eb08690e90415069ea4a68ff7a"}, + {file = "pydantic_core-2.16.2-cp38-none-win_amd64.whl", hash = "sha256:f685dbc1fdadb1dcd5b5e51e0a378d4685a891b2ddaf8e2bba89bd3a7144e44a"}, + {file = "pydantic_core-2.16.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:55749f745ebf154c0d63d46c8c58594d8894b161928aa41adbb0709c1fe78b77"}, + {file = "pydantic_core-2.16.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b30b0dd58a4509c3bd7eefddf6338565c4905406aee0c6e4a5293841411a1286"}, + {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18de31781cdc7e7b28678df7c2d7882f9692ad060bc6ee3c94eb15a5d733f8f7"}, + {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5864b0242f74b9dd0b78fd39db1768bc3f00d1ffc14e596fd3e3f2ce43436a33"}, + {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8f9186ca45aee030dc8234118b9c0784ad91a0bb27fc4e7d9d6608a5e3d386c"}, + {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc6f6c9be0ab6da37bc77c2dda5f14b1d532d5dbef00311ee6e13357a418e646"}, + {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa057095f621dad24a1e906747179a69780ef45cc8f69e97463692adbcdae878"}, + {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ad84731a26bcfb299f9eab56c7932d46f9cad51c52768cace09e92a19e4cf55"}, + {file = "pydantic_core-2.16.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3b052c753c4babf2d1edc034c97851f867c87d6f3ea63a12e2700f159f5c41c3"}, + {file = "pydantic_core-2.16.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e0f686549e32ccdb02ae6f25eee40cc33900910085de6aa3790effd391ae10c2"}, + {file = "pydantic_core-2.16.2-cp39-none-win32.whl", hash = "sha256:7afb844041e707ac9ad9acad2188a90bffce2c770e6dc2318be0c9916aef1469"}, + {file = "pydantic_core-2.16.2-cp39-none-win_amd64.whl", hash = "sha256:9da90d393a8227d717c19f5397688a38635afec89f2e2d7af0df037f3249c39a"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5f60f920691a620b03082692c378661947d09415743e437a7478c309eb0e4f82"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:47924039e785a04d4a4fa49455e51b4eb3422d6eaacfde9fc9abf8fdef164e8a"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6294e76b0380bb7a61eb8a39273c40b20beb35e8c87ee101062834ced19c545"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe56851c3f1d6f5384b3051c536cc81b3a93a73faf931f404fef95217cf1e10d"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9d776d30cde7e541b8180103c3f294ef7c1862fd45d81738d156d00551005784"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:72f7919af5de5ecfaf1eba47bf9a5d8aa089a3340277276e5636d16ee97614d7"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:4bfcbde6e06c56b30668a0c872d75a7ef3025dc3c1823a13cf29a0e9b33f67e8"}, + {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ff7c97eb7a29aba230389a2661edf2e9e06ce616c7e35aa764879b6894a44b25"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9b5f13857da99325dcabe1cc4e9e6a3d7b2e2c726248ba5dd4be3e8e4a0b6d0e"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a7e41e3ada4cca5f22b478c08e973c930e5e6c7ba3588fb8e35f2398cdcc1545"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60eb8ceaa40a41540b9acae6ae7c1f0a67d233c40dc4359c256ad2ad85bdf5e5"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7beec26729d496a12fd23cf8da9944ee338c8b8a17035a560b585c36fe81af20"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:22c5f022799f3cd6741e24f0443ead92ef42be93ffda0d29b2597208c94c3753"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:eca58e319f4fd6df004762419612122b2c7e7d95ffafc37e890252f869f3fb2a"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ed957db4c33bc99895f3a1672eca7e80e8cda8bd1e29a80536b4ec2153fa9804"}, + {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:459c0d338cc55d099798618f714b21b7ece17eb1a87879f2da20a3ff4c7628e2"}, + {file = "pydantic_core-2.16.2.tar.gz", hash = "sha256:0ba503850d8b8dcc18391f10de896ae51d37fe5fe43dbfb6a35c5c5cad271a06"}, ] [package.dependencies] @@ -1493,18 +1550,18 @@ tornado = ["tornado (>=5)"] [[package]] name = "setuptools" -version = "69.0.3" +version = "69.1.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-69.0.3-py3-none-any.whl", hash = "sha256:385eb4edd9c9d5c17540511303e39a147ce2fc04bc55289c322b9e5904fe2c05"}, - {file = "setuptools-69.0.3.tar.gz", hash = "sha256:be1af57fc409f93647f2e8e4573a142ed38724b8cdd389706a867bb4efcf1e78"}, + {file = "setuptools-69.1.0-py3-none-any.whl", hash = "sha256:c054629b81b946d63a9c6e732bc8b2513a7c3ea645f11d0139a2191d735c60c6"}, + {file = "setuptools-69.1.0.tar.gz", hash = "sha256:850894c4195f09c4ed30dba56213bf7c3f21d86ed6bdaafb5df5972593bfc401"}, ] [package.extras] docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] @@ -1518,6 +1575,35 @@ files = [ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] +[[package]] +name = "sniffio" +version = "1.3.0" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, + {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, +] + +[[package]] +name = "starlette" +version = "0.27.0" +description = "The little ASGI library that shines." +optional = false +python-versions = ">=3.7" +files = [ + {file = "starlette-0.27.0-py3-none-any.whl", hash = "sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91"}, + {file = "starlette-0.27.0.tar.gz", hash = "sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75"}, +] + +[package.dependencies] +anyio = ">=3.4.0,<5" +typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} + +[package.extras] +full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"] + [[package]] name = "tomli" version = "2.0.1" @@ -1617,17 +1703,18 @@ files = [ [[package]] name = "urllib3" -version = "2.1.0" +version = "2.2.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"}, - {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"}, + {file = "urllib3-2.2.0-py3-none-any.whl", hash = "sha256:ce3711610ddce217e6d113a2732fafad960a03fd0318c91faa79481e35c11224"}, + {file = "urllib3-2.2.0.tar.gz", hash = "sha256:051d961ad0c62a94e50ecf1af379c3aba230c66c710493493560c0c223c49f20"}, ] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] @@ -1835,4 +1922,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "~=3.9" -content-hash = "171ebb74de7b3488139484a80860f15fdd0e89932034ba950caa03316c101669" +content-hash = "4d5750e04105a649b849bdffd64d301db2048cfcdd3464abafa1b498ce9a4351" diff --git a/pyproject.toml b/pyproject.toml index 5637984f1..456d1871e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,6 +29,7 @@ opentelemetry-api = '1.17.0' opentelemetry-exporter-otlp-proto-grpc = '1.17.0' opentelemetry-instrumentation-tornado = '0.38b0' opentelemetry-instrumentation-aiohttp-client = '0.38b0' +fastapi = '0.105.0' [tool.poetry.group.test.dependencies] pytest = '>=7.2.0' diff --git a/tests/projects/balancer_app/pages/different_datacenter.py b/tests/projects/balancer_app/pages/different_datacenter.py index 2e4a4522a..8b295b026 100644 --- a/tests/projects/balancer_app/pages/different_datacenter.py +++ b/tests/projects/balancer_app/pages/different_datacenter.py @@ -7,7 +7,7 @@ from tornado.web import HTTPError from frontik import media_types -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router from tests.projects.balancer_app import get_server if TYPE_CHECKING: @@ -15,6 +15,7 @@ class Page(PageHandler): + @router.get() async def get_page(self): free_server = get_server(self, 'free') free_server.datacenter = 'dc1' @@ -37,6 +38,7 @@ async def get_page(self): self.text = result.data + @router.post() async def post_page(self): self.add_header('Content-Type', media_types.TEXT_PLAIN) self.text = 'result' diff --git a/tests/projects/balancer_app/pages/different_datacenter_async.py b/tests/projects/balancer_app/pages/different_datacenter_async.py index 0ce370535..bc4d6cba4 100644 --- a/tests/projects/balancer_app/pages/different_datacenter_async.py +++ b/tests/projects/balancer_app/pages/different_datacenter_async.py @@ -3,11 +3,12 @@ from tornado.web import HTTPError from frontik import media_types -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router from tests.projects.balancer_app import get_server class Page(PageHandler): + @router.get() async def get_page(self): free_server = get_server(self, 'free') free_server.datacenter = 'dc1' @@ -30,6 +31,7 @@ async def get_page(self): self.text = result.data + @router.post() async def post_page(self): self.add_header('Content-Type', media_types.TEXT_PLAIN) self.text = 'result' diff --git a/tests/projects/balancer_app/pages/no_available_backend.py b/tests/projects/balancer_app/pages/no_available_backend.py index cb508d91e..eaffdcd96 100644 --- a/tests/projects/balancer_app/pages/no_available_backend.py +++ b/tests/projects/balancer_app/pages/no_available_backend.py @@ -2,10 +2,12 @@ from http_client.request_response import NoAvailableServerException from frontik import handler, media_types +from frontik.handler import router from tests.projects.balancer_app.pages import check_all_requests_done class Page(handler.PageHandler): + @router.get() async def get_page(self): self.application.upstream_manager.update_upstream(Upstream('no_available_backend', {}, [])) @@ -20,6 +22,7 @@ async def request_with_processing() -> None: self.run_task(request_with_processing()) check_all_requests_done(self, 'no_available_backend') + @router.post() async def post_page(self): self.add_header('Content-Type', media_types.TEXT_PLAIN) self.text = 'result' diff --git a/tests/projects/balancer_app/pages/no_available_backend_async.py b/tests/projects/balancer_app/pages/no_available_backend_async.py index df72c5849..fd0b95b25 100644 --- a/tests/projects/balancer_app/pages/no_available_backend_async.py +++ b/tests/projects/balancer_app/pages/no_available_backend_async.py @@ -2,10 +2,12 @@ from http_client.request_response import NoAvailableServerException from frontik import handler, media_types +from frontik.handler import router from tests.projects.balancer_app.pages import check_all_requests_done class Page(handler.PageHandler): + @router.get() async def get_page(self): self.application.upstream_manager.update_upstream(Upstream('no_available_backend', {}, [])) @@ -22,6 +24,7 @@ async def get_page(self): check_all_requests_done(self, 'no_available_backend') + @router.post() async def post_page(self): self.add_header('Content-Type', media_types.TEXT_PLAIN) self.text = 'result' diff --git a/tests/projects/balancer_app/pages/no_retry_error.py b/tests/projects/balancer_app/pages/no_retry_error.py index 254048f2f..636628578 100644 --- a/tests/projects/balancer_app/pages/no_retry_error.py +++ b/tests/projects/balancer_app/pages/no_retry_error.py @@ -1,11 +1,13 @@ from http_client.balancing import Upstream from frontik import handler, media_types +from frontik.handler import router from tests.projects.balancer_app import get_server from tests.projects.balancer_app.pages import check_all_requests_done class Page(handler.PageHandler): + @router.get() async def get_page(self): self.application.upstream_manager.update_upstream(Upstream('no_retry_error', {}, [get_server(self, 'broken')])) @@ -17,6 +19,7 @@ async def get_page(self): check_all_requests_done(self, 'no_retry_error') + @router.post() async def post_page(self): self.add_header('Content-Type', media_types.TEXT_PLAIN) self.text = 'result' diff --git a/tests/projects/balancer_app/pages/no_retry_error_async.py b/tests/projects/balancer_app/pages/no_retry_error_async.py index f3cbf2113..c52073edd 100644 --- a/tests/projects/balancer_app/pages/no_retry_error_async.py +++ b/tests/projects/balancer_app/pages/no_retry_error_async.py @@ -1,11 +1,13 @@ from http_client.balancing import Upstream from frontik import handler, media_types +from frontik.handler import router from tests.projects.balancer_app import get_server from tests.projects.balancer_app.pages import check_all_requests_done class Page(handler.PageHandler): + @router.get() async def get_page(self): self.application.upstream_manager.update_upstream( Upstream('no_retry_error_async', {}, [get_server(self, 'broken')]), @@ -20,6 +22,7 @@ async def get_page(self): check_all_requests_done(self, 'no_retry_error_async') + @router.post() async def post_page(self): self.add_header('Content-Type', media_types.TEXT_PLAIN) self.text = 'result' diff --git a/tests/projects/balancer_app/pages/no_retry_timeout.py b/tests/projects/balancer_app/pages/no_retry_timeout.py index e90329627..0b8699f30 100644 --- a/tests/projects/balancer_app/pages/no_retry_timeout.py +++ b/tests/projects/balancer_app/pages/no_retry_timeout.py @@ -3,11 +3,13 @@ from http_client.balancing import Upstream from frontik import handler, media_types +from frontik.handler import router from tests.projects.balancer_app import get_server from tests.projects.balancer_app.pages import check_all_requests_done class Page(handler.PageHandler): + @router.get() async def get_page(self): self.application.upstream_manager.update_upstream( Upstream('no_retry_timeout', {}, [get_server(self, 'broken')]), @@ -21,6 +23,7 @@ async def get_page(self): check_all_requests_done(self, 'no_retry_timeout') + @router.post() async def post_page(self): self.add_header('Content-Type', media_types.TEXT_PLAIN) self.text = 'result' diff --git a/tests/projects/balancer_app/pages/no_retry_timeout_async.py b/tests/projects/balancer_app/pages/no_retry_timeout_async.py index 2e658e6c2..ce6a494ea 100644 --- a/tests/projects/balancer_app/pages/no_retry_timeout_async.py +++ b/tests/projects/balancer_app/pages/no_retry_timeout_async.py @@ -3,11 +3,13 @@ from http_client.balancing import Upstream, UpstreamConfig from frontik import handler, media_types +from frontik.handler import router from tests.projects.balancer_app import get_server from tests.projects.balancer_app.pages import check_all_requests_done class Page(handler.PageHandler): + @router.get() async def get_page(self): self.application.upstream_manager.upstreams['no_retry_timeout_async'] = Upstream( 'no_retry_timeout_async', @@ -33,6 +35,7 @@ async def get_page(self): check_all_requests_done(self, 'no_retry_timeout_async') + @router.post() async def post_page(self): self.add_header('Content-Type', media_types.TEXT_PLAIN) self.text = 'result' diff --git a/tests/projects/balancer_app/pages/profile_with_retry.py b/tests/projects/balancer_app/pages/profile_with_retry.py index 9fe84b5b4..d23a1cb1b 100644 --- a/tests/projects/balancer_app/pages/profile_with_retry.py +++ b/tests/projects/balancer_app/pages/profile_with_retry.py @@ -2,11 +2,12 @@ from tornado.web import HTTPError from frontik import media_types -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router from tests.projects.balancer_app import get_server class Page(PageHandler): + @router.get() async def get_page(self): servers = [get_server(self, 'broken'), get_server(self, 'normal')] upstream_config = { @@ -27,6 +28,7 @@ async def get_page(self): self.text = result.data + @router.put() async def put_page(self): self.add_header('Content-Type', media_types.TEXT_PLAIN) self.text = 'result' diff --git a/tests/projects/balancer_app/pages/profile_without_retry.py b/tests/projects/balancer_app/pages/profile_without_retry.py index ebf45f2e2..0f6026450 100644 --- a/tests/projects/balancer_app/pages/profile_without_retry.py +++ b/tests/projects/balancer_app/pages/profile_without_retry.py @@ -1,11 +1,12 @@ from http_client.balancing import Upstream, UpstreamConfig from frontik import media_types -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router from tests.projects.balancer_app import get_server class Page(PageHandler): + @router.get() async def get_page(self): servers = [get_server(self, 'broken'), get_server(self, 'normal')] upstream_config = { @@ -26,6 +27,7 @@ async def get_page(self): self.text = result.data + @router.put() async def put_page(self): self.add_header('Content-Type', media_types.TEXT_PLAIN) self.text = 'result' diff --git a/tests/projects/balancer_app/pages/requests_count.py b/tests/projects/balancer_app/pages/requests_count.py index b24f47de3..ad022b689 100644 --- a/tests/projects/balancer_app/pages/requests_count.py +++ b/tests/projects/balancer_app/pages/requests_count.py @@ -3,12 +3,13 @@ from http_client.balancing import Upstream from frontik import media_types -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router from tests.projects.balancer_app import get_server from tests.projects.balancer_app.pages import check_all_requests_done, check_all_servers_were_occupied class Page(PageHandler): + @router.get() async def get_page(self): self.application.upstream_manager.update_upstream(Upstream('requests_count', {}, [get_server(self, 'normal')])) self.text = '' @@ -28,6 +29,7 @@ async def request_with_processing() -> None: await asyncio.sleep(0.1) check_all_servers_were_occupied(self, 'requests_count') + @router.post() async def post_page(self): self.add_header('Content-Type', media_types.TEXT_PLAIN) self.text = str(self.application.upstream_manager.upstreams['requests_count'].servers[0].stat_requests) diff --git a/tests/projects/balancer_app/pages/requests_count_async.py b/tests/projects/balancer_app/pages/requests_count_async.py index 8faf47c2f..71d0a844b 100644 --- a/tests/projects/balancer_app/pages/requests_count_async.py +++ b/tests/projects/balancer_app/pages/requests_count_async.py @@ -3,12 +3,13 @@ from http_client.balancing import Upstream from frontik import media_types -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router from tests.projects.balancer_app import get_server from tests.projects.balancer_app.pages import check_all_requests_done, check_all_servers_occupied class Page(PageHandler): + @router.get() async def get_page(self): self.application.upstream_manager.update_upstream( Upstream('requests_count_async', {}, [get_server(self, 'normal')]), @@ -32,6 +33,7 @@ async def get_page(self): check_all_requests_done(self, 'requests_count_async') + @router.post() async def post_page(self): self.add_header('Content-Type', media_types.TEXT_PLAIN) servers = self.application.upstream_manager.upstreams['requests_count_async'].servers diff --git a/tests/projects/balancer_app/pages/retry_connect.py b/tests/projects/balancer_app/pages/retry_connect.py index 50cc66e26..895cf2279 100644 --- a/tests/projects/balancer_app/pages/retry_connect.py +++ b/tests/projects/balancer_app/pages/retry_connect.py @@ -2,13 +2,14 @@ from tornado.web import HTTPError from frontik import media_types -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router from frontik.util import gather_list from tests.projects.balancer_app import get_server from tests.projects.balancer_app.pages import check_all_servers_were_occupied class Page(PageHandler): + @router.get() async def get_page(self): self.application.upstream_manager.update_upstream( Upstream('retry_connect', {}, [get_server(self, 'free'), get_server(self, 'normal')]), @@ -30,6 +31,7 @@ async def get_page(self): self.text = self.text + result.data + @router.post() async def post_page(self): self.add_header('Content-Type', media_types.TEXT_PLAIN) self.text = 'result' diff --git a/tests/projects/balancer_app/pages/retry_connect_async.py b/tests/projects/balancer_app/pages/retry_connect_async.py index 96eeb9acf..608cddb12 100644 --- a/tests/projects/balancer_app/pages/retry_connect_async.py +++ b/tests/projects/balancer_app/pages/retry_connect_async.py @@ -4,12 +4,13 @@ from tornado.web import HTTPError from frontik import media_types -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router from tests.projects.balancer_app import get_server from tests.projects.balancer_app.pages import check_all_servers_were_occupied class Page(PageHandler): + @router.get() async def get_page(self): self.application.upstream_manager.update_upstream( Upstream('retry_connect_async', {}, [get_server(self, 'free'), get_server(self, 'normal')]), @@ -36,6 +37,7 @@ async def make_request() -> None: check_all_servers_were_occupied(self, 'retry_connect_async') + @router.post() async def post_page(self): self.add_header('Content-Type', media_types.TEXT_PLAIN) self.text = 'result' diff --git a/tests/projects/balancer_app/pages/retry_connect_timeout.py b/tests/projects/balancer_app/pages/retry_connect_timeout.py index 10654af98..f8754a5d4 100644 --- a/tests/projects/balancer_app/pages/retry_connect_timeout.py +++ b/tests/projects/balancer_app/pages/retry_connect_timeout.py @@ -2,13 +2,14 @@ from tornado.web import HTTPError from frontik import media_types -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router from frontik.util import gather_list from tests.projects.balancer_app import get_server from tests.projects.balancer_app.pages import check_all_servers_were_occupied class Page(PageHandler): + @router.get() async def get_page(self): self.application.upstream_manager.update_upstream( Upstream('retry_connect_timeout', {}, [get_server(self, 'normal')]), @@ -30,6 +31,7 @@ async def get_page(self): self.text = self.text + result.data + @router.post() async def post_page(self): self.add_header('Content-Type', media_types.TEXT_PLAIN) self.text = 'result' diff --git a/tests/projects/balancer_app/pages/retry_connect_timeout_async.py b/tests/projects/balancer_app/pages/retry_connect_timeout_async.py index 11288a303..0b9cb7972 100644 --- a/tests/projects/balancer_app/pages/retry_connect_timeout_async.py +++ b/tests/projects/balancer_app/pages/retry_connect_timeout_async.py @@ -4,12 +4,13 @@ from tornado.web import HTTPError from frontik import media_types -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router from tests.projects.balancer_app import get_server from tests.projects.balancer_app.pages import check_all_servers_were_occupied class Page(PageHandler): + @router.get() async def get_page(self): self.application.upstream_manager.update_upstream( Upstream('retry_connect_timeout', {}, [get_server(self, 'normal')]), @@ -36,6 +37,7 @@ async def make_request() -> None: check_all_servers_were_occupied(self, 'retry_connect_timeout') + @router.post() async def post_page(self): self.add_header('Content-Type', media_types.TEXT_PLAIN) self.text = 'result' diff --git a/tests/projects/balancer_app/pages/retry_count_limit.py b/tests/projects/balancer_app/pages/retry_count_limit.py index c3eb9384e..49abd97e8 100644 --- a/tests/projects/balancer_app/pages/retry_count_limit.py +++ b/tests/projects/balancer_app/pages/retry_count_limit.py @@ -1,11 +1,12 @@ from http_client.balancing import Upstream, UpstreamConfig -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router from tests.instances import find_free_port from tests.projects.balancer_app import get_server_with_port class Page(PageHandler): + @router.get() async def get_page(self): upstream = Upstream( 'retry_count_limit', diff --git a/tests/projects/balancer_app/pages/retry_count_limit_async.py b/tests/projects/balancer_app/pages/retry_count_limit_async.py index d1936a685..bdce4682a 100644 --- a/tests/projects/balancer_app/pages/retry_count_limit_async.py +++ b/tests/projects/balancer_app/pages/retry_count_limit_async.py @@ -1,11 +1,12 @@ from http_client.balancing import Upstream, UpstreamConfig -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router from tests.instances import find_free_port from tests.projects.balancer_app import get_server_with_port class Page(PageHandler): + @router.get() async def get_page(self): upstream = Upstream( 'retry_count_limit_async', diff --git a/tests/projects/balancer_app/pages/retry_error.py b/tests/projects/balancer_app/pages/retry_error.py index 5c9649806..75ccf855a 100644 --- a/tests/projects/balancer_app/pages/retry_error.py +++ b/tests/projects/balancer_app/pages/retry_error.py @@ -2,13 +2,14 @@ from tornado.web import HTTPError from frontik import media_types -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router from frontik.util import gather_list from tests.projects.balancer_app import get_server from tests.projects.balancer_app.pages import check_all_servers_were_occupied class Page(PageHandler): + @router.get() async def get_page(self): self.application.upstream_manager.update_upstream( Upstream('retry_error', {}, [get_server(self, 'broken'), get_server(self, 'normal')]), @@ -30,6 +31,7 @@ async def get_page(self): self.text = self.text + result.data + @router.put() async def put_page(self): self.add_header('Content-Type', media_types.TEXT_PLAIN) self.text = 'result' diff --git a/tests/projects/balancer_app/pages/retry_error_async.py b/tests/projects/balancer_app/pages/retry_error_async.py index 0e801b9f4..a71209e3e 100644 --- a/tests/projects/balancer_app/pages/retry_error_async.py +++ b/tests/projects/balancer_app/pages/retry_error_async.py @@ -4,12 +4,13 @@ from tornado.web import HTTPError from frontik import media_types -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router from tests.projects.balancer_app import get_server from tests.projects.balancer_app.pages import check_all_servers_were_occupied class Page(PageHandler): + @router.get() async def get_page(self): self.application.upstream_manager.update_upstream( Upstream('retry_error_async', {}, [get_server(self, 'broken'), get_server(self, 'normal')]), @@ -36,6 +37,7 @@ async def make_request() -> None: check_all_servers_were_occupied(self, 'retry_error_async') + @router.put() async def put_page(self): self.add_header('Content-Type', media_types.TEXT_PLAIN) self.text = 'result' diff --git a/tests/projects/balancer_app/pages/retry_non_idempotent_503.py b/tests/projects/balancer_app/pages/retry_non_idempotent_503.py index 22fe36b3a..79557956c 100644 --- a/tests/projects/balancer_app/pages/retry_non_idempotent_503.py +++ b/tests/projects/balancer_app/pages/retry_non_idempotent_503.py @@ -2,13 +2,14 @@ from tornado.web import HTTPError from frontik import media_types -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router from frontik.util import gather_list from tests.projects.balancer_app import get_server from tests.projects.balancer_app.pages import check_all_requests_done class Page(PageHandler): + @router.get() async def get_page(self): upstream_config = {Upstream.DEFAULT_PROFILE: UpstreamConfig(retry_policy={503: {'idempotent': 'true'}})} self.application.upstream_manager.update_upstream( @@ -33,6 +34,7 @@ async def get_page(self): check_all_requests_done(self, 'retry_non_idempotent_503') check_all_requests_done(self, 'do_not_retry_non_idempotent_503') + @router.post() async def post_page(self): self.add_header('Content-Type', media_types.TEXT_PLAIN) self.text = 'result' diff --git a/tests/projects/balancer_app/pages/retry_non_idempotent_503_async.py b/tests/projects/balancer_app/pages/retry_non_idempotent_503_async.py index 06b8d7f37..7ad5f3294 100644 --- a/tests/projects/balancer_app/pages/retry_non_idempotent_503_async.py +++ b/tests/projects/balancer_app/pages/retry_non_idempotent_503_async.py @@ -4,12 +4,13 @@ from tornado.web import HTTPError from frontik import media_types -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router from tests.projects.balancer_app import get_server from tests.projects.balancer_app.pages import check_all_requests_done class Page(PageHandler): + @router.get() async def get_page(self): upstream_config = {Upstream.DEFAULT_PROFILE: UpstreamConfig(retry_policy={503: {'idempotent': 'true'}})} self.application.upstream_manager.update_upstream( @@ -42,6 +43,7 @@ async def post_without_retry() -> None: check_all_requests_done(self, 'retry_non_idempotent_503_async') check_all_requests_done(self, 'do_not_retry_non_idempotent_503_async') + @router.post() async def post_page(self): self.add_header('Content-Type', media_types.TEXT_PLAIN) self.text = 'result' diff --git a/tests/projects/balancer_app/pages/retry_on_timeout.py b/tests/projects/balancer_app/pages/retry_on_timeout.py index 4e6f4d7d8..1dd952787 100644 --- a/tests/projects/balancer_app/pages/retry_on_timeout.py +++ b/tests/projects/balancer_app/pages/retry_on_timeout.py @@ -2,12 +2,13 @@ from tornado.web import HTTPError from frontik import media_types -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router from tests.projects.balancer_app import get_server from tests.projects.balancer_app.pages import check_all_requests_done class Page(PageHandler): + @router.get() async def get_page(self): self.application.upstream_manager.update_upstream( Upstream('retry_on_timeout', {}, [get_server(self, 'broken'), get_server(self, 'normal')]), @@ -28,6 +29,7 @@ async def get_page(self): check_all_requests_done(self, 'retry_on_timeout') + @router.delete() async def delete_page(self): self.add_header('Content-Type', media_types.TEXT_PLAIN) self.text = 'result' diff --git a/tests/projects/balancer_app/pages/retry_on_timeout_async.py b/tests/projects/balancer_app/pages/retry_on_timeout_async.py index fdca6769b..d357b4cb8 100644 --- a/tests/projects/balancer_app/pages/retry_on_timeout_async.py +++ b/tests/projects/balancer_app/pages/retry_on_timeout_async.py @@ -2,12 +2,13 @@ from tornado.web import HTTPError from frontik import media_types -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router from tests.projects.balancer_app import get_server from tests.projects.balancer_app.pages import check_all_requests_done class Page(PageHandler): + @router.get() async def get_page(self): self.application.upstream_manager.update_upstream( Upstream('retry_on_timeout_async', {}, [get_server(self, 'broken'), get_server(self, 'normal')]), @@ -28,6 +29,7 @@ async def get_page(self): check_all_requests_done(self, 'retry_on_timeout_async') + @router.delete() async def delete_page(self): self.add_header('Content-Type', media_types.TEXT_PLAIN) self.text = 'result' diff --git a/tests/projects/balancer_app/pages/slow_start.py b/tests/projects/balancer_app/pages/slow_start.py index 638eaf3c0..dc8d37e86 100644 --- a/tests/projects/balancer_app/pages/slow_start.py +++ b/tests/projects/balancer_app/pages/slow_start.py @@ -3,12 +3,13 @@ from http_client.balancing import Server, Upstream, UpstreamConfig from frontik import media_types -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router from tests.projects.balancer_app import get_server from tests.projects.balancer_app.pages import check_all_requests_done, check_all_servers_were_occupied class Page(PageHandler): + @router.get() async def get_page(self): server = get_server(self, 'normal') server.weight = 5 @@ -45,6 +46,7 @@ async def get_page(self): self.text = str(server.stat_requests + server_slow_start.stat_requests) check_all_requests_done(self, 'slow_start') + @router.post() async def post_page(self): self.add_header('Content-Type', media_types.TEXT_PLAIN) self.text = str(self.application.upstream_manager.upstreams['slow_start'].servers[0].stat_requests) diff --git a/tests/projects/balancer_app/pages/slow_start_async.py b/tests/projects/balancer_app/pages/slow_start_async.py index bdef22815..0e0528e80 100644 --- a/tests/projects/balancer_app/pages/slow_start_async.py +++ b/tests/projects/balancer_app/pages/slow_start_async.py @@ -3,12 +3,13 @@ from http_client.balancing import Server, Upstream, UpstreamConfig from frontik import media_types -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router from tests.projects.balancer_app import get_server from tests.projects.balancer_app.pages import check_all_requests_done class Page(PageHandler): + @router.get() async def get_page(self): server = get_server(self, 'normal') server.weight = 5 @@ -42,6 +43,7 @@ async def make_request(delay: float = 0) -> None: check_all_requests_done(self, 'slow_start_async') + @router.post() async def post_page(self): self.add_header('Content-Type', media_types.TEXT_PLAIN) servers = self.application.upstream_manager.upstreams['slow_start_async'].servers diff --git a/tests/projects/balancer_app/pages/speculative_no_retry.py b/tests/projects/balancer_app/pages/speculative_no_retry.py index 5c74d45b5..bf0771355 100644 --- a/tests/projects/balancer_app/pages/speculative_no_retry.py +++ b/tests/projects/balancer_app/pages/speculative_no_retry.py @@ -1,11 +1,12 @@ from http_client.balancing import Upstream from frontik import media_types -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router from tests.projects.balancer_app import get_server class Page(PageHandler): + @router.get() async def get_page(self): self.application.upstream_manager.upstreams['speculative_no_retry'] = Upstream('speculative_no_retry', {}, []) self.application.upstream_manager.update_upstream( @@ -27,6 +28,7 @@ async def get_page(self): self.text = result.data + @router.post() async def post_page(self): self.add_header('Content-Type', media_types.TEXT_PLAIN) self.text = 'result' diff --git a/tests/projects/balancer_app/pages/speculative_retry.py b/tests/projects/balancer_app/pages/speculative_retry.py index b45473653..d5d6ba195 100644 --- a/tests/projects/balancer_app/pages/speculative_retry.py +++ b/tests/projects/balancer_app/pages/speculative_retry.py @@ -2,11 +2,12 @@ from tornado.web import HTTPError from frontik import media_types -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router from tests.projects.balancer_app import get_server class Page(PageHandler): + @router.get() async def get_page(self): self.application.upstream_manager.upstreams['speculative_retry'] = Upstream('speculative_no_retry', {}, []) self.application.upstream_manager.update_upstream( @@ -27,6 +28,7 @@ async def get_page(self): self.text = result.data + @router.put() async def put_page(self): self.add_header('Content-Type', media_types.TEXT_PLAIN) self.text = 'result' diff --git a/tests/projects/broken_balancer_app/pages/no_retry_error.py b/tests/projects/broken_balancer_app/pages/no_retry_error.py index a7d8b7c68..6935ac281 100644 --- a/tests/projects/broken_balancer_app/pages/no_retry_error.py +++ b/tests/projects/broken_balancer_app/pages/no_retry_error.py @@ -1,8 +1,9 @@ from tornado.web import HTTPError -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router class Page(PageHandler): + @router.post() async def post_page(self): raise HTTPError(500, 'something went wrong, no retry') diff --git a/tests/projects/broken_balancer_app/pages/no_retry_error_async.py b/tests/projects/broken_balancer_app/pages/no_retry_error_async.py index a7d8b7c68..6935ac281 100644 --- a/tests/projects/broken_balancer_app/pages/no_retry_error_async.py +++ b/tests/projects/broken_balancer_app/pages/no_retry_error_async.py @@ -1,8 +1,9 @@ from tornado.web import HTTPError -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router class Page(PageHandler): + @router.post() async def post_page(self): raise HTTPError(500, 'something went wrong, no retry') diff --git a/tests/projects/broken_balancer_app/pages/no_retry_timeout.py b/tests/projects/broken_balancer_app/pages/no_retry_timeout.py index db5ceb704..c6fc9efa0 100644 --- a/tests/projects/broken_balancer_app/pages/no_retry_timeout.py +++ b/tests/projects/broken_balancer_app/pages/no_retry_timeout.py @@ -1,9 +1,11 @@ import time import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.post() async def post_page(self): self.add_timeout(time.time() + 2, self.finish_group.add(self.check_finished(self.timeout_callback))) diff --git a/tests/projects/broken_balancer_app/pages/no_retry_timeout_async.py b/tests/projects/broken_balancer_app/pages/no_retry_timeout_async.py index 141ad7ef3..8e0857379 100644 --- a/tests/projects/broken_balancer_app/pages/no_retry_timeout_async.py +++ b/tests/projects/broken_balancer_app/pages/no_retry_timeout_async.py @@ -1,9 +1,11 @@ import asyncio import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.post() async def post_page(self): await asyncio.sleep(2) diff --git a/tests/projects/broken_balancer_app/pages/profile_with_retry.py b/tests/projects/broken_balancer_app/pages/profile_with_retry.py index 8f4eb8011..da3919d04 100644 --- a/tests/projects/broken_balancer_app/pages/profile_with_retry.py +++ b/tests/projects/broken_balancer_app/pages/profile_with_retry.py @@ -1,8 +1,10 @@ from tornado.web import HTTPError from frontik import handler +from frontik.handler import router class Page(handler.PageHandler): + @router.put() async def put_page(self): raise HTTPError(503, 'broken') diff --git a/tests/projects/broken_balancer_app/pages/profile_without_retry.py b/tests/projects/broken_balancer_app/pages/profile_without_retry.py index 8f4eb8011..da3919d04 100644 --- a/tests/projects/broken_balancer_app/pages/profile_without_retry.py +++ b/tests/projects/broken_balancer_app/pages/profile_without_retry.py @@ -1,8 +1,10 @@ from tornado.web import HTTPError from frontik import handler +from frontik.handler import router class Page(handler.PageHandler): + @router.put() async def put_page(self): raise HTTPError(503, 'broken') diff --git a/tests/projects/broken_balancer_app/pages/retry_connect.py b/tests/projects/broken_balancer_app/pages/retry_connect.py index ddc2d3e9b..077a85a3d 100644 --- a/tests/projects/broken_balancer_app/pages/retry_connect.py +++ b/tests/projects/broken_balancer_app/pages/retry_connect.py @@ -1,8 +1,9 @@ from tornado.web import HTTPError -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router class Page(PageHandler): + @router.post() async def post_page(self): raise HTTPError(503, 'broken, retry') diff --git a/tests/projects/broken_balancer_app/pages/retry_connect_async.py b/tests/projects/broken_balancer_app/pages/retry_connect_async.py index ddc2d3e9b..077a85a3d 100644 --- a/tests/projects/broken_balancer_app/pages/retry_connect_async.py +++ b/tests/projects/broken_balancer_app/pages/retry_connect_async.py @@ -1,8 +1,9 @@ from tornado.web import HTTPError -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router class Page(PageHandler): + @router.post() async def post_page(self): raise HTTPError(503, 'broken, retry') diff --git a/tests/projects/broken_balancer_app/pages/retry_error.py b/tests/projects/broken_balancer_app/pages/retry_error.py index 9941e106a..a765be851 100644 --- a/tests/projects/broken_balancer_app/pages/retry_error.py +++ b/tests/projects/broken_balancer_app/pages/retry_error.py @@ -1,8 +1,9 @@ from tornado.web import HTTPError -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router class Page(PageHandler): + @router.put() async def put_page(self): raise HTTPError(503, 'broken, retry') diff --git a/tests/projects/broken_balancer_app/pages/retry_error_async.py b/tests/projects/broken_balancer_app/pages/retry_error_async.py index 9941e106a..a765be851 100644 --- a/tests/projects/broken_balancer_app/pages/retry_error_async.py +++ b/tests/projects/broken_balancer_app/pages/retry_error_async.py @@ -1,8 +1,9 @@ from tornado.web import HTTPError -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router class Page(PageHandler): + @router.put() async def put_page(self): raise HTTPError(503, 'broken, retry') diff --git a/tests/projects/broken_balancer_app/pages/retry_non_idempotent_503.py b/tests/projects/broken_balancer_app/pages/retry_non_idempotent_503.py index ddc2d3e9b..077a85a3d 100644 --- a/tests/projects/broken_balancer_app/pages/retry_non_idempotent_503.py +++ b/tests/projects/broken_balancer_app/pages/retry_non_idempotent_503.py @@ -1,8 +1,9 @@ from tornado.web import HTTPError -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router class Page(PageHandler): + @router.post() async def post_page(self): raise HTTPError(503, 'broken, retry') diff --git a/tests/projects/broken_balancer_app/pages/retry_non_idempotent_503_async.py b/tests/projects/broken_balancer_app/pages/retry_non_idempotent_503_async.py index ddc2d3e9b..077a85a3d 100644 --- a/tests/projects/broken_balancer_app/pages/retry_non_idempotent_503_async.py +++ b/tests/projects/broken_balancer_app/pages/retry_non_idempotent_503_async.py @@ -1,8 +1,9 @@ from tornado.web import HTTPError -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router class Page(PageHandler): + @router.post() async def post_page(self): raise HTTPError(503, 'broken, retry') diff --git a/tests/projects/broken_balancer_app/pages/retry_on_timeout.py b/tests/projects/broken_balancer_app/pages/retry_on_timeout.py index 1d11fe73c..69a6306a2 100644 --- a/tests/projects/broken_balancer_app/pages/retry_on_timeout.py +++ b/tests/projects/broken_balancer_app/pages/retry_on_timeout.py @@ -1,9 +1,11 @@ import time from frontik import handler, media_types +from frontik.handler import router class Page(handler.PageHandler): + @router.delete() async def delete_page(self): self.add_timeout(time.time() + 2, self.finish_group.add(self.check_finished(self.timeout_callback))) diff --git a/tests/projects/broken_balancer_app/pages/retry_on_timeout_async.py b/tests/projects/broken_balancer_app/pages/retry_on_timeout_async.py index dfaec75ed..d85888fba 100644 --- a/tests/projects/broken_balancer_app/pages/retry_on_timeout_async.py +++ b/tests/projects/broken_balancer_app/pages/retry_on_timeout_async.py @@ -1,9 +1,11 @@ import asyncio from frontik import handler, media_types +from frontik.handler import router class Page(handler.PageHandler): + @router.delete() async def delete_page(self): await asyncio.sleep(2) diff --git a/tests/projects/broken_balancer_app/pages/speculative_no_retry.py b/tests/projects/broken_balancer_app/pages/speculative_no_retry.py index d37014608..96998e4f5 100644 --- a/tests/projects/broken_balancer_app/pages/speculative_no_retry.py +++ b/tests/projects/broken_balancer_app/pages/speculative_no_retry.py @@ -3,9 +3,11 @@ from tornado.web import HTTPError from frontik import handler +from frontik.handler import router class Page(handler.PageHandler): + @router.post() async def post_page(self): await asyncio.sleep(0.8) raise HTTPError(500, 'broken') diff --git a/tests/projects/broken_balancer_app/pages/speculative_retry.py b/tests/projects/broken_balancer_app/pages/speculative_retry.py index d265bce2e..14bdae1f8 100644 --- a/tests/projects/broken_balancer_app/pages/speculative_retry.py +++ b/tests/projects/broken_balancer_app/pages/speculative_retry.py @@ -3,9 +3,11 @@ from tornado.web import HTTPError from frontik import handler +from frontik.handler import router class Page(handler.PageHandler): + @router.put() async def put_page(self): await asyncio.sleep(0.8) raise HTTPError(503, 'broken, retry') diff --git a/tests/projects/consul_mock_app/pages/call_deregistration_stat.py b/tests/projects/consul_mock_app/pages/call_deregistration_stat.py index c04588c15..8f062d55e 100644 --- a/tests/projects/consul_mock_app/pages/call_deregistration_stat.py +++ b/tests/projects/consul_mock_app/pages/call_deregistration_stat.py @@ -3,13 +3,14 @@ import json from typing import TYPE_CHECKING -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router if TYPE_CHECKING: from tests.projects.consul_mock_app import TestApplication class Page(PageHandler): + @router.get() async def get_page(self): self.set_status(200) self.application: TestApplication diff --git a/tests/projects/consul_mock_app/pages/call_deregistration_stat_async.py b/tests/projects/consul_mock_app/pages/call_deregistration_stat_async.py index c04588c15..8f062d55e 100644 --- a/tests/projects/consul_mock_app/pages/call_deregistration_stat_async.py +++ b/tests/projects/consul_mock_app/pages/call_deregistration_stat_async.py @@ -3,13 +3,14 @@ import json from typing import TYPE_CHECKING -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router if TYPE_CHECKING: from tests.projects.consul_mock_app import TestApplication class Page(PageHandler): + @router.get() async def get_page(self): self.set_status(200) self.application: TestApplication diff --git a/tests/projects/consul_mock_app/pages/call_registration_stat.py b/tests/projects/consul_mock_app/pages/call_registration_stat.py index 5f12903c1..054849fd3 100644 --- a/tests/projects/consul_mock_app/pages/call_registration_stat.py +++ b/tests/projects/consul_mock_app/pages/call_registration_stat.py @@ -3,13 +3,14 @@ import json from typing import TYPE_CHECKING -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router if TYPE_CHECKING: from tests.projects.consul_mock_app import TestApplication class Page(PageHandler): + @router.get() async def get_page(self): self.set_status(200) self.application: TestApplication diff --git a/tests/projects/consul_mock_app/pages/call_registration_stat_async.py b/tests/projects/consul_mock_app/pages/call_registration_stat_async.py index 5f12903c1..054849fd3 100644 --- a/tests/projects/consul_mock_app/pages/call_registration_stat_async.py +++ b/tests/projects/consul_mock_app/pages/call_registration_stat_async.py @@ -3,13 +3,14 @@ import json from typing import TYPE_CHECKING -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router if TYPE_CHECKING: from tests.projects.consul_mock_app import TestApplication class Page(PageHandler): + @router.get() async def get_page(self): self.set_status(200) self.application: TestApplication diff --git a/tests/projects/consul_mock_app/pages/deregister.py b/tests/projects/consul_mock_app/pages/deregister.py index 86a8f36bb..e420b1395 100644 --- a/tests/projects/consul_mock_app/pages/deregister.py +++ b/tests/projects/consul_mock_app/pages/deregister.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router if TYPE_CHECKING: from tests.projects.consul_mock_app import TestApplication @@ -13,14 +13,17 @@ def __init__(self, *args, **kwargs): self.application: TestApplication super().__init__(*args, **kwargs) + @router.get() async def get_page(self): self.set_status(200) self.application.deregistration_call_counter['get_page'] += 1 + @router.put() async def put_page(self): self.set_status(200) self.application.deregistration_call_counter['put_page'] += 1 + @router.post() async def post_page(self): self.set_status(200) self.application.deregistration_call_counter['post_page'] += 1 diff --git a/tests/projects/consul_mock_app/pages/v1/agent/service/register.py b/tests/projects/consul_mock_app/pages/v1/agent/service/register.py index 4d2bcaf02..c464f9d58 100644 --- a/tests/projects/consul_mock_app/pages/v1/agent/service/register.py +++ b/tests/projects/consul_mock_app/pages/v1/agent/service/register.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router if TYPE_CHECKING: from tests.projects.consul_mock_app import TestApplication @@ -13,14 +13,17 @@ def __init__(self, *args, **kwargs): self.application: TestApplication super().__init__(*args, **kwargs) + @router.get() async def get_page(self): self.set_status(200) self.application.registration_call_counter['get_page'] += 1 + @router.put() async def put_page(self): self.set_status(200) self.application.registration_call_counter['put_page'] += 1 + @router.post() async def post_page(self): self.set_status(200) self.application.registration_call_counter['post_page'] += 1 diff --git a/tests/projects/consul_mock_app/pages/v1/kv/host/hostname/weight/weight.py b/tests/projects/consul_mock_app/pages/v1/kv/host/hostname/weight/weight.py index 944033805..6d6aaa2ef 100644 --- a/tests/projects/consul_mock_app/pages/v1/kv/host/hostname/weight/weight.py +++ b/tests/projects/consul_mock_app/pages/v1/kv/host/hostname/weight/weight.py @@ -1,16 +1,19 @@ import json -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router class Page(PageHandler): + @router.get() async def get_page(self): self.set_header('X-Consul-Index', 1) self.text = json.dumps([{'Value': 'NTU=', 'CreateIndex': 1, 'ModifyIndex': 1}]) self.set_status(200) + @router.put() async def put_page(self): self.set_status(200) + @router.post() async def post_page(self): self.set_status(200) diff --git a/tests/projects/consul_mock_app/pages/v1/kv/upstream/upstream.py b/tests/projects/consul_mock_app/pages/v1/kv/upstream/upstream.py index 2c0a2fb69..82d3de99b 100644 --- a/tests/projects/consul_mock_app/pages/v1/kv/upstream/upstream.py +++ b/tests/projects/consul_mock_app/pages/v1/kv/upstream/upstream.py @@ -1,16 +1,19 @@ import json -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router class Page(PageHandler): + @router.get() async def get_page(self): self.set_header('X-Consul-Index', 1) self.text = json.dumps([{'Value': None, 'CreateIndex': 1, 'ModifyIndex': 1}]) self.set_status(200) + @router.put() async def put_page(self): self.set_status(200) + @router.post() async def post_page(self): self.set_status(200) diff --git a/tests/projects/no_debug_app/pages/basic_auth.py b/tests/projects/no_debug_app/pages/basic_auth.py index 424ea89d4..c45cfa0ad 100644 --- a/tests/projects/no_debug_app/pages/basic_auth.py +++ b/tests/projects/no_debug_app/pages/basic_auth.py @@ -1,7 +1,9 @@ import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): self.require_debug_access('user', 'god') self.json.put({'authenticated': True}) diff --git a/tests/projects/no_debug_app/pages/basic_auth_async.py b/tests/projects/no_debug_app/pages/basic_auth_async.py index 424ea89d4..c45cfa0ad 100644 --- a/tests/projects/no_debug_app/pages/basic_auth_async.py +++ b/tests/projects/no_debug_app/pages/basic_auth_async.py @@ -1,7 +1,9 @@ import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): self.require_debug_access('user', 'god') self.json.put({'authenticated': True}) diff --git a/tests/projects/no_debug_app/pages/check_workers_count_down.py b/tests/projects/no_debug_app/pages/check_workers_count_down.py index 939b5deb2..77d6da6b3 100644 --- a/tests/projects/no_debug_app/pages/check_workers_count_down.py +++ b/tests/projects/no_debug_app/pages/check_workers_count_down.py @@ -1,6 +1,8 @@ import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): self.text = str(self.application.init_workers_count_down.value) diff --git a/tests/projects/no_debug_app/pages/check_workers_count_down_async.py b/tests/projects/no_debug_app/pages/check_workers_count_down_async.py index 939b5deb2..77d6da6b3 100644 --- a/tests/projects/no_debug_app/pages/check_workers_count_down_async.py +++ b/tests/projects/no_debug_app/pages/check_workers_count_down_async.py @@ -1,6 +1,8 @@ import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): self.text = str(self.application.init_workers_count_down.value) diff --git a/tests/projects/no_debug_app/pages/jinja_no_environment.py b/tests/projects/no_debug_app/pages/jinja_no_environment.py index 1db2ef63a..e15dd443a 100644 --- a/tests/projects/no_debug_app/pages/jinja_no_environment.py +++ b/tests/projects/no_debug_app/pages/jinja_no_environment.py @@ -1,7 +1,9 @@ import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): self.set_template('empty.html') self.json.put({'x': 'y'}) diff --git a/tests/projects/no_debug_app/pages/jinja_no_environment_async.py b/tests/projects/no_debug_app/pages/jinja_no_environment_async.py index 1db2ef63a..e15dd443a 100644 --- a/tests/projects/no_debug_app/pages/jinja_no_environment_async.py +++ b/tests/projects/no_debug_app/pages/jinja_no_environment_async.py @@ -1,7 +1,9 @@ import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): self.set_template('empty.html') self.json.put({'x': 'y'}) diff --git a/tests/projects/no_debug_app/pages/recursion.py b/tests/projects/no_debug_app/pages/recursion.py index 4b05faf2a..585400fc9 100644 --- a/tests/projects/no_debug_app/pages/recursion.py +++ b/tests/projects/no_debug_app/pages/recursion.py @@ -1,7 +1,9 @@ from frontik import handler, media_types +from frontik.handler import router class Page(handler.PageHandler): + @router.get() async def get_page(self): n = int(self.get_argument('n')) if n > 0: diff --git a/tests/projects/no_debug_app/pages/recursion_async.py b/tests/projects/no_debug_app/pages/recursion_async.py index 6d0012345..bdfcc1559 100644 --- a/tests/projects/no_debug_app/pages/recursion_async.py +++ b/tests/projects/no_debug_app/pages/recursion_async.py @@ -1,7 +1,9 @@ from frontik import handler, media_types +from frontik.handler import router class Page(handler.PageHandler): + @router.get() async def get_page(self): n = int(self.get_argument('n')) if n > 0: diff --git a/tests/projects/no_debug_app/pages/simple.py b/tests/projects/no_debug_app/pages/simple.py index aaf21ce54..fa67aca62 100644 --- a/tests/projects/no_debug_app/pages/simple.py +++ b/tests/projects/no_debug_app/pages/simple.py @@ -1,9 +1,11 @@ from lxml import etree import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): self.set_xsl('simple.xsl') self.doc.put(etree.Element('ok')) diff --git a/tests/projects/no_debug_app/pages/simple_async.py b/tests/projects/no_debug_app/pages/simple_async.py index aaf21ce54..fa67aca62 100644 --- a/tests/projects/no_debug_app/pages/simple_async.py +++ b/tests/projects/no_debug_app/pages/simple_async.py @@ -1,9 +1,11 @@ from lxml import etree import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): self.set_xsl('simple.xsl') self.doc.put(etree.Element('ok')) diff --git a/tests/projects/re_app/pages/handler_404.py b/tests/projects/re_app/pages/handler_404.py index 0243a0ab3..dbd80f5c1 100644 --- a/tests/projects/re_app/pages/handler_404.py +++ b/tests/projects/re_app/pages/handler_404.py @@ -1,7 +1,8 @@ -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router class Page(PageHandler): + @router.get() async def get_page(self): self.text = '404' self.set_status(404) diff --git a/tests/projects/re_app/pages/id_param.py b/tests/projects/re_app/pages/id_param.py index 153c604d6..13243efb7 100644 --- a/tests/projects/re_app/pages/id_param.py +++ b/tests/projects/re_app/pages/id_param.py @@ -1,9 +1,11 @@ import lxml.etree as etree import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): self.set_xsl('id_param.xsl') self.doc.put(etree.Element('id', value=self.get_argument('id', 'wrong'))) diff --git a/tests/projects/re_app/pages/jinja_custom_environment.py b/tests/projects/re_app/pages/jinja_custom_environment.py index f39980797..ffd1e189e 100644 --- a/tests/projects/re_app/pages/jinja_custom_environment.py +++ b/tests/projects/re_app/pages/jinja_custom_environment.py @@ -1,7 +1,9 @@ import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): self.set_template('jinja_custom_environment.html') self.json.put({}) diff --git a/tests/projects/re_app/pages/reverse_url.py b/tests/projects/re_app/pages/reverse_url.py index a4a0fc170..1c1c38e77 100644 --- a/tests/projects/re_app/pages/reverse_url.py +++ b/tests/projects/re_app/pages/reverse_url.py @@ -1,7 +1,8 @@ -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router class Page(PageHandler): + @router.get() async def get_page(self): if self.get_argument('fail_args', 'false') != 'false': self.text = self.reverse_url('two_ids', 1) diff --git a/tests/projects/re_app/pages/sentry_not_configured.py b/tests/projects/re_app/pages/sentry_not_configured.py index 49331f107..74f5dad02 100644 --- a/tests/projects/re_app/pages/sentry_not_configured.py +++ b/tests/projects/re_app/pages/sentry_not_configured.py @@ -1,6 +1,8 @@ import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): assert not hasattr(self, 'get_sentry_logger') diff --git a/tests/projects/re_app/pages/simple.py b/tests/projects/re_app/pages/simple.py index aaf21ce54..fa67aca62 100644 --- a/tests/projects/re_app/pages/simple.py +++ b/tests/projects/re_app/pages/simple.py @@ -1,9 +1,11 @@ from lxml import etree import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): self.set_xsl('simple.xsl') self.doc.put(etree.Element('ok')) diff --git a/tests/projects/test_app/pages/api/2/store.py b/tests/projects/test_app/pages/api/2/store.py index 533ffcf85..0eaeaa1a5 100644 --- a/tests/projects/test_app/pages/api/2/store.py +++ b/tests/projects/test_app/pages/api/2/store.py @@ -2,18 +2,22 @@ import json import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): exceptions = [] + @router.post() async def post_page(self): message = gzip.decompress(self.request.body).decode('utf8') sentry_event = json.loads(message.split('\n')[-1]) Page.exceptions.append(sentry_event) + @router.get() async def get_page(self): self.json.put({'exceptions': Page.exceptions}) + @router.delete() async def delete_page(self): Page.exceptions = [] diff --git a/tests/projects/test_app/pages/arguments.py b/tests/projects/test_app/pages/arguments.py index ef90e2660..8c19b6aad 100644 --- a/tests/projects/test_app/pages/arguments.py +++ b/tests/projects/test_app/pages/arguments.py @@ -1,6 +1,8 @@ import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): self.json.put({'тест': self.get_argument('param')}) diff --git a/tests/projects/test_app/pages/arguments_async.py b/tests/projects/test_app/pages/arguments_async.py index ef90e2660..8c19b6aad 100644 --- a/tests/projects/test_app/pages/arguments_async.py +++ b/tests/projects/test_app/pages/arguments_async.py @@ -1,6 +1,8 @@ import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): self.json.put({'тест': self.get_argument('param')}) diff --git a/tests/projects/test_app/pages/async_group/group.py b/tests/projects/test_app/pages/async_group/group.py index 1bf791c8a..3c7f6fc17 100644 --- a/tests/projects/test_app/pages/async_group/group.py +++ b/tests/projects/test_app/pages/async_group/group.py @@ -1,8 +1,10 @@ import frontik.handler +from frontik.handler import router from frontik.util import gather_dict class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): ensure_callback_is_async = False fail_callback = self.get_argument('fail_callback', 'false') == 'true' @@ -43,5 +45,6 @@ async def group_task() -> None: self.run_task(group_task()) + @router.post() async def post_page(self): self.json.put({self.get_argument('data'): 'yay'}) diff --git a/tests/projects/test_app/pages/async_group/group_async.py b/tests/projects/test_app/pages/async_group/group_async.py index 04295a44b..201be77c8 100644 --- a/tests/projects/test_app/pages/async_group/group_async.py +++ b/tests/projects/test_app/pages/async_group/group_async.py @@ -1,9 +1,11 @@ from typing import Any import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): fail_callback = self.get_argument('fail_callback', 'false') == 'true' fail_request = self.get_argument('fail_request', 'false') == 'true' @@ -35,5 +37,6 @@ async def task() -> Any: self.json.put({'future_callback_result': result['4'].data['4']}) self.json.put({'final_callback_called': True}) + @router.post() async def post_page(self): self.json.put({self.get_argument('data'): 'yay'}) diff --git a/tests/projects/test_app/pages/async_group/group_with_futures.py b/tests/projects/test_app/pages/async_group/group_with_futures.py index 845db9278..168a87b23 100644 --- a/tests/projects/test_app/pages/async_group/group_with_futures.py +++ b/tests/projects/test_app/pages/async_group/group_with_futures.py @@ -1,10 +1,12 @@ from tornado.concurrent import Future import frontik.handler +from frontik.handler import router from frontik.util import gather_dict class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): future: Future = Future() diff --git a/tests/projects/test_app/pages/async_group/group_with_futures_async.py b/tests/projects/test_app/pages/async_group/group_with_futures_async.py index 8817c8e22..21617e8cf 100644 --- a/tests/projects/test_app/pages/async_group/group_with_futures_async.py +++ b/tests/projects/test_app/pages/async_group/group_with_futures_async.py @@ -1,9 +1,11 @@ from tornado.concurrent import Future import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): future: Future = Future() diff --git a/tests/projects/test_app/pages/async_group/not_waited_failed_requests.py b/tests/projects/test_app/pages/async_group/not_waited_failed_requests.py index 47322d784..dcbeed707 100644 --- a/tests/projects/test_app/pages/async_group/not_waited_failed_requests.py +++ b/tests/projects/test_app/pages/async_group/not_waited_failed_requests.py @@ -1,9 +1,10 @@ -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router class Page(PageHandler): data: dict = {} + @router.get() async def get_page(self): if self.request.method == 'HEAD': await self.head_page() @@ -24,12 +25,15 @@ async def get_page(self): async def head_page(self) -> None: self._record_failed_request({'head_failed': True}) + @router.post() async def post_page(self): self._record_failed_request({'post_failed': True}) + @router.put() async def put_page(self): self._record_failed_request({'put_failed': True}) + @router.delete() async def delete_page(self): self._record_failed_request({'delete_failed': True}) diff --git a/tests/projects/test_app/pages/async_group/not_waited_failed_requests_async.py b/tests/projects/test_app/pages/async_group/not_waited_failed_requests_async.py index 47322d784..dcbeed707 100644 --- a/tests/projects/test_app/pages/async_group/not_waited_failed_requests_async.py +++ b/tests/projects/test_app/pages/async_group/not_waited_failed_requests_async.py @@ -1,9 +1,10 @@ -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router class Page(PageHandler): data: dict = {} + @router.get() async def get_page(self): if self.request.method == 'HEAD': await self.head_page() @@ -24,12 +25,15 @@ async def get_page(self): async def head_page(self) -> None: self._record_failed_request({'head_failed': True}) + @router.post() async def post_page(self): self._record_failed_request({'post_failed': True}) + @router.put() async def put_page(self): self._record_failed_request({'put_failed': True}) + @router.delete() async def delete_page(self): self._record_failed_request({'delete_failed': True}) diff --git a/tests/projects/test_app/pages/async_group/not_waited_requests.py b/tests/projects/test_app/pages/async_group/not_waited_requests.py index 27b0d5cd5..aa77e5415 100644 --- a/tests/projects/test_app/pages/async_group/not_waited_requests.py +++ b/tests/projects/test_app/pages/async_group/not_waited_requests.py @@ -1,11 +1,12 @@ import asyncio -from frontik.handler import AbortAsyncGroup, PageHandler +from frontik.handler import AbortAsyncGroup, PageHandler, router class Page(PageHandler): data: dict = {} + @router.get() async def get_page(self): if not self.data: self.json.put({'get': True}) @@ -32,12 +33,15 @@ async def coro(self) -> None: except AbortAsyncGroup: self.record_request({'delete_cancelled': True}) + @router.post() async def post_page(self): self.record_request({'post_made': True}) + @router.put() async def put_page(self): self.record_request({'put_made': True}) + @router.delete() async def delete_page(self): self.record_request({'delete_made': True}) diff --git a/tests/projects/test_app/pages/async_group/not_waited_requests_async.py b/tests/projects/test_app/pages/async_group/not_waited_requests_async.py index 7dd408e1d..6163284a4 100644 --- a/tests/projects/test_app/pages/async_group/not_waited_requests_async.py +++ b/tests/projects/test_app/pages/async_group/not_waited_requests_async.py @@ -1,11 +1,12 @@ import asyncio -from frontik.handler import AbortAsyncGroup, PageHandler +from frontik.handler import AbortAsyncGroup, PageHandler, router class Page(PageHandler): data: dict = {} + @router.get() async def get_page(self): if not self.data: self.json.put({'get': True}) @@ -32,12 +33,15 @@ async def coro(self) -> None: except AbortAsyncGroup: self.record_request({'delete_cancelled': True}) + @router.post() async def post_page(self): self.record_request({'post_made': True}) + @router.put() async def put_page(self): self.record_request({'put_made': True}) + @router.delete() async def delete_page(self): self.record_request({'delete_made': True}) diff --git a/tests/projects/test_app/pages/broken_workflow.py b/tests/projects/test_app/pages/broken_workflow.py index 31d4aff2b..b8abc22b9 100644 --- a/tests/projects/test_app/pages/broken_workflow.py +++ b/tests/projects/test_app/pages/broken_workflow.py @@ -1,10 +1,11 @@ from tornado.web import HTTPError -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router from frontik.util import gather_list class Page(PageHandler): + @router.get() async def get_page(self): port = int(self.get_argument('port')) diff --git a/tests/projects/test_app/pages/cdata.py b/tests/projects/test_app/pages/cdata.py index 2a901464a..744a6cc80 100644 --- a/tests/projects/test_app/pages/cdata.py +++ b/tests/projects/test_app/pages/cdata.py @@ -1,11 +1,13 @@ from lxml import etree import frontik.handler +from frontik.handler import router CDATA_XML = b']]>' class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): result = await self.post_url(self.request.host, self.request.path) @@ -15,6 +17,7 @@ async def get_page(self): self.doc.put(xpath) + @router.post() async def post_page(self): parser = etree.XMLParser(encoding='UTF-8', strip_cdata=False) root = etree.XML(CDATA_XML, parser) diff --git a/tests/projects/test_app/pages/cdata_async.py b/tests/projects/test_app/pages/cdata_async.py index 2fe279603..89dbc4e60 100644 --- a/tests/projects/test_app/pages/cdata_async.py +++ b/tests/projects/test_app/pages/cdata_async.py @@ -1,11 +1,13 @@ from lxml import etree import frontik.handler +from frontik.handler import router CDATA_XML = b']]>' class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): result = await self.post_url(self.request.host, self.request.path) self.doc.put(result.data) @@ -14,6 +16,7 @@ async def get_page(self): assert len(xpath) == 1 assert etree.tostring(xpath[0]) == CDATA_XML + @router.post() async def post_page(self): parser = etree.XMLParser(encoding='UTF-8', strip_cdata=False) root = etree.XML(CDATA_XML, parser) diff --git a/tests/projects/test_app/pages/compose_doc.py b/tests/projects/test_app/pages/compose_doc.py index 2f3c332b3..fb36532d2 100644 --- a/tests/projects/test_app/pages/compose_doc.py +++ b/tests/projects/test_app/pages/compose_doc.py @@ -3,9 +3,11 @@ import frontik.handler from frontik import media_types from frontik.doc import Doc +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): invalid_xml = self.get_argument('invalid', 'false') @@ -14,6 +16,7 @@ async def get_page(self): self.doc.put(result.to_etree_element()) self.doc.put(Doc('c')) + @router.post() async def post_page(self): invalid_xml = self.get_argument('invalid', 'false') == 'true' diff --git a/tests/projects/test_app/pages/compose_doc_async.py b/tests/projects/test_app/pages/compose_doc_async.py index d86737cb4..6e650e638 100644 --- a/tests/projects/test_app/pages/compose_doc_async.py +++ b/tests/projects/test_app/pages/compose_doc_async.py @@ -3,9 +3,11 @@ import frontik.handler from frontik import media_types from frontik.doc import Doc +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): invalid_xml = self.get_argument('invalid', 'false') @@ -13,6 +15,7 @@ async def get_page(self): self.doc.put(self.post_url(self.request.host, self.request.path, data={'invalid': invalid_xml})) self.doc.put(Doc('c')) + @router.post() async def post_page(self): invalid_xml = self.get_argument('invalid', 'false') == 'true' diff --git a/tests/projects/test_app/pages/debug.py b/tests/projects/test_app/pages/debug.py index 3f2227bbd..2089e4e14 100644 --- a/tests/projects/test_app/pages/debug.py +++ b/tests/projects/test_app/pages/debug.py @@ -1,9 +1,11 @@ from lxml.builder import E from frontik import handler, media_types +from frontik.handler import router class Page(handler.PageHandler): + @router.get() async def get_page(self): self.log.debug('debug: starting debug page') @@ -43,11 +45,13 @@ def _inner() -> None: self.log.debug('testing utf-8 text output', extra={'_text': 'some\nmultiline\nюникод\ndebug'}) self.log.debug('testing unicode text output', extra={'_text': 'some\nmultiline\nюникод\ndebug'}) + @router.post() async def post_page(self): self.log.debug('this page returns json') self.json.put({'param1': 'value', 'param2': 'тест', 'тест': 'value'}) + @router.put() async def put_page(self): content_type = self.get_argument('type') diff --git a/tests/projects/test_app/pages/error_yield.py b/tests/projects/test_app/pages/error_yield.py index 61a4ec8ed..b31f02383 100644 --- a/tests/projects/test_app/pages/error_yield.py +++ b/tests/projects/test_app/pages/error_yield.py @@ -1,4 +1,5 @@ import frontik.handler +from frontik.handler import router async def some_async_function(handler: frontik.handler.PageHandler) -> float: @@ -7,8 +8,10 @@ async def some_async_function(handler: frontik.handler.PageHandler) -> float: class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): self.finish_group.add_future(some_async_function(self)) # type: ignore + @router.post() async def post_page(self): self.text = 'result' diff --git a/tests/projects/test_app/pages/error_yield_async.py b/tests/projects/test_app/pages/error_yield_async.py index 41197ba86..cc1147cb9 100644 --- a/tests/projects/test_app/pages/error_yield_async.py +++ b/tests/projects/test_app/pages/error_yield_async.py @@ -1,10 +1,13 @@ import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): await self.post_url(self.request.host, self.request.path) return 1 / 0 + @router.post() async def post_page(self): self.text = 'result' diff --git a/tests/projects/test_app/pages/fail_fast/__init__.py b/tests/projects/test_app/pages/fail_fast/__init__.py index b1acd5ce5..eb3656a57 100644 --- a/tests/projects/test_app/pages/fail_fast/__init__.py +++ b/tests/projects/test_app/pages/fail_fast/__init__.py @@ -1,15 +1,15 @@ -from frontik.handler import HTTPErrorWithPostprocessors, PageHandler -from frontik.preprocessors import preprocessor +from fastapi import Depends + +from frontik.handler import HTTPErrorWithPostprocessors, PageHandler, get_current_handler, router from frontik.util import gather_dict -@preprocessor -def get_page_preprocessor(handler: PageHandler) -> None: +def get_page_preprocessor(handler: PageHandler = Depends(get_current_handler)) -> None: handler.json.put({'preprocessor': True}) class Page(PageHandler): - @get_page_preprocessor + @router.get(dependencies=[Depends(get_page_preprocessor)]) async def get_page(self): fail_fast = self.get_argument('fail_fast', 'false') == 'true' @@ -45,6 +45,7 @@ def get_page_fail_fast(self, failed_future): self.set_status(403) self.finish_with_postprocessors() + @router.post() async def post_page(self): if self.get_argument('fail_fast_default', 'false') == 'true': results = await gather_dict( @@ -61,11 +62,13 @@ async def post_page(self): else: self.json.put({'POST': self.get_argument('param')}) + @router.put() async def put_page(self): # Testing parse_on_error=True self.json.put({'error': 'forbidden'}) raise HTTPErrorWithPostprocessors(int(self.get_argument('code'))) + @router.delete() async def delete_page(self): # Testing invalid return values if self.get_argument('invalid_dict_value', 'false') == 'true': diff --git a/tests/projects/test_app/pages/fail_fast/fail_fast_without_done.py b/tests/projects/test_app/pages/fail_fast/fail_fast_without_done.py index 286137288..b50624dc0 100644 --- a/tests/projects/test_app/pages/fail_fast/fail_fast_without_done.py +++ b/tests/projects/test_app/pages/fail_fast/fail_fast_without_done.py @@ -1,14 +1,16 @@ from tornado.web import HTTPError -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router class Page(PageHandler): + @router.get() async def get_page(self): await self.post_url(self.request.host, self.request.path, fail_fast=True) def get_page_fail_fast(self, failed_future): raise HTTPError(401) + @router.post() async def post_page(self): raise HTTPError(403) diff --git a/tests/projects/test_app/pages/fail_fast/future.py b/tests/projects/test_app/pages/fail_fast/future.py index 96ef60f62..33d98c37b 100644 --- a/tests/projects/test_app/pages/fail_fast/future.py +++ b/tests/projects/test_app/pages/fail_fast/future.py @@ -1,11 +1,12 @@ from tornado.concurrent import Future from tornado.ioloop import IOLoop -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router from frontik.util import gather_dict class Page(PageHandler): + @router.get() async def get_page(self): fail_future = self.get_argument('fail_future', 'false') == 'true' diff --git a/tests/projects/test_app/pages/fail_fast/with_postprocessors.py b/tests/projects/test_app/pages/fail_fast/with_postprocessors.py index e321cc5a4..c8273b4ea 100644 --- a/tests/projects/test_app/pages/fail_fast/with_postprocessors.py +++ b/tests/projects/test_app/pages/fail_fast/with_postprocessors.py @@ -1,9 +1,10 @@ from tornado.web import HTTPError -from frontik.handler import HTTPErrorWithPostprocessors, PageHandler +from frontik.handler import HTTPErrorWithPostprocessors, PageHandler, router class Page(PageHandler): + @router.get() async def get_page(self): result = await self.post_url(self.request.host, self.request.path, fail_fast=True) self.json.put(result.data) @@ -12,5 +13,6 @@ def get_page_fail_fast(self, failed_future): self.json.put({'error': 'some_error'}) raise HTTPErrorWithPostprocessors() + @router.post() async def post_page(self): raise HTTPError(403) diff --git a/tests/projects/test_app/pages/finish.py b/tests/projects/test_app/pages/finish.py index ccd823dab..a8b3cd9af 100644 --- a/tests/projects/test_app/pages/finish.py +++ b/tests/projects/test_app/pages/finish.py @@ -1,9 +1,10 @@ from tornado.web import Finish -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router class Page(PageHandler): + @router.get() async def get_page(self): throw = self.get_argument('throw', 'true') == 'true' code = int(self.get_argument('code', '200')) diff --git a/tests/projects/test_app/pages/finish_204.py b/tests/projects/test_app/pages/finish_204.py index 87bc023d8..358ae2d02 100644 --- a/tests/projects/test_app/pages/finish_204.py +++ b/tests/projects/test_app/pages/finish_204.py @@ -1,7 +1,8 @@ -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router class Page(PageHandler): + @router.get() async def get_page(self): self.write('data') self.set_status(204) diff --git a/tests/projects/test_app/pages/finish_with_postprocessors.py b/tests/projects/test_app/pages/finish_with_postprocessors.py index 37e2c6dcc..54bf71e37 100644 --- a/tests/projects/test_app/pages/finish_with_postprocessors.py +++ b/tests/projects/test_app/pages/finish_with_postprocessors.py @@ -1,7 +1,7 @@ from lxml import etree from tornado.web import HTTPError -from frontik.handler import FinishWithPostprocessors, PageHandler +from frontik.handler import FinishWithPostprocessors, PageHandler, router class Page(PageHandler): @@ -13,6 +13,7 @@ def pp(handler): self.add_postprocessor(pp) + @router.get() async def get_page(self): content_type = self.get_argument('type') @@ -34,5 +35,6 @@ async def fail_request() -> None: raise FinishWithPostprocessors() + @router.post() async def post_page(self): pass diff --git a/tests/projects/test_app/pages/handler/check_finished.py b/tests/projects/test_app/pages/handler/check_finished.py index ef201953e..39afb2231 100644 --- a/tests/projects/test_app/pages/handler/check_finished.py +++ b/tests/projects/test_app/pages/handler/check_finished.py @@ -1,9 +1,11 @@ import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): result = 'Callback not called' + @router.get() async def get_page(self): # Callback must never be called def callback(): diff --git a/tests/projects/test_app/pages/handler/delete.py b/tests/projects/test_app/pages/handler/delete.py index 24bdd7601..75611916c 100644 --- a/tests/projects/test_app/pages/handler/delete.py +++ b/tests/projects/test_app/pages/handler/delete.py @@ -1,16 +1,20 @@ import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): result = await self.delete_url('http://' + self.request.host, self.request.path, data={'data': 'true'}) if not result.failed: self.json.put(result.data) + @router.post() async def post_page(self): result = await self.delete_url('http://backend', self.request.path, fail_fast=True) if not result.failed: self.json.put(result.data) + @router.delete() async def delete_page(self): self.json.put({'delete': self.get_argument('data')}) diff --git a/tests/projects/test_app/pages/handler/head.py b/tests/projects/test_app/pages/handler/head.py index c3ca72137..fb27eb603 100644 --- a/tests/projects/test_app/pages/handler/head.py +++ b/tests/projects/test_app/pages/handler/head.py @@ -1,7 +1,9 @@ import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): self.set_header('X-Foo', 'Bar') self.text = 'response body must be empty for HEAD requests' diff --git a/tests/projects/test_app/pages/handler/head_url.py b/tests/projects/test_app/pages/handler/head_url.py index 0bb927ca5..765f2fd2d 100644 --- a/tests/projects/test_app/pages/handler/head_url.py +++ b/tests/projects/test_app/pages/handler/head_url.py @@ -1,9 +1,11 @@ import http.client import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): head_result = await self.head_url(self.request.host, '/handler/head', name='head') diff --git a/tests/projects/test_app/pages/handler/json.py b/tests/projects/test_app/pages/handler/json.py index c96045732..810dc8463 100644 --- a/tests/projects/test_app/pages/handler/json.py +++ b/tests/projects/test_app/pages/handler/json.py @@ -1,12 +1,15 @@ import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): def _page_handler(self) -> None: self.text = self.get_body_argument('foo') + @router.post() async def post_page(self): return self._page_handler() + @router.put() async def put_page(self): return self._page_handler() diff --git a/tests/projects/test_app/pages/handler/json_optional_args.py b/tests/projects/test_app/pages/handler/json_optional_args.py index a0c154610..10f305866 100644 --- a/tests/projects/test_app/pages/handler/json_optional_args.py +++ b/tests/projects/test_app/pages/handler/json_optional_args.py @@ -1,12 +1,15 @@ import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): def _page_handler(self) -> None: self.text = self.get_body_argument('foo', 'baz') + @router.post() async def post_page(self): return self._page_handler() + @router.put() async def put_page(self): return self._page_handler() diff --git a/tests/projects/test_app/pages/http_client/custom_headers.py b/tests/projects/test_app/pages/http_client/custom_headers.py index 75246622d..70ce62a03 100644 --- a/tests/projects/test_app/pages/http_client/custom_headers.py +++ b/tests/projects/test_app/pages/http_client/custom_headers.py @@ -1,7 +1,8 @@ import frontik.handler - +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): result = await self.post_url(self.request.host, self.request.path) self.json.put(result.data) @@ -10,5 +11,6 @@ def modify_http_client_request(self, balanced_request): super().modify_http_client_request(balanced_request) balanced_request.headers['X-Foo'] = 'Bar' + @router.post() async def post_page(self): self.json.put(self.request.headers) diff --git a/tests/projects/test_app/pages/http_client/fibonacci.py b/tests/projects/test_app/pages/http_client/fibonacci.py index 269c0524b..14528304f 100644 --- a/tests/projects/test_app/pages/http_client/fibonacci.py +++ b/tests/projects/test_app/pages/http_client/fibonacci.py @@ -1,10 +1,11 @@ import asyncio from frontik import media_types -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router class Page(PageHandler): + @router.get() async def get_page(self): n = int(self.get_argument('n')) diff --git a/tests/projects/test_app/pages/http_client/future.py b/tests/projects/test_app/pages/http_client/future.py index af007e81b..10df492ab 100644 --- a/tests/projects/test_app/pages/http_client/future.py +++ b/tests/projects/test_app/pages/http_client/future.py @@ -1,7 +1,8 @@ import frontik.handler - +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): state = { 'second_callback_must_be_async': True, @@ -23,6 +24,7 @@ def additional_callback(future): request_future = self.post_url(self.request.host, self.request.path) self.add_future(request_future, self.finish_group.add(additional_callback)) + @router.post() async def post_page(self): self.json.put({ 'yay': 'yay' diff --git a/tests/projects/test_app/pages/http_client/long_page_request.py b/tests/projects/test_app/pages/http_client/long_page_request.py index 3fa158f5b..f1fe2c6e3 100644 --- a/tests/projects/test_app/pages/http_client/long_page_request.py +++ b/tests/projects/test_app/pages/http_client/long_page_request.py @@ -1,9 +1,10 @@ import time import frontik.handler - +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): result = await self.post_url(self.request.host, self.request.path, request_timeout=0.5) self.request_callback(result.data, result.failed) @@ -11,6 +12,7 @@ async def get_page(self): def request_callback(self, xml: str, error: bool) -> None: self.json.put({'error_received': bool(error)}) + @router.post() async def post_page(self): self.add_timeout( time.time() + 2, self.finish_group.add(self.check_finished(self.timeout_callback)) diff --git a/tests/projects/test_app/pages/http_client/parse_error.py b/tests/projects/test_app/pages/http_client/parse_error.py index c39bd12fc..826ba400f 100644 --- a/tests/projects/test_app/pages/http_client/parse_error.py +++ b/tests/projects/test_app/pages/http_client/parse_error.py @@ -1,7 +1,8 @@ import frontik.handler - +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): el_result = await self.post_url(self.request.host, self.request.path + '?mode=xml') element = el_result.data @@ -16,6 +17,7 @@ async def get_page(self): else: assert False + @router.post() async def post_page(self): if self.get_argument('mode') == "xml": self.text = '''this is broken xml''' diff --git a/tests/projects/test_app/pages/http_client/parse_response.py b/tests/projects/test_app/pages/http_client/parse_response.py index 818013074..247dfb842 100644 --- a/tests/projects/test_app/pages/http_client/parse_response.py +++ b/tests/projects/test_app/pages/http_client/parse_response.py @@ -1,9 +1,10 @@ from tornado.escape import to_unicode - +from frontik.handler import router from frontik.handler import HTTPErrorWithPostprocessors, PageHandler class Page(PageHandler): + @router.get() async def get_page(self): result = await self.post_url(self.request.host, self.request.path, parse_on_error=True) self.json.put(result.data) @@ -14,13 +15,16 @@ async def get_page(self): if not result.failed: self.json.put({'delete': to_unicode(result.data)}) + @router.post() async def post_page(self): self.json.put({'post': True}) raise HTTPErrorWithPostprocessors(400) + @router.put() async def put_page(self): self.json.put({'put': True}) raise HTTPErrorWithPostprocessors(400) + @router.delete() async def delete_page(self): self.text = 'deleted' diff --git a/tests/projects/test_app/pages/http_client/post_simple.py b/tests/projects/test_app/pages/http_client/post_simple.py index fd100462c..3d637ddc3 100644 --- a/tests/projects/test_app/pages/http_client/post_simple.py +++ b/tests/projects/test_app/pages/http_client/post_simple.py @@ -1,11 +1,14 @@ from frontik import handler, media_types +from frontik.handler import router class Page(handler.PageHandler): + @router.get() async def get_page(self): result = await self.post_url(self.request.host, self.request.path) self.text = result.data + @router.post() async def post_page(self): self.add_header('Content-Type', media_types.TEXT_PLAIN) self.text = 'post_url success' diff --git a/tests/projects/test_app/pages/http_client/post_url.py b/tests/projects/test_app/pages/http_client/post_url.py index 678cfb950..4569f0f23 100644 --- a/tests/projects/test_app/pages/http_client/post_url.py +++ b/tests/projects/test_app/pages/http_client/post_url.py @@ -3,7 +3,7 @@ import frontik.handler from frontik.util import any_to_bytes, any_to_unicode from typing import Any - +from frontik.handler import router FIELDS: dict[str, Any] = { 'fielda': 'hello', 'fieldb': '', @@ -24,11 +24,13 @@ class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): result = await self.post_url(self.request.host, self.request.path, data=FIELDS, files=FILES) if not result.failed: self.json.put(result.data) + @router.post() async def post_page(self): errors_count = 0 body_parts = self.request.body.split(b'\r\n--') diff --git a/tests/projects/test_app/pages/http_client/proxy_code.py b/tests/projects/test_app/pages/http_client/proxy_code.py index c7911bb42..de98f9c65 100644 --- a/tests/projects/test_app/pages/http_client/proxy_code.py +++ b/tests/projects/test_app/pages/http_client/proxy_code.py @@ -1,7 +1,8 @@ import frontik.handler - +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): result = await self.get_url('http://127.0.0.1:' + self.get_argument('port'), '') self.finish(str(result.status_code)) diff --git a/tests/projects/test_app/pages/http_client/raise_error.py b/tests/projects/test_app/pages/http_client/raise_error.py index 9263524ad..46fa9c87c 100644 --- a/tests/projects/test_app/pages/http_client/raise_error.py +++ b/tests/projects/test_app/pages/http_client/raise_error.py @@ -1,7 +1,9 @@ import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): await self.post_url(self.request.host, '/a-вот') diff --git a/tests/projects/test_app/pages/http_error.py b/tests/projects/test_app/pages/http_error.py index f054a2a1b..b1e946acc 100644 --- a/tests/projects/test_app/pages/http_error.py +++ b/tests/projects/test_app/pages/http_error.py @@ -1,9 +1,10 @@ from tornado.web import HTTPError -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router class Page(PageHandler): + @router.get() async def get_page(self): code = int(self.get_argument('code', '200')) raise HTTPError(code) diff --git a/tests/projects/test_app/pages/include_xml.py b/tests/projects/test_app/pages/include_xml.py index af33472ed..a1e3f8797 100644 --- a/tests/projects/test_app/pages/include_xml.py +++ b/tests/projects/test_app/pages/include_xml.py @@ -1,6 +1,8 @@ import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): self.doc.put(self.xml_from_file('aaa.xml')) diff --git a/tests/projects/test_app/pages/include_xml_async.py b/tests/projects/test_app/pages/include_xml_async.py index af33472ed..a1e3f8797 100644 --- a/tests/projects/test_app/pages/include_xml_async.py +++ b/tests/projects/test_app/pages/include_xml_async.py @@ -1,6 +1,8 @@ import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): self.doc.put(self.xml_from_file('aaa.xml')) diff --git a/tests/projects/test_app/pages/json_page.py b/tests/projects/test_app/pages/json_page.py index f73fec83f..36ce59e33 100644 --- a/tests/projects/test_app/pages/json_page.py +++ b/tests/projects/test_app/pages/json_page.py @@ -1,4 +1,5 @@ from frontik import handler, media_types +from frontik.handler import router from frontik.util import gather_dict @@ -16,6 +17,7 @@ def jinja_context_provider(handler): super().prepare() + @router.get() async def get_page(self): invalid_json = self.get_argument('invalid', 'false') @@ -31,6 +33,7 @@ async def get_page(self): self.set_template(self.get_argument('template', 'jinja.html')) self.json.put(data) + @router.post() async def post_page(self): invalid_json = self.get_argument('invalid', 'false') == 'true' diff --git a/tests/projects/test_app/pages/kafka.py b/tests/projects/test_app/pages/kafka.py index ab5e57953..182386213 100644 --- a/tests/projects/test_app/pages/kafka.py +++ b/tests/projects/test_app/pages/kafka.py @@ -1,9 +1,10 @@ import asyncio -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router class Page(PageHandler): + @router.get() async def get_page(self): request_engine_builder = self.application.http_client_factory.request_engine_builder request_engine_builder.kafka_producer.enable_for_request_id(self.request_id) @@ -13,5 +14,6 @@ async def get_page(self): self.json.put(*request_engine_builder.kafka_producer.disable_and_get_data()) + @router.post() async def post_page(self): self.set_status(500) diff --git a/tests/projects/test_app/pages/log.py b/tests/projects/test_app/pages/log.py index 5d54d071a..46ffcd125 100644 --- a/tests/projects/test_app/pages/log.py +++ b/tests/projects/test_app/pages/log.py @@ -1,11 +1,13 @@ import logging import frontik.handler +from frontik.handler import router custom_logger = logging.getLogger('custom_logger') class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): self.log.debug('debug') self.log.info('info') diff --git a/tests/projects/test_app/pages/mandatory_headers.py b/tests/projects/test_app/pages/mandatory_headers.py index fed9a3177..c934de0e2 100644 --- a/tests/projects/test_app/pages/mandatory_headers.py +++ b/tests/projects/test_app/pages/mandatory_headers.py @@ -1,9 +1,10 @@ from tornado.web import HTTPError -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router class Page(PageHandler): + @router.get() async def get_page(self): if self.get_argument('test_mandatory_headers', None) is not None: self.set_mandatory_header('TEST_HEADER', 'TEST_HEADER_VALUE') diff --git a/tests/projects/test_app/pages/nested/nested/nested.py b/tests/projects/test_app/pages/nested/nested/nested.py index 56857cdbb..8b5c282bb 100644 --- a/tests/projects/test_app/pages/nested/nested/nested.py +++ b/tests/projects/test_app/pages/nested/nested/nested.py @@ -1,6 +1,8 @@ import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): self.text = 'OK' diff --git a/tests/projects/test_app/pages/postprocess.py b/tests/projects/test_app/pages/postprocess.py index a42827223..e239a70a0 100644 --- a/tests/projects/test_app/pages/postprocess.py +++ b/tests/projects/test_app/pages/postprocess.py @@ -1,6 +1,6 @@ from tornado.web import HTTPError -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router class ContentPostprocessor: @@ -9,6 +9,7 @@ def postprocessor(self, handler, tpl, meta_info): class Page(PageHandler): + @router.get() async def get_page(self): if self.get_argument('raise_error', None) is not None: self.add_postprocessor(self._pp_1) diff --git a/tests/projects/test_app/pages/postprocess_xsl.py b/tests/projects/test_app/pages/postprocess_xsl.py index cf382db79..1e493387b 100644 --- a/tests/projects/test_app/pages/postprocess_xsl.py +++ b/tests/projects/test_app/pages/postprocess_xsl.py @@ -1,6 +1,6 @@ from lxml import etree -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router class Page(PageHandler): @@ -8,6 +8,7 @@ class Page(PageHandler): def extract_metainfo_pp(handler, _, meta_info): return ','.join(meta_info) + @router.get() async def get_page(self): self.set_xsl('meta.xsl') self.doc.put(etree.Element('ok', key=self.get_argument('meta_key', ''))) diff --git a/tests/projects/test_app/pages/proxy_code.py b/tests/projects/test_app/pages/proxy_code.py index c4d78b517..3776829a2 100644 --- a/tests/projects/test_app/pages/proxy_code.py +++ b/tests/projects/test_app/pages/proxy_code.py @@ -1,7 +1,9 @@ import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): result = await self.get_url('http://127.0.0.1:' + self.get_argument('port'), '', request_timeout=0.1) diff --git a/tests/projects/test_app/pages/request_context.py b/tests/projects/test_app/pages/request_context.py index a3101d8a0..7068397c9 100644 --- a/tests/projects/test_app/pages/request_context.py +++ b/tests/projects/test_app/pages/request_context.py @@ -3,7 +3,7 @@ from functools import partial from frontik import request_context -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router def _callback(name, handler, *args): @@ -11,6 +11,7 @@ def _callback(name, handler, *args): class Page(PageHandler): + @router.get() async def get_page(self): def _waited_callback(name: str) -> Callable: return self.finish_group.add(partial(_callback, name, self)) @@ -33,6 +34,7 @@ async def run_coroutine(self) -> None: self.json.put({'coroutine_after_yield': request_context.get_handler_name()}) + @router.post() async def post_page(self): pass diff --git a/tests/projects/test_app/pages/sentry_error.py b/tests/projects/test_app/pages/sentry_error.py index f3208ebcb..d0267fc3b 100644 --- a/tests/projects/test_app/pages/sentry_error.py +++ b/tests/projects/test_app/pages/sentry_error.py @@ -4,10 +4,11 @@ from tornado.ioloop import IOLoop from tornado.web import HTTPError -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router class Page(PageHandler): + @router.get() async def get_page(self): ip = self.get_argument('ip', None) extra = self.get_argument('extra_key', None) @@ -18,9 +19,11 @@ async def get_page(self): msg = 'My_sentry_exception' raise Exception(msg) + @router.post() async def post_page(self): raise HTTPError(500, 'my_HTTPError') + @router.put() async def put_page(self): sentry_sdk.set_extra('extra_key', 'extra_value') sentry_sdk.capture_message('sentry_message') diff --git a/tests/projects/test_app/pages/simple_xml.py b/tests/projects/test_app/pages/simple_xml.py index 5d62b9e22..631511ea4 100644 --- a/tests/projects/test_app/pages/simple_xml.py +++ b/tests/projects/test_app/pages/simple_xml.py @@ -2,9 +2,11 @@ import frontik.doc import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): self.doc.put(frontik.doc.Doc()) self.doc.put(etree.Element('element', name='Test element')) diff --git a/tests/projects/test_app/pages/simple_xml_async.py b/tests/projects/test_app/pages/simple_xml_async.py index 5d62b9e22..631511ea4 100644 --- a/tests/projects/test_app/pages/simple_xml_async.py +++ b/tests/projects/test_app/pages/simple_xml_async.py @@ -2,9 +2,11 @@ import frontik.doc import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): self.doc.put(frontik.doc.Doc()) self.doc.put(etree.Element('element', name='Test element')) diff --git a/tests/projects/test_app/pages/statsd.py b/tests/projects/test_app/pages/statsd.py index c9964075e..04a5eb700 100644 --- a/tests/projects/test_app/pages/statsd.py +++ b/tests/projects/test_app/pages/statsd.py @@ -1,7 +1,8 @@ -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router class Page(PageHandler): + @router.get() async def get_page(self): self.statsd_client.count('count_metric', 10, tag1='tag1', tag2='tag2') self.statsd_client.gauge('gauge_metric', 100, tag='tag3') diff --git a/tests/projects/test_app/pages/test_exception_json.py b/tests/projects/test_app/pages/test_exception_json.py index 74c4d3a29..038314c67 100644 --- a/tests/projects/test_app/pages/test_exception_json.py +++ b/tests/projects/test_app/pages/test_exception_json.py @@ -1,7 +1,8 @@ -from frontik.handler import HTTPErrorWithPostprocessors, PageHandler +from frontik.handler import HTTPErrorWithPostprocessors, PageHandler, router class Page(PageHandler): + @router.get() async def get_page(self): self.json.put({'reason': 'bad argument'}) raise HTTPErrorWithPostprocessors(400) diff --git a/tests/projects/test_app/pages/test_exception_text.py b/tests/projects/test_app/pages/test_exception_text.py index fa44f093e..b0b7ece9f 100644 --- a/tests/projects/test_app/pages/test_exception_text.py +++ b/tests/projects/test_app/pages/test_exception_text.py @@ -1,8 +1,9 @@ -from frontik.handler import HTTPErrorWithPostprocessors, PageHandler +from frontik.handler import HTTPErrorWithPostprocessors, PageHandler, router from frontik.util import gather_list class Page(PageHandler): + @router.get() async def get_page(self): async def bad_post_requests() -> None: results = await gather_list( diff --git a/tests/projects/test_app/pages/validate_arguments.py b/tests/projects/test_app/pages/validate_arguments.py index 49057a478..685d88f93 100644 --- a/tests/projects/test_app/pages/validate_arguments.py +++ b/tests/projects/test_app/pages/validate_arguments.py @@ -2,7 +2,7 @@ from pydantic import field_validator -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router from frontik.validator import BaseValidationModel, Validators @@ -17,6 +17,7 @@ def check_string(cls, value): class Page(PageHandler): + @router.get() async def get_page(self): is_custom_model = self.get_bool_argument('model', False) empty_default_str = self.get_str_argument('str_arg_with_default', 'default') @@ -42,6 +43,7 @@ async def get_page(self): }, ) + @router.post() async def post_page(self): str_body_arg = self.get_str_argument('str_argument', 'default', from_body=True) int_body_arg = self.get_int_argument('int_argument', 0, from_body=True) @@ -53,5 +55,6 @@ async def post_page(self): }, ) + @router.put() async def put_page(self): self.get_str_argument('str_arg', 3) diff --git a/tests/projects/test_app/pages/write_after_finish.py b/tests/projects/test_app/pages/write_after_finish.py index 50b2d0138..dd83852ee 100644 --- a/tests/projects/test_app/pages/write_after_finish.py +++ b/tests/projects/test_app/pages/write_after_finish.py @@ -1,6 +1,6 @@ import asyncio -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router class Page(PageHandler): @@ -23,10 +23,12 @@ async def _pp(cls, handler): await asyncio.sleep(0.1) handler.json.put({'postprocessor_completed': True}) + @router.get() async def get_page(self): await self.post_url(self.request.host, self.request.uri) # type: ignore # test that postprocessors are scheduled only once self.finish_with_postprocessors() + @router.post() async def post_page(self): self.json.put({'counter': self.counter_static}) diff --git a/tests/projects/test_app/pages/write_error.py b/tests/projects/test_app/pages/write_error.py index 98eda0305..e0638d03f 100644 --- a/tests/projects/test_app/pages/write_error.py +++ b/tests/projects/test_app/pages/write_error.py @@ -1,7 +1,9 @@ import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): msg = 'exception in handler' raise Exception(msg) diff --git a/tests/projects/test_app/pages/xsl/apply_error.py b/tests/projects/test_app/pages/xsl/apply_error.py index c864b0b68..1d477ba30 100644 --- a/tests/projects/test_app/pages/xsl/apply_error.py +++ b/tests/projects/test_app/pages/xsl/apply_error.py @@ -1,9 +1,11 @@ from lxml import etree import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): self.set_xsl('apply_error.xsl') self.doc.put(etree.Element('ok')) diff --git a/tests/projects/test_app/pages/xsl/apply_error_async.py b/tests/projects/test_app/pages/xsl/apply_error_async.py index c864b0b68..1d477ba30 100644 --- a/tests/projects/test_app/pages/xsl/apply_error_async.py +++ b/tests/projects/test_app/pages/xsl/apply_error_async.py @@ -1,9 +1,11 @@ from lxml import etree import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): self.set_xsl('apply_error.xsl') self.doc.put(etree.Element('ok')) diff --git a/tests/projects/test_app/pages/xsl/parse_error.py b/tests/projects/test_app/pages/xsl/parse_error.py index 64515bdd1..ec8358fa4 100644 --- a/tests/projects/test_app/pages/xsl/parse_error.py +++ b/tests/projects/test_app/pages/xsl/parse_error.py @@ -1,9 +1,11 @@ from lxml import etree import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): self.set_xsl('parse_error.xsl') self.doc.put(etree.Element('ok')) diff --git a/tests/projects/test_app/pages/xsl/parse_error_async.py b/tests/projects/test_app/pages/xsl/parse_error_async.py index 64515bdd1..ec8358fa4 100644 --- a/tests/projects/test_app/pages/xsl/parse_error_async.py +++ b/tests/projects/test_app/pages/xsl/parse_error_async.py @@ -1,9 +1,11 @@ from lxml import etree import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): self.set_xsl('parse_error.xsl') self.doc.put(etree.Element('ok')) diff --git a/tests/projects/test_app/pages/xsl/simple.py b/tests/projects/test_app/pages/xsl/simple.py index a344bda8c..87b88eb2d 100644 --- a/tests/projects/test_app/pages/xsl/simple.py +++ b/tests/projects/test_app/pages/xsl/simple.py @@ -1,9 +1,10 @@ from lxml import etree -from frontik.handler import HTTPErrorWithPostprocessors, PageHandler +from frontik.handler import HTTPErrorWithPostprocessors, PageHandler, router class Page(PageHandler): + @router.get() async def get_page(self): self.set_xsl(self.get_argument('template', 'simple.xsl')) self.doc.put(etree.Element('ok')) diff --git a/tests/projects/test_app/pages/xsl/simple_async.py b/tests/projects/test_app/pages/xsl/simple_async.py index a344bda8c..87b88eb2d 100644 --- a/tests/projects/test_app/pages/xsl/simple_async.py +++ b/tests/projects/test_app/pages/xsl/simple_async.py @@ -1,9 +1,10 @@ from lxml import etree -from frontik.handler import HTTPErrorWithPostprocessors, PageHandler +from frontik.handler import HTTPErrorWithPostprocessors, PageHandler, router class Page(PageHandler): + @router.get() async def get_page(self): self.set_xsl(self.get_argument('template', 'simple.xsl')) self.doc.put(etree.Element('ok')) diff --git a/tests/projects/test_app/pages/xsl/syntax_error.py b/tests/projects/test_app/pages/xsl/syntax_error.py index 20c24ed93..631893cb0 100644 --- a/tests/projects/test_app/pages/xsl/syntax_error.py +++ b/tests/projects/test_app/pages/xsl/syntax_error.py @@ -1,9 +1,11 @@ from lxml import etree import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): self.set_xsl('syntax_error.xsl') self.doc.put(etree.Element('ok')) diff --git a/tests/projects/test_app/pages/xsl/syntax_error_async.py b/tests/projects/test_app/pages/xsl/syntax_error_async.py index 20c24ed93..631893cb0 100644 --- a/tests/projects/test_app/pages/xsl/syntax_error_async.py +++ b/tests/projects/test_app/pages/xsl/syntax_error_async.py @@ -1,9 +1,11 @@ from lxml import etree import frontik.handler +from frontik.handler import router class Page(frontik.handler.PageHandler): + @router.get() async def get_page(self): self.set_xsl('syntax_error.xsl') self.doc.put(etree.Element('ok')) diff --git a/tests/test_dependencies.py b/tests/test_dependencies.py deleted file mode 100644 index 0b8c2083a..000000000 --- a/tests/test_dependencies.py +++ /dev/null @@ -1,208 +0,0 @@ -import asyncio -from collections.abc import Callable - -import pytest - -from frontik.dependency_manager import ( - async_dependencies, - build_and_run_sub_graph, - dependency, - execute_page_method_with_dependencies, -) -from frontik.handler import PageHandler - - -class BaseTestHandler(PageHandler): - _priority_dependency_names: list[str] = [] - x = '0' - - def __init__(self) -> None: - self.finished = False - - def is_finished(self): - return self.finished - - -DEP_LOG = [] - - -async def get_session(handler: BaseTestHandler) -> str: - DEP_LOG.append('get_session') - await asyncio.sleep(0.1) - return 'session' + handler.x - - -def check_session(handler: BaseTestHandler, _session: str = dependency(get_session)) -> str: - DEP_LOG.append('check_session') - return 'check' + handler.x - - -async def get_some_data(handler: BaseTestHandler) -> str: - DEP_LOG.append('get_some_data') - await asyncio.sleep(0.1) - return 'data' + handler.x - - -def dep_factory(closure_param: int) -> Callable: - def internal_dep() -> int: - DEP_LOG.append(f'internal_dep_{closure_param}') - return closure_param - - return internal_dep - - -def dep_group( - data: int = dependency(dep_factory(2)), - _: str = dependency(check_session), - __: str = dependency(get_some_data), -) -> int: - DEP_LOG.append('dep_group') - return data - - -async def exception_dep() -> None: - DEP_LOG.append('exception_dep') - msg = 'stub_error' - raise ArithmeticError(msg) - - -async def finisher_dep(handler: BaseTestHandler) -> None: - DEP_LOG.append('finisher_dep') - handler.finished = True - - -async def dep_with_subgraph(handler: BaseTestHandler) -> None: - await build_and_run_sub_graph(handler, [finisher_dep]) - - -class SimpleHandler(BaseTestHandler): - x = '1' - - async def get_page( - self, - session=dependency(get_session), - check=dependency(check_session), - data=dependency(get_some_data), - ): - DEP_LOG.append('get_page') - return f'{session}_{check}_{data}' - - async def post_page(self, group=dependency(dep_group), data=dependency(dep_factory(1))): - DEP_LOG.append('post_page') - return f'{group}_{data}' - - async def put_page(self, data1=dependency(dep_factory(1)), data2=dependency(dep_factory(2))): - DEP_LOG.append('put_page') - return f'{data1}_{data2}' - - -class PriorityHandler(BaseTestHandler): - _priority_dependency_names: list[str] = [ - 'tests.test_dependencies.internal_dep', - 'tests.test_dependencies.get_some_data', - 'tests.test_dependencies.finisher_dep', - ] - - async def get_page( - self, - session=dependency(get_session), - check=dependency(check_session), - data=dependency(get_some_data), - ): - DEP_LOG.append('get_page') - return f'{session}_{check}_{data}' - - async def post_page(self, _=dependency(exception_dep)): - pass - - async def put_page(self, group=dependency(dep_group), data=dependency(dep_factory(1)), _=dependency(finisher_dep)): - DEP_LOG.append('put_page') - return f'{group}_{data}' - - -class SubGraphHandler(BaseTestHandler): - dependencies = [dep_factory(1)] - _priority_dependency_names: list[str] = [ - 'tests.test_dependencies.internal_dep', - 'tests.test_dependencies.get_some_data', - 'tests.test_dependencies.finisher_dep', - ] - - async def get_page(self, data=dependency(get_some_data)): - await build_and_run_sub_graph(self, [check_session]) - return data - - async def post_page(self, data1=dependency(dep_group), data2=dependency(dep_with_subgraph)): - return f'{data1}_{data2}' - - -class AsyncDependencyHandler(BaseTestHandler): - @async_dependencies([check_session]) - async def get_page(self): - DEP_LOG.append('get_page') - - -class TestDependencies: - @staticmethod - def setup_method(): - DEP_LOG.clear() - - async def test_simple_dependencies(self): - handler = SimpleHandler() - res = await asyncio.wait_for(execute_page_method_with_dependencies(handler, handler.get_page), timeout=0.15) - assert len(DEP_LOG) == 4 - assert DEP_LOG.index('check_session') > DEP_LOG.index('get_session') - assert res == 'session1_check1_data1' - - async def test_dep_group(self): - handler = SimpleHandler() - res = await asyncio.wait_for(execute_page_method_with_dependencies(handler, handler.post_page), timeout=0.15) - assert len(DEP_LOG) == 6 - assert DEP_LOG.index('check_session') > DEP_LOG.index('get_session') - assert res == '1_1' - - async def test_dep_conflict(self): - handler = SimpleHandler() - with pytest.raises(ValueError, match=r'Dependency conflict .*'): - await execute_page_method_with_dependencies(handler, handler.put_page) - assert len(DEP_LOG) == 0 - - async def test_deps_with_priority(self): - handler = PriorityHandler() - res = await execute_page_method_with_dependencies(handler, handler.get_page) - assert len(DEP_LOG) == 4 - assert DEP_LOG[0] == 'get_some_data' - assert 'internal_dep' not in DEP_LOG - assert DEP_LOG.index('check_session') > DEP_LOG.index('get_session') - assert res == 'session0_check0_data0' - - async def test_exception_in_dep(self): - handler = PriorityHandler() - with pytest.raises(ArithmeticError, match=r'stub_error'): - await execute_page_method_with_dependencies(handler, handler.post_page) - - async def test_dep_with_finisher(self): - handler = PriorityHandler() - res = await execute_page_method_with_dependencies(handler, handler.put_page) - assert len(DEP_LOG) == 3 - assert DEP_LOG[0] == 'internal_dep_1' - assert DEP_LOG[1] == 'get_some_data' - assert DEP_LOG[2] == 'finisher_dep' - assert res is None - - async def test_subgraph_in_page(self): - handler = SubGraphHandler() - res = await execute_page_method_with_dependencies(handler, handler.get_page) - assert DEP_LOG == ['internal_dep_1', 'get_some_data', 'get_session', 'check_session'] - assert res == 'data0' - - async def test_subgraph_in_dep(self): - handler = SubGraphHandler() - res = await execute_page_method_with_dependencies(handler, handler.post_page) - assert DEP_LOG == ['internal_dep_1', 'get_some_data', 'get_session', 'finisher_dep'] - assert res is None - - async def test_async_deps(self): - handler = AsyncDependencyHandler() - await execute_page_method_with_dependencies(handler, handler.get_page) - assert DEP_LOG == ['get_page', 'get_session', 'check_session'] diff --git a/tests/test_frontik_testing.py b/tests/test_frontik_testing.py index 1fc200b34..cdfdba4e5 100644 --- a/tests/test_frontik_testing.py +++ b/tests/test_frontik_testing.py @@ -5,7 +5,7 @@ from tornado.ioloop import IOLoop from frontik.app import FrontikApplication -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router from frontik.options import options from frontik.testing import FrontikTestBase, FrontikTestCase from frontik.util import gather_list @@ -14,6 +14,7 @@ class AsyncHandler(PageHandler): + @router.get() async def get_page(self): self.result = 0 service_host = self.config.serviceHost # type: ignore @@ -29,6 +30,7 @@ async def get_page(self): class CheckConfigHandler(PageHandler): + @router.get() async def get_page(self): self.text = self.config.config_param # type: ignore diff --git a/tests/test_handler_returned_value_processing.py b/tests/test_handler_returned_value_processing.py index 773c3c3fc..a08a250d1 100644 --- a/tests/test_handler_returned_value_processing.py +++ b/tests/test_handler_returned_value_processing.py @@ -4,7 +4,7 @@ from pydantic import BaseModel from frontik.app import FrontikApplication -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router from frontik.testing import FrontikTestBase from tests import FRONTIK_ROOT @@ -16,16 +16,19 @@ class _PydanticModel(BaseModel): class ReturnPydanticModelHandler(PageHandler): + @router.get() async def get_page(self) -> _PydanticModel: return _PydanticModel(int_field=1, bool_field=True, str_field='Ну привет') class ReturnDictHandler(PageHandler): + @router.get() async def get_page(self) -> dict: return {'is_dict': True, 'msg': 'Ну привет'} class ReturnSelfJsonPutHandler(PageHandler): + @router.get() async def get_page(self) -> dict: self.json.put({'a': 'b'}) return self.json.put({'c': 'd'}) # type: ignore[func-returns-value] diff --git a/tests/test_preprocessors.py b/tests/test_preprocessors.py deleted file mode 100644 index e22979da1..000000000 --- a/tests/test_preprocessors.py +++ /dev/null @@ -1,198 +0,0 @@ -import asyncio -from collections.abc import Callable - -import pytest - -from frontik.dependency_manager import build_and_run_sub_graph, dependency, execute_page_method_with_dependencies -from frontik.handler import PageHandler -from frontik.preprocessors import preprocessor - - -class BaseTestHandler(PageHandler): - _priority_dependency_names: list[str] = [] - x = '0' - - def __init__(self) -> None: - self.finished = False - - def is_finished(self): - return self.finished - - -DEP_LOG = [] - - -@preprocessor -async def get_session(handler: BaseTestHandler) -> None: - DEP_LOG.append('get_session') - await asyncio.sleep(0.1) - handler.session = 'session' + handler.x # type: ignore - - -@preprocessor -def check_session(handler: BaseTestHandler, _session: None = dependency(get_session)) -> None: - DEP_LOG.append('check_session') - handler.check = 'check' + handler.x # type: ignore - - -@preprocessor -async def get_some_data(handler: BaseTestHandler) -> None: - DEP_LOG.append('get_some_data') - await asyncio.sleep(0.1) - handler.data = 'data' + handler.x # type: ignore - - -def dep_factory(closure_param: int) -> Callable: - @preprocessor - def internal_dep(handler: BaseTestHandler) -> None: - DEP_LOG.append(f'internal_dep_{closure_param}') - handler.closure_param = closure_param # type: ignore - - return internal_dep - - -def dep_group() -> Callable: - def _dep_group(_=dependency(dep_factory(2), check_session, get_some_data)): - DEP_LOG.append('dep_group') - - return preprocessor(_dep_group) - - -@preprocessor -async def exception_dep() -> None: - DEP_LOG.append('exception_dep') - msg = 'stub_error' - raise ArithmeticError(msg) - - -@preprocessor -async def finisher_dep(handler: BaseTestHandler) -> None: - DEP_LOG.append('finisher_dep') - handler.finished = True - - -@preprocessor -async def dep_with_subgraph(handler: BaseTestHandler) -> None: - await build_and_run_sub_graph(handler, [finisher_dep]) - - -class SimpleHandler(BaseTestHandler): - x = '1' - - async def get_page( - self, - session=dependency(get_session), - check=dependency(check_session), - data=dependency(get_some_data), - ): - DEP_LOG.append('get_page') - return f'{self.session}_{self.check}_{self.data}' # type: ignore - - @dep_factory(1) - @dep_group() - async def post_page(self): - DEP_LOG.append('post_page') - return f'{self.session}_{self.check}_{self.data}' # type: ignore - - @dep_factory(1) - async def put_page(self, _data=dependency(dep_factory(2))): - DEP_LOG.append('put_page') - - -class PriorityHandler(BaseTestHandler): - _priority_dependency_names: list[str] = [ - 'tests.test_preprocessors.internal_dep', - 'tests.test_preprocessors.get_some_data', - 'tests.test_preprocessors.finisher_dep', - ] - - @get_session - @check_session - @get_some_data - async def get_page(self): - DEP_LOG.append('get_page') - return f'{self.session}_{self.check}_{self.data}' # type: ignore - - @exception_dep - async def post_page(self): - pass - - @dep_group() - @dep_factory(1) - async def put_page(self, _=dependency(finisher_dep)): - DEP_LOG.append('put_page') - return f'{self.data}' # type: ignore - - -class SubGraphHandler(BaseTestHandler): - dependencies = [dep_factory(1)] - _priority_dependency_names: list[str] = [ - 'tests.test_preprocessors.internal_dep', - 'tests.test_preprocessors.get_some_data', - 'tests.test_preprocessors.finisher_dep', - ] - - async def get_page(self, data=dependency(get_some_data)): - await build_and_run_sub_graph(self, [check_session]) - return data - - async def post_page(self, data1=dependency(dep_group), data2=dependency(dep_with_subgraph)): - return f'{data1}_{data2}' - - -class TestPreprocessors: - @staticmethod - def setup_method(): - DEP_LOG.clear() - - async def test_simple_dependencies(self): - handler = SimpleHandler() - res = await asyncio.wait_for(execute_page_method_with_dependencies(handler, handler.get_page), timeout=0.15) - assert len(DEP_LOG) == 4 - assert DEP_LOG.index('check_session') > DEP_LOG.index('get_session') - assert res == 'session1_check1_data1' - - async def test_dep_group(self): - handler = SimpleHandler() - res = await asyncio.wait_for(execute_page_method_with_dependencies(handler, handler.post_page), timeout=0.15) - assert len(DEP_LOG) == 6 - assert DEP_LOG.index('check_session') > DEP_LOG.index('get_session') - assert res == 'session1_check1_data1' - - async def test_dep_conflict(self): - handler = SimpleHandler() - with pytest.raises(ValueError, match=r'Dependency conflict .*'): - await execute_page_method_with_dependencies(handler, handler.put_page) - assert len(DEP_LOG) == 0 - - async def test_deps_with_priority(self): - handler = PriorityHandler() - res = await execute_page_method_with_dependencies(handler, handler.get_page) - assert len(DEP_LOG) == 4 - assert DEP_LOG[0] == 'get_some_data' - assert 'internal_dep' not in DEP_LOG - assert DEP_LOG.index('check_session') > DEP_LOG.index('get_session') - assert res == 'session0_check0_data0' - - async def test_exception_in_dep(self): - handler = PriorityHandler() - with pytest.raises(ArithmeticError, match=r'stub_error'): - await execute_page_method_with_dependencies(handler, handler.post_page) - - async def test_dep_with_finisher(self): - handler = PriorityHandler() - res = await execute_page_method_with_dependencies(handler, handler.put_page) - assert DEP_LOG == ['internal_dep_1', 'get_some_data', 'finisher_dep'] - assert res is None - - async def test_subgraph_in_page(self): - handler = SubGraphHandler() - res = await execute_page_method_with_dependencies(handler, handler.get_page) - assert ['internal_dep_1', 'get_some_data', 'get_session', 'check_session'] == DEP_LOG - assert res is None - - async def test_subgraph_in_dep(self): - handler = SubGraphHandler() - res = await execute_page_method_with_dependencies(handler, handler.post_page) - assert DEP_LOG == ['internal_dep_1', 'finisher_dep'] - assert res is None diff --git a/tests/test_telemetry.py b/tests/test_telemetry.py index 6c50e4aa1..43fd1a96f 100644 --- a/tests/test_telemetry.py +++ b/tests/test_telemetry.py @@ -14,7 +14,7 @@ from frontik import request_context from frontik.app import FrontikApplication -from frontik.handler import PageHandler +from frontik.handler import PageHandler, router from frontik.integrations.telemetry import FrontikIdGenerator, get_netloc from frontik.options import options from frontik.testing import FrontikTestCase @@ -76,12 +76,14 @@ def test_get_netloc(self) -> None: class PageA(PageHandler): + @router.get() async def get_page(self): res = await self.get_url(self.request.host, '/page_b') self.json.put(res) class PageB(PageHandler): + @router.get() async def get_page(self): self.json.put({})