Source code for pyobo.ner.api

"""NER functionality."""

from __future__ import annotations

from collections.abc import Iterable
from subprocess import CalledProcessError
from typing import TYPE_CHECKING

import ssslm
from ssslm import LiteralMapping
from tqdm import tqdm
from typing_extensions import Unpack

from pyobo.api import get_literal_mappings
from pyobo.constants import GetOntologyKwargs, check_should_use_tqdm
from pyobo.getters import NoBuildError

if TYPE_CHECKING:
    import gilda

__all__ = [
    "get_grounder",
]


[docs] def get_grounder( prefixes: str | Iterable[str], *, grounder_cls: type[gilda.Grounder] | None = None, versions: None | str | Iterable[str | None] | dict[str, str] = None, skip_obsolete: bool = False, **kwargs: Unpack[GetOntologyKwargs], ) -> ssslm.Grounder: """Get a grounder for the given prefix(es).""" literal_mappings: list[LiteralMapping] = [] it = _clean_prefix_versions(prefixes, versions=versions) disable = len(it) == 1 or not check_should_use_tqdm(kwargs) for prefix, kwargs["version"] in tqdm(it, leave=False, disable=disable): try: literal_mappings.extend( get_literal_mappings( prefix, skip_obsolete=skip_obsolete, **kwargs, ) ) except (NoBuildError, CalledProcessError): continue return ssslm.make_grounder(literal_mappings, implementation="gilda", grounder_cls=grounder_cls)
def _clean_prefix_versions( prefixes: str | Iterable[str], versions: None | str | Iterable[str | None] | dict[str, str] = None, ) -> list[tuple[str, str | None]]: if isinstance(prefixes, str): prefixes = [prefixes] else: prefixes = list(prefixes) if versions is None: versions = [None] * len(prefixes) elif isinstance(versions, str): versions = [versions] elif isinstance(versions, dict): versions = [versions.get(prefix) for prefix in prefixes] else: versions = list(versions) if len(prefixes) != len(versions): raise ValueError return list(zip(prefixes, versions, strict=True))