diff --git a/pkgs/clan-cli/clan_lib/api/directory.py b/pkgs/clan-cli/clan_lib/api/directory.py index 42bf1dbbb..81d4e5f55 100644 --- a/pkgs/clan-cli/clan_lib/api/directory.py +++ b/pkgs/clan-cli/clan_lib/api/directory.py @@ -170,3 +170,22 @@ def list_system_storage_devices() -> Blockdevices: return Blockdevices( blockdevices=[blk_from_dict(device) for device in blk_info["blockdevices"]] ) + + +@API.register +def get_clan_directory_relative(flake: Flake) -> str: + """ + Get the clan directory path relative to the flake root + from the clan.directory configuration setting. + + Args: + flake: The clan flake to get the relative directory from + + Returns: + The relative directory path (e.g., ".", "direct-config", "subdir/config") + + Raises: + ClanError: If the flake evaluation fails or directories cannot be found + """ + _, relative_dir = get_clan_directories(flake) + return relative_dir diff --git a/pkgs/clan-cli/clan_lib/api/directory_test.py b/pkgs/clan-cli/clan_lib/api/directory_test.py index 0b370aaff..ee9a97f32 100644 --- a/pkgs/clan-cli/clan_lib/api/directory_test.py +++ b/pkgs/clan-cli/clan_lib/api/directory_test.py @@ -4,7 +4,7 @@ from pathlib import Path import pytest from clan_cli.tests.fixtures_flakes import FlakeForTest -from clan_lib.api.directory import get_clan_directories +from clan_lib.api.directory import get_clan_directories, get_clan_directory_relative from clan_lib.errors import ClanError from clan_lib.flake import Flake @@ -52,3 +52,42 @@ def test_get_clan_directories_with_direct_directory_config( assert "source" in source_dir assert computed_dir == "direct-config" + + +@pytest.mark.with_core +def test_get_relative_clan_directory_default( + test_flake_with_core: FlakeForTest, +) -> None: + flake = Flake(str(test_flake_with_core.path)) + relative_dir = get_clan_directory_relative(flake) + + # Default configuration should return "." (which represents current directory) + assert relative_dir == "." + + +@pytest.mark.with_core +def test_get_relative_clan_directory_custom( + clan_flake: Callable[..., Flake], +) -> None: + flake = clan_flake( + raw=""" +{ + directory = ./direct-config; +} +""" + ) + + test_subdir = Path(flake.path) / "direct-config" + test_subdir.mkdir(exist_ok=True) + + relative_dir = get_clan_directory_relative(flake) + + assert relative_dir == "direct-config" + + +@pytest.mark.with_core +def test_get_relative_clan_directory_invalid_flake() -> None: + invalid_flake = Flake("/non/existent/path") + + with pytest.raises(ClanError): + get_clan_directory_relative(invalid_flake)