From baa5cd2ca6c67c760387c1bf47ef56037c94343c Mon Sep 17 00:00:00 2001 From: Daniyar Yeralin Date: Wed, 12 Aug 2020 14:37:07 -0400 Subject: [PATCH 01/91] Introduce mapping shapes --- fastapi/dependencies/utils.py | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index 7c9f7e847..d09ccde8f 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -41,7 +41,7 @@ from pydantic.fields import ( SHAPE_TUPLE_ELLIPSIS, FieldInfo, ModelField, - Required, + Required, SHAPE_MAPPING, ) from pydantic.schema import get_annotation_from_field_info from pydantic.typing import ForwardRef, evaluate_forwardref @@ -69,6 +69,13 @@ sequence_shape_to_type = { SHAPE_TUPLE_ELLIPSIS: list, } +mapping_shapes = { + SHAPE_MAPPING +} +mapping_types = (dict) +mapping_shapes_to_type = { + SHAPE_MAPPING: dict +} multipart_not_installed_error = ( 'Form data requires "python-multipart" to be installed. \n' @@ -240,6 +247,20 @@ def is_scalar_sequence_field(field: ModelField) -> bool: return False +def is_scalar_mapping_field(field: ModelField) -> bool: + if (field.shape in mapping_shapes) and not lenient_issubclass( + field.type_, BaseModel + ): + if field.sub_fields is not None: + for sub_field in field.sub_fields: + if not is_scalar_field(sub_field): + return False + return True + if lenient_issubclass(field.type_, mapping_types): + return True + return False + + def get_typed_signature(call: Callable) -> inspect.Signature: signature = inspect.signature(call) globalns = getattr(call, "__globals__", {}) @@ -324,7 +345,8 @@ def get_dependant( add_param_to_fields(field=param_field, dependant=dependant) elif isinstance( param.default, (params.Query, params.Header) - ) and is_scalar_sequence_field(param_field): + ) and (is_scalar_sequence_field(param_field) + or is_scalar_mapping_field(param_field)): add_param_to_fields(field=param_field, dependant=dependant) else: field_info = param_field.field_info @@ -610,6 +632,10 @@ def request_params_to_args( received_params, (QueryParams, Headers) ): value = received_params.getlist(field.alias) or field.default + elif is_scalar_mapping_field(field) and isinstance( + received_params, (QueryParams,) + ): + value = received_params._dict else: value = received_params.get(field.alias) field_info = field.field_info From e8c83f100e35f012ec3716d9341aee56fb8ddb1b Mon Sep 17 00:00:00 2001 From: Daniyar Yeralin Date: Wed, 12 Aug 2020 14:37:24 -0400 Subject: [PATCH 02/91] Cover mapping shapes with tests --- tests/main.py | 7 ++++++- tests/test_query.py | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/tests/main.py b/tests/main.py index d5603d0e6..fdd16f2d2 100644 --- a/tests/main.py +++ b/tests/main.py @@ -1,5 +1,5 @@ import http -from typing import Optional +from typing import Optional, Dict from fastapi import FastAPI, Path, Query @@ -184,6 +184,11 @@ def get_query_param_required(query=Query(...)): return f"foo bar {query}" +@app.get("/query/params") +def get_query_params(queries: Dict[str, int] = Query({})): + return f"foo bar {queries}" + + @app.get("/query/param-required/int") def get_query_param_required_type(query: int = Query(...)): return f"foo bar {query}" diff --git a/tests/test_query.py b/tests/test_query.py index cdbdd1ccd..6c4f4b0e8 100644 --- a/tests/test_query.py +++ b/tests/test_query.py @@ -53,6 +53,8 @@ response_not_valid_int = { ("/query/param-required/int", 422, response_missing), ("/query/param-required/int?query=50", 200, "foo bar 50"), ("/query/param-required/int?query=foo", 422, response_not_valid_int), + ("/query/params?first-query=1&second-query=2", 200, "foo bar {'first-query': 1, " + "'second-query': 2}") ], ) def test_get_path(path, expected_status, expected_response): From ec624a27be2bc9abc9063263fd7a6173ab47f323 Mon Sep 17 00:00:00 2001 From: Daniyar Yeralin Date: Wed, 12 Aug 2020 14:40:38 -0400 Subject: [PATCH 03/91] Format proposed code --- fastapi/dependencies/utils.py | 21 +++++++++------------ tests/main.py | 2 +- tests/test_query.py | 7 +++++-- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index d09ccde8f..843f59bf6 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -34,6 +34,7 @@ from pydantic.error_wrappers import ErrorWrapper from pydantic.errors import MissingError from pydantic.fields import ( SHAPE_LIST, + SHAPE_MAPPING, SHAPE_SEQUENCE, SHAPE_SET, SHAPE_SINGLETON, @@ -41,7 +42,7 @@ from pydantic.fields import ( SHAPE_TUPLE_ELLIPSIS, FieldInfo, ModelField, - Required, SHAPE_MAPPING, + Required, ) from pydantic.schema import get_annotation_from_field_info from pydantic.typing import ForwardRef, evaluate_forwardref @@ -69,13 +70,9 @@ sequence_shape_to_type = { SHAPE_TUPLE_ELLIPSIS: list, } -mapping_shapes = { - SHAPE_MAPPING -} -mapping_types = (dict) -mapping_shapes_to_type = { - SHAPE_MAPPING: dict -} +mapping_shapes = {SHAPE_MAPPING} +mapping_types = dict +mapping_shapes_to_type = {SHAPE_MAPPING: dict} multipart_not_installed_error = ( 'Form data requires "python-multipart" to be installed. \n' @@ -343,10 +340,10 @@ def get_dependant( add_param_to_fields(field=param_field, dependant=dependant) elif is_scalar_field(field=param_field): add_param_to_fields(field=param_field, dependant=dependant) - elif isinstance( - param.default, (params.Query, params.Header) - ) and (is_scalar_sequence_field(param_field) - or is_scalar_mapping_field(param_field)): + elif isinstance(param.default, (params.Query, params.Header)) and ( + is_scalar_sequence_field(param_field) + or is_scalar_mapping_field(param_field) + ): add_param_to_fields(field=param_field, dependant=dependant) else: field_info = param_field.field_info diff --git a/tests/main.py b/tests/main.py index fdd16f2d2..17b380f6d 100644 --- a/tests/main.py +++ b/tests/main.py @@ -1,5 +1,5 @@ import http -from typing import Optional, Dict +from typing import Dict, Optional from fastapi import FastAPI, Path, Query diff --git a/tests/test_query.py b/tests/test_query.py index 6c4f4b0e8..934d34136 100644 --- a/tests/test_query.py +++ b/tests/test_query.py @@ -53,8 +53,11 @@ response_not_valid_int = { ("/query/param-required/int", 422, response_missing), ("/query/param-required/int?query=50", 200, "foo bar 50"), ("/query/param-required/int?query=foo", 422, response_not_valid_int), - ("/query/params?first-query=1&second-query=2", 200, "foo bar {'first-query': 1, " - "'second-query': 2}") + ( + "/query/params?first-query=1&second-query=2", + 200, + "foo bar {'first-query': 1, " "'second-query': 2}", + ), ], ) def test_get_path(path, expected_status, expected_response): From 23740cf5248a1a2e3ad448ce631915f0da0724a4 Mon Sep 17 00:00:00 2001 From: Daniyar Yeralin Date: Wed, 12 Aug 2020 15:02:49 -0400 Subject: [PATCH 04/91] Adapt tests to a new endpoint Remove unused import Add entry to openapi.json Reformat openapi.json --- tests/main.py | 10 ++++---- tests/test_application.py | 35 ++++++++++++++++++++++++++++ tests/test_invalid_sequence_param.py | 14 +---------- 3 files changed, 41 insertions(+), 18 deletions(-) diff --git a/tests/main.py b/tests/main.py index 17b380f6d..7700b4dbc 100644 --- a/tests/main.py +++ b/tests/main.py @@ -184,16 +184,16 @@ def get_query_param_required(query=Query(...)): return f"foo bar {query}" -@app.get("/query/params") -def get_query_params(queries: Dict[str, int] = Query({})): - return f"foo bar {queries}" - - @app.get("/query/param-required/int") def get_query_param_required_type(query: int = Query(...)): return f"foo bar {query}" +@app.get("/query/params") +def get_query_params(queries: Dict[str, int] = Query({})): + return f"foo bar {queries}" + + @app.get("/enum-status-code", status_code=http.HTTPStatus.CREATED) def get_enum_status_code(): return "foo bar" diff --git a/tests/test_application.py b/tests/test_application.py index 5ba737307..dea2524a2 100644 --- a/tests/test_application.py +++ b/tests/test_application.py @@ -1078,6 +1078,41 @@ openapi_schema = { ], } }, + "/query/params": { + "get": { + "summary": "Get Query Params", + "operationId": "get_query_params_query_params_get", + "parameters": [ + { + "required": False, + "schema": { + "title": "Queries", + "type": "object", + "additionalProperties": {"type": "integer"}, + "default": {}, + }, + "name": "queries", + "in": "query", + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + } + }, "/enum-status-code": { "get": { "responses": { diff --git a/tests/test_invalid_sequence_param.py b/tests/test_invalid_sequence_param.py index f00dd7b93..836b5f947 100644 --- a/tests/test_invalid_sequence_param.py +++ b/tests/test_invalid_sequence_param.py @@ -1,4 +1,4 @@ -from typing import Dict, List, Optional, Tuple +from typing import Dict, List, Tuple import pytest from fastapi import FastAPI, Query @@ -39,15 +39,3 @@ def test_invalid_dict(): @app.get("/items/") def read_items(q: Dict[str, Item] = Query(None)): pass # pragma: no cover - - -def test_invalid_simple_dict(): - with pytest.raises(AssertionError): - app = FastAPI() - - class Item(BaseModel): - title: str - - @app.get("/items/") - def read_items(q: Optional[dict] = Query(None)): - pass # pragma: no cover From 279285e4ec5e6ea296f3545bac1d7e4abaa63ca0 Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Mon, 13 Mar 2023 17:09:43 +0000 Subject: [PATCH 05/91] use mapping type --- tests/main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/main.py b/tests/main.py index 3bc4150cc..842a0e745 100644 --- a/tests/main.py +++ b/tests/main.py @@ -1,5 +1,5 @@ import http -from typing import FrozenSet, Optional +from typing import FrozenSet, Mapping, Optional from fastapi import FastAPI, Path, Query @@ -190,7 +190,7 @@ def get_query_param_required_type(query: int = Query()): @app.get("/query/params") -def get_query_params(queries: Dict[str, int] = Query({})): +def get_query_params(queries: Mapping[str, int] = Query({})): return f"foo bar {queries}" From 2b0e941acb035ba880a44c8b407a794a3b5d8403 Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Mon, 13 Mar 2023 18:01:40 +0000 Subject: [PATCH 06/91] change parsing of return values to account for multiple copies of same param --- fastapi/dependencies/utils.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index a881312d7..479a740c6 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -18,6 +18,8 @@ from typing import ( cast, ) +from collections import defaultdict + import anyio from fastapi import params from fastapi.concurrency import ( @@ -253,10 +255,11 @@ def is_scalar_mapping_field(field: ModelField) -> bool: if (field.shape in mapping_shapes) and not lenient_issubclass( field.type_, BaseModel ): - if field.sub_fields is not None: - for sub_field in field.sub_fields: - if not is_scalar_field(sub_field): - return False + if field.sub_fields is None: + return True + for sub_field in field.sub_fields: + if (not is_scalar_field(sub_field)) and (not is_scalar_sequence_field(sub_field)): + return False return True if lenient_issubclass(field.type_, mapping_types): return True @@ -625,7 +628,9 @@ def request_params_to_args( elif is_scalar_mapping_field(field) and isinstance( received_params, (QueryParams,) ): - value = received_params._dict + value = defaultdict(list) + for key, field_value in received_params.multi_items(): + value[key].append(field_value) else: value = received_params.get(field.alias) field_info = field.field_info From 668f96029dbfca983b5fd813a994f5f821446eae Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Mon, 13 Mar 2023 18:01:49 +0000 Subject: [PATCH 07/91] linting --- fastapi/dependencies/utils.py | 1 - 1 file changed, 1 deletion(-) diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index 479a740c6..804a2940a 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -17,7 +17,6 @@ from typing import ( Union, cast, ) - from collections import defaultdict import anyio From ee70593999a92d8e8170367870de9d1a86b14d1c Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Mon, 13 Mar 2023 18:14:18 +0000 Subject: [PATCH 08/91] fix test --- tests/test_invalid_sequence_param.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_invalid_sequence_param.py b/tests/test_invalid_sequence_param.py index f03d18fb5..475786adb 100644 --- a/tests/test_invalid_sequence_param.py +++ b/tests/test_invalid_sequence_param.py @@ -1,4 +1,4 @@ -from typing import Dict, List, Tuple +from typing import Dict, List, Optional, Tuple import pytest from fastapi import FastAPI, Query From fb8a2d5fb2e0b083f03eb65142e210bd1db1761b Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Mon, 13 Mar 2023 18:18:06 +0000 Subject: [PATCH 09/91] import order --- fastapi/dependencies/utils.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index 804a2940a..01fe85c2b 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -1,5 +1,6 @@ import dataclasses import inspect +from collections import defaultdict from contextlib import contextmanager from copy import deepcopy from typing import ( @@ -17,7 +18,6 @@ from typing import ( Union, cast, ) -from collections import defaultdict import anyio from fastapi import params @@ -257,7 +257,9 @@ def is_scalar_mapping_field(field: ModelField) -> bool: if field.sub_fields is None: return True for sub_field in field.sub_fields: - if (not is_scalar_field(sub_field)) and (not is_scalar_sequence_field(sub_field)): + if (not is_scalar_field(sub_field)) and ( + not is_scalar_sequence_field(sub_field) + ): return False return True if lenient_issubclass(field.type_, mapping_types): From 758590f66c5a4810429d869e385f42f0b15ce15f Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Tue, 14 Mar 2023 07:12:38 +0000 Subject: [PATCH 10/91] added sequence params to test cases --- tests/main.py | 7 ++++++- tests/test_application.py | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/tests/main.py b/tests/main.py index 842a0e745..21f0035f5 100644 --- a/tests/main.py +++ b/tests/main.py @@ -1,5 +1,5 @@ import http -from typing import FrozenSet, Mapping, Optional +from typing import FrozenSet, List, Mapping, Optional from fastapi import FastAPI, Path, Query @@ -194,6 +194,11 @@ def get_query_params(queries: Mapping[str, int] = Query({})): return f"foo bar {queries}" +@app.get("/query/sequence-params") +def get_sequence_query_params(queries: Mapping[str, List[int]] = Query({})): + return f"foo bar {queries}" + + @app.get("/enum-status-code", status_code=http.HTTPStatus.CREATED) def get_enum_status_code(): return "foo bar" diff --git a/tests/test_application.py b/tests/test_application.py index c412515db..7bd54f0c4 100644 --- a/tests/test_application.py +++ b/tests/test_application.py @@ -1113,6 +1113,44 @@ openapi_schema = { }, } }, + "/query/sequence-params": { + "get": { + "operationId": "get_sequence_query_params_query_sequence_params_get", + "parameters": [ + { + "in": "query", + "name": "queries", + "required": False, + "schema": { + "additionalProperties": { + "items": {"type": "integer"}, + "type": "array", + }, + "default": {}, + "title": "Queries", + "type": "object", + }, + } + ], + "responses": { + "200": { + "content": {"application/json": {"schema": {}}}, + "description": "Successful " "Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + "description": "Validation " "Error", + }, + }, + "summary": "Get Sequence Query " "Params", + } + }, "/enum-status-code": { "get": { "responses": { From 378d30d18b36c20ac39b6e920caeb078e538b9c1 Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Tue, 14 Mar 2023 07:13:26 +0000 Subject: [PATCH 11/91] handle Map[scalar, List[scalar]] and Map[scalar, scalar] sepaeratly --- fastapi/dependencies/utils.py | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index 01fe85c2b..5002e1a05 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -257,9 +257,22 @@ def is_scalar_mapping_field(field: ModelField) -> bool: if field.sub_fields is None: return True for sub_field in field.sub_fields: - if (not is_scalar_field(sub_field)) and ( - not is_scalar_sequence_field(sub_field) - ): + if not is_scalar_field(sub_field): + return False + return True + if lenient_issubclass(field.type_, mapping_types): + return True + return False + + +def is_scalar_sequence_mapping_field(field: ModelField) -> bool: + if (field.shape in mapping_shapes) and not lenient_issubclass( + field.type_, BaseModel + ): + if field.sub_fields is None: + return True + for sub_field in field.sub_fields: + if not is_scalar_sequence_field(sub_field): return False return True if lenient_issubclass(field.type_, mapping_types): @@ -349,6 +362,7 @@ def get_dependant( elif isinstance(param.default, (params.Query, params.Header)) and ( is_scalar_sequence_field(param_field) or is_scalar_mapping_field(param_field) + or is_scalar_sequence_mapping_field(param_field) ): add_param_to_fields(field=param_field, dependant=dependant) else: @@ -628,10 +642,15 @@ def request_params_to_args( value = received_params.getlist(field.alias) or field.default elif is_scalar_mapping_field(field) and isinstance( received_params, (QueryParams,) + ): + value = dict(received_params.multi_items()) + elif is_scalar_sequence_mapping_field(field) and isinstance( + received_params, (QueryParams,) ): value = defaultdict(list) for key, field_value in received_params.multi_items(): value[key].append(field_value) + value = dict(value) else: value = received_params.get(field.alias) field_info = field.field_info From cfa97c5884dce8183af95a3d1fdf27255a31ec1a Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Tue, 14 Mar 2023 07:13:50 +0000 Subject: [PATCH 12/91] remove check for now-valid sequence param --- tests/test_invalid_sequence_param.py | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/tests/test_invalid_sequence_param.py b/tests/test_invalid_sequence_param.py index 475786adb..cb61cfdce 100644 --- a/tests/test_invalid_sequence_param.py +++ b/tests/test_invalid_sequence_param.py @@ -1,4 +1,4 @@ -from typing import Dict, List, Optional, Tuple +from typing import Dict, List, Tuple import pytest from fastapi import FastAPI, Query @@ -39,15 +39,3 @@ def test_invalid_dict(): @app.get("/items/") def read_items(q: Dict[str, Item] = Query(default=None)): pass # pragma: no cover - - -def test_invalid_simple_dict(): - with pytest.raises(AssertionError): - app = FastAPI() - - class Item(BaseModel): - title: str - - @app.get("/items/") - def read_items(q: Optional[dict] = Query(default=None)): - pass # pragma: no cover From 6d411b53cf69b1e47a115d5ed8e66202b3081ef3 Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Tue, 14 Mar 2023 07:14:12 +0000 Subject: [PATCH 13/91] add test queries for params and sequence params --- tests/test_query.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/test_query.py b/tests/test_query.py index b44e188cd..6fbca4d2c 100644 --- a/tests/test_query.py +++ b/tests/test_query.py @@ -57,7 +57,12 @@ response_not_valid_int = { ( "/query/params?first-query=1&second-query=2", 200, - "foo bar {'first-query': 1, " "'second-query': 2}", + "foo bar {'first-query': 1, 'second-query': 2}", + ), + ( + "/query/sequence-params?first-query=1&first-query=2", + 200, + "foo bar {'first-query': [1, 2]}", ), ], ) From 4e15aa1d124a808a422772b9ffa8e20690c8ce98 Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Tue, 14 Mar 2023 09:08:45 +0000 Subject: [PATCH 14/91] adding tests and restricting mappings to only Mapping type --- fastapi/dependencies/utils.py | 12 ++---------- tests/main.py | 8 ++++---- tests/test_application.py | 8 ++++---- tests/test_query.py | 2 +- 4 files changed, 11 insertions(+), 19 deletions(-) diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index 5002e1a05..ee8b003cc 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -77,8 +77,8 @@ sequence_shape_to_type = { } mapping_shapes = {SHAPE_MAPPING} -mapping_types = dict -mapping_shapes_to_type = {SHAPE_MAPPING: dict} +mapping_types = (Mapping) +mapping_shapes_to_type = {SHAPE_MAPPING: Mapping} multipart_not_installed_error = ( 'Form data requires "python-multipart" to be installed. \n' @@ -254,14 +254,10 @@ def is_scalar_mapping_field(field: ModelField) -> bool: if (field.shape in mapping_shapes) and not lenient_issubclass( field.type_, BaseModel ): - if field.sub_fields is None: - return True for sub_field in field.sub_fields: if not is_scalar_field(sub_field): return False return True - if lenient_issubclass(field.type_, mapping_types): - return True return False @@ -269,14 +265,10 @@ def is_scalar_sequence_mapping_field(field: ModelField) -> bool: if (field.shape in mapping_shapes) and not lenient_issubclass( field.type_, BaseModel ): - if field.sub_fields is None: - return True for sub_field in field.sub_fields: if not is_scalar_sequence_field(sub_field): return False return True - if lenient_issubclass(field.type_, mapping_types): - return True return False diff --git a/tests/main.py b/tests/main.py index 21f0035f5..6040a53b5 100644 --- a/tests/main.py +++ b/tests/main.py @@ -190,13 +190,13 @@ def get_query_param_required_type(query: int = Query()): @app.get("/query/params") -def get_query_params(queries: Mapping[str, int] = Query({})): - return f"foo bar {queries}" +def get_query_params(query: Mapping[str, int] = Query({})): + return f"foo bar {query}" @app.get("/query/sequence-params") -def get_sequence_query_params(queries: Mapping[str, List[int]] = Query({})): - return f"foo bar {queries}" +def get_sequence_query_params(query: Mapping[str, List[int]] = Query({})): + return f"foo bar {query}" @app.get("/enum-status-code", status_code=http.HTTPStatus.CREATED) diff --git a/tests/test_application.py b/tests/test_application.py index 7bd54f0c4..9363e1280 100644 --- a/tests/test_application.py +++ b/tests/test_application.py @@ -1086,12 +1086,12 @@ openapi_schema = { { "required": False, "schema": { - "title": "Queries", + "title": "Query", "type": "object", "additionalProperties": {"type": "integer"}, "default": {}, }, - "name": "queries", + "name": "query", "in": "query", } ], @@ -1119,7 +1119,7 @@ openapi_schema = { "parameters": [ { "in": "query", - "name": "queries", + "name": "query", "required": False, "schema": { "additionalProperties": { @@ -1127,7 +1127,7 @@ openapi_schema = { "type": "array", }, "default": {}, - "title": "Queries", + "title": "Query", "type": "object", }, } diff --git a/tests/test_query.py b/tests/test_query.py index 6fbca4d2c..3e0544bb2 100644 --- a/tests/test_query.py +++ b/tests/test_query.py @@ -63,7 +63,7 @@ response_not_valid_int = { "/query/sequence-params?first-query=1&first-query=2", 200, "foo bar {'first-query': [1, 2]}", - ), + ) ], ) def test_get_path(path, expected_status, expected_response): From 846ae007c8bcaadf5c59cd252dd74af5502fce7e Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Tue, 14 Mar 2023 09:10:43 +0000 Subject: [PATCH 15/91] linting --- fastapi/dependencies/utils.py | 2 +- tests/test_query.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index ee8b003cc..dad7e6562 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -77,7 +77,7 @@ sequence_shape_to_type = { } mapping_shapes = {SHAPE_MAPPING} -mapping_types = (Mapping) +mapping_types = Mapping mapping_shapes_to_type = {SHAPE_MAPPING: Mapping} multipart_not_installed_error = ( diff --git a/tests/test_query.py b/tests/test_query.py index 3e0544bb2..6fbca4d2c 100644 --- a/tests/test_query.py +++ b/tests/test_query.py @@ -63,7 +63,7 @@ response_not_valid_int = { "/query/sequence-params?first-query=1&first-query=2", 200, "foo bar {'first-query': [1, 2]}", - ) + ), ], ) def test_get_path(path, expected_status, expected_response): From 2251c78e146752a876340ea9361206d636bb13c2 Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Tue, 14 Mar 2023 09:14:49 +0000 Subject: [PATCH 16/91] add none check back in --- fastapi/dependencies/utils.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index dad7e6562..97c1f7eaf 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -254,6 +254,8 @@ def is_scalar_mapping_field(field: ModelField) -> bool: if (field.shape in mapping_shapes) and not lenient_issubclass( field.type_, BaseModel ): + if field.sub_fields is None: + return False for sub_field in field.sub_fields: if not is_scalar_field(sub_field): return False @@ -265,6 +267,8 @@ def is_scalar_sequence_mapping_field(field: ModelField) -> bool: if (field.shape in mapping_shapes) and not lenient_issubclass( field.type_, BaseModel ): + if field.sub_fields is None: + return False for sub_field in field.sub_fields: if not is_scalar_sequence_field(sub_field): return False From b0109cd3995317816fa767cb8c5b256e90bc720a Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Tue, 14 Mar 2023 11:10:54 +0000 Subject: [PATCH 17/91] add test for invalid mapping --- fastapi/dependencies/utils.py | 16 ++++++++-------- tests/test_invalid_mapping_param.py | 15 +++++++++++++++ 2 files changed, 23 insertions(+), 8 deletions(-) create mode 100644 tests/test_invalid_mapping_param.py diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index 97c1f7eaf..3d969ed10 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -251,11 +251,11 @@ def is_scalar_sequence_field(field: ModelField) -> bool: def is_scalar_mapping_field(field: ModelField) -> bool: - if (field.shape in mapping_shapes) and not lenient_issubclass( - field.type_, BaseModel + if ( + (field.shape in mapping_shapes) + and not lenient_issubclass(field.type_, BaseModel) + and field.sub_fields is not None ): - if field.sub_fields is None: - return False for sub_field in field.sub_fields: if not is_scalar_field(sub_field): return False @@ -264,11 +264,11 @@ def is_scalar_mapping_field(field: ModelField) -> bool: def is_scalar_sequence_mapping_field(field: ModelField) -> bool: - if (field.shape in mapping_shapes) and not lenient_issubclass( - field.type_, BaseModel + if ( + (field.shape in mapping_shapes) + and not lenient_issubclass(field.type_, BaseModel) + and field.sub_fields is not None ): - if field.sub_fields is None: - return False for sub_field in field.sub_fields: if not is_scalar_sequence_field(sub_field): return False diff --git a/tests/test_invalid_mapping_param.py b/tests/test_invalid_mapping_param.py new file mode 100644 index 000000000..ef49a3218 --- /dev/null +++ b/tests/test_invalid_mapping_param.py @@ -0,0 +1,15 @@ +from typing import Mapping, List + +import pytest +from fastapi import FastAPI, Query +from pydantic import BaseModel + + +def test_invalid_sequence(): + with pytest.raises(AssertionError): + app = FastAPI() + + + @app.get("/items/") + def read_items(q: Mapping[str, List[List[str]]] = Query(default=None)): + pass # pragma: no cover From 3433ddced418e933634fcccb277968dede7cad59 Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Fri, 21 Apr 2023 10:50:44 +0000 Subject: [PATCH 18/91] add mapping shapes --- fastapi/dependencies/utils.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index f131001ce..643e6d81e 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -38,6 +38,7 @@ from pydantic.fields import ( SHAPE_FROZENSET, SHAPE_LIST, SHAPE_SEQUENCE, + SHAPE_MAPPING, SHAPE_SET, SHAPE_SINGLETON, SHAPE_TUPLE, @@ -75,6 +76,9 @@ sequence_shape_to_type = { SHAPE_TUPLE_ELLIPSIS: list, } +mapping_shapes = {SHAPE_MAPPING} +mapping_types = Mapping +mapping_shapes_to_type = {SHAPE_MAPPING: Mapping} multipart_not_installed_error = ( 'Form data requires "python-multipart" to be installed. \n' @@ -245,6 +249,30 @@ def is_scalar_sequence_field(field: ModelField) -> bool: return True return False +def is_scalar_mapping_field(field: ModelField) -> bool: + if (field.shape in mapping_shapes) and not lenient_issubclass( + field.type_, BaseModel + ): + if field.sub_fields is None: + return False + for sub_field in field.sub_fields: + if not is_scalar_field(sub_field): + return False + return True + return False + + +def is_scalar_sequence_mapping_field(field: ModelField) -> bool: + if (field.shape in mapping_shapes) and not lenient_issubclass( + field.type_, BaseModel + ): + if field.sub_fields is None: + return False + for sub_field in field.sub_fields: + if not is_scalar_sequence_field(sub_field): + return False + return True + return False def get_typed_signature(call: Callable[..., Any]) -> inspect.Signature: signature = inspect.signature(call) @@ -488,6 +516,10 @@ def is_body_param(*, param_field: ModelField, is_path_param: bool) -> bool: param_field.field_info, (params.Query, params.Header) ) and is_scalar_sequence_field(param_field): return False + elif isinstance( + param_field.field_info, (params.Query, params.Header) + ) and (is_scalar_sequence_mapping_field(param_field) or is_scalar_mapping_field(param_field)): + return False else: assert isinstance( param_field.field_info, params.Body From 6361e9d83270f564ef1c04cb51b291a50935be0b Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Fri, 21 Apr 2023 11:50:25 +0000 Subject: [PATCH 19/91] working correctly --- fastapi/dependencies/utils.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index 643e6d81e..d94a59d4c 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -1,5 +1,6 @@ import dataclasses import inspect +from collections import defaultdict from contextlib import contextmanager from copy import copy, deepcopy from typing import ( @@ -714,6 +715,19 @@ def request_params_to_args( received_params, (QueryParams, Headers) ): value = received_params.getlist(field.alias) or field.default + if is_scalar_mapping_field(field) and isinstance( + received_params, (QueryParams, Headers) + ): + value = dict(received_params.multi_items()) or field.default + elif is_scalar_sequence_mapping_field(field) and isinstance( + received_params, (QueryParams, Headers) + ): + if not len(received_params.multi_items()): + value = field.default + else: + value = defaultdict(list) + for k, v in received_params.multi_items(): + value[k].append(v) else: value = received_params.get(field.alias) field_info = field.field_info From cc9d9d3f13c71b84636b42086dd067896dca966b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 21 Apr 2023 11:53:42 +0000 Subject: [PATCH 20/91] =?UTF-8?q?=F0=9F=8E=A8=20[pre-commit.ci]=20Auto=20f?= =?UTF-8?q?ormat=20from=20pre-commit.com=20hooks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fastapi/dependencies/utils.py | 12 +++++++----- tests/test_invalid_mapping_param.py | 4 +--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index b3d013241..aa9ed56be 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -40,7 +40,6 @@ from pydantic.fields import ( SHAPE_LIST, SHAPE_MAPPING, SHAPE_SEQUENCE, - SHAPE_MAPPING, SHAPE_SET, SHAPE_SINGLETON, SHAPE_TUPLE, @@ -251,6 +250,7 @@ def is_scalar_sequence_field(field: ModelField) -> bool: return True return False + def is_scalar_mapping_field(field: ModelField) -> bool: if (field.shape in mapping_shapes) and not lenient_issubclass( field.type_, BaseModel @@ -276,6 +276,7 @@ def is_scalar_sequence_mapping_field(field: ModelField) -> bool: return True return False + def is_scalar_mapping_field(field: ModelField) -> bool: if ( (field.shape in mapping_shapes) @@ -544,9 +545,10 @@ def is_body_param(*, param_field: ModelField, is_path_param: bool) -> bool: param_field.field_info, (params.Query, params.Header) ) and is_scalar_sequence_field(param_field): return False - elif isinstance( - param_field.field_info, (params.Query, params.Header) - ) and (is_scalar_sequence_mapping_field(param_field) or is_scalar_mapping_field(param_field)): + elif isinstance(param_field.field_info, (params.Query, params.Header)) and ( + is_scalar_sequence_mapping_field(param_field) + or is_scalar_mapping_field(param_field) + ): return False else: assert isinstance( @@ -751,7 +753,7 @@ def request_params_to_args( ): if not len(received_params.multi_items()): value = field.default - else: + else: value = defaultdict(list) for k, v in received_params.multi_items(): value[k].append(v) diff --git a/tests/test_invalid_mapping_param.py b/tests/test_invalid_mapping_param.py index ef49a3218..249a759d5 100644 --- a/tests/test_invalid_mapping_param.py +++ b/tests/test_invalid_mapping_param.py @@ -1,15 +1,13 @@ -from typing import Mapping, List +from typing import List, Mapping import pytest from fastapi import FastAPI, Query -from pydantic import BaseModel def test_invalid_sequence(): with pytest.raises(AssertionError): app = FastAPI() - @app.get("/items/") def read_items(q: Mapping[str, List[List[str]]] = Query(default=None)): pass # pragma: no cover From 405fe23735dd5779684a65b3d6d20aea93e933ff Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Fri, 7 Jul 2023 19:18:50 +0000 Subject: [PATCH 21/91] add is_scaler_mapping back --- .gitignore | 3 +++ .pre-commit-config.yaml | 2 +- fastapi/_compat.py | 12 ++++++++++++ fastapi/dependencies/utils.py | 2 ++ 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index d380d16b7..c8247162f 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,6 @@ archive.zip *~ .*.sw? .cache + +main.py +.devcontainer diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9f7085f72..f97947a8d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,7 +1,7 @@ # See https://pre-commit.com for more information # See https://pre-commit.com/hooks.html for more hooks default_language_version: - python: python3.10 + python: python3.11 repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.4.0 diff --git a/fastapi/_compat.py b/fastapi/_compat.py index 2233fe33c..8c76a8011 100644 --- a/fastapi/_compat.py +++ b/fastapi/_compat.py @@ -227,6 +227,12 @@ if PYDANTIC_V2: def is_scalar_sequence_field(field: ModelField) -> bool: return field_annotation_is_scalar_sequence(field.field_info.annotation) + + def is_scalar_sequence_mapping_field(field: ModelField) -> bool: + return field_annotation_is_scalar_sequence(field.field_info.annotation) + + def is_scalar_mapping_field(field: ModelField) -> bool: + return field_annotation_is_scalar_sequence(field.field_info.annotation) def is_bytes_field(field: ModelField) -> bool: return is_bytes_or_nonable_bytes_annotation(field.type_) @@ -467,6 +473,12 @@ else: def is_scalar_sequence_field(field: ModelField) -> bool: return is_pv1_scalar_sequence_field(field) + + def is_scalar_sequence_mapping_field(field: ModelField) -> bool: + return is_pv1_scalar_sequence_field(field) + + def is_scalar_mapping_field(field: ModelField) -> bool: + return is_pv1_scalar_sequence_field(field) def is_bytes_field(field: ModelField) -> bool: return lenient_issubclass(field.type_, bytes) diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index 0556325b9..255f58a22 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -37,6 +37,8 @@ from fastapi._compat import ( is_bytes_sequence_field, is_scalar_field, is_scalar_sequence_field, + is_scalar_mapping_field, + is_scalar_sequence_mapping_field, is_sequence_field, is_uploadfile_or_nonable_uploadfile_annotation, is_uploadfile_sequence_annotation, From 3e85d2cda27e48858a57400cea4dfb0ac12eae3c Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Fri, 7 Jul 2023 19:24:24 +0000 Subject: [PATCH 22/91] add pydantic v1 support --- fastapi/_compat.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/fastapi/_compat.py b/fastapi/_compat.py index 8c76a8011..1d9a3738e 100644 --- a/fastapi/_compat.py +++ b/fastapi/_compat.py @@ -331,6 +331,10 @@ else: SHAPE_SEQUENCE, SHAPE_TUPLE_ELLIPSIS, } + + mapping_shapes = { + SHAPE_MAPPING, + } sequence_shape_to_type = { SHAPE_LIST: list, SHAPE_SET: set, @@ -405,6 +409,32 @@ else: if _annotation_is_sequence(field.type_): return True return False + + def is_pv1_scalar_mapping_field(field: ModelField) -> bool: + if (field.shape in mapping_shapes) and not lenient_issubclass( + field.type_, BaseModel + ): + if field.sub_fields is None: + return False + for sub_field in field.sub_fields: + if not is_scalar_field(sub_field): + return False + return True + return False + + + def is_pv1_scalar_sequence_mapping_field(field: ModelField) -> bool: + if (field.shape in mapping_shapes) and not lenient_issubclass( + field.type_, BaseModel + ): + if field.sub_fields is None: + return False + for sub_field in field.sub_fields: + if not is_scalar_sequence_field(sub_field): + return False + return True + return False + def _normalize_errors(errors: Sequence[Any]) -> List[Dict[str, Any]]: use_errors: List[Any] = [] From b11f63c052c004538a000c2e56e52a3740cf4a8c Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Fri, 7 Jul 2023 19:28:45 +0000 Subject: [PATCH 23/91] add mapping --- fastapi/_compat.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/fastapi/_compat.py b/fastapi/_compat.py index 1d9a3738e..7a4622f4b 100644 --- a/fastapi/_compat.py +++ b/fastapi/_compat.py @@ -286,6 +286,7 @@ else: SHAPE_SINGLETON, SHAPE_TUPLE, SHAPE_TUPLE_ELLIPSIS, + SHAPE_MAPPING, ) from pydantic.fields import FieldInfo as FieldInfo from pydantic.fields import ( # type: ignore[no-redef,attr-defined] @@ -332,9 +333,6 @@ else: SHAPE_TUPLE_ELLIPSIS, } - mapping_shapes = { - SHAPE_MAPPING, - } sequence_shape_to_type = { SHAPE_LIST: list, SHAPE_SET: set, @@ -343,6 +341,11 @@ else: SHAPE_TUPLE_ELLIPSIS: list, } + mapping_shapes = { + SHAPE_MAPPING, + } + mapping_shapes_to_type = {SHAPE_MAPPING: Mapping} + @dataclass class GenerateJsonSchema: # type: ignore[no-redef] ref_template: str @@ -505,10 +508,10 @@ else: return is_pv1_scalar_sequence_field(field) def is_scalar_sequence_mapping_field(field: ModelField) -> bool: - return is_pv1_scalar_sequence_field(field) + return is_pv1_scalar_sequence_mapping_field(field) def is_scalar_mapping_field(field: ModelField) -> bool: - return is_pv1_scalar_sequence_field(field) + return is_pv1_scalar_mapping_field(field) def is_bytes_field(field: ModelField) -> bool: return lenient_issubclass(field.type_, bytes) From 168d839114e69d8cf9d9f99626e2c15687c0d851 Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Fri, 7 Jul 2023 19:29:17 +0000 Subject: [PATCH 24/91] fmt --- fastapi/_compat.py | 14 ++++++-------- fastapi/dependencies/utils.py | 2 +- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/fastapi/_compat.py b/fastapi/_compat.py index 7a4622f4b..8fadd6ed3 100644 --- a/fastapi/_compat.py +++ b/fastapi/_compat.py @@ -227,10 +227,10 @@ if PYDANTIC_V2: def is_scalar_sequence_field(field: ModelField) -> bool: return field_annotation_is_scalar_sequence(field.field_info.annotation) - + def is_scalar_sequence_mapping_field(field: ModelField) -> bool: return field_annotation_is_scalar_sequence(field.field_info.annotation) - + def is_scalar_mapping_field(field: ModelField) -> bool: return field_annotation_is_scalar_sequence(field.field_info.annotation) @@ -281,12 +281,12 @@ else: from pydantic.fields import ( # type: ignore[attr-defined] SHAPE_FROZENSET, SHAPE_LIST, + SHAPE_MAPPING, SHAPE_SEQUENCE, SHAPE_SET, SHAPE_SINGLETON, SHAPE_TUPLE, SHAPE_TUPLE_ELLIPSIS, - SHAPE_MAPPING, ) from pydantic.fields import FieldInfo as FieldInfo from pydantic.fields import ( # type: ignore[no-redef,attr-defined] @@ -412,7 +412,7 @@ else: if _annotation_is_sequence(field.type_): return True return False - + def is_pv1_scalar_mapping_field(field: ModelField) -> bool: if (field.shape in mapping_shapes) and not lenient_issubclass( field.type_, BaseModel @@ -425,7 +425,6 @@ else: return True return False - def is_pv1_scalar_sequence_mapping_field(field: ModelField) -> bool: if (field.shape in mapping_shapes) and not lenient_issubclass( field.type_, BaseModel @@ -438,7 +437,6 @@ else: return True return False - def _normalize_errors(errors: Sequence[Any]) -> List[Dict[str, Any]]: use_errors: List[Any] = [] for error in errors: @@ -506,10 +504,10 @@ else: def is_scalar_sequence_field(field: ModelField) -> bool: return is_pv1_scalar_sequence_field(field) - + def is_scalar_sequence_mapping_field(field: ModelField) -> bool: return is_pv1_scalar_sequence_mapping_field(field) - + def is_scalar_mapping_field(field: ModelField) -> bool: return is_pv1_scalar_mapping_field(field) diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index 255f58a22..2b6e7cf7a 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -36,8 +36,8 @@ from fastapi._compat import ( is_bytes_field, is_bytes_sequence_field, is_scalar_field, - is_scalar_sequence_field, is_scalar_mapping_field, + is_scalar_sequence_field, is_scalar_sequence_mapping_field, is_sequence_field, is_uploadfile_or_nonable_uploadfile_annotation, From 0e835695f1d89f72f8e04ec896590e4898b9a006 Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Fri, 7 Jul 2023 20:07:03 +0000 Subject: [PATCH 25/91] add mapping types --- fastapi/_compat.py | 54 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 3 deletions(-) diff --git a/fastapi/_compat.py b/fastapi/_compat.py index 8fadd6ed3..2fbef2d15 100644 --- a/fastapi/_compat.py +++ b/fastapi/_compat.py @@ -43,6 +43,14 @@ sequence_annotation_to_type = { sequence_types = tuple(sequence_annotation_to_type.keys()) +mapping_annotation_to_type = { + Mapping: list, + List: list, +} + +mapping_types = tuple(mapping_annotation_to_type.keys()) + + if PYDANTIC_V2: from pydantic import PydanticSchemaGenerationError as PydanticSchemaGenerationError from pydantic import TypeAdapter @@ -229,10 +237,10 @@ if PYDANTIC_V2: return field_annotation_is_scalar_sequence(field.field_info.annotation) def is_scalar_sequence_mapping_field(field: ModelField) -> bool: - return field_annotation_is_scalar_sequence(field.field_info.annotation) + return field_annotation_is_scalar_sequence_mapping(field.field_info.annotation) def is_scalar_mapping_field(field: ModelField) -> bool: - return field_annotation_is_scalar_sequence(field.field_info.annotation) + return field_annotation_is_scalar_mapping(field.field_info.annotation) def is_bytes_field(field: ModelField) -> bool: return is_bytes_or_nonable_bytes_annotation(field.type_) @@ -559,6 +567,15 @@ def field_annotation_is_sequence(annotation: Union[Type[Any], None]) -> bool: get_origin(annotation) ) +def _annotation_is_mapping(annotation: Union[Type[Any], None]) -> bool: + if lenient_issubclass(annotation, (str, bytes)): + return False + return lenient_issubclass(annotation, mapping_types) + +def field_annotation_is_mapping(annotation: Union[Type[Any], None]) -> bool: + return _annotation_is_mapping(annotation) or _annotation_is_sequence( + get_origin(annotation) + ) def value_is_sequence(value: Any) -> bool: return isinstance(value, sequence_types) and not isinstance(value, (str, bytes)) # type: ignore[arg-type] @@ -566,7 +583,7 @@ def value_is_sequence(value: Any) -> bool: def _annotation_is_complex(annotation: Union[Type[Any], None]) -> bool: return ( - lenient_issubclass(annotation, (BaseModel, Mapping, UploadFile)) + lenient_issubclass(annotation, (BaseModel, UploadFile)) or _annotation_is_sequence(annotation) or is_dataclass(annotation) ) @@ -606,6 +623,37 @@ def field_annotation_is_scalar_sequence(annotation: Union[Type[Any], None]) -> b for sub_annotation in get_args(annotation) ) +def field_annotation_is_scalar_mapping(annotation: Union[Type[Any], None]) -> bool: + origin = get_origin(annotation) + if origin is Union or origin is UnionType: + at_least_one_scalar_mapping = False + for arg in get_args(annotation): + if field_annotation_is_scalar_mapping(arg): + at_least_one_scalar_mapping = True + continue + elif not field_annotation_is_scalar(arg): + return False + return at_least_one_scalar_mapping + return field_annotation_is_mapping(annotation) and all( + field_annotation_is_scalar(sub_annotation) + for sub_annotation in get_args(annotation) + ) + +def field_annotation_is_scalar_sequence_mapping(annotation: Union[Type[Any], None]) -> bool: + origin = get_origin(annotation) + if origin is Union or origin is UnionType: + at_least_one_scalar_mapping = False + for arg in get_args(annotation): + if field_annotation_is_scalar_mapping(arg): + at_least_one_scalar_mapping = True + continue + elif not field_annotation_is_scalar(arg): + return False + return at_least_one_scalar_mapping + return field_annotation_is_mapping(annotation) and all( + (field_annotation_is_scalar_sequence(sub_annotation) or field_annotation_is_scalar(sub_annotation)) + for sub_annotation in get_args(annotation) + ) def is_bytes_or_nonable_bytes_annotation(annotation: Any) -> bool: if lenient_issubclass(annotation, bytes): From 32f2db3fac4a737b37481c55b9e7f3063323348c Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Fri, 7 Jul 2023 21:01:55 +0000 Subject: [PATCH 26/91] tests passing for freeform queries --- fastapi/_compat.py | 19 +- fastapi/dependencies/utils.py | 2 +- test_openapi.json | 1472 +++++++++++++++++++++++++++++++++ tests/main.py | 15 +- tests/test_application.py | 1394 ++++++++++++++++--------------- tests/test_query.py | 6 + 6 files changed, 2252 insertions(+), 656 deletions(-) create mode 100644 test_openapi.json diff --git a/fastapi/_compat.py b/fastapi/_compat.py index 2fbef2d15..bdf40371b 100644 --- a/fastapi/_compat.py +++ b/fastapi/_compat.py @@ -45,7 +45,6 @@ sequence_types = tuple(sequence_annotation_to_type.keys()) mapping_annotation_to_type = { Mapping: list, - List: list, } mapping_types = tuple(mapping_annotation_to_type.keys()) @@ -567,16 +566,19 @@ def field_annotation_is_sequence(annotation: Union[Type[Any], None]) -> bool: get_origin(annotation) ) + def _annotation_is_mapping(annotation: Union[Type[Any], None]) -> bool: if lenient_issubclass(annotation, (str, bytes)): return False return lenient_issubclass(annotation, mapping_types) + def field_annotation_is_mapping(annotation: Union[Type[Any], None]) -> bool: - return _annotation_is_mapping(annotation) or _annotation_is_sequence( + return _annotation_is_mapping(annotation) or _annotation_is_mapping( get_origin(annotation) ) + def value_is_sequence(value: Any) -> bool: return isinstance(value, sequence_types) and not isinstance(value, (str, bytes)) # type: ignore[arg-type] @@ -585,6 +587,7 @@ def _annotation_is_complex(annotation: Union[Type[Any], None]) -> bool: return ( lenient_issubclass(annotation, (BaseModel, UploadFile)) or _annotation_is_sequence(annotation) + or _annotation_is_mapping(annotation) or is_dataclass(annotation) ) @@ -623,6 +626,7 @@ def field_annotation_is_scalar_sequence(annotation: Union[Type[Any], None]) -> b for sub_annotation in get_args(annotation) ) + def field_annotation_is_scalar_mapping(annotation: Union[Type[Any], None]) -> bool: origin = get_origin(annotation) if origin is Union or origin is UnionType: @@ -639,7 +643,10 @@ def field_annotation_is_scalar_mapping(annotation: Union[Type[Any], None]) -> bo for sub_annotation in get_args(annotation) ) -def field_annotation_is_scalar_sequence_mapping(annotation: Union[Type[Any], None]) -> bool: + +def field_annotation_is_scalar_sequence_mapping( + annotation: Union[Type[Any], None] +) -> bool: origin = get_origin(annotation) if origin is Union or origin is UnionType: at_least_one_scalar_mapping = False @@ -651,10 +658,14 @@ def field_annotation_is_scalar_sequence_mapping(annotation: Union[Type[Any], Non return False return at_least_one_scalar_mapping return field_annotation_is_mapping(annotation) and all( - (field_annotation_is_scalar_sequence(sub_annotation) or field_annotation_is_scalar(sub_annotation)) + ( + field_annotation_is_scalar_sequence(sub_annotation) + or field_annotation_is_scalar(sub_annotation) + ) for sub_annotation in get_args(annotation) ) + def is_bytes_or_nonable_bytes_annotation(annotation: Any) -> bool: if lenient_issubclass(annotation, bytes): return True diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index 2b6e7cf7a..3184664ca 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -652,7 +652,7 @@ def request_params_to_args( received_params, (QueryParams, Headers) ): value = received_params.getlist(field.alias) or field.default - if is_scalar_mapping_field(field) and isinstance( + elif is_scalar_mapping_field(field) and isinstance( received_params, (QueryParams, Headers) ): value = dict(received_params.multi_items()) or field.default diff --git a/test_openapi.json b/test_openapi.json new file mode 100644 index 000000000..05df1c120 --- /dev/null +++ b/test_openapi.json @@ -0,0 +1,1472 @@ +{ + "openapi": "3.1.0", + "info": { + "title": "FastAPI", + "version": "0.1.0" + }, + "paths": { + "/api_route": { + "get": { + "summary": "Non Operation", + "operationId": "non_operation_api_route_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/non_decorated_route": { + "get": { + "summary": "Non Decorated Route", + "operationId": "non_decorated_route_non_decorated_route_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/text": { + "get": { + "summary": "Get Text", + "operationId": "get_text_text_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/path/{item_id}": { + "get": { + "summary": "Get Id", + "operationId": "get_id_path__item_id__get", + "parameters": [ + { + "name": "item_id", + "in": "path", + "required": true, + "schema": { + "title": "Item Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/path/str/{item_id}": { + "get": { + "summary": "Get Str Id", + "operationId": "get_str_id_path_str__item_id__get", + "parameters": [ + { + "name": "item_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Item Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/path/int/{item_id}": { + "get": { + "summary": "Get Int Id", + "operationId": "get_int_id_path_int__item_id__get", + "parameters": [ + { + "name": "item_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "title": "Item Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/path/float/{item_id}": { + "get": { + "summary": "Get Float Id", + "operationId": "get_float_id_path_float__item_id__get", + "parameters": [ + { + "name": "item_id", + "in": "path", + "required": true, + "schema": { + "type": "number", + "title": "Item Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/path/bool/{item_id}": { + "get": { + "summary": "Get Bool Id", + "operationId": "get_bool_id_path_bool__item_id__get", + "parameters": [ + { + "name": "item_id", + "in": "path", + "required": true, + "schema": { + "type": "boolean", + "title": "Item Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/path/param/{item_id}": { + "get": { + "summary": "Get Path Param Id", + "operationId": "get_path_param_id_path_param__item_id__get", + "parameters": [ + { + "name": "item_id", + "in": "path", + "required": true, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Item Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/path/param-minlength/{item_id}": { + "get": { + "summary": "Get Path Param Min Length", + "operationId": "get_path_param_min_length_path_param_minlength__item_id__get", + "parameters": [ + { + "name": "item_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 3, + "title": "Item Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/path/param-maxlength/{item_id}": { + "get": { + "summary": "Get Path Param Max Length", + "operationId": "get_path_param_max_length_path_param_maxlength__item_id__get", + "parameters": [ + { + "name": "item_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "maxLength": 3, + "title": "Item Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/path/param-min_maxlength/{item_id}": { + "get": { + "summary": "Get Path Param Min Max Length", + "operationId": "get_path_param_min_max_length_path_param_min_maxlength__item_id__get", + "parameters": [ + { + "name": "item_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 2, + "maxLength": 3, + "title": "Item Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/path/param-gt/{item_id}": { + "get": { + "summary": "Get Path Param Gt", + "operationId": "get_path_param_gt_path_param_gt__item_id__get", + "parameters": [ + { + "name": "item_id", + "in": "path", + "required": true, + "schema": { + "type": "number", + "exclusiveMinimum": 3, + "title": "Item Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/path/param-gt0/{item_id}": { + "get": { + "summary": "Get Path Param Gt0", + "operationId": "get_path_param_gt0_path_param_gt0__item_id__get", + "parameters": [ + { + "name": "item_id", + "in": "path", + "required": true, + "schema": { + "type": "number", + "exclusiveMinimum": 0, + "title": "Item Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/path/param-ge/{item_id}": { + "get": { + "summary": "Get Path Param Ge", + "operationId": "get_path_param_ge_path_param_ge__item_id__get", + "parameters": [ + { + "name": "item_id", + "in": "path", + "required": true, + "schema": { + "type": "number", + "minimum": 3, + "title": "Item Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/path/param-lt/{item_id}": { + "get": { + "summary": "Get Path Param Lt", + "operationId": "get_path_param_lt_path_param_lt__item_id__get", + "parameters": [ + { + "name": "item_id", + "in": "path", + "required": true, + "schema": { + "type": "number", + "exclusiveMaximum": 3, + "title": "Item Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/path/param-lt0/{item_id}": { + "get": { + "summary": "Get Path Param Lt0", + "operationId": "get_path_param_lt0_path_param_lt0__item_id__get", + "parameters": [ + { + "name": "item_id", + "in": "path", + "required": true, + "schema": { + "type": "number", + "exclusiveMaximum": 0, + "title": "Item Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/path/param-le/{item_id}": { + "get": { + "summary": "Get Path Param Le", + "operationId": "get_path_param_le_path_param_le__item_id__get", + "parameters": [ + { + "name": "item_id", + "in": "path", + "required": true, + "schema": { + "type": "number", + "maximum": 3, + "title": "Item Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/path/param-lt-gt/{item_id}": { + "get": { + "summary": "Get Path Param Lt Gt", + "operationId": "get_path_param_lt_gt_path_param_lt_gt__item_id__get", + "parameters": [ + { + "name": "item_id", + "in": "path", + "required": true, + "schema": { + "type": "number", + "exclusiveMaximum": 3, + "exclusiveMinimum": 1, + "title": "Item Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/path/param-le-ge/{item_id}": { + "get": { + "summary": "Get Path Param Le Ge", + "operationId": "get_path_param_le_ge_path_param_le_ge__item_id__get", + "parameters": [ + { + "name": "item_id", + "in": "path", + "required": true, + "schema": { + "type": "number", + "maximum": 3, + "minimum": 1, + "title": "Item Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/path/param-lt-int/{item_id}": { + "get": { + "summary": "Get Path Param Lt Int", + "operationId": "get_path_param_lt_int_path_param_lt_int__item_id__get", + "parameters": [ + { + "name": "item_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "exclusiveMaximum": 3, + "title": "Item Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/path/param-gt-int/{item_id}": { + "get": { + "summary": "Get Path Param Gt Int", + "operationId": "get_path_param_gt_int_path_param_gt_int__item_id__get", + "parameters": [ + { + "name": "item_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "exclusiveMinimum": 3, + "title": "Item Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/path/param-le-int/{item_id}": { + "get": { + "summary": "Get Path Param Le Int", + "operationId": "get_path_param_le_int_path_param_le_int__item_id__get", + "parameters": [ + { + "name": "item_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "maximum": 3, + "title": "Item Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/path/param-ge-int/{item_id}": { + "get": { + "summary": "Get Path Param Ge Int", + "operationId": "get_path_param_ge_int_path_param_ge_int__item_id__get", + "parameters": [ + { + "name": "item_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "minimum": 3, + "title": "Item Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/path/param-lt-gt-int/{item_id}": { + "get": { + "summary": "Get Path Param Lt Gt Int", + "operationId": "get_path_param_lt_gt_int_path_param_lt_gt_int__item_id__get", + "parameters": [ + { + "name": "item_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "exclusiveMaximum": 3, + "exclusiveMinimum": 1, + "title": "Item Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/path/param-le-ge-int/{item_id}": { + "get": { + "summary": "Get Path Param Le Ge Int", + "operationId": "get_path_param_le_ge_int_path_param_le_ge_int__item_id__get", + "parameters": [ + { + "name": "item_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "maximum": 3, + "minimum": 1, + "title": "Item Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/query": { + "get": { + "summary": "Get Query", + "operationId": "get_query_query_get", + "parameters": [ + { + "name": "query", + "in": "query", + "required": true, + "schema": { + "title": "Query" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/query/optional": { + "get": { + "summary": "Get Query Optional", + "operationId": "get_query_optional_query_optional_get", + "parameters": [ + { + "name": "query", + "in": "query", + "required": false, + "schema": { + "title": "Query" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/query/int": { + "get": { + "summary": "Get Query Type", + "operationId": "get_query_type_query_int_get", + "parameters": [ + { + "name": "query", + "in": "query", + "required": true, + "schema": { + "type": "integer", + "title": "Query" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/query/int/optional": { + "get": { + "summary": "Get Query Type Optional", + "operationId": "get_query_type_optional_query_int_optional_get", + "parameters": [ + { + "name": "query", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Query" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/query/int/default": { + "get": { + "summary": "Get Query Type Int Default", + "operationId": "get_query_type_int_default_query_int_default_get", + "parameters": [ + { + "name": "query", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "default": 10, + "title": "Query" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/query/param": { + "get": { + "summary": "Get Query Param", + "operationId": "get_query_param_query_param_get", + "parameters": [ + { + "name": "query", + "in": "query", + "required": false, + "schema": { + "title": "Query" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/query/param-required": { + "get": { + "summary": "Get Query Param Required", + "operationId": "get_query_param_required_query_param_required_get", + "parameters": [ + { + "name": "query", + "in": "query", + "required": true, + "schema": { + "title": "Query" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/query/param-required/int": { + "get": { + "summary": "Get Query Param Required Type", + "operationId": "get_query_param_required_type_query_param_required_int_get", + "parameters": [ + { + "name": "query", + "in": "query", + "required": true, + "schema": { + "type": "integer", + "title": "Query" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/query/sequence-params": { + "get": { + "summary": "Get Sequence Query Params", + "operationId": "get_sequence_query_params_query_sequence_params_get", + "parameters": [ + { + "name": "query", + "in": "query", + "required": false, + "schema": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "integer" + } + }, + "default": {}, + "title": "Query" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/query/mapping-params": { + "get": { + "summary": "Get Mapping Query Params", + "operationId": "get_mapping_query_params_query_mapping_params_get", + "parameters": [ + { + "name": "queries", + "in": "query", + "required": false, + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "default": {}, + "title": "Queries" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/query/mapping-sequence-params": { + "get": { + "summary": "Get Sequence Mapping Query Params", + "operationId": "get_sequence_mapping_query_params_query_mapping_sequence_params_get", + "parameters": [ + { + "name": "queries", + "in": "query", + "required": false, + "schema": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "integer" + } + }, + "default": {}, + "title": "Queries" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/enum-status-code": { + "get": { + "summary": "Get Enum Status Code", + "operationId": "get_enum_status_code_enum_status_code_get", + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/query/frozenset": { + "get": { + "summary": "Get Query Type Frozenset", + "operationId": "get_query_type_frozenset_query_frozenset_get", + "parameters": [ + { + "name": "query", + "in": "query", + "required": true, + "schema": { + "type": "array", + "uniqueItems": true, + "items": { + "type": "integer" + }, + "title": "Query" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "HTTPValidationError": { + "properties": { + "detail": { + "items": { + "$ref": "#/components/schemas/ValidationError" + }, + "type": "array", + "title": "Detail" + } + }, + "type": "object", + "title": "HTTPValidationError" + }, + "ValidationError": { + "properties": { + "loc": { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ] + }, + "type": "array", + "title": "Location" + }, + "msg": { + "type": "string", + "title": "Message" + }, + "type": { + "type": "string", + "title": "Error Type" + } + }, + "type": "object", + "required": [ + "loc", + "msg", + "type" + ], + "title": "ValidationError" + } + } + } +} \ No newline at end of file diff --git a/tests/main.py b/tests/main.py index 935ff270f..1a590add8 100644 --- a/tests/main.py +++ b/tests/main.py @@ -184,16 +184,21 @@ def get_query_param_required_type(query: int = Query()): return f"foo bar {query}" -@app.get("/query/params") -def get_query_params(query: Mapping[str, int] = Query({})): - return f"foo bar {query}" - - @app.get("/query/sequence-params") def get_sequence_query_params(query: Mapping[str, List[int]] = Query({})): return f"foo bar {query}" +@app.get("/query/mapping-params") +def get_mapping_query_params(queries: Mapping[str, str] = Query({})): + return f"foo bar {queries['foo']} {queries['bar']}" + + +@app.get("/query/mapping-sequence-params") +def get_sequence_mapping_query_params(queries: Mapping[str, List[int]] = Query({})): + return f"foo bar {queries}" + + @app.get("/enum-status-code", status_code=http.HTTPStatus.CREATED) def get_enum_status_code(): return "foo bar" diff --git a/tests/test_application.py b/tests/test_application.py index 49e4711ed..b54a97281 100644 --- a/tests/test_application.py +++ b/tests/test_application.py @@ -1,5 +1,4 @@ import pytest -from dirty_equals import IsDict from fastapi.testclient import TestClient from .main import app @@ -1256,192 +1255,172 @@ def test_openapi_schema(): "paths": { "/api_route": { "get": { + "summary": "Non Operation", + "operationId": "non_operation_api_route_get", "responses": { "200": { "description": "Successful Response", "content": {"application/json": {"schema": {}}}, } }, - "summary": "Non Operation", - "operationId": "non_operation_api_route_get", } }, "/non_decorated_route": { "get": { + "summary": "Non Decorated Route", + "operationId": "non_decorated_route_non_decorated_route_get", "responses": { "200": { "description": "Successful Response", "content": {"application/json": {"schema": {}}}, } }, - "summary": "Non Decorated Route", - "operationId": "non_decorated_route_non_decorated_route_get", } }, "/text": { "get": { + "summary": "Get Text", + "operationId": "get_text_text_get", "responses": { "200": { "description": "Successful Response", "content": {"application/json": {"schema": {}}}, } }, - "summary": "Get Text", - "operationId": "get_text_text_get", } }, "/path/{item_id}": { "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, "summary": "Get Id", "operationId": "get_id_path__item_id__get", "parameters": [ { - "required": True, - "schema": {"title": "Item Id"}, "name": "item_id", "in": "path", + "required": True, + "schema": {"title": "Item Id"}, } ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, } }, "/path/str/{item_id}": { "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, "summary": "Get Str Id", "operationId": "get_str_id_path_str__item_id__get", "parameters": [ { - "required": True, - "schema": {"title": "Item Id", "type": "string"}, "name": "item_id", "in": "path", + "required": True, + "schema": {"type": "string", "title": "Item Id"}, } ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, } }, "/path/int/{item_id}": { "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, "summary": "Get Int Id", "operationId": "get_int_id_path_int__item_id__get", "parameters": [ { - "required": True, - "schema": {"title": "Item Id", "type": "integer"}, "name": "item_id", "in": "path", + "required": True, + "schema": {"type": "integer", "title": "Item Id"}, } ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, } }, "/path/float/{item_id}": { "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, "summary": "Get Float Id", "operationId": "get_float_id_path_float__item_id__get", "parameters": [ { - "required": True, - "schema": {"title": "Item Id", "type": "number"}, "name": "item_id", "in": "path", + "required": True, + "schema": {"type": "number", "title": "Item Id"}, } ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, } }, "/path/bool/{item_id}": { "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, "summary": "Get Bool Id", "operationId": "get_bool_id_path_bool__item_id__get", "parameters": [ { - "required": True, - "schema": {"title": "Item Id", "type": "boolean"}, "name": "item_id", "in": "path", + "required": True, + "schema": {"type": "boolean", "title": "Item Id"}, } ], - } - }, - "/path/param/{item_id}": { - "get": { "responses": { "200": { "description": "Successful Response", @@ -1458,6 +1437,10 @@ def test_openapi_schema(): }, }, }, + } + }, + "/path/param/{item_id}": { + "get": { "summary": "Get Path Param Id", "operationId": "get_path_param_id_path_param__item_id__get", "parameters": [ @@ -1465,693 +1448,685 @@ def test_openapi_schema(): "name": "item_id", "in": "path", "required": True, - "schema": IsDict( - { - "anyOf": [{"type": "string"}, {"type": "null"}], - "title": "Item Id", - } - ) - # TODO: remove when deprecating Pydantic v1 - | IsDict({"title": "Item Id", "type": "string"}), + "schema": { + "anyOf": [{"type": "string"}, {"type": "null"}], + "title": "Item Id", + }, } ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, } }, "/path/param-minlength/{item_id}": { "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, "summary": "Get Path Param Min Length", "operationId": "get_path_param_min_length_path_param_minlength__item_id__get", "parameters": [ { - "required": True, - "schema": { - "title": "Item Id", - "minLength": 3, - "type": "string", - }, "name": "item_id", "in": "path", + "required": True, + "schema": { + "type": "string", + "minLength": 3, + "title": "Item Id", + }, } ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, } }, "/path/param-maxlength/{item_id}": { "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, "summary": "Get Path Param Max Length", "operationId": "get_path_param_max_length_path_param_maxlength__item_id__get", "parameters": [ { - "required": True, - "schema": { - "title": "Item Id", - "maxLength": 3, - "type": "string", - }, "name": "item_id", "in": "path", + "required": True, + "schema": { + "type": "string", + "maxLength": 3, + "title": "Item Id", + }, } ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, } }, "/path/param-min_maxlength/{item_id}": { "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, "summary": "Get Path Param Min Max Length", "operationId": "get_path_param_min_max_length_path_param_min_maxlength__item_id__get", "parameters": [ { - "required": True, - "schema": { - "title": "Item Id", - "maxLength": 3, - "minLength": 2, - "type": "string", - }, "name": "item_id", "in": "path", + "required": True, + "schema": { + "type": "string", + "minLength": 2, + "maxLength": 3, + "title": "Item Id", + }, } ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, } }, "/path/param-gt/{item_id}": { "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, "summary": "Get Path Param Gt", "operationId": "get_path_param_gt_path_param_gt__item_id__get", "parameters": [ { - "required": True, - "schema": { - "title": "Item Id", - "exclusiveMinimum": 3.0, - "type": "number", - }, "name": "item_id", "in": "path", + "required": True, + "schema": { + "type": "number", + "exclusiveMinimum": 3, + "title": "Item Id", + }, } ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, } }, "/path/param-gt0/{item_id}": { "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, "summary": "Get Path Param Gt0", "operationId": "get_path_param_gt0_path_param_gt0__item_id__get", "parameters": [ { - "required": True, - "schema": { - "title": "Item Id", - "exclusiveMinimum": 0.0, - "type": "number", - }, "name": "item_id", "in": "path", + "required": True, + "schema": { + "type": "number", + "exclusiveMinimum": 0, + "title": "Item Id", + }, } ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, } }, "/path/param-ge/{item_id}": { "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, "summary": "Get Path Param Ge", "operationId": "get_path_param_ge_path_param_ge__item_id__get", "parameters": [ { - "required": True, - "schema": { - "title": "Item Id", - "minimum": 3.0, - "type": "number", - }, "name": "item_id", "in": "path", + "required": True, + "schema": { + "type": "number", + "minimum": 3, + "title": "Item Id", + }, } ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, } }, "/path/param-lt/{item_id}": { "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, "summary": "Get Path Param Lt", "operationId": "get_path_param_lt_path_param_lt__item_id__get", "parameters": [ { - "required": True, - "schema": { - "title": "Item Id", - "exclusiveMaximum": 3.0, - "type": "number", - }, "name": "item_id", "in": "path", + "required": True, + "schema": { + "type": "number", + "exclusiveMaximum": 3, + "title": "Item Id", + }, } ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, } }, "/path/param-lt0/{item_id}": { "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, "summary": "Get Path Param Lt0", "operationId": "get_path_param_lt0_path_param_lt0__item_id__get", "parameters": [ { - "required": True, - "schema": { - "title": "Item Id", - "exclusiveMaximum": 0.0, - "type": "number", - }, "name": "item_id", "in": "path", + "required": True, + "schema": { + "type": "number", + "exclusiveMaximum": 0, + "title": "Item Id", + }, } ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, } }, "/path/param-le/{item_id}": { "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, "summary": "Get Path Param Le", "operationId": "get_path_param_le_path_param_le__item_id__get", "parameters": [ { - "required": True, - "schema": { - "title": "Item Id", - "maximum": 3.0, - "type": "number", - }, "name": "item_id", "in": "path", + "required": True, + "schema": { + "type": "number", + "maximum": 3, + "title": "Item Id", + }, } ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, } }, "/path/param-lt-gt/{item_id}": { "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, "summary": "Get Path Param Lt Gt", "operationId": "get_path_param_lt_gt_path_param_lt_gt__item_id__get", "parameters": [ { - "required": True, - "schema": { - "title": "Item Id", - "exclusiveMaximum": 3.0, - "exclusiveMinimum": 1.0, - "type": "number", - }, "name": "item_id", "in": "path", + "required": True, + "schema": { + "type": "number", + "exclusiveMaximum": 3, + "exclusiveMinimum": 1, + "title": "Item Id", + }, } ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, } }, "/path/param-le-ge/{item_id}": { "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, "summary": "Get Path Param Le Ge", "operationId": "get_path_param_le_ge_path_param_le_ge__item_id__get", "parameters": [ { - "required": True, - "schema": { - "title": "Item Id", - "maximum": 3.0, - "minimum": 1.0, - "type": "number", - }, "name": "item_id", "in": "path", + "required": True, + "schema": { + "type": "number", + "maximum": 3, + "minimum": 1, + "title": "Item Id", + }, } ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, } }, "/path/param-lt-int/{item_id}": { "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, "summary": "Get Path Param Lt Int", "operationId": "get_path_param_lt_int_path_param_lt_int__item_id__get", "parameters": [ { - "required": True, - "schema": { - "title": "Item Id", - "exclusiveMaximum": 3.0, - "type": "integer", - }, "name": "item_id", "in": "path", + "required": True, + "schema": { + "type": "integer", + "exclusiveMaximum": 3, + "title": "Item Id", + }, } ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, } }, "/path/param-gt-int/{item_id}": { "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, "summary": "Get Path Param Gt Int", "operationId": "get_path_param_gt_int_path_param_gt_int__item_id__get", "parameters": [ { - "required": True, - "schema": { - "title": "Item Id", - "exclusiveMinimum": 3.0, - "type": "integer", - }, "name": "item_id", "in": "path", + "required": True, + "schema": { + "type": "integer", + "exclusiveMinimum": 3, + "title": "Item Id", + }, } ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, } }, "/path/param-le-int/{item_id}": { "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, "summary": "Get Path Param Le Int", "operationId": "get_path_param_le_int_path_param_le_int__item_id__get", "parameters": [ { - "required": True, - "schema": { - "title": "Item Id", - "maximum": 3.0, - "type": "integer", - }, "name": "item_id", "in": "path", + "required": True, + "schema": { + "type": "integer", + "maximum": 3, + "title": "Item Id", + }, } ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, } }, "/path/param-ge-int/{item_id}": { "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, "summary": "Get Path Param Ge Int", "operationId": "get_path_param_ge_int_path_param_ge_int__item_id__get", "parameters": [ { - "required": True, - "schema": { - "title": "Item Id", - "minimum": 3.0, - "type": "integer", - }, "name": "item_id", "in": "path", + "required": True, + "schema": { + "type": "integer", + "minimum": 3, + "title": "Item Id", + }, } ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, } }, "/path/param-lt-gt-int/{item_id}": { "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, "summary": "Get Path Param Lt Gt Int", "operationId": "get_path_param_lt_gt_int_path_param_lt_gt_int__item_id__get", "parameters": [ { - "required": True, - "schema": { - "title": "Item Id", - "exclusiveMaximum": 3.0, - "exclusiveMinimum": 1.0, - "type": "integer", - }, "name": "item_id", "in": "path", + "required": True, + "schema": { + "type": "integer", + "exclusiveMaximum": 3, + "exclusiveMinimum": 1, + "title": "Item Id", + }, } ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, } }, "/path/param-le-ge-int/{item_id}": { "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, "summary": "Get Path Param Le Ge Int", "operationId": "get_path_param_le_ge_int_path_param_le_ge_int__item_id__get", "parameters": [ { - "required": True, - "schema": { - "title": "Item Id", - "maximum": 3.0, - "minimum": 1.0, - "type": "integer", - }, "name": "item_id", "in": "path", + "required": True, + "schema": { + "type": "integer", + "maximum": 3, + "minimum": 1, + "title": "Item Id", + }, } ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, } }, "/query": { "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, "summary": "Get Query", "operationId": "get_query_query_get", "parameters": [ { - "required": True, - "schema": {"title": "Query"}, "name": "query", "in": "query", + "required": True, + "schema": {"title": "Query"}, } ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, } }, "/query/optional": { "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, "summary": "Get Query Optional", "operationId": "get_query_optional_query_optional_get", "parameters": [ { - "required": False, - "schema": {"title": "Query"}, "name": "query", "in": "query", + "required": False, + "schema": {"title": "Query"}, } ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, } }, "/query/int": { "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, "summary": "Get Query Type", "operationId": "get_query_type_query_int_get", "parameters": [ { - "required": True, - "schema": {"title": "Query", "type": "integer"}, "name": "query", "in": "query", + "required": True, + "schema": {"type": "integer", "title": "Query"}, } ], - } - }, - "/query/int/optional": { - "get": { "responses": { "200": { "description": "Successful Response", @@ -2168,6 +2143,10 @@ def test_openapi_schema(): }, }, }, + } + }, + "/query/int/optional": { + "get": { "summary": "Get Query Type Optional", "operationId": "get_query_type_optional_query_int_optional_get", "parameters": [ @@ -2175,114 +2154,106 @@ def test_openapi_schema(): "name": "query", "in": "query", "required": False, - "schema": IsDict( - { - "anyOf": [{"type": "integer"}, {"type": "null"}], - "title": "Query", - } - ) - # TODO: remove when deprecating Pydantic v1 - | IsDict({"title": "Query", "type": "integer"}), + "schema": { + "anyOf": [{"type": "integer"}, {"type": "null"}], + "title": "Query", + }, } ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, } }, "/query/int/default": { "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, "summary": "Get Query Type Int Default", "operationId": "get_query_type_int_default_query_int_default_get", "parameters": [ { - "required": False, - "schema": { - "title": "Query", - "type": "integer", - "default": 10, - }, "name": "query", "in": "query", + "required": False, + "schema": { + "type": "integer", + "default": 10, + "title": "Query", + }, } ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, } }, "/query/param": { "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, "summary": "Get Query Param", "operationId": "get_query_param_query_param_get", "parameters": [ { - "required": False, - "schema": {"title": "Query"}, "name": "query", "in": "query", + "required": False, + "schema": {"title": "Query"}, } ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, } }, "/query/param-required": { "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, "summary": "Get Query Param Required", "operationId": "get_query_param_required_query_param_required_get", "parameters": [ { - "required": True, - "schema": {"title": "Query"}, "name": "query", "in": "query", + "required": True, + "schema": {"title": "Query"}, } ], - } - }, - "/query/param-required/int": { - "get": { "responses": { "200": { "description": "Successful Response", @@ -2299,28 +2270,159 @@ def test_openapi_schema(): }, }, }, + } + }, + "/query/param-required/int": { + "get": { "summary": "Get Query Param Required Type", "operationId": "get_query_param_required_type_query_param_required_int_get", "parameters": [ { - "required": True, - "schema": {"title": "Query", "type": "integer"}, "name": "query", "in": "query", + "required": True, + "schema": {"type": "integer", "title": "Query"}, } ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + } + }, + "/query/sequence-params": { + "get": { + "summary": "Get Sequence Query Params", + "operationId": "get_sequence_query_params_query_sequence_params_get", + "parameters": [ + { + "name": "query", + "in": "query", + "required": False, + "schema": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": {"type": "integer"}, + }, + "default": {}, + "title": "Query", + }, + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + } + }, + "/query/mapping-params": { + "get": { + "summary": "Get Mapping Query Params", + "operationId": "get_mapping_query_params_query_mapping_params_get", + "parameters": [ + { + "name": "queries", + "in": "query", + "required": False, + "schema": { + "type": "object", + "additionalProperties": {"type": "string"}, + "default": {}, + "title": "Queries", + }, + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + } + }, + "/query/mapping-sequence-params": { + "get": { + "summary": "Get Sequence Mapping Query Params", + "operationId": "get_sequence_mapping_query_params_query_mapping_sequence_params_get", + "parameters": [ + { + "name": "queries", + "in": "query", + "required": False, + "schema": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": {"type": "integer"}, + }, + "default": {}, + "title": "Queries", + }, + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, } }, "/enum-status-code": { "get": { + "summary": "Get Enum Status Code", + "operationId": "get_enum_status_code_enum_status_code_get", "responses": { "201": { "description": "Successful Response", "content": {"application/json": {"schema": {}}}, - }, + } }, - "summary": "Get Enum Status Code", - "operationId": "get_enum_status_code_enum_status_code_get", } }, "/query/frozenset": { @@ -2329,15 +2431,15 @@ def test_openapi_schema(): "operationId": "get_query_type_frozenset_query_frozenset_get", "parameters": [ { - "required": True, - "schema": { - "title": "Query", - "uniqueItems": True, - "type": "array", - "items": {"type": "integer"}, - }, "name": "query", "in": "query", + "required": True, + "schema": { + "type": "array", + "uniqueItems": True, + "items": {"type": "integer"}, + "title": "Query", + }, } ], "responses": { @@ -2361,32 +2463,32 @@ def test_openapi_schema(): }, "components": { "schemas": { - "ValidationError": { - "title": "ValidationError", - "required": ["loc", "msg", "type"], + "HTTPValidationError": { + "properties": { + "detail": { + "items": {"$ref": "#/components/schemas/ValidationError"}, + "type": "array", + "title": "Detail", + } + }, "type": "object", + "title": "HTTPValidationError", + }, + "ValidationError": { "properties": { "loc": { - "title": "Location", - "type": "array", "items": { "anyOf": [{"type": "string"}, {"type": "integer"}] }, - }, - "msg": {"title": "Message", "type": "string"}, - "type": {"title": "Error Type", "type": "string"}, - }, - }, - "HTTPValidationError": { - "title": "HTTPValidationError", - "type": "object", - "properties": { - "detail": { - "title": "Detail", "type": "array", - "items": {"$ref": "#/components/schemas/ValidationError"}, - } + "title": "Location", + }, + "msg": {"type": "string", "title": "Message"}, + "type": {"type": "string", "title": "Error Type"}, }, + "type": "object", + "required": ["loc", "msg", "type"], + "title": "ValidationError", }, } }, diff --git a/tests/test_query.py b/tests/test_query.py index 5bb9995d6..43f0a8038 100644 --- a/tests/test_query.py +++ b/tests/test_query.py @@ -408,3 +408,9 @@ def test_query_frozenset_query_1_query_1_query_2(): response = client.get("/query/frozenset/?query=1&query=1&query=2") assert response.status_code == 200 assert response.json() == "1,2" + + +def test_mapping_query(): + response = client.get("/query/mapping-params/?foo=fuzz&bar=buzz") + assert response.status_code == 200 + assert response.json() == "foo bar fuzz buzz" From cd34cdc02ce9904247b98aa39e882cd39937ba70 Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Fri, 7 Jul 2023 21:10:51 +0000 Subject: [PATCH 27/91] linting --- fastapi/_compat.py | 12 ++++++------ fastapi/dependencies/utils.py | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/fastapi/_compat.py b/fastapi/_compat.py index bdf40371b..c5c1b376d 100644 --- a/fastapi/_compat.py +++ b/fastapi/_compat.py @@ -421,24 +421,24 @@ else: return False def is_pv1_scalar_mapping_field(field: ModelField) -> bool: - if (field.shape in mapping_shapes) and not lenient_issubclass( + if (field.shape in mapping_shapes) and not lenient_issubclass( # type: ignore[attr-defined] field.type_, BaseModel ): - if field.sub_fields is None: + if field.sub_fields is None: # type: ignore[attr-defined] return False - for sub_field in field.sub_fields: + for sub_field in field.sub_fields: # type: ignore[attr-defined] if not is_scalar_field(sub_field): return False return True return False def is_pv1_scalar_sequence_mapping_field(field: ModelField) -> bool: - if (field.shape in mapping_shapes) and not lenient_issubclass( + if (field.shape in mapping_shapes) and not lenient_issubclass( # type: ignore[attr-defined] field.type_, BaseModel ): - if field.sub_fields is None: + if field.sub_fields is None: # type: ignore[attr-defined] return False - for sub_field in field.sub_fields: + for sub_field in field.sub_fields: # type: ignore[attr-defined] if not is_scalar_sequence_field(sub_field): return False return True diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index 3184664ca..e1d173f6b 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -653,11 +653,11 @@ def request_params_to_args( ): value = received_params.getlist(field.alias) or field.default elif is_scalar_mapping_field(field) and isinstance( - received_params, (QueryParams, Headers) + received_params, (QueryParams) ): value = dict(received_params.multi_items()) or field.default elif is_scalar_sequence_mapping_field(field) and isinstance( - received_params, (QueryParams, Headers) + received_params, (QueryParams) ): if not len(received_params.multi_items()): value = field.default From 19698b436dbfa7eb36bcfa80c43f08920fe79c1e Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Sat, 8 Jul 2023 08:35:51 +0000 Subject: [PATCH 28/91] drop invalid query parameters --- fastapi/_compat.py | 7 ++----- fastapi/dependencies/utils.py | 39 +++++++++++++++++++++++++++-------- tests/main.py | 25 ++++++++++++++++++++-- tests/test_query.py | 24 +++++++++++++++++++++ 4 files changed, 79 insertions(+), 16 deletions(-) diff --git a/fastapi/_compat.py b/fastapi/_compat.py index c5c1b376d..68302fdbe 100644 --- a/fastapi/_compat.py +++ b/fastapi/_compat.py @@ -658,11 +658,8 @@ def field_annotation_is_scalar_sequence_mapping( return False return at_least_one_scalar_mapping return field_annotation_is_mapping(annotation) and all( - ( - field_annotation_is_scalar_sequence(sub_annotation) - or field_annotation_is_scalar(sub_annotation) - ) - for sub_annotation in get_args(annotation) + field_annotation_is_scalar_sequence(sub_annotation) + for sub_annotation in get_args(annotation)[1:] ) diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index e1d173f6b..5898dd057 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -453,7 +453,7 @@ def is_body_param(*, param_field: ModelField, is_path_param: bool) -> bool: param_field.field_info, (params.Query, params.Header) ) and is_scalar_sequence_field(param_field): return False - elif isinstance(param_field.field_info, (params.Query, params.Header)) and ( + elif isinstance(param_field.field_info, params.Query) and ( is_scalar_sequence_mapping_field(param_field) or is_scalar_mapping_field(param_field) ): @@ -640,6 +640,7 @@ async def solve_dependencies( ) return values, errors, background_tasks, response, dependency_cache +class Marker: pass def request_params_to_args( required_params: Sequence[ModelField], @@ -653,18 +654,15 @@ def request_params_to_args( ): value = received_params.getlist(field.alias) or field.default elif is_scalar_mapping_field(field) and isinstance( - received_params, (QueryParams) + received_params, QueryParams ): value = dict(received_params.multi_items()) or field.default elif is_scalar_sequence_mapping_field(field) and isinstance( - received_params, (QueryParams) + received_params, QueryParams ): - if not len(received_params.multi_items()): - value = field.default - else: - value = defaultdict(list) - for k, v in received_params.multi_items(): - value[k].append(v) + value = defaultdict(list) + for k, v in received_params.multi_items(): + value[k].append(v) else: value = received_params.get(field.alias) field_info = field.field_info @@ -681,6 +679,29 @@ def request_params_to_args( v_, errors_ = field.validate(value, values, loc=loc) if isinstance(errors_, ErrorWrapper): errors.append(errors_) + elif ( + isinstance(errors_, list) + and is_scalar_sequence_mapping_field(field) + and isinstance(received_params, QueryParams) + ): + new_errors = _regenerate_error_with_loc(errors=errors_, loc_prefix=()) + # remove all invalid parameters + marker = Marker() + for _, _, key, index in [error["loc"] for error in new_errors]: + value[key][index] = marker + for key in value: + value[key] = [x for x in value[key] if x != marker] + values[field.name] = value + elif ( + isinstance(errors_, list) + and is_scalar_mapping_field(field) + and isinstance(received_params, QueryParams) + ): + new_errors = _regenerate_error_with_loc(errors=errors_, loc_prefix=()) + # remove all invalid parameters + for _, _, key in [error["loc"] for error in new_errors]: + value.pop(key) + values[field.name] = value elif isinstance(errors_, list): new_errors = _regenerate_error_with_loc(errors=errors_, loc_prefix=()) errors.extend(new_errors) diff --git a/tests/main.py b/tests/main.py index 1a590add8..3eaf4863c 100644 --- a/tests/main.py +++ b/tests/main.py @@ -5,7 +5,6 @@ from fastapi import FastAPI, Path, Query app = FastAPI() - @app.api_route("/api_route") def non_operation(): return {"message": "Hello World"} @@ -196,7 +195,29 @@ def get_mapping_query_params(queries: Mapping[str, str] = Query({})): @app.get("/query/mapping-sequence-params") def get_sequence_mapping_query_params(queries: Mapping[str, List[int]] = Query({})): - return f"foo bar {queries}" + return f"foo bar {dict(queries)}" + + +@app.get("/query/mixed-params") +def get_mixed_mapping_query_params( + sequence_mapping_queries: Mapping[str, List[str]] = Query({}), + mapping_query: Mapping[str, str] = Query(), + query: str = Query(), +): + return ( + f"foo bar {sequence_mapping_queries['foo'][0]} {sequence_mapping_queries['foo'][1]} " + f"{mapping_query['foo']} {mapping_query['bar']} {query}" + ) + + +@app.get("/query/mixed-type-params") +def get_mixed_mapping_mixed_type_query_params( + sequence_mapping_queries: Mapping[str, List[int]] = Query({}), + mapping_query_str: Mapping[str, str] = Query({}), + mapping_query_int: Mapping[str, int] = Query({}), + query: int = Query(), +): + return f"foo bar {query} {mapping_query_str} {mapping_query_int} {dict(sequence_mapping_queries)}" @app.get("/enum-status-code", status_code=http.HTTPStatus.CREATED) diff --git a/tests/test_query.py b/tests/test_query.py index 43f0a8038..7619762da 100644 --- a/tests/test_query.py +++ b/tests/test_query.py @@ -414,3 +414,27 @@ def test_mapping_query(): response = client.get("/query/mapping-params/?foo=fuzz&bar=buzz") assert response.status_code == 200 assert response.json() == "foo bar fuzz buzz" + + +def test_mapping_with_non_mapping_query(): + response = client.get("/query/mixed-params/?foo=fuzz&foo=baz&bar=buzz&query=fizz") + assert response.status_code == 200 + assert response.json() == "foo bar fuzz baz baz buzz fizz" + + +def test_mapping_with_non_mapping_query_mixed_types(): + response = client.get("/query/mixed-type-params/?foo=fuzz&foo=baz&bar=buzz&query=1") + assert response.status_code == 200 + assert response.json() == "foo bar 1 {'foo': 'baz', 'bar': 'buzz', 'query': '1'} {'query': '1'} {'foo': [], 'bar': [], 'query': ['1']}" + + +def test_sequence_mapping_query(): + response = client.get("/query/mapping-sequence-params/?foo=1&foo=2") + assert response.status_code == 200 + assert response.json() == "foo bar {'foo': [1, 2]}" + + +def test_sequence_mapping_query_drops_invalid(): + response = client.get("/query/mapping-sequence-params/?foo=fuzz&foo=buzz") + assert response.status_code == 200 + assert response.json() == "foo bar {'foo': []}" From a19af62953a870778fa21028c3990a2faec3add1 Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Sat, 8 Jul 2023 08:40:09 +0000 Subject: [PATCH 29/91] fmt --- fastapi/dependencies/utils.py | 19 +- test_openapi.json | 1472 --------------------------------- tests/main.py | 1 + tests/test_application.py | 1315 +++-------------------------- tests/test_query.py | 5 +- 5 files changed, 136 insertions(+), 2676 deletions(-) delete mode 100644 test_openapi.json diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index 5898dd057..ccb9f6e4e 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -640,7 +640,10 @@ async def solve_dependencies( ) return values, errors, background_tasks, response, dependency_cache -class Marker: pass + +class Marker: + pass + def request_params_to_args( required_params: Sequence[ModelField], @@ -680,10 +683,10 @@ def request_params_to_args( if isinstance(errors_, ErrorWrapper): errors.append(errors_) elif ( - isinstance(errors_, list) - and is_scalar_sequence_mapping_field(field) - and isinstance(received_params, QueryParams) - ): + isinstance(errors_, list) + and is_scalar_sequence_mapping_field(field) + and isinstance(received_params, QueryParams) + ): new_errors = _regenerate_error_with_loc(errors=errors_, loc_prefix=()) # remove all invalid parameters marker = Marker() @@ -693,9 +696,9 @@ def request_params_to_args( value[key] = [x for x in value[key] if x != marker] values[field.name] = value elif ( - isinstance(errors_, list) - and is_scalar_mapping_field(field) - and isinstance(received_params, QueryParams) + isinstance(errors_, list) + and is_scalar_mapping_field(field) + and isinstance(received_params, QueryParams) ): new_errors = _regenerate_error_with_loc(errors=errors_, loc_prefix=()) # remove all invalid parameters diff --git a/test_openapi.json b/test_openapi.json deleted file mode 100644 index 05df1c120..000000000 --- a/test_openapi.json +++ /dev/null @@ -1,1472 +0,0 @@ -{ - "openapi": "3.1.0", - "info": { - "title": "FastAPI", - "version": "0.1.0" - }, - "paths": { - "/api_route": { - "get": { - "summary": "Non Operation", - "operationId": "non_operation_api_route_get", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - } - } - } - }, - "/non_decorated_route": { - "get": { - "summary": "Non Decorated Route", - "operationId": "non_decorated_route_non_decorated_route_get", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - } - } - } - }, - "/text": { - "get": { - "summary": "Get Text", - "operationId": "get_text_text_get", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - } - } - } - }, - "/path/{item_id}": { - "get": { - "summary": "Get Id", - "operationId": "get_id_path__item_id__get", - "parameters": [ - { - "name": "item_id", - "in": "path", - "required": true, - "schema": { - "title": "Item Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/path/str/{item_id}": { - "get": { - "summary": "Get Str Id", - "operationId": "get_str_id_path_str__item_id__get", - "parameters": [ - { - "name": "item_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "title": "Item Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/path/int/{item_id}": { - "get": { - "summary": "Get Int Id", - "operationId": "get_int_id_path_int__item_id__get", - "parameters": [ - { - "name": "item_id", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "title": "Item Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/path/float/{item_id}": { - "get": { - "summary": "Get Float Id", - "operationId": "get_float_id_path_float__item_id__get", - "parameters": [ - { - "name": "item_id", - "in": "path", - "required": true, - "schema": { - "type": "number", - "title": "Item Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/path/bool/{item_id}": { - "get": { - "summary": "Get Bool Id", - "operationId": "get_bool_id_path_bool__item_id__get", - "parameters": [ - { - "name": "item_id", - "in": "path", - "required": true, - "schema": { - "type": "boolean", - "title": "Item Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/path/param/{item_id}": { - "get": { - "summary": "Get Path Param Id", - "operationId": "get_path_param_id_path_param__item_id__get", - "parameters": [ - { - "name": "item_id", - "in": "path", - "required": true, - "schema": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Item Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/path/param-minlength/{item_id}": { - "get": { - "summary": "Get Path Param Min Length", - "operationId": "get_path_param_min_length_path_param_minlength__item_id__get", - "parameters": [ - { - "name": "item_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "minLength": 3, - "title": "Item Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/path/param-maxlength/{item_id}": { - "get": { - "summary": "Get Path Param Max Length", - "operationId": "get_path_param_max_length_path_param_maxlength__item_id__get", - "parameters": [ - { - "name": "item_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "maxLength": 3, - "title": "Item Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/path/param-min_maxlength/{item_id}": { - "get": { - "summary": "Get Path Param Min Max Length", - "operationId": "get_path_param_min_max_length_path_param_min_maxlength__item_id__get", - "parameters": [ - { - "name": "item_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "minLength": 2, - "maxLength": 3, - "title": "Item Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/path/param-gt/{item_id}": { - "get": { - "summary": "Get Path Param Gt", - "operationId": "get_path_param_gt_path_param_gt__item_id__get", - "parameters": [ - { - "name": "item_id", - "in": "path", - "required": true, - "schema": { - "type": "number", - "exclusiveMinimum": 3, - "title": "Item Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/path/param-gt0/{item_id}": { - "get": { - "summary": "Get Path Param Gt0", - "operationId": "get_path_param_gt0_path_param_gt0__item_id__get", - "parameters": [ - { - "name": "item_id", - "in": "path", - "required": true, - "schema": { - "type": "number", - "exclusiveMinimum": 0, - "title": "Item Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/path/param-ge/{item_id}": { - "get": { - "summary": "Get Path Param Ge", - "operationId": "get_path_param_ge_path_param_ge__item_id__get", - "parameters": [ - { - "name": "item_id", - "in": "path", - "required": true, - "schema": { - "type": "number", - "minimum": 3, - "title": "Item Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/path/param-lt/{item_id}": { - "get": { - "summary": "Get Path Param Lt", - "operationId": "get_path_param_lt_path_param_lt__item_id__get", - "parameters": [ - { - "name": "item_id", - "in": "path", - "required": true, - "schema": { - "type": "number", - "exclusiveMaximum": 3, - "title": "Item Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/path/param-lt0/{item_id}": { - "get": { - "summary": "Get Path Param Lt0", - "operationId": "get_path_param_lt0_path_param_lt0__item_id__get", - "parameters": [ - { - "name": "item_id", - "in": "path", - "required": true, - "schema": { - "type": "number", - "exclusiveMaximum": 0, - "title": "Item Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/path/param-le/{item_id}": { - "get": { - "summary": "Get Path Param Le", - "operationId": "get_path_param_le_path_param_le__item_id__get", - "parameters": [ - { - "name": "item_id", - "in": "path", - "required": true, - "schema": { - "type": "number", - "maximum": 3, - "title": "Item Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/path/param-lt-gt/{item_id}": { - "get": { - "summary": "Get Path Param Lt Gt", - "operationId": "get_path_param_lt_gt_path_param_lt_gt__item_id__get", - "parameters": [ - { - "name": "item_id", - "in": "path", - "required": true, - "schema": { - "type": "number", - "exclusiveMaximum": 3, - "exclusiveMinimum": 1, - "title": "Item Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/path/param-le-ge/{item_id}": { - "get": { - "summary": "Get Path Param Le Ge", - "operationId": "get_path_param_le_ge_path_param_le_ge__item_id__get", - "parameters": [ - { - "name": "item_id", - "in": "path", - "required": true, - "schema": { - "type": "number", - "maximum": 3, - "minimum": 1, - "title": "Item Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/path/param-lt-int/{item_id}": { - "get": { - "summary": "Get Path Param Lt Int", - "operationId": "get_path_param_lt_int_path_param_lt_int__item_id__get", - "parameters": [ - { - "name": "item_id", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "exclusiveMaximum": 3, - "title": "Item Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/path/param-gt-int/{item_id}": { - "get": { - "summary": "Get Path Param Gt Int", - "operationId": "get_path_param_gt_int_path_param_gt_int__item_id__get", - "parameters": [ - { - "name": "item_id", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "exclusiveMinimum": 3, - "title": "Item Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/path/param-le-int/{item_id}": { - "get": { - "summary": "Get Path Param Le Int", - "operationId": "get_path_param_le_int_path_param_le_int__item_id__get", - "parameters": [ - { - "name": "item_id", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "maximum": 3, - "title": "Item Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/path/param-ge-int/{item_id}": { - "get": { - "summary": "Get Path Param Ge Int", - "operationId": "get_path_param_ge_int_path_param_ge_int__item_id__get", - "parameters": [ - { - "name": "item_id", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "minimum": 3, - "title": "Item Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/path/param-lt-gt-int/{item_id}": { - "get": { - "summary": "Get Path Param Lt Gt Int", - "operationId": "get_path_param_lt_gt_int_path_param_lt_gt_int__item_id__get", - "parameters": [ - { - "name": "item_id", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "exclusiveMaximum": 3, - "exclusiveMinimum": 1, - "title": "Item Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/path/param-le-ge-int/{item_id}": { - "get": { - "summary": "Get Path Param Le Ge Int", - "operationId": "get_path_param_le_ge_int_path_param_le_ge_int__item_id__get", - "parameters": [ - { - "name": "item_id", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "maximum": 3, - "minimum": 1, - "title": "Item Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/query": { - "get": { - "summary": "Get Query", - "operationId": "get_query_query_get", - "parameters": [ - { - "name": "query", - "in": "query", - "required": true, - "schema": { - "title": "Query" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/query/optional": { - "get": { - "summary": "Get Query Optional", - "operationId": "get_query_optional_query_optional_get", - "parameters": [ - { - "name": "query", - "in": "query", - "required": false, - "schema": { - "title": "Query" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/query/int": { - "get": { - "summary": "Get Query Type", - "operationId": "get_query_type_query_int_get", - "parameters": [ - { - "name": "query", - "in": "query", - "required": true, - "schema": { - "type": "integer", - "title": "Query" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/query/int/optional": { - "get": { - "summary": "Get Query Type Optional", - "operationId": "get_query_type_optional_query_int_optional_get", - "parameters": [ - { - "name": "query", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Query" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/query/int/default": { - "get": { - "summary": "Get Query Type Int Default", - "operationId": "get_query_type_int_default_query_int_default_get", - "parameters": [ - { - "name": "query", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "default": 10, - "title": "Query" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/query/param": { - "get": { - "summary": "Get Query Param", - "operationId": "get_query_param_query_param_get", - "parameters": [ - { - "name": "query", - "in": "query", - "required": false, - "schema": { - "title": "Query" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/query/param-required": { - "get": { - "summary": "Get Query Param Required", - "operationId": "get_query_param_required_query_param_required_get", - "parameters": [ - { - "name": "query", - "in": "query", - "required": true, - "schema": { - "title": "Query" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/query/param-required/int": { - "get": { - "summary": "Get Query Param Required Type", - "operationId": "get_query_param_required_type_query_param_required_int_get", - "parameters": [ - { - "name": "query", - "in": "query", - "required": true, - "schema": { - "type": "integer", - "title": "Query" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/query/sequence-params": { - "get": { - "summary": "Get Sequence Query Params", - "operationId": "get_sequence_query_params_query_sequence_params_get", - "parameters": [ - { - "name": "query", - "in": "query", - "required": false, - "schema": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "type": "integer" - } - }, - "default": {}, - "title": "Query" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/query/mapping-params": { - "get": { - "summary": "Get Mapping Query Params", - "operationId": "get_mapping_query_params_query_mapping_params_get", - "parameters": [ - { - "name": "queries", - "in": "query", - "required": false, - "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "default": {}, - "title": "Queries" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/query/mapping-sequence-params": { - "get": { - "summary": "Get Sequence Mapping Query Params", - "operationId": "get_sequence_mapping_query_params_query_mapping_sequence_params_get", - "parameters": [ - { - "name": "queries", - "in": "query", - "required": false, - "schema": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "type": "integer" - } - }, - "default": {}, - "title": "Queries" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/enum-status-code": { - "get": { - "summary": "Get Enum Status Code", - "operationId": "get_enum_status_code_enum_status_code_get", - "responses": { - "201": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - } - } - } - }, - "/query/frozenset": { - "get": { - "summary": "Get Query Type Frozenset", - "operationId": "get_query_type_frozenset_query_frozenset_get", - "parameters": [ - { - "name": "query", - "in": "query", - "required": true, - "schema": { - "type": "array", - "uniqueItems": true, - "items": { - "type": "integer" - }, - "title": "Query" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - } - }, - "components": { - "schemas": { - "HTTPValidationError": { - "properties": { - "detail": { - "items": { - "$ref": "#/components/schemas/ValidationError" - }, - "type": "array", - "title": "Detail" - } - }, - "type": "object", - "title": "HTTPValidationError" - }, - "ValidationError": { - "properties": { - "loc": { - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "integer" - } - ] - }, - "type": "array", - "title": "Location" - }, - "msg": { - "type": "string", - "title": "Message" - }, - "type": { - "type": "string", - "title": "Error Type" - } - }, - "type": "object", - "required": [ - "loc", - "msg", - "type" - ], - "title": "ValidationError" - } - } - } -} \ No newline at end of file diff --git a/tests/main.py b/tests/main.py index 3eaf4863c..f9cf6f400 100644 --- a/tests/main.py +++ b/tests/main.py @@ -5,6 +5,7 @@ from fastapi import FastAPI, Path, Query app = FastAPI() + @app.api_route("/api_route") def non_operation(): return {"message": "Hello World"} diff --git a/tests/test_application.py b/tests/test_application.py index b54a97281..8fa84b074 100644 --- a/tests/test_application.py +++ b/tests/test_application.py @@ -5,1201 +5,6 @@ from .main import app client = TestClient(app) -openapi_schema = { - "openapi": "3.0.2", - "info": {"title": "FastAPI", "version": "0.1.0"}, - "paths": { - "/api_route": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - } - }, - "summary": "Non Operation", - "operationId": "non_operation_api_route_get", - } - }, - "/non_decorated_route": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - } - }, - "summary": "Non Decorated Route", - "operationId": "non_decorated_route_non_decorated_route_get", - } - }, - "/text": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - } - }, - "summary": "Get Text", - "operationId": "get_text_text_get", - } - }, - "/path/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - "summary": "Get Id", - "operationId": "get_id_path__item_id__get", - "parameters": [ - { - "required": True, - "schema": {"title": "Item Id"}, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/str/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - "summary": "Get Str Id", - "operationId": "get_str_id_path_str__item_id__get", - "parameters": [ - { - "required": True, - "schema": {"title": "Item Id", "type": "string"}, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/int/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - "summary": "Get Int Id", - "operationId": "get_int_id_path_int__item_id__get", - "parameters": [ - { - "required": True, - "schema": {"title": "Item Id", "type": "integer"}, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/float/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - "summary": "Get Float Id", - "operationId": "get_float_id_path_float__item_id__get", - "parameters": [ - { - "required": True, - "schema": {"title": "Item Id", "type": "number"}, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/bool/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - "summary": "Get Bool Id", - "operationId": "get_bool_id_path_bool__item_id__get", - "parameters": [ - { - "required": True, - "schema": {"title": "Item Id", "type": "boolean"}, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - "summary": "Get Path Param Id", - "operationId": "get_path_param_id_path_param__item_id__get", - "parameters": [ - { - "required": True, - "schema": {"title": "Item Id", "type": "string"}, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-minlength/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - "summary": "Get Path Param Min Length", - "operationId": "get_path_param_min_length_path_param_minlength__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "minLength": 3, - "type": "string", - }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-maxlength/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - "summary": "Get Path Param Max Length", - "operationId": "get_path_param_max_length_path_param_maxlength__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "maxLength": 3, - "type": "string", - }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-min_maxlength/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - "summary": "Get Path Param Min Max Length", - "operationId": "get_path_param_min_max_length_path_param_min_maxlength__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "maxLength": 3, - "minLength": 2, - "type": "string", - }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-gt/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - "summary": "Get Path Param Gt", - "operationId": "get_path_param_gt_path_param_gt__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "exclusiveMinimum": 3.0, - "type": "number", - }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-gt0/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - "summary": "Get Path Param Gt0", - "operationId": "get_path_param_gt0_path_param_gt0__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "exclusiveMinimum": 0.0, - "type": "number", - }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-ge/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - "summary": "Get Path Param Ge", - "operationId": "get_path_param_ge_path_param_ge__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "minimum": 3.0, - "type": "number", - }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-lt/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - "summary": "Get Path Param Lt", - "operationId": "get_path_param_lt_path_param_lt__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "exclusiveMaximum": 3.0, - "type": "number", - }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-lt0/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - "summary": "Get Path Param Lt0", - "operationId": "get_path_param_lt0_path_param_lt0__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "exclusiveMaximum": 0.0, - "type": "number", - }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-le/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - "summary": "Get Path Param Le", - "operationId": "get_path_param_le_path_param_le__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "maximum": 3.0, - "type": "number", - }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-lt-gt/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - "summary": "Get Path Param Lt Gt", - "operationId": "get_path_param_lt_gt_path_param_lt_gt__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "exclusiveMaximum": 3.0, - "exclusiveMinimum": 1.0, - "type": "number", - }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-le-ge/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - "summary": "Get Path Param Le Ge", - "operationId": "get_path_param_le_ge_path_param_le_ge__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "maximum": 3.0, - "minimum": 1.0, - "type": "number", - }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-lt-int/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - "summary": "Get Path Param Lt Int", - "operationId": "get_path_param_lt_int_path_param_lt_int__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "exclusiveMaximum": 3.0, - "type": "integer", - }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-gt-int/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - "summary": "Get Path Param Gt Int", - "operationId": "get_path_param_gt_int_path_param_gt_int__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "exclusiveMinimum": 3.0, - "type": "integer", - }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-le-int/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - "summary": "Get Path Param Le Int", - "operationId": "get_path_param_le_int_path_param_le_int__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "maximum": 3.0, - "type": "integer", - }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-ge-int/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - "summary": "Get Path Param Ge Int", - "operationId": "get_path_param_ge_int_path_param_ge_int__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "minimum": 3.0, - "type": "integer", - }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-lt-gt-int/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - "summary": "Get Path Param Lt Gt Int", - "operationId": "get_path_param_lt_gt_int_path_param_lt_gt_int__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "exclusiveMaximum": 3.0, - "exclusiveMinimum": 1.0, - "type": "integer", - }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-le-ge-int/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - "summary": "Get Path Param Le Ge Int", - "operationId": "get_path_param_le_ge_int_path_param_le_ge_int__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "maximum": 3.0, - "minimum": 1.0, - "type": "integer", - }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/query": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - "summary": "Get Query", - "operationId": "get_query_query_get", - "parameters": [ - { - "required": True, - "schema": {"title": "Query"}, - "name": "query", - "in": "query", - } - ], - } - }, - "/query/optional": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - "summary": "Get Query Optional", - "operationId": "get_query_optional_query_optional_get", - "parameters": [ - { - "required": False, - "schema": {"title": "Query"}, - "name": "query", - "in": "query", - } - ], - } - }, - "/query/int": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - "summary": "Get Query Type", - "operationId": "get_query_type_query_int_get", - "parameters": [ - { - "required": True, - "schema": {"title": "Query", "type": "integer"}, - "name": "query", - "in": "query", - } - ], - } - }, - "/query/int/optional": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - "summary": "Get Query Type Optional", - "operationId": "get_query_type_optional_query_int_optional_get", - "parameters": [ - { - "required": False, - "schema": {"title": "Query", "type": "integer"}, - "name": "query", - "in": "query", - } - ], - } - }, - "/query/int/default": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - "summary": "Get Query Type Int Default", - "operationId": "get_query_type_int_default_query_int_default_get", - "parameters": [ - { - "required": False, - "schema": {"title": "Query", "type": "integer", "default": 10}, - "name": "query", - "in": "query", - } - ], - } - }, - "/query/param": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - "summary": "Get Query Param", - "operationId": "get_query_param_query_param_get", - "parameters": [ - { - "required": False, - "schema": {"title": "Query"}, - "name": "query", - "in": "query", - } - ], - } - }, - "/query/param-required": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - "summary": "Get Query Param Required", - "operationId": "get_query_param_required_query_param_required_get", - "parameters": [ - { - "required": True, - "schema": {"title": "Query"}, - "name": "query", - "in": "query", - } - ], - } - }, - "/query/param-required/int": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - "summary": "Get Query Param Required Type", - "operationId": "get_query_param_required_type_query_param_required_int_get", - "parameters": [ - { - "required": True, - "schema": {"title": "Query", "type": "integer"}, - "name": "query", - "in": "query", - } - ], - } - }, - "/query/params": { - "get": { - "summary": "Get Query Params", - "operationId": "get_query_params_query_params_get", - "parameters": [ - { - "required": False, - "schema": { - "title": "Query", - "type": "object", - "additionalProperties": {"type": "integer"}, - "default": {}, - }, - "name": "query", - "in": "query", - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - } - }, - "/query/sequence-params": { - "get": { - "operationId": "get_sequence_query_params_query_sequence_params_get", - "parameters": [ - { - "in": "query", - "name": "query", - "required": False, - "schema": { - "additionalProperties": { - "items": {"type": "integer"}, - "type": "array", - }, - "default": {}, - "title": "Query", - "type": "object", - }, - } - ], - "responses": { - "200": { - "content": {"application/json": {"schema": {}}}, - "description": "Successful " "Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - "description": "Validation " "Error", - }, - }, - "summary": "Get Sequence Query " "Params", - } - }, - "/enum-status-code": { - "get": { - "responses": { - "201": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - }, - "summary": "Get Enum Status Code", - "operationId": "get_enum_status_code_enum_status_code_get", - } - }, - "/query/frozenset": { - "get": { - "summary": "Get Query Type Frozenset", - "operationId": "get_query_type_frozenset_query_frozenset_get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Query", - "uniqueItems": True, - "type": "array", - "items": {"type": "integer"}, - }, - "name": "query", - "in": "query", - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - } - }, - }, - "components": { - "schemas": { - "ValidationError": { - "title": "ValidationError", - "required": ["loc", "msg", "type"], - "type": "object", - "properties": { - "loc": { - "title": "Location", - "type": "array", - "items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, - }, - "msg": {"title": "Message", "type": "string"}, - "type": {"title": "Error Type", "type": "string"}, - }, - }, - "HTTPValidationError": { - "title": "HTTPValidationError", - "type": "object", - "properties": { - "detail": { - "title": "Detail", - "type": "array", - "items": {"$ref": "#/components/schemas/ValidationError"}, - } - }, - }, - } - }, -} - @pytest.mark.parametrize( "path,expected_status,expected_response", @@ -2413,6 +1218,126 @@ def test_openapi_schema(): }, } }, + "/query/mixed-params": { + "get": { + "summary": "Get Mixed Mapping Query Params", + "operationId": "get_mixed_mapping_query_params_query_mixed_params_get", + "parameters": [ + { + "name": "sequence_mapping_queries", + "in": "query", + "required": False, + "schema": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": {"type": "string"}, + }, + "default": {}, + "title": "Sequence Mapping Queries", + }, + }, + { + "name": "mapping_query", + "in": "query", + "required": True, + "schema": { + "type": "object", + "additionalProperties": {"type": "string"}, + "title": "Mapping Query", + }, + }, + { + "name": "query", + "in": "query", + "required": True, + "schema": {"type": "string", "title": "Query"}, + }, + ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + } + }, + "/query/mixed-type-params": { + "get": { + "summary": "Get Mixed Mapping Mixed Type Query Params", + "operationId": "get_mixed_mapping_mixed_type_query_params_query_mixed_type_params_get", + "parameters": [ + { + "name": "sequence_mapping_queries", + "in": "query", + "required": False, + "schema": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": {"type": "integer"}, + }, + "default": {}, + "title": "Sequence Mapping Queries", + }, + }, + { + "name": "mapping_query_str", + "in": "query", + "required": False, + "schema": { + "type": "object", + "additionalProperties": {"type": "string"}, + "default": {}, + "title": "Mapping Query Str", + }, + }, + { + "name": "mapping_query_int", + "in": "query", + "required": False, + "schema": { + "type": "object", + "additionalProperties": {"type": "integer"}, + "default": {}, + "title": "Mapping Query Int", + }, + }, + { + "name": "query", + "in": "query", + "required": True, + "schema": {"type": "integer", "title": "Query"}, + }, + ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + } + }, "/enum-status-code": { "get": { "summary": "Get Enum Status Code", diff --git a/tests/test_query.py b/tests/test_query.py index 7619762da..9924f20c2 100644 --- a/tests/test_query.py +++ b/tests/test_query.py @@ -425,7 +425,10 @@ def test_mapping_with_non_mapping_query(): def test_mapping_with_non_mapping_query_mixed_types(): response = client.get("/query/mixed-type-params/?foo=fuzz&foo=baz&bar=buzz&query=1") assert response.status_code == 200 - assert response.json() == "foo bar 1 {'foo': 'baz', 'bar': 'buzz', 'query': '1'} {'query': '1'} {'foo': [], 'bar': [], 'query': ['1']}" + assert ( + response.json() + == "foo bar 1 {'foo': 'baz', 'bar': 'buzz', 'query': '1'} {'query': '1'} {'foo': [], 'bar': [], 'query': ['1']}" + ) def test_sequence_mapping_query(): From a1bfbd3fc788f3f068473d70fe4faf4f21a58451 Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Sat, 8 Jul 2023 09:57:15 +0000 Subject: [PATCH 30/91] add new routes to api schema --- tests/test_application.py | 1748 +++++++++++++++++++------------------ 1 file changed, 900 insertions(+), 848 deletions(-) diff --git a/tests/test_application.py b/tests/test_application.py index 8fa84b074..ba2942196 100644 --- a/tests/test_application.py +++ b/tests/test_application.py @@ -1,4 +1,6 @@ import pytest +from deepdiff import DeepDiff +from dirty_equals import IsDict from fastapi.testclient import TestClient from .main import app @@ -60,172 +62,162 @@ def test_openapi_schema(): "paths": { "/api_route": { "get": { - "summary": "Non Operation", - "operationId": "non_operation_api_route_get", "responses": { "200": { "description": "Successful Response", "content": {"application/json": {"schema": {}}}, } }, + "summary": "Non Operation", + "operationId": "non_operation_api_route_get", } }, "/non_decorated_route": { "get": { - "summary": "Non Decorated Route", - "operationId": "non_decorated_route_non_decorated_route_get", "responses": { "200": { "description": "Successful Response", "content": {"application/json": {"schema": {}}}, } }, + "summary": "Non Decorated Route", + "operationId": "non_decorated_route_non_decorated_route_get", } }, "/text": { "get": { - "summary": "Get Text", - "operationId": "get_text_text_get", "responses": { "200": { "description": "Successful Response", "content": {"application/json": {"schema": {}}}, } }, + "summary": "Get Text", + "operationId": "get_text_text_get", } }, "/path/{item_id}": { "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, "summary": "Get Id", "operationId": "get_id_path__item_id__get", "parameters": [ { - "name": "item_id", - "in": "path", "required": True, "schema": {"title": "Item Id"}, + "name": "item_id", + "in": "path", } ], - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, } }, "/path/str/{item_id}": { "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, "summary": "Get Str Id", "operationId": "get_str_id_path_str__item_id__get", "parameters": [ { + "required": True, + "schema": {"title": "Item Id", "type": "string"}, "name": "item_id", "in": "path", - "required": True, - "schema": {"type": "string", "title": "Item Id"}, } ], - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, } }, "/path/int/{item_id}": { "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, "summary": "Get Int Id", "operationId": "get_int_id_path_int__item_id__get", "parameters": [ { + "required": True, + "schema": {"title": "Item Id", "type": "integer"}, "name": "item_id", "in": "path", - "required": True, - "schema": {"type": "integer", "title": "Item Id"}, } ], - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, } }, "/path/float/{item_id}": { "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, "summary": "Get Float Id", "operationId": "get_float_id_path_float__item_id__get", "parameters": [ { + "required": True, + "schema": {"title": "Item Id", "type": "number"}, "name": "item_id", "in": "path", - "required": True, - "schema": {"type": "number", "title": "Item Id"}, } ], - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, } }, "/path/bool/{item_id}": { "get": { - "summary": "Get Bool Id", - "operationId": "get_bool_id_path_bool__item_id__get", - "parameters": [ - { - "name": "item_id", - "in": "path", - "required": True, - "schema": {"type": "boolean", "title": "Item Id"}, - } - ], "responses": { "200": { "description": "Successful Response", @@ -242,10 +234,36 @@ def test_openapi_schema(): }, }, }, + "summary": "Get Bool Id", + "operationId": "get_bool_id_path_bool__item_id__get", + "parameters": [ + { + "required": True, + "schema": {"title": "Item Id", "type": "boolean"}, + "name": "item_id", + "in": "path", + } + ], } }, "/path/param/{item_id}": { "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, "summary": "Get Path Param Id", "operationId": "get_path_param_id_path_param__item_id__get", "parameters": [ @@ -253,685 +271,663 @@ def test_openapi_schema(): "name": "item_id", "in": "path", "required": True, - "schema": { - "anyOf": [{"type": "string"}, {"type": "null"}], - "title": "Item Id", - }, + "schema": IsDict( + { + "anyOf": [{"type": "string"}, {"type": "null"}], + "title": "Item Id", + } + ) + # TODO: remove when deprecating Pydantic v1 + | IsDict({"title": "Item Id", "type": "string"}), } ], - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, } }, "/path/param-minlength/{item_id}": { "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, "summary": "Get Path Param Min Length", "operationId": "get_path_param_min_length_path_param_minlength__item_id__get", "parameters": [ { - "name": "item_id", - "in": "path", "required": True, "schema": { - "type": "string", - "minLength": 3, "title": "Item Id", + "minLength": 3, + "type": "string", }, + "name": "item_id", + "in": "path", } ], - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, } }, "/path/param-maxlength/{item_id}": { "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, "summary": "Get Path Param Max Length", "operationId": "get_path_param_max_length_path_param_maxlength__item_id__get", "parameters": [ { - "name": "item_id", - "in": "path", "required": True, "schema": { - "type": "string", - "maxLength": 3, "title": "Item Id", + "maxLength": 3, + "type": "string", }, + "name": "item_id", + "in": "path", } ], - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, } }, "/path/param-min_maxlength/{item_id}": { "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, "summary": "Get Path Param Min Max Length", "operationId": "get_path_param_min_max_length_path_param_min_maxlength__item_id__get", "parameters": [ { - "name": "item_id", - "in": "path", "required": True, "schema": { - "type": "string", - "minLength": 2, - "maxLength": 3, "title": "Item Id", + "maxLength": 3, + "minLength": 2, + "type": "string", }, + "name": "item_id", + "in": "path", } ], - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, } }, "/path/param-gt/{item_id}": { "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, "summary": "Get Path Param Gt", "operationId": "get_path_param_gt_path_param_gt__item_id__get", "parameters": [ { - "name": "item_id", - "in": "path", "required": True, "schema": { - "type": "number", - "exclusiveMinimum": 3, "title": "Item Id", + "exclusiveMinimum": 3.0, + "type": "number", }, + "name": "item_id", + "in": "path", } ], - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, } }, "/path/param-gt0/{item_id}": { "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, "summary": "Get Path Param Gt0", "operationId": "get_path_param_gt0_path_param_gt0__item_id__get", "parameters": [ { - "name": "item_id", - "in": "path", "required": True, "schema": { - "type": "number", - "exclusiveMinimum": 0, "title": "Item Id", + "exclusiveMinimum": 0.0, + "type": "number", }, + "name": "item_id", + "in": "path", } ], - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, } }, "/path/param-ge/{item_id}": { "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, "summary": "Get Path Param Ge", "operationId": "get_path_param_ge_path_param_ge__item_id__get", "parameters": [ { - "name": "item_id", - "in": "path", "required": True, "schema": { - "type": "number", - "minimum": 3, "title": "Item Id", + "minimum": 3.0, + "type": "number", }, + "name": "item_id", + "in": "path", } ], - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, } }, "/path/param-lt/{item_id}": { "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, "summary": "Get Path Param Lt", "operationId": "get_path_param_lt_path_param_lt__item_id__get", "parameters": [ { - "name": "item_id", - "in": "path", "required": True, "schema": { - "type": "number", - "exclusiveMaximum": 3, "title": "Item Id", + "exclusiveMaximum": 3.0, + "type": "number", }, + "name": "item_id", + "in": "path", } ], - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, } }, "/path/param-lt0/{item_id}": { "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, "summary": "Get Path Param Lt0", "operationId": "get_path_param_lt0_path_param_lt0__item_id__get", "parameters": [ { - "name": "item_id", - "in": "path", "required": True, "schema": { - "type": "number", - "exclusiveMaximum": 0, "title": "Item Id", + "exclusiveMaximum": 0.0, + "type": "number", }, + "name": "item_id", + "in": "path", } ], - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, } }, "/path/param-le/{item_id}": { "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, "summary": "Get Path Param Le", "operationId": "get_path_param_le_path_param_le__item_id__get", "parameters": [ { - "name": "item_id", - "in": "path", "required": True, "schema": { - "type": "number", - "maximum": 3, "title": "Item Id", + "maximum": 3.0, + "type": "number", }, + "name": "item_id", + "in": "path", } ], - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, } }, "/path/param-lt-gt/{item_id}": { "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, "summary": "Get Path Param Lt Gt", "operationId": "get_path_param_lt_gt_path_param_lt_gt__item_id__get", "parameters": [ { - "name": "item_id", - "in": "path", "required": True, "schema": { - "type": "number", - "exclusiveMaximum": 3, - "exclusiveMinimum": 1, "title": "Item Id", + "exclusiveMaximum": 3.0, + "exclusiveMinimum": 1.0, + "type": "number", }, + "name": "item_id", + "in": "path", } ], - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, } }, "/path/param-le-ge/{item_id}": { "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, "summary": "Get Path Param Le Ge", "operationId": "get_path_param_le_ge_path_param_le_ge__item_id__get", "parameters": [ { - "name": "item_id", - "in": "path", "required": True, "schema": { - "type": "number", - "maximum": 3, - "minimum": 1, "title": "Item Id", + "maximum": 3.0, + "minimum": 1.0, + "type": "number", }, + "name": "item_id", + "in": "path", } ], - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, } }, "/path/param-lt-int/{item_id}": { "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, "summary": "Get Path Param Lt Int", "operationId": "get_path_param_lt_int_path_param_lt_int__item_id__get", "parameters": [ { - "name": "item_id", - "in": "path", "required": True, "schema": { - "type": "integer", - "exclusiveMaximum": 3, "title": "Item Id", + "exclusiveMaximum": 3.0, + "type": "integer", }, + "name": "item_id", + "in": "path", } ], - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, } }, "/path/param-gt-int/{item_id}": { "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, "summary": "Get Path Param Gt Int", "operationId": "get_path_param_gt_int_path_param_gt_int__item_id__get", "parameters": [ { - "name": "item_id", - "in": "path", "required": True, "schema": { - "type": "integer", - "exclusiveMinimum": 3, "title": "Item Id", + "exclusiveMinimum": 3.0, + "type": "integer", }, + "name": "item_id", + "in": "path", } ], - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, } }, "/path/param-le-int/{item_id}": { "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, "summary": "Get Path Param Le Int", "operationId": "get_path_param_le_int_path_param_le_int__item_id__get", "parameters": [ { - "name": "item_id", - "in": "path", "required": True, "schema": { - "type": "integer", - "maximum": 3, "title": "Item Id", + "maximum": 3.0, + "type": "integer", }, + "name": "item_id", + "in": "path", } ], - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, } }, "/path/param-ge-int/{item_id}": { "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, "summary": "Get Path Param Ge Int", "operationId": "get_path_param_ge_int_path_param_ge_int__item_id__get", "parameters": [ { - "name": "item_id", - "in": "path", "required": True, "schema": { - "type": "integer", - "minimum": 3, "title": "Item Id", + "minimum": 3.0, + "type": "integer", }, + "name": "item_id", + "in": "path", } ], - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, } }, "/path/param-lt-gt-int/{item_id}": { "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, "summary": "Get Path Param Lt Gt Int", "operationId": "get_path_param_lt_gt_int_path_param_lt_gt_int__item_id__get", "parameters": [ { - "name": "item_id", - "in": "path", "required": True, "schema": { - "type": "integer", - "exclusiveMaximum": 3, - "exclusiveMinimum": 1, "title": "Item Id", + "exclusiveMaximum": 3.0, + "exclusiveMinimum": 1.0, + "type": "integer", }, + "name": "item_id", + "in": "path", } ], - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, } }, "/path/param-le-ge-int/{item_id}": { "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, "summary": "Get Path Param Le Ge Int", "operationId": "get_path_param_le_ge_int_path_param_le_ge_int__item_id__get", "parameters": [ { - "name": "item_id", - "in": "path", "required": True, "schema": { - "type": "integer", - "maximum": 3, - "minimum": 1, "title": "Item Id", + "maximum": 3.0, + "minimum": 1.0, + "type": "integer", }, + "name": "item_id", + "in": "path", } ], - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, } }, "/query": { "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, "summary": "Get Query", "operationId": "get_query_query_get", "parameters": [ { - "name": "query", - "in": "query", "required": True, "schema": {"title": "Query"}, + "name": "query", + "in": "query", } ], - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, } }, "/query/optional": { "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, "summary": "Get Query Optional", "operationId": "get_query_optional_query_optional_get", "parameters": [ { - "name": "query", - "in": "query", "required": False, "schema": {"title": "Query"}, + "name": "query", + "in": "query", } ], - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, } }, "/query/int": { "get": { - "summary": "Get Query Type", - "operationId": "get_query_type_query_int_get", - "parameters": [ - { - "name": "query", - "in": "query", - "required": True, - "schema": {"type": "integer", "title": "Query"}, - } - ], "responses": { "200": { "description": "Successful Response", @@ -948,10 +944,36 @@ def test_openapi_schema(): }, }, }, + "summary": "Get Query Type", + "operationId": "get_query_type_query_int_get", + "parameters": [ + { + "required": True, + "schema": {"title": "Query", "type": "integer"}, + "name": "query", + "in": "query", + } + ], } }, "/query/int/optional": { "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, "summary": "Get Query Type Optional", "operationId": "get_query_type_optional_query_int_optional_get", "parameters": [ @@ -959,395 +981,152 @@ def test_openapi_schema(): "name": "query", "in": "query", "required": False, - "schema": { - "anyOf": [{"type": "integer"}, {"type": "null"}], - "title": "Query", - }, + "schema": IsDict( + { + "anyOf": [{"type": "integer"}, {"type": "null"}], + "title": "Query", + } + ) + # TODO: remove when deprecating Pydantic v1 + | IsDict({"title": "Query", "type": "integer"}), } ], - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, } }, "/query/int/default": { "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, "summary": "Get Query Type Int Default", "operationId": "get_query_type_int_default_query_int_default_get", "parameters": [ { - "name": "query", - "in": "query", "required": False, "schema": { + "title": "Query", "type": "integer", "default": 10, - "title": "Query", }, + "name": "query", + "in": "query", } ], - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, } }, "/query/param": { "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, "summary": "Get Query Param", "operationId": "get_query_param_query_param_get", "parameters": [ { - "name": "query", - "in": "query", "required": False, "schema": {"title": "Query"}, + "name": "query", + "in": "query", } ], - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, } }, "/query/param-required": { "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, "summary": "Get Query Param Required", "operationId": "get_query_param_required_query_param_required_get", "parameters": [ { - "name": "query", - "in": "query", "required": True, "schema": {"title": "Query"}, + "name": "query", + "in": "query", } ], - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, } }, "/query/param-required/int": { "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, "summary": "Get Query Param Required Type", "operationId": "get_query_param_required_type_query_param_required_int_get", "parameters": [ { + "required": True, + "schema": {"title": "Query", "type": "integer"}, "name": "query", "in": "query", - "required": True, - "schema": {"type": "integer", "title": "Query"}, } ], - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - } - }, - "/query/sequence-params": { - "get": { - "summary": "Get Sequence Query Params", - "operationId": "get_sequence_query_params_query_sequence_params_get", - "parameters": [ - { - "name": "query", - "in": "query", - "required": False, - "schema": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": {"type": "integer"}, - }, - "default": {}, - "title": "Query", - }, - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - } - }, - "/query/mapping-params": { - "get": { - "summary": "Get Mapping Query Params", - "operationId": "get_mapping_query_params_query_mapping_params_get", - "parameters": [ - { - "name": "queries", - "in": "query", - "required": False, - "schema": { - "type": "object", - "additionalProperties": {"type": "string"}, - "default": {}, - "title": "Queries", - }, - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - } - }, - "/query/mapping-sequence-params": { - "get": { - "summary": "Get Sequence Mapping Query Params", - "operationId": "get_sequence_mapping_query_params_query_mapping_sequence_params_get", - "parameters": [ - { - "name": "queries", - "in": "query", - "required": False, - "schema": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": {"type": "integer"}, - }, - "default": {}, - "title": "Queries", - }, - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - } - }, - "/query/mixed-params": { - "get": { - "summary": "Get Mixed Mapping Query Params", - "operationId": "get_mixed_mapping_query_params_query_mixed_params_get", - "parameters": [ - { - "name": "sequence_mapping_queries", - "in": "query", - "required": False, - "schema": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": {"type": "string"}, - }, - "default": {}, - "title": "Sequence Mapping Queries", - }, - }, - { - "name": "mapping_query", - "in": "query", - "required": True, - "schema": { - "type": "object", - "additionalProperties": {"type": "string"}, - "title": "Mapping Query", - }, - }, - { - "name": "query", - "in": "query", - "required": True, - "schema": {"type": "string", "title": "Query"}, - }, - ], - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - } - }, - "/query/mixed-type-params": { - "get": { - "summary": "Get Mixed Mapping Mixed Type Query Params", - "operationId": "get_mixed_mapping_mixed_type_query_params_query_mixed_type_params_get", - "parameters": [ - { - "name": "sequence_mapping_queries", - "in": "query", - "required": False, - "schema": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": {"type": "integer"}, - }, - "default": {}, - "title": "Sequence Mapping Queries", - }, - }, - { - "name": "mapping_query_str", - "in": "query", - "required": False, - "schema": { - "type": "object", - "additionalProperties": {"type": "string"}, - "default": {}, - "title": "Mapping Query Str", - }, - }, - { - "name": "mapping_query_int", - "in": "query", - "required": False, - "schema": { - "type": "object", - "additionalProperties": {"type": "integer"}, - "default": {}, - "title": "Mapping Query Int", - }, - }, - { - "name": "query", - "in": "query", - "required": True, - "schema": {"type": "integer", "title": "Query"}, - }, - ], - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, } }, "/enum-status-code": { "get": { - "summary": "Get Enum Status Code", - "operationId": "get_enum_status_code_enum_status_code_get", "responses": { "201": { "description": "Successful Response", "content": {"application/json": {"schema": {}}}, - } + }, }, + "summary": "Get Enum Status Code", + "operationId": "get_enum_status_code_enum_status_code_get", } }, "/query/frozenset": { @@ -1356,15 +1135,15 @@ def test_openapi_schema(): "operationId": "get_query_type_frozenset_query_frozenset_get", "parameters": [ { - "name": "query", - "in": "query", "required": True, "schema": { - "type": "array", - "uniqueItems": True, - "items": {"type": "integer"}, "title": "Query", + "uniqueItems": True, + "type": "array", + "items": {"type": "integer"}, }, + "name": "query", + "in": "query", } ], "responses": { @@ -1385,35 +1164,308 @@ def test_openapi_schema(): }, } }, + "/query/sequence-params": { + "get": { + "summary": "Get Sequence Query Params", + "operationId": "get_sequence_query_params_query_sequence_params_get", + "parameters": [ + { + "required": False, + "schema": { + "additionalProperties": { + "items": { + "type": "integer" + }, + "type": "array" + }, + "type": "object", + "title": "Query", + "default": {} + }, + "name": "query", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/query/mapping-params": { + "get": { + "summary": "Get Mapping Query Params", + "operationId": "get_mapping_query_params_query_mapping_params_get", + "parameters": [ + { + "required": False, + "schema": { + "additionalProperties": { + "type": "string" + }, + "type": "object", + "title": "Queries", + "default": {} + }, + "name": "queries", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/query/mapping-sequence-params": { + "get": { + "summary": "Get Sequence Mapping Query Params", + "operationId": "get_sequence_mapping_query_params_query_mapping_sequence_params_get", + "parameters": [ + { + "required": False, + "schema": { + "additionalProperties": { + "items": { + "type": "integer" + }, + "type": "array" + }, + "type": "object", + "title": "Queries", + "default": {} + }, + "name": "queries", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/query/mixed-params": { + "get": { + "summary": "Get Mixed Mapping Query Params", + "operationId": "get_mixed_mapping_query_params_query_mixed_params_get", + "parameters": [ + { + "required": False, + "schema": { + "additionalProperties": { + "items": { + "type": "string" + }, + "type": "array" + }, + "type": "object", + "title": "Sequence Mapping Queries", + "default": {} + }, + "name": "sequence_mapping_queries", + "in": "query" + }, + { + "required": True, + "schema": { + "additionalProperties": { + "type": "string" + }, + "type": "object", + "title": "Mapping Query" + }, + "name": "mapping_query", + "in": "query" + }, + { + "required": True, + "schema": { + "type": "string", + "title": "Query" + }, + "name": "query", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/query/mixed-type-params": { + "get": { + "summary": "Get Mixed Mapping Mixed Type Query Params", + "operationId": "get_mixed_mapping_mixed_type_query_params_query_mixed_type_params_get", + "parameters": [ + { + "required": False, + "schema": { + "additionalProperties": { + "items": { + "type": "integer" + }, + "type": "array" + }, + "type": "object", + "title": "Sequence Mapping Queries", + "default": {} + }, + "name": "sequence_mapping_queries", + "in": "query" + }, + { + "required": False, + "schema": { + "additionalProperties": { + "type": "string" + }, + "type": "object", + "title": "Mapping Query Str", + "default": {} + }, + "name": "mapping_query_str", + "in": "query" + }, + { + "required": False, + "schema": { + "additionalProperties": { + "type": "integer" + }, + "type": "object", + "title": "Mapping Query Int", + "default": {} + }, + "name": "mapping_query_int", + "in": "query" + }, + { + "required": True, + "schema": { + "type": "integer", + "title": "Query" + }, + "name": "query", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + } }, "components": { "schemas": { - "HTTPValidationError": { - "properties": { - "detail": { - "items": {"$ref": "#/components/schemas/ValidationError"}, - "type": "array", - "title": "Detail", - } - }, - "type": "object", - "title": "HTTPValidationError", - }, "ValidationError": { + "title": "ValidationError", + "required": ["loc", "msg", "type"], + "type": "object", "properties": { "loc": { + "title": "Location", + "type": "array", "items": { "anyOf": [{"type": "string"}, {"type": "integer"}] }, - "type": "array", - "title": "Location", }, - "msg": {"type": "string", "title": "Message"}, - "type": {"type": "string", "title": "Error Type"}, + "msg": {"title": "Message", "type": "string"}, + "type": {"title": "Error Type", "type": "string"}, }, + }, + "HTTPValidationError": { + "title": "HTTPValidationError", "type": "object", - "required": ["loc", "msg", "type"], - "title": "ValidationError", + "properties": { + "detail": { + "title": "Detail", + "type": "array", + "items": {"$ref": "#/components/schemas/ValidationError"}, + } + }, }, } }, From dab77ec54b5abb36bd73aaee7ddee9bb5e63885c Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Sat, 8 Jul 2023 09:57:56 +0000 Subject: [PATCH 31/91] rm unused --- tests/test_application.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_application.py b/tests/test_application.py index ba2942196..5fd1a9c58 100644 --- a/tests/test_application.py +++ b/tests/test_application.py @@ -1,5 +1,4 @@ import pytest -from deepdiff import DeepDiff from dirty_equals import IsDict from fastapi.testclient import TestClient From 4ee9c097a2825b500639af9e042d1dc31f1c30c2 Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Sat, 8 Jul 2023 09:58:58 +0000 Subject: [PATCH 32/91] fmt --- tests/test_application.py | 472 +++++++++++++++++--------------------- 1 file changed, 215 insertions(+), 257 deletions(-) diff --git a/tests/test_application.py b/tests/test_application.py index 5fd1a9c58..17f2ca31e 100644 --- a/tests/test_application.py +++ b/tests/test_application.py @@ -1163,279 +1163,237 @@ def test_openapi_schema(): }, } }, - "/query/sequence-params": { - "get": { - "summary": "Get Sequence Query Params", - "operationId": "get_sequence_query_params_query_sequence_params_get", - "parameters": [ - { - "required": False, - "schema": { - "additionalProperties": { - "items": { - "type": "integer" + "/query/sequence-params": { + "get": { + "summary": "Get Sequence Query Params", + "operationId": "get_sequence_query_params_query_sequence_params_get", + "parameters": [ + { + "required": False, + "schema": { + "additionalProperties": { + "items": {"type": "integer"}, + "type": "array", + }, + "type": "object", + "title": "Query", + "default": {}, }, - "type": "array" + "name": "query", + "in": "query", + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, }, - "type": "object", - "title": "Query", - "default": {} - }, - "name": "query", - "in": "query" - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/query/mapping-params": { - "get": { - "summary": "Get Mapping Query Params", - "operationId": "get_mapping_query_params_query_mapping_params_get", - "parameters": [ - { - "required": False, - "schema": { - "additionalProperties": { - "type": "string" - }, - "type": "object", - "title": "Queries", - "default": {} - }, - "name": "queries", - "in": "query" - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/query/mapping-sequence-params": { - "get": { - "summary": "Get Sequence Mapping Query Params", - "operationId": "get_sequence_mapping_query_params_query_mapping_sequence_params_get", - "parameters": [ - { - "required": False, - "schema": { - "additionalProperties": { - "items": { - "type": "integer" + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } }, - "type": "array" }, - "type": "object", - "title": "Queries", - "default": {} }, - "name": "queries", - "in": "query" } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { + }, + "/query/mapping-params": { + "get": { + "summary": "Get Mapping Query Params", + "operationId": "get_mapping_query_params_query_mapping_params_get", + "parameters": [ + { + "required": False, "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/query/mixed-params": { - "get": { - "summary": "Get Mixed Mapping Query Params", - "operationId": "get_mixed_mapping_query_params_query_mixed_params_get", - "parameters": [ - { - "required": False, - "schema": { - "additionalProperties": { - "items": { - "type": "string" + "additionalProperties": {"type": "string"}, + "type": "object", + "title": "Queries", + "default": {}, }, - "type": "array" - }, - "type": "object", - "title": "Sequence Mapping Queries", - "default": {} - }, - "name": "sequence_mapping_queries", - "in": "query" - }, - { - "required": True, - "schema": { - "additionalProperties": { - "type": "string" - }, - "type": "object", - "title": "Mapping Query" - }, - "name": "mapping_query", - "in": "query" - }, - { - "required": True, - "schema": { - "type": "string", - "title": "Query" - }, - "name": "query", - "in": "query" - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} + "name": "queries", + "in": "query", } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/query/mixed-type-params": { - "get": { - "summary": "Get Mixed Mapping Mixed Type Query Params", - "operationId": "get_mixed_mapping_mixed_type_query_params_query_mixed_type_params_get", - "parameters": [ - { - "required": False, - "schema": { - "additionalProperties": { - "items": { - "type": "integer" + ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } }, - "type": "array" }, - "type": "object", - "title": "Sequence Mapping Queries", - "default": {} }, - "name": "sequence_mapping_queries", - "in": "query" - }, - { - "required": False, - "schema": { - "additionalProperties": { - "type": "string" - }, - "type": "object", - "title": "Mapping Query Str", - "default": {} - }, - "name": "mapping_query_str", - "in": "query" - }, - { - "required": False, - "schema": { - "additionalProperties": { - "type": "integer" - }, - "type": "object", - "title": "Mapping Query Int", - "default": {} - }, - "name": "mapping_query_int", - "in": "query" - }, - { - "required": True, - "schema": { - "type": "integer", - "title": "Query" - }, - "name": "query", - "in": "query" } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { + }, + "/query/mapping-sequence-params": { + "get": { + "summary": "Get Sequence Mapping Query Params", + "operationId": "get_sequence_mapping_query_params_query_mapping_sequence_params_get", + "parameters": [ + { + "required": False, "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } + "additionalProperties": { + "items": {"type": "integer"}, + "type": "array", + }, + "type": "object", + "title": "Queries", + "default": {}, + }, + "name": "queries", + "in": "query", } - } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, } - } - } - } + }, + "/query/mixed-params": { + "get": { + "summary": "Get Mixed Mapping Query Params", + "operationId": "get_mixed_mapping_query_params_query_mixed_params_get", + "parameters": [ + { + "required": False, + "schema": { + "additionalProperties": { + "items": {"type": "string"}, + "type": "array", + }, + "type": "object", + "title": "Sequence Mapping Queries", + "default": {}, + }, + "name": "sequence_mapping_queries", + "in": "query", + }, + { + "required": True, + "schema": { + "additionalProperties": {"type": "string"}, + "type": "object", + "title": "Mapping Query", + }, + "name": "mapping_query", + "in": "query", + }, + { + "required": True, + "schema": {"type": "string", "title": "Query"}, + "name": "query", + "in": "query", + }, + ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + } + }, + "/query/mixed-type-params": { + "get": { + "summary": "Get Mixed Mapping Mixed Type Query Params", + "operationId": "get_mixed_mapping_mixed_type_query_params_query_mixed_type_params_get", + "parameters": [ + { + "required": False, + "schema": { + "additionalProperties": { + "items": {"type": "integer"}, + "type": "array", + }, + "type": "object", + "title": "Sequence Mapping Queries", + "default": {}, + }, + "name": "sequence_mapping_queries", + "in": "query", + }, + { + "required": False, + "schema": { + "additionalProperties": {"type": "string"}, + "type": "object", + "title": "Mapping Query Str", + "default": {}, + }, + "name": "mapping_query_str", + "in": "query", + }, + { + "required": False, + "schema": { + "additionalProperties": {"type": "integer"}, + "type": "object", + "title": "Mapping Query Int", + "default": {}, + }, + "name": "mapping_query_int", + "in": "query", + }, + { + "required": True, + "schema": {"type": "integer", "title": "Query"}, + "name": "query", + "in": "query", + }, + ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + } + }, }, "components": { "schemas": { From c020f9c8a92b0882f936b816bb418ef2d6d1c8ff Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Sat, 8 Jul 2023 10:26:53 +0000 Subject: [PATCH 33/91] add docs --- .../img/tutorial/query-params/image01.png | Bin 0 -> 358703 bytes docs/en/docs/tutorial/query-params.md | 42 ++++++++++++++++++ docs_src/query_params/tutorial007_py310.py | 20 +++++++++ 3 files changed, 62 insertions(+) create mode 100644 docs/en/docs/img/tutorial/query-params/image01.png create mode 100644 docs_src/query_params/tutorial007_py310.py diff --git a/docs/en/docs/img/tutorial/query-params/image01.png b/docs/en/docs/img/tutorial/query-params/image01.png new file mode 100644 index 0000000000000000000000000000000000000000..6222a9aef3177938f5a5f3a20bc4af36113622f5 GIT binary patch literal 358703 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 literal 0 HcmV?d00001 diff --git a/docs/en/docs/tutorial/query-params.md b/docs/en/docs/tutorial/query-params.md index 0b74b10f8..0ed34c998 100644 --- a/docs/en/docs/tutorial/query-params.md +++ b/docs/en/docs/tutorial/query-params.md @@ -223,3 +223,45 @@ In this case, there are 3 query parameters: !!! tip You could also use `Enum`s the same way as with [Path Parameters](path-params.md#predefined-values){.internal-link target=_blank}. + +## Free Form Query Parameters + +Sometimes you want to receive some query parameters, but you don't know in advance what they will be. **FastAPI** supports this case too. + +=== "Python 3.10+" + + ```Python hl_lines="8" + {!> ../../../docs_src/query_params/tutorial007_py310.py!} + ``` + +And when you open your browser at http://127.0.0.1:8000/docs, you will that OpenAPI supports this too: + + + +However, since the query parameters are decaled in the request as + +``` +http://127.0.0.1:8000/query/mixed-type-params?query=1&foo=bar&foo=baz +``` + +**FastAPI** greedily adds all the query parameters to every `Query` argument for which it is valid. The above request will be parsed as: + +```Python +{ + "query": 1, + "string_mapping": { + "query": "1", + "foo": "baz" + }, + "mapping_query_int": { + "query": 1 + }, + "sequence_mapping_queries": { + "query": [ + "1" + ], + "foo": [] + } +} +``` +As you can see the `query` parameter is added to every `Query` argument for which it is valid. This is because **FastAPI** does not know which `Query` argument you want to add the `query` parameter to, and `1` validates as an `int`, `str`, and `List[str]`. `foo` is only added to the `string_mapping` and `sequence_mapping_queries` arguments because it is not a valid `int`. \ No newline at end of file diff --git a/docs_src/query_params/tutorial007_py310.py b/docs_src/query_params/tutorial007_py310.py new file mode 100644 index 000000000..d8a9f5079 --- /dev/null +++ b/docs_src/query_params/tutorial007_py310.py @@ -0,0 +1,20 @@ +from typing import Mapping, List + +from fastapi import FastAPI, Query + +app = FastAPI() + + +@app.get("/query/mixed-type-params") +def get_mixed_mapping_mixed_type_query_params( + query: int = Query(), + mapping_query_str: Mapping[str, str] = Query({}), + mapping_query_int: Mapping[str, int] = Query({}), + sequence_mapping_queries: Mapping[str, List[int]] = Query({}), +): + return { + "query":query, + "string_mapping": mapping_query_str, + "mapping_query_int": mapping_query_int, + "sequence_mapping_queries": sequence_mapping_queries + } From 3ee26432faa269338901e3609592b194a7748858 Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Sat, 8 Jul 2023 10:28:15 +0000 Subject: [PATCH 34/91] add tutorial test --- .../test_tutorial007_py310.py | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 tests/test_tutorial/test_query_params/test_tutorial007_py310.py diff --git a/tests/test_tutorial/test_query_params/test_tutorial007_py310.py b/tests/test_tutorial/test_query_params/test_tutorial007_py310.py new file mode 100644 index 000000000..169742f8f --- /dev/null +++ b/tests/test_tutorial/test_query_params/test_tutorial007_py310.py @@ -0,0 +1,33 @@ +import pytest +from dirty_equals import IsDict +from fastapi.testclient import TestClient +from fastapi.utils import match_pydantic_error_url + + +@pytest.fixture(name="client") +def get_client(): + from docs_src.query_params.tutorial006 import app + + c = TestClient(app) + return c + + +def test_foo_needy_very(client: TestClient): + response = client.get("/items/foo?needy=very") + assert response.status_code == 200 + assert response.json() == { + "query": 1, + "string_mapping": { + "query": "1", + "foo": "baz" + }, + "mapping_query_int": { + "query": 1 + }, + "sequence_mapping_queries": { + "query": [ + "1" + ], + "foo": [] + } + } \ No newline at end of file From cac66df220401385fbf11c61636987902729ba5c Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Sat, 8 Jul 2023 10:40:48 +0000 Subject: [PATCH 35/91] add validaiton to parsed fields --- docs/en/docs/tutorial/query-params.md | 4 +-- docs_src/query_params/tutorial007_py310.py | 12 ++++----- fastapi/dependencies/utils.py | 6 +++-- .../test_tutorial007_py310.py | 26 +++++-------------- 4 files changed, 19 insertions(+), 29 deletions(-) diff --git a/docs/en/docs/tutorial/query-params.md b/docs/en/docs/tutorial/query-params.md index 0ed34c998..4596880f2 100644 --- a/docs/en/docs/tutorial/query-params.md +++ b/docs/en/docs/tutorial/query-params.md @@ -238,7 +238,7 @@ And when you open your browser at -However, since the query parameters are decaled in the request as +However, since the query parameters are decaled in the request as ``` http://127.0.0.1:8000/query/mixed-type-params?query=1&foo=bar&foo=baz @@ -264,4 +264,4 @@ http://127.0.0.1:8000/query/mixed-type-params?query=1&foo=bar&foo=baz } } ``` -As you can see the `query` parameter is added to every `Query` argument for which it is valid. This is because **FastAPI** does not know which `Query` argument you want to add the `query` parameter to, and `1` validates as an `int`, `str`, and `List[str]`. `foo` is only added to the `string_mapping` and `sequence_mapping_queries` arguments because it is not a valid `int`. \ No newline at end of file +As you can see the `query` parameter is added to every `Query` argument for which it is valid. This is because **FastAPI** does not know which `Query` argument you want to add the `query` parameter to, and `1` validates as an `int`, `str`, and `List[str]`. `foo` is only added to the `string_mapping` and `sequence_mapping_queries` arguments because it is not a valid `int`. diff --git a/docs_src/query_params/tutorial007_py310.py b/docs_src/query_params/tutorial007_py310.py index d8a9f5079..7d0ffca04 100644 --- a/docs_src/query_params/tutorial007_py310.py +++ b/docs_src/query_params/tutorial007_py310.py @@ -1,4 +1,4 @@ -from typing import Mapping, List +from typing import List, Mapping from fastapi import FastAPI, Query @@ -13,8 +13,8 @@ def get_mixed_mapping_mixed_type_query_params( sequence_mapping_queries: Mapping[str, List[int]] = Query({}), ): return { - "query":query, - "string_mapping": mapping_query_str, - "mapping_query_int": mapping_query_int, - "sequence_mapping_queries": sequence_mapping_queries - } + "query": query, + "string_mapping": mapping_query_str, + "mapping_query_int": mapping_query_int, + "sequence_mapping_queries": sequence_mapping_queries, + } diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index ccb9f6e4e..98a91ccf2 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -694,7 +694,8 @@ def request_params_to_args( value[key][index] = marker for key in value: value[key] = [x for x in value[key] if x != marker] - values[field.name] = value + v_, _ = field.validate(value, values, loc=loc) + values[field.name] = v_ elif ( isinstance(errors_, list) and is_scalar_mapping_field(field) @@ -704,7 +705,8 @@ def request_params_to_args( # remove all invalid parameters for _, _, key in [error["loc"] for error in new_errors]: value.pop(key) - values[field.name] = value + v_, _ = field.validate(value, values, loc=loc) + values[field.name] = v_ elif isinstance(errors_, list): new_errors = _regenerate_error_with_loc(errors=errors_, loc_prefix=()) errors.extend(new_errors) diff --git a/tests/test_tutorial/test_query_params/test_tutorial007_py310.py b/tests/test_tutorial/test_query_params/test_tutorial007_py310.py index 169742f8f..a6dfc140f 100644 --- a/tests/test_tutorial/test_query_params/test_tutorial007_py310.py +++ b/tests/test_tutorial/test_query_params/test_tutorial007_py310.py @@ -1,33 +1,21 @@ import pytest -from dirty_equals import IsDict from fastapi.testclient import TestClient -from fastapi.utils import match_pydantic_error_url @pytest.fixture(name="client") def get_client(): - from docs_src.query_params.tutorial006 import app + from docs_src.query_params.tutorial007_py310 import app c = TestClient(app) return c def test_foo_needy_very(client: TestClient): - response = client.get("/items/foo?needy=very") + response = client.get("/query/mixed-type-params?query=1&query=2&foo=bar&foo=baz") assert response.status_code == 200 assert response.json() == { - "query": 1, - "string_mapping": { - "query": "1", - "foo": "baz" - }, - "mapping_query_int": { - "query": 1 - }, - "sequence_mapping_queries": { - "query": [ - "1" - ], - "foo": [] - } - } \ No newline at end of file + "query": 2, + "string_mapping": {"query": "2", "foo": "baz"}, + "mapping_query_int": {"query": 2}, + "sequence_mapping_queries": {"query": [1, 2], "foo": []}, + } From 49725969a32232cfc9b2f71cd908663e3b76c9e6 Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Sat, 8 Jul 2023 10:44:13 +0000 Subject: [PATCH 36/91] fix test --- tests/test_query.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_query.py b/tests/test_query.py index 9924f20c2..9281cafdb 100644 --- a/tests/test_query.py +++ b/tests/test_query.py @@ -427,7 +427,7 @@ def test_mapping_with_non_mapping_query_mixed_types(): assert response.status_code == 200 assert ( response.json() - == "foo bar 1 {'foo': 'baz', 'bar': 'buzz', 'query': '1'} {'query': '1'} {'foo': [], 'bar': [], 'query': ['1']}" + == "foo bar 1 {'foo': 'baz', 'bar': 'buzz', 'query': '1'} {'query': 1} {'foo': [], 'bar': [], 'query': [1]}" ) From d3b105a9a5d68d4f4ddf283ed3b817844e37a9cd Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Sat, 8 Jul 2023 11:46:58 +0000 Subject: [PATCH 37/91] improve test coverage --- fastapi/_compat.py | 38 +++++++-------------------------- tests/main.py | 9 ++------ tests/test_application.py | 45 ++++++--------------------------------- 3 files changed, 16 insertions(+), 76 deletions(-) diff --git a/fastapi/_compat.py b/fastapi/_compat.py index 68302fdbe..9aad9196b 100644 --- a/fastapi/_compat.py +++ b/fastapi/_compat.py @@ -424,11 +424,10 @@ else: if (field.shape in mapping_shapes) and not lenient_issubclass( # type: ignore[attr-defined] field.type_, BaseModel ): - if field.sub_fields is None: # type: ignore[attr-defined] - return False - for sub_field in field.sub_fields: # type: ignore[attr-defined] - if not is_scalar_field(sub_field): - return False + if field.sub_fields is not None: + for sub_field in field.sub_fields: # type: ignore[attr-defined] + if not is_scalar_field(sub_field): + return False return True return False @@ -436,11 +435,10 @@ else: if (field.shape in mapping_shapes) and not lenient_issubclass( # type: ignore[attr-defined] field.type_, BaseModel ): - if field.sub_fields is None: # type: ignore[attr-defined] - return False - for sub_field in field.sub_fields: # type: ignore[attr-defined] - if not is_scalar_sequence_field(sub_field): - return False + if field.sub_fields is not None: # type: ignore[attr-defined] + for sub_field in field.sub_fields: # type: ignore[attr-defined] + if not is_scalar_sequence_field(sub_field): + return False return True return False @@ -628,16 +626,6 @@ def field_annotation_is_scalar_sequence(annotation: Union[Type[Any], None]) -> b def field_annotation_is_scalar_mapping(annotation: Union[Type[Any], None]) -> bool: - origin = get_origin(annotation) - if origin is Union or origin is UnionType: - at_least_one_scalar_mapping = False - for arg in get_args(annotation): - if field_annotation_is_scalar_mapping(arg): - at_least_one_scalar_mapping = True - continue - elif not field_annotation_is_scalar(arg): - return False - return at_least_one_scalar_mapping return field_annotation_is_mapping(annotation) and all( field_annotation_is_scalar(sub_annotation) for sub_annotation in get_args(annotation) @@ -647,16 +635,6 @@ def field_annotation_is_scalar_mapping(annotation: Union[Type[Any], None]) -> bo def field_annotation_is_scalar_sequence_mapping( annotation: Union[Type[Any], None] ) -> bool: - origin = get_origin(annotation) - if origin is Union or origin is UnionType: - at_least_one_scalar_mapping = False - for arg in get_args(annotation): - if field_annotation_is_scalar_mapping(arg): - at_least_one_scalar_mapping = True - continue - elif not field_annotation_is_scalar(arg): - return False - return at_least_one_scalar_mapping return field_annotation_is_mapping(annotation) and all( field_annotation_is_scalar_sequence(sub_annotation) for sub_annotation in get_args(annotation)[1:] diff --git a/tests/main.py b/tests/main.py index f9cf6f400..654e77a40 100644 --- a/tests/main.py +++ b/tests/main.py @@ -1,5 +1,5 @@ import http -from typing import FrozenSet, List, Mapping, Optional +from typing import FrozenSet, List, Mapping, Optional, Union from fastapi import FastAPI, Path, Query @@ -184,11 +184,6 @@ def get_query_param_required_type(query: int = Query()): return f"foo bar {query}" -@app.get("/query/sequence-params") -def get_sequence_query_params(query: Mapping[str, List[int]] = Query({})): - return f"foo bar {query}" - - @app.get("/query/mapping-params") def get_mapping_query_params(queries: Mapping[str, str] = Query({})): return f"foo bar {queries['foo']} {queries['bar']}" @@ -201,7 +196,7 @@ def get_sequence_mapping_query_params(queries: Mapping[str, List[int]] = Query({ @app.get("/query/mixed-params") def get_mixed_mapping_query_params( - sequence_mapping_queries: Mapping[str, List[str]] = Query({}), + sequence_mapping_queries: Mapping[str, List[Union[str, int]]] = Query({}), mapping_query: Mapping[str, str] = Query(), query: str = Query(), ): diff --git a/tests/test_application.py b/tests/test_application.py index 17f2ca31e..741d80182 100644 --- a/tests/test_application.py +++ b/tests/test_application.py @@ -1163,44 +1163,6 @@ def test_openapi_schema(): }, } }, - "/query/sequence-params": { - "get": { - "summary": "Get Sequence Query Params", - "operationId": "get_sequence_query_params_query_sequence_params_get", - "parameters": [ - { - "required": False, - "schema": { - "additionalProperties": { - "items": {"type": "integer"}, - "type": "array", - }, - "type": "object", - "title": "Query", - "default": {}, - }, - "name": "query", - "in": "query", - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - } - }, "/query/mapping-params": { "get": { "summary": "Get Mapping Query Params", @@ -1283,7 +1245,12 @@ def test_openapi_schema(): "required": False, "schema": { "additionalProperties": { - "items": {"type": "string"}, + "items": { + "anyOf": [ + {"type": "string"}, + {"type": "integer"}, + ] + }, "type": "array", }, "type": "object", From 58ed8150e1198f59a87f54d3889ef3c5486ca19a Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Sat, 8 Jul 2023 11:55:58 +0000 Subject: [PATCH 38/91] added type ignore --- fastapi/_compat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastapi/_compat.py b/fastapi/_compat.py index 9aad9196b..7efab007a 100644 --- a/fastapi/_compat.py +++ b/fastapi/_compat.py @@ -424,7 +424,7 @@ else: if (field.shape in mapping_shapes) and not lenient_issubclass( # type: ignore[attr-defined] field.type_, BaseModel ): - if field.sub_fields is not None: + if field.sub_fields is not None: # type: ignore[attr-defined] for sub_field in field.sub_fields: # type: ignore[attr-defined] if not is_scalar_field(sub_field): return False From 9beb1a75f7812dbd7ccd6f605cf6cd0024b949fe Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Sat, 8 Jul 2023 12:02:32 +0000 Subject: [PATCH 39/91] remove check on scalar arg --- fastapi/_compat.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/fastapi/_compat.py b/fastapi/_compat.py index 7efab007a..3ed881264 100644 --- a/fastapi/_compat.py +++ b/fastapi/_compat.py @@ -616,8 +616,6 @@ def field_annotation_is_scalar_sequence(annotation: Union[Type[Any], None]) -> b if field_annotation_is_scalar_sequence(arg): at_least_one_scalar_sequence = True continue - elif not field_annotation_is_scalar(arg): - return False return at_least_one_scalar_sequence return field_annotation_is_sequence(annotation) and all( field_annotation_is_scalar(sub_annotation) From 0023c98ca49dce100cfc40faa66102f60982460b Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Sat, 8 Jul 2023 12:07:21 +0000 Subject: [PATCH 40/91] spelling and grammar of fastapi dcos --- docs/en/docs/tutorial/query-params.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/en/docs/tutorial/query-params.md b/docs/en/docs/tutorial/query-params.md index 4596880f2..36a4d2110 100644 --- a/docs/en/docs/tutorial/query-params.md +++ b/docs/en/docs/tutorial/query-params.md @@ -226,7 +226,7 @@ In this case, there are 3 query parameters: ## Free Form Query Parameters -Sometimes you want to receive some query parameters, but you don't know in advance what they will be. **FastAPI** supports this case too. +Sometimes you want to receive some query parameters, but you don't know in advance what they are called. **FastAPI** supports provides support for this use case. === "Python 3.10+" @@ -234,11 +234,11 @@ Sometimes you want to receive some query parameters, but you don't know in advan {!> ../../../docs_src/query_params/tutorial007_py310.py!} ``` -And when you open your browser at http://127.0.0.1:8000/docs, you will that OpenAPI supports this too: +And when you open your browser at http://127.0.0.1:8000/docs, you will that OpenAPI supports this format of query parameter: -However, since the query parameters are decaled in the request as +However, since the query parameters are declared in the request as ``` http://127.0.0.1:8000/query/mixed-type-params?query=1&foo=bar&foo=baz @@ -264,4 +264,4 @@ http://127.0.0.1:8000/query/mixed-type-params?query=1&foo=bar&foo=baz } } ``` -As you can see the `query` parameter is added to every `Query` argument for which it is valid. This is because **FastAPI** does not know which `Query` argument you want to add the `query` parameter to, and `1` validates as an `int`, `str`, and `List[str]`. `foo` is only added to the `string_mapping` and `sequence_mapping_queries` arguments because it is not a valid `int`. +As you can see the `query` parameter is added to every `Query` argument for which it is valid. This is because **FastAPI** does not know which `Query` argument you want to add the `query` parameter to, and `1` validates as both an `int` and a `str`. `List[str]`. `foo` is only added to the `string_mapping` and `sequence_mapping_queries` arguments because it is not a valid `int`. From a42d91288092ceb37748e531390a55bc948649c5 Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Sat, 8 Jul 2023 12:10:07 +0000 Subject: [PATCH 41/91] revert bump on precommit --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f97947a8d..9f7085f72 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,7 +1,7 @@ # See https://pre-commit.com for more information # See https://pre-commit.com/hooks.html for more hooks default_language_version: - python: python3.11 + python: python3.10 repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.4.0 From ef7ca71c23b0e6318539f7fbaecaae8cb1354467 Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Sun, 9 Jul 2023 11:05:21 +0000 Subject: [PATCH 42/91] rm .gitignore changes --- .gitignore | 3 --- 1 file changed, 3 deletions(-) diff --git a/.gitignore b/.gitignore index c8247162f..d380d16b7 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,3 @@ archive.zip *~ .*.sw? .cache - -main.py -.devcontainer From 12c98cd4068f6e33c0bc97c82621527591ca14c2 Mon Sep 17 00:00:00 2001 From: Michael Jones Date: Tue, 11 Jul 2023 05:43:35 +0100 Subject: [PATCH 43/91] Update docs/en/docs/tutorial/query-params.md Co-authored-by: Viicos <65306057+Viicos@users.noreply.github.com> --- docs/en/docs/tutorial/query-params.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/docs/tutorial/query-params.md b/docs/en/docs/tutorial/query-params.md index 36a4d2110..9b41a420b 100644 --- a/docs/en/docs/tutorial/query-params.md +++ b/docs/en/docs/tutorial/query-params.md @@ -226,7 +226,7 @@ In this case, there are 3 query parameters: ## Free Form Query Parameters -Sometimes you want to receive some query parameters, but you don't know in advance what they are called. **FastAPI** supports provides support for this use case. +Sometimes you want to receive some query parameters, but you don't know in advance what they are called. **FastAPI** provides support for this use case. === "Python 3.10+" From 850750d8d856070621c4b105d375ad678be989f9 Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Thu, 29 Feb 2024 08:07:14 +0000 Subject: [PATCH 44/91] update tutorial --- docs_src/query_params/tutorial007_py310.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs_src/query_params/tutorial007_py310.py b/docs_src/query_params/tutorial007_py310.py index 7d0ffca04..59eb68c94 100644 --- a/docs_src/query_params/tutorial007_py310.py +++ b/docs_src/query_params/tutorial007_py310.py @@ -1,6 +1,7 @@ from typing import List, Mapping from fastapi import FastAPI, Query +from fastapi.types import FFQuery app = FastAPI() @@ -8,9 +9,9 @@ app = FastAPI() @app.get("/query/mixed-type-params") def get_mixed_mapping_mixed_type_query_params( query: int = Query(), - mapping_query_str: Mapping[str, str] = Query({}), - mapping_query_int: Mapping[str, int] = Query({}), - sequence_mapping_queries: Mapping[str, List[int]] = Query({}), + mapping_query_str: FFQuery[str, str] = Query({}), + mapping_query_int: FFQuery[str, int] = Query({}), + sequence_mapping_queries: FFQuery[str, List[int]] = Query({}), ): return { "query": query, From e8b75a08ffb220638ada02d170df7ce3c5ffae20 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 29 Feb 2024 08:37:38 +0000 Subject: [PATCH 45/91] =?UTF-8?q?=F0=9F=8E=A8=20[pre-commit.ci]=20Auto=20f?= =?UTF-8?q?ormat=20from=20pre-commit.com=20hooks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs_src/query_params/tutorial007_py310.py | 2 +- fastapi/_compat.py | 3 +-- fastapi/types.py | 2 +- tests/main.py | 2 +- tests/test_invalid_mapping_param.py | 3 ++- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs_src/query_params/tutorial007_py310.py b/docs_src/query_params/tutorial007_py310.py index 59eb68c94..207b7988c 100644 --- a/docs_src/query_params/tutorial007_py310.py +++ b/docs_src/query_params/tutorial007_py310.py @@ -1,4 +1,4 @@ -from typing import List, Mapping +from typing import List from fastapi import FastAPI, Query from fastapi.types import FFQuery diff --git a/fastapi/_compat.py b/fastapi/_compat.py index ab98c3e6d..0e1fa96af 100644 --- a/fastapi/_compat.py +++ b/fastapi/_compat.py @@ -9,7 +9,6 @@ from typing import ( Dict, FrozenSet, List, - Mapping, Sequence, Set, Tuple, @@ -18,7 +17,7 @@ from typing import ( ) from fastapi.exceptions import RequestErrorModel -from fastapi.types import IncEx, ModelNameMap, UnionType, FFQuery +from fastapi.types import FFQuery, IncEx, ModelNameMap, UnionType from pydantic import BaseModel, create_model from pydantic.version import VERSION as PYDANTIC_VERSION from starlette.datastructures import UploadFile diff --git a/fastapi/types.py b/fastapi/types.py index 4b680bf3e..808bcabb4 100644 --- a/fastapi/types.py +++ b/fastapi/types.py @@ -8,4 +8,4 @@ DecoratedCallable = TypeVar("DecoratedCallable", bound=Callable[..., Any]) UnionType = getattr(types, "UnionType", Union) ModelNameMap = Dict[Union[Type[BaseModel], Type[Enum]], str] IncEx = Union[Set[int], Set[str], Dict[int, Any], Dict[str, Any]] -FFQuery = Dict[str, Union[str, IncEx]] \ No newline at end of file +FFQuery = Dict[str, Union[str, IncEx]] diff --git a/tests/main.py b/tests/main.py index 52b70ed2a..f1db57ac4 100644 --- a/tests/main.py +++ b/tests/main.py @@ -1,5 +1,5 @@ import http -from typing import FrozenSet, List, Mapping, Optional, Union +from typing import FrozenSet, List, Optional, Union from fastapi import FastAPI, Path, Query from fastapi.types import FFQuery diff --git a/tests/test_invalid_mapping_param.py b/tests/test_invalid_mapping_param.py index 7a24953a9..2d0913e6d 100644 --- a/tests/test_invalid_mapping_param.py +++ b/tests/test_invalid_mapping_param.py @@ -1,4 +1,5 @@ -from typing import List, Mapping +from typing import List + import pytest from fastapi import FastAPI, Query from fastapi.types import FFQuery From 427badf67b176c509319efa9cc65b7c28c95f899 Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Thu, 29 Feb 2024 08:43:58 +0000 Subject: [PATCH 46/91] add concrete type --- fastapi/types.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/fastapi/types.py b/fastapi/types.py index 808bcabb4..a2576955e 100644 --- a/fastapi/types.py +++ b/fastapi/types.py @@ -8,4 +8,6 @@ DecoratedCallable = TypeVar("DecoratedCallable", bound=Callable[..., Any]) UnionType = getattr(types, "UnionType", Union) ModelNameMap = Dict[Union[Type[BaseModel], Type[Enum]], str] IncEx = Union[Set[int], Set[str], Dict[int, Any], Dict[str, Any]] -FFQuery = Dict[str, Union[str, IncEx]] + +class FFQuery(Dict[str, Union[str, IncEx]]): + pass From cec06df8643a4b93de6c3e5fcbb549bf747dda23 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 29 Feb 2024 08:45:15 +0000 Subject: [PATCH 47/91] =?UTF-8?q?=F0=9F=8E=A8=20[pre-commit.ci]=20Auto=20f?= =?UTF-8?q?ormat=20from=20pre-commit.com=20hooks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fastapi/types.py | 1 + 1 file changed, 1 insertion(+) diff --git a/fastapi/types.py b/fastapi/types.py index a2576955e..58b94e9bd 100644 --- a/fastapi/types.py +++ b/fastapi/types.py @@ -9,5 +9,6 @@ UnionType = getattr(types, "UnionType", Union) ModelNameMap = Dict[Union[Type[BaseModel], Type[Enum]], str] IncEx = Union[Set[int], Set[str], Dict[int, Any], Dict[str, Any]] + class FFQuery(Dict[str, Union[str, IncEx]]): pass From 84f9c634e136ea8454b7ac6a48f947af6c58ab38 Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Thu, 29 Feb 2024 09:28:47 +0000 Subject: [PATCH 48/91] use dict --- fastapi/_compat.py | 7 ++++--- fastapi/types.py | 4 ---- tests/main.py | 17 ++++++++--------- tests/test_invalid_mapping_param.py | 3 +-- 4 files changed, 13 insertions(+), 18 deletions(-) diff --git a/fastapi/_compat.py b/fastapi/_compat.py index 0e1fa96af..467101608 100644 --- a/fastapi/_compat.py +++ b/fastapi/_compat.py @@ -17,7 +17,7 @@ from typing import ( ) from fastapi.exceptions import RequestErrorModel -from fastapi.types import FFQuery, IncEx, ModelNameMap, UnionType +from fastapi.types import IncEx, ModelNameMap, UnionType from pydantic import BaseModel, create_model from pydantic.version import VERSION as PYDANTIC_VERSION from starlette.datastructures import UploadFile @@ -43,7 +43,8 @@ sequence_annotation_to_type = { sequence_types = tuple(sequence_annotation_to_type.keys()) mapping_annotation_to_type = { - FFQuery: list, + Dict: list, + dict: list, } mapping_types = tuple(mapping_annotation_to_type.keys()) @@ -366,7 +367,7 @@ else: mapping_shapes = { SHAPE_MAPPING, } - mapping_shapes_to_type = {SHAPE_MAPPING: FFQuery} + mapping_shapes_to_type = {SHAPE_MAPPING: Dict} @dataclass class GenerateJsonSchema: # type: ignore[no-redef] diff --git a/fastapi/types.py b/fastapi/types.py index 58b94e9bd..3205654c7 100644 --- a/fastapi/types.py +++ b/fastapi/types.py @@ -8,7 +8,3 @@ DecoratedCallable = TypeVar("DecoratedCallable", bound=Callable[..., Any]) UnionType = getattr(types, "UnionType", Union) ModelNameMap = Dict[Union[Type[BaseModel], Type[Enum]], str] IncEx = Union[Set[int], Set[str], Dict[int, Any], Dict[str, Any]] - - -class FFQuery(Dict[str, Union[str, IncEx]]): - pass diff --git a/tests/main.py b/tests/main.py index f1db57ac4..b4677b2a9 100644 --- a/tests/main.py +++ b/tests/main.py @@ -1,8 +1,7 @@ import http -from typing import FrozenSet, List, Optional, Union +from typing import FrozenSet, List, Optional, Union, Dict from fastapi import FastAPI, Path, Query -from fastapi.types import FFQuery app = FastAPI() @@ -186,19 +185,19 @@ def get_query_param_required_type(query: int = Query()): @app.get("/query/mapping-params") -def get_mapping_query_params(queries: FFQuery[str, str] = Query({})): +def get_mapping_query_params(queries: Dict[str, str] = Query({})): return f"foo bar {queries['foo']} {queries['bar']}" @app.get("/query/mapping-sequence-params") -def get_sequence_mapping_query_params(queries: FFQuery[str, List[int]] = Query({})): +def get_sequence_mapping_query_params(queries: Dict[str, List[int]] = Query({})): return f"foo bar {dict(queries)}" @app.get("/query/mixed-params") def get_mixed_mapping_query_params( - sequence_mapping_queries: FFQuery[str, List[Union[str, int]]] = Query({}), - mapping_query: FFQuery[str, str] = Query(), + sequence_mapping_queries: Dict[str, List[Union[str, int]]] = Query({}), + mapping_query: Dict[str, str] = Query(), query: str = Query(), ): return ( @@ -209,9 +208,9 @@ def get_mixed_mapping_query_params( @app.get("/query/mixed-type-params") def get_mixed_mapping_mixed_type_query_params( - sequence_mapping_queries: FFQuery[str, List[int]] = Query({}), - mapping_query_str: FFQuery[str, str] = Query({}), - mapping_query_int: FFQuery[str, int] = Query({}), + sequence_mapping_queries: Dict[str, List[int]] = Query({}), + mapping_query_str: Dict[str, str] = Query({}), + mapping_query_int: Dict[str, int] = Query({}), query: int = Query(), ): return f"foo bar {query} {mapping_query_str} {mapping_query_int} {dict(sequence_mapping_queries)}" diff --git a/tests/test_invalid_mapping_param.py b/tests/test_invalid_mapping_param.py index 2d0913e6d..891793961 100644 --- a/tests/test_invalid_mapping_param.py +++ b/tests/test_invalid_mapping_param.py @@ -2,7 +2,6 @@ from typing import List import pytest from fastapi import FastAPI, Query -from fastapi.types import FFQuery def test_invalid_sequence(): @@ -10,5 +9,5 @@ def test_invalid_sequence(): app = FastAPI() @app.get("/items/") - def read_items(q: FFQuery[str, List[List[str]]] = Query(default=None)): + def read_items(q: Dict[str, List[List[str]]] = Query(default=None)): pass # pragma: no cover From 7bc13a7ec17759150ef67cf34e333fa3da310239 Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Thu, 29 Feb 2024 09:30:25 +0000 Subject: [PATCH 49/91] rm --- docs_src/query_params/tutorial007_py310.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/docs_src/query_params/tutorial007_py310.py b/docs_src/query_params/tutorial007_py310.py index 207b7988c..a37d31963 100644 --- a/docs_src/query_params/tutorial007_py310.py +++ b/docs_src/query_params/tutorial007_py310.py @@ -1,7 +1,6 @@ from typing import List from fastapi import FastAPI, Query -from fastapi.types import FFQuery app = FastAPI() @@ -9,9 +8,9 @@ app = FastAPI() @app.get("/query/mixed-type-params") def get_mixed_mapping_mixed_type_query_params( query: int = Query(), - mapping_query_str: FFQuery[str, str] = Query({}), - mapping_query_int: FFQuery[str, int] = Query({}), - sequence_mapping_queries: FFQuery[str, List[int]] = Query({}), + mapping_query_str: Dict[str, str] = Query({}), + mapping_query_int: Dict[str, int] = Query({}), + sequence_mapping_queries: Dict[str, List[int]] = Query({}), ): return { "query": query, From 6c981b9ace98b3b1d6f0d19cdf8d4f99404f06b7 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 29 Feb 2024 09:33:49 +0000 Subject: [PATCH 50/91] =?UTF-8?q?=F0=9F=8E=A8=20[pre-commit.ci]=20Auto=20f?= =?UTF-8?q?ormat=20from=20pre-commit.com=20hooks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/main.py b/tests/main.py index b4677b2a9..e772e6096 100644 --- a/tests/main.py +++ b/tests/main.py @@ -1,5 +1,5 @@ import http -from typing import FrozenSet, List, Optional, Union, Dict +from typing import Dict, FrozenSet, List, Optional, Union from fastapi import FastAPI, Path, Query From e929231570b8970617aff2984cb1f2ceed6eb298 Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Thu, 29 Feb 2024 09:38:07 +0000 Subject: [PATCH 51/91] bump --- docs_src/query_params/tutorial007_py310.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs_src/query_params/tutorial007_py310.py b/docs_src/query_params/tutorial007_py310.py index a37d31963..ae07e3cf2 100644 --- a/docs_src/query_params/tutorial007_py310.py +++ b/docs_src/query_params/tutorial007_py310.py @@ -1,4 +1,4 @@ -from typing import List +from typing import List, Dict from fastapi import FastAPI, Query From 182638ba70a9b7211615418d15b0e68b1258c156 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 29 Feb 2024 09:39:49 +0000 Subject: [PATCH 52/91] =?UTF-8?q?=F0=9F=8E=A8=20[pre-commit.ci]=20Auto=20f?= =?UTF-8?q?ormat=20from=20pre-commit.com=20hooks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs_src/query_params/tutorial007_py310.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs_src/query_params/tutorial007_py310.py b/docs_src/query_params/tutorial007_py310.py index ae07e3cf2..4ce0017d2 100644 --- a/docs_src/query_params/tutorial007_py310.py +++ b/docs_src/query_params/tutorial007_py310.py @@ -1,4 +1,4 @@ -from typing import List, Dict +from typing import Dict, List from fastapi import FastAPI, Query From 2b2880d801a996a09c802d900cce4228023e767b Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Thu, 29 Feb 2024 09:55:57 +0000 Subject: [PATCH 54/91] add required --- tests/test_invalid_mapping_param.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_invalid_mapping_param.py b/tests/test_invalid_mapping_param.py index 891793961..fbbda1f31 100644 --- a/tests/test_invalid_mapping_param.py +++ b/tests/test_invalid_mapping_param.py @@ -1,4 +1,4 @@ -from typing import List +from typing import List, Dict import pytest from fastapi import FastAPI, Query From a5a9e6d52116ed5bb15c4967edffb4d5b1a12018 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 29 Feb 2024 09:56:12 +0000 Subject: [PATCH 55/91] =?UTF-8?q?=F0=9F=8E=A8=20[pre-commit.ci]=20Auto=20f?= =?UTF-8?q?ormat=20from=20pre-commit.com=20hooks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_invalid_mapping_param.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_invalid_mapping_param.py b/tests/test_invalid_mapping_param.py index fbbda1f31..a9a48874b 100644 --- a/tests/test_invalid_mapping_param.py +++ b/tests/test_invalid_mapping_param.py @@ -1,4 +1,4 @@ -from typing import List, Dict +from typing import Dict, List import pytest from fastapi import FastAPI, Query From dcd67c7feb05914c88a436d5090b2842de1c6c40 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 6 Nov 2025 14:48:19 +0000 Subject: [PATCH 56/91] =?UTF-8?q?=F0=9F=8E=A8=20[pre-commit.ci]=20Auto=20f?= =?UTF-8?q?ormat=20from=20pre-commit.com=20hooks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fastapi/dependencies/utils.py | 3 --- tests/test_application.py | 3 +-- tests/test_query.py | 2 +- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index 9012dfa4b..4a8b5cf60 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -1,5 +1,4 @@ import inspect -from collections import defaultdict from contextlib import AsyncExitStack, contextmanager from copy import copy, deepcopy from dataclasses import dataclass @@ -38,9 +37,7 @@ from fastapi._compat import ( is_bytes_field, is_bytes_sequence_field, is_scalar_field, - is_scalar_mapping_field, is_scalar_sequence_field, - is_scalar_sequence_mapping_field, is_sequence_field, is_uploadfile_or_nonable_uploadfile_annotation, is_uploadfile_sequence_annotation, diff --git a/tests/test_application.py b/tests/test_application.py index eb8e73f7d..7cb5ab753 100644 --- a/tests/test_application.py +++ b/tests/test_application.py @@ -1,5 +1,4 @@ import pytest -from dirty_equals import IsDict from fastapi.testclient import TestClient from .main import app @@ -55,4 +54,4 @@ def test_enum_status_code_response(): def test_openapi_schema(): response = client.get("/openapi.json") assert response.status_code == 200, response.text - assert response.json() == {} \ No newline at end of file + assert response.json() == {} diff --git a/tests/test_query.py b/tests/test_query.py index b13fd12a4..40f64b0d0 100644 --- a/tests/test_query.py +++ b/tests/test_query.py @@ -451,4 +451,4 @@ def test_sequence_mapping_query(): def test_sequence_mapping_query_drops_invalid(): response = client.get("/query/mapping-sequence-params/?foo=fuzz&foo=buzz") assert response.status_code == 200 - assert response.json() == "foo bar {'foo': []}" \ No newline at end of file + assert response.json() == "foo bar {'foo': []}" From 1a57459edaeddcf8e96830a02355696f5ab2fad1 Mon Sep 17 00:00:00 2001 From: JONEMI21 Date: Thu, 6 Nov 2025 22:04:36 +0000 Subject: [PATCH 57/91] update and remove otherwise captured query params --- fastapi/_compat/__init__.py | 2 + fastapi/_compat/main.py | 24 ++++++++++++ fastapi/_compat/shared.py | 39 +++++++++++++++++++ fastapi/_compat/v1.py | 39 +++++++++++++++++++ fastapi/_compat/v2.py | 10 +++++ fastapi/dependencies/utils.py | 37 +++++++++++++++++- tests/main.py | 24 ++++++++---- tests/test_query.py | 29 ++++++++++---- .../test_tutorial007_py310.py | 6 +-- 9 files changed, 190 insertions(+), 20 deletions(-) diff --git a/fastapi/_compat/__init__.py b/fastapi/_compat/__init__.py index 0aadd68de..3561176fe 100644 --- a/fastapi/_compat/__init__.py +++ b/fastapi/_compat/__init__.py @@ -24,7 +24,9 @@ from .main import get_schema_from_model_field as get_schema_from_model_field from .main import is_bytes_field as is_bytes_field from .main import is_bytes_sequence_field as is_bytes_sequence_field from .main import is_scalar_field as is_scalar_field +from .main import is_scalar_mapping_field as is_scalar_mapping_field from .main import is_scalar_sequence_field as is_scalar_sequence_field +from .main import is_scalar_sequence_mapping_field as is_scalar_sequence_mapping_field from .main import is_sequence_field as is_sequence_field from .main import serialize_sequence_value as serialize_sequence_value from .main import ( diff --git a/fastapi/_compat/main.py b/fastapi/_compat/main.py index e5275950e..5a36d887a 100644 --- a/fastapi/_compat/main.py +++ b/fastapi/_compat/main.py @@ -209,6 +209,30 @@ def is_sequence_field(field: ModelField) -> bool: return v2.is_sequence_field(field) # type: ignore[arg-type] +def is_scalar_mapping_field(field: ModelField) -> bool: + if isinstance(field, may_v1.ModelField): + from fastapi._compat import v1 + + return v1.is_scalar_mapping_field(field) + else: + assert PYDANTIC_V2 + from . import v2 + + return v2.is_scalar_mapping_field(field) # type: ignore[arg-type] + + +def is_scalar_sequence_mapping_field(field: ModelField) -> bool: + if isinstance(field, may_v1.ModelField): + from fastapi._compat import v1 + + return v1.is_scalar_sequence_mapping_field(field) + else: + assert PYDANTIC_V2 + from . import v2 + + return v2.is_scalar_sequence_mapping_field(field) # type: ignore[arg-type] + + def serialize_sequence_value(*, field: ModelField, value: Any) -> Sequence[Any]: if isinstance(field, may_v1.ModelField): from fastapi._compat import v1 diff --git a/fastapi/_compat/shared.py b/fastapi/_compat/shared.py index cabf48228..95730b839 100644 --- a/fastapi/_compat/shared.py +++ b/fastapi/_compat/shared.py @@ -144,6 +144,45 @@ def field_annotation_is_scalar_sequence(annotation: Union[Type[Any], None]) -> b ) +def field_annotation_is_scalar_mapping( + annotation: Union[Type[Any], None], +) -> bool: + origin = get_origin(annotation) + if origin is Union or origin is UnionType: + at_least_one_scalar_mapping = False + for arg in get_args(annotation): + if field_annotation_is_scalar_mapping(arg): + at_least_one_scalar_mapping = True + continue + elif not field_annotation_is_scalar(arg): + return False + return at_least_one_scalar_mapping + return lenient_issubclass(origin, Mapping) and all( + field_annotation_is_scalar(sub_annotation) + for sub_annotation in get_args(annotation) + ) + + +def field_annotation_is_scalar_sequence_mapping( + annotation: Union[Type[Any], None], +) -> bool: + origin = get_origin(annotation) + if origin is Union or origin is UnionType: + at_least_one_scalar_mapping = False + for arg in get_args(annotation): + if field_annotation_is_scalar_sequence_mapping(arg): + at_least_one_scalar_mapping = True + continue + elif not field_annotation_is_scalar(arg): + return False + return at_least_one_scalar_mapping + return lenient_issubclass(origin, Mapping) and all( + field_annotation_is_scalar_sequence(sub_annotation) + or field_annotation_is_scalar(sub_annotation) + for sub_annotation in get_args(annotation) + ) + + def is_bytes_or_nonable_bytes_annotation(annotation: Any) -> bool: if lenient_issubclass(annotation, bytes): return True diff --git a/fastapi/_compat/v1.py b/fastapi/_compat/v1.py index e17ce8bea..31e3fe259 100644 --- a/fastapi/_compat/v1.py +++ b/fastapi/_compat/v1.py @@ -6,6 +6,7 @@ from typing import ( Callable, Dict, List, + Mapping, Sequence, Set, Tuple, @@ -84,6 +85,7 @@ else: from pydantic.v1.fields import ( SHAPE_FROZENSET, SHAPE_LIST, + SHAPE_MAPPING, SHAPE_SEQUENCE, SHAPE_SET, SHAPE_SINGLETON, @@ -144,6 +146,11 @@ sequence_shape_to_type = { SHAPE_TUPLE_ELLIPSIS: list, } +mapping_shapes = { + SHAPE_MAPPING, +} +mapping_shapes_to_type = {SHAPE_MAPPING: Mapping} + @dataclass class GenerateJsonSchema: @@ -219,6 +226,30 @@ def is_pv1_scalar_sequence_field(field: ModelField) -> bool: return False +def is_pv1_scalar_sequence_mapping_field(field: ModelField) -> bool: + if (field.shape in mapping_shapes) and not lenient_issubclass( # type: ignore[attr-defined] + field.type_, BaseModel + ): + if field.sub_fields is not None: # type: ignore[attr-defined] + for sub_field in field.sub_fields: # type: ignore[attr-defined] + if not is_scalar_sequence_field(sub_field): + return False + return True + return False + + +def is_pv1_scalar_mapping_field(field: ModelField) -> bool: + if (field.shape in mapping_shapes) and not lenient_issubclass( # type: ignore[attr-defined] + field.type_, BaseModel + ): + if field.sub_fields is not None: # type: ignore[attr-defined] + for sub_field in field.sub_fields: # type: ignore[attr-defined] + if not is_scalar_field(sub_field): + return False + return True + return False + + def _model_rebuild(model: Type[BaseModel]) -> None: model.update_forward_refs() @@ -277,6 +308,14 @@ def is_scalar_sequence_field(field: ModelField) -> bool: return is_pv1_scalar_sequence_field(field) +def is_scalar_mapping_field(field: ModelField) -> bool: + return is_pv1_scalar_mapping_field(field) + + +def is_scalar_sequence_mapping_field(field: ModelField) -> bool: + return is_pv1_scalar_sequence_mapping_field(field) + + def is_bytes_field(field: ModelField) -> bool: return lenient_issubclass(field.type_, bytes) # type: ignore[no-any-return] diff --git a/fastapi/_compat/v2.py b/fastapi/_compat/v2.py index 6a87b9ae9..de033083d 100644 --- a/fastapi/_compat/v2.py +++ b/fastapi/_compat/v2.py @@ -352,6 +352,16 @@ def is_scalar_sequence_field(field: ModelField) -> bool: return shared.field_annotation_is_scalar_sequence(field.field_info.annotation) +def is_scalar_mapping_field(field: ModelField) -> bool: + return shared.field_annotation_is_scalar_mapping(field.field_info.annotation) + + +def is_scalar_sequence_mapping_field(field: ModelField) -> bool: + return shared.field_annotation_is_scalar_sequence_mapping( + field.field_info.annotation + ) + + def is_bytes_field(field: ModelField) -> bool: return shared.is_bytes_or_nonable_bytes_annotation(field.type_) diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index 4a8b5cf60..a6ade4f59 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -37,7 +37,9 @@ from fastapi._compat import ( is_bytes_field, is_bytes_sequence_field, is_scalar_field, + is_scalar_mapping_field, is_scalar_sequence_field, + is_scalar_sequence_mapping_field, is_sequence_field, is_uploadfile_or_nonable_uploadfile_annotation, is_uploadfile_sequence_annotation, @@ -512,6 +514,7 @@ def analyze_param( assert ( is_scalar_field(field) or is_scalar_sequence_field(field) + or is_scalar_sequence_mapping_field(field) or ( _is_model_class(field.type_) # For Pydantic v1 @@ -707,6 +710,20 @@ def _validate_value_with_model_field( else: return deepcopy(field.default), [] v_, errors_ = field.validate(value, values, loc=loc) + if ( + errors_ + and isinstance(field.field_info, params.Query) + and isinstance(value, Mapping) + and (is_scalar_sequence_mapping_field(field) or is_scalar_mapping_field(field)) + ): + # Remove failing keys from the dict and try to re-validate + invalid_keys = {err["loc"][2] for err in errors_ if len(err["loc"]) >= 3} + v_, errors_ = field.validate( + {k: v for k, v in value.items() if k not in invalid_keys}, + values, + loc=loc, + ) + if _is_error_wrapper(errors_): # type: ignore[arg-type] return None, [errors_] elif isinstance(errors_, list): @@ -720,10 +737,19 @@ def _get_multidict_value( field: ModelField, values: Mapping[str, Any], alias: Union[str, None] = None ) -> Any: alias = alias or field.alias + value: Any = None if is_sequence_field(field) and isinstance(values, (ImmutableMultiDict, Headers)): value = values.getlist(alias) - else: - value = values.get(alias, None) + elif alias in values: + value = values[alias] + elif values and is_scalar_mapping_field(field) and isinstance(values, QueryParams): + value = dict(values) + elif ( + values + and is_scalar_sequence_mapping_field(field) + and isinstance(values, QueryParams) + ): + value = {key: values.getlist(key) for key in values.keys()} if ( value is None or ( @@ -820,6 +846,13 @@ def request_params_to_args( errors.extend(errors_) else: values[field.name] = v_ + # remove keys which were captured by a mapping query field but were otherwise specified + for field in fields: + if isinstance(values.get(field.name), dict) and ( + is_scalar_mapping_field(field) or is_scalar_sequence_mapping_field(field) + ): + for f_ in fields: + values[field.name].pop(f_.alias, None) return values, errors diff --git a/tests/main.py b/tests/main.py index 03a4de252..f0daad9ac 100644 --- a/tests/main.py +++ b/tests/main.py @@ -191,12 +191,12 @@ def get_query_param_required_type(query: int = Query()): @app.get("/query/mapping-params") def get_mapping_query_params(queries: Dict[str, str] = Query({})): - return f"foo bar {queries['foo']} {queries['bar']}" + return {"queries": queries} @app.get("/query/mapping-sequence-params") def get_sequence_mapping_query_params(queries: Dict[str, List[int]] = Query({})): - return f"foo bar {dict(queries)}" + return {"queries": queries} @app.get("/query/mixed-params") @@ -205,10 +205,13 @@ def get_mixed_mapping_query_params( mapping_query: Dict[str, str] = Query(), query: str = Query(), ): - return ( - f"foo bar {sequence_mapping_queries['foo'][0]} {sequence_mapping_queries['foo'][1]} " - f"{mapping_query['foo']} {mapping_query['bar']} {query}" - ) + return { + "queries": { + "query": query, + "mapping_query": mapping_query, + "sequence_mapping_queries": sequence_mapping_queries, + } + } @app.get("/query/mixed-type-params") @@ -218,7 +221,14 @@ def get_mixed_mapping_mixed_type_query_params( mapping_query_int: Dict[str, int] = Query({}), query: int = Query(), ): - return f"foo bar {query} {mapping_query_str} {mapping_query_int} {dict(sequence_mapping_queries)}" + return { + "queries": { + "query": query, + "mapping_query_str": mapping_query_str, + "mapping_query_int": mapping_query_int, + "sequence_mapping_queries": sequence_mapping_queries, + } + } @app.get("/enum-status-code", status_code=http.HTTPStatus.CREATED) diff --git a/tests/test_query.py b/tests/test_query.py index 40f64b0d0..5b483f17f 100644 --- a/tests/test_query.py +++ b/tests/test_query.py @@ -424,31 +424,44 @@ def test_query_frozenset_query_1_query_1_query_2(): def test_mapping_query(): response = client.get("/query/mapping-params/?foo=fuzz&bar=buzz") assert response.status_code == 200 - assert response.json() == "foo bar fuzz buzz" + assert response.json() == {"queries": {"bar": "buzz", "foo": "fuzz"}} def test_mapping_with_non_mapping_query(): response = client.get("/query/mixed-params/?foo=fuzz&foo=baz&bar=buzz&query=fizz") assert response.status_code == 200 - assert response.json() == "foo bar fuzz baz baz buzz fizz" + assert response.json() == { + "queries": { + "query": "fizz", + "mapping_query": {"foo": "baz", "bar": "buzz"}, + "sequence_mapping_queries": { + "foo": ["fuzz", "baz"], + "bar": ["buzz"], + }, + } + } def test_mapping_with_non_mapping_query_mixed_types(): response = client.get("/query/mixed-type-params/?foo=fuzz&foo=baz&bar=buzz&query=1") assert response.status_code == 200 - assert ( - response.json() - == "foo bar 1 {'foo': 'baz', 'bar': 'buzz', 'query': '1'} {'query': 1} {'foo': [], 'bar': [], 'query': [1]}" - ) + assert response.json() == { + "queries": { + "query": 1, + "mapping_query_str": {"foo": "baz", "bar": "buzz"}, + "mapping_query_int": {}, + "sequence_mapping_queries": {}, + } + } def test_sequence_mapping_query(): response = client.get("/query/mapping-sequence-params/?foo=1&foo=2") assert response.status_code == 200 - assert response.json() == "foo bar {'foo': [1, 2]}" + assert response.json() == {"queries": {"foo": [1, 2]}} def test_sequence_mapping_query_drops_invalid(): response = client.get("/query/mapping-sequence-params/?foo=fuzz&foo=buzz") assert response.status_code == 200 - assert response.json() == "foo bar {'foo': []}" + assert response.json() == {"queries": {}} diff --git a/tests/test_tutorial/test_query_params/test_tutorial007_py310.py b/tests/test_tutorial/test_query_params/test_tutorial007_py310.py index a6dfc140f..b275dacd8 100644 --- a/tests/test_tutorial/test_query_params/test_tutorial007_py310.py +++ b/tests/test_tutorial/test_query_params/test_tutorial007_py310.py @@ -15,7 +15,7 @@ def test_foo_needy_very(client: TestClient): assert response.status_code == 200 assert response.json() == { "query": 2, - "string_mapping": {"query": "2", "foo": "baz"}, - "mapping_query_int": {"query": 2}, - "sequence_mapping_queries": {"query": [1, 2], "foo": []}, + "string_mapping": {"foo": "baz"}, + "mapping_query_int": {}, + "sequence_mapping_queries": {}, } From 3bece4211bb1c1cb6efd2a0585d197c213c4ad6a Mon Sep 17 00:00:00 2001 From: JONEMI21 Date: Thu, 6 Nov 2025 22:06:02 +0000 Subject: [PATCH 58/91] lint --- fastapi/_compat/v1.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/fastapi/_compat/v1.py b/fastapi/_compat/v1.py index 31e3fe259..fdafbef96 100644 --- a/fastapi/_compat/v1.py +++ b/fastapi/_compat/v1.py @@ -227,11 +227,11 @@ def is_pv1_scalar_sequence_field(field: ModelField) -> bool: def is_pv1_scalar_sequence_mapping_field(field: ModelField) -> bool: - if (field.shape in mapping_shapes) and not lenient_issubclass( # type: ignore[attr-defined] + if (field.shape in mapping_shapes) and not lenient_issubclass( field.type_, BaseModel ): - if field.sub_fields is not None: # type: ignore[attr-defined] - for sub_field in field.sub_fields: # type: ignore[attr-defined] + if field.sub_fields is not None: + for sub_field in field.sub_fields: if not is_scalar_sequence_field(sub_field): return False return True @@ -239,11 +239,11 @@ def is_pv1_scalar_sequence_mapping_field(field: ModelField) -> bool: def is_pv1_scalar_mapping_field(field: ModelField) -> bool: - if (field.shape in mapping_shapes) and not lenient_issubclass( # type: ignore[attr-defined] + if (field.shape in mapping_shapes) and not lenient_issubclass( field.type_, BaseModel ): - if field.sub_fields is not None: # type: ignore[attr-defined] - for sub_field in field.sub_fields: # type: ignore[attr-defined] + if field.sub_fields is not None: + for sub_field in field.sub_fields: if not is_scalar_field(sub_field): return False return True From 180f83bd8efac795bbf976c46b0fe4273ff2515e Mon Sep 17 00:00:00 2001 From: JONEMI21 Date: Thu, 6 Nov 2025 22:07:35 +0000 Subject: [PATCH 59/91] fix --- tests/test_application.py | 1678 ++++++++++++++++++++++++++++++++++++- 1 file changed, 1677 insertions(+), 1 deletion(-) diff --git a/tests/test_application.py b/tests/test_application.py index 7cb5ab753..c179ecb62 100644 --- a/tests/test_application.py +++ b/tests/test_application.py @@ -54,4 +54,1680 @@ def test_enum_status_code_response(): def test_openapi_schema(): response = client.get("/openapi.json") assert response.status_code == 200, response.text - assert response.json() == {} + assert response.json() == { + "components": { + "schemas": { + "HTTPValidationError": { + "properties": { + "detail": { + "items": { + "$ref": "#/components/schemas/ValidationError", + }, + "title": "Detail", + "type": "array", + }, + }, + "title": "HTTPValidationError", + "type": "object", + }, + "ValidationError": { + "properties": { + "loc": { + "items": { + "anyOf": [ + { + "type": "string", + }, + { + "type": "integer", + }, + ], + }, + "title": "Location", + "type": "array", + }, + "msg": { + "title": "Message", + "type": "string", + }, + "type": { + "title": "Error Type", + "type": "string", + }, + }, + "required": [ + "loc", + "msg", + "type", + ], + "title": "ValidationError", + "type": "object", + }, + }, + }, + "externalDocs": { + "description": "External API documentation.", + "url": "https://docs.example.com/api-general", + }, + "info": { + "title": "FastAPI", + "version": "0.1.0", + }, + "openapi": "3.1.0", + "paths": { + "/api_route": { + "get": { + "operationId": "non_operation_api_route_get", + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + }, + "summary": "Non Operation", + }, + }, + "/enum-status-code": { + "get": { + "operationId": "get_enum_status_code_enum_status_code_get", + "responses": { + "201": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + }, + "summary": "Get Enum Status Code", + }, + }, + "/non_decorated_route": { + "get": { + "operationId": "non_decorated_route_non_decorated_route_get", + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + }, + "summary": "Non Decorated Route", + }, + }, + "/path/bool/{item_id}": { + "get": { + "operationId": "get_bool_id_path_bool__item_id__get", + "parameters": [ + { + "in": "path", + "name": "item_id", + "required": True, + "schema": { + "title": "Item Id", + "type": "boolean", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Bool Id", + }, + }, + "/path/float/{item_id}": { + "get": { + "operationId": "get_float_id_path_float__item_id__get", + "parameters": [ + { + "in": "path", + "name": "item_id", + "required": True, + "schema": { + "title": "Item Id", + "type": "number", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Float Id", + }, + }, + "/path/int/{item_id}": { + "get": { + "operationId": "get_int_id_path_int__item_id__get", + "parameters": [ + { + "in": "path", + "name": "item_id", + "required": True, + "schema": { + "title": "Item Id", + "type": "integer", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Int Id", + }, + }, + "/path/param-ge-int/{item_id}": { + "get": { + "operationId": "get_path_param_ge_int_path_param_ge_int__item_id__get", + "parameters": [ + { + "in": "path", + "name": "item_id", + "required": True, + "schema": { + "minimum": 3, + "title": "Item Id", + "type": "integer", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Path Param Ge Int", + }, + }, + "/path/param-ge/{item_id}": { + "get": { + "operationId": "get_path_param_ge_path_param_ge__item_id__get", + "parameters": [ + { + "in": "path", + "name": "item_id", + "required": True, + "schema": { + "minimum": 3, + "title": "Item Id", + "type": "number", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Path Param Ge", + }, + }, + "/path/param-gt-int/{item_id}": { + "get": { + "operationId": "get_path_param_gt_int_path_param_gt_int__item_id__get", + "parameters": [ + { + "in": "path", + "name": "item_id", + "required": True, + "schema": { + "exclusiveMinimum": 3, + "title": "Item Id", + "type": "integer", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Path Param Gt Int", + }, + }, + "/path/param-gt/{item_id}": { + "get": { + "operationId": "get_path_param_gt_path_param_gt__item_id__get", + "parameters": [ + { + "in": "path", + "name": "item_id", + "required": True, + "schema": { + "exclusiveMinimum": 3, + "title": "Item Id", + "type": "number", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Path Param Gt", + }, + }, + "/path/param-gt0/{item_id}": { + "get": { + "operationId": "get_path_param_gt0_path_param_gt0__item_id__get", + "parameters": [ + { + "in": "path", + "name": "item_id", + "required": True, + "schema": { + "exclusiveMinimum": 0, + "title": "Item Id", + "type": "number", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Path Param Gt0", + }, + }, + "/path/param-le-ge-int/{item_id}": { + "get": { + "operationId": "get_path_param_le_ge_int_path_param_le_ge_int__item_id__get", + "parameters": [ + { + "in": "path", + "name": "item_id", + "required": True, + "schema": { + "maximum": 3, + "minimum": 1, + "title": "Item Id", + "type": "integer", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Path Param Le Ge Int", + }, + }, + "/path/param-le-ge/{item_id}": { + "get": { + "operationId": "get_path_param_le_ge_path_param_le_ge__item_id__get", + "parameters": [ + { + "in": "path", + "name": "item_id", + "required": True, + "schema": { + "maximum": 3, + "minimum": 1, + "title": "Item Id", + "type": "number", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Path Param Le Ge", + }, + }, + "/path/param-le-int/{item_id}": { + "get": { + "operationId": "get_path_param_le_int_path_param_le_int__item_id__get", + "parameters": [ + { + "in": "path", + "name": "item_id", + "required": True, + "schema": { + "maximum": 3, + "title": "Item Id", + "type": "integer", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Path Param Le Int", + }, + }, + "/path/param-le/{item_id}": { + "get": { + "operationId": "get_path_param_le_path_param_le__item_id__get", + "parameters": [ + { + "in": "path", + "name": "item_id", + "required": True, + "schema": { + "maximum": 3, + "title": "Item Id", + "type": "number", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Path Param Le", + }, + }, + "/path/param-lt-gt-int/{item_id}": { + "get": { + "operationId": "get_path_param_lt_gt_int_path_param_lt_gt_int__item_id__get", + "parameters": [ + { + "in": "path", + "name": "item_id", + "required": True, + "schema": { + "exclusiveMaximum": 3, + "exclusiveMinimum": 1, + "title": "Item Id", + "type": "integer", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Path Param Lt Gt Int", + }, + }, + "/path/param-lt-gt/{item_id}": { + "get": { + "operationId": "get_path_param_lt_gt_path_param_lt_gt__item_id__get", + "parameters": [ + { + "in": "path", + "name": "item_id", + "required": True, + "schema": { + "exclusiveMaximum": 3, + "exclusiveMinimum": 1, + "title": "Item Id", + "type": "number", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Path Param Lt Gt", + }, + }, + "/path/param-lt-int/{item_id}": { + "get": { + "operationId": "get_path_param_lt_int_path_param_lt_int__item_id__get", + "parameters": [ + { + "in": "path", + "name": "item_id", + "required": True, + "schema": { + "exclusiveMaximum": 3, + "title": "Item Id", + "type": "integer", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Path Param Lt Int", + }, + }, + "/path/param-lt/{item_id}": { + "get": { + "operationId": "get_path_param_lt_path_param_lt__item_id__get", + "parameters": [ + { + "in": "path", + "name": "item_id", + "required": True, + "schema": { + "exclusiveMaximum": 3, + "title": "Item Id", + "type": "number", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Path Param Lt", + }, + }, + "/path/param-lt0/{item_id}": { + "get": { + "operationId": "get_path_param_lt0_path_param_lt0__item_id__get", + "parameters": [ + { + "in": "path", + "name": "item_id", + "required": True, + "schema": { + "exclusiveMaximum": 0, + "title": "Item Id", + "type": "number", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Path Param Lt0", + }, + }, + "/path/param-maxlength/{item_id}": { + "get": { + "operationId": "get_path_param_max_length_path_param_maxlength__item_id__get", + "parameters": [ + { + "in": "path", + "name": "item_id", + "required": True, + "schema": { + "maxLength": 3, + "title": "Item Id", + "type": "string", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Path Param Max Length", + }, + }, + "/path/param-min_maxlength/{item_id}": { + "get": { + "operationId": "get_path_param_min_max_length_path_param_min_maxlength__item_id__get", + "parameters": [ + { + "in": "path", + "name": "item_id", + "required": True, + "schema": { + "maxLength": 3, + "minLength": 2, + "title": "Item Id", + "type": "string", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Path Param Min Max Length", + }, + }, + "/path/param-minlength/{item_id}": { + "get": { + "operationId": "get_path_param_min_length_path_param_minlength__item_id__get", + "parameters": [ + { + "in": "path", + "name": "item_id", + "required": True, + "schema": { + "minLength": 3, + "title": "Item Id", + "type": "string", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Path Param Min Length", + }, + }, + "/path/param/{item_id}": { + "get": { + "operationId": "get_path_param_id_path_param__item_id__get", + "parameters": [ + { + "in": "path", + "name": "item_id", + "required": True, + "schema": { + "anyOf": [ + { + "type": "string", + }, + { + "type": "null", + }, + ], + "title": "Item Id", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Path Param Id", + }, + }, + "/path/str/{item_id}": { + "get": { + "operationId": "get_str_id_path_str__item_id__get", + "parameters": [ + { + "in": "path", + "name": "item_id", + "required": True, + "schema": { + "title": "Item Id", + "type": "string", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Str Id", + }, + }, + "/path/{item_id}": { + "get": { + "operationId": "get_id_path__item_id__get", + "parameters": [ + { + "in": "path", + "name": "item_id", + "required": True, + "schema": { + "title": "Item Id", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Id", + }, + }, + "/query": { + "get": { + "operationId": "get_query_query_get", + "parameters": [ + { + "in": "query", + "name": "query", + "required": True, + "schema": { + "title": "Query", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Query", + }, + }, + "/query/frozenset": { + "get": { + "operationId": "get_query_type_frozenset_query_frozenset_get", + "parameters": [ + { + "in": "query", + "name": "query", + "required": True, + "schema": { + "items": { + "type": "integer", + }, + "title": "Query", + "type": "array", + "uniqueItems": True, + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Query Type Frozenset", + }, + }, + "/query/int": { + "get": { + "operationId": "get_query_type_query_int_get", + "parameters": [ + { + "in": "query", + "name": "query", + "required": True, + "schema": { + "title": "Query", + "type": "integer", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Query Type", + }, + }, + "/query/int/default": { + "get": { + "operationId": "get_query_type_int_default_query_int_default_get", + "parameters": [ + { + "in": "query", + "name": "query", + "required": False, + "schema": { + "default": 10, + "title": "Query", + "type": "integer", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Query Type Int Default", + }, + }, + "/query/int/optional": { + "get": { + "operationId": "get_query_type_optional_query_int_optional_get", + "parameters": [ + { + "in": "query", + "name": "query", + "required": False, + "schema": { + "anyOf": [ + { + "type": "integer", + }, + { + "type": "null", + }, + ], + "title": "Query", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Query Type Optional", + }, + }, + "/query/list": { + "get": { + "operationId": "get_query_list_query_list_get", + "parameters": [ + { + "in": "query", + "name": "device_ids", + "required": True, + "schema": { + "items": { + "type": "integer", + }, + "title": "Device Ids", + "type": "array", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "items": { + "type": "integer", + }, + "title": "Response Get Query List Query List Get", + "type": "array", + }, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Query List", + }, + }, + "/query/list-default": { + "get": { + "operationId": "get_query_list_default_query_list_default_get", + "parameters": [ + { + "in": "query", + "name": "device_ids", + "required": False, + "schema": { + "default": [], + "items": { + "type": "integer", + }, + "title": "Device Ids", + "type": "array", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "items": { + "type": "integer", + }, + "title": "Response Get Query List Default Query " + "List Default Get", + "type": "array", + }, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Query List Default", + }, + }, + "/query/mapping-params": { + "get": { + "operationId": "get_mapping_query_params_query_mapping_params_get", + "parameters": [ + { + "in": "query", + "name": "queries", + "required": False, + "schema": { + "additionalProperties": { + "type": "string", + }, + "default": {}, + "title": "Queries", + "type": "object", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Mapping Query Params", + }, + }, + "/query/mapping-sequence-params": { + "get": { + "operationId": "get_sequence_mapping_query_params_query_mapping_sequence_params_get", + "parameters": [ + { + "in": "query", + "name": "queries", + "required": False, + "schema": { + "additionalProperties": { + "items": { + "type": "integer", + }, + "type": "array", + }, + "default": {}, + "title": "Queries", + "type": "object", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Sequence Mapping Query Params", + }, + }, + "/query/mixed-params": { + "get": { + "operationId": "get_mixed_mapping_query_params_query_mixed_params_get", + "parameters": [ + { + "in": "query", + "name": "sequence_mapping_queries", + "required": False, + "schema": { + "additionalProperties": { + "items": { + "anyOf": [ + { + "type": "string", + }, + { + "type": "integer", + }, + ], + }, + "type": "array", + }, + "default": {}, + "title": "Sequence Mapping Queries", + "type": "object", + }, + }, + { + "in": "query", + "name": "mapping_query", + "required": True, + "schema": { + "additionalProperties": { + "type": "string", + }, + "title": "Mapping Query", + "type": "object", + }, + }, + { + "in": "query", + "name": "query", + "required": True, + "schema": { + "title": "Query", + "type": "string", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Mixed Mapping Query Params", + }, + }, + "/query/mixed-type-params": { + "get": { + "operationId": "get_mixed_mapping_mixed_type_query_params_query_mixed_type_params_get", + "parameters": [ + { + "in": "query", + "name": "sequence_mapping_queries", + "required": False, + "schema": { + "additionalProperties": { + "items": { + "type": "integer", + }, + "type": "array", + }, + "default": {}, + "title": "Sequence Mapping Queries", + "type": "object", + }, + }, + { + "in": "query", + "name": "mapping_query_str", + "required": False, + "schema": { + "additionalProperties": { + "type": "string", + }, + "default": {}, + "title": "Mapping Query Str", + "type": "object", + }, + }, + { + "in": "query", + "name": "mapping_query_int", + "required": False, + "schema": { + "additionalProperties": { + "type": "integer", + }, + "default": {}, + "title": "Mapping Query Int", + "type": "object", + }, + }, + { + "in": "query", + "name": "query", + "required": True, + "schema": { + "title": "Query", + "type": "integer", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Mixed Mapping Mixed Type Query Params", + }, + }, + "/query/optional": { + "get": { + "operationId": "get_query_optional_query_optional_get", + "parameters": [ + { + "in": "query", + "name": "query", + "required": False, + "schema": { + "title": "Query", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Query Optional", + }, + }, + "/query/param": { + "get": { + "operationId": "get_query_param_query_param_get", + "parameters": [ + { + "in": "query", + "name": "query", + "required": False, + "schema": { + "title": "Query", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Query Param", + }, + }, + "/query/param-required": { + "get": { + "operationId": "get_query_param_required_query_param_required_get", + "parameters": [ + { + "in": "query", + "name": "query", + "required": True, + "schema": { + "title": "Query", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Query Param Required", + }, + }, + "/query/param-required/int": { + "get": { + "operationId": "get_query_param_required_type_query_param_required_int_get", + "parameters": [ + { + "in": "query", + "name": "query", + "required": True, + "schema": { + "title": "Query", + "type": "integer", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Query Param Required Type", + }, + }, + "/text": { + "get": { + "operationId": "get_text_text_get", + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + }, + "summary": "Get Text", + }, + }, + }, + } From b9226655682a67d1e2988011ef033b0e342f2b4a Mon Sep 17 00:00:00 2001 From: JONEMI21 Date: Thu, 6 Nov 2025 22:08:00 +0000 Subject: [PATCH 60/91] add shape mapping --- fastapi/_compat/v1.py | 1 + 1 file changed, 1 insertion(+) diff --git a/fastapi/_compat/v1.py b/fastapi/_compat/v1.py index fdafbef96..0efc250c1 100644 --- a/fastapi/_compat/v1.py +++ b/fastapi/_compat/v1.py @@ -38,6 +38,7 @@ if not PYDANTIC_V2: from pydantic.fields import ( # type: ignore[attr-defined] SHAPE_FROZENSET, SHAPE_LIST, + SHAPE_MAPPING, SHAPE_SEQUENCE, SHAPE_SET, SHAPE_SINGLETON, From d539d51b015d90df0237e3abc7d87a8f3fcd4360 Mon Sep 17 00:00:00 2001 From: JONEMI21 Date: Thu, 6 Nov 2025 22:12:33 +0000 Subject: [PATCH 61/91] rv --- tests/test_application.py | 2844 ++++++++++++++++--------------------- 1 file changed, 1199 insertions(+), 1645 deletions(-) diff --git a/tests/test_application.py b/tests/test_application.py index c179ecb62..8f1b0a18d 100644 --- a/tests/test_application.py +++ b/tests/test_application.py @@ -1,4 +1,5 @@ import pytest +from dirty_equals import IsDict from fastapi.testclient import TestClient from .main import app @@ -55,1679 +56,1232 @@ def test_openapi_schema(): response = client.get("/openapi.json") assert response.status_code == 200, response.text assert response.json() == { - "components": { - "schemas": { - "HTTPValidationError": { - "properties": { - "detail": { - "items": { - "$ref": "#/components/schemas/ValidationError", - }, - "title": "Detail", - "type": "array", - }, - }, - "title": "HTTPValidationError", - "type": "object", - }, - "ValidationError": { - "properties": { - "loc": { - "items": { - "anyOf": [ - { - "type": "string", - }, - { - "type": "integer", - }, - ], - }, - "title": "Location", - "type": "array", - }, - "msg": { - "title": "Message", - "type": "string", - }, - "type": { - "title": "Error Type", - "type": "string", - }, - }, - "required": [ - "loc", - "msg", - "type", - ], - "title": "ValidationError", - "type": "object", - }, - }, - }, + "openapi": "3.1.0", + "info": {"title": "FastAPI", "version": "0.1.0"}, "externalDocs": { "description": "External API documentation.", "url": "https://docs.example.com/api-general", }, - "info": { - "title": "FastAPI", - "version": "0.1.0", - }, - "openapi": "3.1.0", "paths": { "/api_route": { "get": { - "operationId": "non_operation_api_route_get", "responses": { "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, "description": "Successful Response", - }, + "content": {"application/json": {"schema": {}}}, + } }, "summary": "Non Operation", - }, - }, - "/enum-status-code": { - "get": { - "operationId": "get_enum_status_code_enum_status_code_get", - "responses": { - "201": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - }, - "summary": "Get Enum Status Code", - }, + "operationId": "non_operation_api_route_get", + } }, "/non_decorated_route": { "get": { - "operationId": "non_decorated_route_non_decorated_route_get", "responses": { "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, "description": "Successful Response", - }, + "content": {"application/json": {"schema": {}}}, + } }, "summary": "Non Decorated Route", - }, - }, - "/path/bool/{item_id}": { - "get": { - "operationId": "get_bool_id_path_bool__item_id__get", - "parameters": [ - { - "in": "path", - "name": "item_id", - "required": True, - "schema": { - "title": "Item Id", - "type": "boolean", - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", - }, - }, - "summary": "Get Bool Id", - }, - }, - "/path/float/{item_id}": { - "get": { - "operationId": "get_float_id_path_float__item_id__get", - "parameters": [ - { - "in": "path", - "name": "item_id", - "required": True, - "schema": { - "title": "Item Id", - "type": "number", - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", - }, - }, - "summary": "Get Float Id", - }, - }, - "/path/int/{item_id}": { - "get": { - "operationId": "get_int_id_path_int__item_id__get", - "parameters": [ - { - "in": "path", - "name": "item_id", - "required": True, - "schema": { - "title": "Item Id", - "type": "integer", - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", - }, - }, - "summary": "Get Int Id", - }, - }, - "/path/param-ge-int/{item_id}": { - "get": { - "operationId": "get_path_param_ge_int_path_param_ge_int__item_id__get", - "parameters": [ - { - "in": "path", - "name": "item_id", - "required": True, - "schema": { - "minimum": 3, - "title": "Item Id", - "type": "integer", - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", - }, - }, - "summary": "Get Path Param Ge Int", - }, - }, - "/path/param-ge/{item_id}": { - "get": { - "operationId": "get_path_param_ge_path_param_ge__item_id__get", - "parameters": [ - { - "in": "path", - "name": "item_id", - "required": True, - "schema": { - "minimum": 3, - "title": "Item Id", - "type": "number", - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", - }, - }, - "summary": "Get Path Param Ge", - }, - }, - "/path/param-gt-int/{item_id}": { - "get": { - "operationId": "get_path_param_gt_int_path_param_gt_int__item_id__get", - "parameters": [ - { - "in": "path", - "name": "item_id", - "required": True, - "schema": { - "exclusiveMinimum": 3, - "title": "Item Id", - "type": "integer", - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", - }, - }, - "summary": "Get Path Param Gt Int", - }, - }, - "/path/param-gt/{item_id}": { - "get": { - "operationId": "get_path_param_gt_path_param_gt__item_id__get", - "parameters": [ - { - "in": "path", - "name": "item_id", - "required": True, - "schema": { - "exclusiveMinimum": 3, - "title": "Item Id", - "type": "number", - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", - }, - }, - "summary": "Get Path Param Gt", - }, - }, - "/path/param-gt0/{item_id}": { - "get": { - "operationId": "get_path_param_gt0_path_param_gt0__item_id__get", - "parameters": [ - { - "in": "path", - "name": "item_id", - "required": True, - "schema": { - "exclusiveMinimum": 0, - "title": "Item Id", - "type": "number", - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", - }, - }, - "summary": "Get Path Param Gt0", - }, - }, - "/path/param-le-ge-int/{item_id}": { - "get": { - "operationId": "get_path_param_le_ge_int_path_param_le_ge_int__item_id__get", - "parameters": [ - { - "in": "path", - "name": "item_id", - "required": True, - "schema": { - "maximum": 3, - "minimum": 1, - "title": "Item Id", - "type": "integer", - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", - }, - }, - "summary": "Get Path Param Le Ge Int", - }, - }, - "/path/param-le-ge/{item_id}": { - "get": { - "operationId": "get_path_param_le_ge_path_param_le_ge__item_id__get", - "parameters": [ - { - "in": "path", - "name": "item_id", - "required": True, - "schema": { - "maximum": 3, - "minimum": 1, - "title": "Item Id", - "type": "number", - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", - }, - }, - "summary": "Get Path Param Le Ge", - }, - }, - "/path/param-le-int/{item_id}": { - "get": { - "operationId": "get_path_param_le_int_path_param_le_int__item_id__get", - "parameters": [ - { - "in": "path", - "name": "item_id", - "required": True, - "schema": { - "maximum": 3, - "title": "Item Id", - "type": "integer", - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", - }, - }, - "summary": "Get Path Param Le Int", - }, - }, - "/path/param-le/{item_id}": { - "get": { - "operationId": "get_path_param_le_path_param_le__item_id__get", - "parameters": [ - { - "in": "path", - "name": "item_id", - "required": True, - "schema": { - "maximum": 3, - "title": "Item Id", - "type": "number", - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", - }, - }, - "summary": "Get Path Param Le", - }, - }, - "/path/param-lt-gt-int/{item_id}": { - "get": { - "operationId": "get_path_param_lt_gt_int_path_param_lt_gt_int__item_id__get", - "parameters": [ - { - "in": "path", - "name": "item_id", - "required": True, - "schema": { - "exclusiveMaximum": 3, - "exclusiveMinimum": 1, - "title": "Item Id", - "type": "integer", - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", - }, - }, - "summary": "Get Path Param Lt Gt Int", - }, - }, - "/path/param-lt-gt/{item_id}": { - "get": { - "operationId": "get_path_param_lt_gt_path_param_lt_gt__item_id__get", - "parameters": [ - { - "in": "path", - "name": "item_id", - "required": True, - "schema": { - "exclusiveMaximum": 3, - "exclusiveMinimum": 1, - "title": "Item Id", - "type": "number", - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", - }, - }, - "summary": "Get Path Param Lt Gt", - }, - }, - "/path/param-lt-int/{item_id}": { - "get": { - "operationId": "get_path_param_lt_int_path_param_lt_int__item_id__get", - "parameters": [ - { - "in": "path", - "name": "item_id", - "required": True, - "schema": { - "exclusiveMaximum": 3, - "title": "Item Id", - "type": "integer", - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", - }, - }, - "summary": "Get Path Param Lt Int", - }, - }, - "/path/param-lt/{item_id}": { - "get": { - "operationId": "get_path_param_lt_path_param_lt__item_id__get", - "parameters": [ - { - "in": "path", - "name": "item_id", - "required": True, - "schema": { - "exclusiveMaximum": 3, - "title": "Item Id", - "type": "number", - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", - }, - }, - "summary": "Get Path Param Lt", - }, - }, - "/path/param-lt0/{item_id}": { - "get": { - "operationId": "get_path_param_lt0_path_param_lt0__item_id__get", - "parameters": [ - { - "in": "path", - "name": "item_id", - "required": True, - "schema": { - "exclusiveMaximum": 0, - "title": "Item Id", - "type": "number", - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", - }, - }, - "summary": "Get Path Param Lt0", - }, - }, - "/path/param-maxlength/{item_id}": { - "get": { - "operationId": "get_path_param_max_length_path_param_maxlength__item_id__get", - "parameters": [ - { - "in": "path", - "name": "item_id", - "required": True, - "schema": { - "maxLength": 3, - "title": "Item Id", - "type": "string", - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", - }, - }, - "summary": "Get Path Param Max Length", - }, - }, - "/path/param-min_maxlength/{item_id}": { - "get": { - "operationId": "get_path_param_min_max_length_path_param_min_maxlength__item_id__get", - "parameters": [ - { - "in": "path", - "name": "item_id", - "required": True, - "schema": { - "maxLength": 3, - "minLength": 2, - "title": "Item Id", - "type": "string", - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", - }, - }, - "summary": "Get Path Param Min Max Length", - }, - }, - "/path/param-minlength/{item_id}": { - "get": { - "operationId": "get_path_param_min_length_path_param_minlength__item_id__get", - "parameters": [ - { - "in": "path", - "name": "item_id", - "required": True, - "schema": { - "minLength": 3, - "title": "Item Id", - "type": "string", - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", - }, - }, - "summary": "Get Path Param Min Length", - }, - }, - "/path/param/{item_id}": { - "get": { - "operationId": "get_path_param_id_path_param__item_id__get", - "parameters": [ - { - "in": "path", - "name": "item_id", - "required": True, - "schema": { - "anyOf": [ - { - "type": "string", - }, - { - "type": "null", - }, - ], - "title": "Item Id", - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", - }, - }, - "summary": "Get Path Param Id", - }, - }, - "/path/str/{item_id}": { - "get": { - "operationId": "get_str_id_path_str__item_id__get", - "parameters": [ - { - "in": "path", - "name": "item_id", - "required": True, - "schema": { - "title": "Item Id", - "type": "string", - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", - }, - }, - "summary": "Get Str Id", - }, - }, - "/path/{item_id}": { - "get": { - "operationId": "get_id_path__item_id__get", - "parameters": [ - { - "in": "path", - "name": "item_id", - "required": True, - "schema": { - "title": "Item Id", - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", - }, - }, - "summary": "Get Id", - }, - }, - "/query": { - "get": { - "operationId": "get_query_query_get", - "parameters": [ - { - "in": "query", - "name": "query", - "required": True, - "schema": { - "title": "Query", - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", - }, - }, - "summary": "Get Query", - }, - }, - "/query/frozenset": { - "get": { - "operationId": "get_query_type_frozenset_query_frozenset_get", - "parameters": [ - { - "in": "query", - "name": "query", - "required": True, - "schema": { - "items": { - "type": "integer", - }, - "title": "Query", - "type": "array", - "uniqueItems": True, - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", - }, - }, - "summary": "Get Query Type Frozenset", - }, - }, - "/query/int": { - "get": { - "operationId": "get_query_type_query_int_get", - "parameters": [ - { - "in": "query", - "name": "query", - "required": True, - "schema": { - "title": "Query", - "type": "integer", - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", - }, - }, - "summary": "Get Query Type", - }, - }, - "/query/int/default": { - "get": { - "operationId": "get_query_type_int_default_query_int_default_get", - "parameters": [ - { - "in": "query", - "name": "query", - "required": False, - "schema": { - "default": 10, - "title": "Query", - "type": "integer", - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", - }, - }, - "summary": "Get Query Type Int Default", - }, - }, - "/query/int/optional": { - "get": { - "operationId": "get_query_type_optional_query_int_optional_get", - "parameters": [ - { - "in": "query", - "name": "query", - "required": False, - "schema": { - "anyOf": [ - { - "type": "integer", - }, - { - "type": "null", - }, - ], - "title": "Query", - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", - }, - }, - "summary": "Get Query Type Optional", - }, - }, - "/query/list": { - "get": { - "operationId": "get_query_list_query_list_get", - "parameters": [ - { - "in": "query", - "name": "device_ids", - "required": True, - "schema": { - "items": { - "type": "integer", - }, - "title": "Device Ids", - "type": "array", - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "items": { - "type": "integer", - }, - "title": "Response Get Query List Query List Get", - "type": "array", - }, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", - }, - }, - "summary": "Get Query List", - }, - }, - "/query/list-default": { - "get": { - "operationId": "get_query_list_default_query_list_default_get", - "parameters": [ - { - "in": "query", - "name": "device_ids", - "required": False, - "schema": { - "default": [], - "items": { - "type": "integer", - }, - "title": "Device Ids", - "type": "array", - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "items": { - "type": "integer", - }, - "title": "Response Get Query List Default Query " - "List Default Get", - "type": "array", - }, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", - }, - }, - "summary": "Get Query List Default", - }, - }, - "/query/mapping-params": { - "get": { - "operationId": "get_mapping_query_params_query_mapping_params_get", - "parameters": [ - { - "in": "query", - "name": "queries", - "required": False, - "schema": { - "additionalProperties": { - "type": "string", - }, - "default": {}, - "title": "Queries", - "type": "object", - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", - }, - }, - "summary": "Get Mapping Query Params", - }, - }, - "/query/mapping-sequence-params": { - "get": { - "operationId": "get_sequence_mapping_query_params_query_mapping_sequence_params_get", - "parameters": [ - { - "in": "query", - "name": "queries", - "required": False, - "schema": { - "additionalProperties": { - "items": { - "type": "integer", - }, - "type": "array", - }, - "default": {}, - "title": "Queries", - "type": "object", - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", - }, - }, - "summary": "Get Sequence Mapping Query Params", - }, - }, - "/query/mixed-params": { - "get": { - "operationId": "get_mixed_mapping_query_params_query_mixed_params_get", - "parameters": [ - { - "in": "query", - "name": "sequence_mapping_queries", - "required": False, - "schema": { - "additionalProperties": { - "items": { - "anyOf": [ - { - "type": "string", - }, - { - "type": "integer", - }, - ], - }, - "type": "array", - }, - "default": {}, - "title": "Sequence Mapping Queries", - "type": "object", - }, - }, - { - "in": "query", - "name": "mapping_query", - "required": True, - "schema": { - "additionalProperties": { - "type": "string", - }, - "title": "Mapping Query", - "type": "object", - }, - }, - { - "in": "query", - "name": "query", - "required": True, - "schema": { - "title": "Query", - "type": "string", - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", - }, - }, - "summary": "Get Mixed Mapping Query Params", - }, - }, - "/query/mixed-type-params": { - "get": { - "operationId": "get_mixed_mapping_mixed_type_query_params_query_mixed_type_params_get", - "parameters": [ - { - "in": "query", - "name": "sequence_mapping_queries", - "required": False, - "schema": { - "additionalProperties": { - "items": { - "type": "integer", - }, - "type": "array", - }, - "default": {}, - "title": "Sequence Mapping Queries", - "type": "object", - }, - }, - { - "in": "query", - "name": "mapping_query_str", - "required": False, - "schema": { - "additionalProperties": { - "type": "string", - }, - "default": {}, - "title": "Mapping Query Str", - "type": "object", - }, - }, - { - "in": "query", - "name": "mapping_query_int", - "required": False, - "schema": { - "additionalProperties": { - "type": "integer", - }, - "default": {}, - "title": "Mapping Query Int", - "type": "object", - }, - }, - { - "in": "query", - "name": "query", - "required": True, - "schema": { - "title": "Query", - "type": "integer", - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", - }, - }, - "summary": "Get Mixed Mapping Mixed Type Query Params", - }, - }, - "/query/optional": { - "get": { - "operationId": "get_query_optional_query_optional_get", - "parameters": [ - { - "in": "query", - "name": "query", - "required": False, - "schema": { - "title": "Query", - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", - }, - }, - "summary": "Get Query Optional", - }, - }, - "/query/param": { - "get": { - "operationId": "get_query_param_query_param_get", - "parameters": [ - { - "in": "query", - "name": "query", - "required": False, - "schema": { - "title": "Query", - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", - }, - }, - "summary": "Get Query Param", - }, - }, - "/query/param-required": { - "get": { - "operationId": "get_query_param_required_query_param_required_get", - "parameters": [ - { - "in": "query", - "name": "query", - "required": True, - "schema": { - "title": "Query", - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", - }, - }, - "summary": "Get Query Param Required", - }, - }, - "/query/param-required/int": { - "get": { - "operationId": "get_query_param_required_type_query_param_required_int_get", - "parameters": [ - { - "in": "query", - "name": "query", - "required": True, - "schema": { - "title": "Query", - "type": "integer", - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", - }, - }, - "summary": "Get Query Param Required Type", - }, + "operationId": "non_decorated_route_non_decorated_route_get", + } }, "/text": { "get": { - "operationId": "get_text_text_get", "responses": { "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, "description": "Successful Response", - }, + "content": {"application/json": {"schema": {}}}, + } }, "summary": "Get Text", - }, + "operationId": "get_text_text_get", + } + }, + "/path/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + "summary": "Get Id", + "operationId": "get_id_path__item_id__get", + "parameters": [ + { + "required": True, + "schema": {"title": "Item Id"}, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/str/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + "summary": "Get Str Id", + "operationId": "get_str_id_path_str__item_id__get", + "parameters": [ + { + "required": True, + "schema": {"title": "Item Id", "type": "string"}, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/int/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + "summary": "Get Int Id", + "operationId": "get_int_id_path_int__item_id__get", + "parameters": [ + { + "required": True, + "schema": {"title": "Item Id", "type": "integer"}, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/float/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + "summary": "Get Float Id", + "operationId": "get_float_id_path_float__item_id__get", + "parameters": [ + { + "required": True, + "schema": {"title": "Item Id", "type": "number"}, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/bool/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + "summary": "Get Bool Id", + "operationId": "get_bool_id_path_bool__item_id__get", + "parameters": [ + { + "required": True, + "schema": {"title": "Item Id", "type": "boolean"}, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + "summary": "Get Path Param Id", + "operationId": "get_path_param_id_path_param__item_id__get", + "parameters": [ + { + "name": "item_id", + "in": "path", + "required": True, + "schema": IsDict( + { + "anyOf": [{"type": "string"}, {"type": "null"}], + "title": "Item Id", + } + ) + # TODO: remove when deprecating Pydantic v1 + | IsDict({"title": "Item Id", "type": "string"}), + } + ], + } + }, + "/path/param-minlength/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + "summary": "Get Path Param Min Length", + "operationId": "get_path_param_min_length_path_param_minlength__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "minLength": 3, + "type": "string", + }, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-maxlength/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + "summary": "Get Path Param Max Length", + "operationId": "get_path_param_max_length_path_param_maxlength__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "maxLength": 3, + "type": "string", + }, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-min_maxlength/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + "summary": "Get Path Param Min Max Length", + "operationId": "get_path_param_min_max_length_path_param_min_maxlength__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "maxLength": 3, + "minLength": 2, + "type": "string", + }, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-gt/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + "summary": "Get Path Param Gt", + "operationId": "get_path_param_gt_path_param_gt__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "exclusiveMinimum": 3.0, + "type": "number", + }, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-gt0/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + "summary": "Get Path Param Gt0", + "operationId": "get_path_param_gt0_path_param_gt0__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "exclusiveMinimum": 0.0, + "type": "number", + }, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-ge/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + "summary": "Get Path Param Ge", + "operationId": "get_path_param_ge_path_param_ge__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "minimum": 3.0, + "type": "number", + }, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-lt/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + "summary": "Get Path Param Lt", + "operationId": "get_path_param_lt_path_param_lt__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "exclusiveMaximum": 3.0, + "type": "number", + }, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-lt0/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + "summary": "Get Path Param Lt0", + "operationId": "get_path_param_lt0_path_param_lt0__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "exclusiveMaximum": 0.0, + "type": "number", + }, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-le/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + "summary": "Get Path Param Le", + "operationId": "get_path_param_le_path_param_le__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "maximum": 3.0, + "type": "number", + }, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-lt-gt/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + "summary": "Get Path Param Lt Gt", + "operationId": "get_path_param_lt_gt_path_param_lt_gt__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "exclusiveMaximum": 3.0, + "exclusiveMinimum": 1.0, + "type": "number", + }, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-le-ge/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + "summary": "Get Path Param Le Ge", + "operationId": "get_path_param_le_ge_path_param_le_ge__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "maximum": 3.0, + "minimum": 1.0, + "type": "number", + }, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-lt-int/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + "summary": "Get Path Param Lt Int", + "operationId": "get_path_param_lt_int_path_param_lt_int__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "exclusiveMaximum": 3.0, + "type": "integer", + }, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-gt-int/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + "summary": "Get Path Param Gt Int", + "operationId": "get_path_param_gt_int_path_param_gt_int__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "exclusiveMinimum": 3.0, + "type": "integer", + }, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-le-int/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + "summary": "Get Path Param Le Int", + "operationId": "get_path_param_le_int_path_param_le_int__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "maximum": 3.0, + "type": "integer", + }, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-ge-int/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + "summary": "Get Path Param Ge Int", + "operationId": "get_path_param_ge_int_path_param_ge_int__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "minimum": 3.0, + "type": "integer", + }, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-lt-gt-int/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + "summary": "Get Path Param Lt Gt Int", + "operationId": "get_path_param_lt_gt_int_path_param_lt_gt_int__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "exclusiveMaximum": 3.0, + "exclusiveMinimum": 1.0, + "type": "integer", + }, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-le-ge-int/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + "summary": "Get Path Param Le Ge Int", + "operationId": "get_path_param_le_ge_int_path_param_le_ge_int__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "maximum": 3.0, + "minimum": 1.0, + "type": "integer", + }, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/query": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + "summary": "Get Query", + "operationId": "get_query_query_get", + "parameters": [ + { + "required": True, + "schema": {"title": "Query"}, + "name": "query", + "in": "query", + } + ], + } + }, + "/query/optional": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + "summary": "Get Query Optional", + "operationId": "get_query_optional_query_optional_get", + "parameters": [ + { + "required": False, + "schema": {"title": "Query"}, + "name": "query", + "in": "query", + } + ], + } + }, + "/query/int": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + "summary": "Get Query Type", + "operationId": "get_query_type_query_int_get", + "parameters": [ + { + "required": True, + "schema": {"title": "Query", "type": "integer"}, + "name": "query", + "in": "query", + } + ], + } + }, + "/query/int/optional": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + "summary": "Get Query Type Optional", + "operationId": "get_query_type_optional_query_int_optional_get", + "parameters": [ + { + "name": "query", + "in": "query", + "required": False, + "schema": IsDict( + { + "anyOf": [{"type": "integer"}, {"type": "null"}], + "title": "Query", + } + ) + # TODO: remove when deprecating Pydantic v1 + | IsDict({"title": "Query", "type": "integer"}), + } + ], + } + }, + "/query/int/default": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + "summary": "Get Query Type Int Default", + "operationId": "get_query_type_int_default_query_int_default_get", + "parameters": [ + { + "required": False, + "schema": { + "title": "Query", + "type": "integer", + "default": 10, + }, + "name": "query", + "in": "query", + } + ], + } + }, + "/query/param": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + "summary": "Get Query Param", + "operationId": "get_query_param_query_param_get", + "parameters": [ + { + "required": False, + "schema": {"title": "Query"}, + "name": "query", + "in": "query", + } + ], + } + }, + "/query/param-required": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + "summary": "Get Query Param Required", + "operationId": "get_query_param_required_query_param_required_get", + "parameters": [ + { + "required": True, + "schema": {"title": "Query"}, + "name": "query", + "in": "query", + } + ], + } + }, + "/query/param-required/int": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + "summary": "Get Query Param Required Type", + "operationId": "get_query_param_required_type_query_param_required_int_get", + "parameters": [ + { + "required": True, + "schema": {"title": "Query", "type": "integer"}, + "name": "query", + "in": "query", + } + ], + } + }, + "/enum-status-code": { + "get": { + "responses": { + "201": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + }, + "summary": "Get Enum Status Code", + "operationId": "get_enum_status_code_enum_status_code_get", + } + }, + "/query/frozenset": { + "get": { + "summary": "Get Query Type Frozenset", + "operationId": "get_query_type_frozenset_query_frozenset_get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Query", + "uniqueItems": True, + "type": "array", + "items": {"type": "integer"}, + }, + "name": "query", + "in": "query", + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + } + }, + "/query/list": { + "get": { + "summary": "Get Query List", + "operationId": "get_query_list_query_list_get", + "parameters": [ + { + "name": "device_ids", + "in": "query", + "required": True, + "schema": { + "type": "array", + "items": {"type": "integer"}, + "title": "Device Ids", + }, + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": {"type": "integer"}, + "title": "Response Get Query List Query List Get", + } + } + }, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + } + }, + "/query/list-default": { + "get": { + "summary": "Get Query List Default", + "operationId": "get_query_list_default_query_list_default_get", + "parameters": [ + { + "name": "device_ids", + "in": "query", + "required": False, + "schema": { + "type": "array", + "items": {"type": "integer"}, + "default": [], + "title": "Device Ids", + }, + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": {"type": "integer"}, + "title": "Response Get Query List Default Query List Default Get", + } + } + }, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + } }, }, + "components": { + "schemas": { + "ValidationError": { + "title": "ValidationError", + "required": ["loc", "msg", "type"], + "type": "object", + "properties": { + "loc": { + "title": "Location", + "type": "array", + "items": { + "anyOf": [{"type": "string"}, {"type": "integer"}] + }, + }, + "msg": {"title": "Message", "type": "string"}, + "type": {"title": "Error Type", "type": "string"}, + }, + }, + "HTTPValidationError": { + "title": "HTTPValidationError", + "type": "object", + "properties": { + "detail": { + "title": "Detail", + "type": "array", + "items": {"$ref": "#/components/schemas/ValidationError"}, + } + }, + }, + } + }, } From d7f1f418c7b45885df291aa270aac2b34211b99a Mon Sep 17 00:00:00 2001 From: JONEMI21 Date: Thu, 6 Nov 2025 22:16:15 +0000 Subject: [PATCH 62/91] add paths --- tests/test_application.py | 2465 ++++++++++++++++++++----------------- 1 file changed, 1353 insertions(+), 1112 deletions(-) diff --git a/tests/test_application.py b/tests/test_application.py index 8f1b0a18d..ad77f6ff0 100644 --- a/tests/test_application.py +++ b/tests/test_application.py @@ -55,1233 +55,1474 @@ def test_enum_status_code_response(): def test_openapi_schema(): response = client.get("/openapi.json") assert response.status_code == 200, response.text - assert response.json() == { - "openapi": "3.1.0", - "info": {"title": "FastAPI", "version": "0.1.0"}, - "externalDocs": { - "description": "External API documentation.", - "url": "https://docs.example.com/api-general", - }, - "paths": { - "/api_route": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - } - }, - "summary": "Non Operation", - "operationId": "non_operation_api_route_get", - } + assert response.json()== { + "openapi": "3.1.0", + "info": {"title": "FastAPI", "version": "0.1.0"}, + "externalDocs": { + "description": "External API documentation.", + "url": "https://docs.example.com/api-general", }, - "/non_decorated_route": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - } - }, - "summary": "Non Decorated Route", - "operationId": "non_decorated_route_non_decorated_route_get", - } - }, - "/text": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - } - }, - "summary": "Get Text", - "operationId": "get_text_text_get", - } - }, - "/path/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, + "paths": { + "/api_route": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + } }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" + "summary": "Non Operation", + "operationId": "non_operation_api_route_get", + } + }, + "/non_decorated_route": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + } + }, + "summary": "Non Decorated Route", + "operationId": "non_decorated_route_non_decorated_route_get", + } + }, + "/text": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + } + }, + "summary": "Get Text", + "operationId": "get_text_text_get", + } + }, + "/path/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } - } + }, }, }, - }, - "summary": "Get Id", - "operationId": "get_id_path__item_id__get", - "parameters": [ - { - "required": True, - "schema": {"title": "Item Id"}, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/str/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" + "summary": "Get Id", + "operationId": "get_id_path__item_id__get", + "parameters": [ + { + "required": True, + "schema": {"title": "Item Id"}, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/str/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } - } + }, }, }, - }, - "summary": "Get Str Id", - "operationId": "get_str_id_path_str__item_id__get", - "parameters": [ - { - "required": True, - "schema": {"title": "Item Id", "type": "string"}, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/int/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" + "summary": "Get Str Id", + "operationId": "get_str_id_path_str__item_id__get", + "parameters": [ + { + "required": True, + "schema": {"title": "Item Id", "type": "string"}, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/int/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } - } + }, }, }, - }, - "summary": "Get Int Id", - "operationId": "get_int_id_path_int__item_id__get", - "parameters": [ - { - "required": True, - "schema": {"title": "Item Id", "type": "integer"}, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/float/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" + "summary": "Get Int Id", + "operationId": "get_int_id_path_int__item_id__get", + "parameters": [ + { + "required": True, + "schema": {"title": "Item Id", "type": "integer"}, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/float/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } - } + }, }, }, - }, - "summary": "Get Float Id", - "operationId": "get_float_id_path_float__item_id__get", - "parameters": [ - { - "required": True, - "schema": {"title": "Item Id", "type": "number"}, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/bool/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" + "summary": "Get Float Id", + "operationId": "get_float_id_path_float__item_id__get", + "parameters": [ + { + "required": True, + "schema": {"title": "Item Id", "type": "number"}, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/bool/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } - } + }, }, }, - }, - "summary": "Get Bool Id", - "operationId": "get_bool_id_path_bool__item_id__get", - "parameters": [ - { - "required": True, - "schema": {"title": "Item Id", "type": "boolean"}, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" + "summary": "Get Bool Id", + "operationId": "get_bool_id_path_bool__item_id__get", + "parameters": [ + { + "required": True, + "schema": {"title": "Item Id", "type": "boolean"}, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } - } + }, }, }, - }, - "summary": "Get Path Param Id", - "operationId": "get_path_param_id_path_param__item_id__get", - "parameters": [ - { - "name": "item_id", - "in": "path", - "required": True, - "schema": IsDict( - { - "anyOf": [{"type": "string"}, {"type": "null"}], + "summary": "Get Path Param Id", + "operationId": "get_path_param_id_path_param__item_id__get", + "parameters": [ + { + "name": "item_id", + "in": "path", + "required": True, + "schema": IsDict( + { + "anyOf": [{"type": "string"}, {"type": "null"}], + "title": "Item Id", + } + ) + # TODO: remove when deprecating Pydantic v1 + | IsDict({"title": "Item Id", "type": "string"}), + } + ], + } + }, + "/path/param-minlength/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + "summary": "Get Path Param Min Length", + "operationId": "get_path_param_min_length_path_param_minlength__item_id__get", + "parameters": [ + { + "required": True, + "schema": { "title": "Item Id", - } - ) - # TODO: remove when deprecating Pydantic v1 - | IsDict({"title": "Item Id", "type": "string"}), - } - ], - } - }, - "/path/param-minlength/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" + "minLength": 3, + "type": "string", + }, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-maxlength/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } - } + }, }, }, - }, - "summary": "Get Path Param Min Length", - "operationId": "get_path_param_min_length_path_param_minlength__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "minLength": 3, - "type": "string", + "summary": "Get Path Param Max Length", + "operationId": "get_path_param_max_length_path_param_maxlength__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "maxLength": 3, + "type": "string", + }, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-min_maxlength/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-maxlength/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } - } + }, }, }, - }, - "summary": "Get Path Param Max Length", - "operationId": "get_path_param_max_length_path_param_maxlength__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "maxLength": 3, - "type": "string", + "summary": "Get Path Param Min Max Length", + "operationId": "get_path_param_min_max_length_path_param_min_maxlength__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "maxLength": 3, + "minLength": 2, + "type": "string", + }, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-gt/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-min_maxlength/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } - } + }, }, }, - }, - "summary": "Get Path Param Min Max Length", - "operationId": "get_path_param_min_max_length_path_param_min_maxlength__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "maxLength": 3, - "minLength": 2, - "type": "string", + "summary": "Get Path Param Gt", + "operationId": "get_path_param_gt_path_param_gt__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "exclusiveMinimum": 3.0, + "type": "number", + }, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-gt0/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-gt/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } - } + }, }, }, - }, - "summary": "Get Path Param Gt", - "operationId": "get_path_param_gt_path_param_gt__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "exclusiveMinimum": 3.0, - "type": "number", + "summary": "Get Path Param Gt0", + "operationId": "get_path_param_gt0_path_param_gt0__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "exclusiveMinimum": 0.0, + "type": "number", + }, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-ge/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-gt0/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } - } + }, }, }, - }, - "summary": "Get Path Param Gt0", - "operationId": "get_path_param_gt0_path_param_gt0__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "exclusiveMinimum": 0.0, - "type": "number", + "summary": "Get Path Param Ge", + "operationId": "get_path_param_ge_path_param_ge__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "minimum": 3.0, + "type": "number", + }, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-lt/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-ge/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } - } + }, }, }, - }, - "summary": "Get Path Param Ge", - "operationId": "get_path_param_ge_path_param_ge__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "minimum": 3.0, - "type": "number", + "summary": "Get Path Param Lt", + "operationId": "get_path_param_lt_path_param_lt__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "exclusiveMaximum": 3.0, + "type": "number", + }, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-lt0/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-lt/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } - } + }, }, }, - }, - "summary": "Get Path Param Lt", - "operationId": "get_path_param_lt_path_param_lt__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "exclusiveMaximum": 3.0, - "type": "number", + "summary": "Get Path Param Lt0", + "operationId": "get_path_param_lt0_path_param_lt0__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "exclusiveMaximum": 0.0, + "type": "number", + }, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-le/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-lt0/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } - } + }, }, }, - }, - "summary": "Get Path Param Lt0", - "operationId": "get_path_param_lt0_path_param_lt0__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "exclusiveMaximum": 0.0, - "type": "number", + "summary": "Get Path Param Le", + "operationId": "get_path_param_le_path_param_le__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "maximum": 3.0, + "type": "number", + }, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-lt-gt/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-le/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } - } + }, }, }, - }, - "summary": "Get Path Param Le", - "operationId": "get_path_param_le_path_param_le__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "maximum": 3.0, - "type": "number", + "summary": "Get Path Param Lt Gt", + "operationId": "get_path_param_lt_gt_path_param_lt_gt__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "exclusiveMaximum": 3.0, + "exclusiveMinimum": 1.0, + "type": "number", + }, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-le-ge/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-lt-gt/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } - } + }, }, }, - }, - "summary": "Get Path Param Lt Gt", - "operationId": "get_path_param_lt_gt_path_param_lt_gt__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "exclusiveMaximum": 3.0, - "exclusiveMinimum": 1.0, - "type": "number", + "summary": "Get Path Param Le Ge", + "operationId": "get_path_param_le_ge_path_param_le_ge__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "maximum": 3.0, + "minimum": 1.0, + "type": "number", + }, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-lt-int/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-le-ge/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } - } + }, }, }, - }, - "summary": "Get Path Param Le Ge", - "operationId": "get_path_param_le_ge_path_param_le_ge__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "maximum": 3.0, - "minimum": 1.0, - "type": "number", + "summary": "Get Path Param Lt Int", + "operationId": "get_path_param_lt_int_path_param_lt_int__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "exclusiveMaximum": 3.0, + "type": "integer", + }, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-gt-int/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-lt-int/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } - } + }, }, }, - }, - "summary": "Get Path Param Lt Int", - "operationId": "get_path_param_lt_int_path_param_lt_int__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "exclusiveMaximum": 3.0, - "type": "integer", + "summary": "Get Path Param Gt Int", + "operationId": "get_path_param_gt_int_path_param_gt_int__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "exclusiveMinimum": 3.0, + "type": "integer", + }, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-le-int/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-gt-int/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } - } + }, }, }, - }, - "summary": "Get Path Param Gt Int", - "operationId": "get_path_param_gt_int_path_param_gt_int__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "exclusiveMinimum": 3.0, - "type": "integer", + "summary": "Get Path Param Le Int", + "operationId": "get_path_param_le_int_path_param_le_int__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "maximum": 3.0, + "type": "integer", + }, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-ge-int/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-le-int/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } - } + }, }, }, - }, - "summary": "Get Path Param Le Int", - "operationId": "get_path_param_le_int_path_param_le_int__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "maximum": 3.0, - "type": "integer", + "summary": "Get Path Param Ge Int", + "operationId": "get_path_param_ge_int_path_param_ge_int__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "minimum": 3.0, + "type": "integer", + }, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-lt-gt-int/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-ge-int/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } - } + }, }, }, - }, - "summary": "Get Path Param Ge Int", - "operationId": "get_path_param_ge_int_path_param_ge_int__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "minimum": 3.0, - "type": "integer", + "summary": "Get Path Param Lt Gt Int", + "operationId": "get_path_param_lt_gt_int_path_param_lt_gt_int__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "exclusiveMaximum": 3.0, + "exclusiveMinimum": 1.0, + "type": "integer", + }, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-le-ge-int/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-lt-gt-int/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } - } + }, }, }, - }, - "summary": "Get Path Param Lt Gt Int", - "operationId": "get_path_param_lt_gt_int_path_param_lt_gt_int__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "exclusiveMaximum": 3.0, - "exclusiveMinimum": 1.0, - "type": "integer", + "summary": "Get Path Param Le Ge Int", + "operationId": "get_path_param_le_ge_int_path_param_le_ge_int__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "maximum": 3.0, + "minimum": 1.0, + "type": "integer", + }, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/query": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-le-ge-int/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } - } + }, }, }, - }, - "summary": "Get Path Param Le Ge Int", - "operationId": "get_path_param_le_ge_int_path_param_le_ge_int__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "maximum": 3.0, - "minimum": 1.0, - "type": "integer", + "summary": "Get Query", + "operationId": "get_query_query_get", + "parameters": [ + { + "required": True, + "schema": {"title": "Query"}, + "name": "query", + "in": "query", + } + ], + } + }, + "/query/optional": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/query": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } - } + }, }, }, - }, - "summary": "Get Query", - "operationId": "get_query_query_get", - "parameters": [ - { - "required": True, - "schema": {"title": "Query"}, - "name": "query", - "in": "query", - } - ], - } - }, - "/query/optional": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" + "summary": "Get Query Optional", + "operationId": "get_query_optional_query_optional_get", + "parameters": [ + { + "required": False, + "schema": {"title": "Query"}, + "name": "query", + "in": "query", + } + ], + } + }, + "/query/int": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } - } + }, }, }, - }, - "summary": "Get Query Optional", - "operationId": "get_query_optional_query_optional_get", - "parameters": [ - { - "required": False, - "schema": {"title": "Query"}, - "name": "query", - "in": "query", - } - ], - } - }, - "/query/int": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" + "summary": "Get Query Type", + "operationId": "get_query_type_query_int_get", + "parameters": [ + { + "required": True, + "schema": {"title": "Query", "type": "integer"}, + "name": "query", + "in": "query", + } + ], + } + }, + "/query/int/optional": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } - } + }, }, }, - }, - "summary": "Get Query Type", - "operationId": "get_query_type_query_int_get", - "parameters": [ - { - "required": True, - "schema": {"title": "Query", "type": "integer"}, - "name": "query", - "in": "query", - } - ], - } - }, - "/query/int/optional": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" + "summary": "Get Query Type Optional", + "operationId": "get_query_type_optional_query_int_optional_get", + "parameters": [ + { + "name": "query", + "in": "query", + "required": False, + "schema": IsDict( + { + "anyOf": [ + {"type": "integer"}, + {"type": "null"}, + ], + "title": "Query", } - } + ) + # TODO: remove when deprecating Pydantic v1 + | IsDict({"title": "Query", "type": "integer"}), + } + ], + } + }, + "/query/int/default": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, }, }, - }, - "summary": "Get Query Type Optional", - "operationId": "get_query_type_optional_query_int_optional_get", - "parameters": [ - { - "name": "query", - "in": "query", - "required": False, - "schema": IsDict( - { - "anyOf": [{"type": "integer"}, {"type": "null"}], + "summary": "Get Query Type Int Default", + "operationId": "get_query_type_int_default_query_int_default_get", + "parameters": [ + { + "required": False, + "schema": { "title": "Query", - } - ) - # TODO: remove when deprecating Pydantic v1 - | IsDict({"title": "Query", "type": "integer"}), - } - ], - } - }, - "/query/int/default": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" + "type": "integer", + "default": 10, + }, + "name": "query", + "in": "query", + } + ], + } + }, + "/query/param": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } - } + }, }, }, - }, - "summary": "Get Query Type Int Default", - "operationId": "get_query_type_int_default_query_int_default_get", - "parameters": [ - { - "required": False, - "schema": { - "title": "Query", - "type": "integer", - "default": 10, + "summary": "Get Query Param", + "operationId": "get_query_param_query_param_get", + "parameters": [ + { + "required": False, + "schema": {"title": "Query"}, + "name": "query", + "in": "query", + } + ], + } + }, + "/query/param-required": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, }, - "name": "query", - "in": "query", - } - ], - } - }, - "/query/param": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } - } + }, }, }, - }, - "summary": "Get Query Param", - "operationId": "get_query_param_query_param_get", - "parameters": [ - { - "required": False, - "schema": {"title": "Query"}, - "name": "query", - "in": "query", - } - ], - } - }, - "/query/param-required": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" + "summary": "Get Query Param Required", + "operationId": "get_query_param_required_query_param_required_get", + "parameters": [ + { + "required": True, + "schema": {"title": "Query"}, + "name": "query", + "in": "query", + } + ], + } + }, + "/query/param-required/int": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } - } + }, }, }, - }, - "summary": "Get Query Param Required", - "operationId": "get_query_param_required_query_param_required_get", - "parameters": [ - { - "required": True, - "schema": {"title": "Query"}, - "name": "query", - "in": "query", - } - ], - } - }, - "/query/param-required/int": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } + "summary": "Get Query Param Required Type", + "operationId": "get_query_param_required_type_query_param_required_int_get", + "parameters": [ + { + "required": True, + "schema": {"title": "Query", "type": "integer"}, + "name": "query", + "in": "query", + } + ], + } + }, + "/query/mapping-params": { + "get": { + "operationId": "get_mapping_query_params_query_mapping_params_get", + "parameters": [ + { + "in": "query", + "name": "queries", + "required": False, + "schema": { + "additionalProperties": { + "type": "string", + }, + "default": {}, + "title": "Queries", + "type": "object", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", }, }, - }, - "summary": "Get Query Param Required Type", - "operationId": "get_query_param_required_type_query_param_required_int_get", - "parameters": [ - { - "required": True, - "schema": {"title": "Query", "type": "integer"}, - "name": "query", - "in": "query", - } - ], - } - }, - "/enum-status-code": { - "get": { - "responses": { - "201": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - }, - "summary": "Get Enum Status Code", - "operationId": "get_enum_status_code_enum_status_code_get", - } - }, - "/query/frozenset": { - "get": { - "summary": "Get Query Type Frozenset", - "operationId": "get_query_type_frozenset_query_frozenset_get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Query", - "uniqueItems": True, - "type": "array", - "items": {"type": "integer"}, - }, - "name": "query", - "in": "query", - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - } - }, - "/query/list": { - "get": { - "summary": "Get Query List", - "operationId": "get_query_list_query_list_get", - "parameters": [ - { - "name": "device_ids", - "in": "query", - "required": True, - "schema": { - "type": "array", - "items": {"type": "integer"}, - "title": "Device Ids", - }, - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": {"type": "integer"}, - "title": "Response Get Query List Query List Get", - } - } - }, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - } - }, - "/query/list-default": { - "get": { - "summary": "Get Query List Default", - "operationId": "get_query_list_default_query_list_default_get", - "parameters": [ - { - "name": "device_ids", - "in": "query", - "required": False, - "schema": { - "type": "array", - "items": {"type": "integer"}, - "default": [], - "title": "Device Ids", - }, - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": {"type": "integer"}, - "title": "Response Get Query List Default Query List Default Get", - } - } - }, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - } - }, - }, - "components": { - "schemas": { - "ValidationError": { - "title": "ValidationError", - "required": ["loc", "msg", "type"], - "type": "object", - "properties": { - "loc": { - "title": "Location", - "type": "array", - "items": { - "anyOf": [{"type": "string"}, {"type": "integer"}] - }, - }, - "msg": {"title": "Message", "type": "string"}, - "type": {"title": "Error Type", "type": "string"}, + "summary": "Get Mapping Query Params", }, }, - "HTTPValidationError": { - "title": "HTTPValidationError", - "type": "object", - "properties": { - "detail": { - "title": "Detail", - "type": "array", - "items": {"$ref": "#/components/schemas/ValidationError"}, - } + "/query/mapping-sequence-params": { + "get": { + "operationId": "get_sequence_mapping_query_params_query_mapping_sequence_params_get", + "parameters": [ + { + "in": "query", + "name": "queries", + "required": False, + "schema": { + "additionalProperties": { + "items": { + "type": "integer", + }, + "type": "array", + }, + "default": {}, + "title": "Queries", + "type": "object", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Sequence Mapping Query Params", }, }, - } - }, - } + "/query/mixed-params": { + "get": { + "operationId": "get_mixed_mapping_query_params_query_mixed_params_get", + "parameters": [ + { + "in": "query", + "name": "sequence_mapping_queries", + "required": False, + "schema": { + "additionalProperties": { + "items": { + "anyOf": [ + { + "type": "string", + }, + { + "type": "integer", + }, + ], + }, + "type": "array", + }, + "default": {}, + "title": "Sequence Mapping Queries", + "type": "object", + }, + }, + { + "in": "query", + "name": "mapping_query", + "required": True, + "schema": { + "additionalProperties": { + "type": "string", + }, + "title": "Mapping Query", + "type": "object", + }, + }, + { + "in": "query", + "name": "query", + "required": True, + "schema": { + "title": "Query", + "type": "string", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Mixed Mapping Query Params", + }, + }, + "/query/mixed-type-params": { + "get": { + "operationId": "get_mixed_mapping_mixed_type_query_params_query_mixed_type_params_get", + "parameters": [ + { + "in": "query", + "name": "sequence_mapping_queries", + "required": False, + "schema": { + "additionalProperties": { + "items": { + "type": "integer", + }, + "type": "array", + }, + "default": {}, + "title": "Sequence Mapping Queries", + "type": "object", + }, + }, + { + "in": "query", + "name": "mapping_query_str", + "required": False, + "schema": { + "additionalProperties": { + "type": "string", + }, + "default": {}, + "title": "Mapping Query Str", + "type": "object", + }, + }, + { + "in": "query", + "name": "mapping_query_int", + "required": False, + "schema": { + "additionalProperties": { + "type": "integer", + }, + "default": {}, + "title": "Mapping Query Int", + "type": "object", + }, + }, + { + "in": "query", + "name": "query", + "required": True, + "schema": { + "title": "Query", + "type": "integer", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Mixed Mapping Mixed Type Query Params", + }, + }, + "/enum-status-code": { + "get": { + "responses": { + "201": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + }, + "summary": "Get Enum Status Code", + "operationId": "get_enum_status_code_enum_status_code_get", + } + }, + "/query/frozenset": { + "get": { + "summary": "Get Query Type Frozenset", + "operationId": "get_query_type_frozenset_query_frozenset_get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Query", + "uniqueItems": True, + "type": "array", + "items": {"type": "integer"}, + }, + "name": "query", + "in": "query", + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + } + }, + "/query/list": { + "get": { + "summary": "Get Query List", + "operationId": "get_query_list_query_list_get", + "parameters": [ + { + "name": "device_ids", + "in": "query", + "required": True, + "schema": { + "type": "array", + "items": {"type": "integer"}, + "title": "Device Ids", + }, + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": {"type": "integer"}, + "title": "Response Get Query List Query List Get", + } + } + }, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + } + }, + "/query/list-default": { + "get": { + "summary": "Get Query List Default", + "operationId": "get_query_list_default_query_list_default_get", + "parameters": [ + { + "name": "device_ids", + "in": "query", + "required": False, + "schema": { + "type": "array", + "items": {"type": "integer"}, + "default": [], + "title": "Device Ids", + }, + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": {"type": "integer"}, + "title": "Response Get Query List Default Query List Default Get", + } + } + }, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + } + }, + }, + "components": { + "schemas": { + "ValidationError": { + "title": "ValidationError", + "required": ["loc", "msg", "type"], + "type": "object", + "properties": { + "loc": { + "title": "Location", + "type": "array", + "items": { + "anyOf": [{"type": "string"}, {"type": "integer"}] + }, + }, + "msg": {"title": "Message", "type": "string"}, + "type": {"title": "Error Type", "type": "string"}, + }, + }, + "HTTPValidationError": { + "title": "HTTPValidationError", + "type": "object", + "properties": { + "detail": { + "title": "Detail", + "type": "array", + "items": { + "$ref": "#/components/schemas/ValidationError" + }, + } + }, + }, + } + }, + } From 19e5aba29c225f32655943f98953f3ca63706dc2 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 6 Nov 2025 22:16:26 +0000 Subject: [PATCH 63/91] =?UTF-8?q?=F0=9F=8E=A8=20[pre-commit.ci]=20Auto=20f?= =?UTF-8?q?ormat=20from=20pre-commit.com=20hooks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_application.py | 2670 ++++++++++++++++++------------------- 1 file changed, 1334 insertions(+), 1336 deletions(-) diff --git a/tests/test_application.py b/tests/test_application.py index ad77f6ff0..cd1713ae1 100644 --- a/tests/test_application.py +++ b/tests/test_application.py @@ -55,1474 +55,1472 @@ def test_enum_status_code_response(): def test_openapi_schema(): response = client.get("/openapi.json") assert response.status_code == 200, response.text - assert response.json()== { - "openapi": "3.1.0", - "info": {"title": "FastAPI", "version": "0.1.0"}, - "externalDocs": { - "description": "External API documentation.", - "url": "https://docs.example.com/api-general", + assert response.json() == { + "openapi": "3.1.0", + "info": {"title": "FastAPI", "version": "0.1.0"}, + "externalDocs": { + "description": "External API documentation.", + "url": "https://docs.example.com/api-general", + }, + "paths": { + "/api_route": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + } + }, + "summary": "Non Operation", + "operationId": "non_operation_api_route_get", + } }, - "paths": { - "/api_route": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - } + "/non_decorated_route": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + } + }, + "summary": "Non Decorated Route", + "operationId": "non_decorated_route_non_decorated_route_get", + } + }, + "/text": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + } + }, + "summary": "Get Text", + "operationId": "get_text_text_get", + } + }, + "/path/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, }, - "summary": "Non Operation", - "operationId": "non_operation_api_route_get", - } - }, - "/non_decorated_route": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - } - }, - "summary": "Non Decorated Route", - "operationId": "non_decorated_route_non_decorated_route_get", - } - }, - "/text": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - } - }, - "summary": "Get Text", - "operationId": "get_text_text_get", - } - }, - "/path/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" } - }, + } }, }, - "summary": "Get Id", - "operationId": "get_id_path__item_id__get", - "parameters": [ - { - "required": True, - "schema": {"title": "Item Id"}, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/str/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } + }, + "summary": "Get Id", + "operationId": "get_id_path__item_id__get", + "parameters": [ + { + "required": True, + "schema": {"title": "Item Id"}, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/str/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" } - }, + } }, }, - "summary": "Get Str Id", - "operationId": "get_str_id_path_str__item_id__get", - "parameters": [ - { - "required": True, - "schema": {"title": "Item Id", "type": "string"}, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/int/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } + }, + "summary": "Get Str Id", + "operationId": "get_str_id_path_str__item_id__get", + "parameters": [ + { + "required": True, + "schema": {"title": "Item Id", "type": "string"}, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/int/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" } - }, + } }, }, - "summary": "Get Int Id", - "operationId": "get_int_id_path_int__item_id__get", - "parameters": [ - { - "required": True, - "schema": {"title": "Item Id", "type": "integer"}, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/float/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } + }, + "summary": "Get Int Id", + "operationId": "get_int_id_path_int__item_id__get", + "parameters": [ + { + "required": True, + "schema": {"title": "Item Id", "type": "integer"}, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/float/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" } - }, + } }, }, - "summary": "Get Float Id", - "operationId": "get_float_id_path_float__item_id__get", - "parameters": [ - { - "required": True, - "schema": {"title": "Item Id", "type": "number"}, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/bool/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } + }, + "summary": "Get Float Id", + "operationId": "get_float_id_path_float__item_id__get", + "parameters": [ + { + "required": True, + "schema": {"title": "Item Id", "type": "number"}, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/bool/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" } - }, + } }, }, - "summary": "Get Bool Id", - "operationId": "get_bool_id_path_bool__item_id__get", - "parameters": [ - { - "required": True, - "schema": {"title": "Item Id", "type": "boolean"}, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } + }, + "summary": "Get Bool Id", + "operationId": "get_bool_id_path_bool__item_id__get", + "parameters": [ + { + "required": True, + "schema": {"title": "Item Id", "type": "boolean"}, + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" } - }, + } }, }, - "summary": "Get Path Param Id", - "operationId": "get_path_param_id_path_param__item_id__get", - "parameters": [ - { - "name": "item_id", - "in": "path", - "required": True, - "schema": IsDict( - { - "anyOf": [{"type": "string"}, {"type": "null"}], - "title": "Item Id", - } - ) - # TODO: remove when deprecating Pydantic v1 - | IsDict({"title": "Item Id", "type": "string"}), - } - ], - } - }, - "/path/param-minlength/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - "summary": "Get Path Param Min Length", - "operationId": "get_path_param_min_length_path_param_minlength__item_id__get", - "parameters": [ - { - "required": True, - "schema": { + }, + "summary": "Get Path Param Id", + "operationId": "get_path_param_id_path_param__item_id__get", + "parameters": [ + { + "name": "item_id", + "in": "path", + "required": True, + "schema": IsDict( + { + "anyOf": [{"type": "string"}, {"type": "null"}], "title": "Item Id", - "minLength": 3, - "type": "string", - }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-maxlength/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } + } + ) + # TODO: remove when deprecating Pydantic v1 + | IsDict({"title": "Item Id", "type": "string"}), + } + ], + } + }, + "/path/param-minlength/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" } - }, + } }, }, - "summary": "Get Path Param Max Length", - "operationId": "get_path_param_max_length_path_param_maxlength__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "maxLength": 3, - "type": "string", - }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-min_maxlength/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, + }, + "summary": "Get Path Param Min Length", + "operationId": "get_path_param_min_length_path_param_minlength__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "minLength": 3, + "type": "string", }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-maxlength/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" } - }, + } }, }, - "summary": "Get Path Param Min Max Length", - "operationId": "get_path_param_min_max_length_path_param_min_maxlength__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "maxLength": 3, - "minLength": 2, - "type": "string", - }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-gt/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, + }, + "summary": "Get Path Param Max Length", + "operationId": "get_path_param_max_length_path_param_maxlength__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "maxLength": 3, + "type": "string", }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-min_maxlength/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" } - }, + } }, }, - "summary": "Get Path Param Gt", - "operationId": "get_path_param_gt_path_param_gt__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "exclusiveMinimum": 3.0, - "type": "number", - }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-gt0/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, + }, + "summary": "Get Path Param Min Max Length", + "operationId": "get_path_param_min_max_length_path_param_min_maxlength__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "maxLength": 3, + "minLength": 2, + "type": "string", }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-gt/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" } - }, + } }, }, - "summary": "Get Path Param Gt0", - "operationId": "get_path_param_gt0_path_param_gt0__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "exclusiveMinimum": 0.0, - "type": "number", - }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-ge/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, + }, + "summary": "Get Path Param Gt", + "operationId": "get_path_param_gt_path_param_gt__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "exclusiveMinimum": 3.0, + "type": "number", }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-gt0/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" } - }, + } }, }, - "summary": "Get Path Param Ge", - "operationId": "get_path_param_ge_path_param_ge__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "minimum": 3.0, - "type": "number", - }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-lt/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, + }, + "summary": "Get Path Param Gt0", + "operationId": "get_path_param_gt0_path_param_gt0__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "exclusiveMinimum": 0.0, + "type": "number", }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-ge/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" } - }, + } }, }, - "summary": "Get Path Param Lt", - "operationId": "get_path_param_lt_path_param_lt__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "exclusiveMaximum": 3.0, - "type": "number", - }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-lt0/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, + }, + "summary": "Get Path Param Ge", + "operationId": "get_path_param_ge_path_param_ge__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "minimum": 3.0, + "type": "number", }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-lt/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" } - }, + } }, }, - "summary": "Get Path Param Lt0", - "operationId": "get_path_param_lt0_path_param_lt0__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "exclusiveMaximum": 0.0, - "type": "number", - }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-le/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, + }, + "summary": "Get Path Param Lt", + "operationId": "get_path_param_lt_path_param_lt__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "exclusiveMaximum": 3.0, + "type": "number", }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-lt0/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" } - }, + } }, }, - "summary": "Get Path Param Le", - "operationId": "get_path_param_le_path_param_le__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "maximum": 3.0, - "type": "number", - }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-lt-gt/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, + }, + "summary": "Get Path Param Lt0", + "operationId": "get_path_param_lt0_path_param_lt0__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "exclusiveMaximum": 0.0, + "type": "number", }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-le/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" } - }, + } }, }, - "summary": "Get Path Param Lt Gt", - "operationId": "get_path_param_lt_gt_path_param_lt_gt__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "exclusiveMaximum": 3.0, - "exclusiveMinimum": 1.0, - "type": "number", - }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-le-ge/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, + }, + "summary": "Get Path Param Le", + "operationId": "get_path_param_le_path_param_le__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "maximum": 3.0, + "type": "number", }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-lt-gt/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" } - }, + } }, }, - "summary": "Get Path Param Le Ge", - "operationId": "get_path_param_le_ge_path_param_le_ge__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "maximum": 3.0, - "minimum": 1.0, - "type": "number", - }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-lt-int/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, + }, + "summary": "Get Path Param Lt Gt", + "operationId": "get_path_param_lt_gt_path_param_lt_gt__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "exclusiveMaximum": 3.0, + "exclusiveMinimum": 1.0, + "type": "number", }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-le-ge/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" } - }, + } }, }, - "summary": "Get Path Param Lt Int", - "operationId": "get_path_param_lt_int_path_param_lt_int__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "exclusiveMaximum": 3.0, - "type": "integer", - }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-gt-int/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, + }, + "summary": "Get Path Param Le Ge", + "operationId": "get_path_param_le_ge_path_param_le_ge__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "maximum": 3.0, + "minimum": 1.0, + "type": "number", }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-lt-int/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" } - }, + } }, }, - "summary": "Get Path Param Gt Int", - "operationId": "get_path_param_gt_int_path_param_gt_int__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "exclusiveMinimum": 3.0, - "type": "integer", - }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-le-int/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, + }, + "summary": "Get Path Param Lt Int", + "operationId": "get_path_param_lt_int_path_param_lt_int__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "exclusiveMaximum": 3.0, + "type": "integer", }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-gt-int/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" } - }, + } }, }, - "summary": "Get Path Param Le Int", - "operationId": "get_path_param_le_int_path_param_le_int__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "maximum": 3.0, - "type": "integer", - }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-ge-int/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, + }, + "summary": "Get Path Param Gt Int", + "operationId": "get_path_param_gt_int_path_param_gt_int__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "exclusiveMinimum": 3.0, + "type": "integer", }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-le-int/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" } - }, + } }, }, - "summary": "Get Path Param Ge Int", - "operationId": "get_path_param_ge_int_path_param_ge_int__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "minimum": 3.0, - "type": "integer", - }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-lt-gt-int/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, + }, + "summary": "Get Path Param Le Int", + "operationId": "get_path_param_le_int_path_param_le_int__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "maximum": 3.0, + "type": "integer", }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-ge-int/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" } - }, + } }, }, - "summary": "Get Path Param Lt Gt Int", - "operationId": "get_path_param_lt_gt_int_path_param_lt_gt_int__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "exclusiveMaximum": 3.0, - "exclusiveMinimum": 1.0, - "type": "integer", - }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/path/param-le-ge-int/{item_id}": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, + }, + "summary": "Get Path Param Ge Int", + "operationId": "get_path_param_ge_int_path_param_ge_int__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "minimum": 3.0, + "type": "integer", }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-lt-gt-int/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" } - }, + } }, }, - "summary": "Get Path Param Le Ge Int", - "operationId": "get_path_param_le_ge_int_path_param_le_ge_int__item_id__get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Item Id", - "maximum": 3.0, - "minimum": 1.0, - "type": "integer", - }, - "name": "item_id", - "in": "path", - } - ], - } - }, - "/query": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, + }, + "summary": "Get Path Param Lt Gt Int", + "operationId": "get_path_param_lt_gt_int_path_param_lt_gt_int__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "exclusiveMaximum": 3.0, + "exclusiveMinimum": 1.0, + "type": "integer", }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } + "name": "item_id", + "in": "path", + } + ], + } + }, + "/path/param-le-ge-int/{item_id}": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" } - }, + } }, }, - "summary": "Get Query", - "operationId": "get_query_query_get", - "parameters": [ - { - "required": True, - "schema": {"title": "Query"}, - "name": "query", - "in": "query", - } - ], - } - }, - "/query/optional": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, + }, + "summary": "Get Path Param Le Ge Int", + "operationId": "get_path_param_le_ge_int_path_param_le_ge_int__item_id__get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Item Id", + "maximum": 3.0, + "minimum": 1.0, + "type": "integer", }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } + "name": "item_id", + "in": "path", + } + ], + } + }, + "/query": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" } - }, + } }, }, - "summary": "Get Query Optional", - "operationId": "get_query_optional_query_optional_get", - "parameters": [ - { - "required": False, - "schema": {"title": "Query"}, - "name": "query", - "in": "query", - } - ], - } - }, - "/query/int": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } + }, + "summary": "Get Query", + "operationId": "get_query_query_get", + "parameters": [ + { + "required": True, + "schema": {"title": "Query"}, + "name": "query", + "in": "query", + } + ], + } + }, + "/query/optional": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" } - }, + } }, }, - "summary": "Get Query Type", - "operationId": "get_query_type_query_int_get", - "parameters": [ - { - "required": True, - "schema": {"title": "Query", "type": "integer"}, - "name": "query", - "in": "query", - } - ], - } - }, - "/query/int/optional": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } + }, + "summary": "Get Query Optional", + "operationId": "get_query_optional_query_optional_get", + "parameters": [ + { + "required": False, + "schema": {"title": "Query"}, + "name": "query", + "in": "query", + } + ], + } + }, + "/query/int": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" } - }, + } }, }, - "summary": "Get Query Type Optional", - "operationId": "get_query_type_optional_query_int_optional_get", - "parameters": [ - { - "name": "query", - "in": "query", - "required": False, - "schema": IsDict( - { - "anyOf": [ - {"type": "integer"}, - {"type": "null"}, - ], - "title": "Query", + }, + "summary": "Get Query Type", + "operationId": "get_query_type_query_int_get", + "parameters": [ + { + "required": True, + "schema": {"title": "Query", "type": "integer"}, + "name": "query", + "in": "query", + } + ], + } + }, + "/query/int/optional": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" } - ) - # TODO: remove when deprecating Pydantic v1 - | IsDict({"title": "Query", "type": "integer"}), - } - ], - } - }, - "/query/int/default": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, + } }, }, - "summary": "Get Query Type Int Default", - "operationId": "get_query_type_int_default_query_int_default_get", - "parameters": [ - { - "required": False, - "schema": { + }, + "summary": "Get Query Type Optional", + "operationId": "get_query_type_optional_query_int_optional_get", + "parameters": [ + { + "name": "query", + "in": "query", + "required": False, + "schema": IsDict( + { + "anyOf": [ + {"type": "integer"}, + {"type": "null"}, + ], "title": "Query", - "type": "integer", - "default": 10, - }, - "name": "query", - "in": "query", - } - ], - } - }, - "/query/param": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } + } + ) + # TODO: remove when deprecating Pydantic v1 + | IsDict({"title": "Query", "type": "integer"}), + } + ], + } + }, + "/query/int/default": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" } - }, + } }, }, - "summary": "Get Query Param", - "operationId": "get_query_param_query_param_get", - "parameters": [ - { - "required": False, - "schema": {"title": "Query"}, - "name": "query", - "in": "query", - } - ], - } - }, - "/query/param-required": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - "summary": "Get Query Param Required", - "operationId": "get_query_param_required_query_param_required_get", - "parameters": [ - { - "required": True, - "schema": {"title": "Query"}, - "name": "query", - "in": "query", - } - ], - } - }, - "/query/param-required/int": { - "get": { - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - "summary": "Get Query Param Required Type", - "operationId": "get_query_param_required_type_query_param_required_int_get", - "parameters": [ - { - "required": True, - "schema": {"title": "Query", "type": "integer"}, - "name": "query", - "in": "query", - } - ], - } - }, - "/query/mapping-params": { - "get": { - "operationId": "get_mapping_query_params_query_mapping_params_get", - "parameters": [ - { - "in": "query", - "name": "queries", - "required": False, - "schema": { - "additionalProperties": { - "type": "string", - }, - "default": {}, - "title": "Queries", - "type": "object", - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", - }, - }, - "summary": "Get Mapping Query Params", }, - }, - "/query/mapping-sequence-params": { - "get": { - "operationId": "get_sequence_mapping_query_params_query_mapping_sequence_params_get", - "parameters": [ - { - "in": "query", - "name": "queries", - "required": False, - "schema": { - "additionalProperties": { - "items": { - "type": "integer", - }, - "type": "array", - }, - "default": {}, - "title": "Queries", - "type": "object", - }, + "summary": "Get Query Type Int Default", + "operationId": "get_query_type_int_default_query_int_default_get", + "parameters": [ + { + "required": False, + "schema": { + "title": "Query", + "type": "integer", + "default": 10, }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", + "name": "query", + "in": "query", + } + ], + } + }, + "/query/param": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } }, }, - "summary": "Get Sequence Mapping Query Params", }, - }, - "/query/mixed-params": { - "get": { - "operationId": "get_mixed_mapping_query_params_query_mixed_params_get", - "parameters": [ - { - "in": "query", - "name": "sequence_mapping_queries", - "required": False, - "schema": { - "additionalProperties": { - "items": { - "anyOf": [ - { - "type": "string", - }, - { - "type": "integer", - }, - ], - }, - "type": "array", - }, - "default": {}, - "title": "Sequence Mapping Queries", - "type": "object", - }, + "summary": "Get Query Param", + "operationId": "get_query_param_query_param_get", + "parameters": [ + { + "required": False, + "schema": {"title": "Query"}, + "name": "query", + "in": "query", + } + ], + } + }, + "/query/param-required": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } }, - { - "in": "query", - "name": "mapping_query", - "required": True, - "schema": { - "additionalProperties": { - "type": "string", - }, - "title": "Mapping Query", - "type": "object", - }, + }, + }, + "summary": "Get Query Param Required", + "operationId": "get_query_param_required_query_param_required_get", + "parameters": [ + { + "required": True, + "schema": {"title": "Query"}, + "name": "query", + "in": "query", + } + ], + } + }, + "/query/param-required/int": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } }, - { - "in": "query", - "name": "query", - "required": True, - "schema": { - "title": "Query", + }, + }, + "summary": "Get Query Param Required Type", + "operationId": "get_query_param_required_type_query_param_required_int_get", + "parameters": [ + { + "required": True, + "schema": {"title": "Query", "type": "integer"}, + "name": "query", + "in": "query", + } + ], + } + }, + "/query/mapping-params": { + "get": { + "operationId": "get_mapping_query_params_query_mapping_params_get", + "parameters": [ + { + "in": "query", + "name": "queries", + "required": False, + "schema": { + "additionalProperties": { "type": "string", }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", + "default": {}, + "title": "Queries", + "type": "object", }, }, - "summary": "Get Mixed Mapping Query Params", + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, }, + "summary": "Get Mapping Query Params", }, - "/query/mixed-type-params": { - "get": { - "operationId": "get_mixed_mapping_mixed_type_query_params_query_mixed_type_params_get", - "parameters": [ - { - "in": "query", - "name": "sequence_mapping_queries", - "required": False, - "schema": { - "additionalProperties": { - "items": { - "type": "integer", - }, - "type": "array", - }, - "default": {}, - "title": "Sequence Mapping Queries", - "type": "object", - }, - }, - { - "in": "query", - "name": "mapping_query_str", - "required": False, - "schema": { - "additionalProperties": { - "type": "string", - }, - "default": {}, - "title": "Mapping Query Str", - "type": "object", - }, - }, - { - "in": "query", - "name": "mapping_query_int", - "required": False, - "schema": { - "additionalProperties": { + }, + "/query/mapping-sequence-params": { + "get": { + "operationId": "get_sequence_mapping_query_params_query_mapping_sequence_params_get", + "parameters": [ + { + "in": "query", + "name": "queries", + "required": False, + "schema": { + "additionalProperties": { + "items": { "type": "integer", }, - "default": {}, - "title": "Mapping Query Int", - "type": "object", + "type": "array", }, - }, - { - "in": "query", - "name": "query", - "required": True, - "schema": { - "title": "Query", - "type": "integer", - }, - }, - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {}, - }, - }, - "description": "Successful Response", - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError", - }, - }, - }, - "description": "Validation Error", + "default": {}, + "title": "Queries", + "type": "object", }, }, - "summary": "Get Mixed Mapping Mixed Type Query Params", + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, }, - }, - "/enum-status-code": { - "get": { - "responses": { - "201": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - }, - "summary": "Get Enum Status Code", - "operationId": "get_enum_status_code_enum_status_code_get", - } - }, - "/query/frozenset": { - "get": { - "summary": "Get Query Type Frozenset", - "operationId": "get_query_type_frozenset_query_frozenset_get", - "parameters": [ - { - "required": True, - "schema": { - "title": "Query", - "uniqueItems": True, - "type": "array", - "items": {"type": "integer"}, - }, - "name": "query", - "in": "query", - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": {"application/json": {"schema": {}}}, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - } - }, - "/query/list": { - "get": { - "summary": "Get Query List", - "operationId": "get_query_list_query_list_get", - "parameters": [ - { - "name": "device_ids", - "in": "query", - "required": True, - "schema": { - "type": "array", - "items": {"type": "integer"}, - "title": "Device Ids", - }, - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": {"type": "integer"}, - "title": "Response Get Query List Query List Get", - } - } - }, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - } - }, - "/query/list-default": { - "get": { - "summary": "Get Query List Default", - "operationId": "get_query_list_default_query_list_default_get", - "parameters": [ - { - "name": "device_ids", - "in": "query", - "required": False, - "schema": { - "type": "array", - "items": {"type": "integer"}, - "default": [], - "title": "Device Ids", - }, - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": {"type": "integer"}, - "title": "Response Get Query List Default Query List Default Get", - } - } - }, - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - }, - }, - }, - } + "summary": "Get Sequence Mapping Query Params", }, }, - "components": { - "schemas": { - "ValidationError": { - "title": "ValidationError", - "required": ["loc", "msg", "type"], - "type": "object", - "properties": { - "loc": { - "title": "Location", - "type": "array", - "items": { - "anyOf": [{"type": "string"}, {"type": "integer"}] + "/query/mixed-params": { + "get": { + "operationId": "get_mixed_mapping_query_params_query_mixed_params_get", + "parameters": [ + { + "in": "query", + "name": "sequence_mapping_queries", + "required": False, + "schema": { + "additionalProperties": { + "items": { + "anyOf": [ + { + "type": "string", + }, + { + "type": "integer", + }, + ], + }, + "type": "array", + }, + "default": {}, + "title": "Sequence Mapping Queries", + "type": "object", + }, + }, + { + "in": "query", + "name": "mapping_query", + "required": True, + "schema": { + "additionalProperties": { + "type": "string", + }, + "title": "Mapping Query", + "type": "object", + }, + }, + { + "in": "query", + "name": "query", + "required": True, + "schema": { + "title": "Query", + "type": "string", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, }, }, - "msg": {"title": "Message", "type": "string"}, - "type": {"title": "Error Type", "type": "string"}, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", }, }, - "HTTPValidationError": { - "title": "HTTPValidationError", - "type": "object", - "properties": { - "detail": { - "title": "Detail", - "type": "array", - "items": { - "$ref": "#/components/schemas/ValidationError" + "summary": "Get Mixed Mapping Query Params", + }, + }, + "/query/mixed-type-params": { + "get": { + "operationId": "get_mixed_mapping_mixed_type_query_params_query_mixed_type_params_get", + "parameters": [ + { + "in": "query", + "name": "sequence_mapping_queries", + "required": False, + "schema": { + "additionalProperties": { + "items": { + "type": "integer", + }, + "type": "array", }, - } + "default": {}, + "title": "Sequence Mapping Queries", + "type": "object", + }, + }, + { + "in": "query", + "name": "mapping_query_str", + "required": False, + "schema": { + "additionalProperties": { + "type": "string", + }, + "default": {}, + "title": "Mapping Query Str", + "type": "object", + }, + }, + { + "in": "query", + "name": "mapping_query_int", + "required": False, + "schema": { + "additionalProperties": { + "type": "integer", + }, + "default": {}, + "title": "Mapping Query Int", + "type": "object", + }, + }, + { + "in": "query", + "name": "query", + "required": True, + "schema": { + "title": "Query", + "type": "integer", + }, + }, + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {}, + }, + }, + "description": "Successful Response", + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError", + }, + }, + }, + "description": "Validation Error", + }, + }, + "summary": "Get Mixed Mapping Mixed Type Query Params", + }, + }, + "/enum-status-code": { + "get": { + "responses": { + "201": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + }, + "summary": "Get Enum Status Code", + "operationId": "get_enum_status_code_enum_status_code_get", + } + }, + "/query/frozenset": { + "get": { + "summary": "Get Query Type Frozenset", + "operationId": "get_query_type_frozenset_query_frozenset_get", + "parameters": [ + { + "required": True, + "schema": { + "title": "Query", + "uniqueItems": True, + "type": "array", + "items": {"type": "integer"}, + }, + "name": "query", + "in": "query", + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, }, }, } }, - } + "/query/list": { + "get": { + "summary": "Get Query List", + "operationId": "get_query_list_query_list_get", + "parameters": [ + { + "name": "device_ids", + "in": "query", + "required": True, + "schema": { + "type": "array", + "items": {"type": "integer"}, + "title": "Device Ids", + }, + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": {"type": "integer"}, + "title": "Response Get Query List Query List Get", + } + } + }, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + } + }, + "/query/list-default": { + "get": { + "summary": "Get Query List Default", + "operationId": "get_query_list_default_query_list_default_get", + "parameters": [ + { + "name": "device_ids", + "in": "query", + "required": False, + "schema": { + "type": "array", + "items": {"type": "integer"}, + "default": [], + "title": "Device Ids", + }, + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": {"type": "integer"}, + "title": "Response Get Query List Default Query List Default Get", + } + } + }, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + } + }, + }, + "components": { + "schemas": { + "ValidationError": { + "title": "ValidationError", + "required": ["loc", "msg", "type"], + "type": "object", + "properties": { + "loc": { + "title": "Location", + "type": "array", + "items": { + "anyOf": [{"type": "string"}, {"type": "integer"}] + }, + }, + "msg": {"title": "Message", "type": "string"}, + "type": {"title": "Error Type", "type": "string"}, + }, + }, + "HTTPValidationError": { + "title": "HTTPValidationError", + "type": "object", + "properties": { + "detail": { + "title": "Detail", + "type": "array", + "items": {"$ref": "#/components/schemas/ValidationError"}, + } + }, + }, + } + }, + } From 36a781f5df963498a128510e5142312e0147e0ce Mon Sep 17 00:00:00 2001 From: JONEMI21 Date: Thu, 6 Nov 2025 22:18:30 +0000 Subject: [PATCH 64/91] rv --- tests/test_application.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tests/test_application.py b/tests/test_application.py index cd1713ae1..2a497218b 100644 --- a/tests/test_application.py +++ b/tests/test_application.py @@ -986,10 +986,7 @@ def test_openapi_schema(): "required": False, "schema": IsDict( { - "anyOf": [ - {"type": "integer"}, - {"type": "null"}, - ], + "anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Query", } ) From d6f0189bd0688cfde98de08358afed95497ecff2 Mon Sep 17 00:00:00 2001 From: JONEMI21 Date: Thu, 6 Nov 2025 22:20:11 +0000 Subject: [PATCH 65/91] fixed --- docs/en/docs/tutorial/query-params.md | 28 --------------------------- 1 file changed, 28 deletions(-) diff --git a/docs/en/docs/tutorial/query-params.md b/docs/en/docs/tutorial/query-params.md index f835334e6..05edbec30 100644 --- a/docs/en/docs/tutorial/query-params.md +++ b/docs/en/docs/tutorial/query-params.md @@ -200,31 +200,3 @@ Sometimes you want to receive some query parameters, but you don't know in advan And when you open your browser at http://127.0.0.1:8000/docs, you will that OpenAPI supports this format of query parameter: - -However, since the query parameters are declared in the request as - -``` -http://127.0.0.1:8000/query/mixed-type-params?query=1&foo=bar&foo=baz -``` - -**FastAPI** greedily adds all the query parameters to every `Query` argument for which it is valid. The above request will be parsed as: - -```Python -{ - "query": 1, - "string_mapping": { - "query": "1", - "foo": "baz" - }, - "mapping_query_int": { - "query": 1 - }, - "sequence_mapping_queries": { - "query": [ - "1" - ], - "foo": [] - } -} -``` -As you can see the `query` parameter is added to every `Query` argument for which it is valid. This is because **FastAPI** does not know which `Query` argument you want to add the `query` parameter to, and `1` validates as both an `int` and a `str`. `List[str]`. `foo` is only added to the `string_mapping` and `sequence_mapping_queries` arguments because it is not a valid `int`. From be8d772a1a1858b95a809ff11e22a54fffeb5b70 Mon Sep 17 00:00:00 2001 From: JONEMI21 Date: Thu, 6 Nov 2025 22:26:33 +0000 Subject: [PATCH 66/91] update query param --- .../img/tutorial/query-params/image01.png | Bin 358703 -> 235789 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/en/docs/img/tutorial/query-params/image01.png b/docs/en/docs/img/tutorial/query-params/image01.png index 6222a9aef3177938f5a5f3a20bc4af36113622f5..8fa5f85b703bd0d49f3bccb13245b3c8d353a837 100644 GIT binary patch literal 235789 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 Q5Ag5&FIs0ZPg~sjf24UV=l}o! literal 358703 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 From 78cffc8ad7f664e03087d0dfd82dfa078cfd40cd Mon Sep 17 00:00:00 2001 From: JONEMI21 Date: Thu, 6 Nov 2025 22:33:37 +0000 Subject: [PATCH 67/91] rm unused --- fastapi/dependencies/utils.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index a6ade4f59..5fb603e6a 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -766,10 +766,6 @@ def _get_multidict_value( return value -class Marker: - pass - - def request_params_to_args( fields: Sequence[ModelField], received_params: Union[Mapping[str, Any], QueryParams, Headers], From 61b683e5624302d34bee919e8dc1b09cfe465223 Mon Sep 17 00:00:00 2001 From: JONEMI21 Date: Fri, 7 Nov 2025 09:28:03 +0000 Subject: [PATCH 68/91] fix for pydantic v1 --- fastapi/_compat/v1.py | 14 ++++++-------- fastapi/dependencies/utils.py | 9 ++++++++- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/fastapi/_compat/v1.py b/fastapi/_compat/v1.py index 0efc250c1..1d5c83fa7 100644 --- a/fastapi/_compat/v1.py +++ b/fastapi/_compat/v1.py @@ -6,7 +6,6 @@ from typing import ( Callable, Dict, List, - Mapping, Sequence, Set, Tuple, @@ -36,9 +35,9 @@ if not PYDANTIC_V2: from pydantic.error_wrappers import ErrorWrapper as ErrorWrapper from pydantic.errors import MissingError from pydantic.fields import ( # type: ignore[attr-defined] + MAPPING_LIKE_SHAPES, SHAPE_FROZENSET, SHAPE_LIST, - SHAPE_MAPPING, SHAPE_SEQUENCE, SHAPE_SET, SHAPE_SINGLETON, @@ -84,9 +83,9 @@ else: from pydantic.v1.error_wrappers import ErrorWrapper as ErrorWrapper from pydantic.v1.errors import MissingError from pydantic.v1.fields import ( + MAPPING_LIKE_SHAPES, SHAPE_FROZENSET, SHAPE_LIST, - SHAPE_MAPPING, SHAPE_SEQUENCE, SHAPE_SET, SHAPE_SINGLETON, @@ -147,10 +146,7 @@ sequence_shape_to_type = { SHAPE_TUPLE_ELLIPSIS: list, } -mapping_shapes = { - SHAPE_MAPPING, -} -mapping_shapes_to_type = {SHAPE_MAPPING: Mapping} +mapping_shapes = MAPPING_LIKE_SHAPES @dataclass @@ -233,7 +229,9 @@ def is_pv1_scalar_sequence_mapping_field(field: ModelField) -> bool: ): if field.sub_fields is not None: for sub_field in field.sub_fields: - if not is_scalar_sequence_field(sub_field): + if not ( + is_scalar_sequence_field(sub_field) or is_scalar_field(sub_field) + ): return False return True return False diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index 5fb603e6a..1aa78c4e2 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -701,6 +701,13 @@ async def solve_dependencies( ) +def _extract_error_locs(errors_): + if isinstance(errors_, list): + errors_ = may_v1._regenerate_error_with_loc(errors=errors_, loc_prefix=()) + + return {err["loc"][2] for err in errors_ if len(err["loc"]) >= 3} + + def _validate_value_with_model_field( *, field: ModelField, value: Any, values: Dict[str, Any], loc: Tuple[str, ...] ) -> Tuple[Any, List[Any]]: @@ -717,7 +724,7 @@ def _validate_value_with_model_field( and (is_scalar_sequence_mapping_field(field) or is_scalar_mapping_field(field)) ): # Remove failing keys from the dict and try to re-validate - invalid_keys = {err["loc"][2] for err in errors_ if len(err["loc"]) >= 3} + invalid_keys = _extract_error_locs(errors_) v_, errors_ = field.validate( {k: v for k, v in value.items() if k not in invalid_keys}, values, From 9b4e4df2d872784e859a0c902fb19d05b5f2cfaf Mon Sep 17 00:00:00 2001 From: JONEMI21 Date: Fri, 7 Nov 2025 09:32:52 +0000 Subject: [PATCH 69/91] add typing --- fastapi/dependencies/utils.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index 1aa78c4e2..cb4b7043a 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -12,6 +12,7 @@ from typing import ( Mapping, Optional, Sequence, + Set, Tuple, Type, Union, @@ -701,7 +702,7 @@ async def solve_dependencies( ) -def _extract_error_locs(errors_): +def _extract_error_locs(errors_: Sequence[Any] | List[Dict[str, Any]]) -> Set[str]: if isinstance(errors_, list): errors_ = may_v1._regenerate_error_with_loc(errors=errors_, loc_prefix=()) From 103d46921b965f51b03194d3453f7d7b1c649a20 Mon Sep 17 00:00:00 2001 From: JONEMI21 Date: Fri, 7 Nov 2025 09:34:44 +0000 Subject: [PATCH 70/91] simplify typing --- fastapi/dependencies/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index cb4b7043a..0764f8a93 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -702,7 +702,7 @@ async def solve_dependencies( ) -def _extract_error_locs(errors_: Sequence[Any] | List[Dict[str, Any]]) -> Set[str]: +def _extract_error_locs(errors_: Sequence[Any]) -> Set[str]: if isinstance(errors_, list): errors_ = may_v1._regenerate_error_with_loc(errors=errors_, loc_prefix=()) From c9bfba04dd161b2fe4c7cd424fc2f6c8afc04118 Mon Sep 17 00:00:00 2001 From: JONEMI21 Date: Fri, 7 Nov 2025 13:56:50 +0000 Subject: [PATCH 71/91] use wrap validator to remove failing values --- docs_src/query_params/tutorial007_py310.py | 16 +++--- fastapi/_compat/shared.py | 5 +- fastapi/dependencies/utils.py | 51 +++++++++++-------- .../test_tutorial007_py310.py | 20 ++++++-- 4 files changed, 59 insertions(+), 33 deletions(-) diff --git a/docs_src/query_params/tutorial007_py310.py b/docs_src/query_params/tutorial007_py310.py index 4ce0017d2..a88600d5d 100644 --- a/docs_src/query_params/tutorial007_py310.py +++ b/docs_src/query_params/tutorial007_py310.py @@ -1,4 +1,4 @@ -from typing import Dict, List +from typing import Annotated, Dict, List, Union from fastapi import FastAPI, Query @@ -7,14 +7,16 @@ app = FastAPI() @app.get("/query/mixed-type-params") def get_mixed_mapping_mixed_type_query_params( - query: int = Query(), - mapping_query_str: Dict[str, str] = Query({}), - mapping_query_int: Dict[str, int] = Query({}), - sequence_mapping_queries: Dict[str, List[int]] = Query({}), + query: Annotated[int, Query()] = None, + mapping_query_str_or_int: Annotated[ + Union[Dict[str, str], Dict[str, int]], Query() + ] = None, + mapping_query_int: Annotated[Dict[str, int], Query()] = None, + sequence_mapping_int: Annotated[Dict[str, List[int]], Query()] = None, ): return { "query": query, - "string_mapping": mapping_query_str, + "mapping_query_str_or_int": mapping_query_str_or_int, "mapping_query_int": mapping_query_int, - "sequence_mapping_queries": sequence_mapping_queries, + "sequence_mapping_int": sequence_mapping_int, } diff --git a/fastapi/_compat/shared.py b/fastapi/_compat/shared.py index 95730b839..84b72adf4 100644 --- a/fastapi/_compat/shared.py +++ b/fastapi/_compat/shared.py @@ -173,7 +173,10 @@ def field_annotation_is_scalar_sequence_mapping( if field_annotation_is_scalar_sequence_mapping(arg): at_least_one_scalar_mapping = True continue - elif not field_annotation_is_scalar(arg): + elif not ( + field_annotation_is_scalar_sequence_mapping(arg) + or field_annotation_is_scalar_mapping(arg) + ): return False return at_least_one_scalar_mapping return lenient_issubclass(origin, Mapping) and all( diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index 0764f8a93..e8e3466a8 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -12,7 +12,6 @@ from typing import ( Mapping, Optional, Sequence, - Set, Tuple, Type, Union, @@ -64,7 +63,7 @@ from fastapi.security.oauth2 import OAuth2, SecurityScopes from fastapi.security.open_id_connect_url import OpenIdConnect from fastapi.types import DependencyCacheKey from fastapi.utils import create_model_field, get_path_param_names -from pydantic import BaseModel +from pydantic import BaseModel, ValidationError, WrapValidator from pydantic.fields import FieldInfo from starlette.background import BackgroundTasks as StarletteBackgroundTasks from starlette.concurrency import run_in_threadpool @@ -330,6 +329,25 @@ def add_non_field_param_to_dependency( return True return None +def remove_invalid(v: Any, handler: Callable[[Any], Any]) -> Any: + try: + return handler(v) + except ValidationError as exc: + if not isinstance(v, dict): + raise exc + # remove invalid values from invalid keys and revalidate + errors = may_v1._regenerate_error_with_loc(errors=[exc.errors()], loc_prefix=()) + for err in errors: + loc = err.get("loc", ()) + if len(loc) == 1: + v.pop(loc[0], None) + elif len(loc) == 2 and isinstance(v.get(loc[0]), list): + try: + v[loc[0]].pop(int(loc[1])) + except (ValueError, IndexError): + pass + return handler(v) + @dataclass class ParamDetails: @@ -497,7 +515,16 @@ def analyze_param( alias = param_name.replace("_", "-") else: alias = field_info.alias or param_name + field_info.alias = alias + + if is_scalar_sequence_field(field) or is_scalar_sequence_mapping_field(field): + # Wrap the validator to remove invalid values from scalar sequence + # and scalar sequence mapping fields instead of failing the whole validation + field_info.metadata = getattr(field_info, "metadata", []) + [ + WrapValidator(remove_invalid) + ] + field = create_model_field( name=param_name, type_=use_annotation_from_field_info, @@ -702,13 +729,6 @@ async def solve_dependencies( ) -def _extract_error_locs(errors_: Sequence[Any]) -> Set[str]: - if isinstance(errors_, list): - errors_ = may_v1._regenerate_error_with_loc(errors=errors_, loc_prefix=()) - - return {err["loc"][2] for err in errors_ if len(err["loc"]) >= 3} - - def _validate_value_with_model_field( *, field: ModelField, value: Any, values: Dict[str, Any], loc: Tuple[str, ...] ) -> Tuple[Any, List[Any]]: @@ -718,19 +738,6 @@ def _validate_value_with_model_field( else: return deepcopy(field.default), [] v_, errors_ = field.validate(value, values, loc=loc) - if ( - errors_ - and isinstance(field.field_info, params.Query) - and isinstance(value, Mapping) - and (is_scalar_sequence_mapping_field(field) or is_scalar_mapping_field(field)) - ): - # Remove failing keys from the dict and try to re-validate - invalid_keys = _extract_error_locs(errors_) - v_, errors_ = field.validate( - {k: v for k, v in value.items() if k not in invalid_keys}, - values, - loc=loc, - ) if _is_error_wrapper(errors_): # type: ignore[arg-type] return None, [errors_] diff --git a/tests/test_tutorial/test_query_params/test_tutorial007_py310.py b/tests/test_tutorial/test_query_params/test_tutorial007_py310.py index b275dacd8..235992399 100644 --- a/tests/test_tutorial/test_query_params/test_tutorial007_py310.py +++ b/tests/test_tutorial/test_query_params/test_tutorial007_py310.py @@ -15,7 +15,21 @@ def test_foo_needy_very(client: TestClient): assert response.status_code == 200 assert response.json() == { "query": 2, - "string_mapping": {"foo": "baz"}, - "mapping_query_int": {}, - "sequence_mapping_queries": {}, + "mapping_query_str_or_int": {"foo": "baz"}, + "mapping_query_int": None, + "sequence_mapping_int": None, } + + +def test_just_string_not_scalar_mapping(client: TestClient): + response = client.get( + "/query/mixed-type-params?&query=2&foo=1&bar=3&foo=2&foo=baz" + ) + assert response.status_code == 200 + assert response.json() == { + "query": 2, + "mapping_query_str_or_int": {"bar": "3", "foo": "baz"}, + "mapping_query_int": {"bar": 3}, + "sequence_mapping_int": {"bar": [3], "foo": [1, 2]}, + } + From 147ca631076f0443bc26344721fafabdb6d1dca4 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 7 Nov 2025 13:57:10 +0000 Subject: [PATCH 72/91] =?UTF-8?q?=F0=9F=8E=A8=20[pre-commit.ci]=20Auto=20f?= =?UTF-8?q?ormat=20from=20pre-commit.com=20hooks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fastapi/dependencies/utils.py | 1 + .../test_query_params/test_tutorial007_py310.py | 5 +---- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index e8e3466a8..5bf6bcb96 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -329,6 +329,7 @@ def add_non_field_param_to_dependency( return True return None + def remove_invalid(v: Any, handler: Callable[[Any], Any]) -> Any: try: return handler(v) diff --git a/tests/test_tutorial/test_query_params/test_tutorial007_py310.py b/tests/test_tutorial/test_query_params/test_tutorial007_py310.py index 235992399..8b5c075e2 100644 --- a/tests/test_tutorial/test_query_params/test_tutorial007_py310.py +++ b/tests/test_tutorial/test_query_params/test_tutorial007_py310.py @@ -22,9 +22,7 @@ def test_foo_needy_very(client: TestClient): def test_just_string_not_scalar_mapping(client: TestClient): - response = client.get( - "/query/mixed-type-params?&query=2&foo=1&bar=3&foo=2&foo=baz" - ) + response = client.get("/query/mixed-type-params?&query=2&foo=1&bar=3&foo=2&foo=baz") assert response.status_code == 200 assert response.json() == { "query": 2, @@ -32,4 +30,3 @@ def test_just_string_not_scalar_mapping(client: TestClient): "mapping_query_int": {"bar": 3}, "sequence_mapping_int": {"bar": [3], "foo": [1, 2]}, } - From 687dd65c310f8e9282707a4d6cd63645903555fb Mon Sep 17 00:00:00 2001 From: JONEMI21 Date: Fri, 7 Nov 2025 14:25:13 +0000 Subject: [PATCH 73/91] align tests with intended functionality --- fastapi/dependencies/utils.py | 31 ++++++++++++++----- .../test_tutorial007_py310.py | 4 +-- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index 5bf6bcb96..4e0ecbc52 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -344,9 +344,16 @@ def remove_invalid(v: Any, handler: Callable[[Any], Any]) -> Any: v.pop(loc[0], None) elif len(loc) == 2 and isinstance(v.get(loc[0]), list): try: - v[loc[0]].pop(int(loc[1])) + v[loc[0]][loc[1]] = None except (ValueError, IndexError): pass + # remove the None values from lists + for key in list(v.keys()): + if isinstance(v[key], list): + v[key] = [item for item in v[key] if item is not None] + # remove empty lists + if v[key] == []: + v.pop(key) return handler(v) @@ -519,13 +526,6 @@ def analyze_param( field_info.alias = alias - if is_scalar_sequence_field(field) or is_scalar_sequence_mapping_field(field): - # Wrap the validator to remove invalid values from scalar sequence - # and scalar sequence mapping fields instead of failing the whole validation - field_info.metadata = getattr(field_info, "metadata", []) + [ - WrapValidator(remove_invalid) - ] - field = create_model_field( name=param_name, type_=use_annotation_from_field_info, @@ -550,6 +550,21 @@ def analyze_param( and getattr(field, "shape", 1) == 1 ) ) + if is_scalar_sequence_field(field) or is_scalar_sequence_mapping_field( + field + ): + field_info.metadata = getattr(field_info, "metadata", []) + [ + WrapValidator(remove_invalid) + ] + field = create_model_field( + name=param_name, + type_=use_annotation_from_field_info, + default=field_info.default, + alias=alias, + required=field_info.default + in (RequiredParam, may_v1.RequiredParam, Undefined), + field_info=field_info, + ) return ParamDetails(type_annotation=type_annotation, depends=depends, field=field) diff --git a/tests/test_tutorial/test_query_params/test_tutorial007_py310.py b/tests/test_tutorial/test_query_params/test_tutorial007_py310.py index 8b5c075e2..dd9a9f850 100644 --- a/tests/test_tutorial/test_query_params/test_tutorial007_py310.py +++ b/tests/test_tutorial/test_query_params/test_tutorial007_py310.py @@ -16,8 +16,8 @@ def test_foo_needy_very(client: TestClient): assert response.json() == { "query": 2, "mapping_query_str_or_int": {"foo": "baz"}, - "mapping_query_int": None, - "sequence_mapping_int": None, + "mapping_query_int": {}, + "sequence_mapping_int": {}, } From 1e22422ff9e2c2a2519fc37bc541351e3eea5bfe Mon Sep 17 00:00:00 2001 From: JONEMI21 Date: Fri, 7 Nov 2025 14:47:08 +0000 Subject: [PATCH 74/91] WrapValidator pydanticv2 only - need different solution for v1 --- fastapi/_compat/__init__.py | 1 + fastapi/_compat/main.py | 2 ++ fastapi/_compat/shared.py | 30 +++++++++++++++++++++++++++++- fastapi/_compat/v1.py | 4 ++++ fastapi/_compat/v2.py | 10 +++++++++- fastapi/dependencies/utils.py | 35 +++-------------------------------- 6 files changed, 48 insertions(+), 34 deletions(-) diff --git a/fastapi/_compat/__init__.py b/fastapi/_compat/__init__.py index 3561176fe..b7287ea92 100644 --- a/fastapi/_compat/__init__.py +++ b/fastapi/_compat/__init__.py @@ -21,6 +21,7 @@ from .main import get_compat_model_name_map as get_compat_model_name_map from .main import get_definitions as get_definitions from .main import get_missing_field_error as get_missing_field_error from .main import get_schema_from_model_field as get_schema_from_model_field +from .main import ignore_invalid as ignore_invalid from .main import is_bytes_field as is_bytes_field from .main import is_bytes_sequence_field as is_bytes_sequence_field from .main import is_scalar_field as is_scalar_field diff --git a/fastapi/_compat/main.py b/fastapi/_compat/main.py index 5a36d887a..bac992d4e 100644 --- a/fastapi/_compat/main.py +++ b/fastapi/_compat/main.py @@ -28,6 +28,7 @@ if PYDANTIC_V2: from .v2 import Validator as Validator from .v2 import evaluate_forwardref as evaluate_forwardref from .v2 import get_missing_field_error as get_missing_field_error + from .v2 import ignore_invalid as ignore_invalid from .v2 import ( with_info_plain_validator_function as with_info_plain_validator_function, ) @@ -44,6 +45,7 @@ else: from .v1 import Validator as Validator from .v1 import evaluate_forwardref as evaluate_forwardref from .v1 import get_missing_field_error as get_missing_field_error + from .v1 import ignore_invalid as ignore_invalid from .v1 import ( # type: ignore[assignment] with_info_plain_validator_function as with_info_plain_validator_function, ) diff --git a/fastapi/_compat/shared.py b/fastapi/_compat/shared.py index 84b72adf4..30344b630 100644 --- a/fastapi/_compat/shared.py +++ b/fastapi/_compat/shared.py @@ -5,6 +5,7 @@ from collections import deque from dataclasses import is_dataclass from typing import ( Any, + Callable, Deque, FrozenSet, List, @@ -18,7 +19,7 @@ from typing import ( from fastapi._compat import may_v1 from fastapi.types import UnionType -from pydantic import BaseModel +from pydantic import BaseModel, ValidationError from pydantic.version import VERSION as PYDANTIC_VERSION from starlette.datastructures import UploadFile from typing_extensions import Annotated, get_args, get_origin @@ -251,3 +252,30 @@ def annotation_is_pydantic_v1(annotation: Any) -> bool: if annotation_is_pydantic_v1(sub_annotation): return True return False + + +def remove_invalid(v: Any, handler: Callable[[Any], Any]) -> Any: + try: + return handler(v) + except ValidationError as exc: + if not isinstance(v, dict): + raise exc + # remove invalid values from invalid keys and revalidate + errors = may_v1._regenerate_error_with_loc(errors=[exc.errors()], loc_prefix=()) + for err in errors: + loc = err.get("loc", ()) + if len(loc) == 1: + v.pop(loc[0], None) + elif len(loc) == 2 and isinstance(v.get(loc[0]), list): + try: + v[loc[0]][loc[1]] = None + except (ValueError, IndexError): + pass + # remove the None values from lists + for key in list(v.keys()): + if isinstance(v[key], list): + v[key] = [item for item in v[key] if item is not None] + # remove empty lists + if v[key] == []: + v.pop(key) + return handler(v) diff --git a/fastapi/_compat/v1.py b/fastapi/_compat/v1.py index 1d5c83fa7..50c929943 100644 --- a/fastapi/_compat/v1.py +++ b/fastapi/_compat/v1.py @@ -348,3 +348,7 @@ def create_body_model( def get_model_fields(model: Type[BaseModel]) -> List[ModelField]: return list(model.__fields__.values()) # type: ignore[attr-defined] + + +def ignore_invalid(field_info: FieldInfo) -> FieldInfo: + return field_info diff --git a/fastapi/_compat/v2.py b/fastapi/_compat/v2.py index de033083d..11f88a1c1 100644 --- a/fastapi/_compat/v2.py +++ b/fastapi/_compat/v2.py @@ -18,7 +18,7 @@ from typing import ( from fastapi._compat import may_v1, shared from fastapi.openapi.constants import REF_TEMPLATE from fastapi.types import IncEx, ModelNameMap -from pydantic import BaseModel, TypeAdapter, create_model +from pydantic import BaseModel, TypeAdapter, WrapValidator, create_model from pydantic import PydanticSchemaGenerationError as PydanticSchemaGenerationError from pydantic import PydanticUndefinedAnnotation as PydanticUndefinedAnnotation from pydantic import ValidationError as ValidationError @@ -487,3 +487,11 @@ def get_flat_models_from_fields( def get_long_model_name(model: TypeModelOrEnum) -> str: return f"{model.__module__}__{model.__qualname__}".replace(".", "__") + + +def ignore_invalid(field_info: FieldInfo) -> FieldInfo: + new_field_info = copy(field_info) + new_field_info.metadata = getattr(field_info, "metadata", []) + [ + WrapValidator(shared.remove_invalid) + ] + return new_field_info diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index 4e0ecbc52..04282c29c 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -34,6 +34,7 @@ from fastapi._compat import ( get_annotation_from_field_info, get_cached_model_fields, get_missing_field_error, + ignore_invalid, is_bytes_field, is_bytes_sequence_field, is_scalar_field, @@ -63,7 +64,7 @@ from fastapi.security.oauth2 import OAuth2, SecurityScopes from fastapi.security.open_id_connect_url import OpenIdConnect from fastapi.types import DependencyCacheKey from fastapi.utils import create_model_field, get_path_param_names -from pydantic import BaseModel, ValidationError, WrapValidator +from pydantic import BaseModel from pydantic.fields import FieldInfo from starlette.background import BackgroundTasks as StarletteBackgroundTasks from starlette.concurrency import run_in_threadpool @@ -330,33 +331,6 @@ def add_non_field_param_to_dependency( return None -def remove_invalid(v: Any, handler: Callable[[Any], Any]) -> Any: - try: - return handler(v) - except ValidationError as exc: - if not isinstance(v, dict): - raise exc - # remove invalid values from invalid keys and revalidate - errors = may_v1._regenerate_error_with_loc(errors=[exc.errors()], loc_prefix=()) - for err in errors: - loc = err.get("loc", ()) - if len(loc) == 1: - v.pop(loc[0], None) - elif len(loc) == 2 and isinstance(v.get(loc[0]), list): - try: - v[loc[0]][loc[1]] = None - except (ValueError, IndexError): - pass - # remove the None values from lists - for key in list(v.keys()): - if isinstance(v[key], list): - v[key] = [item for item in v[key] if item is not None] - # remove empty lists - if v[key] == []: - v.pop(key) - return handler(v) - - @dataclass class ParamDetails: type_annotation: Any @@ -553,9 +527,6 @@ def analyze_param( if is_scalar_sequence_field(field) or is_scalar_sequence_mapping_field( field ): - field_info.metadata = getattr(field_info, "metadata", []) + [ - WrapValidator(remove_invalid) - ] field = create_model_field( name=param_name, type_=use_annotation_from_field_info, @@ -563,7 +534,7 @@ def analyze_param( alias=alias, required=field_info.default in (RequiredParam, may_v1.RequiredParam, Undefined), - field_info=field_info, + field_info=ignore_invalid(field_info), ) return ParamDetails(type_annotation=type_annotation, depends=depends, field=field) From d90b39a60afdc8533b2dd9ee3d1c12880fff5d6b Mon Sep 17 00:00:00 2001 From: JONEMI21 Date: Fri, 7 Nov 2025 15:02:37 +0000 Subject: [PATCH 75/91] persuing 'on_error="omit"' --- fastapi/_compat/main.py | 2 -- fastapi/_compat/shared.py | 27 --------------------------- fastapi/_compat/v1.py | 3 --- fastapi/_compat/v2.py | 7 ------- fastapi/dependencies/utils.py | 13 ++----------- 5 files changed, 2 insertions(+), 50 deletions(-) diff --git a/fastapi/_compat/main.py b/fastapi/_compat/main.py index bac992d4e..5a36d887a 100644 --- a/fastapi/_compat/main.py +++ b/fastapi/_compat/main.py @@ -28,7 +28,6 @@ if PYDANTIC_V2: from .v2 import Validator as Validator from .v2 import evaluate_forwardref as evaluate_forwardref from .v2 import get_missing_field_error as get_missing_field_error - from .v2 import ignore_invalid as ignore_invalid from .v2 import ( with_info_plain_validator_function as with_info_plain_validator_function, ) @@ -45,7 +44,6 @@ else: from .v1 import Validator as Validator from .v1 import evaluate_forwardref as evaluate_forwardref from .v1 import get_missing_field_error as get_missing_field_error - from .v1 import ignore_invalid as ignore_invalid from .v1 import ( # type: ignore[assignment] with_info_plain_validator_function as with_info_plain_validator_function, ) diff --git a/fastapi/_compat/shared.py b/fastapi/_compat/shared.py index 30344b630..4540d6ec9 100644 --- a/fastapi/_compat/shared.py +++ b/fastapi/_compat/shared.py @@ -252,30 +252,3 @@ def annotation_is_pydantic_v1(annotation: Any) -> bool: if annotation_is_pydantic_v1(sub_annotation): return True return False - - -def remove_invalid(v: Any, handler: Callable[[Any], Any]) -> Any: - try: - return handler(v) - except ValidationError as exc: - if not isinstance(v, dict): - raise exc - # remove invalid values from invalid keys and revalidate - errors = may_v1._regenerate_error_with_loc(errors=[exc.errors()], loc_prefix=()) - for err in errors: - loc = err.get("loc", ()) - if len(loc) == 1: - v.pop(loc[0], None) - elif len(loc) == 2 and isinstance(v.get(loc[0]), list): - try: - v[loc[0]][loc[1]] = None - except (ValueError, IndexError): - pass - # remove the None values from lists - for key in list(v.keys()): - if isinstance(v[key], list): - v[key] = [item for item in v[key] if item is not None] - # remove empty lists - if v[key] == []: - v.pop(key) - return handler(v) diff --git a/fastapi/_compat/v1.py b/fastapi/_compat/v1.py index 50c929943..8e623d065 100644 --- a/fastapi/_compat/v1.py +++ b/fastapi/_compat/v1.py @@ -349,6 +349,3 @@ def create_body_model( def get_model_fields(model: Type[BaseModel]) -> List[ModelField]: return list(model.__fields__.values()) # type: ignore[attr-defined] - -def ignore_invalid(field_info: FieldInfo) -> FieldInfo: - return field_info diff --git a/fastapi/_compat/v2.py b/fastapi/_compat/v2.py index 11f88a1c1..1908d3df8 100644 --- a/fastapi/_compat/v2.py +++ b/fastapi/_compat/v2.py @@ -488,10 +488,3 @@ def get_flat_models_from_fields( def get_long_model_name(model: TypeModelOrEnum) -> str: return f"{model.__module__}__{model.__qualname__}".replace(".", "__") - -def ignore_invalid(field_info: FieldInfo) -> FieldInfo: - new_field_info = copy(field_info) - new_field_info.metadata = getattr(field_info, "metadata", []) + [ - WrapValidator(shared.remove_invalid) - ] - return new_field_info diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index 04282c29c..b39cf3482 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -34,7 +34,6 @@ from fastapi._compat import ( get_annotation_from_field_info, get_cached_model_fields, get_missing_field_error, - ignore_invalid, is_bytes_field, is_bytes_sequence_field, is_scalar_field, @@ -64,7 +63,7 @@ from fastapi.security.oauth2 import OAuth2, SecurityScopes from fastapi.security.open_id_connect_url import OpenIdConnect from fastapi.types import DependencyCacheKey from fastapi.utils import create_model_field, get_path_param_names -from pydantic import BaseModel +from pydantic import BaseModel, TypeAdapter from pydantic.fields import FieldInfo from starlette.background import BackgroundTasks as StarletteBackgroundTasks from starlette.concurrency import run_in_threadpool @@ -527,15 +526,7 @@ def analyze_param( if is_scalar_sequence_field(field) or is_scalar_sequence_mapping_field( field ): - field = create_model_field( - name=param_name, - type_=use_annotation_from_field_info, - default=field_info.default, - alias=alias, - required=field_info.default - in (RequiredParam, may_v1.RequiredParam, Undefined), - field_info=ignore_invalid(field_info), - ) + field._type_adapter.core_schema["on_error"] = "omit" return ParamDetails(type_annotation=type_annotation, depends=depends, field=field) From 62344d272d672fbd7d2d56f68b3d6b40116358e3 Mon Sep 17 00:00:00 2001 From: JONEMI21 Date: Fri, 7 Nov 2025 17:12:51 +0000 Subject: [PATCH 76/91] right directions maybe --- docs_src/query_params/tutorial007_py310.py | 3 ++- fastapi/_compat/__init__.py | 5 ++++- fastapi/_compat/main.py | 1 + fastapi/_compat/shared.py | 3 +-- fastapi/_compat/v1.py | 1 - fastapi/_compat/v2.py | 22 +++++++++++++++++-- fastapi/dependencies/utils.py | 14 +++++++----- fastapi/params.py | 1 + .../test_tutorial007_py310.py | 2 +- 9 files changed, 39 insertions(+), 13 deletions(-) diff --git a/docs_src/query_params/tutorial007_py310.py b/docs_src/query_params/tutorial007_py310.py index a88600d5d..ef8b09367 100644 --- a/docs_src/query_params/tutorial007_py310.py +++ b/docs_src/query_params/tutorial007_py310.py @@ -1,6 +1,7 @@ from typing import Annotated, Dict, List, Union from fastapi import FastAPI, Query +from pydantic import OnErrorOmit app = FastAPI() @@ -9,7 +10,7 @@ app = FastAPI() def get_mixed_mapping_mixed_type_query_params( query: Annotated[int, Query()] = None, mapping_query_str_or_int: Annotated[ - Union[Dict[str, str], Dict[str, int]], Query() + Union[Dict[str, OnErrorOmit[str]], Dict[str, int]], Query() ] = None, mapping_query_int: Annotated[Dict[str, int], Query()] = None, sequence_mapping_int: Annotated[Dict[str, List[int]], Query()] = None, diff --git a/fastapi/_compat/__init__.py b/fastapi/_compat/__init__.py index b7287ea92..81327d2a0 100644 --- a/fastapi/_compat/__init__.py +++ b/fastapi/_compat/__init__.py @@ -21,7 +21,6 @@ from .main import get_compat_model_name_map as get_compat_model_name_map from .main import get_definitions as get_definitions from .main import get_missing_field_error as get_missing_field_error from .main import get_schema_from_model_field as get_schema_from_model_field -from .main import ignore_invalid as ignore_invalid from .main import is_bytes_field as is_bytes_field from .main import is_bytes_sequence_field as is_bytes_sequence_field from .main import is_scalar_field as is_scalar_field @@ -29,6 +28,7 @@ from .main import is_scalar_mapping_field as is_scalar_mapping_field from .main import is_scalar_sequence_field as is_scalar_sequence_field from .main import is_scalar_sequence_mapping_field as is_scalar_sequence_mapping_field from .main import is_sequence_field as is_sequence_field +from .main import omit_by_default as omit_by_default from .main import serialize_sequence_value as serialize_sequence_value from .main import ( with_info_plain_validator_function as with_info_plain_validator_function, @@ -42,6 +42,9 @@ from .shared import PYDANTIC_V2 as PYDANTIC_V2 from .shared import PYDANTIC_VERSION_MINOR_TUPLE as PYDANTIC_VERSION_MINOR_TUPLE from .shared import annotation_is_pydantic_v1 as annotation_is_pydantic_v1 from .shared import field_annotation_is_scalar as field_annotation_is_scalar +from .shared import ( + field_annotation_is_scalar_sequence_mapping as field_annotation_is_scalar_sequence_mapping, +) from .shared import ( is_uploadfile_or_nonable_uploadfile_annotation as is_uploadfile_or_nonable_uploadfile_annotation, ) diff --git a/fastapi/_compat/main.py b/fastapi/_compat/main.py index 5a36d887a..e1859018a 100644 --- a/fastapi/_compat/main.py +++ b/fastapi/_compat/main.py @@ -28,6 +28,7 @@ if PYDANTIC_V2: from .v2 import Validator as Validator from .v2 import evaluate_forwardref as evaluate_forwardref from .v2 import get_missing_field_error as get_missing_field_error + from .v2 import omit_by_default as omit_by_default from .v2 import ( with_info_plain_validator_function as with_info_plain_validator_function, ) diff --git a/fastapi/_compat/shared.py b/fastapi/_compat/shared.py index 4540d6ec9..84b72adf4 100644 --- a/fastapi/_compat/shared.py +++ b/fastapi/_compat/shared.py @@ -5,7 +5,6 @@ from collections import deque from dataclasses import is_dataclass from typing import ( Any, - Callable, Deque, FrozenSet, List, @@ -19,7 +18,7 @@ from typing import ( from fastapi._compat import may_v1 from fastapi.types import UnionType -from pydantic import BaseModel, ValidationError +from pydantic import BaseModel from pydantic.version import VERSION as PYDANTIC_VERSION from starlette.datastructures import UploadFile from typing_extensions import Annotated, get_args, get_origin diff --git a/fastapi/_compat/v1.py b/fastapi/_compat/v1.py index 8e623d065..1d5c83fa7 100644 --- a/fastapi/_compat/v1.py +++ b/fastapi/_compat/v1.py @@ -348,4 +348,3 @@ def create_body_model( def get_model_fields(model: Type[BaseModel]) -> List[ModelField]: return list(model.__fields__.values()) # type: ignore[attr-defined] - diff --git a/fastapi/_compat/v2.py b/fastapi/_compat/v2.py index 1908d3df8..5255a5208 100644 --- a/fastapi/_compat/v2.py +++ b/fastapi/_compat/v2.py @@ -17,8 +17,8 @@ from typing import ( from fastapi._compat import may_v1, shared from fastapi.openapi.constants import REF_TEMPLATE -from fastapi.types import IncEx, ModelNameMap -from pydantic import BaseModel, TypeAdapter, WrapValidator, create_model +from fastapi.types import IncEx, ModelNameMap, UnionType +from pydantic import BaseModel, OnErrorOmit, TypeAdapter, create_model from pydantic import PydanticSchemaGenerationError as PydanticSchemaGenerationError from pydantic import PydanticUndefinedAnnotation as PydanticUndefinedAnnotation from pydantic import ValidationError as ValidationError @@ -488,3 +488,21 @@ def get_flat_models_from_fields( def get_long_model_name(model: TypeModelOrEnum) -> str: return f"{model.__module__}__{model.__qualname__}".replace(".", "__") + +def omit_by_default(annotation: Any) -> Any: + # Update the annotation to use OnErrorOmit for the inner type(s) + origin = get_origin(annotation) + if origin is Union or origin is UnionType: + new_args = [] + for arg in get_args(annotation): + new_arg = omit_by_default(arg) + new_args.append(new_arg) + return Union[tuple(new_args)] # type: ignore[return-value] + elif origin is Annotated: + annotated_args = get_args(annotation) + base_annotation = annotated_args[0] + new_base_annotation = omit_by_default(base_annotation) + new_metadata = annotated_args[1:] + return Annotated[new_base_annotation + new_metadata] # type: ignore[return-value] + else: + return OnErrorOmit[annotation] # type: ignore[return-value] diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index b39cf3482..a42492ca8 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -31,6 +31,7 @@ from fastapi._compat import ( create_body_model, evaluate_forwardref, field_annotation_is_scalar, + field_annotation_is_scalar_sequence_mapping, get_annotation_from_field_info, get_cached_model_fields, get_missing_field_error, @@ -45,6 +46,7 @@ from fastapi._compat import ( is_uploadfile_sequence_annotation, lenient_issubclass, may_v1, + omit_by_default, sequence_types, serialize_sequence_value, value_is_sequence, @@ -63,7 +65,7 @@ from fastapi.security.oauth2 import OAuth2, SecurityScopes from fastapi.security.open_id_connect_url import OpenIdConnect from fastapi.types import DependencyCacheKey from fastapi.utils import create_model_field, get_path_param_names -from pydantic import BaseModel, TypeAdapter +from pydantic import BaseModel from pydantic.fields import FieldInfo from starlette.background import BackgroundTasks as StarletteBackgroundTasks from starlette.concurrency import run_in_threadpool @@ -485,6 +487,12 @@ def analyze_param( and getattr(field_info, "in_", None) is None ): field_info.in_ = params.ParamTypes.query + + if isinstance( + field_info, (params.Query, temp_pydantic_v1_params.Query) + ) and field_annotation_is_scalar_sequence_mapping(use_annotation): + use_annotation = omit_by_default(use_annotation) + use_annotation_from_field_info = get_annotation_from_field_info( use_annotation, field_info, @@ -523,10 +531,6 @@ def analyze_param( and getattr(field, "shape", 1) == 1 ) ) - if is_scalar_sequence_field(field) or is_scalar_sequence_mapping_field( - field - ): - field._type_adapter.core_schema["on_error"] = "omit" return ParamDetails(type_annotation=type_annotation, depends=depends, field=field) diff --git a/fastapi/params.py b/fastapi/params.py index 6a58d5808..3d9319030 100644 --- a/fastapi/params.py +++ b/fastapi/params.py @@ -305,6 +305,7 @@ class Query(Param): # type: ignore[misc] json_schema_extra=json_schema_extra, **extra, ) + self.annotation = self.annotation class Header(Param): # type: ignore[misc] diff --git a/tests/test_tutorial/test_query_params/test_tutorial007_py310.py b/tests/test_tutorial/test_query_params/test_tutorial007_py310.py index dd9a9f850..df9505bfe 100644 --- a/tests/test_tutorial/test_query_params/test_tutorial007_py310.py +++ b/tests/test_tutorial/test_query_params/test_tutorial007_py310.py @@ -17,7 +17,7 @@ def test_foo_needy_very(client: TestClient): "query": 2, "mapping_query_str_or_int": {"foo": "baz"}, "mapping_query_int": {}, - "sequence_mapping_int": {}, + "sequence_mapping_int": {"foo": []}, } From 076a8cf3fa39443b8eedba5bdf7889fe7313014b Mon Sep 17 00:00:00 2001 From: JONEMI21 Date: Mon, 10 Nov 2025 07:08:41 +0000 Subject: [PATCH 77/91] rm omit by default fn --- docs/en/docs/tutorial/query-params.md | 2 +- docs_src/query_params/tutorial007_py310.py | 6 +- fastapi/_compat/__init__.py | 4 +- fastapi/_compat/main.py | 1 - fastapi/_compat/v2.py | 23 +--- fastapi/dependencies/utils.py | 8 +- tests/main.py | 18 +-- tests/test_omit_by_default.py | 111 ++++++++++++++++++ tests/test_query.py | 16 ++- .../test_tutorial007_py310.py | 4 + 10 files changed, 141 insertions(+), 52 deletions(-) create mode 100644 tests/test_omit_by_default.py diff --git a/docs/en/docs/tutorial/query-params.md b/docs/en/docs/tutorial/query-params.md index 05edbec30..1506f5e2e 100644 --- a/docs/en/docs/tutorial/query-params.md +++ b/docs/en/docs/tutorial/query-params.md @@ -189,7 +189,7 @@ You could also use `Enum`s the same way as with [Path Parameters](path-params.md ## Free Form Query Parameters -Sometimes you want to receive some query parameters, but you don't know in advance what they are called. **FastAPI** provides support for this use case. +Sometimes you want to receive some query parameters, but you don't know in advance what they are called. **FastAPI** provides support for this use case as well. === "Python 3.10+" diff --git a/docs_src/query_params/tutorial007_py310.py b/docs_src/query_params/tutorial007_py310.py index ef8b09367..2b6b080b5 100644 --- a/docs_src/query_params/tutorial007_py310.py +++ b/docs_src/query_params/tutorial007_py310.py @@ -10,10 +10,10 @@ app = FastAPI() def get_mixed_mapping_mixed_type_query_params( query: Annotated[int, Query()] = None, mapping_query_str_or_int: Annotated[ - Union[Dict[str, OnErrorOmit[str]], Dict[str, int]], Query() + Union[Dict[str, OnErrorOmit[str]], Dict[str, OnErrorOmit[int]]], Query() ] = None, - mapping_query_int: Annotated[Dict[str, int], Query()] = None, - sequence_mapping_int: Annotated[Dict[str, List[int]], Query()] = None, + mapping_query_int: Annotated[Dict[str, OnErrorOmit[int]], Query()] = None, + sequence_mapping_int: Annotated[Dict[str, List[OnErrorOmit[int]]], Query()] = None, ): return { "query": query, diff --git a/fastapi/_compat/__init__.py b/fastapi/_compat/__init__.py index 81327d2a0..3df9175c4 100644 --- a/fastapi/_compat/__init__.py +++ b/fastapi/_compat/__init__.py @@ -28,7 +28,6 @@ from .main import is_scalar_mapping_field as is_scalar_mapping_field from .main import is_scalar_sequence_field as is_scalar_sequence_field from .main import is_scalar_sequence_mapping_field as is_scalar_sequence_mapping_field from .main import is_sequence_field as is_sequence_field -from .main import omit_by_default as omit_by_default from .main import serialize_sequence_value as serialize_sequence_value from .main import ( with_info_plain_validator_function as with_info_plain_validator_function, @@ -42,6 +41,9 @@ from .shared import PYDANTIC_V2 as PYDANTIC_V2 from .shared import PYDANTIC_VERSION_MINOR_TUPLE as PYDANTIC_VERSION_MINOR_TUPLE from .shared import annotation_is_pydantic_v1 as annotation_is_pydantic_v1 from .shared import field_annotation_is_scalar as field_annotation_is_scalar +from .shared import ( + field_annotation_is_scalar_mapping as field_annotation_is_scalar_mapping, +) from .shared import ( field_annotation_is_scalar_sequence_mapping as field_annotation_is_scalar_sequence_mapping, ) diff --git a/fastapi/_compat/main.py b/fastapi/_compat/main.py index e1859018a..5a36d887a 100644 --- a/fastapi/_compat/main.py +++ b/fastapi/_compat/main.py @@ -28,7 +28,6 @@ if PYDANTIC_V2: from .v2 import Validator as Validator from .v2 import evaluate_forwardref as evaluate_forwardref from .v2 import get_missing_field_error as get_missing_field_error - from .v2 import omit_by_default as omit_by_default from .v2 import ( with_info_plain_validator_function as with_info_plain_validator_function, ) diff --git a/fastapi/_compat/v2.py b/fastapi/_compat/v2.py index 5255a5208..de033083d 100644 --- a/fastapi/_compat/v2.py +++ b/fastapi/_compat/v2.py @@ -17,8 +17,8 @@ from typing import ( from fastapi._compat import may_v1, shared from fastapi.openapi.constants import REF_TEMPLATE -from fastapi.types import IncEx, ModelNameMap, UnionType -from pydantic import BaseModel, OnErrorOmit, TypeAdapter, create_model +from fastapi.types import IncEx, ModelNameMap +from pydantic import BaseModel, TypeAdapter, create_model from pydantic import PydanticSchemaGenerationError as PydanticSchemaGenerationError from pydantic import PydanticUndefinedAnnotation as PydanticUndefinedAnnotation from pydantic import ValidationError as ValidationError @@ -487,22 +487,3 @@ def get_flat_models_from_fields( def get_long_model_name(model: TypeModelOrEnum) -> str: return f"{model.__module__}__{model.__qualname__}".replace(".", "__") - - -def omit_by_default(annotation: Any) -> Any: - # Update the annotation to use OnErrorOmit for the inner type(s) - origin = get_origin(annotation) - if origin is Union or origin is UnionType: - new_args = [] - for arg in get_args(annotation): - new_arg = omit_by_default(arg) - new_args.append(new_arg) - return Union[tuple(new_args)] # type: ignore[return-value] - elif origin is Annotated: - annotated_args = get_args(annotation) - base_annotation = annotated_args[0] - new_base_annotation = omit_by_default(base_annotation) - new_metadata = annotated_args[1:] - return Annotated[new_base_annotation + new_metadata] # type: ignore[return-value] - else: - return OnErrorOmit[annotation] # type: ignore[return-value] diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index a42492ca8..b596b819f 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -31,7 +31,6 @@ from fastapi._compat import ( create_body_model, evaluate_forwardref, field_annotation_is_scalar, - field_annotation_is_scalar_sequence_mapping, get_annotation_from_field_info, get_cached_model_fields, get_missing_field_error, @@ -46,7 +45,6 @@ from fastapi._compat import ( is_uploadfile_sequence_annotation, lenient_issubclass, may_v1, - omit_by_default, sequence_types, serialize_sequence_value, value_is_sequence, @@ -488,11 +486,6 @@ def analyze_param( ): field_info.in_ = params.ParamTypes.query - if isinstance( - field_info, (params.Query, temp_pydantic_v1_params.Query) - ) and field_annotation_is_scalar_sequence_mapping(use_annotation): - use_annotation = omit_by_default(use_annotation) - use_annotation_from_field_info = get_annotation_from_field_info( use_annotation, field_info, @@ -525,6 +518,7 @@ def analyze_param( is_scalar_field(field) or is_scalar_sequence_field(field) or is_scalar_sequence_mapping_field(field) + or is_scalar_mapping_field(field) or ( _is_model_class(field.type_) # For Pydantic v1 diff --git a/tests/main.py b/tests/main.py index f0daad9ac..de8009eea 100644 --- a/tests/main.py +++ b/tests/main.py @@ -193,15 +193,11 @@ def get_query_param_required_type(query: int = Query()): def get_mapping_query_params(queries: Dict[str, str] = Query({})): return {"queries": queries} - -@app.get("/query/mapping-sequence-params") -def get_sequence_mapping_query_params(queries: Dict[str, List[int]] = Query({})): - return {"queries": queries} - +from pydantic import OnErrorOmit @app.get("/query/mixed-params") def get_mixed_mapping_query_params( - sequence_mapping_queries: Dict[str, List[Union[str, int]]] = Query({}), + sequence_mapping_queries: Dict[str, List[Union[str, OnErrorOmit[int]]]] = Query({}), mapping_query: Dict[str, str] = Query(), query: str = Query(), ): @@ -213,12 +209,16 @@ def get_mixed_mapping_query_params( } } +@app.get("/query/mapping-sequence-params") +def get_sequence_mapping_query_params(queries: Dict[str, List[OnErrorOmit[int]]] = Query({})): + return {"queries": queries} + @app.get("/query/mixed-type-params") def get_mixed_mapping_mixed_type_query_params( - sequence_mapping_queries: Dict[str, List[int]] = Query({}), - mapping_query_str: Dict[str, str] = Query({}), - mapping_query_int: Dict[str, int] = Query({}), + sequence_mapping_queries: Dict[str, List[OnErrorOmit[int]]] = Query({}), + mapping_query_str: Dict[str, OnErrorOmit[str]] = Query({}), + mapping_query_int: Dict[str, OnErrorOmit[int]] = Query({}), query: int = Query(), ): return { diff --git a/tests/test_omit_by_default.py b/tests/test_omit_by_default.py new file mode 100644 index 000000000..97be98b5e --- /dev/null +++ b/tests/test_omit_by_default.py @@ -0,0 +1,111 @@ +import sys +from typing import Dict, List, Optional, Union + +import pytest +from pydantic import OnErrorOmit +from typing_extensions import Annotated + + +def omit_by_default(annotation): + """A simplified version of the omit_by_default function for testing purposes.""" + origin = getattr(annotation, "__origin__", None) + args = getattr(annotation, "__args__", ()) + + if origin is Annotated: + new_args = (omit_by_default(args[0]),) + args[1:] + return Annotated[new_args[0], *new_args[1:]] + elif origin is Union: + new_args = tuple(omit_by_default(arg) for arg in args) + return Union[new_args] + elif origin in (list, List): + return List[omit_by_default(args[0])] + elif origin in (dict, Dict): + return Dict[args[0], omit_by_default(args[1])] + else: + return OnErrorOmit[annotation] + + +def test_omit_by_default_simple_type(): + result = omit_by_default(int) + assert result == OnErrorOmit[int] + + +def test_omit_by_default_union(): + result = omit_by_default(Union[int, str]) + assert result == Union[OnErrorOmit[int], OnErrorOmit[str]] + + +def test_omit_by_default_optional(): + result = omit_by_default(Optional[int]) + assert result == Union[OnErrorOmit[int], OnErrorOmit[type(None)]] + + +def test_omit_by_default_annotated(): + result = omit_by_default(Annotated[int, "metadata"]) + origin = result.__origin__ if hasattr(result, "__origin__") else None + assert origin is Annotated + args = result.__args__ if hasattr(result, "__args__") else () + assert len(args) == 2 + assert args[0] == OnErrorOmit[int] + assert args[1] == "metadata" + + +def test_omit_by_default_annotated_union(): + result = omit_by_default(Annotated[Union[int, str], "metadata"]) + origin = result.__origin__ if hasattr(result, "__origin__") else None + assert origin is Annotated + args = result.__args__ if hasattr(result, "__args__") else () + assert len(args) == 2 + assert args[0] == Union[OnErrorOmit[int], OnErrorOmit[str]] + assert args[1] == "metadata" + + +def test_omit_by_default_list(): + result = omit_by_default(List[int]) + assert result == List[OnErrorOmit[int]] + + +def test_omit_by_default_dict(): + result = omit_by_default(Dict[str, int]) + assert result == Dict[str, OnErrorOmit[int]] + + +def test_omit_by_default_nested_union(): + result = omit_by_default(Union[int, Union[str, float]]) + assert result == Union[OnErrorOmit[int], OnErrorOmit[Union[str, float]]] + + +def test_omit_by_default_annotated_with_multiple_metadata(): + result = omit_by_default(Annotated[str, "meta1", "meta2"]) + origin = result.__origin__ if hasattr(result, "__origin__") else None + assert origin is Annotated + args = result.__args__ if hasattr(result, "__args__") else () + assert len(args) == 3 + assert args[0] == OnErrorOmit[str] + assert args[1] == "meta1" + assert args[2] == "meta2" + + +@pytest.mark.skipif( + sys.version_info < (3, 10), reason="Union type syntax requires Python 3.10+" +) +def test_omit_by_default_pipe_union(): + annotation = eval("int | str") + result = omit_by_default(annotation) + assert result == Union[OnErrorOmit[int], OnErrorOmit[str]] + + +def test_omit_by_default_complex_nested(): + result = omit_by_default(Annotated[Union[int, Optional[str]], "metadata"]) + origin = result.__origin__ if hasattr(result, "__origin__") else None + assert origin is Annotated + args = result.__args__ if hasattr(result, "__args__") else () + assert len(args) == 2 + expected_union = Union[OnErrorOmit[int], OnErrorOmit[Union[str, type(None)]]] + assert args[0] == expected_union + assert args[1] == "metadata" + + +def test_omit_by_default_dict_with_union_value(): + result = omit_by_default(Dict[str, Union[int, str]]) + assert result == Dict[str, Union[OnErrorOmit[int], OnErrorOmit[str]]] diff --git a/tests/test_query.py b/tests/test_query.py index 5b483f17f..c17823c60 100644 --- a/tests/test_query.py +++ b/tests/test_query.py @@ -426,6 +426,10 @@ def test_mapping_query(): assert response.status_code == 200 assert response.json() == {"queries": {"bar": "buzz", "foo": "fuzz"}} +def test_sequence_mapping_query(): + response = client.get("/query/mapping-sequence-params/?foo=1&foo=2") + assert response.status_code == 200 + assert response.json() == {"queries": {"foo": [1, 2]}} def test_mapping_with_non_mapping_query(): response = client.get("/query/mixed-params/?foo=fuzz&foo=baz&bar=buzz&query=fizz") @@ -448,20 +452,14 @@ def test_mapping_with_non_mapping_query_mixed_types(): assert response.json() == { "queries": { "query": 1, - "mapping_query_str": {"foo": "baz", "bar": "buzz"}, "mapping_query_int": {}, - "sequence_mapping_queries": {}, + "mapping_query_str": {"bar": "buzz", "foo": "baz"}, + "sequence_mapping_queries": {"bar": [], "foo": []}, } } -def test_sequence_mapping_query(): - response = client.get("/query/mapping-sequence-params/?foo=1&foo=2") - assert response.status_code == 200 - assert response.json() == {"queries": {"foo": [1, 2]}} - - def test_sequence_mapping_query_drops_invalid(): response = client.get("/query/mapping-sequence-params/?foo=fuzz&foo=buzz") assert response.status_code == 200 - assert response.json() == {"queries": {}} + assert response.json() == {"queries": {"foo": []}} diff --git a/tests/test_tutorial/test_query_params/test_tutorial007_py310.py b/tests/test_tutorial/test_query_params/test_tutorial007_py310.py index df9505bfe..44cf39ab7 100644 --- a/tests/test_tutorial/test_query_params/test_tutorial007_py310.py +++ b/tests/test_tutorial/test_query_params/test_tutorial007_py310.py @@ -1,6 +1,10 @@ import pytest +from fastapi._compat import PYDANTIC_V2 from fastapi.testclient import TestClient +if not PYDANTIC_V2: + pytest.skip("This test is only for Pydantic v2", allow_module_level=True) + @pytest.fixture(name="client") def get_client(): From 3847b353ce48e35ed6e5b536f71bd9719b773482 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 10 Nov 2025 07:08:59 +0000 Subject: [PATCH 78/91] =?UTF-8?q?=F0=9F=8E=A8=20[pre-commit.ci]=20Auto=20f?= =?UTF-8?q?ormat=20from=20pre-commit.com=20hooks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/main.py | 7 ++++++- tests/test_query.py | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/tests/main.py b/tests/main.py index de8009eea..fe042e870 100644 --- a/tests/main.py +++ b/tests/main.py @@ -193,8 +193,10 @@ def get_query_param_required_type(query: int = Query()): def get_mapping_query_params(queries: Dict[str, str] = Query({})): return {"queries": queries} + from pydantic import OnErrorOmit + @app.get("/query/mixed-params") def get_mixed_mapping_query_params( sequence_mapping_queries: Dict[str, List[Union[str, OnErrorOmit[int]]]] = Query({}), @@ -209,8 +211,11 @@ def get_mixed_mapping_query_params( } } + @app.get("/query/mapping-sequence-params") -def get_sequence_mapping_query_params(queries: Dict[str, List[OnErrorOmit[int]]] = Query({})): +def get_sequence_mapping_query_params( + queries: Dict[str, List[OnErrorOmit[int]]] = Query({}), +): return {"queries": queries} diff --git a/tests/test_query.py b/tests/test_query.py index c17823c60..1a1fb6146 100644 --- a/tests/test_query.py +++ b/tests/test_query.py @@ -426,11 +426,13 @@ def test_mapping_query(): assert response.status_code == 200 assert response.json() == {"queries": {"bar": "buzz", "foo": "fuzz"}} + def test_sequence_mapping_query(): response = client.get("/query/mapping-sequence-params/?foo=1&foo=2") assert response.status_code == 200 assert response.json() == {"queries": {"foo": [1, 2]}} + def test_mapping_with_non_mapping_query(): response = client.get("/query/mixed-params/?foo=fuzz&foo=baz&bar=buzz&query=fizz") assert response.status_code == 200 From 45825d7d118a845bb991af55492d610ce9c57c04 Mon Sep 17 00:00:00 2001 From: JONEMI21 Date: Mon, 10 Nov 2025 08:47:21 +0000 Subject: [PATCH 79/91] omit by default query params --- fastapi/_compat/__init__.py | 1 + fastapi/_compat/main.py | 19 ++++++ fastapi/dependencies/utils.py | 16 ++++- tests/main.py | 28 +-------- tests/test_omit_by_default.py | 111 ---------------------------------- tests/test_query.py | 27 ++------- 6 files changed, 41 insertions(+), 161 deletions(-) delete mode 100644 tests/test_omit_by_default.py diff --git a/fastapi/_compat/__init__.py b/fastapi/_compat/__init__.py index 3df9175c4..b3438dc15 100644 --- a/fastapi/_compat/__init__.py +++ b/fastapi/_compat/__init__.py @@ -28,6 +28,7 @@ from .main import is_scalar_mapping_field as is_scalar_mapping_field from .main import is_scalar_sequence_field as is_scalar_sequence_field from .main import is_scalar_sequence_mapping_field as is_scalar_sequence_mapping_field from .main import is_sequence_field as is_sequence_field +from .main import omit_by_default as omit_by_default from .main import serialize_sequence_value as serialize_sequence_value from .main import ( with_info_plain_validator_function as with_info_plain_validator_function, diff --git a/fastapi/_compat/main.py b/fastapi/_compat/main.py index 5a36d887a..f7fdbc856 100644 --- a/fastapi/_compat/main.py +++ b/fastapi/_compat/main.py @@ -384,3 +384,22 @@ def _is_model_class(value: Any) -> bool: return lenient_issubclass(value, v2.BaseModel) # type: ignore[attr-defined] return False + + +def omit_by_default(annotation): + from typing import Union + + from pydantic import OnErrorOmit + + origin = getattr(annotation, "__origin__", None) + args = getattr(annotation, "__args__", ()) + + if origin is Union: + new_args = tuple(omit_by_default(arg) for arg in args) + return Union[new_args] + elif origin in (list, List): + return List[omit_by_default(args[0])] + elif origin in (dict, Dict): + return Dict[args[0], omit_by_default(args[1])] + else: + return OnErrorOmit[annotation] diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index b596b819f..56be94409 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -45,11 +45,16 @@ from fastapi._compat import ( is_uploadfile_sequence_annotation, lenient_issubclass, may_v1, + omit_by_default, sequence_types, serialize_sequence_value, value_is_sequence, ) -from fastapi._compat.shared import annotation_is_pydantic_v1 +from fastapi._compat.shared import ( + annotation_is_pydantic_v1, + field_annotation_is_scalar_mapping, + field_annotation_is_scalar_sequence_mapping, +) from fastapi.background import BackgroundTasks from fastapi.concurrency import ( asynccontextmanager, @@ -500,6 +505,12 @@ def analyze_param( field_info.alias = alias + if hasattr(field_info, "annotation") and ( + field_annotation_is_scalar_sequence_mapping(field_info.annotation) + or field_annotation_is_scalar_mapping(field_info.annotation) + ): + field_info.annotation = omit_by_default(field_info.annotation) + field = create_model_field( name=param_name, type_=use_annotation_from_field_info, @@ -833,7 +844,8 @@ def request_params_to_args( errors.extend(errors_) else: values[field.name] = v_ - # remove keys which were captured by a mapping query field but were otherwise specified + # remove keys which were captured by a mapping query field but were + # specified as individual fields for field in fields: if isinstance(values.get(field.name), dict) and ( is_scalar_mapping_field(field) or is_scalar_sequence_mapping_field(field) diff --git a/tests/main.py b/tests/main.py index fe042e870..25646bce3 100644 --- a/tests/main.py +++ b/tests/main.py @@ -194,13 +194,10 @@ def get_mapping_query_params(queries: Dict[str, str] = Query({})): return {"queries": queries} -from pydantic import OnErrorOmit - - @app.get("/query/mixed-params") def get_mixed_mapping_query_params( - sequence_mapping_queries: Dict[str, List[Union[str, OnErrorOmit[int]]]] = Query({}), - mapping_query: Dict[str, str] = Query(), + sequence_mapping_queries: Dict[str, List[Union[int]]] = Query({}), + mapping_query: Dict[str, int] = Query(), query: str = Query(), ): return { @@ -213,29 +210,10 @@ def get_mixed_mapping_query_params( @app.get("/query/mapping-sequence-params") -def get_sequence_mapping_query_params( - queries: Dict[str, List[OnErrorOmit[int]]] = Query({}), -): +def get_sequence_mapping_query_params(queries: Dict[str, List[int]] = Query({})): return {"queries": queries} -@app.get("/query/mixed-type-params") -def get_mixed_mapping_mixed_type_query_params( - sequence_mapping_queries: Dict[str, List[OnErrorOmit[int]]] = Query({}), - mapping_query_str: Dict[str, OnErrorOmit[str]] = Query({}), - mapping_query_int: Dict[str, OnErrorOmit[int]] = Query({}), - query: int = Query(), -): - return { - "queries": { - "query": query, - "mapping_query_str": mapping_query_str, - "mapping_query_int": mapping_query_int, - "sequence_mapping_queries": sequence_mapping_queries, - } - } - - @app.get("/enum-status-code", status_code=http.HTTPStatus.CREATED) def get_enum_status_code(): return "foo bar" diff --git a/tests/test_omit_by_default.py b/tests/test_omit_by_default.py deleted file mode 100644 index 97be98b5e..000000000 --- a/tests/test_omit_by_default.py +++ /dev/null @@ -1,111 +0,0 @@ -import sys -from typing import Dict, List, Optional, Union - -import pytest -from pydantic import OnErrorOmit -from typing_extensions import Annotated - - -def omit_by_default(annotation): - """A simplified version of the omit_by_default function for testing purposes.""" - origin = getattr(annotation, "__origin__", None) - args = getattr(annotation, "__args__", ()) - - if origin is Annotated: - new_args = (omit_by_default(args[0]),) + args[1:] - return Annotated[new_args[0], *new_args[1:]] - elif origin is Union: - new_args = tuple(omit_by_default(arg) for arg in args) - return Union[new_args] - elif origin in (list, List): - return List[omit_by_default(args[0])] - elif origin in (dict, Dict): - return Dict[args[0], omit_by_default(args[1])] - else: - return OnErrorOmit[annotation] - - -def test_omit_by_default_simple_type(): - result = omit_by_default(int) - assert result == OnErrorOmit[int] - - -def test_omit_by_default_union(): - result = omit_by_default(Union[int, str]) - assert result == Union[OnErrorOmit[int], OnErrorOmit[str]] - - -def test_omit_by_default_optional(): - result = omit_by_default(Optional[int]) - assert result == Union[OnErrorOmit[int], OnErrorOmit[type(None)]] - - -def test_omit_by_default_annotated(): - result = omit_by_default(Annotated[int, "metadata"]) - origin = result.__origin__ if hasattr(result, "__origin__") else None - assert origin is Annotated - args = result.__args__ if hasattr(result, "__args__") else () - assert len(args) == 2 - assert args[0] == OnErrorOmit[int] - assert args[1] == "metadata" - - -def test_omit_by_default_annotated_union(): - result = omit_by_default(Annotated[Union[int, str], "metadata"]) - origin = result.__origin__ if hasattr(result, "__origin__") else None - assert origin is Annotated - args = result.__args__ if hasattr(result, "__args__") else () - assert len(args) == 2 - assert args[0] == Union[OnErrorOmit[int], OnErrorOmit[str]] - assert args[1] == "metadata" - - -def test_omit_by_default_list(): - result = omit_by_default(List[int]) - assert result == List[OnErrorOmit[int]] - - -def test_omit_by_default_dict(): - result = omit_by_default(Dict[str, int]) - assert result == Dict[str, OnErrorOmit[int]] - - -def test_omit_by_default_nested_union(): - result = omit_by_default(Union[int, Union[str, float]]) - assert result == Union[OnErrorOmit[int], OnErrorOmit[Union[str, float]]] - - -def test_omit_by_default_annotated_with_multiple_metadata(): - result = omit_by_default(Annotated[str, "meta1", "meta2"]) - origin = result.__origin__ if hasattr(result, "__origin__") else None - assert origin is Annotated - args = result.__args__ if hasattr(result, "__args__") else () - assert len(args) == 3 - assert args[0] == OnErrorOmit[str] - assert args[1] == "meta1" - assert args[2] == "meta2" - - -@pytest.mark.skipif( - sys.version_info < (3, 10), reason="Union type syntax requires Python 3.10+" -) -def test_omit_by_default_pipe_union(): - annotation = eval("int | str") - result = omit_by_default(annotation) - assert result == Union[OnErrorOmit[int], OnErrorOmit[str]] - - -def test_omit_by_default_complex_nested(): - result = omit_by_default(Annotated[Union[int, Optional[str]], "metadata"]) - origin = result.__origin__ if hasattr(result, "__origin__") else None - assert origin is Annotated - args = result.__args__ if hasattr(result, "__args__") else () - assert len(args) == 2 - expected_union = Union[OnErrorOmit[int], OnErrorOmit[Union[str, type(None)]]] - assert args[0] == expected_union - assert args[1] == "metadata" - - -def test_omit_by_default_dict_with_union_value(): - result = omit_by_default(Dict[str, Union[int, str]]) - assert result == Dict[str, Union[OnErrorOmit[int], OnErrorOmit[str]]] diff --git a/tests/test_query.py b/tests/test_query.py index 1a1fb6146..102a8a29c 100644 --- a/tests/test_query.py +++ b/tests/test_query.py @@ -434,34 +434,15 @@ def test_sequence_mapping_query(): def test_mapping_with_non_mapping_query(): - response = client.get("/query/mixed-params/?foo=fuzz&foo=baz&bar=buzz&query=fizz") + response = client.get("/query/mixed-params/?foo=1&foo=2&bar=3&query=fizz") assert response.status_code == 200 assert response.json() == { "queries": { "query": "fizz", - "mapping_query": {"foo": "baz", "bar": "buzz"}, + "mapping_query": {"foo": 2, "bar": 3}, "sequence_mapping_queries": { - "foo": ["fuzz", "baz"], - "bar": ["buzz"], + "foo": [1, 2], + "bar": [3], }, } } - - -def test_mapping_with_non_mapping_query_mixed_types(): - response = client.get("/query/mixed-type-params/?foo=fuzz&foo=baz&bar=buzz&query=1") - assert response.status_code == 200 - assert response.json() == { - "queries": { - "query": 1, - "mapping_query_int": {}, - "mapping_query_str": {"bar": "buzz", "foo": "baz"}, - "sequence_mapping_queries": {"bar": [], "foo": []}, - } - } - - -def test_sequence_mapping_query_drops_invalid(): - response = client.get("/query/mapping-sequence-params/?foo=fuzz&foo=buzz") - assert response.status_code == 200 - assert response.json() == {"queries": {"foo": []}} From 03d445ad5ea67836eb92646a20565c7e67362c5a Mon Sep 17 00:00:00 2001 From: JONEMI21 Date: Mon, 10 Nov 2025 10:29:17 +0000 Subject: [PATCH 80/91] omit by default for pydantic v2 --- docs_src/query_params/tutorial007_py310.py | 7 +-- fastapi/_compat/main.py | 21 +------ fastapi/_compat/v2.py | 66 +++++++++++++++++++++- fastapi/dependencies/utils.py | 5 +- tests/main.py | 21 ++++++- tests/test_application.py | 4 +- tests/test_query.py | 2 +- 7 files changed, 95 insertions(+), 31 deletions(-) diff --git a/docs_src/query_params/tutorial007_py310.py b/docs_src/query_params/tutorial007_py310.py index 2b6b080b5..a88600d5d 100644 --- a/docs_src/query_params/tutorial007_py310.py +++ b/docs_src/query_params/tutorial007_py310.py @@ -1,7 +1,6 @@ from typing import Annotated, Dict, List, Union from fastapi import FastAPI, Query -from pydantic import OnErrorOmit app = FastAPI() @@ -10,10 +9,10 @@ app = FastAPI() def get_mixed_mapping_mixed_type_query_params( query: Annotated[int, Query()] = None, mapping_query_str_or_int: Annotated[ - Union[Dict[str, OnErrorOmit[str]], Dict[str, OnErrorOmit[int]]], Query() + Union[Dict[str, str], Dict[str, int]], Query() ] = None, - mapping_query_int: Annotated[Dict[str, OnErrorOmit[int]], Query()] = None, - sequence_mapping_int: Annotated[Dict[str, List[OnErrorOmit[int]]], Query()] = None, + mapping_query_int: Annotated[Dict[str, int], Query()] = None, + sequence_mapping_int: Annotated[Dict[str, List[int]], Query()] = None, ): return { "query": query, diff --git a/fastapi/_compat/main.py b/fastapi/_compat/main.py index f7fdbc856..974d21b39 100644 --- a/fastapi/_compat/main.py +++ b/fastapi/_compat/main.py @@ -28,6 +28,7 @@ if PYDANTIC_V2: from .v2 import Validator as Validator from .v2 import evaluate_forwardref as evaluate_forwardref from .v2 import get_missing_field_error as get_missing_field_error + from .v2 import omit_by_default as omit_by_default from .v2 import ( with_info_plain_validator_function as with_info_plain_validator_function, ) @@ -44,6 +45,7 @@ else: from .v1 import Validator as Validator from .v1 import evaluate_forwardref as evaluate_forwardref from .v1 import get_missing_field_error as get_missing_field_error + from .v1 import omit_by_default as omit_by_default from .v1 import ( # type: ignore[assignment] with_info_plain_validator_function as with_info_plain_validator_function, ) @@ -384,22 +386,3 @@ def _is_model_class(value: Any) -> bool: return lenient_issubclass(value, v2.BaseModel) # type: ignore[attr-defined] return False - - -def omit_by_default(annotation): - from typing import Union - - from pydantic import OnErrorOmit - - origin = getattr(annotation, "__origin__", None) - args = getattr(annotation, "__args__", ()) - - if origin is Union: - new_args = tuple(omit_by_default(arg) for arg in args) - return Union[new_args] - elif origin in (list, List): - return List[omit_by_default(args[0])] - elif origin in (dict, Dict): - return Dict[args[0], omit_by_default(args[1])] - else: - return OnErrorOmit[annotation] diff --git a/fastapi/_compat/v2.py b/fastapi/_compat/v2.py index de033083d..0b31d47fc 100644 --- a/fastapi/_compat/v2.py +++ b/fastapi/_compat/v2.py @@ -5,6 +5,7 @@ from dataclasses import dataclass from enum import Enum from typing import ( Any, + Callable, Dict, List, Sequence, @@ -18,7 +19,7 @@ from typing import ( from fastapi._compat import may_v1, shared from fastapi.openapi.constants import REF_TEMPLATE from fastapi.types import IncEx, ModelNameMap -from pydantic import BaseModel, TypeAdapter, create_model +from pydantic import BaseModel, OnErrorOmit, TypeAdapter, WrapValidator, create_model from pydantic import PydanticSchemaGenerationError as PydanticSchemaGenerationError from pydantic import PydanticUndefinedAnnotation as PydanticUndefinedAnnotation from pydantic import ValidationError as ValidationError @@ -487,3 +488,66 @@ def get_flat_models_from_fields( def get_long_model_name(model: TypeModelOrEnum) -> str: return f"{model.__module__}__{model.__qualname__}".replace(".", "__") + + +if shared.PYDANTIC_VERSION_MINOR_TUPLE >= (2, 6): + # Omit by default for scalar mapping and scalar sequence mapping annotations + # added in Pydantic v2.6 https://github.com/pydantic/pydantic/releases/tag/v2.6.0 + def _omit_by_default(annotation): + origin = getattr(annotation, "__origin__", None) + args = getattr(annotation, "__args__", ()) + + if origin is Union: + new_args = tuple(_omit_by_default(arg) for arg in args) + return Union[new_args] + elif origin in (list, List): + return List[_omit_by_default(args[0])] + elif origin in (dict, Dict): + return Dict[args[0], _omit_by_default(args[1])] + else: + return OnErrorOmit[annotation] + + def omit_by_default(field_info: FieldInfo) -> FieldInfo: + """Set omit by default on a FieldInfo's annotation.""" + new_annotation = _omit_by_default(field_info.annotation) + new_field_info = copy_field_info(field_info=field_info, annotation=new_annotation) + return new_field_info + +else: + def ignore_invalid(v: Any, handler: Callable[[Any], Any]) -> Any: + try: + return handler(v) + except ValidationError as exc: + # pop the keys or elements that caused the validation errors and revalidate + for error in exc.errors(): + loc = error["loc"] + if len(loc) == 0: + continue + if isinstance(loc[0], int) and isinstance(v, list): + index = loc[0] + if 0 <= index < len(v): + v[index] = None + + # Handle nested list validation errors (e.g., dict[str, list[str]]) + elif isinstance(loc[0], str) and isinstance(v, dict): + key = loc[0] + if len(loc) > 1 and isinstance(loc[1], int) and key in v and isinstance(v[key], list): + list_index = loc[1] + v[key][list_index] = None + elif key in v: + v.pop(key) + + if isinstance(v, list): + v = [el for el in v if el is not None] + + if isinstance(v, dict): + for key in v.keys(): + if isinstance(v[key], list): + v[key] = [el for el in v[key] if el is not None] + + return handler(v) + + def omit_by_default(field_info: FieldInfo) -> FieldInfo: + """add a wrap validator to omit invalid values by default.""" + field_info.metadata = field_info.metadata or [] + [WrapValidator(ignore_invalid)] + return field_info diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index 56be94409..42e6ee9aa 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -505,11 +505,12 @@ def analyze_param( field_info.alias = alias - if hasattr(field_info, "annotation") and ( + # Omit by default for scalar mapping and scalar sequence mapping query fields + if isinstance(field_info, (params.Query)) and ( field_annotation_is_scalar_sequence_mapping(field_info.annotation) or field_annotation_is_scalar_mapping(field_info.annotation) ): - field_info.annotation = omit_by_default(field_info.annotation) + field_info = omit_by_default(field_info) field = create_model_field( name=param_name, diff --git a/tests/main.py b/tests/main.py index 25646bce3..f65372177 100644 --- a/tests/main.py +++ b/tests/main.py @@ -196,8 +196,8 @@ def get_mapping_query_params(queries: Dict[str, str] = Query({})): @app.get("/query/mixed-params") def get_mixed_mapping_query_params( - sequence_mapping_queries: Dict[str, List[Union[int]]] = Query({}), - mapping_query: Dict[str, int] = Query(), + sequence_mapping_queries: Dict[str, List[int]] = Query({}), + mapping_query: Dict[str, str] = Query(), query: str = Query(), ): return { @@ -214,6 +214,23 @@ def get_sequence_mapping_query_params(queries: Dict[str, List[int]] = Query({})) return {"queries": queries} +@app.get("/query/mixed-type-params") +def get_mixed_mapping_mixed_type_query_params( + sequence_mapping_queries: Dict[str, List[int]] = Query({}), + mapping_query_str: Dict[str, str] = Query({}), + mapping_query_int: Dict[str, int] = Query({}), + query: int = Query(), +): + return { + "queries": { + "query": query, + "mapping_query_str": mapping_query_str, + "mapping_query_int": mapping_query_int, + "sequence_mapping_queries": sequence_mapping_queries, + } + } + + @app.get("/enum-status-code", status_code=http.HTTPStatus.CREATED) def get_enum_status_code(): return "foo bar" diff --git a/tests/test_application.py b/tests/test_application.py index 2a497218b..f40c4a77e 100644 --- a/tests/test_application.py +++ b/tests/test_application.py @@ -55,7 +55,7 @@ def test_enum_status_code_response(): def test_openapi_schema(): response = client.get("/openapi.json") assert response.status_code == 200, response.text - assert response.json() == { + assert response.json()["paths"] == { "openapi": "3.1.0", "info": {"title": "FastAPI", "version": "0.1.0"}, "externalDocs": { @@ -1520,4 +1520,4 @@ def test_openapi_schema(): }, } }, - } + }["paths"] diff --git a/tests/test_query.py b/tests/test_query.py index 102a8a29c..241e12145 100644 --- a/tests/test_query.py +++ b/tests/test_query.py @@ -439,7 +439,7 @@ def test_mapping_with_non_mapping_query(): assert response.json() == { "queries": { "query": "fizz", - "mapping_query": {"foo": 2, "bar": 3}, + "mapping_query": {"foo": "2", "bar": "3"}, "sequence_mapping_queries": { "foo": [1, 2], "bar": [3], From 1121414bf2f362a0e7cc81cd631ded64aadcf9cc Mon Sep 17 00:00:00 2001 From: JONEMI21 Date: Mon, 10 Nov 2025 10:29:45 +0000 Subject: [PATCH 81/91] fmt --- fastapi/_compat/v2.py | 16 +++++++++++++--- tests/main.py | 2 +- tests/test_application.py | 9 ++++++--- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/fastapi/_compat/v2.py b/fastapi/_compat/v2.py index 0b31d47fc..2a9a82df1 100644 --- a/fastapi/_compat/v2.py +++ b/fastapi/_compat/v2.py @@ -510,10 +510,13 @@ if shared.PYDANTIC_VERSION_MINOR_TUPLE >= (2, 6): def omit_by_default(field_info: FieldInfo) -> FieldInfo: """Set omit by default on a FieldInfo's annotation.""" new_annotation = _omit_by_default(field_info.annotation) - new_field_info = copy_field_info(field_info=field_info, annotation=new_annotation) + new_field_info = copy_field_info( + field_info=field_info, annotation=new_annotation + ) return new_field_info else: + def ignore_invalid(v: Any, handler: Callable[[Any], Any]) -> Any: try: return handler(v) @@ -531,7 +534,12 @@ else: # Handle nested list validation errors (e.g., dict[str, list[str]]) elif isinstance(loc[0], str) and isinstance(v, dict): key = loc[0] - if len(loc) > 1 and isinstance(loc[1], int) and key in v and isinstance(v[key], list): + if ( + len(loc) > 1 + and isinstance(loc[1], int) + and key in v + and isinstance(v[key], list) + ): list_index = loc[1] v[key][list_index] = None elif key in v: @@ -549,5 +557,7 @@ else: def omit_by_default(field_info: FieldInfo) -> FieldInfo: """add a wrap validator to omit invalid values by default.""" - field_info.metadata = field_info.metadata or [] + [WrapValidator(ignore_invalid)] + field_info.metadata = field_info.metadata or [] + [ + WrapValidator(ignore_invalid) + ] return field_info diff --git a/tests/main.py b/tests/main.py index f65372177..1ee8687d9 100644 --- a/tests/main.py +++ b/tests/main.py @@ -1,5 +1,5 @@ import http -from typing import Dict, FrozenSet, List, Optional, Union +from typing import Dict, FrozenSet, List, Optional from fastapi import FastAPI, Path, Query diff --git a/tests/test_application.py b/tests/test_application.py index f40c4a77e..cd1713ae1 100644 --- a/tests/test_application.py +++ b/tests/test_application.py @@ -55,7 +55,7 @@ def test_enum_status_code_response(): def test_openapi_schema(): response = client.get("/openapi.json") assert response.status_code == 200, response.text - assert response.json()["paths"] == { + assert response.json() == { "openapi": "3.1.0", "info": {"title": "FastAPI", "version": "0.1.0"}, "externalDocs": { @@ -986,7 +986,10 @@ def test_openapi_schema(): "required": False, "schema": IsDict( { - "anyOf": [{"type": "integer"}, {"type": "null"}], + "anyOf": [ + {"type": "integer"}, + {"type": "null"}, + ], "title": "Query", } ) @@ -1520,4 +1523,4 @@ def test_openapi_schema(): }, } }, - }["paths"] + } From 8472f4addf616aa97796ea417b6ecf249db85450 Mon Sep 17 00:00:00 2001 From: JONEMI21 Date: Mon, 10 Nov 2025 11:14:33 +0000 Subject: [PATCH 82/91] raise error in pydantic v1 --- fastapi/_compat/v1.py | 4 ++++ fastapi/params.py | 1 - 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/fastapi/_compat/v1.py b/fastapi/_compat/v1.py index 1d5c83fa7..7f10293fb 100644 --- a/fastapi/_compat/v1.py +++ b/fastapi/_compat/v1.py @@ -348,3 +348,7 @@ def create_body_model( def get_model_fields(model: Type[BaseModel]) -> List[ModelField]: return list(model.__fields__.values()) # type: ignore[attr-defined] + +def omit_by_default(field_info: FieldInfo) -> FieldInfo: + """add a wrap validator to omit invalid values by default.""" + raise NotImplementedError("This function is a placeholder in Pydantic v1.") diff --git a/fastapi/params.py b/fastapi/params.py index 3d9319030..6a58d5808 100644 --- a/fastapi/params.py +++ b/fastapi/params.py @@ -305,7 +305,6 @@ class Query(Param): # type: ignore[misc] json_schema_extra=json_schema_extra, **extra, ) - self.annotation = self.annotation class Header(Param): # type: ignore[misc] From 4a7f704a07c1a2523ea4e08f712ee99630e09587 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 10 Nov 2025 11:14:44 +0000 Subject: [PATCH 83/91] =?UTF-8?q?=F0=9F=8E=A8=20[pre-commit.ci]=20Auto=20f?= =?UTF-8?q?ormat=20from=20pre-commit.com=20hooks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fastapi/_compat/v1.py | 1 + 1 file changed, 1 insertion(+) diff --git a/fastapi/_compat/v1.py b/fastapi/_compat/v1.py index 7f10293fb..c080f9104 100644 --- a/fastapi/_compat/v1.py +++ b/fastapi/_compat/v1.py @@ -349,6 +349,7 @@ def create_body_model( def get_model_fields(model: Type[BaseModel]) -> List[ModelField]: return list(model.__fields__.values()) # type: ignore[attr-defined] + def omit_by_default(field_info: FieldInfo) -> FieldInfo: """add a wrap validator to omit invalid values by default.""" raise NotImplementedError("This function is a placeholder in Pydantic v1.") From 88d2ace66a46848680df93c470a2f8216f04da80 Mon Sep 17 00:00:00 2001 From: JONEMI21 Date: Mon, 10 Nov 2025 12:23:26 +0000 Subject: [PATCH 84/91] ignore invalid for pydantic v1 --- docs_src/query_params/tutorial007_py310.py | 8 ++- fastapi/_compat/shared.py | 4 ++ fastapi/_compat/v1.py | 54 +++++++++++++++++-- fastapi/_compat/v2.py | 9 ++-- fastapi/dependencies/utils.py | 12 +++-- tests/test_application.py | 9 +--- .../test_tutorial007_py310.py | 8 +-- 7 files changed, 72 insertions(+), 32 deletions(-) diff --git a/docs_src/query_params/tutorial007_py310.py b/docs_src/query_params/tutorial007_py310.py index a88600d5d..44939b620 100644 --- a/docs_src/query_params/tutorial007_py310.py +++ b/docs_src/query_params/tutorial007_py310.py @@ -1,4 +1,4 @@ -from typing import Annotated, Dict, List, Union +from typing import Annotated, Dict, List from fastapi import FastAPI, Query @@ -8,15 +8,13 @@ app = FastAPI() @app.get("/query/mixed-type-params") def get_mixed_mapping_mixed_type_query_params( query: Annotated[int, Query()] = None, - mapping_query_str_or_int: Annotated[ - Union[Dict[str, str], Dict[str, int]], Query() - ] = None, + mapping_query_str: Annotated[Dict[str, str], Query()] = None, mapping_query_int: Annotated[Dict[str, int], Query()] = None, sequence_mapping_int: Annotated[Dict[str, List[int]], Query()] = None, ): return { "query": query, - "mapping_query_str_or_int": mapping_query_str_or_int, + "mapping_query_str": mapping_query_str, "mapping_query_int": mapping_query_int, "sequence_mapping_int": sequence_mapping_int, } diff --git a/fastapi/_compat/shared.py b/fastapi/_compat/shared.py index 84b72adf4..7643b09c3 100644 --- a/fastapi/_compat/shared.py +++ b/fastapi/_compat/shared.py @@ -148,6 +148,8 @@ def field_annotation_is_scalar_mapping( annotation: Union[Type[Any], None], ) -> bool: origin = get_origin(annotation) + if origin is Annotated: + return field_annotation_is_scalar_mapping(get_args(annotation)[0]) if origin is Union or origin is UnionType: at_least_one_scalar_mapping = False for arg in get_args(annotation): @@ -167,6 +169,8 @@ def field_annotation_is_scalar_sequence_mapping( annotation: Union[Type[Any], None], ) -> bool: origin = get_origin(annotation) + if origin is Annotated: + return field_annotation_is_scalar_sequence_mapping(get_args(annotation)[0]) if origin is Union or origin is UnionType: at_least_one_scalar_mapping = False for arg in get_args(annotation): diff --git a/fastapi/_compat/v1.py b/fastapi/_compat/v1.py index c080f9104..fbbec552c 100644 --- a/fastapi/_compat/v1.py +++ b/fastapi/_compat/v1.py @@ -1,4 +1,4 @@ -from copy import copy +from copy import copy, deepcopy from dataclasses import dataclass, is_dataclass from enum import Enum from typing import ( @@ -350,6 +350,54 @@ def get_model_fields(model: Type[BaseModel]) -> List[ModelField]: return list(model.__fields__.values()) # type: ignore[attr-defined] -def omit_by_default(field_info: FieldInfo) -> FieldInfo: +def ignore_invalid(cls, v, values, field, **kwargs) -> Any: + from .may_v1 import _regenerate_error_with_loc + + field_copy = deepcopy(field) + field_copy.pre_validators = [ + validator + for validator in field_copy.pre_validators + if getattr(validator, "__name__", "") != "ignore_invalid" + ] + v, errors = field_copy.validate(v, values, loc=field.name) + if not errors: + return v + + # pop the keys or elements that caused the validation errors and revalidate + for error in _regenerate_error_with_loc(errors=errors, loc_prefix=()): + loc = error["loc"][1:] + if len(loc) == 0: + continue + if isinstance(loc[0], int) and isinstance(v, list): + index = loc[0] + if 0 <= index < len(v): + v[index] = None + + # Handle nested list validation errors (e.g., dict[str, list[str]]) + elif isinstance(loc[0], str) and isinstance(v, dict): + key = loc[0] + if ( + len(loc) > 1 + and isinstance(loc[1], int) + and key in v + and isinstance(v[key], list) + ): + list_index = loc[1] + v[key][list_index] = None + elif key in v: + v.pop(key) + + if isinstance(v, list): + v = [el for el in v if el is not None] + + if isinstance(v, dict): + for key in v.keys(): + if isinstance(v[key], list): + v[key] = [el for el in v[key] if el is not None] + + return v + + +def omit_by_default(field_info: FieldInfo) -> tuple[FieldInfo, dict]: """add a wrap validator to omit invalid values by default.""" - raise NotImplementedError("This function is a placeholder in Pydantic v1.") + return field_info, {"ignore_invalid": Validator(ignore_invalid, pre=True)} diff --git a/fastapi/_compat/v2.py b/fastapi/_compat/v2.py index 2a9a82df1..5f2815ac7 100644 --- a/fastapi/_compat/v2.py +++ b/fastapi/_compat/v2.py @@ -507,13 +507,12 @@ if shared.PYDANTIC_VERSION_MINOR_TUPLE >= (2, 6): else: return OnErrorOmit[annotation] - def omit_by_default(field_info: FieldInfo) -> FieldInfo: - """Set omit by default on a FieldInfo's annotation.""" + def omit_by_default(field_info: FieldInfo) -> tuple[FieldInfo, dict]: new_annotation = _omit_by_default(field_info.annotation) new_field_info = copy_field_info( field_info=field_info, annotation=new_annotation ) - return new_field_info + return new_field_info, {} else: @@ -555,9 +554,9 @@ else: return handler(v) - def omit_by_default(field_info: FieldInfo) -> FieldInfo: + def omit_by_default(field_info: FieldInfo) -> tuple[FieldInfo, dict]: """add a wrap validator to omit invalid values by default.""" field_info.metadata = field_info.metadata or [] + [ WrapValidator(ignore_invalid) ] - return field_info + return field_info, {} diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index 42e6ee9aa..b49998ba7 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -506,11 +506,12 @@ def analyze_param( field_info.alias = alias # Omit by default for scalar mapping and scalar sequence mapping query fields - if isinstance(field_info, (params.Query)) and ( - field_annotation_is_scalar_sequence_mapping(field_info.annotation) - or field_annotation_is_scalar_mapping(field_info.annotation) + class_validators: dict[str, list[Any]] = {} + if isinstance(field_info, (params.Query, temp_pydantic_v1_params.Query)) and ( + field_annotation_is_scalar_sequence_mapping(use_annotation_from_field_info) + or field_annotation_is_scalar_mapping(use_annotation_from_field_info) ): - field_info = omit_by_default(field_info) + field_info, class_validators = omit_by_default(field_info) field = create_model_field( name=param_name, @@ -520,6 +521,7 @@ def analyze_param( required=field_info.default in (RequiredParam, may_v1.RequiredParam, Undefined), field_info=field_info, + class_validators=class_validators, ) if is_path_param: assert is_scalar_field(field=field), ( @@ -529,8 +531,8 @@ def analyze_param( assert ( is_scalar_field(field) or is_scalar_sequence_field(field) - or is_scalar_sequence_mapping_field(field) or is_scalar_mapping_field(field) + or is_scalar_sequence_mapping_field(field) or ( _is_model_class(field.type_) # For Pydantic v1 diff --git a/tests/test_application.py b/tests/test_application.py index cd1713ae1..e1ce9413f 100644 --- a/tests/test_application.py +++ b/tests/test_application.py @@ -1219,14 +1219,7 @@ def test_openapi_schema(): "schema": { "additionalProperties": { "items": { - "anyOf": [ - { - "type": "string", - }, - { - "type": "integer", - }, - ], + "type": "integer", }, "type": "array", }, diff --git a/tests/test_tutorial/test_query_params/test_tutorial007_py310.py b/tests/test_tutorial/test_query_params/test_tutorial007_py310.py index 44cf39ab7..7a39bddc3 100644 --- a/tests/test_tutorial/test_query_params/test_tutorial007_py310.py +++ b/tests/test_tutorial/test_query_params/test_tutorial007_py310.py @@ -1,10 +1,6 @@ import pytest -from fastapi._compat import PYDANTIC_V2 from fastapi.testclient import TestClient -if not PYDANTIC_V2: - pytest.skip("This test is only for Pydantic v2", allow_module_level=True) - @pytest.fixture(name="client") def get_client(): @@ -19,7 +15,7 @@ def test_foo_needy_very(client: TestClient): assert response.status_code == 200 assert response.json() == { "query": 2, - "mapping_query_str_or_int": {"foo": "baz"}, + "mapping_query_str": {"foo": "baz"}, "mapping_query_int": {}, "sequence_mapping_int": {"foo": []}, } @@ -30,7 +26,7 @@ def test_just_string_not_scalar_mapping(client: TestClient): assert response.status_code == 200 assert response.json() == { "query": 2, - "mapping_query_str_or_int": {"bar": "3", "foo": "baz"}, + "mapping_query_str": {"bar": "3", "foo": "baz"}, "mapping_query_int": {"bar": 3}, "sequence_mapping_int": {"bar": [3], "foo": [1, 2]}, } From 535a3ffc5570a8655f11e9504ad4185d8b655d05 Mon Sep 17 00:00:00 2001 From: JONEMI21 Date: Mon, 10 Nov 2025 12:30:50 +0000 Subject: [PATCH 85/91] lint, fmt --- fastapi/_compat/v1.py | 12 ++++++++++-- fastapi/_compat/v2.py | 16 ++++++++++------ fastapi/dependencies/utils.py | 2 +- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/fastapi/_compat/v1.py b/fastapi/_compat/v1.py index fbbec552c..a8b279ae4 100644 --- a/fastapi/_compat/v1.py +++ b/fastapi/_compat/v1.py @@ -350,7 +350,13 @@ def get_model_fields(model: Type[BaseModel]) -> List[ModelField]: return list(model.__fields__.values()) # type: ignore[attr-defined] -def ignore_invalid(cls, v, values, field, **kwargs) -> Any: +def ignore_invalid( + cls: Any, + v: Dict[str, Any], + values: Dict[str, Any], + field: ModelField, + **kwargs: Any, +) -> Any: from .may_v1 import _regenerate_error_with_loc field_copy = deepcopy(field) @@ -398,6 +404,8 @@ def ignore_invalid(cls, v, values, field, **kwargs) -> Any: return v -def omit_by_default(field_info: FieldInfo) -> tuple[FieldInfo, dict]: +def omit_by_default( + field_info: FieldInfo, +) -> Tuple[FieldInfo, Dict[str, Callable[..., Any]]]: """add a wrap validator to omit invalid values by default.""" return field_info, {"ignore_invalid": Validator(ignore_invalid, pre=True)} diff --git a/fastapi/_compat/v2.py b/fastapi/_compat/v2.py index 5f2815ac7..82d248b5d 100644 --- a/fastapi/_compat/v2.py +++ b/fastapi/_compat/v2.py @@ -493,7 +493,7 @@ def get_long_model_name(model: TypeModelOrEnum) -> str: if shared.PYDANTIC_VERSION_MINOR_TUPLE >= (2, 6): # Omit by default for scalar mapping and scalar sequence mapping annotations # added in Pydantic v2.6 https://github.com/pydantic/pydantic/releases/tag/v2.6.0 - def _omit_by_default(annotation): + def _omit_by_default(annotation: Any) -> Any: origin = getattr(annotation, "__origin__", None) args = getattr(annotation, "__args__", ()) @@ -501,13 +501,15 @@ if shared.PYDANTIC_VERSION_MINOR_TUPLE >= (2, 6): new_args = tuple(_omit_by_default(arg) for arg in args) return Union[new_args] elif origin in (list, List): - return List[_omit_by_default(args[0])] + return List[_omit_by_default(args[0])] # type: ignore[misc] elif origin in (dict, Dict): - return Dict[args[0], _omit_by_default(args[1])] + return Dict[args[0], _omit_by_default(args[1])] # type: ignore[misc,valid-type] else: - return OnErrorOmit[annotation] + return OnErrorOmit[annotation] # type: ignore[misc] - def omit_by_default(field_info: FieldInfo) -> tuple[FieldInfo, dict]: + def omit_by_default( + field_info: FieldInfo, + ) -> tuple[FieldInfo, Dict[str, Callable[..., Any]]]: new_annotation = _omit_by_default(field_info.annotation) new_field_info = copy_field_info( field_info=field_info, annotation=new_annotation @@ -554,7 +556,9 @@ else: return handler(v) - def omit_by_default(field_info: FieldInfo) -> tuple[FieldInfo, dict]: + def omit_by_default( + field_info: FieldInfo, + ) -> tuple[FieldInfo, Dict[str, Callable[..., Any]]]: """add a wrap validator to omit invalid values by default.""" field_info.metadata = field_info.metadata or [] + [ WrapValidator(ignore_invalid) diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index b49998ba7..062719da9 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -506,7 +506,7 @@ def analyze_param( field_info.alias = alias # Omit by default for scalar mapping and scalar sequence mapping query fields - class_validators: dict[str, list[Any]] = {} + class_validators: Dict[str, Callable[..., Any]] = {} if isinstance(field_info, (params.Query, temp_pydantic_v1_params.Query)) and ( field_annotation_is_scalar_sequence_mapping(use_annotation_from_field_info) or field_annotation_is_scalar_mapping(use_annotation_from_field_info) From ac4de767227000320c036924db459bc4cb791cfb Mon Sep 17 00:00:00 2001 From: JONEMI21 Date: Mon, 10 Nov 2025 12:34:15 +0000 Subject: [PATCH 86/91] mark as needing 3 10 --- .../test_query_params/test_tutorial007_py310.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/test_tutorial/test_query_params/test_tutorial007_py310.py b/tests/test_tutorial/test_query_params/test_tutorial007_py310.py index 7a39bddc3..d2d0cdb27 100644 --- a/tests/test_tutorial/test_query_params/test_tutorial007_py310.py +++ b/tests/test_tutorial/test_query_params/test_tutorial007_py310.py @@ -1,8 +1,9 @@ -import pytest from fastapi.testclient import TestClient +from tests.utils import needs_py310 -@pytest.fixture(name="client") + +@needs_py310 def get_client(): from docs_src.query_params.tutorial007_py310 import app From 983c112c61e0866165ddf02a5315ddeddc7c1806 Mon Sep 17 00:00:00 2001 From: JONEMI21 Date: Mon, 10 Nov 2025 12:38:05 +0000 Subject: [PATCH 87/91] fix fixture --- .../test_tutorial/test_query_params/test_tutorial007_py310.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/test_tutorial/test_query_params/test_tutorial007_py310.py b/tests/test_tutorial/test_query_params/test_tutorial007_py310.py index d2d0cdb27..28a84de0d 100644 --- a/tests/test_tutorial/test_query_params/test_tutorial007_py310.py +++ b/tests/test_tutorial/test_query_params/test_tutorial007_py310.py @@ -1,9 +1,10 @@ +import pytest from fastapi.testclient import TestClient from tests.utils import needs_py310 -@needs_py310 +@pytest.fixture(name="client", marks=[needs_py310]) def get_client(): from docs_src.query_params.tutorial007_py310 import app From b4afab0f160f67a3aa3a83d7e8dca0d8a01a0e82 Mon Sep 17 00:00:00 2001 From: JONEMI21 Date: Mon, 10 Nov 2025 12:40:17 +0000 Subject: [PATCH 88/91] apply fixture --- .../test_query_params/test_tutorial007_py310.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_tutorial/test_query_params/test_tutorial007_py310.py b/tests/test_tutorial/test_query_params/test_tutorial007_py310.py index 28a84de0d..7728b8bcc 100644 --- a/tests/test_tutorial/test_query_params/test_tutorial007_py310.py +++ b/tests/test_tutorial/test_query_params/test_tutorial007_py310.py @@ -4,14 +4,14 @@ from fastapi.testclient import TestClient from tests.utils import needs_py310 -@pytest.fixture(name="client", marks=[needs_py310]) +@pytest.fixture(name="client") def get_client(): from docs_src.query_params.tutorial007_py310 import app c = TestClient(app) return c - +@needs_py310 def test_foo_needy_very(client: TestClient): response = client.get("/query/mixed-type-params?query=1&query=2&foo=bar&foo=baz") assert response.status_code == 200 @@ -22,7 +22,7 @@ def test_foo_needy_very(client: TestClient): "sequence_mapping_int": {"foo": []}, } - +@needs_py310 def test_just_string_not_scalar_mapping(client: TestClient): response = client.get("/query/mixed-type-params?&query=2&foo=1&bar=3&foo=2&foo=baz") assert response.status_code == 200 From e4917eac00c57e56deb726bc0e78a9e6935112f5 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 10 Nov 2025 12:40:28 +0000 Subject: [PATCH 89/91] =?UTF-8?q?=F0=9F=8E=A8=20[pre-commit.ci]=20Auto=20f?= =?UTF-8?q?ormat=20from=20pre-commit.com=20hooks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_tutorial/test_query_params/test_tutorial007_py310.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/test_tutorial/test_query_params/test_tutorial007_py310.py b/tests/test_tutorial/test_query_params/test_tutorial007_py310.py index 7728b8bcc..fe9827c8c 100644 --- a/tests/test_tutorial/test_query_params/test_tutorial007_py310.py +++ b/tests/test_tutorial/test_query_params/test_tutorial007_py310.py @@ -11,6 +11,7 @@ def get_client(): c = TestClient(app) return c + @needs_py310 def test_foo_needy_very(client: TestClient): response = client.get("/query/mixed-type-params?query=1&query=2&foo=bar&foo=baz") @@ -22,6 +23,7 @@ def test_foo_needy_very(client: TestClient): "sequence_mapping_int": {"foo": []}, } + @needs_py310 def test_just_string_not_scalar_mapping(client: TestClient): response = client.get("/query/mixed-type-params?&query=2&foo=1&bar=3&foo=2&foo=baz") From 3390ee06700e01659abb06fab205e28b78cafac0 Mon Sep 17 00:00:00 2001 From: JONEMI21 Date: Mon, 10 Nov 2025 12:45:22 +0000 Subject: [PATCH 90/91] replace tuple with Tuple --- fastapi/_compat/v2.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fastapi/_compat/v2.py b/fastapi/_compat/v2.py index 82d248b5d..dd532af79 100644 --- a/fastapi/_compat/v2.py +++ b/fastapi/_compat/v2.py @@ -509,7 +509,7 @@ if shared.PYDANTIC_VERSION_MINOR_TUPLE >= (2, 6): def omit_by_default( field_info: FieldInfo, - ) -> tuple[FieldInfo, Dict[str, Callable[..., Any]]]: + ) -> Tuple[FieldInfo, Dict[str, Callable[..., Any]]]: new_annotation = _omit_by_default(field_info.annotation) new_field_info = copy_field_info( field_info=field_info, annotation=new_annotation @@ -558,7 +558,7 @@ else: def omit_by_default( field_info: FieldInfo, - ) -> tuple[FieldInfo, Dict[str, Callable[..., Any]]]: + ) -> Tuple[FieldInfo, Dict[str, Callable[..., Any]]]: """add a wrap validator to omit invalid values by default.""" field_info.metadata = field_info.metadata or [] + [ WrapValidator(ignore_invalid) From 866f28361b2dcddc4cb8276f6a438fe540c92c09 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci-lite[bot]" <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Date: Tue, 2 Dec 2025 18:26:07 +0000 Subject: [PATCH 91/91] =?UTF-8?q?=F0=9F=8E=A8=20Auto=20format?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/tutorial/query-params.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/docs/tutorial/query-params.md b/docs/en/docs/tutorial/query-params.md index 1506f5e2e..6f34b952b 100644 --- a/docs/en/docs/tutorial/query-params.md +++ b/docs/en/docs/tutorial/query-params.md @@ -187,7 +187,7 @@ You could also use `Enum`s the same way as with [Path Parameters](path-params.md /// -## Free Form Query Parameters +## Free Form Query Parameters { #free-form-query-parameters } Sometimes you want to receive some query parameters, but you don't know in advance what they are called. **FastAPI** provides support for this use case as well.