Source code for pydoit_nb.config_helpers
"""
Helper functions that can be useful when setting up config
"""
from __future__ import annotations
import collections
from collections.abc import Collection
from pathlib import Path
from typing import TYPE_CHECKING
from pydoit_nb.attrs_helpers import add_attrs_context
from pydoit_nb.config_handling import get_step_config_ids
from pydoit_nb.typing import NotebookConfigLike
if TYPE_CHECKING:
from typing import Any
import attr
[docs]def assert_path_exists(inp: Path) -> None:
"""
Assert that a path exists
Parameters
----------
inp
Path to check
Raises
------
FileNotFoundError
``inp`` does not exist
"""
if not inp.exists():
raise FileNotFoundError(f"{inp} does not exist") # noqa: TRY003
[docs]def assert_path_is_absolute(inp: Path) -> None:
"""
Assert that a path is an absolute path
Parameters
----------
inp
Path to check
Raises
------
AssertionError
``inp`` is not absolute
"""
if not inp.is_absolute():
raise AssertionError(f"{inp} is not absolute") # noqa: TRY003
[docs]def assert_step_config_ids_are_unique(inp: Collection[NotebookConfigLike]) -> None:
"""
Assert that all the :attr:`step_config_id` in a collection are unique
Parameters
----------
inp
Collection of :obj:`NotebookConfigLike` objects to check.
Raises
------
AssertionError
The :attr:`step_config_id` of each :obj:`NotebookConfigLike` are not unique.
"""
step_config_ids = get_step_config_ids(inp)
if len(set(step_config_ids)) != len(inp):
duplicates = [id for id, count in collections.Counter(step_config_ids).items() if count > 1]
msg = (
"``step_config_id`` must be unique. "
f"The following ``step_config_id`` are duplicated: {duplicates}"
)
raise AssertionError(msg)
[docs]@add_attrs_context
def assert_path_is_subdirectory_of_root_dir_output(
instance: Any, attribute: attr.Attribute[Any], value: Path
) -> None:
"""
Assert that a path is a sub-directory of ``instance.root_dir_output``
Parameters
----------
instance
Instance to check
attribute
Attribute that is being set
value
Value that is being used to set the attribute
Raises
------
AssertionError
``value`` is not a sub-directory of ``instance.root_dir_output``
"""
if not value.is_relative_to(instance.root_dir_output):
msg = (
f"``{attribute.name}`` is not a sub-directory of root_dir_output. "
f"{attribute.name}={value!r}. root_dir_output={instance.root_dir_output!r}"
)
raise AssertionError(msg)