Skip to content

Commit 835c066

Browse files
authored
fix: Prevent crash in case of empty dataclasses (#56)
fix: Prevent crash in case of empty dataclasses We iterate on `__dataclass_fields__` instead of `__annotations__` since we already assert its existence. References: #56
1 parent c817114 commit 835c066

File tree

3 files changed

+21
-4
lines changed

3 files changed

+21
-4
lines changed

Diff for: src/pytkdocs/loader.py

+5-4
Original file line numberDiff line numberDiff line change
@@ -405,14 +405,15 @@ def get_class_documentation(self, node: ObjectNode, select_members=None) -> Clas
405405
self.select_inherited_members and "__fields__" in all_members
406406
):
407407
root_object.properties = ["dataclass"]
408-
for field_name, annotation in all_members["__annotations__"].items():
409-
if self.select(field_name, select_members) and ( # type: ignore
408+
409+
for field in all_members["__dataclass_fields__"].values():
410+
if self.select(field.name, select_members) and ( # type: ignore
410411
self.select_inherited_members
411412
# Same comment as for Pydantic models
412-
or field_name
413+
or field.name
413414
not in chain(*(getattr(cls, "__dataclass_fields__", {}).keys() for cls in class_.__mro__[1:-1]))
414415
):
415-
child_node = ObjectNode(obj=annotation, name=field_name, parent=node)
416+
child_node = ObjectNode(obj=field.type, name=field.name, parent=node)
416417
root_object.add_child(self.get_annotated_dataclass_field(child_node))
417418

418419
return root_object

Diff for: tests/fixtures/dataclass.py

+7
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,10 @@ class Person:
88
name: str
99
age: int
1010
"""Field description."""
11+
12+
13+
@dataclass
14+
class Empty:
15+
"""A dataclass without any fields"""
16+
17+
pass

Diff for: tests/test_loader.py

+9
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,15 @@ def test_loading_dataclass():
148148
assert "dataclass" not in not_dataclass.properties
149149

150150

151+
def test_loading_empty_dataclass():
152+
"""Handle empty dataclasses."""
153+
loader = Loader()
154+
obj = loader.get_object_documentation("tests.fixtures.dataclass.Empty")
155+
assert obj.docstring == "A dataclass without any fields"
156+
assert len(obj.attributes) == 0
157+
assert "dataclass" in obj.properties
158+
159+
151160
def test_loading_pydantic_model():
152161
"""Handle Pydantic models."""
153162
loader = Loader()

0 commit comments

Comments
 (0)