clan_cli flake caching: support outPath
This commit is contained in:
@@ -62,6 +62,7 @@ class FlakeCacheEntry:
|
|||||||
self,
|
self,
|
||||||
value: str | float | dict[str, Any] | list[Any],
|
value: str | float | dict[str, Any] | list[Any],
|
||||||
selectors: list[Selector],
|
selectors: list[Selector],
|
||||||
|
is_out_path: bool = False,
|
||||||
) -> None:
|
) -> None:
|
||||||
self.value: str | float | int | dict[str | int, FlakeCacheEntry]
|
self.value: str | float | int | dict[str | int, FlakeCacheEntry]
|
||||||
self.selector: Selector
|
self.selector: Selector
|
||||||
@@ -75,14 +76,28 @@ class FlakeCacheEntry:
|
|||||||
else:
|
else:
|
||||||
self.selector = selectors[0]
|
self.selector = selectors[0]
|
||||||
|
|
||||||
if isinstance(value, dict):
|
if is_out_path:
|
||||||
|
if selectors != []:
|
||||||
|
msg = "Cannot index outPath"
|
||||||
|
raise ValueError(msg)
|
||||||
|
if not isinstance(value, str):
|
||||||
|
msg = "outPath must be a string"
|
||||||
|
raise ValueError(msg)
|
||||||
|
self.value = value
|
||||||
|
|
||||||
|
elif isinstance(value, dict):
|
||||||
if isinstance(self.selector, set):
|
if isinstance(self.selector, set):
|
||||||
if not all(isinstance(v, str) for v in self.selector):
|
if not all(isinstance(v, str) for v in self.selector):
|
||||||
msg = "Cannot index dict with non-str set"
|
msg = "Cannot index dict with non-str set"
|
||||||
raise ValueError(msg)
|
raise ValueError(msg)
|
||||||
self.value = {}
|
self.value = {}
|
||||||
for key, value_ in value.items():
|
for key, value_ in value.items():
|
||||||
self.value[key] = FlakeCacheEntry(value_, selectors[1:])
|
if key == "outPath":
|
||||||
|
self.value[key] = FlakeCacheEntry(
|
||||||
|
value_, selectors[1:], is_out_path=True
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
self.value[key] = FlakeCacheEntry(value_, selectors[1:])
|
||||||
|
|
||||||
elif isinstance(value, list):
|
elif isinstance(value, list):
|
||||||
if isinstance(self.selector, int):
|
if isinstance(self.selector, int):
|
||||||
@@ -111,6 +126,12 @@ class FlakeCacheEntry:
|
|||||||
msg = f"expected integer selector or all for type list, but got {type(selectors[0])}"
|
msg = f"expected integer selector or all for type list, but got {type(selectors[0])}"
|
||||||
raise TypeError(msg)
|
raise TypeError(msg)
|
||||||
|
|
||||||
|
elif isinstance(value, str) and value.startswith("/nix/store/"):
|
||||||
|
self.value = {}
|
||||||
|
self.value["outPath"] = FlakeCacheEntry(
|
||||||
|
value, selectors[1:], is_out_path=True
|
||||||
|
)
|
||||||
|
|
||||||
elif isinstance(value, (str | float | int)):
|
elif isinstance(value, (str | float | int)):
|
||||||
self.value = value
|
self.value = value
|
||||||
|
|
||||||
@@ -214,6 +235,9 @@ class FlakeCacheEntry:
|
|||||||
else:
|
else:
|
||||||
selector = selectors[0]
|
selector = selectors[0]
|
||||||
|
|
||||||
|
if selectors == [] and isinstance(self.value, dict) and "outPath" in self.value:
|
||||||
|
return self.value["outPath"].value
|
||||||
|
|
||||||
if isinstance(self.value, str | float | int):
|
if isinstance(self.value, str | float | int):
|
||||||
return self.value
|
return self.value
|
||||||
if isinstance(self.value, dict):
|
if isinstance(self.value, dict):
|
||||||
|
|||||||
@@ -3,8 +3,7 @@ from clan_cli.flake import Flake, FlakeCacheEntry
|
|||||||
from fixtures_flakes import ClanFlake
|
from fixtures_flakes import ClanFlake
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.with_core
|
def test_select() -> None:
|
||||||
def test_flake_caching(flake: ClanFlake) -> None:
|
|
||||||
testdict = {"x": {"y": [123, 345, 456], "z": "bla"}}
|
testdict = {"x": {"y": [123, 345, 456], "z": "bla"}}
|
||||||
test_cache = FlakeCacheEntry(testdict, [])
|
test_cache = FlakeCacheEntry(testdict, [])
|
||||||
assert test_cache["x"]["z"].value == "bla"
|
assert test_cache["x"]["z"].value == "bla"
|
||||||
@@ -12,6 +11,16 @@ def test_flake_caching(flake: ClanFlake) -> None:
|
|||||||
assert test_cache.select(["x", "y", 0]) == 123
|
assert test_cache.select(["x", "y", 0]) == 123
|
||||||
assert not test_cache.is_cached(["x", "z", 1])
|
assert not test_cache.is_cached(["x", "z", 1])
|
||||||
|
|
||||||
|
|
||||||
|
def test_out_path() -> None:
|
||||||
|
testdict = {"x": {"y": [123, 345, 456], "z": "/nix/store/bla"}}
|
||||||
|
test_cache = FlakeCacheEntry(testdict, [])
|
||||||
|
assert test_cache.select(["x", "z"]) == "/nix/store/bla"
|
||||||
|
assert test_cache.select(["x", "z", "outPath"]) == "/nix/store/bla"
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.with_core
|
||||||
|
def test_flake_caching(flake: ClanFlake) -> None:
|
||||||
m1 = flake.machines["machine1"]
|
m1 = flake.machines["machine1"]
|
||||||
m1["nixpkgs"]["hostPlatform"] = "x86_64-linux"
|
m1["nixpkgs"]["hostPlatform"] = "x86_64-linux"
|
||||||
flake.machines["machine2"] = m1.copy()
|
flake.machines["machine2"] = m1.copy()
|
||||||
|
|||||||
Reference in New Issue
Block a user