From 4ced32a0fe860bbc33ad124c6703fce951d26e8b Mon Sep 17 00:00:00 2001 From: mikkelam Date: Fri, 13 Feb 2026 16:19:37 +0100 Subject: [PATCH] fix: sort remaining lazy imports in model template --- .../templates/model.py.jinja | 6 +-- tests/test_templates/test_model_template.py | 39 +++++++++++++++++++ 2 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 tests/test_templates/test_model_template.py diff --git a/openapi_python_client/templates/model.py.jinja b/openapi_python_client/templates/model.py.jinja index f9ac5e3e2..50bc36ca3 100644 --- a/openapi_python_client/templates/model.py.jinja +++ b/openapi_python_client/templates/model.py.jinja @@ -144,14 +144,14 @@ return field_dict {% endmacro %} def to_dict(self) -> dict[str, Any]: - {% for lazy_import in model.lazy_imports %} + {% for lazy_import in model.lazy_imports | sort %} {{ lazy_import }} {% endfor %} {{ _to_dict() | indent(8) }} {% if model.is_multipart_body %} def to_multipart(self) -> types.RequestFiles: - {% for lazy_import in model.lazy_imports %} + {% for lazy_import in model.lazy_imports | sort %} {{ lazy_import }} {% endfor %} files: types.RequestFiles = [] @@ -204,7 +204,7 @@ return field_dict {% import "property_templates/" + model.additional_properties.template as prop_template %} {% if model.additional_properties.lazy_imports %} - {% for lazy_import in model.additional_properties.lazy_imports %} + {% for lazy_import in model.additional_properties.lazy_imports | sort %} {{ lazy_import }} {% endfor %} {% endif %} diff --git a/tests/test_templates/test_model_template.py b/tests/test_templates/test_model_template.py new file mode 100644 index 000000000..b80491197 --- /dev/null +++ b/tests/test_templates/test_model_template.py @@ -0,0 +1,39 @@ +from __future__ import annotations + +from types import SimpleNamespace + + +def _section(content: str, start: str, end: str | None = None) -> str: + section = content.split(start, 1)[1] + if end is not None: + section = section.split(end, 1)[0] + return section + + +def test_model_template_renders_lazy_imports_in_stable_order(env) -> None: + template = env.get_template("model.py.jinja") + + model = SimpleNamespace( + is_multipart_body=True, + relative_imports=set(), + lazy_imports={"from ..models.z import Z", "from ..models.a import A"}, + additional_properties=False, + class_info=SimpleNamespace(name="MyModel", module_name="my_model"), + title="", + description="", + example="", + required_properties=[], + optional_properties=[], + ) + config = SimpleNamespace(docstrings_on_attributes=False) + + content = template.render(model=model, config=config) + + sections = [ + _section(content, "if TYPE_CHECKING:", "T = TypeVar"), + _section(content, "def to_dict(self)", "def to_multipart(self)"), + _section(content, "def to_multipart(self)", "@classmethod"), + _section(content, "def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:", "return my_model"), + ] + for section in sections: + assert section.index("from ..models.a import A") < section.index("from ..models.z import Z")