openapi-generators / openapi-python-client

Generate modern Python clients from OpenAPI

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Missing lazy_import in model to_multipart()

kgutwin opened this issue · comments

Describe the bug
In the end-to-end tests, the file golden-record/my_test_api_client/models/body_upload_file_tests_upload_post.py passes type checking, but would fail in a runtime call in a call to BodyUploadFileTestsUploadPost.to_multipart() at the following point:

    def to_multipart(self) -> Dict[str, Any]:
        some_file = self.some_file.to_tuple()

        some_object = (None, json.dumps(self.some_object.to_dict()).encode(), "application/json")

        some_nullable_object: Union[None, Tuple[None, bytes, str]]
        if isinstance(self.some_nullable_object, BodyUploadFileTestsUploadPostSomeNullableObject):  # raises NameError
            some_nullable_object = (None, json.dumps(self.some_nullable_object.to_dict()).encode(), "application/json")
        else:
            some_nullable_object = self.some_nullable_object

The exception raised is NameError: name 'BodyUploadFileTestsUploadPostSomeNullableObject' is not defined.

The analogous point in to_dict() is avoided because the required model is imported:

    def to_dict(self) -> Dict[str, Any]:
        from ..models.body_upload_file_tests_upload_post_some_nullable_object import (
            BodyUploadFileTestsUploadPostSomeNullableObject,
        )

        some_file = self.some_file.to_tuple()

        some_object = self.some_object.to_dict()

        some_nullable_object: Union[Dict[str, Any], None]
        if isinstance(self.some_nullable_object, BodyUploadFileTestsUploadPostSomeNullableObject):
            some_nullable_object = self.some_nullable_object.to_dict()
        else:
            some_nullable_object = self.some_nullable_object

It appears that model.py.jinja needs to be updated to include the necessary lazy imports:

    def to_dict(self) -> Dict[str, Any]:
        """Convert to a dict"""
    {% for lazy_import in model.lazy_imports | sort %}
        {{ lazy_import }}
    {% endfor %}
        {{ _to_dict() | indent(8) }}

{% if model.is_multipart_body %}
    def to_multipart(self) -> Dict[str, Any]:
        {{ _to_dict(multipart=True) | indent(8) }}
{% endif %}

Looking again, is there a reason why the check for if TYPE_CHECKING: is present at the top of model.py.jinja when importing the model's lazy imports?