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({})