Source code for snipskit.services

"""This module contains some functions related to Snips services."""

from psutil import process_iter, NoSuchProcess
import re
from subprocess import check_output

SNIPS_SERVICES = ['snips-analytics', 'snips-asr', 'snips-asr-google',
                  'snips-audio-server', 'snips-dialogue', 'snips-hotword',
                  'snips-injection', 'snips-nlu', 'snips-skill-server',
                  'snips-tts']
VERSION_FLAG = '--version'


def _state(state_function):
    """Return a dict with the state of all Snips Services.

    Args:
        state_function: A function that returns a state for a Snips service.

    Returns:
        dict: A dict with all Snips services as keys and their state as value.
    """
    states = [state_function(service) for service in SNIPS_SERVICES]
    return dict(zip(SNIPS_SERVICES, states))


def _version_output(service):
    """Return the output of the command `service` with the argument
    '--version'.

    Args:
        service (str): The service to check the version of.

    Returns:
        str: The output of the command `service` with the argument
        '--version', or an empty string if the command is not installed.

    Example:

        >>> _version_output('snips-nlu')
        'snips-nlu 1.1.2 (0.62.3) [model_version: 0.19.0]'
    """
    try:
        version_output = check_output([service,
                                       VERSION_FLAG]).decode('utf-8').strip()

    except FileNotFoundError:
        version_output = ''

    return version_output


[docs]def is_installed(service): """Check whether the Snips service `service` is installed. Args: service (str): The Snips service to check. Returns: bool: True if the service is installed; False otherwise. Example: >>> is_installed('snips-nlu') True .. versionadded:: 0.5.3 """ return bool(_version_output(service))
[docs]def is_running(service): """Check whether the Snips service `service` is running. Args: service (str): The Snips service to check. Returns: bool: True if the service is running; False otherwise. Example: >>> is_running('snips-nlu') True .. versionadded:: 0.5.3 """ service_found = False for process in process_iter(): try: if service == process.name(): service_found = True break except NoSuchProcess: # Happens when the process no longer exists. pass return service_found
[docs]def model_version(): """Return the model version of Snips NLU. Returns: str: The model version of Snips NLU, or an empty string if snips-nlu is not installed. Example: >>> model_version() '0.19.0' .. versionadded:: 0.5.3 """ version_output = _version_output('snips-nlu') try: model_version = re.search(r'\[model_version: (.*)\]', version_output).group(1) except (AttributeError, IndexError): model_version = '' return model_version
[docs]def installed(): """Return a dict with the installation state of all Snips services. Returns: dict: A dict with all Snips services as keys and their installation state (True or False) as value. .. versionadded:: 0.5.3 """ return _state(is_installed)
[docs]def running(): """Return a dict with the running state of all Snips services. Returns: dict: A dict with all Snips services as keys and their running state (True or False) as value. .. versionadded:: 0.5.3 """ return _state(is_running)
[docs]def versions(): """Return a dict with the version numbers of all Snips services. Returns: dict: A dict with all Snips services as keys and their version numbers as value. Services that are not installed have an empty string as their value. .. versionadded:: 0.5.3 """ return _state(version)
[docs]def version(service=None): """Return the version number of a Snips service or the Snips platform. If the `service` argument is empty, this returns the minimum value of the version numbers of all installed Snips services. Args: service (str, optional): The Snips service to check. Returns: str: The version number of the Snips service or an empty string if the service is not installed. If no `service` argument is given: the version of the Snips platform or an empty string if no Snips services are installed. Examples: >>> version() '1.1.2' >>> version('snips-nlu') '1.1.2' .. versionadded:: 0.5.3 """ if service: try: return _version_output(service).split()[1] except IndexError: # The version output is empty, so the service is not installed. return '' else: # Filter the empty versions and then compute the minimum value. return min([version for version in versions().values() if version])