Skip to content

Commit 0d05ee3

Browse files
authored
[Python] Add Flag to Allow Ignoring Operation Servers (#18981)
* [Python] Add Flag to Allow Ignoring Operation Servers * generate samples * add tests
1 parent 38d189b commit 0d05ee3

File tree

13 files changed

+108
-5
lines changed

13 files changed

+108
-5
lines changed

modules/openapi-generator/src/main/resources/python/api_client.mustache

+1-1
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ class ApiClient:
232232
body = self.sanitize_for_serialization(body)
233233

234234
# request url
235-
if _host is None:
235+
if _host is None or self.configuration.ignore_operation_servers:
236236
url = self.configuration.host + resource_path
237237
else:
238238
# use server/host defined in path or operation instead

modules/openapi-generator/src/main/resources/python/configuration.mustache

+7
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ class Configuration:
2424
"""This class contains various settings of the API client.
2525

2626
:param host: Base url.
27+
:param ignore_operation_servers
28+
Boolean to ignore operation servers for the API client.
29+
Config will use `host` as the base url regardless of the operation servers.
2730
:param api_key: Dict to store API key(s).
2831
Each entry in the dict specifies an API key.
2932
The dict key is the name of the security scheme in the OAS specification.
@@ -148,6 +151,7 @@ conf = {{{packageName}}}.Configuration(
148151
{{/hasHttpSignatureMethods}}
149152
server_index=None, server_variables=None,
150153
server_operation_index=None, server_operation_variables=None,
154+
ignore_operation_servers=False,
151155
ssl_ca_cert=None,
152156
retries=None,
153157
*,
@@ -166,6 +170,9 @@ conf = {{{packageName}}}.Configuration(
166170
self.server_operation_variables = server_operation_variables or {}
167171
"""Default server variables
168172
"""
173+
self.ignore_operation_servers = ignore_operation_servers
174+
"""Ignore operation servers
175+
"""
169176
self.temp_folder_path = None
170177
"""Temp file folder for downloading files
171178
"""

samples/client/echo_api/python-disallowAdditionalPropertiesIfNotPresent/openapi_client/api_client.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ def param_serialize(
228228
body = self.sanitize_for_serialization(body)
229229

230230
# request url
231-
if _host is None:
231+
if _host is None or self.configuration.ignore_operation_servers:
232232
url = self.configuration.host + resource_path
233233
else:
234234
# use server/host defined in path or operation instead

samples/client/echo_api/python-disallowAdditionalPropertiesIfNotPresent/openapi_client/configuration.py

+7
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ class Configuration:
3333
"""This class contains various settings of the API client.
3434
3535
:param host: Base url.
36+
:param ignore_operation_servers
37+
Boolean to ignore operation servers for the API client.
38+
Config will use `host` as the base url regardless of the operation servers.
3639
:param api_key: Dict to store API key(s).
3740
Each entry in the dict specifies an API key.
3841
The dict key is the name of the security scheme in the OAS specification.
@@ -84,6 +87,7 @@ def __init__(self, host=None,
8487
access_token=None,
8588
server_index=None, server_variables=None,
8689
server_operation_index=None, server_operation_variables=None,
90+
ignore_operation_servers=False,
8791
ssl_ca_cert=None,
8892
retries=None,
8993
*,
@@ -102,6 +106,9 @@ def __init__(self, host=None,
102106
self.server_operation_variables = server_operation_variables or {}
103107
"""Default server variables
104108
"""
109+
self.ignore_operation_servers = ignore_operation_servers
110+
"""Ignore operation servers
111+
"""
105112
self.temp_folder_path = None
106113
"""Temp file folder for downloading files
107114
"""

samples/client/echo_api/python/openapi_client/api_client.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ def param_serialize(
228228
body = self.sanitize_for_serialization(body)
229229

230230
# request url
231-
if _host is None:
231+
if _host is None or self.configuration.ignore_operation_servers:
232232
url = self.configuration.host + resource_path
233233
else:
234234
# use server/host defined in path or operation instead

samples/client/echo_api/python/openapi_client/configuration.py

+7
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ class Configuration:
3333
"""This class contains various settings of the API client.
3434
3535
:param host: Base url.
36+
:param ignore_operation_servers
37+
Boolean to ignore operation servers for the API client.
38+
Config will use `host` as the base url regardless of the operation servers.
3639
:param api_key: Dict to store API key(s).
3740
Each entry in the dict specifies an API key.
3841
The dict key is the name of the security scheme in the OAS specification.
@@ -84,6 +87,7 @@ def __init__(self, host=None,
8487
access_token=None,
8588
server_index=None, server_variables=None,
8689
server_operation_index=None, server_operation_variables=None,
90+
ignore_operation_servers=False,
8791
ssl_ca_cert=None,
8892
retries=None,
8993
*,
@@ -102,6 +106,9 @@ def __init__(self, host=None,
102106
self.server_operation_variables = server_operation_variables or {}
103107
"""Default server variables
104108
"""
109+
self.ignore_operation_servers = ignore_operation_servers
110+
"""Ignore operation servers
111+
"""
105112
self.temp_folder_path = None
106113
"""Temp file folder for downloading files
107114
"""

samples/openapi3/client/petstore/python-aiohttp/petstore_api/api_client.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ def param_serialize(
230230
body = self.sanitize_for_serialization(body)
231231

232232
# request url
233-
if _host is None:
233+
if _host is None or self.configuration.ignore_operation_servers:
234234
url = self.configuration.host + resource_path
235235
else:
236236
# use server/host defined in path or operation instead

samples/openapi3/client/petstore/python-aiohttp/petstore_api/configuration.py

+7
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ class Configuration:
3131
"""This class contains various settings of the API client.
3232
3333
:param host: Base url.
34+
:param ignore_operation_servers
35+
Boolean to ignore operation servers for the API client.
36+
Config will use `host` as the base url regardless of the operation servers.
3437
:param api_key: Dict to store API key(s).
3538
Each entry in the dict specifies an API key.
3639
The dict key is the name of the security scheme in the OAS specification.
@@ -143,6 +146,7 @@ def __init__(self, host=None,
143146
signing_info=None,
144147
server_index=None, server_variables=None,
145148
server_operation_index=None, server_operation_variables=None,
149+
ignore_operation_servers=False,
146150
ssl_ca_cert=None,
147151
retries=None,
148152
*,
@@ -161,6 +165,9 @@ def __init__(self, host=None,
161165
self.server_operation_variables = server_operation_variables or {}
162166
"""Default server variables
163167
"""
168+
self.ignore_operation_servers = ignore_operation_servers
169+
"""Ignore operation servers
170+
"""
164171
self.temp_folder_path = None
165172
"""Temp file folder for downloading files
166173
"""

samples/openapi3/client/petstore/python-aiohttp/tests/test_api_client.py

+29
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from tests.util import async_test
99
import petstore_api
1010

11+
HOST = 'http://localhost/v2'
1112

1213
class TestApiClient(unittest.TestCase):
1314

@@ -20,3 +21,31 @@ async def test_context_manager_closes_client(self):
2021
rest_pool_ref = client.rest_client.pool_manager
2122

2223
self.assertTrue(rest_pool_ref.closed)
24+
25+
@async_test
26+
async def test_ignore_operation_servers(self):
27+
config = petstore_api.Configuration(host=HOST)
28+
client = petstore_api.ApiClient(config)
29+
user_api_instance = petstore_api.api.user_api.UserApi(client)
30+
31+
config_ignore = petstore_api.Configuration(host=HOST, ignore_operation_servers=True)
32+
client_ignore = petstore_api.ApiClient(config_ignore)
33+
user_api_instance_ignore = petstore_api.api.user_api.UserApi(client_ignore)
34+
35+
params_to_serialize = {
36+
'user': petstore_api.User(id=1, username='test'),
37+
'_request_auth': None,
38+
'_content_type': 'application/json',
39+
'_headers': None,
40+
'_host_index': 0
41+
}
42+
43+
# operation servers should be used
44+
_, url, *_ = user_api_instance._create_user_serialize(**params_to_serialize)
45+
self.assertEqual(client.configuration.host, HOST)
46+
self.assertEqual(url, 'http://petstore.swagger.io/v2/user')
47+
48+
# operation servers should be ignored
49+
_, url_ignore, *_ = user_api_instance_ignore._create_user_serialize(**params_to_serialize)
50+
self.assertEqual(client.configuration.host, HOST)
51+
self.assertEqual(url_ignore, HOST + '/user')

samples/openapi3/client/petstore/python/petstore_api/api_client.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ def param_serialize(
227227
body = self.sanitize_for_serialization(body)
228228

229229
# request url
230-
if _host is None:
230+
if _host is None or self.configuration.ignore_operation_servers:
231231
url = self.configuration.host + resource_path
232232
else:
233233
# use server/host defined in path or operation instead

samples/openapi3/client/petstore/python/petstore_api/configuration.py

+7
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ class Configuration:
3232
"""This class contains various settings of the API client.
3333
3434
:param host: Base url.
35+
:param ignore_operation_servers
36+
Boolean to ignore operation servers for the API client.
37+
Config will use `host` as the base url regardless of the operation servers.
3538
:param api_key: Dict to store API key(s).
3639
Each entry in the dict specifies an API key.
3740
The dict key is the name of the security scheme in the OAS specification.
@@ -144,6 +147,7 @@ def __init__(self, host=None,
144147
signing_info=None,
145148
server_index=None, server_variables=None,
146149
server_operation_index=None, server_operation_variables=None,
150+
ignore_operation_servers=False,
147151
ssl_ca_cert=None,
148152
retries=None,
149153
*,
@@ -162,6 +166,9 @@ def __init__(self, host=None,
162166
self.server_operation_variables = server_operation_variables or {}
163167
"""Default server variables
164168
"""
169+
self.ignore_operation_servers = ignore_operation_servers
170+
"""Ignore operation servers
171+
"""
165172
self.temp_folder_path = None
166173
"""Temp file folder for downloading files
167174
"""

samples/openapi3/client/petstore/python/tests/test_api_client.py

+27
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,33 @@ def test_configuration(self):
5656
self.assertEqual('test_username', client.configuration.username)
5757
self.assertEqual('test_password', client.configuration.password)
5858

59+
def test_ignore_operation_servers(self):
60+
config = petstore_api.Configuration(host=HOST)
61+
client = petstore_api.ApiClient(config)
62+
user_api_instance = petstore_api.api.user_api.UserApi(client)
63+
64+
config_ignore = petstore_api.Configuration(host=HOST, ignore_operation_servers=True)
65+
client_ignore = petstore_api.ApiClient(config_ignore)
66+
user_api_instance_ignore = petstore_api.api.user_api.UserApi(client_ignore)
67+
68+
params_to_serialize = {
69+
'user': petstore_api.User(id=1, username='test'),
70+
'_request_auth': None,
71+
'_content_type': 'application/json',
72+
'_headers': None,
73+
'_host_index': 0
74+
}
75+
76+
# operation servers should be used
77+
_, url, *_ = user_api_instance._create_user_serialize(**params_to_serialize)
78+
self.assertEqual(client.configuration.host, HOST)
79+
self.assertEqual(url, 'http://petstore.swagger.io/v2/user')
80+
81+
# operation servers should be ignored
82+
_, url_ignore, *_ = user_api_instance_ignore._create_user_serialize(**params_to_serialize)
83+
self.assertEqual(client.configuration.host, HOST)
84+
self.assertEqual(url_ignore, HOST + '/user')
85+
5986
def test_select_header_accept(self):
6087
accepts = ['APPLICATION/JSON', 'APPLICATION/XML']
6188
accept = self.api_client.select_header_accept(accepts)

samples/openapi3/client/petstore/python/tests/test_configuration.py

+12
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,18 @@ def testAccessTokenWhenConstructingConfiguration(self):
5858
c1 = petstore_api.Configuration(access_token="12345")
5959
self.assertEqual(c1.access_token, "12345")
6060

61+
def test_ignore_operation_servers(self):
62+
self.config.ignore_operation_servers = True
63+
self.assertTrue(self.config.ignore_operation_servers)
64+
self.config.ignore_operation_servers = False
65+
self.assertFalse(self.config.ignore_operation_servers)
66+
67+
c1 = petstore_api.Configuration(ignore_operation_servers=True)
68+
self.assertTrue(c1.ignore_operation_servers)
69+
70+
c2 = petstore_api.Configuration()
71+
self.assertFalse(c2.ignore_operation_servers)
72+
6173
def test_get_host_settings(self):
6274
host_settings = self.config.get_host_settings()
6375

0 commit comments

Comments
 (0)