fastapi 0.128.0__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 (53) hide show
  1. fastapi/__init__.py +25 -0
  2. fastapi/__main__.py +3 -0
  3. fastapi/_compat/__init__.py +41 -0
  4. fastapi/_compat/shared.py +206 -0
  5. fastapi/_compat/v2.py +568 -0
  6. fastapi/applications.py +4669 -0
  7. fastapi/background.py +60 -0
  8. fastapi/cli.py +13 -0
  9. fastapi/concurrency.py +41 -0
  10. fastapi/datastructures.py +183 -0
  11. fastapi/dependencies/__init__.py +0 -0
  12. fastapi/dependencies/models.py +193 -0
  13. fastapi/dependencies/utils.py +1021 -0
  14. fastapi/encoders.py +346 -0
  15. fastapi/exception_handlers.py +34 -0
  16. fastapi/exceptions.py +246 -0
  17. fastapi/logger.py +3 -0
  18. fastapi/middleware/__init__.py +1 -0
  19. fastapi/middleware/asyncexitstack.py +18 -0
  20. fastapi/middleware/cors.py +1 -0
  21. fastapi/middleware/gzip.py +1 -0
  22. fastapi/middleware/httpsredirect.py +3 -0
  23. fastapi/middleware/trustedhost.py +3 -0
  24. fastapi/middleware/wsgi.py +1 -0
  25. fastapi/openapi/__init__.py +0 -0
  26. fastapi/openapi/constants.py +3 -0
  27. fastapi/openapi/docs.py +344 -0
  28. fastapi/openapi/models.py +438 -0
  29. fastapi/openapi/utils.py +567 -0
  30. fastapi/param_functions.py +2369 -0
  31. fastapi/params.py +755 -0
  32. fastapi/py.typed +0 -0
  33. fastapi/requests.py +2 -0
  34. fastapi/responses.py +48 -0
  35. fastapi/routing.py +4508 -0
  36. fastapi/security/__init__.py +15 -0
  37. fastapi/security/api_key.py +318 -0
  38. fastapi/security/base.py +6 -0
  39. fastapi/security/http.py +423 -0
  40. fastapi/security/oauth2.py +663 -0
  41. fastapi/security/open_id_connect_url.py +94 -0
  42. fastapi/security/utils.py +10 -0
  43. fastapi/staticfiles.py +1 -0
  44. fastapi/templating.py +1 -0
  45. fastapi/testclient.py +1 -0
  46. fastapi/types.py +11 -0
  47. fastapi/utils.py +164 -0
  48. fastapi/websockets.py +3 -0
  49. fastapi-0.128.0.dist-info/METADATA +645 -0
  50. fastapi-0.128.0.dist-info/RECORD +53 -0
  51. fastapi-0.128.0.dist-info/WHEEL +4 -0
  52. fastapi-0.128.0.dist-info/entry_points.txt +5 -0
  53. fastapi-0.128.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,438 @@
1
+ from collections.abc import Iterable, Mapping
2
+ from enum import Enum
3
+ from typing import Annotated, Any, Callable, Optional, Union
4
+
5
+ from fastapi._compat import with_info_plain_validator_function
6
+ from fastapi.logger import logger
7
+ from pydantic import (
8
+ AnyUrl,
9
+ BaseModel,
10
+ Field,
11
+ GetJsonSchemaHandler,
12
+ )
13
+ from typing_extensions import Literal, TypedDict
14
+ from typing_extensions import deprecated as typing_deprecated
15
+
16
+ try:
17
+ import email_validator
18
+
19
+ assert email_validator # make autoflake ignore the unused import
20
+ from pydantic import EmailStr
21
+ except ImportError: # pragma: no cover
22
+
23
+ class EmailStr(str): # type: ignore
24
+ @classmethod
25
+ def __get_validators__(cls) -> Iterable[Callable[..., Any]]:
26
+ yield cls.validate
27
+
28
+ @classmethod
29
+ def validate(cls, v: Any) -> str:
30
+ logger.warning(
31
+ "email-validator not installed, email fields will be treated as str.\n"
32
+ "To install, run: pip install email-validator"
33
+ )
34
+ return str(v)
35
+
36
+ @classmethod
37
+ def _validate(cls, __input_value: Any, _: Any) -> str:
38
+ logger.warning(
39
+ "email-validator not installed, email fields will be treated as str.\n"
40
+ "To install, run: pip install email-validator"
41
+ )
42
+ return str(__input_value)
43
+
44
+ @classmethod
45
+ def __get_pydantic_json_schema__(
46
+ cls, core_schema: Mapping[str, Any], handler: GetJsonSchemaHandler
47
+ ) -> dict[str, Any]:
48
+ return {"type": "string", "format": "email"}
49
+
50
+ @classmethod
51
+ def __get_pydantic_core_schema__(
52
+ cls, source: type[Any], handler: Callable[[Any], Mapping[str, Any]]
53
+ ) -> Mapping[str, Any]:
54
+ return with_info_plain_validator_function(cls._validate)
55
+
56
+
57
+ class BaseModelWithConfig(BaseModel):
58
+ model_config = {"extra": "allow"}
59
+
60
+
61
+ class Contact(BaseModelWithConfig):
62
+ name: Optional[str] = None
63
+ url: Optional[AnyUrl] = None
64
+ email: Optional[EmailStr] = None
65
+
66
+
67
+ class License(BaseModelWithConfig):
68
+ name: str
69
+ identifier: Optional[str] = None
70
+ url: Optional[AnyUrl] = None
71
+
72
+
73
+ class Info(BaseModelWithConfig):
74
+ title: str
75
+ summary: Optional[str] = None
76
+ description: Optional[str] = None
77
+ termsOfService: Optional[str] = None
78
+ contact: Optional[Contact] = None
79
+ license: Optional[License] = None
80
+ version: str
81
+
82
+
83
+ class ServerVariable(BaseModelWithConfig):
84
+ enum: Annotated[Optional[list[str]], Field(min_length=1)] = None
85
+ default: str
86
+ description: Optional[str] = None
87
+
88
+
89
+ class Server(BaseModelWithConfig):
90
+ url: Union[AnyUrl, str]
91
+ description: Optional[str] = None
92
+ variables: Optional[dict[str, ServerVariable]] = None
93
+
94
+
95
+ class Reference(BaseModel):
96
+ ref: str = Field(alias="$ref")
97
+
98
+
99
+ class Discriminator(BaseModel):
100
+ propertyName: str
101
+ mapping: Optional[dict[str, str]] = None
102
+
103
+
104
+ class XML(BaseModelWithConfig):
105
+ name: Optional[str] = None
106
+ namespace: Optional[str] = None
107
+ prefix: Optional[str] = None
108
+ attribute: Optional[bool] = None
109
+ wrapped: Optional[bool] = None
110
+
111
+
112
+ class ExternalDocumentation(BaseModelWithConfig):
113
+ description: Optional[str] = None
114
+ url: AnyUrl
115
+
116
+
117
+ # Ref JSON Schema 2020-12: https://json-schema.org/draft/2020-12/json-schema-validation#name-type
118
+ SchemaType = Literal[
119
+ "array", "boolean", "integer", "null", "number", "object", "string"
120
+ ]
121
+
122
+
123
+ class Schema(BaseModelWithConfig):
124
+ # Ref: JSON Schema 2020-12: https://json-schema.org/draft/2020-12/json-schema-core.html#name-the-json-schema-core-vocabu
125
+ # Core Vocabulary
126
+ schema_: Optional[str] = Field(default=None, alias="$schema")
127
+ vocabulary: Optional[str] = Field(default=None, alias="$vocabulary")
128
+ id: Optional[str] = Field(default=None, alias="$id")
129
+ anchor: Optional[str] = Field(default=None, alias="$anchor")
130
+ dynamicAnchor: Optional[str] = Field(default=None, alias="$dynamicAnchor")
131
+ ref: Optional[str] = Field(default=None, alias="$ref")
132
+ dynamicRef: Optional[str] = Field(default=None, alias="$dynamicRef")
133
+ defs: Optional[dict[str, "SchemaOrBool"]] = Field(default=None, alias="$defs")
134
+ comment: Optional[str] = Field(default=None, alias="$comment")
135
+ # Ref: JSON Schema 2020-12: https://json-schema.org/draft/2020-12/json-schema-core.html#name-a-vocabulary-for-applying-s
136
+ # A Vocabulary for Applying Subschemas
137
+ allOf: Optional[list["SchemaOrBool"]] = None
138
+ anyOf: Optional[list["SchemaOrBool"]] = None
139
+ oneOf: Optional[list["SchemaOrBool"]] = None
140
+ not_: Optional["SchemaOrBool"] = Field(default=None, alias="not")
141
+ if_: Optional["SchemaOrBool"] = Field(default=None, alias="if")
142
+ then: Optional["SchemaOrBool"] = None
143
+ else_: Optional["SchemaOrBool"] = Field(default=None, alias="else")
144
+ dependentSchemas: Optional[dict[str, "SchemaOrBool"]] = None
145
+ prefixItems: Optional[list["SchemaOrBool"]] = None
146
+ # TODO: uncomment and remove below when deprecating Pydantic v1
147
+ # It generates a list of schemas for tuples, before prefixItems was available
148
+ # items: Optional["SchemaOrBool"] = None
149
+ items: Optional[Union["SchemaOrBool", list["SchemaOrBool"]]] = None
150
+ contains: Optional["SchemaOrBool"] = None
151
+ properties: Optional[dict[str, "SchemaOrBool"]] = None
152
+ patternProperties: Optional[dict[str, "SchemaOrBool"]] = None
153
+ additionalProperties: Optional["SchemaOrBool"] = None
154
+ propertyNames: Optional["SchemaOrBool"] = None
155
+ unevaluatedItems: Optional["SchemaOrBool"] = None
156
+ unevaluatedProperties: Optional["SchemaOrBool"] = None
157
+ # Ref: JSON Schema Validation 2020-12: https://json-schema.org/draft/2020-12/json-schema-validation.html#name-a-vocabulary-for-structural
158
+ # A Vocabulary for Structural Validation
159
+ type: Optional[Union[SchemaType, list[SchemaType]]] = None
160
+ enum: Optional[list[Any]] = None
161
+ const: Optional[Any] = None
162
+ multipleOf: Optional[float] = Field(default=None, gt=0)
163
+ maximum: Optional[float] = None
164
+ exclusiveMaximum: Optional[float] = None
165
+ minimum: Optional[float] = None
166
+ exclusiveMinimum: Optional[float] = None
167
+ maxLength: Optional[int] = Field(default=None, ge=0)
168
+ minLength: Optional[int] = Field(default=None, ge=0)
169
+ pattern: Optional[str] = None
170
+ maxItems: Optional[int] = Field(default=None, ge=0)
171
+ minItems: Optional[int] = Field(default=None, ge=0)
172
+ uniqueItems: Optional[bool] = None
173
+ maxContains: Optional[int] = Field(default=None, ge=0)
174
+ minContains: Optional[int] = Field(default=None, ge=0)
175
+ maxProperties: Optional[int] = Field(default=None, ge=0)
176
+ minProperties: Optional[int] = Field(default=None, ge=0)
177
+ required: Optional[list[str]] = None
178
+ dependentRequired: Optional[dict[str, set[str]]] = None
179
+ # Ref: JSON Schema Validation 2020-12: https://json-schema.org/draft/2020-12/json-schema-validation.html#name-vocabularies-for-semantic-c
180
+ # Vocabularies for Semantic Content With "format"
181
+ format: Optional[str] = None
182
+ # Ref: JSON Schema Validation 2020-12: https://json-schema.org/draft/2020-12/json-schema-validation.html#name-a-vocabulary-for-the-conten
183
+ # A Vocabulary for the Contents of String-Encoded Data
184
+ contentEncoding: Optional[str] = None
185
+ contentMediaType: Optional[str] = None
186
+ contentSchema: Optional["SchemaOrBool"] = None
187
+ # Ref: JSON Schema Validation 2020-12: https://json-schema.org/draft/2020-12/json-schema-validation.html#name-a-vocabulary-for-basic-meta
188
+ # A Vocabulary for Basic Meta-Data Annotations
189
+ title: Optional[str] = None
190
+ description: Optional[str] = None
191
+ default: Optional[Any] = None
192
+ deprecated: Optional[bool] = None
193
+ readOnly: Optional[bool] = None
194
+ writeOnly: Optional[bool] = None
195
+ examples: Optional[list[Any]] = None
196
+ # Ref: OpenAPI 3.1.0: https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#schema-object
197
+ # Schema Object
198
+ discriminator: Optional[Discriminator] = None
199
+ xml: Optional[XML] = None
200
+ externalDocs: Optional[ExternalDocumentation] = None
201
+ example: Annotated[
202
+ Optional[Any],
203
+ typing_deprecated(
204
+ "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, "
205
+ "although still supported. Use examples instead."
206
+ ),
207
+ ] = None
208
+
209
+
210
+ # Ref: https://json-schema.org/draft/2020-12/json-schema-core.html#name-json-schema-documents
211
+ # A JSON Schema MUST be an object or a boolean.
212
+ SchemaOrBool = Union[Schema, bool]
213
+
214
+
215
+ class Example(TypedDict, total=False):
216
+ summary: Optional[str]
217
+ description: Optional[str]
218
+ value: Optional[Any]
219
+ externalValue: Optional[AnyUrl]
220
+
221
+ __pydantic_config__ = {"extra": "allow"} # type: ignore[misc]
222
+
223
+
224
+ class ParameterInType(Enum):
225
+ query = "query"
226
+ header = "header"
227
+ path = "path"
228
+ cookie = "cookie"
229
+
230
+
231
+ class Encoding(BaseModelWithConfig):
232
+ contentType: Optional[str] = None
233
+ headers: Optional[dict[str, Union["Header", Reference]]] = None
234
+ style: Optional[str] = None
235
+ explode: Optional[bool] = None
236
+ allowReserved: Optional[bool] = None
237
+
238
+
239
+ class MediaType(BaseModelWithConfig):
240
+ schema_: Optional[Union[Schema, Reference]] = Field(default=None, alias="schema")
241
+ example: Optional[Any] = None
242
+ examples: Optional[dict[str, Union[Example, Reference]]] = None
243
+ encoding: Optional[dict[str, Encoding]] = None
244
+
245
+
246
+ class ParameterBase(BaseModelWithConfig):
247
+ description: Optional[str] = None
248
+ required: Optional[bool] = None
249
+ deprecated: Optional[bool] = None
250
+ # Serialization rules for simple scenarios
251
+ style: Optional[str] = None
252
+ explode: Optional[bool] = None
253
+ allowReserved: Optional[bool] = None
254
+ schema_: Optional[Union[Schema, Reference]] = Field(default=None, alias="schema")
255
+ example: Optional[Any] = None
256
+ examples: Optional[dict[str, Union[Example, Reference]]] = None
257
+ # Serialization rules for more complex scenarios
258
+ content: Optional[dict[str, MediaType]] = None
259
+
260
+
261
+ class Parameter(ParameterBase):
262
+ name: str
263
+ in_: ParameterInType = Field(alias="in")
264
+
265
+
266
+ class Header(ParameterBase):
267
+ pass
268
+
269
+
270
+ class RequestBody(BaseModelWithConfig):
271
+ description: Optional[str] = None
272
+ content: dict[str, MediaType]
273
+ required: Optional[bool] = None
274
+
275
+
276
+ class Link(BaseModelWithConfig):
277
+ operationRef: Optional[str] = None
278
+ operationId: Optional[str] = None
279
+ parameters: Optional[dict[str, Union[Any, str]]] = None
280
+ requestBody: Optional[Union[Any, str]] = None
281
+ description: Optional[str] = None
282
+ server: Optional[Server] = None
283
+
284
+
285
+ class Response(BaseModelWithConfig):
286
+ description: str
287
+ headers: Optional[dict[str, Union[Header, Reference]]] = None
288
+ content: Optional[dict[str, MediaType]] = None
289
+ links: Optional[dict[str, Union[Link, Reference]]] = None
290
+
291
+
292
+ class Operation(BaseModelWithConfig):
293
+ tags: Optional[list[str]] = None
294
+ summary: Optional[str] = None
295
+ description: Optional[str] = None
296
+ externalDocs: Optional[ExternalDocumentation] = None
297
+ operationId: Optional[str] = None
298
+ parameters: Optional[list[Union[Parameter, Reference]]] = None
299
+ requestBody: Optional[Union[RequestBody, Reference]] = None
300
+ # Using Any for Specification Extensions
301
+ responses: Optional[dict[str, Union[Response, Any]]] = None
302
+ callbacks: Optional[dict[str, Union[dict[str, "PathItem"], Reference]]] = None
303
+ deprecated: Optional[bool] = None
304
+ security: Optional[list[dict[str, list[str]]]] = None
305
+ servers: Optional[list[Server]] = None
306
+
307
+
308
+ class PathItem(BaseModelWithConfig):
309
+ ref: Optional[str] = Field(default=None, alias="$ref")
310
+ summary: Optional[str] = None
311
+ description: Optional[str] = None
312
+ get: Optional[Operation] = None
313
+ put: Optional[Operation] = None
314
+ post: Optional[Operation] = None
315
+ delete: Optional[Operation] = None
316
+ options: Optional[Operation] = None
317
+ head: Optional[Operation] = None
318
+ patch: Optional[Operation] = None
319
+ trace: Optional[Operation] = None
320
+ servers: Optional[list[Server]] = None
321
+ parameters: Optional[list[Union[Parameter, Reference]]] = None
322
+
323
+
324
+ class SecuritySchemeType(Enum):
325
+ apiKey = "apiKey"
326
+ http = "http"
327
+ oauth2 = "oauth2"
328
+ openIdConnect = "openIdConnect"
329
+
330
+
331
+ class SecurityBase(BaseModelWithConfig):
332
+ type_: SecuritySchemeType = Field(alias="type")
333
+ description: Optional[str] = None
334
+
335
+
336
+ class APIKeyIn(Enum):
337
+ query = "query"
338
+ header = "header"
339
+ cookie = "cookie"
340
+
341
+
342
+ class APIKey(SecurityBase):
343
+ type_: SecuritySchemeType = Field(default=SecuritySchemeType.apiKey, alias="type")
344
+ in_: APIKeyIn = Field(alias="in")
345
+ name: str
346
+
347
+
348
+ class HTTPBase(SecurityBase):
349
+ type_: SecuritySchemeType = Field(default=SecuritySchemeType.http, alias="type")
350
+ scheme: str
351
+
352
+
353
+ class HTTPBearer(HTTPBase):
354
+ scheme: Literal["bearer"] = "bearer"
355
+ bearerFormat: Optional[str] = None
356
+
357
+
358
+ class OAuthFlow(BaseModelWithConfig):
359
+ refreshUrl: Optional[str] = None
360
+ scopes: dict[str, str] = {}
361
+
362
+
363
+ class OAuthFlowImplicit(OAuthFlow):
364
+ authorizationUrl: str
365
+
366
+
367
+ class OAuthFlowPassword(OAuthFlow):
368
+ tokenUrl: str
369
+
370
+
371
+ class OAuthFlowClientCredentials(OAuthFlow):
372
+ tokenUrl: str
373
+
374
+
375
+ class OAuthFlowAuthorizationCode(OAuthFlow):
376
+ authorizationUrl: str
377
+ tokenUrl: str
378
+
379
+
380
+ class OAuthFlows(BaseModelWithConfig):
381
+ implicit: Optional[OAuthFlowImplicit] = None
382
+ password: Optional[OAuthFlowPassword] = None
383
+ clientCredentials: Optional[OAuthFlowClientCredentials] = None
384
+ authorizationCode: Optional[OAuthFlowAuthorizationCode] = None
385
+
386
+
387
+ class OAuth2(SecurityBase):
388
+ type_: SecuritySchemeType = Field(default=SecuritySchemeType.oauth2, alias="type")
389
+ flows: OAuthFlows
390
+
391
+
392
+ class OpenIdConnect(SecurityBase):
393
+ type_: SecuritySchemeType = Field(
394
+ default=SecuritySchemeType.openIdConnect, alias="type"
395
+ )
396
+ openIdConnectUrl: str
397
+
398
+
399
+ SecurityScheme = Union[APIKey, HTTPBase, OAuth2, OpenIdConnect, HTTPBearer]
400
+
401
+
402
+ class Components(BaseModelWithConfig):
403
+ schemas: Optional[dict[str, Union[Schema, Reference]]] = None
404
+ responses: Optional[dict[str, Union[Response, Reference]]] = None
405
+ parameters: Optional[dict[str, Union[Parameter, Reference]]] = None
406
+ examples: Optional[dict[str, Union[Example, Reference]]] = None
407
+ requestBodies: Optional[dict[str, Union[RequestBody, Reference]]] = None
408
+ headers: Optional[dict[str, Union[Header, Reference]]] = None
409
+ securitySchemes: Optional[dict[str, Union[SecurityScheme, Reference]]] = None
410
+ links: Optional[dict[str, Union[Link, Reference]]] = None
411
+ # Using Any for Specification Extensions
412
+ callbacks: Optional[dict[str, Union[dict[str, PathItem], Reference, Any]]] = None
413
+ pathItems: Optional[dict[str, Union[PathItem, Reference]]] = None
414
+
415
+
416
+ class Tag(BaseModelWithConfig):
417
+ name: str
418
+ description: Optional[str] = None
419
+ externalDocs: Optional[ExternalDocumentation] = None
420
+
421
+
422
+ class OpenAPI(BaseModelWithConfig):
423
+ openapi: str
424
+ info: Info
425
+ jsonSchemaDialect: Optional[str] = None
426
+ servers: Optional[list[Server]] = None
427
+ # Using Any for Specification Extensions
428
+ paths: Optional[dict[str, Union[PathItem, Any]]] = None
429
+ webhooks: Optional[dict[str, Union[PathItem, Reference]]] = None
430
+ components: Optional[Components] = None
431
+ security: Optional[list[dict[str, list[str]]]] = None
432
+ tags: Optional[list[Tag]] = None
433
+ externalDocs: Optional[ExternalDocumentation] = None
434
+
435
+
436
+ Schema.model_rebuild()
437
+ Operation.model_rebuild()
438
+ Encoding.model_rebuild()