@@ -161,9 +161,14 @@ def test_log_print_passes(tmp_path, capsys):
161161def test_as_clean_dict_passes ():
162162 """Test as_clean_dict function with valid inputs."""
163163
164+ @dataclass
165+ class MoreNestedTestClass :
166+ listkey : list | None = None
167+ dictkey : dict | None = None
168+
164169 @dataclass
165170 class NestedTestClass :
166- nested_key : str | None = None
171+ more_nested : MoreNestedTestClass | None = None
167172
168173 @dataclass
169174 class TestClass :
@@ -184,10 +189,58 @@ class TestClass:
184189 dclass .dictkey = {}
185190 dclass .boolkey = False
186191 dclass .nested = NestedTestClass ()
192+ dclass .nested .more_nested = MoreNestedTestClass (dictkey = {}, listkey = [])
187193 assert hlp .ascleandict (dclass ) == {"intkey" : 0 , "strkey" : "" , "boolkey" : False }
194+ assert "nested" not in hlp .ascleandict (dclass )
188195
189196 assert hlp .ascleandict (dclass , remove_false = True ) == {"intkey" : 0 , "strkey" : "" }
190197
198+ @dataclass
199+ class DataWithList :
200+ items : list
201+ name : str
202+
203+ data2 = DataWithList (
204+ items = [{"value" : 1 , "empty_dict" : {}}, {"value" : 2 , "none_val" : None }, [], {}],
205+ name = "test" ,
206+ )
207+ result2 = hlp .ascleandict (data2 )
208+ assert result2 == {"name" : "test" , "items" : [{"value" : 1 }, {"value" : 2 }]}
209+
210+
211+ def test_ascleandict_nested_cleanup_multiple_passes ():
212+ """Test that ascleandict removes cascading empty nested structures."""
213+
214+ @dataclass
215+ class DeepNested :
216+ value : str | None = None
217+
218+ @dataclass
219+ class MidLevel :
220+ deep : DeepNested | None = None
221+ data : dict | None = None
222+
223+ @dataclass
224+ class TopLevel :
225+ mid : MidLevel | None = None
226+ name : str = "test"
227+
228+ # Create data where cleaning cascades:
229+ # - DeepNested.value = None gets removed
230+ # - MidLevel.deep becomes {} and gets removed
231+ # - MidLevel.data is already {} and gets removed
232+ # - MidLevel itself might become {} and gets removed
233+ data = TopLevel (
234+ name = "test" ,
235+ mid = MidLevel (
236+ deep = DeepNested (value = None ), # Becomes {}
237+ data = {"inner" : None }, # Becomes {}
238+ ),
239+ )
240+ result = hlp .ascleandict (data )
241+ # The while loop should run multiple times, executing line 190
242+ assert result == {"name" : "test" }
243+
191244
192245def test_unix_timestamp ():
193246 """Test unix_timestamp function."""
0 commit comments