fastapi 0.116.1__py3-none-any.whl → 0.117.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.

Potentially problematic release.


This version of fastapi might be problematic. Click here for more details.

fastapi/__init__.py CHANGED
@@ -1,6 +1,6 @@
1
1
  """FastAPI framework, high performance, easy to learn, fast to code, ready for production"""
2
2
 
3
- __version__ = "0.116.1"
3
+ __version__ = "0.117.0"
4
4
 
5
5
  from starlette import status as status
6
6
 
fastapi/_compat.py CHANGED
@@ -393,9 +393,10 @@ else:
393
393
  )
394
394
  definitions.update(m_definitions)
395
395
  model_name = model_name_map[model]
396
+ definitions[model_name] = m_schema
397
+ for m_schema in definitions.values():
396
398
  if "description" in m_schema:
397
399
  m_schema["description"] = m_schema["description"].split("\f")[0]
398
- definitions[model_name] = m_schema
399
400
  return definitions
400
401
 
401
402
  def is_pv1_scalar_field(field: ModelField) -> bool:
fastapi/applications.py CHANGED
@@ -810,6 +810,32 @@ class FastAPI(Starlette):
810
810
  """
811
811
  ),
812
812
  ] = True,
813
+ openapi_external_docs: Annotated[
814
+ Optional[Dict[str, Any]],
815
+ Doc(
816
+ """
817
+ This field allows you to provide additional external documentation links.
818
+ If provided, it must be a dictionary containing:
819
+
820
+ * `description`: A brief description of the external documentation.
821
+ * `url`: The URL pointing to the external documentation. The value **MUST**
822
+ be a valid URL format.
823
+
824
+ **Example**:
825
+
826
+ ```python
827
+ from fastapi import FastAPI
828
+
829
+ external_docs = {
830
+ "description": "Detailed API Reference",
831
+ "url": "https://example.com/api-docs",
832
+ }
833
+
834
+ app = FastAPI(openapi_external_docs=external_docs)
835
+ ```
836
+ """
837
+ ),
838
+ ] = None,
813
839
  **extra: Annotated[
814
840
  Any,
815
841
  Doc(
@@ -838,6 +864,7 @@ class FastAPI(Starlette):
838
864
  self.swagger_ui_parameters = swagger_ui_parameters
839
865
  self.servers = servers or []
840
866
  self.separate_input_output_schemas = separate_input_output_schemas
867
+ self.openapi_external_docs = openapi_external_docs
841
868
  self.extra = extra
842
869
  self.openapi_version: Annotated[
843
870
  str,
@@ -992,6 +1019,7 @@ class FastAPI(Starlette):
992
1019
  tags=self.openapi_tags,
993
1020
  servers=self.servers,
994
1021
  separate_input_output_schemas=self.separate_input_output_schemas,
1022
+ external_docs=self.openapi_external_docs,
995
1023
  )
996
1024
  return self.openapi_schema
997
1025
 
@@ -1,4 +1,5 @@
1
1
  import inspect
2
+ import sys
2
3
  from contextlib import AsyncExitStack, contextmanager
3
4
  from copy import copy, deepcopy
4
5
  from dataclasses import dataclass
@@ -73,6 +74,11 @@ from starlette.responses import Response
73
74
  from starlette.websockets import WebSocket
74
75
  from typing_extensions import Annotated, get_args, get_origin
75
76
 
77
+ if sys.version_info >= (3, 13): # pragma: no cover
78
+ from inspect import iscoroutinefunction
79
+ else: # pragma: no cover
80
+ from asyncio import iscoroutinefunction
81
+
76
82
  multipart_not_installed_error = (
77
83
  'Form data requires "python-multipart" to be installed. \n'
78
84
  'You can install "python-multipart" with: \n\n'
@@ -248,6 +254,8 @@ def get_typed_annotation(annotation: Any, globalns: Dict[str, Any]) -> Any:
248
254
  if isinstance(annotation, str):
249
255
  annotation = ForwardRef(annotation)
250
256
  annotation = evaluate_forwardref(annotation, globalns, globalns)
257
+ if annotation is type(None):
258
+ return None
251
259
  return annotation
252
260
 
253
261
 
@@ -529,11 +537,11 @@ def add_param_to_fields(*, field: ModelField, dependant: Dependant) -> None:
529
537
 
530
538
  def is_coroutine_callable(call: Callable[..., Any]) -> bool:
531
539
  if inspect.isroutine(call):
532
- return inspect.iscoroutinefunction(call)
540
+ return iscoroutinefunction(call)
533
541
  if inspect.isclass(call):
534
542
  return False
535
543
  dunder_call = getattr(call, "__call__", None) # noqa: B004
536
- return inspect.iscoroutinefunction(dunder_call)
544
+ return iscoroutinefunction(dunder_call)
537
545
 
538
546
 
539
547
  def is_async_gen_callable(call: Callable[..., Any]) -> bool:
@@ -587,7 +595,8 @@ async def solve_dependencies(
587
595
  response = Response()
588
596
  del response.headers["content-length"]
589
597
  response.status_code = None # type: ignore
590
- dependency_cache = dependency_cache or {}
598
+ if dependency_cache is None:
599
+ dependency_cache = {}
591
600
  sub_dependant: Dependant
592
601
  for sub_dependant in dependant.dependencies:
593
602
  sub_dependant.call = cast(Callable[..., Any], sub_dependant.call)
@@ -624,7 +633,6 @@ async def solve_dependencies(
624
633
  embed_body_fields=embed_body_fields,
625
634
  )
626
635
  background_tasks = solved_result.background_tasks
627
- dependency_cache.update(solved_result.dependency_cache)
628
636
  if solved_result.errors:
629
637
  errors.extend(solved_result.errors)
630
638
  continue
@@ -916,7 +924,11 @@ async def request_body_to_args(
916
924
 
917
925
  fields_to_extract: List[ModelField] = body_fields
918
926
 
919
- if single_not_embedded_field and lenient_issubclass(first_field.type_, BaseModel):
927
+ if (
928
+ single_not_embedded_field
929
+ and lenient_issubclass(first_field.type_, BaseModel)
930
+ and isinstance(received_body, FormData)
931
+ ):
920
932
  fields_to_extract = get_cached_model_fields(first_field.type_)
921
933
 
922
934
  if isinstance(received_body, FormData):
fastapi/encoders.py CHANGED
@@ -219,7 +219,7 @@ def jsonable_encoder(
219
219
  if not PYDANTIC_V2:
220
220
  encoders = getattr(obj.__config__, "json_encoders", {}) # type: ignore[attr-defined]
221
221
  if custom_encoder:
222
- encoders.update(custom_encoder)
222
+ encoders = {**encoders, **custom_encoder}
223
223
  obj_dict = _model_dump(
224
224
  obj,
225
225
  mode="json",
@@ -241,6 +241,7 @@ def jsonable_encoder(
241
241
  sqlalchemy_safe=sqlalchemy_safe,
242
242
  )
243
243
  if dataclasses.is_dataclass(obj):
244
+ assert not isinstance(obj, type)
244
245
  obj_dict = dataclasses.asdict(obj)
245
246
  return jsonable_encoder(
246
247
  obj_dict,
@@ -5,7 +5,7 @@ from fastapi.websockets import WebSocket
5
5
  from starlette.exceptions import HTTPException
6
6
  from starlette.requests import Request
7
7
  from starlette.responses import JSONResponse, Response
8
- from starlette.status import HTTP_422_UNPROCESSABLE_ENTITY, WS_1008_POLICY_VIOLATION
8
+ from starlette.status import WS_1008_POLICY_VIOLATION
9
9
 
10
10
 
11
11
  async def http_exception_handler(request: Request, exc: HTTPException) -> Response:
@@ -21,7 +21,7 @@ async def request_validation_exception_handler(
21
21
  request: Request, exc: RequestValidationError
22
22
  ) -> JSONResponse:
23
23
  return JSONResponse(
24
- status_code=HTTP_422_UNPROCESSABLE_ENTITY,
24
+ status_code=422,
25
25
  content={"detail": jsonable_encoder(exc.errors())},
26
26
  )
27
27
 
fastapi/openapi/models.py CHANGED
@@ -121,6 +121,12 @@ class ExternalDocumentation(BaseModelWithConfig):
121
121
  url: AnyUrl
122
122
 
123
123
 
124
+ # Ref JSON Schema 2020-12: https://json-schema.org/draft/2020-12/json-schema-validation#name-type
125
+ SchemaType = Literal[
126
+ "array", "boolean", "integer", "null", "number", "object", "string"
127
+ ]
128
+
129
+
124
130
  class Schema(BaseModelWithConfig):
125
131
  # Ref: JSON Schema 2020-12: https://json-schema.org/draft/2020-12/json-schema-core.html#name-the-json-schema-core-vocabu
126
132
  # Core Vocabulary
@@ -145,7 +151,7 @@ class Schema(BaseModelWithConfig):
145
151
  dependentSchemas: Optional[Dict[str, "SchemaOrBool"]] = None
146
152
  prefixItems: Optional[List["SchemaOrBool"]] = None
147
153
  # TODO: uncomment and remove below when deprecating Pydantic v1
148
- # It generales a list of schemas for tuples, before prefixItems was available
154
+ # It generates a list of schemas for tuples, before prefixItems was available
149
155
  # items: Optional["SchemaOrBool"] = None
150
156
  items: Optional[Union["SchemaOrBool", List["SchemaOrBool"]]] = None
151
157
  contains: Optional["SchemaOrBool"] = None
@@ -157,7 +163,7 @@ class Schema(BaseModelWithConfig):
157
163
  unevaluatedProperties: Optional["SchemaOrBool"] = None
158
164
  # Ref: JSON Schema Validation 2020-12: https://json-schema.org/draft/2020-12/json-schema-validation.html#name-a-vocabulary-for-structural
159
165
  # A Vocabulary for Structural Validation
160
- type: Optional[str] = None
166
+ type: Optional[Union[SchemaType, List[SchemaType]]] = None
161
167
  enum: Optional[List[Any]] = None
162
168
  const: Optional[Any] = None
163
169
  multipleOf: Optional[float] = Field(default=None, gt=0)
fastapi/openapi/utils.py CHANGED
@@ -35,7 +35,6 @@ from fastapi.utils import (
35
35
  from pydantic import BaseModel
36
36
  from starlette.responses import JSONResponse
37
37
  from starlette.routing import BaseRoute
38
- from starlette.status import HTTP_422_UNPROCESSABLE_ENTITY
39
38
  from typing_extensions import Literal
40
39
 
41
40
  validation_error_definition = {
@@ -416,7 +415,7 @@ def get_openapi_path(
416
415
  )
417
416
  deep_dict_update(openapi_response, process_response)
418
417
  openapi_response["description"] = description
419
- http422 = str(HTTP_422_UNPROCESSABLE_ENTITY)
418
+ http422 = "422"
420
419
  all_route_params = get_flat_params(route.dependant)
421
420
  if (all_route_params or route.body_field) and not any(
422
421
  status in operation["responses"]
@@ -489,6 +488,7 @@ def get_openapi(
489
488
  contact: Optional[Dict[str, Union[str, Any]]] = None,
490
489
  license_info: Optional[Dict[str, Union[str, Any]]] = None,
491
490
  separate_input_output_schemas: bool = True,
491
+ external_docs: Optional[Dict[str, Any]] = None,
492
492
  ) -> Dict[str, Any]:
493
493
  info: Dict[str, Any] = {"title": title, "version": version}
494
494
  if summary:
@@ -566,4 +566,6 @@ def get_openapi(
566
566
  output["webhooks"] = webhook_paths
567
567
  if tags:
568
568
  output["tags"] = tags
569
+ if external_docs:
570
+ output["externalDocs"] = external_docs
569
571
  return jsonable_encoder(OpenAPI(**output), by_alias=True, exclude_none=True) # type: ignore
fastapi/routing.py CHANGED
@@ -1,8 +1,8 @@
1
- import asyncio
2
1
  import dataclasses
3
2
  import email.message
4
3
  import inspect
5
4
  import json
5
+ import sys
6
6
  from contextlib import AsyncExitStack, asynccontextmanager
7
7
  from enum import Enum, IntEnum
8
8
  from typing import (
@@ -76,6 +76,11 @@ from starlette.types import AppType, ASGIApp, Lifespan, Scope
76
76
  from starlette.websockets import WebSocket
77
77
  from typing_extensions import Annotated, Doc, deprecated
78
78
 
79
+ if sys.version_info >= (3, 13): # pragma: no cover
80
+ from inspect import iscoroutinefunction
81
+ else: # pragma: no cover
82
+ from asyncio import iscoroutinefunction
83
+
79
84
 
80
85
  def _prepare_response_content(
81
86
  res: Any,
@@ -120,6 +125,7 @@ def _prepare_response_content(
120
125
  for k, v in res.items()
121
126
  }
122
127
  elif dataclasses.is_dataclass(res):
128
+ assert not isinstance(res, type)
123
129
  return dataclasses.asdict(res)
124
130
  return res
125
131
 
@@ -231,7 +237,7 @@ def get_request_handler(
231
237
  embed_body_fields: bool = False,
232
238
  ) -> Callable[[Request], Coroutine[Any, Any, Response]]:
233
239
  assert dependant.call is not None, "dependant.call must be a function"
234
- is_coroutine = asyncio.iscoroutinefunction(dependant.call)
240
+ is_coroutine = iscoroutinefunction(dependant.call)
235
241
  is_body_form = body_field and isinstance(body_field.field_info, params.Form)
236
242
  if isinstance(response_class, DefaultPlaceholder):
237
243
  actual_response_class: Type[Response] = response_class.value
@@ -100,7 +100,7 @@ class APIKeyQuery(APIKeyBase):
100
100
  ] = True,
101
101
  ):
102
102
  self.model: APIKey = APIKey(
103
- **{"in": APIKeyIn.query}, # type: ignore[arg-type]
103
+ **{"in": APIKeyIn.query},
104
104
  name=name,
105
105
  description=description,
106
106
  )
@@ -188,7 +188,7 @@ class APIKeyHeader(APIKeyBase):
188
188
  ] = True,
189
189
  ):
190
190
  self.model: APIKey = APIKey(
191
- **{"in": APIKeyIn.header}, # type: ignore[arg-type]
191
+ **{"in": APIKeyIn.header},
192
192
  name=name,
193
193
  description=description,
194
194
  )
@@ -276,7 +276,7 @@ class APIKeyCookie(APIKeyBase):
276
276
  ] = True,
277
277
  ):
278
278
  self.model: APIKey = APIKey(
279
- **{"in": APIKeyIn.cookie}, # type: ignore[arg-type]
279
+ **{"in": APIKeyIn.cookie},
280
280
  name=name,
281
281
  description=description,
282
282
  )
fastapi/utils.py CHANGED
@@ -137,6 +137,7 @@ def create_cloned_field(
137
137
  new_field.alias = field.alias # type: ignore[misc]
138
138
  new_field.class_validators = field.class_validators # type: ignore[attr-defined]
139
139
  new_field.default = field.default # type: ignore[misc]
140
+ new_field.default_factory = field.default_factory # type: ignore[attr-defined]
140
141
  new_field.required = field.required # type: ignore[misc]
141
142
  new_field.model_config = field.model_config # type: ignore[attr-defined]
142
143
  new_field.field_info = field.field_info
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fastapi
3
- Version: 0.116.1
3
+ Version: 0.117.0
4
4
  Summary: FastAPI framework, high performance, easy to learn, fast to code, ready for production
5
5
  Author-Email: =?utf-8?q?Sebasti=C3=A1n_Ram=C3=ADrez?= <tiangolo@gmail.com>
6
6
  Classifier: Intended Audience :: Information Technology
@@ -38,26 +38,26 @@ Project-URL: Repository, https://github.com/fastapi/fastapi
38
38
  Project-URL: Issues, https://github.com/fastapi/fastapi/issues
39
39
  Project-URL: Changelog, https://fastapi.tiangolo.com/release-notes/
40
40
  Requires-Python: >=3.8
41
- Requires-Dist: starlette<0.48.0,>=0.40.0
41
+ Requires-Dist: starlette<0.49.0,>=0.40.0
42
42
  Requires-Dist: pydantic!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,!=2.1.0,<3.0.0,>=1.7.4
43
43
  Requires-Dist: typing-extensions>=4.8.0
44
44
  Provides-Extra: standard
45
45
  Requires-Dist: fastapi-cli[standard]>=0.0.8; extra == "standard"
46
- Requires-Dist: httpx>=0.23.0; extra == "standard"
46
+ Requires-Dist: httpx<1.0.0,>=0.23.0; extra == "standard"
47
47
  Requires-Dist: jinja2>=3.1.5; extra == "standard"
48
48
  Requires-Dist: python-multipart>=0.0.18; extra == "standard"
49
49
  Requires-Dist: email-validator>=2.0.0; extra == "standard"
50
50
  Requires-Dist: uvicorn[standard]>=0.12.0; extra == "standard"
51
51
  Provides-Extra: standard-no-fastapi-cloud-cli
52
52
  Requires-Dist: fastapi-cli[standard-no-fastapi-cloud-cli]>=0.0.8; extra == "standard-no-fastapi-cloud-cli"
53
- Requires-Dist: httpx>=0.23.0; extra == "standard-no-fastapi-cloud-cli"
53
+ Requires-Dist: httpx<1.0.0,>=0.23.0; extra == "standard-no-fastapi-cloud-cli"
54
54
  Requires-Dist: jinja2>=3.1.5; extra == "standard-no-fastapi-cloud-cli"
55
55
  Requires-Dist: python-multipart>=0.0.18; extra == "standard-no-fastapi-cloud-cli"
56
56
  Requires-Dist: email-validator>=2.0.0; extra == "standard-no-fastapi-cloud-cli"
57
57
  Requires-Dist: uvicorn[standard]>=0.12.0; extra == "standard-no-fastapi-cloud-cli"
58
58
  Provides-Extra: all
59
59
  Requires-Dist: fastapi-cli[standard]>=0.0.8; extra == "all"
60
- Requires-Dist: httpx>=0.23.0; extra == "all"
60
+ Requires-Dist: httpx<1.0.0,>=0.23.0; extra == "all"
61
61
  Requires-Dist: jinja2>=3.1.5; extra == "all"
62
62
  Requires-Dist: python-multipart>=0.0.18; extra == "all"
63
63
  Requires-Dist: itsdangerous>=1.1.0; extra == "all"
@@ -119,7 +119,6 @@ The key features are:
119
119
  <!-- sponsors -->
120
120
 
121
121
  <a href="https://blockbee.io?ref=fastapi" target="_blank" title="BlockBee Cryptocurrency Payment Gateway"><img src="https://fastapi.tiangolo.com/img/sponsors/blockbee.png"></a>
122
- <a href="https://platform.sh/try-it-now/?utm_source=fastapi-signup&utm_medium=banner&utm_campaign=FastAPI-signup-June-2023" target="_blank" title="Build, run and scale your apps on a modern, reliable, and secure PaaS."><img src="https://fastapi.tiangolo.com/img/sponsors/platform-sh.png"></a>
123
122
  <a href="https://github.com/scalar/scalar/?utm_source=fastapi&utm_medium=website&utm_campaign=main-badge" target="_blank" title="Scalar: Beautiful Open-Source API References from Swagger/OpenAPI files"><img src="https://fastapi.tiangolo.com/img/sponsors/scalar.svg"></a>
124
123
  <a href="https://www.propelauth.com/?utm_source=fastapi&utm_campaign=1223&utm_medium=mainbadge" target="_blank" title="Auth, user management and more for your B2B product"><img src="https://fastapi.tiangolo.com/img/sponsors/propelauth.png"></a>
125
124
  <a href="https://zuplo.link/fastapi-gh" target="_blank" title="Zuplo: Deploy, Secure, Document, and Monetize your FastAPI"><img src="https://fastapi.tiangolo.com/img/sponsors/zuplo.png"></a>
@@ -127,7 +126,8 @@ The key features are:
127
126
  <a href="https://docs.render.com/deploy-fastapi?utm_source=deploydoc&utm_medium=referral&utm_campaign=fastapi" target="_blank" title="Deploy & scale any full-stack web app on Render. Focus on building apps, not infra."><img src="https://fastapi.tiangolo.com/img/sponsors/render.svg"></a>
128
127
  <a href="https://www.coderabbit.ai/?utm_source=fastapi&utm_medium=badge&utm_campaign=fastapi" target="_blank" title="Cut Code Review Time & Bugs in Half with CodeRabbit"><img src="https://fastapi.tiangolo.com/img/sponsors/coderabbit.png"></a>
129
128
  <a href="https://subtotal.com/?utm_source=fastapi&utm_medium=sponsorship&utm_campaign=open-source" target="_blank" title="The Gold Standard in Retail Account Linking"><img src="https://fastapi.tiangolo.com/img/sponsors/subtotal.svg"></a>
130
- <a href="https://databento.com/" target="_blank" title="Pay as you go for market data"><img src="https://fastapi.tiangolo.com/img/sponsors/databento.svg"></a>
129
+ <a href="https://docs.railway.com/guides/fastapi?utm_medium=integration&utm_source=docs&utm_campaign=fastapi" target="_blank" title="Deploy enterprise applications at startup speed"><img src="https://fastapi.tiangolo.com/img/sponsors/railway.png"></a>
130
+ <a href="https://databento.com/?utm_source=fastapi&utm_medium=sponsor&utm_content=display" target="_blank" title="Pay as you go for market data"><img src="https://fastapi.tiangolo.com/img/sponsors/databento.svg"></a>
131
131
  <a href="https://speakeasy.com/editor?utm_source=fastapi+repo&utm_medium=github+sponsorship" target="_blank" title="SDKs for your API | Speakeasy"><img src="https://fastapi.tiangolo.com/img/sponsors/speakeasy.png"></a>
132
132
  <a href="https://www.svix.com/" target="_blank" title="Svix - Webhooks as a service"><img src="https://fastapi.tiangolo.com/img/sponsors/svix.svg"></a>
133
133
  <a href="https://www.stainlessapi.com/?utm_source=fastapi&utm_medium=referral" target="_blank" title="Stainless | Generate best-in-class SDKs"><img src="https://fastapi.tiangolo.com/img/sponsors/stainless.png"></a>
@@ -161,7 +161,7 @@ The key features are:
161
161
 
162
162
  "_I’m over the moon excited about **FastAPI**. It’s so fun!_"
163
163
 
164
- <div style="text-align: right; margin-right: 10%;">Brian Okken - <strong><a href="https://pythonbytes.fm/episodes/show/123/time-to-right-the-py-wrongs?time_in_sec=855" target="_blank">Python Bytes</a> podcast host</strong> <a href="https://twitter.com/brianokken/status/1112220079972728832" target="_blank"><small>(ref)</small></a></div>
164
+ <div style="text-align: right; margin-right: 10%;">Brian Okken - <strong><a href="https://pythonbytes.fm/episodes/show/123/time-to-right-the-py-wrongs?time_in_sec=855" target="_blank">Python Bytes</a> podcast host</strong> <a href="https://x.com/brianokken/status/1112220079972728832" target="_blank"><small>(ref)</small></a></div>
165
165
 
166
166
  ---
167
167
 
@@ -175,7 +175,7 @@ The key features are:
175
175
 
176
176
  "_We've switched over to **FastAPI** for our **APIs** [...] I think you'll like it [...]_"
177
177
 
178
- <div style="text-align: right; margin-right: 10%;">Ines Montani - Matthew Honnibal - <strong><a href="https://explosion.ai" target="_blank">Explosion AI</a> founders - <a href="https://spacy.io" target="_blank">spaCy</a> creators</strong> <a href="https://twitter.com/_inesmontani/status/1144173225322143744" target="_blank"><small>(ref)</small></a> - <a href="https://twitter.com/honnibal/status/1144031421859655680" target="_blank"><small>(ref)</small></a></div>
178
+ <div style="text-align: right; margin-right: 10%;">Ines Montani - Matthew Honnibal - <strong><a href="https://explosion.ai" target="_blank">Explosion AI</a> founders - <a href="https://spacy.io" target="_blank">spaCy</a> creators</strong> <a href="https://x.com/_inesmontani/status/1144173225322143744" target="_blank"><small>(ref)</small></a> - <a href="https://x.com/honnibal/status/1144031421859655680" target="_blank"><small>(ref)</small></a></div>
179
179
 
180
180
  ---
181
181
 
@@ -1,20 +1,20 @@
1
- fastapi-0.116.1.dist-info/METADATA,sha256=pnu4s6rAsNuB66sYhB59UFxRuZv2ua6fbH_jUM6HM2k,28115
2
- fastapi-0.116.1.dist-info/WHEEL,sha256=9P2ygRxDrTJz3gsagc0Z96ukrxjr-LFBGOgv3AuKlCA,90
3
- fastapi-0.116.1.dist-info/entry_points.txt,sha256=GCf-WbIZxyGT4MUmrPGj1cOHYZoGsNPHAvNkT6hnGeA,61
4
- fastapi-0.116.1.dist-info/licenses/LICENSE,sha256=Tsif_IFIW5f-xYSy1KlhAy7v_oNEU4lP2cEnSQbMdE4,1086
5
- fastapi/__init__.py,sha256=-U8vW9K3Hy78v_3O0ECrEfMmPtSuHaA1yAql96bd8ts,1081
1
+ fastapi-0.117.0.dist-info/METADATA,sha256=a_6-VSmVf3pQTvUR5AD-EYxN8A5jcjUQOXB13_KJk5Q,28135
2
+ fastapi-0.117.0.dist-info/WHEEL,sha256=9P2ygRxDrTJz3gsagc0Z96ukrxjr-LFBGOgv3AuKlCA,90
3
+ fastapi-0.117.0.dist-info/entry_points.txt,sha256=GCf-WbIZxyGT4MUmrPGj1cOHYZoGsNPHAvNkT6hnGeA,61
4
+ fastapi-0.117.0.dist-info/licenses/LICENSE,sha256=Tsif_IFIW5f-xYSy1KlhAy7v_oNEU4lP2cEnSQbMdE4,1086
5
+ fastapi/__init__.py,sha256=kABrsOHBxqoWBLvbTjMc2bL6XdMxbLNqWWYfXR7AyMU,1081
6
6
  fastapi/__main__.py,sha256=bKePXLdO4SsVSM6r9SVoLickJDcR2c0cTOxZRKq26YQ,37
7
- fastapi/_compat.py,sha256=PwGTZd6d-u2o6YF9M8pQahuBtD_3q3Kpj7vU5-ngChc,24228
8
- fastapi/applications.py,sha256=rZTr0Ix-vdMwh6MQGCI_NC-Ir9lpfIGHHBY-JnNWZ_E,176550
7
+ fastapi/_compat.py,sha256=EQyNY-qrN3cjwI1r69JVAROc2lQCvi6W1we6_7jx_gc,24274
8
+ fastapi/applications.py,sha256=Sr6fkAYFmuyIT4b0Rm33NQzO8oz4-DEc3PLTxp4LJgU,177570
9
9
  fastapi/background.py,sha256=rouLirxUANrcYC824MSMypXL_Qb2HYg2YZqaiEqbEKI,1768
10
10
  fastapi/cli.py,sha256=OYhZb0NR_deuT5ofyPF2NoNBzZDNOP8Salef2nk-HqA,418
11
11
  fastapi/concurrency.py,sha256=MirfowoSpkMQZ8j_g0ZxaQKpV6eB3G-dB5TgcXCrgEA,1424
12
12
  fastapi/datastructures.py,sha256=b2PEz77XGq-u3Ur1Inwk0AGjOsQZO49yF9C7IPJ15cY,5766
13
13
  fastapi/dependencies/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
14
  fastapi/dependencies/models.py,sha256=Pjl6vx-4nZ5Tta9kJa3-RfQKkXtCpS09-FhMgs9eWNs,1507
15
- fastapi/dependencies/utils.py,sha256=wGN-BAb0NpG-89nA_OllS0F4wYwGfhHgb8IuT3MTqck,36619
16
- fastapi/encoders.py,sha256=LvwYmFeOz4tVwvgBoC5rvZnbr7hZr73KGrU8O7zSptU,11068
17
- fastapi/exception_handlers.py,sha256=MBrIOA-ugjJDivIi4rSsUJBdTsjuzN76q4yh0q1COKw,1332
15
+ fastapi/dependencies/utils.py,sha256=zcOLg1Y0AHdoHvVbe6mrelzST8tmjFJeoaoHEK9jlyA,36867
16
+ fastapi/encoders.py,sha256=r_fOgMylrlnCDTh3W9u2W0ZsHTJqIhLpU6QipHMy0m8,11119
17
+ fastapi/exception_handlers.py,sha256=YVcT8Zy021VYYeecgdyh5YEUjEIHKcLspbkSf4OfbJI,1275
18
18
  fastapi/exceptions.py,sha256=taNixuFEXb67lI1bnX1ubq8y8TseJ4yoPlWjyP0fTzk,4969
19
19
  fastapi/logger.py,sha256=I9NNi3ov8AcqbsbC9wl1X-hdItKgYt2XTrx1f99Zpl4,54
20
20
  fastapi/middleware/__init__.py,sha256=oQDxiFVcc1fYJUOIFvphnK7pTT5kktmfL32QXpBFvvo,58
@@ -26,16 +26,16 @@ fastapi/middleware/wsgi.py,sha256=Z3Ue-7wni4lUZMvH3G9ek__acgYdJstbnpZX_HQAboY,79
26
26
  fastapi/openapi/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
27
  fastapi/openapi/constants.py,sha256=adGzmis1L1HJRTE3kJ5fmHS_Noq6tIY6pWv_SFzoFDU,153
28
28
  fastapi/openapi/docs.py,sha256=zSDv4xY6XHcKsaG4zyk1HqSnrZtfZFBB0J7ZBk5YHPE,10345
29
- fastapi/openapi/models.py,sha256=PqkxQiqcEgjKuhfUIWPZPQcyTcubtUCB3vcObLsB7VE,15397
30
- fastapi/openapi/utils.py,sha256=e00G_p0IdpiffBUaq31BUyiloXbpld8RryKYnYKisdY,23964
29
+ fastapi/openapi/models.py,sha256=m1BNHxf_RiDTK1uCfMre6XZN5y7krZNA62QEP_2EV9s,15625
30
+ fastapi/openapi/utils.py,sha256=ZI-nwdT2PtX8kaRPJylZo4LJHjYAcoVGxkd181P75x4,23997
31
31
  fastapi/param_functions.py,sha256=JHNPLIYvoAwdnZZavIVsxOat8x23fX_Kl33reh7HKl8,64019
32
32
  fastapi/params.py,sha256=g450axUBQgQJODdtM7WBxZbQj9Z64inFvadrgHikBbU,28237
33
33
  fastapi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
34
  fastapi/requests.py,sha256=zayepKFcienBllv3snmWI20Gk0oHNVLU4DDhqXBb4LU,142
35
35
  fastapi/responses.py,sha256=QNQQlwpKhQoIPZTTWkpc9d_QGeGZ_aVQPaDV3nQ8m7c,1761
36
- fastapi/routing.py,sha256=-SaOgqaseKw5mlTCk-FliS6Wx5la_CjdV5FqSPDmW9g,176337
36
+ fastapi/routing.py,sha256=4zaZIdeq8VtsBLCxmmEgnfHqDD6USTc_l8BxUe1ye4M,176533
37
37
  fastapi/security/__init__.py,sha256=bO8pNmxqVRXUjfl2mOKiVZLn0FpBQ61VUYVjmppnbJw,881
38
- fastapi/security/api_key.py,sha256=cBI5Z4zWVjL1uJrsjTeLy7MafHPAO2HQPzTrpyoIYWA,9094
38
+ fastapi/security/api_key.py,sha256=di-0gQ8MKugi2YfmlMoDHk-QMF_vnLGJRFOA6tcZ7fA,9016
39
39
  fastapi/security/base.py,sha256=dl4pvbC-RxjfbWgPtCWd8MVU-7CB2SZ22rJDXVCXO6c,141
40
40
  fastapi/security/http.py,sha256=rWR2x-5CUsjWmRucYthwRig6MG1o-boyrr4Xo-PuuxU,13606
41
41
  fastapi/security/oauth2.py,sha256=M1AFIDT7G3oQChq83poI3eg8ZDeibcvnGmya2CTS7JY,22036
@@ -45,6 +45,6 @@ fastapi/staticfiles.py,sha256=iirGIt3sdY2QZXd36ijs3Cj-T0FuGFda3cd90kM9Ikw,69
45
45
  fastapi/templating.py,sha256=4zsuTWgcjcEainMJFAlW6-gnslm6AgOS1SiiDWfmQxk,76
46
46
  fastapi/testclient.py,sha256=nBvaAmX66YldReJNZXPOk1sfuo2Q6hs8bOvIaCep6LQ,66
47
47
  fastapi/types.py,sha256=nFb36sK3DSoqoyo7Miwy3meKK5UdFBgkAgLSzQlUVyI,383
48
- fastapi/utils.py,sha256=y8Bj5ttMaI9tS4D60OUgXqKnktBr99NdYUnHHV9LgoY,7948
48
+ fastapi/utils.py,sha256=S59stPvKPUJ7MSkke3FaegSyig_4Uwhd32jnLiMF1jE,8032
49
49
  fastapi/websockets.py,sha256=419uncYObEKZG0YcrXscfQQYLSWoE10jqxVMetGdR98,222
50
- fastapi-0.116.1.dist-info/RECORD,,
50
+ fastapi-0.117.0.dist-info/RECORD,,