Skip to content

Commit b20789b

Browse files
dbantysupermihi
andauthored
feat: Allow enums in headers [#663, #667]. Thanks @supermihi!
Co-authored-by: Michael Helmling <[email protected]> Co-authored-by: Dylan Anthony <[email protected]>
1 parent b03be16 commit b20789b

File tree

7 files changed

+82
-0
lines changed

7 files changed

+82
-0
lines changed

end_to_end_tests/golden-record/my_test_api_client/api/location/get_location_header_types.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import httpx
44

55
from ...client import Client
6+
from ...models.get_location_header_types_int_enum_header import GetLocationHeaderTypesIntEnumHeader
7+
from ...models.get_location_header_types_string_enum_header import GetLocationHeaderTypesStringEnumHeader
68
from ...types import UNSET, Response, Unset
79

810

@@ -13,6 +15,8 @@ def _get_kwargs(
1315
string_header: Union[Unset, str] = UNSET,
1416
number_header: Union[Unset, float] = UNSET,
1517
integer_header: Union[Unset, int] = UNSET,
18+
int_enum_header: Union[Unset, GetLocationHeaderTypesIntEnumHeader] = UNSET,
19+
string_enum_header: Union[Unset, GetLocationHeaderTypesStringEnumHeader] = UNSET,
1620
) -> Dict[str, Any]:
1721
url = "{}/location/header/types".format(client.base_url)
1822

@@ -31,6 +35,12 @@ def _get_kwargs(
3135
if not isinstance(integer_header, Unset):
3236
headers["Integer-Header"] = str(integer_header)
3337

38+
if not isinstance(int_enum_header, Unset):
39+
headers["Int-Enum-Header"] = str(int_enum_header)
40+
41+
if not isinstance(string_enum_header, Unset):
42+
headers["String-Enum-Header"] = str(string_enum_header)
43+
3444
return {
3545
"method": "get",
3646
"url": url,
@@ -56,13 +66,17 @@ def sync_detailed(
5666
string_header: Union[Unset, str] = UNSET,
5767
number_header: Union[Unset, float] = UNSET,
5868
integer_header: Union[Unset, int] = UNSET,
69+
int_enum_header: Union[Unset, GetLocationHeaderTypesIntEnumHeader] = UNSET,
70+
string_enum_header: Union[Unset, GetLocationHeaderTypesStringEnumHeader] = UNSET,
5971
) -> Response[Any]:
6072
"""
6173
Args:
6274
boolean_header (Union[Unset, bool]):
6375
string_header (Union[Unset, str]):
6476
number_header (Union[Unset, float]):
6577
integer_header (Union[Unset, int]):
78+
int_enum_header (Union[Unset, GetLocationHeaderTypesIntEnumHeader]):
79+
string_enum_header (Union[Unset, GetLocationHeaderTypesStringEnumHeader]):
6680
6781
Returns:
6882
Response[Any]
@@ -74,6 +88,8 @@ def sync_detailed(
7488
string_header=string_header,
7589
number_header=number_header,
7690
integer_header=integer_header,
91+
int_enum_header=int_enum_header,
92+
string_enum_header=string_enum_header,
7793
)
7894

7995
response = httpx.request(
@@ -91,13 +107,17 @@ async def asyncio_detailed(
91107
string_header: Union[Unset, str] = UNSET,
92108
number_header: Union[Unset, float] = UNSET,
93109
integer_header: Union[Unset, int] = UNSET,
110+
int_enum_header: Union[Unset, GetLocationHeaderTypesIntEnumHeader] = UNSET,
111+
string_enum_header: Union[Unset, GetLocationHeaderTypesStringEnumHeader] = UNSET,
94112
) -> Response[Any]:
95113
"""
96114
Args:
97115
boolean_header (Union[Unset, bool]):
98116
string_header (Union[Unset, str]):
99117
number_header (Union[Unset, float]):
100118
integer_header (Union[Unset, int]):
119+
int_enum_header (Union[Unset, GetLocationHeaderTypesIntEnumHeader]):
120+
string_enum_header (Union[Unset, GetLocationHeaderTypesStringEnumHeader]):
101121
102122
Returns:
103123
Response[Any]
@@ -109,6 +129,8 @@ async def asyncio_detailed(
109129
string_header=string_header,
110130
number_header=number_header,
111131
integer_header=integer_header,
132+
int_enum_header=int_enum_header,
133+
string_enum_header=string_enum_header,
112134
)
113135

114136
async with httpx.AsyncClient(verify=client.verify_ssl) as _client:

end_to_end_tests/golden-record/my_test_api_client/models/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
from .body_upload_file_tests_upload_post_some_optional_object import BodyUploadFileTestsUploadPostSomeOptionalObject
2020
from .different_enum import DifferentEnum
2121
from .free_form_model import FreeFormModel
22+
from .get_location_header_types_int_enum_header import GetLocationHeaderTypesIntEnumHeader
23+
from .get_location_header_types_string_enum_header import GetLocationHeaderTypesStringEnumHeader
2224
from .http_validation_error import HTTPValidationError
2325
from .import_ import Import
2426
from .model_from_all_of import ModelFromAllOf
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from enum import IntEnum
2+
3+
4+
class GetLocationHeaderTypesIntEnumHeader(IntEnum):
5+
VALUE_1 = 1
6+
VALUE_2 = 2
7+
VALUE_3 = 3
8+
9+
def __str__(self) -> str:
10+
return str(self.value)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from enum import Enum
2+
3+
4+
class GetLocationHeaderTypesStringEnumHeader(str, Enum):
5+
ONE = "one"
6+
TWO = "two"
7+
THREE = "three"
8+
9+
def __str__(self) -> str:
10+
return str(self.value)

end_to_end_tests/openapi.json

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1049,6 +1049,32 @@
10491049
},
10501050
"name": "Integer-Header",
10511051
"in": "header"
1052+
},
1053+
{
1054+
"in": "header",
1055+
"name": "Int-Enum-Header",
1056+
"required": false,
1057+
"schema": {
1058+
"type": "integer",
1059+
"enum": [
1060+
1,
1061+
2,
1062+
3
1063+
]
1064+
}
1065+
},
1066+
{
1067+
"in": "header",
1068+
"name": "String-Enum-Header",
1069+
"required": false,
1070+
"schema": {
1071+
"type": "string",
1072+
"enum": [
1073+
"one",
1074+
"two",
1075+
"three"
1076+
]
1077+
}
10521078
}
10531079
],
10541080
"responses": {

openapi_python_client/parser/properties/enum_property.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import attr
66

7+
from ... import schema as oai
78
from ... import utils
89
from .property import Property
910
from .schemas import Class
@@ -22,6 +23,13 @@ class EnumProperty(Property):
2223

2324
template: ClassVar[str] = "enum_property.py.jinja"
2425

26+
_allowed_locations: ClassVar[Set[oai.ParameterLocation]] = {
27+
oai.ParameterLocation.QUERY,
28+
oai.ParameterLocation.PATH,
29+
oai.ParameterLocation.COOKIE,
30+
oai.ParameterLocation.HEADER,
31+
}
32+
2533
def get_base_type_string(self) -> str:
2634
return self.class_info.name
2735

openapi_python_client/templates/property_templates/enum_property.py.jinja

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,7 @@ if not isinstance({{ source }}, Unset):
3333
{% endif %}
3434
{% endif %}
3535
{% endmacro %}
36+
37+
{% macro transform_header(property, source, destination) %}
38+
{{ destination }} = str({{ source }})
39+
{% endmacro %}

0 commit comments

Comments
 (0)