From 3bd21602f29be274fbdf7f68ccdba5f6b9acec11 Mon Sep 17 00:00:00 2001 From: Eli Bishop Date: Mon, 26 Aug 2024 20:03:31 -0700 Subject: [PATCH] fix: don't declare unused variable if model has no properties --- .changeset/no_properties_fix.md | 7 +++++++ end_to_end_tests/baseline_openapi_3.0.json | 5 +++++ end_to_end_tests/baseline_openapi_3.1.yaml | 5 +++++ .../my_test_api_client/models/__init__.py | 2 ++ .../models/model_with_no_properties.py | 21 +++++++++++++++++++ .../templates/model.py.jinja | 2 ++ 6 files changed, 42 insertions(+) create mode 100644 .changeset/no_properties_fix.md create mode 100644 end_to_end_tests/golden-record/my_test_api_client/models/model_with_no_properties.py diff --git a/.changeset/no_properties_fix.md b/.changeset/no_properties_fix.md new file mode 100644 index 000000000..9b38ad1ba --- /dev/null +++ b/.changeset/no_properties_fix.md @@ -0,0 +1,7 @@ +--- +default: patch +--- + +# Produce valid code for an object that has no properties at all + +Fixed by PR #1109. Thanks @eli-bl! diff --git a/end_to_end_tests/baseline_openapi_3.0.json b/end_to_end_tests/baseline_openapi_3.0.json index f34f27366..4edb2921e 100644 --- a/end_to_end_tests/baseline_openapi_3.0.json +++ b/end_to_end_tests/baseline_openapi_3.0.json @@ -2175,6 +2175,11 @@ } ] }, + "ModelWithNoProperties": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, "AllOfSubModel": { "title": "AllOfSubModel", "type": "object", diff --git a/end_to_end_tests/baseline_openapi_3.1.yaml b/end_to_end_tests/baseline_openapi_3.1.yaml index 13d267b77..ac56bff86 100644 --- a/end_to_end_tests/baseline_openapi_3.1.yaml +++ b/end_to_end_tests/baseline_openapi_3.1.yaml @@ -2181,6 +2181,11 @@ info: } ] }, + "ModelWithNoProperties": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, "AllOfSubModel": { "title": "AllOfSubModel", "type": "object", diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/__init__.py b/end_to_end_tests/golden-record/my_test_api_client/models/__init__.py index 7435983e3..a83f6aad9 100644 --- a/end_to_end_tests/golden-record/my_test_api_client/models/__init__.py +++ b/end_to_end_tests/golden-record/my_test_api_client/models/__init__.py @@ -58,6 +58,7 @@ from .model_with_circular_ref_in_additional_properties_b import ModelWithCircularRefInAdditionalPropertiesB from .model_with_date_time_property import ModelWithDateTimeProperty from .model_with_discriminated_union import ModelWithDiscriminatedUnion +from .model_with_no_properties import ModelWithNoProperties from .model_with_primitive_additional_properties import ModelWithPrimitiveAdditionalProperties from .model_with_primitive_additional_properties_a_date_holder import ModelWithPrimitiveAdditionalPropertiesADateHolder from .model_with_property_ref import ModelWithPropertyRef @@ -133,6 +134,7 @@ "ModelWithCircularRefInAdditionalPropertiesB", "ModelWithDateTimeProperty", "ModelWithDiscriminatedUnion", + "ModelWithNoProperties", "ModelWithPrimitiveAdditionalProperties", "ModelWithPrimitiveAdditionalPropertiesADateHolder", "ModelWithPropertyRef", diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_no_properties.py b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_no_properties.py new file mode 100644 index 000000000..506239f32 --- /dev/null +++ b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_no_properties.py @@ -0,0 +1,21 @@ +from typing import Any, Dict, Type, TypeVar + +from attrs import define as _attrs_define + +T = TypeVar("T", bound="ModelWithNoProperties") + + +@_attrs_define +class ModelWithNoProperties: + """ """ + + def to_dict(self) -> Dict[str, Any]: + field_dict: Dict[str, Any] = {} + + return field_dict + + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + model_with_no_properties = cls() + + return model_with_no_properties diff --git a/openapi_python_client/templates/model.py.jinja b/openapi_python_client/templates/model.py.jinja index 44f5bf148..2d22efe05 100644 --- a/openapi_python_client/templates/model.py.jinja +++ b/openapi_python_client/templates/model.py.jinja @@ -138,6 +138,7 @@ return field_dict {% for lazy_import in model.lazy_imports %} {{ lazy_import }} {% endfor %} +{% if (model.required_properties or model.optional_properties or model.additional_properties) %} d = src_dict.copy() {% for property in model.required_properties + model.optional_properties %} {% if property.required %} @@ -153,6 +154,7 @@ return field_dict {% endif %} {% endfor %} +{% endif %} {{ module_name }} = cls( {% for property in model.required_properties + model.optional_properties %} {{ property.python_name }}={{ property.python_name }},