diff --git a/src/hermes/model/context_manager.py b/src/hermes/model/context_manager.py index e6975481..0c641619 100644 --- a/src/hermes/model/context_manager.py +++ b/src/hermes/model/context_manager.py @@ -55,10 +55,18 @@ def prepare_step(self, step: str, *depends: str) -> None: self._current_step.append(step) def finalize_step(self, step: str) -> None: - current_step = self._current_step.pop() - if current_step != step: - raise ValueError("Cannot end step %s while in %s.", step, self._current_step[-1]) + if len(self._current_step) < 1: + raise ValueError("There is no step to end.") + if self._current_step[-1] != step: + raise ValueError(f"Cannot end step {step} while in {self._current_step[-1]}.") + self._current_step.pop() def __getitem__(self, source_name: str) -> HermesCache: + if len(self._current_step) < 1: + raise HermesContexError("Prepare a step first.") subdir = self.cache_dir / self._current_step[-1] / source_name return HermesCache(subdir) + + +class HermesContexError(Exception): + pass diff --git a/test/__init__.py b/test/__init__.py new file mode 100644 index 00000000..0e85f01e --- /dev/null +++ b/test/__init__.py @@ -0,0 +1,3 @@ +# SPDX-FileCopyrightText: 2025 German Aerospace Center (DLR) +# +# SPDX-License-Identifier: Apache-2.0 diff --git a/test/hermes_test/__init__.py b/test/hermes_test/__init__.py index faf5a2f5..0e85f01e 100644 --- a/test/hermes_test/__init__.py +++ b/test/hermes_test/__init__.py @@ -1,3 +1,3 @@ -# SPDX-FileCopyrightText: 2022 German Aerospace Center (DLR) +# SPDX-FileCopyrightText: 2025 German Aerospace Center (DLR) # # SPDX-License-Identifier: Apache-2.0 diff --git a/test/hermes_test/model/test_base_context.py b/test/hermes_test/model/test_base_context.py deleted file mode 100644 index bdf016b7..00000000 --- a/test/hermes_test/model/test_base_context.py +++ /dev/null @@ -1,38 +0,0 @@ -# SPDX-FileCopyrightText: 2022 German Aerospace Center (DLR) -# -# SPDX-License-Identifier: Apache-2.0 - -# SPDX-FileContributor: Michael Meinel - -from pathlib import Path - -from hermes.model.context import HermesContext - - -def test_context_hermes_dir_default(): - ctx = HermesContext() - assert ctx.hermes_dir == Path('.') / '.hermes' - - -def test_context_hermes_dir_custom(): - ctx = HermesContext('spam') - assert ctx.hermes_dir == Path('spam') / '.hermes' - - -def test_context_get_cache_default(): - ctx = HermesContext() - assert ctx.get_cache('spam', 'eggs') == Path('.') / '.hermes' / 'spam' / 'eggs.json' - - -def test_context_get_cache_cached(): - ctx = HermesContext() - ctx._caches[('spam', 'eggs')] = Path('spam_and_eggs') - assert ctx.get_cache('spam', 'eggs') == Path('spam_and_eggs') - - -def test_context_get_cache_create(tmpdir): - ctx = HermesContext(tmpdir) - subdir = Path(tmpdir) / '.hermes' / 'spam' - - assert ctx.get_cache('spam', 'eggs', create=True) == subdir / 'eggs.json' - assert subdir.exists() diff --git a/test/hermes_test/model/test_context_manager.py b/test/hermes_test/model/test_context_manager.py new file mode 100644 index 00000000..231e4df1 --- /dev/null +++ b/test/hermes_test/model/test_context_manager.py @@ -0,0 +1,87 @@ +# SPDX-FileCopyrightText: 2025 German Aerospace Center (DLR) +# +# SPDX-License-Identifier: Apache-2.0 + +# SPDX-FileContributor: Michael Meinel +# SPDX-FileContributor: Sophie Kernchen +import pytest +from pathlib import Path + +from hermes.model.context_manager import HermesContext, HermesCache, HermesContexError + + +def test_context_hermes_dir_default(): + ctx = HermesContext() + assert ctx.cache_dir == Path('./.hermes').absolute() + + +def test_context_hermes_dir_custom(): + ctx = HermesContext(Path('spam')) + assert ctx.cache_dir == Path('spam') / '.hermes' + + +def test_get_context_default(): + ctx = HermesContext() + ctx.prepare_step("ham") + assert ctx["spam"]._cache_dir == Path('./.hermes/ham/spam').absolute() + + +def test_context_get_error(): + ctx = HermesContext() + ctx.prepare_step("ham") + ctx.finalize_step("ham") + with pytest.raises(HermesContexError, match="Prepare a step first."): + ctx["spam"]._cache_dir == Path('./.hermes/spam').absolute() + + +def test_finalize_context_one_item(): + ctx = HermesContext() + ctx.prepare_step("ham") + ctx.finalize_step("ham") + assert ctx._current_step == [] + + +def test_finalize_context(): + ctx = HermesContext() + ctx.prepare_step("ham") + ctx.prepare_step("spam") + ctx.finalize_step("spam") + assert ctx["spam"]._cache_dir == Path('./.hermes/ham/spam').absolute() + assert ctx._current_step == ["ham"] + + +def test_finalize_context_error_no_item(): + ctx = HermesContext() + with pytest.raises(ValueError, match="There is no step to end."): + ctx.finalize_step("spam") + + +def test_finalize_context_error(): + ctx = HermesContext() + ctx.prepare_step("ham") + with pytest.raises(ValueError, match="Cannot end step spam while in ham."): + ctx.finalize_step("spam") + + +def test_cache(tmpdir): + ctx = HermesContext(Path(tmpdir)) + ctx.prepare_step("ham") + with ctx["spam"] as c: + c["bacon"] = {"data": "goose", "num": 2} + + path = tmpdir / Path('.hermes') / 'ham' / 'spam' / 'bacon.json' + assert path.exists() + assert path.read() == '{"data": "goose", "num": 2}' + assert c._cached_data["bacon"] == {"data": "goose", "num": 2} + + +def test_hermes_cache_set(tmpdir): + cache = HermesCache(Path(tmpdir)) + cache["bacon"] = "eggs" + assert cache._cached_data == {"bacon": "eggs"} + + +def test_hermes_cache_get(tmpdir): + cache = HermesCache(Path(tmpdir)) + cache._cached_data = {"bacon": "eggs"} + assert cache["bacon"] == "eggs"