Skip to content

Commit 2c4fdf8

Browse files
Merge upstream/main
2 parents 43969ae + 661de57 commit 2c4fdf8

File tree

7 files changed

+46
-4
lines changed

7 files changed

+46
-4
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
2121
- Attempt to detect and alert users if they are using an unsupported version of OpenAPI (#281).
2222
- Fixes `Enum` deserialization when the value is `UNSET`.
2323
- Add handling of application/vnd.api+json media type.
24+
- Support passing models into query parameters (#316). Thanks @forest-benchling!
2425

2526
### Changes
2627

end_to_end_tests/golden-record-custom/custom_e2e/api/tests/defaults_tests_defaults_post.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ def httpx_request(
5555
union_prop_with_ref: Union[AnEnum, Unset, float] = 0.6,
5656
enum_prop: Union[Unset, AnEnum] = UNSET,
5757
model_prop: Union[Unset, ModelWithUnionProperty] = UNSET,
58+
required_model_prop: ModelWithUnionProperty,
5859
) -> Response[Union[None, HTTPValidationError]]:
5960

6061
json_not_required_not_nullable_datetime_prop: Union[Unset, str] = UNSET
@@ -110,6 +111,8 @@ def httpx_request(
110111
if not isinstance(model_prop, Unset):
111112
json_model_prop = model_prop.to_dict()
112113

114+
json_required_model_prop = required_model_prop.to_dict()
115+
113116
params: Dict[str, Any] = {
114117
"string_prop": string_prop,
115118
"not_required_not_nullable_datetime_prop": json_not_required_not_nullable_datetime_prop,
@@ -124,8 +127,10 @@ def httpx_request(
124127
"union_prop": json_union_prop,
125128
"union_prop_with_ref": json_union_prop_with_ref,
126129
"enum_prop": json_enum_prop,
127-
"model_prop": json_model_prop,
128130
}
131+
if not isinstance(json_model_prop, Unset):
132+
params.update(json_model_prop)
133+
params.update(json_required_model_prop)
129134
params = {k: v for k, v in params.items() if v is not UNSET and v is not None}
130135

131136
response = client.request(

end_to_end_tests/golden-record/my_test_api_client/api/tests/defaults_tests_defaults_post.py

+14-1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ def _get_kwargs(
2828
union_prop_with_ref: Union[AnEnum, Unset, float] = 0.6,
2929
enum_prop: Union[Unset, AnEnum] = UNSET,
3030
model_prop: Union[Unset, ModelWithUnionProperty] = UNSET,
31+
required_model_prop: ModelWithUnionProperty,
3132
) -> Dict[str, Any]:
3233
url = "{}/tests/defaults".format(client.base_url)
3334

@@ -86,6 +87,8 @@ def _get_kwargs(
8687
if not isinstance(model_prop, Unset):
8788
json_model_prop = model_prop.to_dict()
8889

90+
json_required_model_prop = required_model_prop.to_dict()
91+
8992
params: Dict[str, Any] = {
9093
"string_prop": string_prop,
9194
"not_required_not_nullable_datetime_prop": json_not_required_not_nullable_datetime_prop,
@@ -100,8 +103,10 @@ def _get_kwargs(
100103
"union_prop": json_union_prop,
101104
"union_prop_with_ref": json_union_prop_with_ref,
102105
"enum_prop": json_enum_prop,
103-
"model_prop": json_model_prop,
104106
}
107+
if not isinstance(json_model_prop, Unset):
108+
params.update(json_model_prop)
109+
params.update(json_required_model_prop)
105110
params = {k: v for k, v in params.items() if v is not UNSET and v is not None}
106111

107112
return {
@@ -151,6 +156,7 @@ def sync_detailed(
151156
union_prop_with_ref: Union[AnEnum, Unset, float] = 0.6,
152157
enum_prop: Union[Unset, AnEnum] = UNSET,
153158
model_prop: Union[Unset, ModelWithUnionProperty] = UNSET,
159+
required_model_prop: ModelWithUnionProperty,
154160
) -> Response[Union[None, HTTPValidationError]]:
155161
kwargs = _get_kwargs(
156162
client=client,
@@ -168,6 +174,7 @@ def sync_detailed(
168174
union_prop_with_ref=union_prop_with_ref,
169175
enum_prop=enum_prop,
170176
model_prop=model_prop,
177+
required_model_prop=required_model_prop,
171178
)
172179

173180
response = httpx.post(
@@ -194,6 +201,7 @@ def sync(
194201
union_prop_with_ref: Union[AnEnum, Unset, float] = 0.6,
195202
enum_prop: Union[Unset, AnEnum] = UNSET,
196203
model_prop: Union[Unset, ModelWithUnionProperty] = UNSET,
204+
required_model_prop: ModelWithUnionProperty,
197205
) -> Optional[Union[None, HTTPValidationError]]:
198206
""" """
199207

@@ -213,6 +221,7 @@ def sync(
213221
union_prop_with_ref=union_prop_with_ref,
214222
enum_prop=enum_prop,
215223
model_prop=model_prop,
224+
required_model_prop=required_model_prop,
216225
).parsed
217226

218227

@@ -233,6 +242,7 @@ async def asyncio_detailed(
233242
union_prop_with_ref: Union[AnEnum, Unset, float] = 0.6,
234243
enum_prop: Union[Unset, AnEnum] = UNSET,
235244
model_prop: Union[Unset, ModelWithUnionProperty] = UNSET,
245+
required_model_prop: ModelWithUnionProperty,
236246
) -> Response[Union[None, HTTPValidationError]]:
237247
kwargs = _get_kwargs(
238248
client=client,
@@ -250,6 +260,7 @@ async def asyncio_detailed(
250260
union_prop_with_ref=union_prop_with_ref,
251261
enum_prop=enum_prop,
252262
model_prop=model_prop,
263+
required_model_prop=required_model_prop,
253264
)
254265

255266
async with httpx.AsyncClient() as _client:
@@ -275,6 +286,7 @@ async def asyncio(
275286
union_prop_with_ref: Union[AnEnum, Unset, float] = 0.6,
276287
enum_prop: Union[Unset, AnEnum] = UNSET,
277288
model_prop: Union[Unset, ModelWithUnionProperty] = UNSET,
289+
required_model_prop: ModelWithUnionProperty,
278290
) -> Optional[Union[None, HTTPValidationError]]:
279291
""" """
280292

@@ -295,5 +307,6 @@ async def asyncio(
295307
union_prop_with_ref=union_prop_with_ref,
296308
enum_prop=enum_prop,
297309
model_prop=model_prop,
310+
required_model_prop=required_model_prop,
298311
)
299312
).parsed

end_to_end_tests/openapi.json

+8
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,14 @@
441441
},
442442
"name": "model_prop",
443443
"in": "query"
444+
},
445+
{
446+
"required": true,
447+
"schema": {
448+
"$ref": "#/components/schemas/ModelWithUnionProperty"
449+
},
450+
"name": "required_model_prop",
451+
"in": "query"
444452
}
445453
],
446454
"responses": {

openapi_python_client/parser/properties/model_property.py

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class ModelProperty(Property):
2020
_json_type_string: ClassVar[str] = "Dict[str, Any]"
2121

2222
template: ClassVar[str] = "model_property.py.jinja"
23+
json_is_dict: ClassVar[bool] = True
2324

2425
def get_base_type_string(self, json: bool = False) -> str:
2526
return self.reference.class_name

openapi_python_client/parser/properties/property.py

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class Property:
2929
python_name: str = attr.ib(init=False)
3030

3131
template: ClassVar[Optional[str]] = None
32+
json_is_dict: ClassVar[bool] = False
3233

3334
def __attrs_post_init__(self) -> None:
3435
object.__setattr__(self, "python_name", utils.to_valid_python_identifier(utils.snake_case(self.name)))

openapi_python_client/templates/endpoint_macros.py.jinja

+15-2
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,26 @@ if {{ parameter.python_name }} is not UNSET:
2222
{% endfor %}
2323
params: Dict[str, Any] = {
2424
{% for property in endpoint.query_parameters %}
25-
{% if property.template %}
25+
{% if not property.json_is_dict %}
26+
{% if property.template %}
2627
"{{ property.name }}": {{ "json_" + property.python_name }},
27-
{% else %}
28+
{% else %}
2829
"{{ property.name }}": {{ property.python_name }},
30+
{% endif %}
2931
{% endif %}
3032
{% endfor %}
3133
}
34+
{% for property in endpoint.query_parameters %}
35+
{% if property.json_is_dict %}
36+
{% set property_name = "json_" + property.python_name %}
37+
{% if property.required and not property.nullable %}
38+
params.update({{ property_name }})
39+
{% else %}
40+
if {% if not property.required %}not isinstance({{ property_name }}, Unset){% endif %}{% if not property.required and property.nullable %} and {% endif %}{% if property.nullable %}{{ property_name }} is not None{% endif %}:
41+
params.update({{ property_name }})
42+
{% endif %}
43+
{% endif %}
44+
{% endfor %}
3245
params = {k: v for k, v in params.items() if v is not UNSET and v is not None}
3346
{% endif %}
3447
{% endmacro %}

0 commit comments

Comments
 (0)