Remade dependency graph example to test suite, package venv support

This commit is contained in:
MaXFeeD
2025-09-24 19:50:38 +03:00
parent 147e07b457
commit 5016918a44
3 changed files with 40 additions and 30 deletions
+30 -22
View File
@@ -1,28 +1,36 @@
from os.path import basename, dirname, join
from ..cli import (resolve_circular_references, # type: ignore
show_unresolved_dependencies)
from ..config import FileConfig # type: ignore
from ..language import MakeDataConfig # type: ignore
from ..project_graph import ProjectGraph # type: ignore
from ..shell import failure, pretty_debug, success # type: ignore
from icmtoolchain.cli import resolve_circular_references
from icmtoolchain.config import FileConfig
from icmtoolchain.language import MakeDataConfig
from icmtoolchain.project_graph import ProjectGraph
from icmtoolchain.utils import RuntimeCodeError
def pretty_print_order(graph: ProjectGraph):
return ' -> '.join([basename(edge.project.directory) \
if isinstance(edge.project, FileConfig) \
else str(edge) for edge in graph.traverse_dependencies()])
RESOLVED_DEPENDENCY_ORDER = [
"8-multi-reference",
"4-circular-dependency",
"7-simple-reference",
"3-cross-reference",
"2-circular-reference",
"6-multi-dependency",
"5-simple-dependency",
"1-master-project"
]
master_project_path = join(dirname(__file__), "1-master-project")
master_project = MakeDataConfig.of(master_project_path)
if master_project:
graph = ProjectGraph(master_project)
graph.collect_dependencies(master_project)
success(f"Got {len(graph.values())} nodes of {basename(master_project_path)!r} dependencies")
unresolved_artifacts = graph.resolve_dependencies()
show_unresolved_dependencies(unresolved_artifacts)
pretty_debug(f"Currently order (excluding affected projects): {pretty_print_order(graph)}")
resolve_circular_references(graph)
success(f"Order: {pretty_print_order(graph)}")
else:
failure("No such project.")
if not master_project:
raise RuntimeCodeError(1, "No such project.")
graph = ProjectGraph(master_project)
graph.collect_dependencies(master_project)
if len(graph) != len(RESOLVED_DEPENDENCY_ORDER):
raise RuntimeCodeError(2, f"Graph dependencies length mismatch: {len(RESOLVED_DEPENDENCY_ORDER)} != {len(graph)}.")
graph.resolve_dependencies()
if not resolve_circular_references(graph):
raise RuntimeCodeError(3, "Expected circular dependencies, but nothing was found.")
resolved_dependencies = []
for dependency in graph.traverse_dependencies():
assert isinstance(dependency.project, FileConfig)
resolved_dependencies.append(basename(dependency.project.directory))
if resolved_dependencies != RESOLVED_DEPENDENCY_ORDER:
raise RuntimeCodeError(4, f"Traversed dependencies sorting mismatch: {' -> '.join(resolved_dependencies)}.")