@@ -312,7 +312,7 @@ def _tmp_file_name(
312312 path : epath .PathLike ,
313313 subfolder : str | None = None ,
314314) -> epath .Path :
315- """Returns the temporary file name for the given path.
315+ """Returns the temporary file path dependent on the given path and subfolder .
316316
317317 Args:
318318 path: The path to the file.
@@ -322,9 +322,12 @@ def _tmp_file_name(
322322 path = epath .Path (path )
323323 file_name = f'{ _tmp_file_prefix ()} .{ path .name } '
324324 if subfolder :
325- return path .parent / subfolder / file_name
325+ tmp_path = path .parent / subfolder / file_name
326326 else :
327- return path .parent / file_name
327+ tmp_path = path .parent / file_name
328+ # Create the parent directory if it doesn't exist.
329+ tmp_path .parent .mkdir (parents = True , exist_ok = True )
330+ return tmp_path
328331
329332
330333@contextlib .contextmanager
@@ -334,7 +337,6 @@ def incomplete_file(
334337) -> Iterator [epath .Path ]:
335338 """Writes to path atomically, by writing to temp file and renaming it."""
336339 tmp_path = _tmp_file_name (path , subfolder = subfolder )
337- tmp_path .parent .mkdir (exist_ok = True )
338340 try :
339341 yield tmp_path
340342 tmp_path .replace (path )
@@ -346,20 +348,24 @@ def incomplete_file(
346348@contextlib .contextmanager
347349def incomplete_files (
348350 path : epath .Path ,
351+ subfolder : str | None = None ,
349352) -> Iterator [epath .Path ]:
350353 """Writes to path atomically, by writing to temp file and renaming it."""
351- tmp_file_prefix = _tmp_file_prefix ( )
352- tmp_path = path . parent / f' { tmp_file_prefix } .{ path .name } '
354+ tmp_path = _tmp_file_name ( path , subfolder = subfolder )
355+ tmp_file_prefix = tmp_path . name . removesuffix ( f' .{ path .name } ')
353356 try :
354357 yield tmp_path
355358 # Rename all tmp files to their final name.
356- for tmp_file in path .parent .glob (f'{ tmp_file_prefix } .*' ):
359+ for tmp_file in tmp_path .parent .glob (f'{ tmp_file_prefix } .*' ):
357360 file_name = tmp_file .name .removeprefix (tmp_file_prefix + '.' )
358361 tmp_file .replace (path .parent / file_name )
359362 finally :
360363 # Eventually delete the tmp_path if exception was raised
361- for tmp_file in path .parent .glob (f'{ tmp_file_prefix } .*' ):
362- tmp_file .unlink (missing_ok = True )
364+ if subfolder :
365+ tmp_path .parent .unlink (missing_ok = True )
366+ else :
367+ for tmp_file in tmp_path .parent .glob (f'{ tmp_file_prefix } .*' ):
368+ tmp_file .unlink (missing_ok = True )
363369
364370
365371def is_incomplete_file (path : epath .Path ) -> bool :
0 commit comments