Source code for debio.api

# -*- coding: utf-8 -*-

"""Main code."""

import logging
from pathlib import Path
from typing import Iterable, List, Optional

import click
from pyobo import Obo, Reference, SynonymTypeDef, Term, TypeDef

from debio.resources import PROPERTIES, TERMS, TYPEDEFS
from debio.version import VERSION

__all__ = [
    "DecentralizedBiomedicalOntology",
]

logger = logging.getLogger(__name__)

HERE = Path(__file__).parent.resolve()
ROOT = HERE.parent.parent.resolve()
DOCS = ROOT.joinpath("docs")

PREFIX = "debio"
URI_PREFIX = "https://biopragmatics.github.io/debio/"
IDSPACES = {
    PREFIX: URI_PREFIX,
    "RO": "http://purl.obolibrary.org/obo/RO_",
    "obo": "http://purl.obolibrary.org/obo/",
    "orcid": "https://orcid.org/",
}


def get_typedefs() -> Iterable[TypeDef]:
    """Get type definitions and properties."""
    for typedef in TYPEDEFS:
        yield _get_typedef(typedef)
    for prop in PROPERTIES:
        yield _get_typedef(prop, is_metadata_tag=True)


def _reference_list(references) -> List[Reference]:
    return [
        Reference(
            prefix=reference["prefix"],
            identifier=reference["identifier"],
            name=reference.get("name"),
        )
        for reference in references
    ]


def _reference(d, k) -> Optional[Reference]:
    v = d.get(k)
    if not v:
        return None
    return Reference.from_curie(v)


def _get_typedef(typedef, is_metadata_tag: Optional[bool] = None) -> TypeDef:
    return TypeDef(
        reference=Reference(
            prefix=PREFIX,
            identifier=typedef["identifier"],
            name=typedef["name"],
        ),
        definition=typedef.get("description"),
        holds_over_chain=_reference_list(typedef.get("holds_over_chain", [])),
        is_metadata_tag=is_metadata_tag,
        xrefs=_reference_list(typedef.get("xrefs", [])),
        created_by=f"orcid:{typedef['creator']}",
        parents=_reference_list(typedef.get("parents", [])),
        inverse=_reference(typedef, "inverse"),
        domain=_reference(typedef, "domain"),
        range=_reference(typedef, "range"),
    )


def get_synonyms() -> List[SynonymTypeDef]:
    """Get synonym type definitions."""
    return []


def get_terms() -> Iterable[Term]:
    """Get terms."""
    for term in TERMS:
        yield _get_term(term)


def _get_term(term) -> Term:
    pass


[docs] class DecentralizedBiomedicalOntology(Obo): """Get the ontology.""" ontology = PREFIX typedefs = list(get_typedefs()) synonym_typedefs = list(get_synonyms()) idspaces = IDSPACES data_version = VERSION
[docs] def iter_terms(self, force: bool = False) -> Iterable[Term]: """Iterate over terms in the ontology.""" return get_terms()
def _get_version(self) -> str: return VERSION
def write(ontology: Obo, directory: Path) -> None: """Write ontology artifacts.""" from bioontologies.robot import convert, convert_to_obograph, is_available directory.mkdir(exist_ok=True, parents=True) stub = directory.joinpath(ontology.ontology) obo_path = stub.with_suffix(".obo") ontology.write_obo(obo_path) if not is_available(): logger.warning("ROBOT is not available - can not create OWL and OBO Graph JSON artifacts") else: convert_to_obograph(input_path=obo_path, json_path=stub.with_suffix(".json")) convert( input_path=obo_path, output_path=stub.with_suffix(".owl"), extra_args=[ "--prefix", f"'{PREFIX}: {URI_PREFIX}'", ], ) @click.command() def export(): """Export the data.""" from pyobo.ssg import make_site ontology = DecentralizedBiomedicalOntology() make_site(ontology, DOCS, manifest=True) current = ROOT.joinpath("releases", "current") write(ontology, current) if not ontology.data_version.endswith("-dev"): release = ROOT.joinpath("releases", ontology.data_version) write(ontology, release) if __name__ == "__main__": export()