11"""Test dataclass support for runtime_docs."""
22
33import dataclasses
4- from dataclasses import dataclass , field , InitVar
5- from typing import List , Dict , Optional , ClassVar
4+ from dataclasses import InitVar , dataclass , field
65from enum import Enum
7-
6+ from typing import ClassVar
87
98from runtime_docstrings import docstrings , get_docstrings
109
@@ -20,12 +19,12 @@ class BasicDataClass:
2019 age : int = 30
2120 """The age field with default value."""
2221
23- tags : List [str ] = dataclasses .field (default_factory = list )
22+ tags : list [str ] = dataclasses .field (default_factory = list )
2423 """List of tags associated with this entity."""
2524
2625 active : bool = True
2726
28- description : Optional [ str ] = None
27+ description : str | None = None
2928 """Optional description text."""
3029
3130
@@ -87,31 +86,27 @@ class SlottedDataClass:
8786 age : int = 30
8887 """The age field with default value."""
8988
90- tags : List [str ] = field (default_factory = list )
89+ tags : list [str ] = field (default_factory = list )
9190 """List of tags associated with this entity."""
9291
9392 active : bool = True
9493
95- description : Optional [ str ] = None
94+ description : str | None = None
9695 """Optional description text."""
9796
9897
9998def test_slotted_dataclass_docstrings ():
10099 """Test that docstrings are correctly extracted from slotted dataclass fields."""
101100 docs = get_docstrings (SlottedDataClass )
102101
103- assert "name" in docs
104102 assert docs ["name" ] == "The name field."
105103
106- assert "age" in docs
107104 assert docs ["age" ] == "The age field with default value."
108105
109- assert "tags" in docs
110106 assert docs ["tags" ] == "List of tags associated with this entity."
111107
112108 assert "active" not in docs # No docstring for this field
113109
114- assert "description" in docs
115110 assert docs ["description" ] == "Optional description text."
116111
117112
@@ -148,36 +143,31 @@ class DataClassWithMetadata:
148143 """The name field with metadata."""
149144
150145 age : int = field (
151- default = 30 , metadata = {"validator" : "int_validator" , "min" : 0 , "max" : 120 }
146+ default = 30 ,
147+ metadata = {"validator" : "int_validator" , "min" : 0 , "max" : 120 },
152148 )
153149 """The age field with default value and metadata."""
154150
155- tags : List [str ] = field (
156- default_factory = list , metadata = {"doc" : "Existing doc in metadata" }
151+ tags : list [str ] = field (
152+ default_factory = list ,
153+ metadata = {"doc" : "Existing doc in metadata" },
157154 )
158155 """List of tags with existing doc in metadata."""
159156
160157
161158def test_field_metadata_docstrings ():
162159 """Test that docstrings are correctly added to field metadata."""
163-
164160 fields = {f .name : f for f in dataclasses .fields (DataClassWithMetadata )}
165161
166162 # Check that the field docstrings are correctly stored
167163 assert "name" in fields
168164 assert fields ["name" ].metadata ["__doc__" ] == "The name field with metadata."
169165
170166 assert "age" in fields
171- assert (
172- fields ["age" ].metadata ["__doc__" ]
173- == "The age field with default value and metadata."
174- )
167+ assert fields ["age" ].metadata ["__doc__" ] == "The age field with default value and metadata."
175168
176169 assert "tags" in fields
177- assert (
178- fields ["tags" ].metadata ["__doc__" ]
179- == "List of tags with existing doc in metadata."
180- )
170+ assert fields ["tags" ].metadata ["__doc__" ] == "List of tags with existing doc in metadata."
181171
182172
183173def test_field_metadata_preservation ():
@@ -248,9 +238,7 @@ def test_dataclass_inheritance():
248238 assert "shared_field" in grandparent_docs
249239 assert grandparent_docs ["shared_field" ] == "Shared field from grandparent."
250240 assert "another_shared" in grandparent_docs
251- assert (
252- grandparent_docs ["another_shared" ] == "Another shared field from grandparent."
253- )
241+ assert grandparent_docs ["another_shared" ] == "Another shared field from grandparent."
254242
255243 parent_docs = get_docstrings (ParentDataClass )
256244 assert "parent_field" in parent_docs
@@ -282,10 +270,7 @@ def test_dataclass_inheritance():
282270 assert ParentDataClass .__doc_shared_field__ == "Shared field from parent."
283271
284272 assert hasattr (GrandParentDataClass , "__doc_another_shared__" )
285- assert (
286- GrandParentDataClass .__doc_another_shared__
287- == "Another shared field from grandparent."
288- )
273+ assert GrandParentDataClass .__doc_another_shared__ == "Another shared field from grandparent."
289274
290275 assert hasattr (ChildDataClass , "__doc_another_shared__" )
291276 assert ChildDataClass .__doc_another_shared__ == "Overridden shared field."
@@ -301,10 +286,7 @@ def test_dataclass_inheritance():
301286 assert ParentDataClass .__doc_parent_field__ == "The parent field."
302287 assert ParentDataClass .__doc_grandparent_field__ == "The grandparent field."
303288 assert ParentDataClass .__doc_shared_field__ == "Shared field from parent."
304- assert (
305- ParentDataClass .__doc_another_shared__
306- == "Another shared field from grandparent."
307- )
289+ assert ParentDataClass .__doc_another_shared__ == "Another shared field from grandparent."
308290
309291
310292@docstrings
@@ -430,7 +412,6 @@ def test_api_consistency():
430412
431413def test_complex_inheritance_mro ():
432414 """Test MRO resolution with complex inheritance involving different class types."""
433-
434415 # Test MRO resolution for complex inheritance
435416 assert ComplexInheritance .__doc_complex_field__ == "Complex field."
436417
@@ -526,10 +507,7 @@ def test_multi_level_mixed_inheritance():
526507 # Test MRO resolution for intermediate class
527508 assert IntermediateDataClass .__doc_base_attr__ == "Base attribute."
528509 assert IntermediateDataClass .__doc_intermediate_field__ == "Intermediate field."
529- assert (
530- IntermediateDataClass .__doc_shared_attr__
531- == "Shared attribute from intermediate."
532- )
510+ assert IntermediateDataClass .__doc_shared_attr__ == "Shared attribute from intermediate."
533511
534512 # Test instance creation and attribute access
535513 child_instance = ChildRegularClass ()
@@ -625,11 +603,11 @@ def test_special_char_docstrings():
625603class DefaultFactoryDataClass :
626604 """A dataclass with default factory functions."""
627605
628- simple_list : List [str ] = field (default_factory = list )
606+ simple_list : list [str ] = field (default_factory = list )
629607 """A simple list with default factory."""
630608
631- complex_dict : Dict [str , List [int ]] = field (
632- default_factory = lambda : {"default" : [1 , 2 , 3 ]}
609+ complex_dict : dict [str , list [int ]] = field (
610+ default_factory = lambda : {"default" : [1 , 2 , 3 ]},
633611 )
634612 """A complex dictionary with default factory lambda."""
635613
@@ -740,7 +718,7 @@ class ClassVarDataClass:
740718 DEFAULT_AGE : ClassVar [int ] = 30
741719 """Default age constant."""
742720
743- CONSTANTS : ClassVar [Dict [str , str ]] = {"DEFAULT_NAME" : "Unknown" }
721+ CONSTANTS : ClassVar [dict [str , str ]] = {"DEFAULT_NAME" : "Unknown" }
744722 """Dictionary of constants."""
745723
746724
0 commit comments