Source code for yt_framework.yt.factory

"""Factory that returns `YTDevClient` or `YTProdClient` based on pipeline mode."""

import logging
from pathlib import Path
from typing import Any, Literal

from yt_framework.yt.clients.client_base import BaseYTClient
from yt_framework.yt.clients.client_dev import YTDevClient
from yt_framework.yt.clients.client_prod import YTProdClient


def _coerce_pipeline_dir(pipeline_dir: Path | str | None) -> Path | None:
    if pipeline_dir is None:
        return None
    return Path(pipeline_dir) if isinstance(pipeline_dir, str) else pipeline_dir


def _create_prod_client(
    _logger: logging.Logger,
    secrets: dict[str, str] | None,
    pickling: dict[str, Any] | None,
) -> YTProdClient:
    if secrets is None:
        msg = "secrets are required for prod mode"
        raise ValueError(msg)
    return YTProdClient(logger=_logger, secrets=secrets, pickling=pickling or {})


[docs] def create_yt_client( logger: logging.Logger | None = None, mode: Literal["prod", "dev"] | None = "dev", pipeline_dir: Path | str | None = None, secrets: dict[str, str] | None = None, pickling: dict[str, Any] | None = None, ) -> BaseYTClient: """Create a YT client for the given pipeline mode. Args: logger: Logger instance (default: creates new logger) mode: "prod" for production YT client, "dev" for local development pipeline_dir: Pipeline directory (required for dev mode) secrets: Optional dictionary containing YT credentials. Required only for prod mode. Expected keys: - YT_PROXY: YTsaurus proxy URL - YT_TOKEN: YTsaurus authentication token pickling: Optional pickling-related client config (prod only). Returns: BaseYTClient instance (YTProdClient or YTDevClient) Raises: ValueError: If secrets are required for prod mode but not provided. Example: >>> # Dev mode (local filesystem simulation) >>> client = create_yt_client(mode="dev", pipeline_dir=Path(".")) >>> >>> # Prod mode (real YT cluster) >>> secrets = {"YT_PROXY": "my-proxy", "YT_TOKEN": "my-token"} >>> client = create_yt_client(mode="prod", secrets=secrets) """ _logger = logger or logging.getLogger(__name__) if mode == "prod": return _create_prod_client(_logger, secrets, pickling) return YTDevClient(logger=_logger, pipeline_dir=_coerce_pipeline_dir(pipeline_dir))