Source code for osp.core.pico

"""Pico is a commandline tool used to install ontologies."""

import argparse
import itertools
import logging
from enum import Enum
from typing import TYPE_CHECKING, Iterator

from osp.core.ontology.installation import OntologyInstallationManager

# import osp.core.warnings as warning_settings -> Not working with Python 3.6.
from . import warnings as warning_settings

if TYPE_CHECKING:
    from osp.core.ontology.namespace import OntologyNamespace

__all__ = ["install", "uninstall", "namespaces", "packages"]

logger = logging.getLogger(__name__)

ontology_installer = OntologyInstallationManager()


[docs]def install(*files: str, overwrite: bool = False) -> None: """Install ontologies. Args: files: Paths of `yml` files describing the ontologies to install. overwrite: Whether to overwrite already installed ontologies. """ if overwrite: ontology_installer.install_overwrite(*files) else: ontology_installer.install(*files)
[docs]def uninstall(*package_names: str) -> None: """Uninstall ontologies. Args: package_names: Names of the ontology packages to uninstall. """ ontology_installer.uninstall(*package_names)
[docs]def packages() -> Iterator[str]: """Returns the names of all installed packages.""" return iter(ontology_installer.get_installed_packages())
[docs]def namespaces() -> Iterator["OntologyNamespace"]: """Returns namespace objects for all the installed namespaces.""" return iter(ontology_installer.namespace_registry)
def terminal(): """Terminal interface for pico.""" # Parse the user arguments parser = argparse.ArgumentParser( description="Install and uninstall your ontologies." ) parser.add_argument( "--log-level", default="INFO", type=str.upper, help="Set the logging level", ) subparsers = parser.add_subparsers(title="command", dest="command") # install parser install_parser = subparsers.add_parser( "install", help="Install ontologies." ) install_parser.add_argument( "files", nargs="+", type=str, help="List of yaml files to install" ) install_parser.add_argument( "--overwrite", action="store_true", help="Overwrite the existing ontologies, " "if they are already installed", ) # uninstall parser uninstall_parser = subparsers.add_parser( "uninstall", help="Uninstall ontologies." ) uninstall_parser.add_argument( "packages", nargs="+", type=str, help="List of ontology packages to uninstall", ) # list parser subparsers.add_parser("list", help="List all installed ontologies.") args = parser.parse_args() logging.getLogger("osp.core").setLevel(getattr(logging, args.log_level)) logging.getLogger("osp.core.ontology.installation").setLevel( getattr(logging, args.log_level) ) # Force RDF properties warning when running from the terminal and do not # offer the option to disable it. warning_settings.rdf_properties_warning = None try: all_namespaces = map(lambda x: x.get_name(), namespaces()) all_packages = packages() if args.command == "install" and args.overwrite: install(*args.files, overwrite=True) elif args.command == "install": install(*args.files, overwrite=False) elif args.command == "uninstall": if args.packages == ["all"]: args.packages = all_packages uninstall(*args.packages) elif args.command == "list": print("Packages:") print("\n".join(map(lambda x: "\t- " + x, all_packages))) print("Namespaces:") print("\n".join(map(lambda x: "\t- " + x, all_namespaces))) except Exception: logger.error("An Exception occurred during installation.", exc_info=1) if args.log_level != "DEBUG": logger.error( "Consider running 'pico --log-level debug %s ...'" % args.command ) class CompareOperations(Enum): """The allowed values for the compare_version function.""" leq: str = "leq" l: str = "l" def compare_version( version, other_version, operation: CompareOperations = CompareOperations.leq, ): """Compares two software version strings. Receives two software version strings which are just numbers separated by dots and determines whether the first one is less or equal than the second one. Args: version (str): first version string (number separated by dots). other_version (str): second version string (number separated by dots). operation (str): the comparison operation to perform. The default is `leq` (less or equal). Returns: bool: whether the first version string is less or equal than the second one. """ version = map(int, version.split(".")) other_version = map(int, other_version.split(".")) for v, o in itertools.zip_longest(version, other_version, fillvalue=0): if v == o: continue return v < o else: return operation == CompareOperations.leq if __name__ == "__main__": terminal()