Skip to content

Commit

Permalink
chore(project_validate): fix one ruff PLR0912 (#775)
Browse files Browse the repository at this point in the history
  • Loading branch information
Nora-Olivia-Ammann committed Jan 31, 2024
1 parent 71b9b2a commit d7060d6
Showing 1 changed file with 21 additions and 6 deletions.
27 changes: 21 additions & 6 deletions src/dsp_tools/commands/project/create/project_validate.py
Expand Up @@ -373,11 +373,21 @@ def _identify_problematic_cardinalities(
Returns:
a (possibly empty) list of (resource, problematic_cardinality) tuples
"""
# make 2 dicts of the following form:
cardinalities, dependencies = _extract_cardinalities_from_project(project_definition, link_properties)
graph = _make_cardinality_dependency_graph(dependencies)
errors = _find_circles_with_min_one_cardinality(graph, cardinalities, dependencies)
return sorted(errors, key=lambda x: x[0])


def _extract_cardinalities_from_project(
project_definition: dict[Any, Any],
link_properties: dict[str, list[str]],
) -> tuple[dict[str, dict[str, str]], dict[str, dict[str, list[str]]]]:
# dependencies = {"rosetta:Text": {"rosetta:hasImage2D": ["rosetta:Image2D"], ...}}
# cardinalities = {"rosetta:Text": {"rosetta:hasImage2D": "0-1", ...}}
dependencies: dict[str, dict[str, list[str]]] = {}
# cardinalities = {"rosetta:Text": {"rosetta:hasImage2D": "0-1", ...}}
cardinalities: dict[str, dict[str, str]] = {}

for onto in project_definition["project"]["ontologies"]:
for resource in onto["resources"]:
resname: str = onto["name"] + ":" + resource["name"]
Expand All @@ -399,15 +409,21 @@ def _identify_problematic_cardinalities(
cardinalities[resname][cardname] = card["cardinality"]
else:
dependencies[resname][cardname].extend(targets)
return cardinalities, dependencies


# transform the dependencies into a graph structure
def _make_cardinality_dependency_graph(dependencies: dict[str, dict[str, list[str]]]) -> nx.MultiDiGraph:
graph = nx.MultiDiGraph()
for start, cards in dependencies.items():
for edge, targets in cards.items():
for target in targets:
graph.add_edge(start, target, edge)
return graph

# find elements of circles that have a cardinality of "1" or "1-n"

def _find_circles_with_min_one_cardinality(
graph: nx.MultiDiGraph, cardinalities: dict[str, dict[str, str]], dependencies: dict[str, dict[str, list[str]]]
) -> set[tuple[str, str]]:
errors: set[tuple[str, str]] = set()
circles = list(nx.algorithms.cycles.simple_cycles(graph))
for circle in circles:
Expand All @@ -419,5 +435,4 @@ def _identify_problematic_cardinalities(
prop = _property
if cardinalities[resource].get(prop) not in ["0-1", "0-n"]:
errors.add((resource, prop))

return sorted(errors, key=lambda x: x[0])
return errors

0 comments on commit d7060d6

Please sign in to comment.