Skip to content

Commit 2f185fb

Browse files
authored
Merge branch 'main' into issue-1090-merge-allof
2 parents 4209fb6 + fc31254 commit 2f185fb

File tree

7 files changed

+45
-2
lines changed

7 files changed

+45
-2
lines changed

.changeset/no_properties_fix.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
default: patch
3+
---
4+
5+
# Produce valid code for an object that has no properties at all
6+
7+
Fixed by PR #1109. Thanks @eli-bl!

.github/workflows/checks.yml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,13 @@ jobs:
6464
if: matrix.os == 'ubuntu-latest'
6565

6666
- name: Store coverage report
67-
uses: actions/upload-artifact@v4.3.6
67+
uses: actions/upload-artifact@v4.4.0
6868
if: matrix.os == 'ubuntu-latest'
6969
with:
7070
name: coverage-${{ matrix.python }}
7171
path: .coverage.${{ matrix.python }}
7272
if-no-files-found: error
73+
include-hidden-files: true
7374

7475
coverage:
7576
name: Combine & check coverage
@@ -106,7 +107,7 @@ jobs:
106107
.venv/bin/python -m coverage report --fail-under=100
107108
108109
- name: Upload HTML report if check failed.
109-
uses: actions/upload-artifact@v4.3.6
110+
uses: actions/upload-artifact@v4.4.0
110111
with:
111112
name: html-report
112113
path: htmlcov

end_to_end_tests/baseline_openapi_3.0.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2269,6 +2269,11 @@
22692269
}
22702270
]
22712271
},
2272+
"ModelWithNoProperties": {
2273+
"type": "object",
2274+
"properties": {},
2275+
"additionalProperties": false
2276+
},
22722277
"AllOfSubModel": {
22732278
"title": "AllOfSubModel",
22742279
"type": "object",

end_to_end_tests/baseline_openapi_3.1.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2263,6 +2263,11 @@ info:
22632263
}
22642264
]
22652265
},
2266+
"ModelWithNoProperties": {
2267+
"type": "object",
2268+
"properties": {},
2269+
"additionalProperties": false
2270+
},
22662271
"AllOfSubModel": {
22672272
"title": "AllOfSubModel",
22682273
"type": "object",

end_to_end_tests/golden-record/my_test_api_client/models/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
from .model_with_discriminated_union import ModelWithDiscriminatedUnion
6363
from .model_with_merged_properties import ModelWithMergedProperties
6464
from .model_with_merged_properties_string_to_enum import ModelWithMergedPropertiesStringToEnum
65+
from .model_with_no_properties import ModelWithNoProperties
6566
from .model_with_primitive_additional_properties import ModelWithPrimitiveAdditionalProperties
6667
from .model_with_primitive_additional_properties_a_date_holder import ModelWithPrimitiveAdditionalPropertiesADateHolder
6768
from .model_with_property_ref import ModelWithPropertyRef
@@ -141,6 +142,7 @@
141142
"ModelWithDiscriminatedUnion",
142143
"ModelWithMergedProperties",
143144
"ModelWithMergedPropertiesStringToEnum",
145+
"ModelWithNoProperties",
144146
"ModelWithPrimitiveAdditionalProperties",
145147
"ModelWithPrimitiveAdditionalPropertiesADateHolder",
146148
"ModelWithPropertyRef",
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from typing import Any, Dict, Type, TypeVar
2+
3+
from attrs import define as _attrs_define
4+
5+
T = TypeVar("T", bound="ModelWithNoProperties")
6+
7+
8+
@_attrs_define
9+
class ModelWithNoProperties:
10+
""" """
11+
12+
def to_dict(self) -> Dict[str, Any]:
13+
field_dict: Dict[str, Any] = {}
14+
15+
return field_dict
16+
17+
@classmethod
18+
def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
19+
model_with_no_properties = cls()
20+
21+
return model_with_no_properties

openapi_python_client/templates/model.py.jinja

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ return field_dict
138138
{% for lazy_import in model.lazy_imports %}
139139
{{ lazy_import }}
140140
{% endfor %}
141+
{% if (model.required_properties or model.optional_properties or model.additional_properties) %}
141142
d = src_dict.copy()
142143
{% for property in model.required_properties + model.optional_properties %}
143144
{% if property.required %}
@@ -153,6 +154,7 @@ return field_dict
153154
{% endif %}
154155

155156
{% endfor %}
157+
{% endif %}
156158
{{ module_name }} = cls(
157159
{% for property in model.required_properties + model.optional_properties %}
158160
{{ property.python_name }}={{ property.python_name }},

0 commit comments

Comments
 (0)