Initial pacman code

This commit is contained in:
Kivi Kaitaniemi
2025-12-14 17:12:25 +02:00
parent ebf4b8e5ac
commit fb578c0511
12 changed files with 2453 additions and 10 deletions
@@ -0,0 +1,88 @@
import pytest
from decman.plugins.pacman.error import DependencyCycleError
from decman.plugins.pacman.resolver import DepGraph, ForeignPackage
def test_add_dependency():
graph = DepGraph()
graph.add_requirement("A", None)
graph.add_requirement("B1", "A")
graph.add_requirement("B2", "A")
graph.add_requirement("C", "B1")
assert "B1" in graph.package_nodes["A"].children
assert "B2" in graph.package_nodes["A"].children
assert "C" in graph.package_nodes["B1"].children
def test_cyclic_dependency_raises():
graph = DepGraph()
graph.add_requirement("A", None)
graph.add_requirement("B", "A")
graph.add_requirement("C", "B")
with pytest.raises(DependencyCycleError):
graph.add_requirement("A", "C")
def _build_graph_for_outer_deps() -> DepGraph:
graph = DepGraph()
# Roots
graph.add_requirement("A", None)
graph.add_requirement("V", None)
# Level B
graph.add_requirement("B1", "A")
graph.add_requirement("B2", "A")
graph.add_requirement("B3", "A")
# Extra dependency B1 -> B2
graph.add_requirement("B1", "B2")
# Level C
graph.add_requirement("C1", "B1")
graph.add_requirement("C2", "B1")
# Level D + cycle-ish edges
graph.add_requirement("D", "C1")
graph.add_requirement("C2", "D")
# Foreign packages and their foreign deps
defs = {
"V": [],
"A": ["B1", "B2", "B3", "C1", "C2", "D"],
"B1": ["C1", "C2", "D"],
"B2": ["B1", "C1", "C2", "D"],
"B3": [],
"C1": ["D", "C2"],
"C2": [],
"D": ["C2"],
}
for name, deps in defs.items():
pkg = ForeignPackage(name)
pkg.add_foreign_dependency_packages(deps)
return graph
def _assert_outer_dep_names(graph: DepGraph, expected: set[str]) -> None:
result = graph.get_and_remove_outer_dep_pkgs()
names = {pkg.name for pkg in result}
assert names == expected
def test_get_and_remove_outer_deps_sequence():
graph = _build_graph_for_outer_deps()
_assert_outer_dep_names(graph, {"C2", "B3", "V"})
_assert_outer_dep_names(graph, {"D"})
_assert_outer_dep_names(graph, {"C1"})
_assert_outer_dep_names(graph, {"B1"})
_assert_outer_dep_names(graph, {"B2"})
_assert_outer_dep_names(graph, {"A"})
_assert_outer_dep_names(graph, set())