Source code for obographs.contrib

"""Extra functionality that isn't part of the core obographs package."""

from __future__ import annotations

from typing import overload

from .model import Graph, GraphDocument
from .standardized import StandardizedGraph, StandardizedGraphDocument

__all__ = [
    "guess_primary_graph",
]

CANONICAL = {
    "mamo": "http://identifiers.org/mamo",
    "swo": "http://www.ebi.ac.uk/swo/swo.json",
    "ito": "https://identifiers.org/ito:ontology",
    "apollosv": "http://purl.obolibrary.org/obo/apollo_sv.owl",
    "cheminf": "http://semanticchemistry.github.io/semanticchemistry/ontology/cheminf.owl",
    "dideo": "http://purl.obolibrary.org/obo/dideo/release/2022-06-14/dideo.owl",
    "micro": "http://purl.obolibrary.org/obo/MicrO.owl",
    "ogsf": "http://purl.obolibrary.org/obo/ogsf-merged.owl",
    "mfomd": "http://purl.obolibrary.org/obo/MF.owl",
    "one": "http://purl.obolibrary.org/obo/ONE",
    "ons": "https://raw.githubusercontent.com/enpadasi/Ontology-for-Nutritional-Studies/master/ons.owl",
    "ontie": "https://ontology.iedb.org/ontology/ontie.owl",
}


# docstr-coverage:excused `overload`
@overload
def guess_primary_graph(
    graph_document: GraphDocument,
    prefix: str,
) -> Graph: ...


# docstr-coverage:excused `overload`
@overload
def guess_primary_graph(
    graph_document: StandardizedGraphDocument,
    prefix: str,
) -> StandardizedGraph: ...


[docs] def guess_primary_graph( graph_document: GraphDocument | StandardizedGraphDocument, prefix: str, ) -> Graph | StandardizedGraph: """Guess the primary graph from a graph document.""" if 0 == len(graph_document.graphs): raise ValueError("Could not automatically identify the primary graph from empty list") elif 1 == len(graph_document.graphs): return graph_document.graphs[0] id_to_graph = {graph.id: graph for graph in graph_document.graphs if graph.id} # Check for standard construction of OBO PURLs for suffix in ["owl", "obo", "json"]: standard_id = f"http://purl.obolibrary.org/obo/{prefix.lower()}.{suffix}" if standard_id in id_to_graph: return id_to_graph[standard_id] # Check if we've manually curated a mapping if prefix in CANONICAL and CANONICAL[prefix] in id_to_graph: return id_to_graph[CANONICAL[prefix]] raise ValueError( f"Could not automatically identify the primary graph for {prefix=} from " f"{len(id_to_graph):,} graphs:\n\n{sorted(id_to_graph)}" )