Skip to content
This repository was archived by the owner on Dec 25, 2024. It is now read-only.

Commit 92c5c05

Browse files
committed
v3 more code reduction (#167)
* petstore regen * removes init template * Adds parameters type hint * Centralizes path and query param serialization * Removes type hint for param tuples * Simplifies used_path definition * Adds path + query params inputs * Adds _get_headers * SImplifies header assignment * Adds _get_field_and_body * Adds _verify_response_status * Removes unused imports * Removes unused import * Updates method name * Samples regenerated
1 parent 87da2d7 commit 92c5c05

1,880 files changed

Lines changed: 2241 additions & 9754 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

modules/openapi-json-schema-generator/src/main/resources/python/_helper_header.hbs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,9 @@
22
{{#if appName}}
33
{{{appName}}}
44
{{/if}}
5-
65
{{#if appDescription}}
76
{{{appDescription}}} # noqa: E501
87
{{/if}}
9-
108
{{#if version}}
119
The version of the OpenAPI document: {{{version}}}
1210
{{/if}}

modules/openapi-json-schema-generator/src/main/resources/python/api_client.hbs

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1152,6 +1152,86 @@ class Api(TypedDictInputVerifier):
11521152
"""
11531153
api_client: ApiClient = dataclasses.field(default_factory=lambda: ApiClient())
11541154

1155+
@staticmethod
1156+
def _get_used_path(
1157+
used_path: str,
1158+
path_parameters: typing.Tuple[typing.Type[PathParameter], ...] = (),
1159+
path_params: typing.Dict[str, typing.Any] = frozendict.frozendict(),
1160+
query_parameters: typing.Tuple[typing.Type[QueryParameter], ...] = (),
1161+
query_params: typing.Dict[str, typing.Any] = frozendict.frozendict(),
1162+
) -> str:
1163+
used_path_params = {}
1164+
for parameter in path_parameters:
1165+
parameter_data = path_params.get(parameter.name, schemas.unset)
1166+
if parameter_data is schemas.unset:
1167+
continue
1168+
serialized_data = parameter.serialize(parameter_data)
1169+
used_path_params.update(serialized_data)
1170+
1171+
for k, v in used_path_params.items():
1172+
used_path = used_path.replace('{%s}' % k, v)
1173+
1174+
prefix_separator_iterator = None
1175+
for parameter in query_parameters:
1176+
parameter_data = query_params.get(parameter.name, schemas.unset)
1177+
if parameter_data is schemas.unset:
1178+
continue
1179+
if prefix_separator_iterator is None:
1180+
prefix_separator_iterator = parameter.get_prefix_separator_iterator()
1181+
serialized_data = parameter.serialize(parameter_data, prefix_separator_iterator)
1182+
for serialized_value in serialized_data.values():
1183+
used_path += serialized_value
1184+
return used_path
1185+
1186+
@staticmethod
1187+
def _get_headers(
1188+
header_parameters: typing.Tuple[typing.Type[HeaderParameter], ...] = (),
1189+
header_params: typing.Dict[str, typing.Any] = frozendict.frozendict(),
1190+
accept_content_types: typing.Tuple[str] = (),
1191+
) -> _collections.HTTPHeaderDict:
1192+
headers = _collections.HTTPHeaderDict()
1193+
for parameter in header_parameters:
1194+
parameter_data = header_params.get(parameter.name, schemas.unset)
1195+
if parameter_data is schemas.unset:
1196+
continue
1197+
serialized_data = parameter.serialize(parameter_data)
1198+
headers.extend(serialized_data)
1199+
if accept_content_types:
1200+
for accept_content_type in accept_content_types:
1201+
headers.add('Accept', accept_content_type)
1202+
return headers
1203+
1204+
@staticmethod
1205+
def _get_fields_and_body(
1206+
request_body: 'RequestBody',
1207+
body: typing.Any,
1208+
headers: _collections.HTTPHeaderDict,
1209+
content_type: str
1210+
):
1211+
if request_body.required and body is schemas.unset:
1212+
raise exceptions.ApiValueError(
1213+
'The required body parameter has an invalid value of: unset. Set a valid value instead')
1214+
_fields = None
1215+
_body = None
1216+
1217+
if request_body.required or ((not request_body.required) and body is not schemas.unset):
1218+
serialized_data = request_body.serialize(body, content_type)
1219+
headers.add('Content-Type', content_type)
1220+
if 'fields' in serialized_data:
1221+
_fields = serialized_data['fields']
1222+
elif 'body' in serialized_data:
1223+
_body = serialized_data['body']
1224+
return _fields, _body
1225+
1226+
@staticmethod
1227+
def _verify_response_status(api_response: 'ApiResponse'):
1228+
if not 200 <= api_response.response.status <= 399:
1229+
raise exceptions.ApiException(
1230+
status=api_response.response.status,
1231+
reason=api_response.response.reason,
1232+
api_response=api_response
1233+
)
1234+
11551235

11561236
class SerializedRequestBody(typing_extensions.TypedDict, total=False):
11571237
body: typing.Union[str, bytes]

modules/openapi-json-schema-generator/src/main/resources/python/components/headers/header.hbs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@
1111
{{jsonPathPiece.camelCase}} = {{refInfo.refModule}}.{{refInfo.refClass}}
1212
{{else}}
1313
{{#if content}}
14-
import typing
15-
import typing_extensions
14+
import typing, typing_extensions
1615

1716
{{/if}}
1817
from {{packageName}} import api_client

modules/openapi-json-schema-generator/src/main/resources/python/components/parameters/parameter.hbs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@
1111
{{jsonPathPiece.camelCase}} = {{refInfo.refModule}}.{{refInfo.refClass}}
1212
{{else}}
1313
{{#if content}}
14-
import typing
15-
import typing_extensions
14+
import typing, typing_extensions
1615

1716
{{/if}}
1817
from {{packageName}} import api_client

modules/openapi-json-schema-generator/src/main/resources/python/components/request_bodies/request_body.hbs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@
1010
{{> _helper_imports }}
1111
{{jsonPathPiece.camelCase}} = {{refInfo.refModule}}.{{refInfo.refClass}}
1212
{{else}}
13-
import typing
14-
import typing_extensions
13+
import typing, typing_extensions
1514

1615
from {{packageName}} import api_client
1716
{{#each content}}

modules/openapi-json-schema-generator/src/main/resources/python/paths/path/verb/_helper_operation_parameter_schema_and_def.hbs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ class {{xParamsName}}:
5656
pass
5757

5858

59-
parameters = [
59+
parameters = (
6060
{{#each xParams}}
6161
{{jsonPathPiece.snakeCase}}.{{jsonPathPiece.camelCase}},
6262
{{/each}}
63-
]
63+
)

modules/openapi-json-schema-generator/src/main/resources/python/paths/path/verb/operation.hbs

Lines changed: 46 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,7 @@
22

33
{{> _helper_header }}
44

5-
from dataclasses import dataclass
6-
import typing_extensions
7-
import urllib3
8-
{{#with operation}}
9-
{{#or headerParams requestBody produces}}
10-
from urllib3._collections import HTTPHeaderDict
11-
{{/or}}
12-
{{/with}}
13-
14-
from {{packageName}} import api_client, exceptions{{#neq operation.security null}}{{#gt operation.security.size 0}}, security_schemes{{/gt}}{{else}}{{#neq security null}}{{#gt security.size 0}}, security_schemes{{/gt}}{{/neq}}{{/neq}}
5+
from {{packageName}} import api_client{{#neq operation.security null}}{{#gt operation.security.size 0}}, security_schemes{{/gt}}{{else}}{{#neq security null}}{{#gt security.size 0}}, security_schemes{{/gt}}{{/neq}}{{/neq}}
156
{{#eq operation.security null}}
167
{{#neq security null}}
178
{{#gt security.size 0}}
@@ -29,7 +20,16 @@ from {{packageName}}.security import (
2920
{{/gt}}
3021
{{/neq}}
3122
{{/eq}}
32-
{{> _helper_imports_schema_types }}
23+
import datetime # noqa: F401
24+
import decimal # noqa: F401
25+
import io # noqa: F401
26+
import typing # noqa: F401
27+
import typing_extensions # noqa: F401
28+
import uuid # noqa: F401
29+
30+
import frozendict # noqa: F401
31+
32+
from {{packageName}} import schemas # noqa: F401
3333
{{#if imports}}
3434

3535
{{/if}}
@@ -214,84 +214,46 @@ class BaseApi(api_client.Api):
214214
{{#if cookieParams}}
215215
self._verify_typed_dict_inputs(RequestCookieParameters.Params, cookie_params)
216216
{{/if}}
217+
{{#or pathParams queryParams}}
218+
used_path = self._get_used_path(
219+
path,
220+
{{#if pathParams}}
221+
path_parameters=RequestPathParameters.parameters,
222+
path_params=path_params{{#if queryParams}},{{/if}}
223+
{{/if}}
224+
{{#if queryParams}}
225+
query_parameters=RequestQueryParameters.parameters,
226+
query_params=query_params
227+
{{/if}}
228+
)
229+
{{else}}
217230
used_path = path
218-
{{#if pathParams}}
219-
220-
_path_params = {}
221-
for parameter in RequestPathParameters.parameters:
222-
parameter_data = path_params.get(parameter.name, schemas.unset)
223-
if parameter_data is schemas.unset:
224-
continue
225-
serialized_data = parameter.serialize(parameter_data)
226-
_path_params.update(serialized_data)
227-
228-
for k, v in _path_params.items():
229-
used_path = used_path.replace('{%s}' % k, v)
230-
{{/if}}
231-
{{#if queryParams}}
232-
233-
prefix_separator_iterator = None
234-
for parameter in RequestQueryParameters.parameters:
235-
parameter_data = query_params.get(parameter.name, schemas.unset)
236-
if parameter_data is schemas.unset:
237-
continue
238-
if prefix_separator_iterator is None:
239-
prefix_separator_iterator = parameter.get_prefix_separator_iterator()
240-
serialized_data = parameter.serialize(parameter_data, prefix_separator_iterator)
241-
for serialized_value in serialized_data.values():
242-
used_path += serialized_value
243-
{{/if}}
231+
{{/or}}
244232
{{#or headerParams requestBody produces}}
245-
246-
_headers = HTTPHeaderDict()
247-
{{else}}
233+
{{#if headerParams}}
234+
_headers = self._get_headers(
235+
{{#if produces}}
236+
header_parameters=RequestHeaderParameters.parameters,
237+
header_params=header_params,
238+
accept_content_types=accept_content_types
239+
{{else}}
240+
header_parameters=RequestHeaderParameters.parameters,
241+
header_params=header_params
242+
{{/if}}
243+
)
244+
{{else}}
245+
_headers = self._get_headers({{#if produces}}accept_content_types=accept_content_types{{/if}})
246+
{{/if}}
248247
{{/or}}
249-
{{#if headerParams}}
250-
for parameter in RequestHeaderParameters.parameters:
251-
parameter_data = header_params.get(parameter.name, schemas.unset)
252-
if parameter_data is schemas.unset:
253-
continue
254-
serialized_data = parameter.serialize(parameter_data)
255-
_headers.extend(serialized_data)
256-
{{/if}}
257248
# TODO add cookie handling
258-
{{#if produces}}
259-
if accept_content_types:
260-
for accept_content_type in accept_content_types:
261-
_headers.add('Accept', accept_content_type)
262-
{{/if}}
263249
{{#with requestBody}}
264250

265-
{{#if refInfo}}
266-
{{#if getDeepestRef.required}}
267-
if body is schemas.unset:
268-
raise exceptions.ApiValueError(
269-
'The required body parameter has an invalid value of: unset. Set a valid value instead')
270-
{{/if}}
271-
{{else}}
272-
{{#if required}}
273-
if body is schemas.unset:
274-
raise exceptions.ApiValueError(
275-
'The required body parameter has an invalid value of: unset. Set a valid value instead')
276-
{{/if}}
277-
{{/if}}
278-
_fields = None
279-
_body = None
280-
{{#if refInfo}}
281-
{{#if getDeepestRef.required}}
282-
{{> paths/path/verb/_helper_operation_body_serialization }}
283-
{{else}}
284-
if body is not schemas.unset:
285-
{{> paths/path/verb/_helper_operation_body_serialization }}
286-
{{/if}}
287-
{{else}}
288-
{{#if required}}
289-
{{> paths/path/verb/_helper_operation_body_serialization }}
290-
{{else}}
291-
if body is not schemas.unset:
292-
{{> paths/path/verb/_helper_operation_body_serialization }}
293-
{{/if}}
294-
{{/if}}
251+
_fields, _body = self._get_fields_and_body(
252+
request_body=request_body.{{jsonPathPiece.camelCase}},
253+
body=body,
254+
headers=_headers,
255+
content_type=content_type
256+
)
295257
{{/with}}
296258
{{#if servers}}
297259
host = self.api_client.configuration.get_server_url(
@@ -405,12 +367,7 @@ class BaseApi(api_client.Api):
405367
{{/if}}
406368
{{/if}}
407369

408-
if not 200 <= response.status <= 399:
409-
raise exceptions.ApiException(
410-
status=response.status,
411-
reason=response.reason,
412-
api_response=api_response
413-
)
370+
self._verify_response_status(api_response)
414371

415372
return api_response
416373

samples/openapi3/client/3_0_3_unit_test/python/src/unit_test_api/__init__.py

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

55
"""
66
openapi 3.0.3 sample spec
7-
87
sample spec for testing openapi functionality, built from json schema tests for draft6 # noqa: E501
9-
108
The version of the OpenAPI document: 0.0.1
119
Generated by: https://github.com/openapi-json-schema-tools/openapi-json-schema-generator
1210
"""

0 commit comments

Comments
 (0)