1515from . import config , formats , hooks
1616from .converters import Converter , List , map_type , resolve
1717from .types import Missing , Trilean
18- from .utils import display , get_default_field_value , recursive_update , write
18+ from .utils import display , get_default_field_value , recursive_update , write , remove
1919
2020
2121class Mapper :
@@ -45,6 +45,7 @@ def __init__(
4545 self ._last_load = 0.0
4646 self ._last_data : Dict = {}
4747 self ._root = root
48+ self ._original_path = self .path
4849
4950 @property
5051 def classname (self ) -> str :
@@ -264,6 +265,14 @@ def save(self, *, include_default_values: Trilean = None, _log=True) -> None:
264265 self ._root .save (include_default_values = include_default_values , _log = _log )
265266 return
266267
268+ # Determine whether the attributes that are involved in the path were changed
269+ file_rename_required = False
270+ with hooks .disabled (): # hooks have to be disabled to prevent infinite loop
271+ del self .__dict__ ["path" ] # invalidate the cached property
272+
273+ if self .path != self ._original_path :
274+ file_rename_required = True
275+
267276 if self .path :
268277 if self .exists and self ._frozen :
269278 raise dataclasses .FrozenInstanceError (
@@ -279,6 +288,9 @@ def save(self, *, include_default_values: Trilean = None, _log=True) -> None:
279288 text = self ._get_text (include_default_values = include_default_values )
280289
281290 write (self .path , text , display = True )
291+ if file_rename_required :
292+ remove (self ._original_path )
293+ self ._original_path = self .path
282294
283295 self .modified = False
284296
0 commit comments