From fe0313143f4d24030376e1413a8b8f5cc6d9ff1a Mon Sep 17 00:00:00 2001 From: Robert Schweizer Date: Wed, 15 Mar 2023 19:09:41 +0100 Subject: [PATCH] fix: Respect `required` field in parameters included with `$ref` --- .../get_parameter_references_path_param.py | 50 ++++++++++--------- .../parser/properties/schemas.py | 5 +- .../test_properties/test_schemas.py | 12 ++--- 3 files changed, 31 insertions(+), 36 deletions(-) diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/parameter_references/get_parameter_references_path_param.py b/end_to_end_tests/golden-record/my_test_api_client/api/parameter_references/get_parameter_references_path_param.py index bdb518de5..9544b9434 100644 --- a/end_to_end_tests/golden-record/my_test_api_client/api/parameter_references/get_parameter_references_path_param.py +++ b/end_to_end_tests/golden-record/my_test_api_client/api/parameter_references/get_parameter_references_path_param.py @@ -1,30 +1,32 @@ from http import HTTPStatus -from typing import Any, Dict, Optional +from typing import Any, Dict, Optional, Union import httpx from ... import errors from ...client import Client -from ...types import UNSET, Response +from ...types import UNSET, Response, Unset def _get_kwargs( path_param: str, *, client: Client, - string_param: str, - integer_param: int = 0, - header_param: str, - cookie_param: str, + string_param: Union[Unset, None, str] = UNSET, + integer_param: Union[Unset, None, int] = 0, + header_param: Union[Unset, str] = UNSET, + cookie_param: Union[Unset, str] = UNSET, ) -> Dict[str, Any]: url = "{}/parameter-references/{path_param}".format(client.base_url, path_param=path_param) headers: Dict[str, str] = client.get_headers() cookies: Dict[str, Any] = client.get_cookies() - headers["header param"] = header_param + if not isinstance(header_param, Unset): + headers["header param"] = header_param - cookies["cookie param"] = cookie_param + if cookie_param is not UNSET: + cookies["cookie param"] = cookie_param params: Dict[str, Any] = {} params["string param"] = string_param @@ -65,19 +67,19 @@ def sync_detailed( path_param: str, *, client: Client, - string_param: str, - integer_param: int = 0, - header_param: str, - cookie_param: str, + string_param: Union[Unset, None, str] = UNSET, + integer_param: Union[Unset, None, int] = 0, + header_param: Union[Unset, str] = UNSET, + cookie_param: Union[Unset, str] = UNSET, ) -> Response[Any]: """Test different types of parameter references Args: path_param (str): - string_param (str): - integer_param (int): - header_param (str): - cookie_param (str): + string_param (Union[Unset, None, str]): + integer_param (Union[Unset, None, int]): + header_param (Union[Unset, str]): + cookie_param (Union[Unset, str]): Raises: errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. @@ -108,19 +110,19 @@ async def asyncio_detailed( path_param: str, *, client: Client, - string_param: str, - integer_param: int = 0, - header_param: str, - cookie_param: str, + string_param: Union[Unset, None, str] = UNSET, + integer_param: Union[Unset, None, int] = 0, + header_param: Union[Unset, str] = UNSET, + cookie_param: Union[Unset, str] = UNSET, ) -> Response[Any]: """Test different types of parameter references Args: path_param (str): - string_param (str): - integer_param (int): - header_param (str): - cookie_param (str): + string_param (Union[Unset, None, str]): + integer_param (Union[Unset, None, int]): + header_param (Union[Unset, str]): + cookie_param (Union[Unset, str]): Raises: errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. diff --git a/openapi_python_client/parser/properties/schemas.py b/openapi_python_client/parser/properties/schemas.py index fd1af5c08..f3c27a91e 100644 --- a/openapi_python_client/parser/properties/schemas.py +++ b/openapi_python_client/parser/properties/schemas.py @@ -147,7 +147,6 @@ class Parameters: def parameter_from_data( *, name: str, - required: bool, data: Union[oai.Reference, oai.Parameter], parameters: Parameters, ) -> Tuple[Union[Parameter, ParameterError], Parameters]: @@ -161,7 +160,7 @@ def parameter_from_data( new_param = Parameter( name=name, - required=required, + required=data.required, explode=data.explode, style=data.style, param_schema=data.param_schema, @@ -188,7 +187,7 @@ def update_parameters_with_data( See Also: - https://swagger.io/docs/specification/using-ref/ """ - param, parameters = parameter_from_data(data=data, name=data.name, parameters=parameters, required=True) + param, parameters = parameter_from_data(data=data, name=data.name, parameters=parameters) if isinstance(param, ParameterError): param.detail = f"{param.header}: {param.detail}" diff --git a/tests/test_parser/test_properties/test_schemas.py b/tests/test_parser/test_properties/test_schemas.py index 629286cae..13e23fe1f 100644 --- a/tests/test_parser/test_properties/test_schemas.py +++ b/tests/test_parser/test_properties/test_schemas.py @@ -48,9 +48,7 @@ def test_cannot_parse_parameters_by_reference(self): ref = Reference.construct(ref="#/components/parameters/a_param") parameters = Parameters() - param_or_error, new_parameters = parameter_from_data( - name="a_param", required=True, data=ref, parameters=parameters - ) + param_or_error, new_parameters = parameter_from_data(name="a_param", data=ref, parameters=parameters) assert param_or_error == ParameterError("Unable to resolve another reference") assert new_parameters == parameters @@ -61,9 +59,7 @@ def test_parameters_without_schema_are_ignored(self): param = Parameter(name="a_schemaless_param", param_in=ParameterLocation.QUERY) parameters = Parameters() - param_or_error, new_parameters = parameter_from_data( - name=param.name, required=param.required, data=param, parameters=parameters - ) + param_or_error, new_parameters = parameter_from_data(name=param.name, data=param, parameters=parameters) assert param_or_error == ParameterError("Parameter has no schema") assert new_parameters == parameters @@ -74,9 +70,7 @@ def test_registers_new_parameters(self): param = Parameter.construct(name="a_param", param_in=ParameterLocation.QUERY, param_schema=Schema.construct()) parameters = Parameters() - param_or_error, new_parameters = parameter_from_data( - name=param.name, required=param.required, data=param, parameters=parameters - ) + param_or_error, new_parameters = parameter_from_data(name=param.name, data=param, parameters=parameters) assert param_or_error == param assert new_parameters.classes_by_name[param.name] == param