From 175e5f40173a1245836a8a6b66ac4e1539b3d967 Mon Sep 17 00:00:00 2001 From: Vladislav Verba Date: Fri, 1 Sep 2023 15:52:50 +0300 Subject: [PATCH] fix: incorrect generation of dashed parameters --- python_client_generator/generate_apis.py | 13 ++++++++++--- python_client_generator/templates/apis.py.mustache | 6 +++--- python_client_generator/utils.py | 6 ++++++ tests/expected/apis.py | 6 ++++++ 4 files changed, 25 insertions(+), 6 deletions(-) diff --git a/python_client_generator/generate_apis.py b/python_client_generator/generate_apis.py index a871e5a..1f5c1a1 100755 --- a/python_client_generator/generate_apis.py +++ b/python_client_generator/generate_apis.py @@ -6,7 +6,7 @@ import chevron -from .utils import resolve_type, sanitize_name, serialize_to_python_code +from .utils import resolve_type, sanitize_name, serialize_to_python_code, to_python_name dir_path = Path(os.path.dirname(os.path.realpath(__file__))) @@ -83,7 +83,7 @@ def get_function_args(method: Dict[str, Any]) -> List[Dict[str, Any]]: # Convert params to args format required for templating return [ { - "name": p["name"], + "name": to_python_name(p["name"]), "type": resolve_property_type(p), "default": resolve_property_default(p), "has_default": resolve_property_default(p) is not None, @@ -97,7 +97,14 @@ def get_params_by_type(method: Dict[str, Any], type_: str) -> List[Dict[str, str :param str type_: `query` or `header` """ params = method.get("parameters", []) - return [{"name": p["name"]} for p in params if p["in"] == type_] + return [ + { + "name": p["name"], + "python_name": to_python_name(p["name"]), + } + for p in params + if p["in"] == type_ + ] def has_json_body(method: Dict[str, Any]) -> bool: diff --git a/python_client_generator/templates/apis.py.mustache b/python_client_generator/templates/apis.py.mustache index ef4356e..5eafdb0 100644 --- a/python_client_generator/templates/apis.py.mustache +++ b/python_client_generator/templates/apis.py.mustache @@ -30,7 +30,7 @@ class {{class_name}}(BaseClient): _query_params = { {{/has_query_params}} {{#query_params}} - "{{name}}": {{name}}, + "{{name}}": {{python_name}}, {{/query_params}} {{#has_query_params}} } @@ -40,7 +40,7 @@ class {{class_name}}(BaseClient): _headers = { {{/has_header_params}} {{#header_params}} - "{{name}}": {{name}}, + "{{name}}": {{python_name}}, {{/header_params}} {{#has_header_params}} } @@ -73,7 +73,7 @@ class {{class_name}}(BaseClient): _query_params=_query_params, {{/has_query_params}} {{#has_header_params}} - _headers=_headers, + _headers=_headers, {{/has_header_params}} {{#has_multipart_data}} _multipart_data=_multipart_data, diff --git a/python_client_generator/utils.py b/python_client_generator/utils.py index 553cb8f..fa2916e 100644 --- a/python_client_generator/utils.py +++ b/python_client_generator/utils.py @@ -49,6 +49,12 @@ def sanitize_name(name: str) -> str: return "".join(re.findall(r"[A-Za-z0-9]+[A-Za-z0-9_]*", name)) +def to_python_name(name: str) -> str: + name = name.replace("-", "_") # Un-dash + name = re.sub(r"^\d*", "", name) # Remove digits fom beginning + return name + + def resolve_type(schema: Dict[str, Any], depth: int = 0, use_literals: bool = False) -> str: """ Resolve Python type for a given schema diff --git a/tests/expected/apis.py b/tests/expected/apis.py index 9483993..1a4ed0d 100644 --- a/tests/expected/apis.py +++ b/tests/expected/apis.py @@ -109,6 +109,7 @@ async def list_foos_api_foo_get( async def create_foo_api_foo_post( self, body: Foo, + x_custom_header: Optional[str] = "default_value", body_serializer_args: Dict[str, Any] = {}, **kwargs: Any ) -> Foo: @@ -116,9 +117,14 @@ async def create_foo_api_foo_post( """ # noqa + _headers = { + "x-custom-header": x_custom_header, + } + response = await self._request( "POST", "/api/foo", + _headers=_headers, _body=body, body_serializer_args=body_serializer_args, **kwargs