Skip to content

Commit ab9e460

Browse files
committed
Refactor clean_rundir and related
1 parent fa89458 commit ab9e460

File tree

5 files changed

+37
-28
lines changed

5 files changed

+37
-28
lines changed

tests/local_scripts/complete_pytest.tin

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ echo "" >> complete_pytest.tin.out
2929
# buildcell
3030
export WFL_PYTEST_BUILDCELL=$HOME/src/work/AIRSS/airss-0.9.1/src/buildcell/src/buildcell
3131
# VASP
32-
module load dft/vasp
32+
module load dft/vasp/serial
3333
export ASE_VASP_COMMAND=vasp.serial
3434
export ASE_VASP_COMMAND_GAMMA=vasp.gamma.serial
3535
export PYTEST_VASP_POTCAR_DIR=$VASP_PATH/pot/rev_54/PBE

wfl/calculators/castep.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class Castep(WFLFileIOCalculator, ASE_Castep):
2525
what kind of files to keep from the run
2626
- True : everything kept
2727
- None, False : nothing kept, unless calculation fails
28-
- "default" : only ones needed for NOMAD uploads ('\*.pwo')
28+
- "default" : only ones needed for NOMAD uploads ('\*.{castep,param,cell}')
2929
- list(str) : list of file globs to save
3030
rundir_prefix: str / Path, default 'run\_CASTEP\_'
3131
Run directory name prefix

wfl/calculators/orca/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class ORCA(WFLFileIOCalculator, ASE_ORCA):
3434
what kind of files to keep from the run
3535
- True : everything kept
3636
- None, False : nothing kept, unless calculation fails
37-
- "default" : only ones needed for NOMAD uploads ('\*.pwo')
37+
- "default" : only ones needed for NOMAD uploads ('\*.{inp,out,engrad,xyz,_traj.xyz}')
3838
- list(str) : list of file globs to save
3939
rundir_prefix: str / Path, default 'ORCA\_'
4040
Run directory name prefix

wfl/calculators/utils.py

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from pathlib import Path
2+
13
from wfl.utils.file_utils import clean_dir
24

35
def clean_rundir(rundir, keep_files, default_keep_files, calculation_succeeded):
@@ -7,19 +9,30 @@ def clean_rundir(rundir, keep_files, default_keep_files, calculation_succeeded):
79
----------
810
rundir: str
911
path to run dir
10-
keep_files: 'default' / list(str) / '*' / bool / None
12+
keep_files: 'default' / iterable(file_glob) / '*' / bool / None
1113
files to keep, None or False for nothing, '*' or True for all
1214
default_keep_files: list(str)
1315
files to keep if keep_files == 'default' or calculation_succeeded is False
16+
and keep_files is not True
1417
calculation_succeeded: bool
1518
"""
16-
if not calculation_succeeded:
17-
clean_dir(rundir, set(default_keep_files) | set(keep_files if keep_files else []), force=False)
18-
elif keep_files == 'default':
19-
clean_dir(rundir, default_keep_files, force=False)
20-
elif not keep_files:
21-
clean_dir(rundir, False, force=False)
22-
else:
23-
clean_dir(rundir, keep_files, force=False)
19+
if isinstance(keep_files, str):
20+
if keep_files == 'default':
21+
keep_files = default_keep_files
22+
elif keep_files == '*'
23+
keep_files = [keep_files]
24+
else:
25+
raise ValueError(f"str keep_files can only be 'default' or '*', not '{keep_files}'")
2426

27+
# now keep_files should either be True, evaluate to False, or an iterable
28+
29+
# calculation failed, default optionally union with keep_files
30+
if not calculation_succeeded:
31+
if not keep_files:
32+
keep_files = default_keep_files
33+
elif keep_files is not True:
34+
keep_files = set(default_keep_files) | set(keep_files)
35+
else:
36+
raise ValueError(f"Unknown type or value for keep_files '{keep_files}'")
2537

38+
clean_dir(rundir, keep_files, force=False)

wfl/utils/file_utils.py

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ def clean_dir(directory, keep_files, force=False):
99
Parameters
1010
----------
1111
directory : directory to be cleaned
12-
keep_files: bool or list(filenames) or str
12+
keep_files: bool or iterable(file_globs)
1313
What to keep in rundir when done:
14-
- list(filenames) : ONLY these filenames if they exist
15-
- True or "*" : everything - does nothing
16-
- False or None : remove everything, or anything evaluating to False in if
14+
- True : keep everything
15+
- iterable : ONLY files matching these globs if they exist
16+
- evaluates to False : nothing
1717
force : bool, default = False
1818
fail if directory does not exist
1919
@@ -29,21 +29,19 @@ def clean_dir(directory, keep_files, force=False):
2929
else:
3030
return
3131

32-
# defaults
33-
if keep_files is None:
34-
keep_files = False
35-
elif keep_files == "*":
36-
keep_files = True
37-
elif isinstance(keep_files, str):
38-
keep_files = [keep_files]
32+
if isinstance(keep_files, str):
33+
# common error that will not be caught below
34+
raise ValueError(f"keep_files must not be str '{keep_files}'")
3935

4036
# operations
41-
if isinstance(keep_files, bool) and keep_files:
37+
if keep_files is True:
38+
# bool True, keep all
4239
return
4340
elif not keep_files:
44-
# lets None and anything else evaluating to False
41+
# evaluates to False, keep none
4542
shutil.rmtree(directory)
46-
elif isinstance(keep_files, (list, tuple, set)):
43+
else:
44+
# keep_files should be an iterable
4745
extended_keep_files = []
4846
for glob_index in keep_files:
4947
extended_keep_files.extend(glob(os.path.join(directory, glob_index)))
@@ -56,5 +54,3 @@ def clean_dir(directory, keep_files, force=False):
5654
os.remove(abs_fn)
5755
else:
5856
shutil.rmtree(abs_fn)
59-
else:
60-
raise RuntimeError('Got unknown type or value for keep_rundir \'{}\''.format(keep_files))

0 commit comments

Comments
 (0)