prefect-client 2.19.3__py3-none-any.whl → 3.0.0rc1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (239) hide show
  1. prefect/__init__.py +8 -56
  2. prefect/_internal/compatibility/deprecated.py +6 -115
  3. prefect/_internal/compatibility/experimental.py +4 -79
  4. prefect/_internal/concurrency/api.py +0 -34
  5. prefect/_internal/concurrency/calls.py +0 -6
  6. prefect/_internal/concurrency/cancellation.py +0 -3
  7. prefect/_internal/concurrency/event_loop.py +0 -20
  8. prefect/_internal/concurrency/inspection.py +3 -3
  9. prefect/_internal/concurrency/threads.py +35 -0
  10. prefect/_internal/concurrency/waiters.py +0 -28
  11. prefect/_internal/pydantic/__init__.py +0 -45
  12. prefect/_internal/pydantic/v1_schema.py +21 -22
  13. prefect/_internal/pydantic/v2_schema.py +0 -2
  14. prefect/_internal/pydantic/v2_validated_func.py +18 -23
  15. prefect/_internal/schemas/bases.py +44 -177
  16. prefect/_internal/schemas/fields.py +1 -43
  17. prefect/_internal/schemas/validators.py +60 -158
  18. prefect/artifacts.py +161 -14
  19. prefect/automations.py +39 -4
  20. prefect/blocks/abstract.py +1 -1
  21. prefect/blocks/core.py +268 -148
  22. prefect/blocks/fields.py +2 -57
  23. prefect/blocks/kubernetes.py +8 -12
  24. prefect/blocks/notifications.py +40 -20
  25. prefect/blocks/system.py +22 -11
  26. prefect/blocks/webhook.py +2 -9
  27. prefect/client/base.py +4 -4
  28. prefect/client/cloud.py +8 -13
  29. prefect/client/orchestration.py +347 -341
  30. prefect/client/schemas/actions.py +92 -86
  31. prefect/client/schemas/filters.py +20 -40
  32. prefect/client/schemas/objects.py +147 -145
  33. prefect/client/schemas/responses.py +16 -24
  34. prefect/client/schemas/schedules.py +47 -35
  35. prefect/client/subscriptions.py +2 -2
  36. prefect/client/utilities.py +5 -2
  37. prefect/concurrency/asyncio.py +3 -1
  38. prefect/concurrency/events.py +1 -1
  39. prefect/concurrency/services.py +6 -3
  40. prefect/context.py +195 -27
  41. prefect/deployments/__init__.py +5 -6
  42. prefect/deployments/base.py +7 -5
  43. prefect/deployments/flow_runs.py +185 -0
  44. prefect/deployments/runner.py +50 -45
  45. prefect/deployments/schedules.py +28 -23
  46. prefect/deployments/steps/__init__.py +0 -1
  47. prefect/deployments/steps/core.py +1 -0
  48. prefect/deployments/steps/pull.py +7 -21
  49. prefect/engine.py +12 -2422
  50. prefect/events/actions.py +17 -23
  51. prefect/events/cli/automations.py +19 -6
  52. prefect/events/clients.py +14 -37
  53. prefect/events/filters.py +14 -18
  54. prefect/events/related.py +2 -2
  55. prefect/events/schemas/__init__.py +0 -5
  56. prefect/events/schemas/automations.py +55 -46
  57. prefect/events/schemas/deployment_triggers.py +7 -197
  58. prefect/events/schemas/events.py +34 -65
  59. prefect/events/schemas/labelling.py +10 -14
  60. prefect/events/utilities.py +2 -3
  61. prefect/events/worker.py +2 -3
  62. prefect/filesystems.py +6 -517
  63. prefect/{new_flow_engine.py → flow_engine.py} +313 -72
  64. prefect/flow_runs.py +377 -5
  65. prefect/flows.py +248 -165
  66. prefect/futures.py +186 -345
  67. prefect/infrastructure/__init__.py +0 -27
  68. prefect/infrastructure/provisioners/__init__.py +5 -3
  69. prefect/infrastructure/provisioners/cloud_run.py +11 -6
  70. prefect/infrastructure/provisioners/container_instance.py +11 -7
  71. prefect/infrastructure/provisioners/ecs.py +6 -4
  72. prefect/infrastructure/provisioners/modal.py +8 -5
  73. prefect/input/actions.py +2 -4
  74. prefect/input/run_input.py +5 -7
  75. prefect/logging/formatters.py +0 -2
  76. prefect/logging/handlers.py +3 -11
  77. prefect/logging/loggers.py +2 -2
  78. prefect/manifests.py +2 -1
  79. prefect/records/__init__.py +1 -0
  80. prefect/records/result_store.py +42 -0
  81. prefect/records/store.py +9 -0
  82. prefect/results.py +43 -39
  83. prefect/runner/runner.py +9 -9
  84. prefect/runner/server.py +6 -10
  85. prefect/runner/storage.py +3 -8
  86. prefect/runner/submit.py +2 -2
  87. prefect/runner/utils.py +2 -2
  88. prefect/serializers.py +24 -35
  89. prefect/server/api/collections_data/views/aggregate-worker-metadata.json +5 -14
  90. prefect/settings.py +70 -133
  91. prefect/states.py +17 -47
  92. prefect/task_engine.py +697 -58
  93. prefect/task_runners.py +269 -301
  94. prefect/task_server.py +53 -34
  95. prefect/tasks.py +327 -337
  96. prefect/transactions.py +220 -0
  97. prefect/types/__init__.py +61 -82
  98. prefect/utilities/asyncutils.py +195 -136
  99. prefect/utilities/callables.py +121 -41
  100. prefect/utilities/collections.py +23 -38
  101. prefect/utilities/dispatch.py +11 -3
  102. prefect/utilities/dockerutils.py +4 -0
  103. prefect/utilities/engine.py +140 -20
  104. prefect/utilities/importtools.py +26 -27
  105. prefect/utilities/pydantic.py +128 -38
  106. prefect/utilities/schema_tools/hydration.py +5 -1
  107. prefect/utilities/templating.py +12 -2
  108. prefect/variables.py +78 -61
  109. prefect/workers/__init__.py +0 -1
  110. prefect/workers/base.py +15 -17
  111. prefect/workers/process.py +3 -8
  112. prefect/workers/server.py +2 -2
  113. {prefect_client-2.19.3.dist-info → prefect_client-3.0.0rc1.dist-info}/METADATA +22 -21
  114. prefect_client-3.0.0rc1.dist-info/RECORD +176 -0
  115. prefect/_internal/pydantic/_base_model.py +0 -51
  116. prefect/_internal/pydantic/_compat.py +0 -82
  117. prefect/_internal/pydantic/_flags.py +0 -20
  118. prefect/_internal/pydantic/_types.py +0 -8
  119. prefect/_internal/pydantic/utilities/__init__.py +0 -0
  120. prefect/_internal/pydantic/utilities/config_dict.py +0 -72
  121. prefect/_internal/pydantic/utilities/field_validator.py +0 -150
  122. prefect/_internal/pydantic/utilities/model_construct.py +0 -56
  123. prefect/_internal/pydantic/utilities/model_copy.py +0 -55
  124. prefect/_internal/pydantic/utilities/model_dump.py +0 -136
  125. prefect/_internal/pydantic/utilities/model_dump_json.py +0 -112
  126. prefect/_internal/pydantic/utilities/model_fields.py +0 -50
  127. prefect/_internal/pydantic/utilities/model_fields_set.py +0 -29
  128. prefect/_internal/pydantic/utilities/model_json_schema.py +0 -82
  129. prefect/_internal/pydantic/utilities/model_rebuild.py +0 -80
  130. prefect/_internal/pydantic/utilities/model_validate.py +0 -75
  131. prefect/_internal/pydantic/utilities/model_validate_json.py +0 -68
  132. prefect/_internal/pydantic/utilities/model_validator.py +0 -87
  133. prefect/_internal/pydantic/utilities/type_adapter.py +0 -71
  134. prefect/_vendor/__init__.py +0 -0
  135. prefect/_vendor/fastapi/__init__.py +0 -25
  136. prefect/_vendor/fastapi/applications.py +0 -946
  137. prefect/_vendor/fastapi/background.py +0 -3
  138. prefect/_vendor/fastapi/concurrency.py +0 -44
  139. prefect/_vendor/fastapi/datastructures.py +0 -58
  140. prefect/_vendor/fastapi/dependencies/__init__.py +0 -0
  141. prefect/_vendor/fastapi/dependencies/models.py +0 -64
  142. prefect/_vendor/fastapi/dependencies/utils.py +0 -877
  143. prefect/_vendor/fastapi/encoders.py +0 -177
  144. prefect/_vendor/fastapi/exception_handlers.py +0 -40
  145. prefect/_vendor/fastapi/exceptions.py +0 -46
  146. prefect/_vendor/fastapi/logger.py +0 -3
  147. prefect/_vendor/fastapi/middleware/__init__.py +0 -1
  148. prefect/_vendor/fastapi/middleware/asyncexitstack.py +0 -25
  149. prefect/_vendor/fastapi/middleware/cors.py +0 -3
  150. prefect/_vendor/fastapi/middleware/gzip.py +0 -3
  151. prefect/_vendor/fastapi/middleware/httpsredirect.py +0 -3
  152. prefect/_vendor/fastapi/middleware/trustedhost.py +0 -3
  153. prefect/_vendor/fastapi/middleware/wsgi.py +0 -3
  154. prefect/_vendor/fastapi/openapi/__init__.py +0 -0
  155. prefect/_vendor/fastapi/openapi/constants.py +0 -2
  156. prefect/_vendor/fastapi/openapi/docs.py +0 -203
  157. prefect/_vendor/fastapi/openapi/models.py +0 -480
  158. prefect/_vendor/fastapi/openapi/utils.py +0 -485
  159. prefect/_vendor/fastapi/param_functions.py +0 -340
  160. prefect/_vendor/fastapi/params.py +0 -453
  161. prefect/_vendor/fastapi/requests.py +0 -4
  162. prefect/_vendor/fastapi/responses.py +0 -40
  163. prefect/_vendor/fastapi/routing.py +0 -1331
  164. prefect/_vendor/fastapi/security/__init__.py +0 -15
  165. prefect/_vendor/fastapi/security/api_key.py +0 -98
  166. prefect/_vendor/fastapi/security/base.py +0 -6
  167. prefect/_vendor/fastapi/security/http.py +0 -172
  168. prefect/_vendor/fastapi/security/oauth2.py +0 -227
  169. prefect/_vendor/fastapi/security/open_id_connect_url.py +0 -34
  170. prefect/_vendor/fastapi/security/utils.py +0 -10
  171. prefect/_vendor/fastapi/staticfiles.py +0 -1
  172. prefect/_vendor/fastapi/templating.py +0 -3
  173. prefect/_vendor/fastapi/testclient.py +0 -1
  174. prefect/_vendor/fastapi/types.py +0 -3
  175. prefect/_vendor/fastapi/utils.py +0 -235
  176. prefect/_vendor/fastapi/websockets.py +0 -7
  177. prefect/_vendor/starlette/__init__.py +0 -1
  178. prefect/_vendor/starlette/_compat.py +0 -28
  179. prefect/_vendor/starlette/_exception_handler.py +0 -80
  180. prefect/_vendor/starlette/_utils.py +0 -88
  181. prefect/_vendor/starlette/applications.py +0 -261
  182. prefect/_vendor/starlette/authentication.py +0 -159
  183. prefect/_vendor/starlette/background.py +0 -43
  184. prefect/_vendor/starlette/concurrency.py +0 -59
  185. prefect/_vendor/starlette/config.py +0 -151
  186. prefect/_vendor/starlette/convertors.py +0 -87
  187. prefect/_vendor/starlette/datastructures.py +0 -707
  188. prefect/_vendor/starlette/endpoints.py +0 -130
  189. prefect/_vendor/starlette/exceptions.py +0 -60
  190. prefect/_vendor/starlette/formparsers.py +0 -276
  191. prefect/_vendor/starlette/middleware/__init__.py +0 -17
  192. prefect/_vendor/starlette/middleware/authentication.py +0 -52
  193. prefect/_vendor/starlette/middleware/base.py +0 -220
  194. prefect/_vendor/starlette/middleware/cors.py +0 -176
  195. prefect/_vendor/starlette/middleware/errors.py +0 -265
  196. prefect/_vendor/starlette/middleware/exceptions.py +0 -74
  197. prefect/_vendor/starlette/middleware/gzip.py +0 -113
  198. prefect/_vendor/starlette/middleware/httpsredirect.py +0 -19
  199. prefect/_vendor/starlette/middleware/sessions.py +0 -82
  200. prefect/_vendor/starlette/middleware/trustedhost.py +0 -64
  201. prefect/_vendor/starlette/middleware/wsgi.py +0 -147
  202. prefect/_vendor/starlette/requests.py +0 -328
  203. prefect/_vendor/starlette/responses.py +0 -347
  204. prefect/_vendor/starlette/routing.py +0 -933
  205. prefect/_vendor/starlette/schemas.py +0 -154
  206. prefect/_vendor/starlette/staticfiles.py +0 -248
  207. prefect/_vendor/starlette/status.py +0 -199
  208. prefect/_vendor/starlette/templating.py +0 -231
  209. prefect/_vendor/starlette/testclient.py +0 -804
  210. prefect/_vendor/starlette/types.py +0 -30
  211. prefect/_vendor/starlette/websockets.py +0 -193
  212. prefect/agent.py +0 -698
  213. prefect/deployments/deployments.py +0 -1042
  214. prefect/deprecated/__init__.py +0 -0
  215. prefect/deprecated/data_documents.py +0 -350
  216. prefect/deprecated/packaging/__init__.py +0 -12
  217. prefect/deprecated/packaging/base.py +0 -96
  218. prefect/deprecated/packaging/docker.py +0 -146
  219. prefect/deprecated/packaging/file.py +0 -92
  220. prefect/deprecated/packaging/orion.py +0 -80
  221. prefect/deprecated/packaging/serializers.py +0 -171
  222. prefect/events/instrument.py +0 -135
  223. prefect/infrastructure/base.py +0 -323
  224. prefect/infrastructure/container.py +0 -818
  225. prefect/infrastructure/kubernetes.py +0 -920
  226. prefect/infrastructure/process.py +0 -289
  227. prefect/new_task_engine.py +0 -423
  228. prefect/pydantic/__init__.py +0 -76
  229. prefect/pydantic/main.py +0 -39
  230. prefect/software/__init__.py +0 -2
  231. prefect/software/base.py +0 -50
  232. prefect/software/conda.py +0 -199
  233. prefect/software/pip.py +0 -122
  234. prefect/software/python.py +0 -52
  235. prefect/workers/block.py +0 -218
  236. prefect_client-2.19.3.dist-info/RECORD +0 -292
  237. {prefect_client-2.19.3.dist-info → prefect_client-3.0.0rc1.dist-info}/LICENSE +0 -0
  238. {prefect_client-2.19.3.dist-info → prefect_client-3.0.0rc1.dist-info}/WHEEL +0 -0
  239. {prefect_client-2.19.3.dist-info → prefect_client-3.0.0rc1.dist-info}/top_level.txt +0 -0
@@ -1,946 +0,0 @@
1
- from enum import Enum
2
- from typing import (
3
- Any,
4
- Awaitable,
5
- Callable,
6
- Coroutine,
7
- Dict,
8
- List,
9
- Optional,
10
- Sequence,
11
- Type,
12
- TypeVar,
13
- Union,
14
- )
15
-
16
- from prefect._vendor.fastapi import routing
17
- from prefect._vendor.fastapi.datastructures import Default, DefaultPlaceholder
18
- from prefect._vendor.fastapi.encoders import DictIntStrAny, SetIntStr
19
- from prefect._vendor.fastapi.exception_handlers import (
20
- http_exception_handler,
21
- request_validation_exception_handler,
22
- websocket_request_validation_exception_handler,
23
- )
24
- from prefect._vendor.fastapi.exceptions import (
25
- RequestValidationError,
26
- WebSocketRequestValidationError,
27
- )
28
- from prefect._vendor.fastapi.logger import logger
29
- from prefect._vendor.fastapi.middleware.asyncexitstack import AsyncExitStackMiddleware
30
- from prefect._vendor.fastapi.openapi.docs import (
31
- get_redoc_html,
32
- get_swagger_ui_html,
33
- get_swagger_ui_oauth2_redirect_html,
34
- )
35
- from prefect._vendor.fastapi.openapi.utils import get_openapi
36
- from prefect._vendor.fastapi.params import Depends
37
- from prefect._vendor.fastapi.types import DecoratedCallable
38
- from prefect._vendor.fastapi.utils import generate_unique_id
39
- from prefect._vendor.starlette.applications import Starlette
40
- from prefect._vendor.starlette.datastructures import State
41
- from prefect._vendor.starlette.exceptions import HTTPException
42
- from prefect._vendor.starlette.middleware import Middleware
43
- from prefect._vendor.starlette.middleware.base import BaseHTTPMiddleware
44
- from prefect._vendor.starlette.middleware.errors import ServerErrorMiddleware
45
- from prefect._vendor.starlette.middleware.exceptions import ExceptionMiddleware
46
- from prefect._vendor.starlette.requests import Request
47
- from prefect._vendor.starlette.responses import HTMLResponse, JSONResponse, Response
48
- from prefect._vendor.starlette.routing import BaseRoute
49
- from prefect._vendor.starlette.types import ASGIApp, Lifespan, Receive, Scope, Send
50
-
51
- AppType = TypeVar("AppType", bound="FastAPI")
52
-
53
-
54
- class FastAPI(Starlette):
55
- def __init__(
56
- self: AppType,
57
- *,
58
- debug: bool = False,
59
- routes: Optional[List[BaseRoute]] = None,
60
- title: str = "FastAPI",
61
- summary: Optional[str] = None,
62
- description: str = "",
63
- version: str = "0.1.0",
64
- openapi_url: Optional[str] = "/openapi.json",
65
- openapi_tags: Optional[List[Dict[str, Any]]] = None,
66
- servers: Optional[List[Dict[str, Union[str, Any]]]] = None,
67
- dependencies: Optional[Sequence[Depends]] = None,
68
- default_response_class: Type[Response] = Default(JSONResponse),
69
- redirect_slashes: bool = True,
70
- docs_url: Optional[str] = "/docs",
71
- redoc_url: Optional[str] = "/redoc",
72
- swagger_ui_oauth2_redirect_url: Optional[str] = "/docs/oauth2-redirect",
73
- swagger_ui_init_oauth: Optional[Dict[str, Any]] = None,
74
- middleware: Optional[Sequence[Middleware]] = None,
75
- exception_handlers: Optional[
76
- Dict[
77
- Union[int, Type[Exception]],
78
- Callable[[Request, Any], Coroutine[Any, Any, Response]],
79
- ]
80
- ] = None,
81
- on_startup: Optional[Sequence[Callable[[], Any]]] = None,
82
- on_shutdown: Optional[Sequence[Callable[[], Any]]] = None,
83
- lifespan: Optional[Lifespan[AppType]] = None,
84
- terms_of_service: Optional[str] = None,
85
- contact: Optional[Dict[str, Union[str, Any]]] = None,
86
- license_info: Optional[Dict[str, Union[str, Any]]] = None,
87
- openapi_prefix: str = "",
88
- root_path: str = "",
89
- root_path_in_servers: bool = True,
90
- responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
91
- callbacks: Optional[List[BaseRoute]] = None,
92
- webhooks: Optional[routing.APIRouter] = None,
93
- deprecated: Optional[bool] = None,
94
- include_in_schema: bool = True,
95
- swagger_ui_parameters: Optional[Dict[str, Any]] = None,
96
- generate_unique_id_function: Callable[[routing.APIRoute], str] = Default(
97
- generate_unique_id
98
- ),
99
- **extra: Any,
100
- ) -> None:
101
- self.debug = debug
102
- self.title = title
103
- self.summary = summary
104
- self.description = description
105
- self.version = version
106
- self.terms_of_service = terms_of_service
107
- self.contact = contact
108
- self.license_info = license_info
109
- self.openapi_url = openapi_url
110
- self.openapi_tags = openapi_tags
111
- self.root_path_in_servers = root_path_in_servers
112
- self.docs_url = docs_url
113
- self.redoc_url = redoc_url
114
- self.swagger_ui_oauth2_redirect_url = swagger_ui_oauth2_redirect_url
115
- self.swagger_ui_init_oauth = swagger_ui_init_oauth
116
- self.swagger_ui_parameters = swagger_ui_parameters
117
- self.servers = servers or []
118
- self.extra = extra
119
- self.openapi_version = "3.1.0"
120
- self.openapi_schema: Optional[Dict[str, Any]] = None
121
- if self.openapi_url:
122
- assert self.title, "A title must be provided for OpenAPI, e.g.: 'My API'"
123
- assert self.version, "A version must be provided for OpenAPI, e.g.: '2.1.0'"
124
- # TODO: remove when discarding the openapi_prefix parameter
125
- if openapi_prefix:
126
- logger.warning(
127
- '"openapi_prefix" has been deprecated in favor of "root_path", which '
128
- "follows more closely the ASGI standard, is simpler, and more "
129
- "automatic. Check the docs at "
130
- "https://fastapi.tiangolo.com/advanced/sub-applications/"
131
- )
132
- self.webhooks = webhooks or routing.APIRouter()
133
- self.root_path = root_path or openapi_prefix
134
- self.state: State = State()
135
- self.dependency_overrides: Dict[Callable[..., Any], Callable[..., Any]] = {}
136
- self.router: routing.APIRouter = routing.APIRouter(
137
- routes=routes,
138
- redirect_slashes=redirect_slashes,
139
- dependency_overrides_provider=self,
140
- on_startup=on_startup,
141
- on_shutdown=on_shutdown,
142
- lifespan=lifespan,
143
- default_response_class=default_response_class,
144
- dependencies=dependencies,
145
- callbacks=callbacks,
146
- deprecated=deprecated,
147
- include_in_schema=include_in_schema,
148
- responses=responses,
149
- generate_unique_id_function=generate_unique_id_function,
150
- )
151
- self.exception_handlers: Dict[
152
- Any, Callable[[Request, Any], Union[Response, Awaitable[Response]]]
153
- ] = {} if exception_handlers is None else dict(exception_handlers)
154
- self.exception_handlers.setdefault(HTTPException, http_exception_handler)
155
- self.exception_handlers.setdefault(
156
- RequestValidationError, request_validation_exception_handler
157
- )
158
- self.exception_handlers.setdefault(
159
- WebSocketRequestValidationError,
160
- # Starlette still has incorrect type specification for the handlers
161
- websocket_request_validation_exception_handler, # type: ignore
162
- )
163
-
164
- self.user_middleware: List[Middleware] = (
165
- [] if middleware is None else list(middleware)
166
- )
167
- self.middleware_stack: Union[ASGIApp, None] = None
168
- self.setup()
169
-
170
- def build_middleware_stack(self) -> ASGIApp:
171
- # Duplicate/override from prefect._vendor.starlette to add AsyncExitStackMiddleware
172
- # inside of ExceptionMiddleware, inside of custom user middlewares
173
- debug = self.debug
174
- error_handler = None
175
- exception_handlers = {}
176
-
177
- for key, value in self.exception_handlers.items():
178
- if key in (500, Exception):
179
- error_handler = value
180
- else:
181
- exception_handlers[key] = value
182
-
183
- middleware = (
184
- [Middleware(ServerErrorMiddleware, handler=error_handler, debug=debug)]
185
- + self.user_middleware
186
- + [
187
- Middleware(
188
- ExceptionMiddleware, handlers=exception_handlers, debug=debug
189
- ),
190
- # Add FastAPI-specific AsyncExitStackMiddleware for dependencies with
191
- # contextvars.
192
- # This needs to happen after user middlewares because those create a
193
- # new contextvars context copy by using a new AnyIO task group.
194
- # The initial part of dependencies with yield is executed in the
195
- # FastAPI code, inside all the middlewares, but the teardown part
196
- # (after yield) is executed in the AsyncExitStack in this middleware,
197
- # if the AsyncExitStack lived outside of the custom middlewares and
198
- # contextvars were set in a dependency with yield in that internal
199
- # contextvars context, the values would not be available in the
200
- # outside context of the AsyncExitStack.
201
- # By putting the middleware and the AsyncExitStack here, inside all
202
- # user middlewares, the code before and after yield in dependencies
203
- # with yield is executed in the same contextvars context, so all values
204
- # set in contextvars before yield is still available after yield as
205
- # would be expected.
206
- # Additionally, by having this AsyncExitStack here, after the
207
- # ExceptionMiddleware, now dependencies can catch handled exceptions,
208
- # e.g. HTTPException, to customize the teardown code (e.g. DB session
209
- # rollback).
210
- Middleware(AsyncExitStackMiddleware),
211
- ]
212
- )
213
-
214
- app = self.router
215
- for cls, options in reversed(middleware):
216
- app = cls(app=app, **options)
217
- return app
218
-
219
- def openapi(self) -> Dict[str, Any]:
220
- if not self.openapi_schema:
221
- self.openapi_schema = get_openapi(
222
- title=self.title,
223
- version=self.version,
224
- openapi_version=self.openapi_version,
225
- summary=self.summary,
226
- description=self.description,
227
- terms_of_service=self.terms_of_service,
228
- contact=self.contact,
229
- license_info=self.license_info,
230
- routes=self.routes,
231
- webhooks=self.webhooks.routes,
232
- tags=self.openapi_tags,
233
- servers=self.servers,
234
- )
235
- return self.openapi_schema
236
-
237
- def setup(self) -> None:
238
- if self.openapi_url:
239
- urls = (server_data.get("url") for server_data in self.servers)
240
- server_urls = {url for url in urls if url}
241
-
242
- async def openapi(req: Request) -> JSONResponse:
243
- root_path = req.scope.get("root_path", "").rstrip("/")
244
- if root_path not in server_urls:
245
- if root_path and self.root_path_in_servers:
246
- self.servers.insert(0, {"url": root_path})
247
- server_urls.add(root_path)
248
- return JSONResponse(self.openapi())
249
-
250
- self.add_route(self.openapi_url, openapi, include_in_schema=False)
251
- if self.openapi_url and self.docs_url:
252
-
253
- async def swagger_ui_html(req: Request) -> HTMLResponse:
254
- root_path = req.scope.get("root_path", "").rstrip("/")
255
- openapi_url = root_path + self.openapi_url
256
- oauth2_redirect_url = self.swagger_ui_oauth2_redirect_url
257
- if oauth2_redirect_url:
258
- oauth2_redirect_url = root_path + oauth2_redirect_url
259
- return get_swagger_ui_html(
260
- openapi_url=openapi_url,
261
- title=self.title + " - Swagger UI",
262
- oauth2_redirect_url=oauth2_redirect_url,
263
- init_oauth=self.swagger_ui_init_oauth,
264
- swagger_ui_parameters=self.swagger_ui_parameters,
265
- )
266
-
267
- self.add_route(self.docs_url, swagger_ui_html, include_in_schema=False)
268
-
269
- if self.swagger_ui_oauth2_redirect_url:
270
-
271
- async def swagger_ui_redirect(req: Request) -> HTMLResponse:
272
- return get_swagger_ui_oauth2_redirect_html()
273
-
274
- self.add_route(
275
- self.swagger_ui_oauth2_redirect_url,
276
- swagger_ui_redirect,
277
- include_in_schema=False,
278
- )
279
- if self.openapi_url and self.redoc_url:
280
-
281
- async def redoc_html(req: Request) -> HTMLResponse:
282
- root_path = req.scope.get("root_path", "").rstrip("/")
283
- openapi_url = root_path + self.openapi_url
284
- return get_redoc_html(
285
- openapi_url=openapi_url, title=self.title + " - ReDoc"
286
- )
287
-
288
- self.add_route(self.redoc_url, redoc_html, include_in_schema=False)
289
-
290
- async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None:
291
- if self.root_path:
292
- scope["root_path"] = self.root_path
293
- await super().__call__(scope, receive, send)
294
-
295
- def add_api_route(
296
- self,
297
- path: str,
298
- endpoint: Callable[..., Coroutine[Any, Any, Response]],
299
- *,
300
- response_model: Any = Default(None),
301
- status_code: Optional[int] = None,
302
- tags: Optional[List[Union[str, Enum]]] = None,
303
- dependencies: Optional[Sequence[Depends]] = None,
304
- summary: Optional[str] = None,
305
- description: Optional[str] = None,
306
- response_description: str = "Successful Response",
307
- responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
308
- deprecated: Optional[bool] = None,
309
- methods: Optional[List[str]] = None,
310
- operation_id: Optional[str] = None,
311
- response_model_include: Optional[Union[SetIntStr, DictIntStrAny]] = None,
312
- response_model_exclude: Optional[Union[SetIntStr, DictIntStrAny]] = None,
313
- response_model_by_alias: bool = True,
314
- response_model_exclude_unset: bool = False,
315
- response_model_exclude_defaults: bool = False,
316
- response_model_exclude_none: bool = False,
317
- include_in_schema: bool = True,
318
- response_class: Union[Type[Response], DefaultPlaceholder] = Default(
319
- JSONResponse
320
- ),
321
- name: Optional[str] = None,
322
- openapi_extra: Optional[Dict[str, Any]] = None,
323
- generate_unique_id_function: Callable[[routing.APIRoute], str] = Default(
324
- generate_unique_id
325
- ),
326
- ) -> None:
327
- self.router.add_api_route(
328
- path,
329
- endpoint=endpoint,
330
- response_model=response_model,
331
- status_code=status_code,
332
- tags=tags,
333
- dependencies=dependencies,
334
- summary=summary,
335
- description=description,
336
- response_description=response_description,
337
- responses=responses,
338
- deprecated=deprecated,
339
- methods=methods,
340
- operation_id=operation_id,
341
- response_model_include=response_model_include,
342
- response_model_exclude=response_model_exclude,
343
- response_model_by_alias=response_model_by_alias,
344
- response_model_exclude_unset=response_model_exclude_unset,
345
- response_model_exclude_defaults=response_model_exclude_defaults,
346
- response_model_exclude_none=response_model_exclude_none,
347
- include_in_schema=include_in_schema,
348
- response_class=response_class,
349
- name=name,
350
- openapi_extra=openapi_extra,
351
- generate_unique_id_function=generate_unique_id_function,
352
- )
353
-
354
- def api_route(
355
- self,
356
- path: str,
357
- *,
358
- response_model: Any = Default(None),
359
- status_code: Optional[int] = None,
360
- tags: Optional[List[Union[str, Enum]]] = None,
361
- dependencies: Optional[Sequence[Depends]] = None,
362
- summary: Optional[str] = None,
363
- description: Optional[str] = None,
364
- response_description: str = "Successful Response",
365
- responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
366
- deprecated: Optional[bool] = None,
367
- methods: Optional[List[str]] = None,
368
- operation_id: Optional[str] = None,
369
- response_model_include: Optional[Union[SetIntStr, DictIntStrAny]] = None,
370
- response_model_exclude: Optional[Union[SetIntStr, DictIntStrAny]] = None,
371
- response_model_by_alias: bool = True,
372
- response_model_exclude_unset: bool = False,
373
- response_model_exclude_defaults: bool = False,
374
- response_model_exclude_none: bool = False,
375
- include_in_schema: bool = True,
376
- response_class: Type[Response] = Default(JSONResponse),
377
- name: Optional[str] = None,
378
- openapi_extra: Optional[Dict[str, Any]] = None,
379
- generate_unique_id_function: Callable[[routing.APIRoute], str] = Default(
380
- generate_unique_id
381
- ),
382
- ) -> Callable[[DecoratedCallable], DecoratedCallable]:
383
- def decorator(func: DecoratedCallable) -> DecoratedCallable:
384
- self.router.add_api_route(
385
- path,
386
- func,
387
- response_model=response_model,
388
- status_code=status_code,
389
- tags=tags,
390
- dependencies=dependencies,
391
- summary=summary,
392
- description=description,
393
- response_description=response_description,
394
- responses=responses,
395
- deprecated=deprecated,
396
- methods=methods,
397
- operation_id=operation_id,
398
- response_model_include=response_model_include,
399
- response_model_exclude=response_model_exclude,
400
- response_model_by_alias=response_model_by_alias,
401
- response_model_exclude_unset=response_model_exclude_unset,
402
- response_model_exclude_defaults=response_model_exclude_defaults,
403
- response_model_exclude_none=response_model_exclude_none,
404
- include_in_schema=include_in_schema,
405
- response_class=response_class,
406
- name=name,
407
- openapi_extra=openapi_extra,
408
- generate_unique_id_function=generate_unique_id_function,
409
- )
410
- return func
411
-
412
- return decorator
413
-
414
- def add_api_websocket_route(
415
- self,
416
- path: str,
417
- endpoint: Callable[..., Any],
418
- name: Optional[str] = None,
419
- *,
420
- dependencies: Optional[Sequence[Depends]] = None,
421
- ) -> None:
422
- self.router.add_api_websocket_route(
423
- path,
424
- endpoint,
425
- name=name,
426
- dependencies=dependencies,
427
- )
428
-
429
- def websocket(
430
- self,
431
- path: str,
432
- name: Optional[str] = None,
433
- *,
434
- dependencies: Optional[Sequence[Depends]] = None,
435
- ) -> Callable[[DecoratedCallable], DecoratedCallable]:
436
- def decorator(func: DecoratedCallable) -> DecoratedCallable:
437
- self.add_api_websocket_route(
438
- path,
439
- func,
440
- name=name,
441
- dependencies=dependencies,
442
- )
443
- return func
444
-
445
- return decorator
446
-
447
- def include_router(
448
- self,
449
- router: routing.APIRouter,
450
- *,
451
- prefix: str = "",
452
- tags: Optional[List[Union[str, Enum]]] = None,
453
- dependencies: Optional[Sequence[Depends]] = None,
454
- responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
455
- deprecated: Optional[bool] = None,
456
- include_in_schema: bool = True,
457
- default_response_class: Type[Response] = Default(JSONResponse),
458
- callbacks: Optional[List[BaseRoute]] = None,
459
- generate_unique_id_function: Callable[[routing.APIRoute], str] = Default(
460
- generate_unique_id
461
- ),
462
- ) -> None:
463
- self.router.include_router(
464
- router,
465
- prefix=prefix,
466
- tags=tags,
467
- dependencies=dependencies,
468
- responses=responses,
469
- deprecated=deprecated,
470
- include_in_schema=include_in_schema,
471
- default_response_class=default_response_class,
472
- callbacks=callbacks,
473
- generate_unique_id_function=generate_unique_id_function,
474
- )
475
-
476
- def get(
477
- self,
478
- path: str,
479
- *,
480
- response_model: Any = Default(None),
481
- status_code: Optional[int] = None,
482
- tags: Optional[List[Union[str, Enum]]] = None,
483
- dependencies: Optional[Sequence[Depends]] = None,
484
- summary: Optional[str] = None,
485
- description: Optional[str] = None,
486
- response_description: str = "Successful Response",
487
- responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
488
- deprecated: Optional[bool] = None,
489
- operation_id: Optional[str] = None,
490
- response_model_include: Optional[Union[SetIntStr, DictIntStrAny]] = None,
491
- response_model_exclude: Optional[Union[SetIntStr, DictIntStrAny]] = None,
492
- response_model_by_alias: bool = True,
493
- response_model_exclude_unset: bool = False,
494
- response_model_exclude_defaults: bool = False,
495
- response_model_exclude_none: bool = False,
496
- include_in_schema: bool = True,
497
- response_class: Type[Response] = Default(JSONResponse),
498
- name: Optional[str] = None,
499
- callbacks: Optional[List[BaseRoute]] = None,
500
- openapi_extra: Optional[Dict[str, Any]] = None,
501
- generate_unique_id_function: Callable[[routing.APIRoute], str] = Default(
502
- generate_unique_id
503
- ),
504
- ) -> Callable[[DecoratedCallable], DecoratedCallable]:
505
- return self.router.get(
506
- path,
507
- response_model=response_model,
508
- status_code=status_code,
509
- tags=tags,
510
- dependencies=dependencies,
511
- summary=summary,
512
- description=description,
513
- response_description=response_description,
514
- responses=responses,
515
- deprecated=deprecated,
516
- operation_id=operation_id,
517
- response_model_include=response_model_include,
518
- response_model_exclude=response_model_exclude,
519
- response_model_by_alias=response_model_by_alias,
520
- response_model_exclude_unset=response_model_exclude_unset,
521
- response_model_exclude_defaults=response_model_exclude_defaults,
522
- response_model_exclude_none=response_model_exclude_none,
523
- include_in_schema=include_in_schema,
524
- response_class=response_class,
525
- name=name,
526
- callbacks=callbacks,
527
- openapi_extra=openapi_extra,
528
- generate_unique_id_function=generate_unique_id_function,
529
- )
530
-
531
- def put(
532
- self,
533
- path: str,
534
- *,
535
- response_model: Any = Default(None),
536
- status_code: Optional[int] = None,
537
- tags: Optional[List[Union[str, Enum]]] = None,
538
- dependencies: Optional[Sequence[Depends]] = None,
539
- summary: Optional[str] = None,
540
- description: Optional[str] = None,
541
- response_description: str = "Successful Response",
542
- responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
543
- deprecated: Optional[bool] = None,
544
- operation_id: Optional[str] = None,
545
- response_model_include: Optional[Union[SetIntStr, DictIntStrAny]] = None,
546
- response_model_exclude: Optional[Union[SetIntStr, DictIntStrAny]] = None,
547
- response_model_by_alias: bool = True,
548
- response_model_exclude_unset: bool = False,
549
- response_model_exclude_defaults: bool = False,
550
- response_model_exclude_none: bool = False,
551
- include_in_schema: bool = True,
552
- response_class: Type[Response] = Default(JSONResponse),
553
- name: Optional[str] = None,
554
- callbacks: Optional[List[BaseRoute]] = None,
555
- openapi_extra: Optional[Dict[str, Any]] = None,
556
- generate_unique_id_function: Callable[[routing.APIRoute], str] = Default(
557
- generate_unique_id
558
- ),
559
- ) -> Callable[[DecoratedCallable], DecoratedCallable]:
560
- return self.router.put(
561
- path,
562
- response_model=response_model,
563
- status_code=status_code,
564
- tags=tags,
565
- dependencies=dependencies,
566
- summary=summary,
567
- description=description,
568
- response_description=response_description,
569
- responses=responses,
570
- deprecated=deprecated,
571
- operation_id=operation_id,
572
- response_model_include=response_model_include,
573
- response_model_exclude=response_model_exclude,
574
- response_model_by_alias=response_model_by_alias,
575
- response_model_exclude_unset=response_model_exclude_unset,
576
- response_model_exclude_defaults=response_model_exclude_defaults,
577
- response_model_exclude_none=response_model_exclude_none,
578
- include_in_schema=include_in_schema,
579
- response_class=response_class,
580
- name=name,
581
- callbacks=callbacks,
582
- openapi_extra=openapi_extra,
583
- generate_unique_id_function=generate_unique_id_function,
584
- )
585
-
586
- def post(
587
- self,
588
- path: str,
589
- *,
590
- response_model: Any = Default(None),
591
- status_code: Optional[int] = None,
592
- tags: Optional[List[Union[str, Enum]]] = None,
593
- dependencies: Optional[Sequence[Depends]] = None,
594
- summary: Optional[str] = None,
595
- description: Optional[str] = None,
596
- response_description: str = "Successful Response",
597
- responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
598
- deprecated: Optional[bool] = None,
599
- operation_id: Optional[str] = None,
600
- response_model_include: Optional[Union[SetIntStr, DictIntStrAny]] = None,
601
- response_model_exclude: Optional[Union[SetIntStr, DictIntStrAny]] = None,
602
- response_model_by_alias: bool = True,
603
- response_model_exclude_unset: bool = False,
604
- response_model_exclude_defaults: bool = False,
605
- response_model_exclude_none: bool = False,
606
- include_in_schema: bool = True,
607
- response_class: Type[Response] = Default(JSONResponse),
608
- name: Optional[str] = None,
609
- callbacks: Optional[List[BaseRoute]] = None,
610
- openapi_extra: Optional[Dict[str, Any]] = None,
611
- generate_unique_id_function: Callable[[routing.APIRoute], str] = Default(
612
- generate_unique_id
613
- ),
614
- ) -> Callable[[DecoratedCallable], DecoratedCallable]:
615
- return self.router.post(
616
- path,
617
- response_model=response_model,
618
- status_code=status_code,
619
- tags=tags,
620
- dependencies=dependencies,
621
- summary=summary,
622
- description=description,
623
- response_description=response_description,
624
- responses=responses,
625
- deprecated=deprecated,
626
- operation_id=operation_id,
627
- response_model_include=response_model_include,
628
- response_model_exclude=response_model_exclude,
629
- response_model_by_alias=response_model_by_alias,
630
- response_model_exclude_unset=response_model_exclude_unset,
631
- response_model_exclude_defaults=response_model_exclude_defaults,
632
- response_model_exclude_none=response_model_exclude_none,
633
- include_in_schema=include_in_schema,
634
- response_class=response_class,
635
- name=name,
636
- callbacks=callbacks,
637
- openapi_extra=openapi_extra,
638
- generate_unique_id_function=generate_unique_id_function,
639
- )
640
-
641
- def delete(
642
- self,
643
- path: str,
644
- *,
645
- response_model: Any = Default(None),
646
- status_code: Optional[int] = None,
647
- tags: Optional[List[Union[str, Enum]]] = None,
648
- dependencies: Optional[Sequence[Depends]] = None,
649
- summary: Optional[str] = None,
650
- description: Optional[str] = None,
651
- response_description: str = "Successful Response",
652
- responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
653
- deprecated: Optional[bool] = None,
654
- operation_id: Optional[str] = None,
655
- response_model_include: Optional[Union[SetIntStr, DictIntStrAny]] = None,
656
- response_model_exclude: Optional[Union[SetIntStr, DictIntStrAny]] = None,
657
- response_model_by_alias: bool = True,
658
- response_model_exclude_unset: bool = False,
659
- response_model_exclude_defaults: bool = False,
660
- response_model_exclude_none: bool = False,
661
- include_in_schema: bool = True,
662
- response_class: Type[Response] = Default(JSONResponse),
663
- name: Optional[str] = None,
664
- callbacks: Optional[List[BaseRoute]] = None,
665
- openapi_extra: Optional[Dict[str, Any]] = None,
666
- generate_unique_id_function: Callable[[routing.APIRoute], str] = Default(
667
- generate_unique_id
668
- ),
669
- ) -> Callable[[DecoratedCallable], DecoratedCallable]:
670
- return self.router.delete(
671
- path,
672
- response_model=response_model,
673
- status_code=status_code,
674
- tags=tags,
675
- dependencies=dependencies,
676
- summary=summary,
677
- description=description,
678
- response_description=response_description,
679
- responses=responses,
680
- deprecated=deprecated,
681
- operation_id=operation_id,
682
- response_model_include=response_model_include,
683
- response_model_exclude=response_model_exclude,
684
- response_model_by_alias=response_model_by_alias,
685
- response_model_exclude_unset=response_model_exclude_unset,
686
- response_model_exclude_defaults=response_model_exclude_defaults,
687
- response_model_exclude_none=response_model_exclude_none,
688
- include_in_schema=include_in_schema,
689
- response_class=response_class,
690
- name=name,
691
- callbacks=callbacks,
692
- openapi_extra=openapi_extra,
693
- generate_unique_id_function=generate_unique_id_function,
694
- )
695
-
696
- def options(
697
- self,
698
- path: str,
699
- *,
700
- response_model: Any = Default(None),
701
- status_code: Optional[int] = None,
702
- tags: Optional[List[Union[str, Enum]]] = None,
703
- dependencies: Optional[Sequence[Depends]] = None,
704
- summary: Optional[str] = None,
705
- description: Optional[str] = None,
706
- response_description: str = "Successful Response",
707
- responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
708
- deprecated: Optional[bool] = None,
709
- operation_id: Optional[str] = None,
710
- response_model_include: Optional[Union[SetIntStr, DictIntStrAny]] = None,
711
- response_model_exclude: Optional[Union[SetIntStr, DictIntStrAny]] = None,
712
- response_model_by_alias: bool = True,
713
- response_model_exclude_unset: bool = False,
714
- response_model_exclude_defaults: bool = False,
715
- response_model_exclude_none: bool = False,
716
- include_in_schema: bool = True,
717
- response_class: Type[Response] = Default(JSONResponse),
718
- name: Optional[str] = None,
719
- callbacks: Optional[List[BaseRoute]] = None,
720
- openapi_extra: Optional[Dict[str, Any]] = None,
721
- generate_unique_id_function: Callable[[routing.APIRoute], str] = Default(
722
- generate_unique_id
723
- ),
724
- ) -> Callable[[DecoratedCallable], DecoratedCallable]:
725
- return self.router.options(
726
- path,
727
- response_model=response_model,
728
- status_code=status_code,
729
- tags=tags,
730
- dependencies=dependencies,
731
- summary=summary,
732
- description=description,
733
- response_description=response_description,
734
- responses=responses,
735
- deprecated=deprecated,
736
- operation_id=operation_id,
737
- response_model_include=response_model_include,
738
- response_model_exclude=response_model_exclude,
739
- response_model_by_alias=response_model_by_alias,
740
- response_model_exclude_unset=response_model_exclude_unset,
741
- response_model_exclude_defaults=response_model_exclude_defaults,
742
- response_model_exclude_none=response_model_exclude_none,
743
- include_in_schema=include_in_schema,
744
- response_class=response_class,
745
- name=name,
746
- callbacks=callbacks,
747
- openapi_extra=openapi_extra,
748
- generate_unique_id_function=generate_unique_id_function,
749
- )
750
-
751
- def head(
752
- self,
753
- path: str,
754
- *,
755
- response_model: Any = Default(None),
756
- status_code: Optional[int] = None,
757
- tags: Optional[List[Union[str, Enum]]] = None,
758
- dependencies: Optional[Sequence[Depends]] = None,
759
- summary: Optional[str] = None,
760
- description: Optional[str] = None,
761
- response_description: str = "Successful Response",
762
- responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
763
- deprecated: Optional[bool] = None,
764
- operation_id: Optional[str] = None,
765
- response_model_include: Optional[Union[SetIntStr, DictIntStrAny]] = None,
766
- response_model_exclude: Optional[Union[SetIntStr, DictIntStrAny]] = None,
767
- response_model_by_alias: bool = True,
768
- response_model_exclude_unset: bool = False,
769
- response_model_exclude_defaults: bool = False,
770
- response_model_exclude_none: bool = False,
771
- include_in_schema: bool = True,
772
- response_class: Type[Response] = Default(JSONResponse),
773
- name: Optional[str] = None,
774
- callbacks: Optional[List[BaseRoute]] = None,
775
- openapi_extra: Optional[Dict[str, Any]] = None,
776
- generate_unique_id_function: Callable[[routing.APIRoute], str] = Default(
777
- generate_unique_id
778
- ),
779
- ) -> Callable[[DecoratedCallable], DecoratedCallable]:
780
- return self.router.head(
781
- path,
782
- response_model=response_model,
783
- status_code=status_code,
784
- tags=tags,
785
- dependencies=dependencies,
786
- summary=summary,
787
- description=description,
788
- response_description=response_description,
789
- responses=responses,
790
- deprecated=deprecated,
791
- operation_id=operation_id,
792
- response_model_include=response_model_include,
793
- response_model_exclude=response_model_exclude,
794
- response_model_by_alias=response_model_by_alias,
795
- response_model_exclude_unset=response_model_exclude_unset,
796
- response_model_exclude_defaults=response_model_exclude_defaults,
797
- response_model_exclude_none=response_model_exclude_none,
798
- include_in_schema=include_in_schema,
799
- response_class=response_class,
800
- name=name,
801
- callbacks=callbacks,
802
- openapi_extra=openapi_extra,
803
- generate_unique_id_function=generate_unique_id_function,
804
- )
805
-
806
- def patch(
807
- self,
808
- path: str,
809
- *,
810
- response_model: Any = Default(None),
811
- status_code: Optional[int] = None,
812
- tags: Optional[List[Union[str, Enum]]] = None,
813
- dependencies: Optional[Sequence[Depends]] = None,
814
- summary: Optional[str] = None,
815
- description: Optional[str] = None,
816
- response_description: str = "Successful Response",
817
- responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
818
- deprecated: Optional[bool] = None,
819
- operation_id: Optional[str] = None,
820
- response_model_include: Optional[Union[SetIntStr, DictIntStrAny]] = None,
821
- response_model_exclude: Optional[Union[SetIntStr, DictIntStrAny]] = None,
822
- response_model_by_alias: bool = True,
823
- response_model_exclude_unset: bool = False,
824
- response_model_exclude_defaults: bool = False,
825
- response_model_exclude_none: bool = False,
826
- include_in_schema: bool = True,
827
- response_class: Type[Response] = Default(JSONResponse),
828
- name: Optional[str] = None,
829
- callbacks: Optional[List[BaseRoute]] = None,
830
- openapi_extra: Optional[Dict[str, Any]] = None,
831
- generate_unique_id_function: Callable[[routing.APIRoute], str] = Default(
832
- generate_unique_id
833
- ),
834
- ) -> Callable[[DecoratedCallable], DecoratedCallable]:
835
- return self.router.patch(
836
- path,
837
- response_model=response_model,
838
- status_code=status_code,
839
- tags=tags,
840
- dependencies=dependencies,
841
- summary=summary,
842
- description=description,
843
- response_description=response_description,
844
- responses=responses,
845
- deprecated=deprecated,
846
- operation_id=operation_id,
847
- response_model_include=response_model_include,
848
- response_model_exclude=response_model_exclude,
849
- response_model_by_alias=response_model_by_alias,
850
- response_model_exclude_unset=response_model_exclude_unset,
851
- response_model_exclude_defaults=response_model_exclude_defaults,
852
- response_model_exclude_none=response_model_exclude_none,
853
- include_in_schema=include_in_schema,
854
- response_class=response_class,
855
- name=name,
856
- callbacks=callbacks,
857
- openapi_extra=openapi_extra,
858
- generate_unique_id_function=generate_unique_id_function,
859
- )
860
-
861
- def trace(
862
- self,
863
- path: str,
864
- *,
865
- response_model: Any = Default(None),
866
- status_code: Optional[int] = None,
867
- tags: Optional[List[Union[str, Enum]]] = None,
868
- dependencies: Optional[Sequence[Depends]] = None,
869
- summary: Optional[str] = None,
870
- description: Optional[str] = None,
871
- response_description: str = "Successful Response",
872
- responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
873
- deprecated: Optional[bool] = None,
874
- operation_id: Optional[str] = None,
875
- response_model_include: Optional[Union[SetIntStr, DictIntStrAny]] = None,
876
- response_model_exclude: Optional[Union[SetIntStr, DictIntStrAny]] = None,
877
- response_model_by_alias: bool = True,
878
- response_model_exclude_unset: bool = False,
879
- response_model_exclude_defaults: bool = False,
880
- response_model_exclude_none: bool = False,
881
- include_in_schema: bool = True,
882
- response_class: Type[Response] = Default(JSONResponse),
883
- name: Optional[str] = None,
884
- callbacks: Optional[List[BaseRoute]] = None,
885
- openapi_extra: Optional[Dict[str, Any]] = None,
886
- generate_unique_id_function: Callable[[routing.APIRoute], str] = Default(
887
- generate_unique_id
888
- ),
889
- ) -> Callable[[DecoratedCallable], DecoratedCallable]:
890
- return self.router.trace(
891
- path,
892
- response_model=response_model,
893
- status_code=status_code,
894
- tags=tags,
895
- dependencies=dependencies,
896
- summary=summary,
897
- description=description,
898
- response_description=response_description,
899
- responses=responses,
900
- deprecated=deprecated,
901
- operation_id=operation_id,
902
- response_model_include=response_model_include,
903
- response_model_exclude=response_model_exclude,
904
- response_model_by_alias=response_model_by_alias,
905
- response_model_exclude_unset=response_model_exclude_unset,
906
- response_model_exclude_defaults=response_model_exclude_defaults,
907
- response_model_exclude_none=response_model_exclude_none,
908
- include_in_schema=include_in_schema,
909
- response_class=response_class,
910
- name=name,
911
- callbacks=callbacks,
912
- openapi_extra=openapi_extra,
913
- generate_unique_id_function=generate_unique_id_function,
914
- )
915
-
916
- def websocket_route(
917
- self, path: str, name: Union[str, None] = None
918
- ) -> Callable[[DecoratedCallable], DecoratedCallable]:
919
- def decorator(func: DecoratedCallable) -> DecoratedCallable:
920
- self.router.add_websocket_route(path, func, name=name)
921
- return func
922
-
923
- return decorator
924
-
925
- def on_event(
926
- self, event_type: str
927
- ) -> Callable[[DecoratedCallable], DecoratedCallable]:
928
- return self.router.on_event(event_type)
929
-
930
- def middleware(
931
- self, middleware_type: str
932
- ) -> Callable[[DecoratedCallable], DecoratedCallable]:
933
- def decorator(func: DecoratedCallable) -> DecoratedCallable:
934
- self.add_middleware(BaseHTTPMiddleware, dispatch=func)
935
- return func
936
-
937
- return decorator
938
-
939
- def exception_handler(
940
- self, exc_class_or_status_code: Union[int, Type[Exception]]
941
- ) -> Callable[[DecoratedCallable], DecoratedCallable]:
942
- def decorator(func: DecoratedCallable) -> DecoratedCallable:
943
- self.add_exception_handler(exc_class_or_status_code, func)
944
- return func
945
-
946
- return decorator