Skip to content

Commit

Permalink
Adjust file handling
Browse files Browse the repository at this point in the history
  • Loading branch information
oerc0122 committed May 30, 2024
1 parent d09f0c2 commit 62b3247
Show file tree
Hide file tree
Showing 4 changed files with 127 additions and 17 deletions.
2 changes: 1 addition & 1 deletion janus_core/calculations/md.py
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,7 @@ def __init__( # pylint: disable=too-many-arguments,too-many-locals,too-many-sta
self.ensemble = ensemble
self.seed = seed

FileNameMixin.__init__(self, struct, struct_name, file_prefix, self.ensemble)
FileNameMixin.__init__(self, struct, struct_name, file_prefix, ensemble)

self.log_kwargs = (
log_kwargs if log_kwargs else {}
Expand Down
2 changes: 1 addition & 1 deletion janus_core/calculations/single_point.py
Original file line number Diff line number Diff line change
Expand Up @@ -338,7 +338,7 @@ def run(

write_kwargs.setdefault(
"filename",
Path(self._build_filename("results.xyz")).absolute(),
self._build_filename("results.xyz").absolute(),
)

if self.logger:
Expand Down
23 changes: 8 additions & 15 deletions janus_core/helpers/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,20 +55,11 @@ def __init__(
Default prefix to use.
*additional
Components to add to file_prefix (joined by hyphens).
Methods
-------
_get_default_struct_name(struct, struct_name)
Return the name from the provided struct_name or generate from struct.
_get_default_prefix(file_prefix, struct_name)
Return a prefix from the provided file_prefix or from struct_name.
_build_filename(suffix, *additional, filename, prefix_override)
Return a standard format filename if filename not provided.
"""
self.struct_name = self._get_default_struct_name(struct, struct_name)

self.file_prefix = "-".join(
(self._get_default_prefix(file_prefix, self.struct_name, *additional),)
self.file_prefix = Path(
self._get_default_prefix(file_prefix, self.struct_name, *additional)
)

@staticmethod
Expand All @@ -80,7 +71,7 @@ def _get_default_struct_name(struct: Atoms, struct_name: Optional[str]) -> str:
----------
struct : Atoms
Structure of system.
struct_name : str
struct_name : Optional[str]
Name of structure.
Returns
Expand Down Expand Up @@ -145,9 +136,11 @@ def _build_filename(
Filename specified, or default filename.
"""
if filename:
return filename
prefix = prefix_override if prefix_override is not None else self.file_prefix
return "-".join((prefix, *filter(None, additional), suffix))
return Path(filename)
prefix = (
prefix_override if prefix_override is not None else str(self.file_prefix)
)
return Path("-".join((prefix, *filter(None, additional), suffix)))


def spacegroup(
Expand Down
117 changes: 117 additions & 0 deletions tests/test_filenamemixin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
"""Test FileNameMixin functions."""

from pathlib import Path

from ase.io import read
import pytest

from janus_core.helpers.utils import FileNameMixin

DATA_PATH = Path(__file__).parent / "data"
STRUCT = read(DATA_PATH / "benzene.xyz")


class DummyFileHandler(FileNameMixin): # pylint: disable=too-few-public-methods
"""
Used for testing FileNameMixin methods.
"""

def build_filename(self, *args, **kwargs):
"""
Expose _build_filename publicly.
"""
return self._build_filename(*args, **kwargs)


@pytest.mark.parametrize(
"params,struct_name,file_prefix",
(
# Defaults to structure atoms from ASE
((STRUCT, None, None), "C6H6", "C6H6"),
# Passing structure name sets file_prefix
((STRUCT, "benzene", None), "benzene", "benzene"),
# file_prefix just sets itself
((STRUCT, None, "benzene"), "C6H6", "benzene"),
((STRUCT, "benzene", "cake"), "benzene", "cake"),
# file_prefix ignores additional
((STRUCT, "benzene", "benzene", "wowzers"), "benzene", "benzene"),
# Additional only applies where no file_prefix
((STRUCT, "benzene", None, "wowzers"), "benzene", "benzene-wowzers"),
((STRUCT, None, None, "wowzers"), "C6H6", "C6H6-wowzers"),
),
)
def test_file_name_mixin_init(params, struct_name, file_prefix):
"""
Test various options for initializing the mixin.
"""
file_mix = DummyFileHandler(*params)

assert file_mix.struct_name == struct_name
assert file_mix.file_prefix == Path(file_prefix)


@pytest.mark.parametrize(
"mixin_params,file_args,file_kwargs,file_name",
(
((STRUCT, None, None), ("data.xyz",), {}, "C6H6-data.xyz"),
((STRUCT, "benzene", None), ("data.xyz",), {}, "benzene-data.xyz"),
((STRUCT, None, "benzene"), ("data.xyz",), {}, "benzene-data.xyz"),
((STRUCT, "benzene", "benzene"), ("data.xyz",), {}, "benzene-data.xyz"),
((STRUCT, "benzene", "benzene"), ("data.xyz",), {}, "benzene-data.xyz"),
(
(STRUCT, "benzene", "benzene", "wowzers"),
("data.xyz",),
{},
"benzene-data.xyz",
),
((STRUCT, None, "benzene", "wowzers"), ("data.xyz",), {}, "benzene-data.xyz"),
((STRUCT, None, None, "wowzers"), ("data.xyz",), {}, "C6H6-wowzers-data.xyz"),
# Additional stacks with base
(
(STRUCT, None, None, "wowzers"),
("data.xyz", "beef"),
{},
"C6H6-wowzers-beef-data.xyz",
),
# Prefix override ignores class options
(
(STRUCT, None, None, "wowzers"),
("data.xyz",),
{"prefix_override": "beef"},
"beef-data.xyz",
),
# But not additional
(
(STRUCT, None, None, "wowzers"),
("data.xyz", "tasty"),
{"prefix_override": "beef"},
"beef-tasty-data.xyz",
),
# Filename overrides everything
(
(STRUCT, None, None, "wowzers"),
("data.xyz",),
{"filename": "hello.xyz"},
"hello.xyz",
),
(
(STRUCT, None, None, "wowzers"),
("data.xyz",),
{"prefix_override": "beef", "filename": "hello.xyz"},
"hello.xyz",
),
(
(STRUCT, None, None, "wowzers"),
("data.xyz", "tasty"),
{"prefix_override": "beef", "filename": "hello.xyz"},
"hello.xyz",
),
),
)
def test_file_name_mixin_build(mixin_params, file_args, file_kwargs, file_name):
"""
Test building the filename for mixins
"""
file_mix = DummyFileHandler(*mixin_params)

assert file_mix.build_filename(*file_args, **file_kwargs) == Path(file_name)

0 comments on commit 62b3247

Please sign in to comment.