@@ -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,32 +337,38 @@ 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 )
341343 finally :
342344 # Eventually delete the tmp_path if exception was raised
343- tmp_path .unlink (missing_ok = True )
345+ if subfolder :
346+ tmp_path .parent .unlink (missing_ok = True )
347+ else :
348+ tmp_path .unlink (missing_ok = True )
344349
345350
346351@contextlib .contextmanager
347352def incomplete_files (
348353 path : epath .Path ,
354+ subfolder : str | None = None ,
349355) -> Iterator [epath .Path ]:
350356 """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 } '
357+ tmp_path = _tmp_file_name ( path , subfolder = subfolder )
358+ tmp_file_prefix = tmp_path . name . removesuffix ( f' .{ path .name } ')
353359 try :
354360 yield tmp_path
355361 # Rename all tmp files to their final name.
356- for tmp_file in path .parent .glob (f'{ tmp_file_prefix } .*' ):
362+ for tmp_file in tmp_path .parent .glob (f'{ tmp_file_prefix } .*' ):
357363 file_name = tmp_file .name .removeprefix (tmp_file_prefix + '.' )
358364 tmp_file .replace (path .parent / file_name )
359365 finally :
360366 # 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 )
367+ if subfolder :
368+ tmp_path .parent .unlink (missing_ok = True )
369+ else :
370+ for tmp_file in tmp_path .parent .glob (f'{ tmp_file_prefix } .*' ):
371+ tmp_file .unlink (missing_ok = True )
363372
364373
365374def is_incomplete_file (path : epath .Path ) -> bool :
0 commit comments