1111
1212import logging
1313import shutil
14+ import typing
1415from pathlib import Path
1516from typing import TYPE_CHECKING , TypeVar
1617
@@ -50,6 +51,13 @@ class Project:
5051
5152 """
5253
54+ SUBFOLDERS : typing .ClassVar = {
55+ "data" : "data" ,
56+ "processed" : "processed" ,
57+ "other" : "other" ,
58+ "log" : "log" ,
59+ }
60+
5361 def __init__ ( # noqa: PLR0913
5462 self ,
5563 folder : Path ,
@@ -164,14 +172,14 @@ def build(
164172 afm .close ()
165173 move_tree (
166174 source = self .folder ,
167- destination = self .folder / "other" ,
175+ destination = self .folder / self . SUBFOLDERS [ "other" ] ,
168176 excluded_paths = {file .path for file in ads .files }
169177 | set (
170- (self .folder / "log" ).iterdir ()
171- if (self .folder / "log" ).exists ()
178+ (self .folder / self . SUBFOLDERS [ "log" ] ).iterdir ()
179+ if (self .folder / self . SUBFOLDERS [ "log" ] ).exists ()
172180 else (),
173181 )
174- | {self .folder / "log" },
182+ | {self .folder / self . SUBFOLDERS [ "log" ] },
175183 )
176184 self ._sort_dataset (ads )
177185 ads .write_json (ads .folder )
@@ -228,7 +236,7 @@ def _create_logger(self) -> None:
228236 self .logger = logging .getLogger ()
229237 return
230238
231- logs_directory = self .folder / "log"
239+ logs_directory = self .folder / self . SUBFOLDERS [ "log" ]
232240 if not logs_directory .exists ():
233241 logs_directory .mkdir (mode = DPDEFAULT , parents = True )
234242 self .logger = logging .getLogger ("project" ).getChild (self .folder .name )
@@ -250,10 +258,35 @@ def reset(self) -> None:
250258 afm .close ()
251259
252260 files_to_remove = list (self .folder .iterdir ())
261+
262+ misplaced_files = []
263+ for file in files_to_remove :
264+ if file .name == "project.json" :
265+ continue
266+ if file in (
267+ self .folder / subfolder for subfolder in self .SUBFOLDERS .values ()
268+ ):
269+ continue
270+ if any (
271+ (self .folder / subfolder ) in file .parents
272+ for subfolder in self .SUBFOLDERS .values ()
273+ ):
274+ continue
275+ misplaced_files .append (file )
276+ if misplaced_files :
277+ msg = (
278+ f"The following files would be deleted by a reset.\n "
279+ f"Either delete them manually or move them to the "
280+ f"{ self .folder / self .SUBFOLDERS ['other' ]} folder "
281+ f"before resetting the project:\n "
282+ )
283+ msg += "\n " .join (file .name for file in misplaced_files )
284+ raise RuntimeError (msg )
285+
253286 self .get_output ("original" ).move_files (self .folder )
254287
255- if self .folder / "other" in files_to_remove :
256- move_tree (self .folder / "other" , self .folder )
288+ if self .folder / self . SUBFOLDERS [ "other" ] in files_to_remove :
289+ move_tree (self .folder / self . SUBFOLDERS [ "other" ] , self .folder )
257290
258291 self .logger .handlers .clear ()
259292
@@ -458,7 +491,7 @@ def _get_audio_dataset_subpath(
458491 ) -> Path :
459492 return (
460493 self .folder
461- / "data"
494+ / self . SUBFOLDERS [ "data" ]
462495 / "audio"
463496 / (
464497 f"{ round (ads .data_duration .total_seconds ())} _{ round (ads .sample_rate )} "
@@ -585,7 +618,7 @@ def export(
585618 "dataset-json-path" : self .folder / "project.json" ,
586619 },
587620 name = name + (f"_{ index } " if len (batch_indexes ) > 1 else "" ),
588- output_folder = self .folder / "log" ,
621+ output_folder = self .folder / self . SUBFOLDERS [ "log" ] ,
589622 )
590623 self .job_builder .submit_pbs ()
591624
@@ -612,7 +645,7 @@ def _get_spectro_dataset_subpath(
612645 fft_folder = f"{ sds .fft .mfft } _{ sds .fft .win .shape [0 ]} _{ sds .fft .hop } _linear"
613646 return (
614647 self .folder
615- / "processed"
648+ / self . SUBFOLDERS [ "processed" ]
616649 / (ads_folder / fft_folder if sds .has_default_name else sds .name )
617650 )
618651
0 commit comments