From c08dcccd9b4bf3b7e98cfad33a12f074f6d9b578 Mon Sep 17 00:00:00 2001 From: Michael Helmling Date: Fri, 26 Aug 2022 15:23:34 +0200 Subject: [PATCH 1/2] feat: allow enums in header parameters (the currently supported) enums are int and string only, there's no reason not to allow them in headers (which is actually used in the wild). --- openapi_python_client/parser/properties/enum_property.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/openapi_python_client/parser/properties/enum_property.py b/openapi_python_client/parser/properties/enum_property.py index fe704eefd..39b89a2bc 100644 --- a/openapi_python_client/parser/properties/enum_property.py +++ b/openapi_python_client/parser/properties/enum_property.py @@ -4,6 +4,7 @@ import attr +from ... import schema as oai from ... import utils from .property import Property from .schemas import Class @@ -22,6 +23,13 @@ class EnumProperty(Property): template: ClassVar[str] = "enum_property.py.jinja" + _allowed_locations: ClassVar[Set[oai.ParameterLocation]] = { + oai.ParameterLocation.QUERY, + oai.ParameterLocation.PATH, + oai.ParameterLocation.COOKIE, + oai.ParameterLocation.HEADER, + } + def get_base_type_string(self) -> str: return self.class_info.name From fe9b2c5c975efebe4d9890013d4d63d3eb96b4ac Mon Sep 17 00:00:00 2001 From: Dylan Anthony Date: Sat, 27 Aug 2022 13:45:15 -0600 Subject: [PATCH 2/2] fix: Add template support for enum headers. --- .../api/location/get_location_header_types.py | 22 ++++++++++++++++ .../my_test_api_client/models/__init__.py | 2 ++ ...t_location_header_types_int_enum_header.py | 10 +++++++ ...ocation_header_types_string_enum_header.py | 10 +++++++ end_to_end_tests/openapi.json | 26 +++++++++++++++++++ .../property_templates/enum_property.py.jinja | 4 +++ 6 files changed, 74 insertions(+) create mode 100644 end_to_end_tests/golden-record/my_test_api_client/models/get_location_header_types_int_enum_header.py create mode 100644 end_to_end_tests/golden-record/my_test_api_client/models/get_location_header_types_string_enum_header.py diff --git a/end_to_end_tests/golden-record/my_test_api_client/api/location/get_location_header_types.py b/end_to_end_tests/golden-record/my_test_api_client/api/location/get_location_header_types.py index 1edce3582..5495d78dd 100644 --- a/end_to_end_tests/golden-record/my_test_api_client/api/location/get_location_header_types.py +++ b/end_to_end_tests/golden-record/my_test_api_client/api/location/get_location_header_types.py @@ -3,6 +3,8 @@ import httpx from ...client import Client +from ...models.get_location_header_types_int_enum_header import GetLocationHeaderTypesIntEnumHeader +from ...models.get_location_header_types_string_enum_header import GetLocationHeaderTypesStringEnumHeader from ...types import UNSET, Response, Unset @@ -13,6 +15,8 @@ def _get_kwargs( string_header: Union[Unset, str] = UNSET, number_header: Union[Unset, float] = UNSET, integer_header: Union[Unset, int] = UNSET, + int_enum_header: Union[Unset, GetLocationHeaderTypesIntEnumHeader] = UNSET, + string_enum_header: Union[Unset, GetLocationHeaderTypesStringEnumHeader] = UNSET, ) -> Dict[str, Any]: url = "{}/location/header/types".format(client.base_url) @@ -31,6 +35,12 @@ def _get_kwargs( if not isinstance(integer_header, Unset): headers["Integer-Header"] = str(integer_header) + if not isinstance(int_enum_header, Unset): + headers["Int-Enum-Header"] = str(int_enum_header) + + if not isinstance(string_enum_header, Unset): + headers["String-Enum-Header"] = str(string_enum_header) + return { "method": "get", "url": url, @@ -56,6 +66,8 @@ def sync_detailed( string_header: Union[Unset, str] = UNSET, number_header: Union[Unset, float] = UNSET, integer_header: Union[Unset, int] = UNSET, + int_enum_header: Union[Unset, GetLocationHeaderTypesIntEnumHeader] = UNSET, + string_enum_header: Union[Unset, GetLocationHeaderTypesStringEnumHeader] = UNSET, ) -> Response[Any]: """ Args: @@ -63,6 +75,8 @@ def sync_detailed( string_header (Union[Unset, str]): number_header (Union[Unset, float]): integer_header (Union[Unset, int]): + int_enum_header (Union[Unset, GetLocationHeaderTypesIntEnumHeader]): + string_enum_header (Union[Unset, GetLocationHeaderTypesStringEnumHeader]): Returns: Response[Any] @@ -74,6 +88,8 @@ def sync_detailed( string_header=string_header, number_header=number_header, integer_header=integer_header, + int_enum_header=int_enum_header, + string_enum_header=string_enum_header, ) response = httpx.request( @@ -91,6 +107,8 @@ async def asyncio_detailed( string_header: Union[Unset, str] = UNSET, number_header: Union[Unset, float] = UNSET, integer_header: Union[Unset, int] = UNSET, + int_enum_header: Union[Unset, GetLocationHeaderTypesIntEnumHeader] = UNSET, + string_enum_header: Union[Unset, GetLocationHeaderTypesStringEnumHeader] = UNSET, ) -> Response[Any]: """ Args: @@ -98,6 +116,8 @@ async def asyncio_detailed( string_header (Union[Unset, str]): number_header (Union[Unset, float]): integer_header (Union[Unset, int]): + int_enum_header (Union[Unset, GetLocationHeaderTypesIntEnumHeader]): + string_enum_header (Union[Unset, GetLocationHeaderTypesStringEnumHeader]): Returns: Response[Any] @@ -109,6 +129,8 @@ async def asyncio_detailed( string_header=string_header, number_header=number_header, integer_header=integer_header, + int_enum_header=int_enum_header, + string_enum_header=string_enum_header, ) async with httpx.AsyncClient(verify=client.verify_ssl) as _client: diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/__init__.py b/end_to_end_tests/golden-record/my_test_api_client/models/__init__.py index f34a171f6..999099d2d 100644 --- a/end_to_end_tests/golden-record/my_test_api_client/models/__init__.py +++ b/end_to_end_tests/golden-record/my_test_api_client/models/__init__.py @@ -19,6 +19,8 @@ from .body_upload_file_tests_upload_post_some_optional_object import BodyUploadFileTestsUploadPostSomeOptionalObject from .different_enum import DifferentEnum from .free_form_model import FreeFormModel +from .get_location_header_types_int_enum_header import GetLocationHeaderTypesIntEnumHeader +from .get_location_header_types_string_enum_header import GetLocationHeaderTypesStringEnumHeader from .http_validation_error import HTTPValidationError from .import_ import Import from .model_from_all_of import ModelFromAllOf diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/get_location_header_types_int_enum_header.py b/end_to_end_tests/golden-record/my_test_api_client/models/get_location_header_types_int_enum_header.py new file mode 100644 index 000000000..d3c23f16b --- /dev/null +++ b/end_to_end_tests/golden-record/my_test_api_client/models/get_location_header_types_int_enum_header.py @@ -0,0 +1,10 @@ +from enum import IntEnum + + +class GetLocationHeaderTypesIntEnumHeader(IntEnum): + VALUE_1 = 1 + VALUE_2 = 2 + VALUE_3 = 3 + + def __str__(self) -> str: + return str(self.value) diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/get_location_header_types_string_enum_header.py b/end_to_end_tests/golden-record/my_test_api_client/models/get_location_header_types_string_enum_header.py new file mode 100644 index 000000000..b5dbd4ff8 --- /dev/null +++ b/end_to_end_tests/golden-record/my_test_api_client/models/get_location_header_types_string_enum_header.py @@ -0,0 +1,10 @@ +from enum import Enum + + +class GetLocationHeaderTypesStringEnumHeader(str, Enum): + ONE = "one" + TWO = "two" + THREE = "three" + + def __str__(self) -> str: + return str(self.value) diff --git a/end_to_end_tests/openapi.json b/end_to_end_tests/openapi.json index efae13e86..675e97b1e 100644 --- a/end_to_end_tests/openapi.json +++ b/end_to_end_tests/openapi.json @@ -1049,6 +1049,32 @@ }, "name": "Integer-Header", "in": "header" + }, + { + "in": "header", + "name": "Int-Enum-Header", + "required": false, + "schema": { + "type": "integer", + "enum": [ + 1, + 2, + 3 + ] + } + }, + { + "in": "header", + "name": "String-Enum-Header", + "required": false, + "schema": { + "type": "string", + "enum": [ + "one", + "two", + "three" + ] + } } ], "responses": { diff --git a/openapi_python_client/templates/property_templates/enum_property.py.jinja b/openapi_python_client/templates/property_templates/enum_property.py.jinja index ffc07dd12..52418a182 100644 --- a/openapi_python_client/templates/property_templates/enum_property.py.jinja +++ b/openapi_python_client/templates/property_templates/enum_property.py.jinja @@ -33,3 +33,7 @@ if not isinstance({{ source }}, Unset): {% endif %} {% endif %} {% endmacro %} + +{% macro transform_header(property, source, destination) %} +{{ destination }} = str({{ source }}) +{% endmacro %}