diff --git a/modules/openapi-generator/src/main/resources/python/api_client.mustache b/modules/openapi-generator/src/main/resources/python/api_client.mustache index 4d1d789e4e85..c7d4a6d700f6 100644 --- a/modules/openapi-generator/src/main/resources/python/api_client.mustache +++ b/modules/openapi-generator/src/main/resources/python/api_client.mustache @@ -232,7 +232,7 @@ class ApiClient: body = self.sanitize_for_serialization(body) # request url - if _host is None: + if _host is None or self.configuration.ignore_operation_servers: url = self.configuration.host + resource_path else: # use server/host defined in path or operation instead diff --git a/modules/openapi-generator/src/main/resources/python/configuration.mustache b/modules/openapi-generator/src/main/resources/python/configuration.mustache index fc9c7f063092..ff40ce5847dc 100644 --- a/modules/openapi-generator/src/main/resources/python/configuration.mustache +++ b/modules/openapi-generator/src/main/resources/python/configuration.mustache @@ -24,6 +24,9 @@ class Configuration: """This class contains various settings of the API client. :param host: Base url. + :param ignore_operation_servers + Boolean to ignore operation servers for the API client. + Config will use `host` as the base url regardless of the operation servers. :param api_key: Dict to store API key(s). Each entry in the dict specifies an API key. The dict key is the name of the security scheme in the OAS specification. @@ -148,6 +151,7 @@ conf = {{{packageName}}}.Configuration( {{/hasHttpSignatureMethods}} server_index=None, server_variables=None, server_operation_index=None, server_operation_variables=None, + ignore_operation_servers=False, ssl_ca_cert=None, retries=None, ) -> None: @@ -164,6 +168,9 @@ conf = {{{packageName}}}.Configuration( self.server_operation_variables = server_operation_variables or {} """Default server variables """ + self.ignore_operation_servers = ignore_operation_servers + """Ignore operation servers + """ self.temp_folder_path = None """Temp file folder for downloading files """ diff --git a/samples/client/echo_api/python-disallowAdditionalPropertiesIfNotPresent/openapi_client/api_client.py b/samples/client/echo_api/python-disallowAdditionalPropertiesIfNotPresent/openapi_client/api_client.py index 2d5d7b55ad7d..feef534a2f26 100644 --- a/samples/client/echo_api/python-disallowAdditionalPropertiesIfNotPresent/openapi_client/api_client.py +++ b/samples/client/echo_api/python-disallowAdditionalPropertiesIfNotPresent/openapi_client/api_client.py @@ -228,7 +228,7 @@ def param_serialize( body = self.sanitize_for_serialization(body) # request url - if _host is None: + if _host is None or self.configuration.ignore_operation_servers: url = self.configuration.host + resource_path else: # use server/host defined in path or operation instead diff --git a/samples/client/echo_api/python-disallowAdditionalPropertiesIfNotPresent/openapi_client/configuration.py b/samples/client/echo_api/python-disallowAdditionalPropertiesIfNotPresent/openapi_client/configuration.py index ea06c939fa89..4cb80aebab27 100644 --- a/samples/client/echo_api/python-disallowAdditionalPropertiesIfNotPresent/openapi_client/configuration.py +++ b/samples/client/echo_api/python-disallowAdditionalPropertiesIfNotPresent/openapi_client/configuration.py @@ -33,6 +33,9 @@ class Configuration: """This class contains various settings of the API client. :param host: Base url. + :param ignore_operation_servers + Boolean to ignore operation servers for the API client. + Config will use `host` as the base url regardless of the operation servers. :param api_key: Dict to store API key(s). Each entry in the dict specifies an API key. The dict key is the name of the security scheme in the OAS specification. @@ -84,6 +87,7 @@ def __init__(self, host=None, access_token=None, server_index=None, server_variables=None, server_operation_index=None, server_operation_variables=None, + ignore_operation_servers=False, ssl_ca_cert=None, retries=None, ) -> None: @@ -100,6 +104,9 @@ def __init__(self, host=None, self.server_operation_variables = server_operation_variables or {} """Default server variables """ + self.ignore_operation_servers = ignore_operation_servers + """Ignore operation servers + """ self.temp_folder_path = None """Temp file folder for downloading files """ diff --git a/samples/client/echo_api/python/openapi_client/api_client.py b/samples/client/echo_api/python/openapi_client/api_client.py index 2d5d7b55ad7d..feef534a2f26 100644 --- a/samples/client/echo_api/python/openapi_client/api_client.py +++ b/samples/client/echo_api/python/openapi_client/api_client.py @@ -228,7 +228,7 @@ def param_serialize( body = self.sanitize_for_serialization(body) # request url - if _host is None: + if _host is None or self.configuration.ignore_operation_servers: url = self.configuration.host + resource_path else: # use server/host defined in path or operation instead diff --git a/samples/client/echo_api/python/openapi_client/configuration.py b/samples/client/echo_api/python/openapi_client/configuration.py index ea06c939fa89..4cb80aebab27 100644 --- a/samples/client/echo_api/python/openapi_client/configuration.py +++ b/samples/client/echo_api/python/openapi_client/configuration.py @@ -33,6 +33,9 @@ class Configuration: """This class contains various settings of the API client. :param host: Base url. + :param ignore_operation_servers + Boolean to ignore operation servers for the API client. + Config will use `host` as the base url regardless of the operation servers. :param api_key: Dict to store API key(s). Each entry in the dict specifies an API key. The dict key is the name of the security scheme in the OAS specification. @@ -84,6 +87,7 @@ def __init__(self, host=None, access_token=None, server_index=None, server_variables=None, server_operation_index=None, server_operation_variables=None, + ignore_operation_servers=False, ssl_ca_cert=None, retries=None, ) -> None: @@ -100,6 +104,9 @@ def __init__(self, host=None, self.server_operation_variables = server_operation_variables or {} """Default server variables """ + self.ignore_operation_servers = ignore_operation_servers + """Ignore operation servers + """ self.temp_folder_path = None """Temp file folder for downloading files """ diff --git a/samples/openapi3/client/petstore/python-aiohttp/petstore_api/api_client.py b/samples/openapi3/client/petstore/python-aiohttp/petstore_api/api_client.py index 5766c2842237..302e5dac53c6 100644 --- a/samples/openapi3/client/petstore/python-aiohttp/petstore_api/api_client.py +++ b/samples/openapi3/client/petstore/python-aiohttp/petstore_api/api_client.py @@ -230,7 +230,7 @@ def param_serialize( body = self.sanitize_for_serialization(body) # request url - if _host is None: + if _host is None or self.configuration.ignore_operation_servers: url = self.configuration.host + resource_path else: # use server/host defined in path or operation instead diff --git a/samples/openapi3/client/petstore/python-aiohttp/petstore_api/configuration.py b/samples/openapi3/client/petstore/python-aiohttp/petstore_api/configuration.py index 272c43858926..32a9f9ce0f43 100644 --- a/samples/openapi3/client/petstore/python-aiohttp/petstore_api/configuration.py +++ b/samples/openapi3/client/petstore/python-aiohttp/petstore_api/configuration.py @@ -31,6 +31,9 @@ class Configuration: """This class contains various settings of the API client. :param host: Base url. + :param ignore_operation_servers + Boolean to ignore operation servers for the API client. + Config will use `host` as the base url regardless of the operation servers. :param api_key: Dict to store API key(s). Each entry in the dict specifies an API key. The dict key is the name of the security scheme in the OAS specification. @@ -143,6 +146,7 @@ def __init__(self, host=None, signing_info=None, server_index=None, server_variables=None, server_operation_index=None, server_operation_variables=None, + ignore_operation_servers=False, ssl_ca_cert=None, retries=None, ) -> None: @@ -159,6 +163,9 @@ def __init__(self, host=None, self.server_operation_variables = server_operation_variables or {} """Default server variables """ + self.ignore_operation_servers = ignore_operation_servers + """Ignore operation servers + """ self.temp_folder_path = None """Temp file folder for downloading files """ diff --git a/samples/openapi3/client/petstore/python-aiohttp/tests/test_api_client.py b/samples/openapi3/client/petstore/python-aiohttp/tests/test_api_client.py index d3daa10d51ce..fbcd7485a9c1 100644 --- a/samples/openapi3/client/petstore/python-aiohttp/tests/test_api_client.py +++ b/samples/openapi3/client/petstore/python-aiohttp/tests/test_api_client.py @@ -8,6 +8,7 @@ from tests.util import async_test import petstore_api +HOST = 'http://localhost/v2' class TestApiClient(unittest.TestCase): @@ -20,3 +21,31 @@ async def test_context_manager_closes_client(self): rest_pool_ref = client.rest_client.pool_manager self.assertTrue(rest_pool_ref.closed) + + @async_test + async def test_ignore_operation_servers(self): + config = petstore_api.Configuration(host=HOST) + client = petstore_api.ApiClient(config) + user_api_instance = petstore_api.api.user_api.UserApi(client) + + config_ignore = petstore_api.Configuration(host=HOST, ignore_operation_servers=True) + client_ignore = petstore_api.ApiClient(config_ignore) + user_api_instance_ignore = petstore_api.api.user_api.UserApi(client_ignore) + + params_to_serialize = { + 'user': petstore_api.User(id=1, username='test'), + '_request_auth': None, + '_content_type': 'application/json', + '_headers': None, + '_host_index': 0 + } + + # operation servers should be used + _, url, *_ = user_api_instance._create_user_serialize(**params_to_serialize) + self.assertEqual(client.configuration.host, HOST) + self.assertEqual(url, 'http://petstore.swagger.io/v2/user') + + # operation servers should be ignored + _, url_ignore, *_ = user_api_instance_ignore._create_user_serialize(**params_to_serialize) + self.assertEqual(client.configuration.host, HOST) + self.assertEqual(url_ignore, HOST + '/user') diff --git a/samples/openapi3/client/petstore/python/petstore_api/api_client.py b/samples/openapi3/client/petstore/python/petstore_api/api_client.py index c4dbcb450a7b..9ab0756d53b4 100755 --- a/samples/openapi3/client/petstore/python/petstore_api/api_client.py +++ b/samples/openapi3/client/petstore/python/petstore_api/api_client.py @@ -227,7 +227,7 @@ def param_serialize( body = self.sanitize_for_serialization(body) # request url - if _host is None: + if _host is None or self.configuration.ignore_operation_servers: url = self.configuration.host + resource_path else: # use server/host defined in path or operation instead diff --git a/samples/openapi3/client/petstore/python/petstore_api/configuration.py b/samples/openapi3/client/petstore/python/petstore_api/configuration.py index 779ee409c750..f2edd6c41932 100755 --- a/samples/openapi3/client/petstore/python/petstore_api/configuration.py +++ b/samples/openapi3/client/petstore/python/petstore_api/configuration.py @@ -32,6 +32,9 @@ class Configuration: """This class contains various settings of the API client. :param host: Base url. + :param ignore_operation_servers + Boolean to ignore operation servers for the API client. + Config will use `host` as the base url regardless of the operation servers. :param api_key: Dict to store API key(s). Each entry in the dict specifies an API key. The dict key is the name of the security scheme in the OAS specification. @@ -144,6 +147,7 @@ def __init__(self, host=None, signing_info=None, server_index=None, server_variables=None, server_operation_index=None, server_operation_variables=None, + ignore_operation_servers=False, ssl_ca_cert=None, retries=None, ) -> None: @@ -160,6 +164,9 @@ def __init__(self, host=None, self.server_operation_variables = server_operation_variables or {} """Default server variables """ + self.ignore_operation_servers = ignore_operation_servers + """Ignore operation servers + """ self.temp_folder_path = None """Temp file folder for downloading files """ diff --git a/samples/openapi3/client/petstore/python/tests/test_api_client.py b/samples/openapi3/client/petstore/python/tests/test_api_client.py index 1d8ffebaca0a..e80bc1352963 100644 --- a/samples/openapi3/client/petstore/python/tests/test_api_client.py +++ b/samples/openapi3/client/petstore/python/tests/test_api_client.py @@ -56,6 +56,33 @@ def test_configuration(self): self.assertEqual('test_username', client.configuration.username) self.assertEqual('test_password', client.configuration.password) + def test_ignore_operation_servers(self): + config = petstore_api.Configuration(host=HOST) + client = petstore_api.ApiClient(config) + user_api_instance = petstore_api.api.user_api.UserApi(client) + + config_ignore = petstore_api.Configuration(host=HOST, ignore_operation_servers=True) + client_ignore = petstore_api.ApiClient(config_ignore) + user_api_instance_ignore = petstore_api.api.user_api.UserApi(client_ignore) + + params_to_serialize = { + 'user': petstore_api.User(id=1, username='test'), + '_request_auth': None, + '_content_type': 'application/json', + '_headers': None, + '_host_index': 0 + } + + # operation servers should be used + _, url, *_ = user_api_instance._create_user_serialize(**params_to_serialize) + self.assertEqual(client.configuration.host, HOST) + self.assertEqual(url, 'http://petstore.swagger.io/v2/user') + + # operation servers should be ignored + _, url_ignore, *_ = user_api_instance_ignore._create_user_serialize(**params_to_serialize) + self.assertEqual(client.configuration.host, HOST) + self.assertEqual(url_ignore, HOST + '/user') + def test_select_header_accept(self): accepts = ['APPLICATION/JSON', 'APPLICATION/XML'] accept = self.api_client.select_header_accept(accepts) diff --git a/samples/openapi3/client/petstore/python/tests/test_configuration.py b/samples/openapi3/client/petstore/python/tests/test_configuration.py index d8084adafd24..6365e9f1be7f 100644 --- a/samples/openapi3/client/petstore/python/tests/test_configuration.py +++ b/samples/openapi3/client/petstore/python/tests/test_configuration.py @@ -58,6 +58,18 @@ def testAccessTokenWhenConstructingConfiguration(self): c1 = petstore_api.Configuration(access_token="12345") self.assertEqual(c1.access_token, "12345") + def test_ignore_operation_servers(self): + self.config.ignore_operation_servers = True + self.assertTrue(self.config.ignore_operation_servers) + self.config.ignore_operation_servers = False + self.assertFalse(self.config.ignore_operation_servers) + + c1 = petstore_api.Configuration(ignore_operation_servers=True) + self.assertTrue(c1.ignore_operation_servers) + + c2 = petstore_api.Configuration() + self.assertFalse(c2.ignore_operation_servers) + def test_get_host_settings(self): host_settings = self.config.get_host_settings()