Skip to content

Commit ceaba5b

Browse files
author
Tomas Babej
committed
Mapper: Support renaming the file during save() if required
1 parent 5d72550 commit ceaba5b

1 file changed

Lines changed: 13 additions & 1 deletion

File tree

datafiles/mapper.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
from . import config, formats, hooks
1616
from .converters import Converter, List, map_type, resolve
1717
from .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

2121
class 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

Comments
 (0)