Source code for top.integration

"""Entry points for integrations."""
import os
from typing import Type, Optional

from top.core.task import Task
from top.core.tracker import Tracker
from top.redis.tracker import RedisTracker
from top.restapi.tracker import RESTAPITracker


class NoTrackerAvailableException(Exception):
    """No tracker backend configured."""


[docs]def get_tracker_by_url_config( task_type: Type[Task], url: Optional[str] = None, api_key: Optional[str] = None, ) -> Optional[Tracker]: """Resolve tracker by its configuration URL. Reads `TOP_TRACKER_URL` and `TOP_MAX_COMPLETED_TASKS` environment variables. Currently only `redis://` supported. Because this code is run during Python module import, we will detect conditions based on environment variables like `READTHEDOCS` to allow us to shortcut the logic and not try to create tracker connection during docs build. :param url: The URL that defines connection to the tracker backend. If not given use `TOP_TRACKER_URL` env. :param task_type: Subclass of Task or Task class itself. Used to serialise/deserialise data to Redis. :param api_key: API key for REST web server integration. If not given read from `TOP_WEB_API_KEY` environment variable. :return: A new task Tracker, unless we are under a special build environment. """ # https://docs.readthedocs.io/en/stable/environment-variables.html if os.environ.get("READTHEDOCS") or os.environ.get("SPHINX_BUILD"): return None if not url: url = os.environ.get("TOP_TRACKER_URL") if not url: raise NoTrackerAvailableException("Tracker backend configuration URL missing TOP_TRACKER_URL missing.\nPlease refer to manual how to pass a tracker backend URL.") if url.startswith("redis://"): assert url.startswith("redis://"), f"Only Redis supported, got {url}" return RedisTracker.create_default_instance(task_type, url) elif url.startswith("http://") or url.startswith("https://"): return RESTAPITracker(url, task_type, api_key=api_key) else: raise NoTrackerAvailableException(f"Does not recognise URL: {url}")